bool SearchTreeNode::UnSerializeString(const string& s,string& result) { result.Clear(); size_t i; int mode = 0; wxString entity(_T("")); unsigned int u; for(i = 0;mode >=0 && i<s.length();i++) { wxChar ch = s[i]; if(ch==_T('"') || ch==_T('>') || ch==_T('<')) { mode = -1; // Error break; } switch(mode) { case 0: // normal if(ch==_T('&')) { mode = 1; entity.Clear(); } else result << ch; case 1: // escaped if(ch==_T('&')) { mode = -1; // Error break; } else if(ch==_T(';')) { mode = 0; if(entity==_T("quot")) ch = _T('"'); else if(entity==_T("amp")) ch = _T('&'); else if(entity==_T("apos")) ch = _T('\''); else if(entity==_T("lt")) ch = _T('<'); else if(entity==_T("gt")) ch = _T('>'); else if(entity[0]==_T('#') && s2u(entity.substr(1),u)) ch = u; else { mode = -1; // Error: Unrecognized entity break; } result << ch; } break; } } if(mode < 0) result.Clear(); return (mode >= 0); }
void Clear() { Flags=0; TopStr=0; CurX=CurY=0; strHelpMask.Clear(); strHelpPath.Clear(); strHelpTopic.Clear(); strSelTopic.Clear(); }
void Clear() { dwFileAttributes=0; ClearStruct(ftCreationTime); ClearStruct(ftLastAccessTime); ClearStruct(ftLastWriteTime); ClearStruct(ftChangeTime); nFileSize=0; nAllocationSize=0; dwReserved0=0; dwReserved1=0; FileId = 0; strFileName.Clear(); strAlternateFileName.Clear(); }
bool History::ReadLastItem(const wchar_t *RegKey, string &strStr) { strStr.Clear(); HKEY hKey=OpenRegKey(RegKey); if (!hKey) return false; DWORD Type; DWORD Size=0; if (RegQueryValueEx(hKey,L"Lines",0,&Type,nullptr,&Size)!=ERROR_SUCCESS || Size<sizeof(wchar_t)) // Нету ничерта return false; wchar_t *Buffer=(wchar_t*)xf_malloc(Size); if (!Buffer) return false; if (RegQueryValueEx(hKey,L"Lines",0,&Type,(unsigned char *)Buffer,&Size)!=ERROR_SUCCESS) { xf_free(Buffer); return false; } Buffer[Size/sizeof(wchar_t)-1]=0; //safety strStr = Buffer; //last item is first in registry, null terminated xf_free(Buffer); return true; }
HistoryRecord() { Lock = false; Type = 0; strName.Clear(); Timestamp.dwLowDateTime=0; Timestamp.dwHighDateTime=0; }
void Clear() { ClearStruct(*static_cast<FarDialogItem*>(this)); ListPos=0; strHistory.Clear(); strMask.Clear(); strData.Clear(); ID=0; IFlags.ClearAll(); AutoCount=0; AutoPtr=nullptr; UserData=0; ObjPtr=nullptr; ListPtr=nullptr; UCData=nullptr; SelStart=0; SelEnd=0; }
void History::GetNext(string &strStr) { if (CurrentItem) CurrentItem=HistoryList.Next(CurrentItem); if (CurrentItem) strStr = CurrentItem->strName; else strStr.Clear(); }
void History::GetPrev(string &strStr) { CurrentItem=HistoryList.Prev(CurrentItem); if (!CurrentItem) CurrentItem=HistoryList.First(); if (CurrentItem) strStr = CurrentItem->strName; else strStr.Clear(); }
FolderTree::FolderTree(string &strResultFolder,int iModalMode,int IsStandalone,bool IsFullScreen): Tree(nullptr), FindEdit(nullptr), ModalMode(iModalMode), IsFullScreen(IsFullScreen), IsStandalone(IsStandalone), PrevMacroMode(CtrlObject->Macro.GetMode()) { SetDynamicallyBorn(FALSE); SetRestoreScreenMode(TRUE); if (ModalMode != MODALTREE_FREE) strResultFolder.Clear(); KeyBarVisible = TRUE; // Заставим обновлятся кейбар //TopScreen=new SaveScreen; SetCoords(); if ((Tree=new TreeList(FALSE))) { CtrlObject->Macro.SetMode(MACRO_FINDFOLDER); MacroMode = MACRO_FINDFOLDER; strLastName.Clear(); Tree->SetModalMode(ModalMode); Tree->SetPosition(X1,Y1,X2,Y2); if (ModalMode == MODALTREE_FREE) Tree->SetRootDir(strResultFolder); Tree->SetVisible(TRUE); Tree->Update(0); // если было прерывание в процессе сканирования и это было дерево копира... if (Tree->GetExitCode()) { if (!(FindEdit=new Edit)) { SetExitCode(XC_OPEN_ERROR); return; } FindEdit->SetEditBeyondEnd(FALSE); FindEdit->SetPersistentBlocks(Global->Opt->Dialogs.EditBlock); InitKeyBar(); FrameManager->ExecuteModal(this); //OT } strResultFolder = strNewFolder; } else { SetExitCode(XC_OPEN_ERROR); } }
void Clear() { Flags = 0; strName.Clear(); AccelKey = 0; UserDataSize = 0; UserData = nullptr; AmpPos = 0; Len[0] = 0; Len[1] = 0; Idx2 = 0; ShowPos = 0; }
bool GetFileOwner(const wchar_t *Computer,const wchar_t *Name, string &strOwner) { bool Result=false; /* if(!Owner) { SIDCacheFlush(); return TRUE; } */ strOwner.Clear(); SECURITY_INFORMATION si=OWNER_SECURITY_INFORMATION|GROUP_SECURITY_INFORMATION;; DWORD LengthNeeded=0; NTPath strName(Name); PSECURITY_DESCRIPTOR sd=reinterpret_cast<PSECURITY_DESCRIPTOR>(sddata); if (GetFileSecurity(strName,si,sd,sizeof(sddata),&LengthNeeded) && LengthNeeded<=sizeof(sddata)) { PSID pOwner; BOOL OwnerDefaulted; if (GetSecurityDescriptorOwner(sd,&pOwner,&OwnerDefaulted)) { if (IsValidSid(pOwner)) { const wchar_t *Owner=GetNameFromSIDCache(pOwner); if (!Owner) { Owner=AddSIDToCache(Computer,pOwner); } if (Owner) { strOwner=Owner; Result=true; } } } } return Result; }
int _MakePath1(DWORD Key, string &strPathName, const wchar_t *Param2,int ShortNameAsIs) { int RetCode=FALSE; int NeedRealName=FALSE; strPathName.Clear(); switch (Key) { case KEY_CTRLALTBRACKET: // Вставить сетевое (UNC) путь из левой панели case KEY_RCTRLRALTBRACKET: case KEY_CTRLRALTBRACKET: case KEY_RCTRLALTBRACKET: case KEY_CTRLALTBACKBRACKET: // Вставить сетевое (UNC) путь из правой панели case KEY_RCTRLRALTBACKBRACKET: case KEY_CTRLRALTBACKBRACKET: case KEY_RCTRLALTBACKBRACKET: case KEY_ALTSHIFTBRACKET: // Вставить сетевое (UNC) путь из активной панели case KEY_RALTSHIFTBRACKET: case KEY_ALTSHIFTBACKBRACKET: // Вставить сетевое (UNC) путь из пассивной панели case KEY_RALTSHIFTBACKBRACKET: NeedRealName=TRUE; case KEY_CTRLBRACKET: // Вставить путь из левой панели case KEY_RCTRLBRACKET: case KEY_CTRLBACKBRACKET: // Вставить путь из правой панели case KEY_RCTRLBACKBRACKET: case KEY_CTRLSHIFTBRACKET: // Вставить путь из активной панели case KEY_RCTRLSHIFTBRACKET: case KEY_CTRLSHIFTBACKBRACKET: // Вставить путь из пассивной панели case KEY_RCTRLSHIFTBACKBRACKET: case KEY_CTRLSHIFTNUMENTER: // Текущий файл с пасс.панели case KEY_RCTRLSHIFTNUMENTER: case KEY_SHIFTNUMENTER: // Текущий файл с актив.панели case KEY_CTRLSHIFTENTER: // Текущий файл с пасс.панели case KEY_RCTRLSHIFTENTER: case KEY_SHIFTENTER: // Текущий файл с актив.панели { Panel *SrcPanel=nullptr; FilePanels *Cp=CtrlObject->Cp(); switch (Key) { case KEY_CTRLALTBRACKET: case KEY_RCTRLRALTBRACKET: case KEY_CTRLRALTBRACKET: case KEY_RCTRLALTBRACKET: case KEY_CTRLBRACKET: case KEY_RCTRLBRACKET: SrcPanel=Cp->LeftPanel; break; case KEY_CTRLALTBACKBRACKET: case KEY_RCTRLRALTBACKBRACKET: case KEY_CTRLRALTBACKBRACKET: case KEY_RCTRLALTBACKBRACKET: case KEY_CTRLBACKBRACKET: case KEY_RCTRLBACKBRACKET: SrcPanel=Cp->RightPanel; break; case KEY_SHIFTNUMENTER: case KEY_SHIFTENTER: case KEY_ALTSHIFTBRACKET: case KEY_RALTSHIFTBRACKET: case KEY_CTRLSHIFTBRACKET: case KEY_RCTRLSHIFTBRACKET: SrcPanel=Cp->ActivePanel; break; case KEY_CTRLSHIFTNUMENTER: case KEY_RCTRLSHIFTNUMENTER: case KEY_CTRLSHIFTENTER: case KEY_RCTRLSHIFTENTER: case KEY_ALTSHIFTBACKBRACKET: case KEY_RALTSHIFTBACKBRACKET: case KEY_CTRLSHIFTBACKBRACKET: case KEY_RCTRLSHIFTBACKBRACKET: SrcPanel=Cp->GetAnotherPanel(Cp->ActivePanel); break; } if (SrcPanel) { if (Key == KEY_SHIFTENTER || Key == KEY_CTRLSHIFTENTER || Key == KEY_RCTRLSHIFTENTER || Key == KEY_SHIFTNUMENTER || Key == KEY_CTRLSHIFTNUMENTER || Key == KEY_RCTRLSHIFTNUMENTER) { string strShortFileName; SrcPanel->GetCurName(strPathName,strShortFileName); if (SrcPanel->GetShowShortNamesMode()) // учтем короткость имен :-) strPathName = strShortFileName; } else { /* TODO: Здесь нужно учесть, что у TreeList тоже есть путь :-) */ if (!(SrcPanel->GetType()==FILE_PANEL || SrcPanel->GetType()==TREE_PANEL)) return FALSE; SrcPanel->GetCurDir(strPathName); if (SrcPanel->GetMode()!=PLUGIN_PANEL) { FileList *SrcFilePanel=(FileList *)SrcPanel; SrcFilePanel->GetCurDir(strPathName); { if (NeedRealName) SrcFilePanel->CreateFullPathName(strPathName, strPathName,FILE_ATTRIBUTE_DIRECTORY, strPathName,TRUE,ShortNameAsIs); } if (SrcFilePanel->GetShowShortNamesMode() && ShortNameAsIs) ConvertNameToShort(strPathName,strPathName); } else { FileList *SrcFilePanel=(FileList *)SrcPanel; OpenPanelInfo Info; CtrlObject->Plugins->GetOpenPanelInfo(SrcFilePanel->GetPluginHandle(),&Info); FileList::AddPluginPrefix(SrcFilePanel,strPathName); if (Info.HostFile && *Info.HostFile) { strPathName += Info.HostFile; strPathName += L"/"; } strPathName += Info.CurDir; } AddEndSlash(strPathName); } if (Opt.QuotedName"EDNAME_INSERT) QuoteSpace(strPathName); if (Param2) strPathName += Param2; RetCode=TRUE; } } break; } return RetCode; }
int FolderTree::GetTypeAndName(string &strType, string &strName) { strType = MSG(MFolderTreeType); strName.Clear(); return MODALTYPE_FINDFOLDER; }
int Message( DWORD Flags, size_t Buttons, const wchar_t *Title, const wchar_t * const *Items, size_t ItemsNumber, Plugin* PluginNumber, const GUID* Id ) { string strTempStr; string strClipText; int X1,Y1,X2,Y2; int Length, BtnLength; DWORD I, MaxLength, StrCount; BOOL ErrorSets=FALSE; const wchar_t **Str; wchar_t *PtrStr; const wchar_t *CPtrStr; string strErrStr; IsWarningStyle = (Flags&MSG_WARNING) != 0; IsErrorType = (Flags&MSG_ERRORTYPE) != 0; if(IsErrorType) { LastError = GetLastError(); NtStatus = ifn.RtlGetLastNtStatus(); ErrorSets = GetErrorString(strErrStr); } #if 1 // try to replace inserts if (Items && 0 != (Flags & MSG_INSERT_STRINGS)) { string str_err(strErrStr); DWORD insert_mask = 0; size_t len = strErrStr.GetLength(), pos = 0, inserts_n = 0, inserts[10]; for (size_t i = 1; i <= ItemsNumber-Buttons; ++i) { if (0 != (Flags & MSG_INSERT_STR(i))) { inserts[inserts_n++] = i; if (inserts_n >= ARRAYSIZE(inserts)) break; } } while (str_err.Pos(pos, L"%", pos)) { if (pos >= len-1) break; if (str_err.At(pos+1) >= L'1' && str_err.At(pos+1) <= L'9') { size_t insert_i = 0, pos1 = pos+1; while (pos1 < len && str_err.At(pos1) >= L'0' && str_err.At(pos1) <= L'9') { insert_i = 10*insert_i + str_err.At(pos1) - L'0'; ++pos1; } if (insert_i >= 1 && insert_i <= inserts_n) { insert_mask |= MSG_INSERT_STR(inserts[insert_i-1]); const wchar_t *replacement = Items[inserts[insert_i-1]-1]; str_err.Replace(pos,pos1-pos,replacement); len += wcslen(replacement) - (pos1-pos); pos += wcslen(replacement) - (pos1-pos); } else pos = pos1; } else if (str_err.At(pos+1) == L'%') // "%%" pos += 2; else ++pos; } if (insert_mask == (Flags & MSG_INSERT_STRINGS)) strErrStr = str_err; } #endif // выделим пам¤ть под рабочий массив указателей на строки (+запас 16) Str=(const wchar_t **)xf_malloc((ItemsNumber+ADDSPACEFORPSTRFORMESSAGE) * sizeof(wchar_t*)); if (!Str) return -1; StrCount=static_cast<DWORD>(ItemsNumber-Buttons); // предварительный обсчет максимального размера. for (BtnLength=0,I=0; I<static_cast<DWORD>(Buttons); I++) //?? { BtnLength+=HiStrlen(Items[I+StrCount])+2+2+1; // "[ ", " ]", " " } if(BtnLength) { BtnLength--; } DWORD MAX_WIDTH_MESSAGE = Max(ScrX-1-5-5, BtnLength); for (MaxLength=BtnLength,I=0; I<StrCount; I++) { if (static_cast<DWORD>(Length=StrLength(Items[I]))>MaxLength) MaxLength=Length; } // учтем размер заголовка if (Title && *Title) { I=(DWORD)StrLength(Title)+2; if (MaxLength < I) MaxLength=I; strClipText.Append(Title).Append(L"\r\n\r\n"); } // перва¤ коррекци¤ максимального размера MaxLength = Min(MaxLength, MAX_WIDTH_MESSAGE); // теперь обработаем MSG_ERRORTYPE DWORD CountErrorLine=0; if ((Flags & MSG_ERRORTYPE) && ErrorSets) { strClipText.Append(strErrStr).Append(L"\r\n"); // подсчет количества строк во врапенном сообщениеи ++CountErrorLine; //InsertQuote(ErrStr); // оквочим // вычисление "красивого" размера DWORD LenErrStr=(DWORD)strErrStr.GetLength(); if (LenErrStr > MAX_WIDTH_MESSAGE) { // половина меньше? if (LenErrStr/2 < MAX_WIDTH_MESSAGE) { // а половина + 1/3? if ((LenErrStr+LenErrStr/3)/2 < MAX_WIDTH_MESSAGE) LenErrStr=(LenErrStr+LenErrStr/3)/2; else LenErrStr/=2; } else LenErrStr=MAX_WIDTH_MESSAGE; } MaxLength = Max(MaxLength, LenErrStr); // а теперь проврапим FarFormatText(strErrStr,LenErrStr,strErrStr,L"\n",0); //?? MaxLength ?? PtrStr = strErrStr.GetBuffer(); //BUGBUG: string не предназначен дл¤ хранени¤ строк разделЄнных \0 while ((PtrStr=wcschr(PtrStr,L'\n')) ) { *PtrStr++=0; if (*PtrStr) CountErrorLine++; } strErrStr.ReleaseBuffer(); if (CountErrorLine > ADDSPACEFORPSTRFORMESSAGE) CountErrorLine=ADDSPACEFORPSTRFORMESSAGE; //?? } //BUGBUG: string не предназначен дл¤ хранени¤ строк разделЄнных \0 // заполн¤ем массив... CPtrStr=strErrStr; for (I=0; I < CountErrorLine; I++) { Str[I]=CPtrStr; CPtrStr+=StrLength(CPtrStr)+1; if (!*CPtrStr) // два идущих подр¤д нул¤ - "хандец" всему { ++I; break; } } bool EmptyText=false; if(ItemsNumber==Buttons && !I) { EmptyText=true; Str[I]=L""; I++; StrCount++; ItemsNumber++; } for (size_t J=0; J < ItemsNumber-(EmptyText?1:0); ++J, ++I) { Str[I]=Items[J]; } for (size_t i = 0; i < ItemsNumber-Buttons; ++i) { strClipText.Append(Items[i]).Append(L"\r\n"); } strClipText.Append(L"\r\n"); for (size_t i = ItemsNumber-Buttons; i < ItemsNumber; ++i) { if(i > ItemsNumber-Buttons) { strClipText.Append(L' '); } strClipText.Append(Items[i]); } StrCount+=CountErrorLine; MessageX1=X1=(int(ScrX-MaxLength))/2-4; MessageX2=X2=X1+MaxLength+9; Y1=(ScrY-static_cast<int>(StrCount))/2-2; if (Y1 < 0) Y1=0; MessageY1=Y1; MessageY2=Y2=Y1+StrCount+3; string strHelpTopic(strMsgHelpTopic); strMsgHelpTopic.Clear(); // *** ¬ариант с ƒиалогом *** if (Buttons>0) { size_t ItemCount=StrCount+Buttons+1; DialogItemEx *PtrMsgDlg; DialogItemEx *MsgDlg = new DialogItemEx[ItemCount+1]; if (!MsgDlg) { xf_free(Str); return -1; } for (DWORD i=0; i<ItemCount+1; i++) MsgDlg[i].Clear(); int RetCode; MessageY2=++Y2; MsgDlg[0].Type=DI_DOUBLEBOX; MsgDlg[0].X1=3; MsgDlg[0].Y1=1; MsgDlg[0].X2=X2-X1-3; MsgDlg[0].Y2=Y2-Y1-1; if (Title && *Title) MsgDlg[0].strData = Title; FARDIALOGITEMTYPES TypeItem=DI_TEXT; unsigned __int64 FlagsItem=DIF_SHOWAMPERSAND; BOOL IsButton=FALSE; int CurItem=0; bool StrSeparator=false; bool Separator=false; for (PtrMsgDlg=MsgDlg+1,I=1; I < ItemCount; ++I, ++PtrMsgDlg, ++CurItem) { if (I==StrCount+1 && !StrSeparator && !Separator) { PtrMsgDlg->Type=DI_TEXT; PtrMsgDlg->Flags=DIF_SEPARATOR; PtrMsgDlg->Y1=PtrMsgDlg->Y2=I+1; CurItem--; I--; Separator=true; continue; } if(I==StrCount+1) { TypeItem=DI_BUTTON; FlagsItem=DIF_CENTERGROUP|DIF_DEFAULTBUTTON|DIF_FOCUS; IsButton=TRUE; FirstButtonIndex=CurItem+1; LastButtonIndex=CurItem; } else { FlagsItem&=~DIF_DEFAULTBUTTON; } PtrMsgDlg->Type=TypeItem; PtrMsgDlg->Flags|=FlagsItem; CPtrStr=Str[CurItem]; if (IsButton) { PtrMsgDlg->Y1=Y2-Y1-2+(Separator?1:0); PtrMsgDlg->strData+=CPtrStr; LastButtonIndex++; } else { PtrMsgDlg->X1=(Flags & MSG_LEFTALIGN)?5:-1; PtrMsgDlg->Y1=I+1; wchar_t Chr=*CPtrStr; if (Chr == L'\1' || Chr == L'\2') { CPtrStr++; PtrMsgDlg->Flags|=(Chr==2?DIF_SEPARATOR2:DIF_SEPARATOR); if(I==StrCount) { StrSeparator=true; } } else { if (StrLength(CPtrStr)>X2-X1-9) { PtrMsgDlg->Type=DI_EDIT; PtrMsgDlg->Flags|=DIF_READONLY|DIF_BTNNOCLOSE|DIF_SELECTONENTRY; PtrMsgDlg->X1=5; PtrMsgDlg->X2=X2-X1-5; PtrMsgDlg->strData=CPtrStr; } else { //xstrncpy(PtrMsgDlg->Data,CPtrStr,Min((int)MAX_WIDTH_MESSAGE,(int)sizeof(PtrMsgDlg->Data))); //?? ScrX-15 ?? PtrMsgDlg->strData = CPtrStr; //BUGBUG, wrong len } } } } { if(Separator) { FirstButtonIndex++; LastButtonIndex++; MessageY2++; Y2++; MsgDlg[0].Y2++; ItemCount++; } Dialog Dlg(MsgDlg,ItemCount,MsgDlgProc, &strClipText); if (X1 == -1) X1 = 0; if (Y1 == -1) Y1 = 0; Dlg.SetPosition(X1,Y1,X2,Y2); if(Id) Dlg.SetId(*Id); if (!strHelpTopic.IsEmpty()) Dlg.SetHelp(strHelpTopic); Dlg.SetPluginOwner(reinterpret_cast<Plugin*>(PluginNumber)); // «апомним номер плагина if (IsWarningStyle) { Dlg.SetDialogMode(DMODE_WARNINGSTYLE); } Dlg.SetDialogMode(DMODE_MSGINTERNAL); if (Flags & MSG_NOPLUGINS) Dlg.SetDialogMode(DMODE_NOPLUGINS); FlushInputBuffer(); if (Flags & MSG_KILLSAVESCREEN) SendDlgMessage((HANDLE)&Dlg,DM_KILLSAVESCREEN,0,0); Dlg.Process(); RetCode=Dlg.GetExitCode(); } delete [] MsgDlg; xf_free(Str); return(RetCode<0?RetCode:RetCode-StrCount-1-(Separator?1:0)); } // *** Ѕез ƒиалога! *** SetCursorType(0,0); if (!(Flags & MSG_KEEPBACKGROUND)) { SetScreen(X1,Y1,X2,Y2,L' ',ColorIndexToColor((Flags & MSG_WARNING)?COL_WARNDIALOGTEXT:COL_DIALOGTEXT)); MakeShadow(X1+2,Y2+1,X2+2,Y2+1); MakeShadow(X2+1,Y1+1,X2+2,Y2+1); Box(X1+3,Y1+1,X2-3,Y2-1,ColorIndexToColor((Flags & MSG_WARNING)?COL_WARNDIALOGBOX:COL_DIALOGBOX),DOUBLE_BOX); } SetColor((Flags & MSG_WARNING)?COL_WARNDIALOGTEXT:COL_DIALOGTEXT); if (Title && *Title) { string strTempTitle = Title; if (strTempTitle.GetLength() > MaxLength) strTempTitle.SetLength(MaxLength); GotoXY(X1+(X2-X1-1-(int)strTempTitle.GetLength())/2,Y1+1); FS<<L" "<<strTempTitle<<L" "; } for (I=0; I<StrCount; I++) { CPtrStr=Str[I]; wchar_t Chr=*CPtrStr; if (Chr == 1 || Chr == 2) { Length=X2-X1-5; if (Length>1) { SetColor((Flags & MSG_WARNING)?COL_WARNDIALOGBOX:COL_DIALOGBOX); GotoXY(X1+3,Y1+I+2); DrawLine(Length,(Chr == 2?3:1)); CPtrStr++; int TextLength=StrLength(CPtrStr); if (TextLength<Length) { GotoXY(X1+3+(Length-TextLength)/2,Y1+I+2); Text(CPtrStr); } SetColor((Flags & MSG_WARNING)?COL_WARNDIALOGBOX:COL_DIALOGTEXT); } continue; } if ((Length=StrLength(CPtrStr))>ScrX-15) Length=ScrX-15; int Width=X2-X1+1; wchar_t *lpwszTemp = nullptr; int PosX; if (Flags & MSG_LEFTALIGN) { lpwszTemp = (wchar_t*)xf_malloc((Width-10+1)*sizeof(wchar_t)); _snwprintf(lpwszTemp,Width-10+1,L"%.*s",Width-10,CPtrStr); GotoXY(X1+5,Y1+I+2); } else { PosX=X1+(Width-Length)/2; lpwszTemp = (wchar_t*)xf_malloc((PosX-X1-4+Length+X2-PosX-Length-3+1)*sizeof(wchar_t)); _snwprintf(lpwszTemp,PosX-X1-4+Length+X2-PosX-Length-3+1,L"%*s%.*s%*s",PosX-X1-4,L"",Length,CPtrStr,X2-PosX-Length-3,L""); GotoXY(X1+4,Y1+I+2); } Text(lpwszTemp); xf_free(lpwszTemp); } /* $ 13.01.2003 IS - ѕринудительно уберем запрет отрисовки экрана, если количество кнопок в сообщении равно нулю и макрос закончил выполн¤тьс¤. Ёто необходимо, чтобы заработал прогресс-бар от плагина, который был запущен при помощи макроса запретом отрисовки (bugz#533). */ xf_free(Str); if (!Buttons) { if (ScrBuf.GetLockCount()>0 && !CtrlObject->Macro.PeekKey()) ScrBuf.SetLockCount(0); ScrBuf.Flush(); } return 0; }
string& WINAPI FarFormatText(const wchar_t *SrcText, // источник int Width, // заданная ширина string &strDestText, // приемник const wchar_t* Break, // брик, если = nullptr, то принимается '\n' DWORD Flags) // один из FFTM_* { const wchar_t *breakchar; breakchar = Break?Break:L"\n"; if (!SrcText || !*SrcText) { strDestText.Clear(); return strDestText; } string strSrc = SrcText; //copy string in case of SrcText == strDestText if (!wcspbrk(strSrc,breakchar) && strSrc.GetLength() <= static_cast<size_t>(Width)) { strDestText = strSrc; return strDestText; } long i=0, l=0, pgr=0, last=0; wchar_t *newtext; const wchar_t *text= strSrc; long linelength = Width; int breakcharlen = StrLength(breakchar); int docut = Flags&FFTM_BREAKLONGWORD?1:0; /* Special case for a single-character break as it needs no additional storage space */ if (breakcharlen == 1 && !docut) { newtext = xf_wcsdup(text); if (!newtext) { strDestText.Clear(); return strDestText; } while (newtext[i] != L'\0') { /* prescan line to see if it is greater than linelength */ l = 0; while (newtext[i+l] != breakchar[0]) { if (newtext[i+l] == L'\0') { l--; break; } l++; } if (l >= linelength) { pgr = l; l = linelength; /* needs breaking; work backwards to find previous word */ while (l >= 0) { if (newtext[i+l] == L' ') { newtext[i+l] = breakchar[0]; break; } l--; } if (l == -1) { /* couldn't break is backwards, try looking forwards */ l = linelength; while (l <= pgr) { if (newtext[i+l] == L' ') { newtext[i+l] = breakchar[0]; break; } l++; } } } i += l+1; } } else { /* Multiple character line break */ newtext = (wchar_t*)xf_malloc((strSrc.GetLength() * (breakcharlen+1)+1)*sizeof(wchar_t)); if (!newtext) { strDestText.Clear(); return strDestText; } newtext[0] = L'\0'; i = 0; while (text[i] != L'\0') { /* prescan line to see if it is greater than linelength */ l = 0; while (text[i+l] != L'\0') { if (text[i+l] == breakchar[0]) { if (breakcharlen == 1 || !StrCmpN(text+i+l, breakchar, breakcharlen)) break; } l++; } if (l >= linelength) { pgr = l; l = linelength; /* needs breaking; work backwards to find previous word */ while (l >= 0) { if (text[i+l] == L' ') { wcsncat(newtext, text+last, i+l-last); wcscat(newtext, breakchar); last = i + l + 1; break; } l--; } if (l == -1) { /* couldn't break it backwards, try looking forwards */ l = linelength - 1; while (l <= pgr) { if (!docut) { if (text[i+l] == L' ') { wcsncat(newtext, text+last, i+l-last); wcscat(newtext, breakchar); last = i + l + 1; break; } } if (docut == 1) { if (text[i+l] == L' ' || l > i-last) { wcsncat(newtext, text+last, i+l-last+1); wcscat(newtext, breakchar); last = i + l + 1; break; } } l++; } } i += l+1; } else { i += (l ? l : 1); } } if (i+l > last) { wcscat(newtext, text+last); } } strDestText = newtext; xf_free(newtext); return strDestText; }
void Clear() { strName.Clear(); memset(Last,0,LastCount*sizeof(*Last)); Depth=0; }
void ViewSettingsToText(unsigned __int64 *ViewColumnTypes,int *ViewColumnWidths,int *ViewColumnWidthsTypes,int ColumnCount, string &strColumnTitles,string &strColumnWidths) { strColumnTitles.Clear(); strColumnWidths.Clear(); for (int I=0; I<ColumnCount; I++) { string strType; int ColumnType=static_cast<int>(ViewColumnTypes[I] & 0xff); strType = ColumnSymbol[ColumnType]; if (ColumnType==NAME_COLUMN) { if (ViewColumnTypes[I] & COLUMN_MARK) strType += L"M"; if (ViewColumnTypes[I] & COLUMN_NAMEONLY) strType += L"O"; if (ViewColumnTypes[I] & COLUMN_RIGHTALIGN) { strType += L"R"; if (ViewColumnTypes[I] & COLUMN_RIGHTALIGNFORCE) strType += L"F"; } if (ViewColumnTypes[I] & COLUMN_NOEXTENSION) strType += L"N"; } if (ColumnType==SIZE_COLUMN || ColumnType==PACKED_COLUMN || ColumnType==STREAMSSIZE_COLUMN) { if (ViewColumnTypes[I] & COLUMN_COMMAS) strType += L"C"; if (ViewColumnTypes[I] & COLUMN_ECONOMIC) strType += L"E"; if (ViewColumnTypes[I] & COLUMN_FLOATSIZE) strType += L"F"; if (ViewColumnTypes[I] & COLUMN_THOUSAND) strType += L"T"; } if (ColumnType==WDATE_COLUMN || ColumnType==ADATE_COLUMN || ColumnType==CDATE_COLUMN || ColumnType==CHDATE_COLUMN) { if (ViewColumnTypes[I] & COLUMN_BRIEF) strType += L"B"; if (ViewColumnTypes[I] & COLUMN_MONTH) strType += L"M"; } if (ColumnType==OWNER_COLUMN) { if (ViewColumnTypes[I] & COLUMN_FULLOWNER) strType += L"L"; } if (ColumnType==EXTENSION_COLUMN) { if (ViewColumnTypes[I] & COLUMN_RIGHTALIGN) strType += L"R"; } #if 1 //Maximus: многострочная статусная область if (ColumnType==LINEBREAK_COLUMN) { if (ViewColumnTypes[I] & COLUMN_CENTERALIGN) strType += L"C"; else if (ViewColumnTypes[I] & COLUMN_RIGHTALIGN) strType += L"R"; } #endif strColumnTitles += strType; wchar_t *lpwszWidth = strType.GetBuffer(20); _itow(ViewColumnWidths[I],lpwszWidth,10); strType.ReleaseBuffer(); strColumnWidths += strType; switch (ViewColumnWidthsTypes[I]) { case PERCENT_WIDTH: strColumnWidths += L"%"; break; } if (I<ColumnCount-1) { strColumnTitles += L","; strColumnWidths += L","; } } }
void ConvertDate(const FILETIME &ft,string &strDateText, string &strTimeText,int TimeLength, int Brief,int TextMonth,int FullYear,int DynInit) { static int WDateFormat; static wchar_t WDateSeparator,WTimeSeparator,WDecimalSeparator; static bool Init=false; static SYSTEMTIME lt; int DateFormat; wchar_t DateSeparator,TimeSeparator,DecimalSeparator; if (!Init) { WDateFormat=GetDateFormat(); WDateSeparator=GetDateSeparator(); WTimeSeparator=GetTimeSeparator(); WDecimalSeparator=GetDecimalSeparator(); GetLocalTime(<); Init=true; } DateFormat=DynInit?GetDateFormat():WDateFormat; DateSeparator=DynInit?GetDateSeparator():WDateSeparator; TimeSeparator=DynInit?GetTimeSeparator():WTimeSeparator; DecimalSeparator=DynInit?GetDecimalSeparator():WDecimalSeparator; int CurDateFormat=DateFormat; if (Brief && CurDateFormat==2) CurDateFormat=0; SYSTEMTIME st; FILETIME ct; if (!ft.dwHighDateTime) { strDateText.Clear(); strTimeText.Clear(); return; } FileTimeToLocalFileTime(&ft,&ct); FileTimeToSystemTime(&ct,&st); //if ( !strTimeText.IsEmpty() ) { const wchar_t *Letter=L""; if (TimeLength==6) { Letter=(st.wHour<12) ? L"a":L"p"; if (st.wHour>12) st.wHour-=12; if (!st.wHour) st.wHour=12; } if (TimeLength<7) strTimeText.Format(L"%02d%c%02d%s",st.wHour,TimeSeparator,st.wMinute,Letter); else { string strFullTime; strFullTime.Format(L"%02d%c%02d%c%02d%c%03d",st.wHour,TimeSeparator, st.wMinute,TimeSeparator,st.wSecond,DecimalSeparator,st.wMilliseconds); strTimeText.Format(L"%.*s",TimeLength, strFullTime.CPtr()); } } //if ( !strDateText.IsEmpty() ) { int Year=st.wYear; if (!FullYear) Year%=100; if (TextMonth) { const wchar_t *Month=MSG(MMonthJan+st.wMonth-1); switch (CurDateFormat) { case 0: strDateText.Format(L"%3.3s %2d %02d",Month,st.wDay,Year); break; case 1: strDateText.Format(L"%2d %3.3s %02d",st.wDay,Month,Year); break; default: strDateText.Format(L"%02d %3.3s %2d",Year,Month,st.wDay); break; } } else { int p1,p2,p3=Year; int w1=2, w2=2, w3=2; wchar_t f1=L'0', f2=L'0', f3=FullYear==2?L' ':L'0'; switch (CurDateFormat) { case 0: p1=st.wMonth; p2=st.wDay; break; case 1: p1=st.wDay; p2=st.wMonth; break; default: p1=Year; w1=FullYear==2?5:2; f3=f1; f1=L' '; p2=st.wMonth; p3=st.wDay; break; } FormatString Fmt; Fmt<<fmt::FillChar(f1)<<fmt::Width(w1)<<p1<<DateSeparator<<fmt::FillChar(f2)<<fmt::Width(w2)<<p2<<DateSeparator<<fmt::FillChar(f3)<<fmt::Width(w3)<<p3; strDateText=Fmt; } } if (Brief) { strDateText.SetLength(TextMonth ? 6 : 5); if (lt.wYear!=st.wYear) strTimeText.Format(L"%5d",st.wYear); } }
int ReplaceVariables(string &strStr,TSubstData *PSubstData) { const int MaxSize=20; const wchar_t *Str=strStr; const wchar_t * const StartStr=Str; if (*Str==L'\"') while (*Str && *Str!=L'\"') Str++; DialogItemEx *DlgData = new DialogItemEx[MaxSize+2]; FormatString HistoryName[MaxSize]; int DlgSize=0; int StrPos[128],StrEndPos[128],StrPosSize=0; while (*Str && DlgSize<MaxSize) { if (*(Str++)!=L'!') continue; if (!*Str) break; if (*(Str++)!=L'?') continue; if (!*Str) break; // теперича все не просто // придется сразу определить наличие операторных скобок // запомнить их позицию int scr,end, beg_t,end_t,beg_s,end_s; scr = end = beg_t = end_t = beg_s = end_s = 0; int ii = IsReplaceVariable(Str-2,&scr,&end,&beg_t,&end_t,&beg_s,&end_s); if (ii == -1) { delete [] DlgData; strStr.Clear(); return 0; } StrEndPos[StrPosSize] = (int)(Str - StartStr - 2) + ii ; //+1 StrPos[StrPosSize++]=(int)(Str-StartStr-2); DlgData[DlgSize].Clear(); DlgData[DlgSize].Type=DI_TEXT; DlgData[DlgSize].X1=5; DlgData[DlgSize].Y1=DlgSize+2; DlgData[DlgSize+1].Clear(); DlgData[DlgSize+1].Type=DI_EDIT; DlgData[DlgSize+1].X1=5; DlgData[DlgSize+1].X2=70; DlgData[DlgSize+1].Y1=DlgSize+3; DlgData[DlgSize+1].Flags|=DIF_HISTORY|DIF_USELASTHISTORY; int HistoryNumber=DlgSize/2; HistoryName[HistoryNumber] << L"UserVar" << HistoryNumber; DlgData[DlgSize+1].strHistory=HistoryName[HistoryNumber]; if (!DlgSize) { DlgData[DlgSize+1].Flags|=DIF_DEFAULTBUTTON; DlgData[DlgSize+1].Flags|=DIF_FOCUS; } string strTitle; if (scr > 2) // if between !? and ? exist some strTitle.Append(Str,scr-2); size_t hist_correct = 0; if (!strTitle.IsEmpty()) { if (strTitle[0] == L'$') // begin of history name { const wchar_t *p = &strTitle[1]; const wchar_t *p1 = wcschr(p,L'$'); if (p1) { HistoryName[HistoryNumber].Copy(p,p1-p); DlgData[DlgSize+1].strHistory=HistoryName[HistoryNumber]; strTitle = ++p1; hist_correct = p1 - p + 1; } } } if ((beg_t == -1) || (end_t == -1)) { // } else if ((end_t - beg_t) > 1) //if between ( and ) exist some { string strTitle2; string strTitle3; strTitle2.Append(strTitle.CPtr()+(end_t-2)+1-hist_correct,scr-end_t-1); // !?$zz$xxxx(fffff)ddddd // ^ ^ strTitle3.Append(strTitle.CPtr()+(beg_t-2)+1-hist_correct,end_t-beg_t-1); // !?$zz$xxxx(ffffff)ddddd // ^ ^ strTitle.SetLength(beg_t-2-hist_correct); // !?$zz$xxxx(fffff)ddddd // ^ ^ string strTmp; const wchar_t *CurStr = strTitle3; while (*CurStr) { if (*CurStr == L'!') { CurStr=_SubstFileName(CurStr,PSubstData,strTmp); } else { strTmp.Append(CurStr,1); CurStr++; } } strTitle += strTmp; strTitle += strTitle2; } //do it - типа здесь все уже раскрыто и преобразовано DlgData[DlgSize].strData = strTitle; // Заполняем поле ввода заданным шаблоном - если есть string strTxt; if ((end-scr) > 1) //if between ? and ! exist some strTxt.Append((Str-2)+scr+1,(end-scr)-1); if ((beg_s == -1) || (end_s == -1)) { // } else if ((end_s - beg_s) > 1) //if between ( and ) exist some { string strTxt2; string strTxt3; strTxt2.Copy(strTxt.CPtr()+(end_s-scr),end-end_s-1); // !?$zz$xxxx(fffff)ddddd?rrrr(pppp)qqqqq! // ^ ^ strTxt3.Copy(strTxt.CPtr()+(beg_s-scr),end_s-beg_s-1); // !?$zz$xxxx(ffffff)ddddd?rrrr(pppp)qqqqq! // ^ ^ strTxt.SetLength(beg_s-scr-1); // !?$zz$xxxx(fffff)ddddd?rrrr(pppp)qqqqq! // ^ ^ string strTmp; const wchar_t *CurStr = strTxt3; while (*CurStr) { if (*CurStr == L'!') { CurStr=_SubstFileName(CurStr,PSubstData,strTmp); } else { strTmp.Append(CurStr,1); CurStr++; } } strTxt += strTmp; strTxt += strTxt2; } DlgData[DlgSize+1].strData = strTxt; apiExpandEnvironmentStrings(DlgData[DlgSize].strData,DlgData[DlgSize].strData); DlgSize+=2; } if (!DlgSize) { delete [] DlgData; return 0; } DlgData[DlgSize].Clear(); DlgData[DlgSize].Type=DI_DOUBLEBOX; DlgData[DlgSize].X1=3; DlgData[DlgSize].Y1=1; DlgData[DlgSize].X2=72; DlgData[DlgSize].Y2=DlgSize+2; DlgSize++; int ExitCode; { Dialog Dlg(DlgData,DlgSize); Dlg.SetPosition(-1,-1,76,DlgSize+3); Dlg.Process(); ExitCode=Dlg.GetExitCode(); } if (ExitCode==-1) { delete [] DlgData; strStr.Clear(); return 0; } string strTmpStr; for (Str=StartStr; *Str; Str++) { int Replace=-1; int end_pos=0; for (int I=0; I<StrPosSize; I++) { if (Str-StartStr==StrPos[I]) { Replace=I; end_pos = StrEndPos[I]; break; } } if (Replace!=-1) { strTmpStr += DlgData[Replace*2+1].strData; Str = StartStr+end_pos; } else { strTmpStr.Append(Str,1); } } strStr = strTmpStr; apiExpandEnvironmentStrings(strStr,strStr); delete [] DlgData; return 1; }