// Вызов редактора имени кодовой страницы void EditCodePageName() { UINT Position = CodePages->GetSelectPos(); if (IsPositionStandard(Position)) return; FARString CodePageName = CodePages->GetItemPtr(Position)->strName; size_t BoxPosition; if (!CodePageName.Pos(BoxPosition, BoxSymbols[BS_V1])) return; CodePageName.LShift(BoxPosition+2); DialogDataEx EditDialogData[]= { {DI_DOUBLEBOX, 3, 1, 50, 5, {}, 0, MSG(MGetCodePageEditCodePageName)}, {DI_EDIT, 5, 2, 48, 2, {(DWORD_PTR)L"CodePageName"}, DIF_FOCUS|DIF_HISTORY, CodePageName}, {DI_TEXT, 0, 3, 0, 3, {}, DIF_SEPARATOR, L""}, {DI_BUTTON, 0, 4, 0, 3, {}, DIF_DEFAULT|DIF_CENTERGROUP, MSG(MOk)}, {DI_BUTTON, 0, 4, 0, 3, {}, DIF_CENTERGROUP, MSG(MCancel)}, {DI_BUTTON, 0, 4, 0, 3, {}, DIF_CENTERGROUP, MSG(MGetCodePageResetCodePageName)} }; MakeDialogItemsEx(EditDialogData, EditDialog); Dialog Dlg(EditDialog, ARRAYSIZE(EditDialog), EditDialogProc); Dlg.SetPosition(-1, -1, 54, 7); Dlg.SetHelp(L"EditCodePageNameDlg"); Dlg.Process(); }
bool ExcDialog(LPCWSTR ModuleName,LPCWSTR Exception,LPVOID Adress) { string strAddr; strAddr.Format(L"0x%p",Adress); string strFunction=GetFunctionName(From); #ifndef NO_WRAPPER if(Module && !Module->IsOemPlugin()) #endif // NO_WRAPPER { strFunction+=L"W"; } FarDialogItem EditDlgData[]= { {DI_DOUBLEBOX,3,1,72,8,0,nullptr,nullptr,0,MSG(MExcTrappedException)}, {DI_TEXT, 5,2, 17,2,0,nullptr,nullptr,0,MSG(MExcException)}, {DI_TEXT, 18,2, 70,2,0,nullptr,nullptr,0,Exception}, {DI_TEXT, 5,3, 17,3,0,nullptr,nullptr,0,MSG(MExcAddress)}, {DI_TEXT, 18,3, 70,3,0,nullptr,nullptr,0,strAddr}, {DI_TEXT, 5,4, 17,4,0,nullptr,nullptr,0,MSG(MExcFunction)}, {DI_TEXT, 18,4, 70,4,0,nullptr,nullptr,0,strFunction}, {DI_TEXT, 5,5, 17,5,0,nullptr,nullptr,0,MSG(MExcModule)}, {DI_EDIT, 18,5, 70,5,0,nullptr,nullptr,DIF_READONLY|DIF_SELECTONENTRY,ModuleName}, {DI_TEXT, -1,6, 0,6,0,nullptr,nullptr,DIF_SEPARATOR,L""}, {DI_BUTTON, 0,7, 0,7,0,nullptr,nullptr,DIF_DEFAULTBUTTON|DIF_FOCUS|DIF_CENTERGROUP,MSG((From == EXCEPT_KERNEL)?MExcTerminate:MExcUnload)}, {DI_BUTTON, 0,7, 0,7,0,nullptr,nullptr,DIF_CENTERGROUP,MSG(MExcDebugger)}, }; MakeDialogItemsEx(EditDlgData,EditDlg); Dialog Dlg(EditDlg, ARRAYSIZE(EditDlg),ExcDlgProc); Dlg.SetDialogMode(DMODE_WARNINGSTYLE|DMODE_NOPLUGINS); Dlg.SetPosition(-1,-1,76,10); Dlg.Process(); return Dlg.GetExitCode()==11; }
/* Стандартный диалог ввода пароля. Умеет сам запоминать последнего юзвера и пароль. Name - сюда будет помещен юзвер (max 256 символов!!!) Password - сюда будет помещен пароль (max 256 символов!!!) Title - заголовок диалога (может быть nullptr) HelpTopic - тема помощи (может быть nullptr) Flags - флаги (GNP_*) */ int GetNameAndPassword(const string& Title, string &strUserName, string &strPassword,const wchar_t *HelpTopic,DWORD Flags) { static string strLastName, strLastPassword; int ExitCode; /* 0 1 2 3 4 5 6 7 0123456789012345678901234567890123456789012345678901234567890123456789012345 |0 | |1 +------------------------------- Title -------------------------------+ | |2 | User name | | |3 | *******************************************************************| | |4 | User password | | |5 | ******************************************************************* | | |6 +---------------------------------------------------------------------+ | |7 | [ Ok ] [ Cancel ] | | |8 +---------------------------------------------------------------------+ | |9 | */ FarDialogItem PassDlgData[]= { {DI_DOUBLEBOX, 3, 1,72, 8,0,nullptr,nullptr,0,NullToEmpty(Title.data())}, {DI_TEXT, 5, 2, 0, 2,0,nullptr,nullptr,0,MSG(MNetUserName)}, {DI_EDIT, 5, 3,70, 3,0,L"NetworkUser",nullptr,DIF_FOCUS|DIF_USELASTHISTORY|DIF_HISTORY,(Flags&GNP_USELAST)?strLastName.data():strUserName.data()}, {DI_TEXT, 5, 4, 0, 4,0,nullptr,nullptr,0,MSG(MNetUserPassword)}, {DI_PSWEDIT, 5, 5,70, 5,0,nullptr,nullptr,0,(Flags&GNP_USELAST)?strLastPassword.data():strPassword.data()}, {DI_TEXT, -1, 6, 0, 6,0,nullptr,nullptr,DIF_SEPARATOR,L""}, {DI_BUTTON, 0, 7, 0, 7,0,nullptr,nullptr,DIF_DEFAULTBUTTON|DIF_CENTERGROUP,MSG(MOk)}, {DI_BUTTON, 0, 7, 0, 7,0,nullptr,nullptr,DIF_CENTERGROUP,MSG(MCancel)}, }; auto PassDlg = MakeDialogItemsEx(PassDlgData); { auto Dlg = Dialog::create(PassDlg); Dlg->SetPosition(-1,-1,76,10); Dlg->SetId(GetNameAndPasswordId); if (HelpTopic) Dlg->SetHelp(HelpTopic); Dlg->Process(); ExitCode=Dlg->GetExitCode(); } if (ExitCode!=6) return FALSE; // запоминаем всегда. strUserName = PassDlg[2].strData; strLastName = strUserName; strPassword = PassDlg[4].strData; strLastPassword = strPassword; return TRUE; }
static reply ExcDialog(const string& ModuleName, LPCWSTR Exception, LPVOID Adress) { // TODO: Far Dialog is not the best choice for exception reporting // replace with something trivial string strAddr = str_printf(L"0x%p",Adress); FarDialogItem EditDlgData[]= { {DI_DOUBLEBOX,3,1,72,8,0,nullptr,nullptr,0,MSG(MExcTrappedException)}, {DI_TEXT, 5,2, 17,2,0,nullptr,nullptr,0,MSG(MExcException)}, {DI_TEXT, 18,2, 70,2,0,nullptr,nullptr,0,Exception}, {DI_TEXT, 5,3, 17,3,0,nullptr,nullptr,0,MSG(MExcAddress)}, {DI_TEXT, 18,3, 70,3,0,nullptr,nullptr,0,strAddr.data()}, {DI_TEXT, 5,4, 17,4,0,nullptr,nullptr,0,MSG(MExcFunction)}, {DI_TEXT, 18,4, 70,4,0,nullptr,nullptr,0,From}, {DI_TEXT, 5,5, 17,5,0,nullptr,nullptr,0,MSG(MExcModule)}, {DI_EDIT, 18,5, 70,5,0,nullptr,nullptr,DIF_READONLY|DIF_SELECTONENTRY,ModuleName.data()}, {DI_TEXT, -1,6, 0,6,0,nullptr,nullptr,DIF_SEPARATOR,L""}, {DI_BUTTON, 0,7, 0,7,0,nullptr,nullptr,DIF_DEFAULTBUTTON|DIF_FOCUS|DIF_CENTERGROUP, MSG(PluginModule? MExcUnload : MExcTerminate)}, {DI_BUTTON, 0,7, 0,7,0,nullptr,nullptr,DIF_CENTERGROUP,MSG(MExcDebugger)}, {DI_BUTTON, 0,7, 0,7,0,nullptr,nullptr,DIF_CENTERGROUP,MSG(MIgnore)}, }; auto EditDlg = MakeDialogItemsEx(EditDlgData); auto Dlg = Dialog::create(EditDlg, ExcDlgProc); Dlg->SetDialogMode(DMODE_WARNINGSTYLE|DMODE_NOPLUGINS); Dlg->SetPosition(-1,-1,76,10); Dlg->Process(); switch (Dlg->GetExitCode()) { case 10: return reply_handle; case 11: return reply_debug; case 12: default: return reply_ignore; } }
void FileList::SetFilePanelModes() { int CurMode=0; if (CtrlObject->Cp()->ActivePanel->GetType()==FILE_PANEL) { CurMode=CtrlObject->Cp()->ActivePanel->GetViewMode(); CurMode=CurMode?CurMode-1:9; } for(;;) { MenuDataEx ModeListMenu[]= { MSG(MEditPanelModesBrief),0,0, MSG(MEditPanelModesMedium),0,0, MSG(MEditPanelModesFull),0,0, MSG(MEditPanelModesWide),0,0, MSG(MEditPanelModesDetailed),0,0, MSG(MEditPanelModesDiz),0,0, MSG(MEditPanelModesLongDiz),0,0, MSG(MEditPanelModesOwners),0,0, MSG(MEditPanelModesLinks),0,0, MSG(MEditPanelModesAlternative),0,0, }; int ModeNumber; ModeListMenu[CurMode].SetSelect(1); { VMenu ModeList(MSG(MEditPanelModes),ModeListMenu,ARRAYSIZE(ModeListMenu),ScrY-4); ModeList.SetPosition(-1,-1,0,0); ModeList.SetHelp(L"PanelViewModes"); ModeList.SetFlags(VMENU_WRAPMODE); ModeList.Process(); ModeNumber=ModeList.Modal::GetExitCode(); } if (ModeNumber<0) return; CurMode=ModeNumber; enum ModeItems { MD_DOUBLEBOX, MD_TEXTTYPES, MD_EDITTYPES, MD_TEXTWIDTHS, MD_EDITWIDTHS, MD_TEXTSTATUSTYPES, MD_EDITSTATUSTYPES, MD_TEXTSTATUSWIDTHS, MD_EDITSTATUSWIDTHS, MD_SEPARATOR1, MD_CHECKBOX_FULLSCREEN, MD_CHECKBOX_ALIGNFILEEXT, MD_CHECKBOX_ALIGNFOLDEREXT, MD_CHECKBOX_FOLDERUPPERCASE, MD_CHECKBOX_FILESLOWERCASE, MD_CHECKBOX_UPPERTOLOWERCASE, MD_CHECKBOX_PRELOADC0DATA, MD_SEPARATOR2, MD_BUTTON_OK, MD_BUTTON_CANCEL, } ; DialogDataEx ModeDlgData[]= { DI_DOUBLEBOX, 3, 1,72,16,0,0,ModeListMenu[ModeNumber].Name, DI_TEXT, 5, 2, 0, 2,0,0,MSG(MEditPanelModeTypes), DI_EDIT, 5, 3,35, 3,0,DIF_FOCUS,L"", DI_TEXT, 5, 4, 0, 4,0,0,MSG(MEditPanelModeWidths), DI_EDIT, 5, 5,35, 5,0,0,L"", DI_TEXT, 38, 2, 0, 2,0,0,MSG(MEditPanelModeStatusTypes), DI_EDIT, 38, 3,70, 3,0,0,L"", DI_TEXT, 38, 4, 0, 4,0,0,MSG(MEditPanelModeStatusWidths), DI_EDIT, 38, 5,70, 5,0,0,L"", DI_TEXT, 3, 6, 0, 6,0,DIF_SEPARATOR,MSG(MEditPanelReadHelp), DI_CHECKBOX, 5, 7, 0, 7,0,0,MSG(MEditPanelModeFullscreen), DI_CHECKBOX, 5, 8, 0, 8,0,0,MSG(MEditPanelModeAlignExtensions), DI_CHECKBOX, 5, 9, 0, 9,0,0,MSG(MEditPanelModeAlignFolderExtensions), DI_CHECKBOX, 5,10, 0,10,0,0,MSG(MEditPanelModeFoldersUpperCase), DI_CHECKBOX, 5,11, 0,11,0,0,MSG(MEditPanelModeFilesLowerCase), DI_CHECKBOX, 5,12, 0,12,0,0,MSG(MEditPanelModeUpperToLowerCase), DI_CHECKBOX, 5,13, 0,12,0,0,MSG(MEditPanelModePreloadC0Data), DI_TEXT, 3,14, 0,13,0,DIF_SEPARATOR,L"", DI_BUTTON, 0,15, 0,14,0,DIF_DEFAULT|DIF_CENTERGROUP,MSG(MOk), DI_BUTTON, 0,15, 0,14,0,DIF_CENTERGROUP,MSG(MCancel), }; MakeDialogItemsEx(ModeDlgData,ModeDlg); int ExitCode; RemoveHighlights(ModeDlg[MD_DOUBLEBOX].strData); if (ModeNumber==9) ModeNumber=0; else ModeNumber++; PanelViewSettings NewSettings=ViewSettingsArray[ModeNumber]; ModeDlg[MD_CHECKBOX_FULLSCREEN].Selected=NewSettings.FullScreen; ModeDlg[MD_CHECKBOX_ALIGNFILEEXT].Selected=NewSettings.AlignExtensions; ModeDlg[MD_CHECKBOX_ALIGNFOLDEREXT].Selected=NewSettings.FolderAlignExtensions; ModeDlg[MD_CHECKBOX_FOLDERUPPERCASE].Selected=NewSettings.FolderUpperCase; ModeDlg[MD_CHECKBOX_FILESLOWERCASE].Selected=NewSettings.FileLowerCase; ModeDlg[MD_CHECKBOX_UPPERTOLOWERCASE].Selected=NewSettings.FileUpperToLowerCase; ModeDlg[MD_CHECKBOX_PRELOADC0DATA].Selected=NewSettings.PreloadC0Data; ViewSettingsToText(NewSettings.ColumnType,NewSettings.ColumnWidth,NewSettings.ColumnWidthType, NewSettings.ColumnCount,FALSE,ModeDlg[2].strData,ModeDlg[4].strData); ViewSettingsToText(NewSettings.StatusColumnType,NewSettings.StatusColumnWidth,NewSettings.StatusColumnWidthType, NewSettings.StatusColumnCount,TRUE,ModeDlg[6].strData,ModeDlg[8].strData); { Dialog Dlg(ModeDlg,ARRAYSIZE(ModeDlg)); Dlg.SetPosition(-1,-1,76,18); Dlg.SetHelp(L"PanelViewModes"); Dlg.Process(); ExitCode=Dlg.GetExitCode(); } if (ExitCode!=MD_BUTTON_OK) continue; memset(&NewSettings,0,sizeof(NewSettings)); NewSettings.FullScreen=ModeDlg[MD_CHECKBOX_FULLSCREEN].Selected; NewSettings.AlignExtensions=ModeDlg[MD_CHECKBOX_ALIGNFILEEXT].Selected; NewSettings.FolderAlignExtensions=ModeDlg[MD_CHECKBOX_ALIGNFOLDEREXT].Selected; NewSettings.FolderUpperCase=ModeDlg[MD_CHECKBOX_FOLDERUPPERCASE].Selected; NewSettings.FileLowerCase=ModeDlg[MD_CHECKBOX_FILESLOWERCASE].Selected; NewSettings.FileUpperToLowerCase=ModeDlg[MD_CHECKBOX_UPPERTOLOWERCASE].Selected; NewSettings.PreloadC0Data=ModeDlg[MD_CHECKBOX_PRELOADC0DATA].Selected; TextToViewSettings(ModeDlg[MD_EDITTYPES].strData,ModeDlg[MD_EDITWIDTHS].strData,FALSE, NewSettings.ColumnType,NewSettings.ColumnWidth,NewSettings.ColumnWidthType,NewSettings.ColumnCount); TextToViewSettings(ModeDlg[MD_EDITSTATUSTYPES].strData,ModeDlg[MD_EDITSTATUSWIDTHS].strData,TRUE, NewSettings.StatusColumnType,NewSettings.StatusColumnWidth,NewSettings.StatusColumnWidthType,NewSettings.StatusColumnCount); ViewSettingsArray[ModeNumber]=NewSettings; CtrlObject->Cp()->LeftPanel->SortFileList(TRUE); CtrlObject->Cp()->RightPanel->SortFileList(TRUE); CtrlObject->Cp()->SetScreenPosition(); int LeftMode=CtrlObject->Cp()->LeftPanel->GetViewMode(); int RightMode=CtrlObject->Cp()->RightPanel->GetViewMode(); // CtrlObject->Cp()->LeftPanel->SetViewMode(ModeNumber); // CtrlObject->Cp()->RightPanel->SetViewMode(ModeNumber); CtrlObject->Cp()->LeftPanel->SetViewMode(LeftMode); CtrlObject->Cp()->RightPanel->SetViewMode(RightMode); CtrlObject->Cp()->LeftPanel->Redraw(); CtrlObject->Cp()->RightPanel->Redraw(); } }
bool UserMenu::EditMenu(DList<UserMenuItem> *Menu, UserMenuItem *MenuItem, bool Create) { bool Result = false; bool SubMenu = false; bool Continue = true; MenuNeedRefresh = true; if (Create) { switch (Message(0,2,MSG(MUserMenuTitle),MSG(MAskInsertMenuOrCommand),MSG(MMenuInsertCommand),MSG(MMenuInsertMenu))) { case -1: case -2: Continue = false; case 1: SubMenu = true; } } else { SubMenu = MenuItem->Submenu; } if (Continue) { const int DLG_X=76, DLG_Y=SubMenu?10:22; FARDIALOGITEMFLAGS State=SubMenu?DIF_HIDDEN|DIF_DISABLE:DIF_NONE; FarDialogItem EditDlgData[]= { {DI_DOUBLEBOX,3,1,DLG_X-4,DLG_Y-2,0,nullptr,nullptr,0,MSG(SubMenu?MEditSubmenuTitle:MEditMenuTitle)}, {DI_TEXT,5,2,0,2,0,nullptr,nullptr,0,MSG(MEditMenuHotKey)}, {DI_FIXEDIT,5,3,7,3,0,nullptr,nullptr,DIF_FOCUS,L""}, {DI_TEXT,5,4,0,4,0,nullptr,nullptr,0,MSG(MEditMenuLabel)}, {DI_EDIT,5,5,DLG_X-6,5,0,nullptr,nullptr,0,L""}, {DI_TEXT,3,6,0,6,0,nullptr,nullptr,DIF_SEPARATOR|State,L""}, {DI_TEXT,5,7,0,7,0,nullptr,nullptr,State,MSG(MEditMenuCommands)}, #ifdef PROJECT_DI_MEMOEDIT {DI_MEMOEDIT,5, 8,DLG_X-6,17,0,nullptr,nullptr,DIF_EDITPATH,L""}, #else {DI_EDIT,5, 8,DLG_X-6,8,0,nullptr,nullptr,DIF_EDITPATH|DIF_EDITPATHEXEC|DIF_EDITOR|State,L""}, {DI_EDIT,5, 9,DLG_X-6,9,0,nullptr,nullptr,DIF_EDITPATH|DIF_EDITPATHEXEC|DIF_EDITOR|State,L""}, {DI_EDIT,5,10,DLG_X-6,10,0,nullptr,nullptr,DIF_EDITPATH|DIF_EDITPATHEXEC|DIF_EDITOR|State,L""}, {DI_EDIT,5,11,DLG_X-6,11,0,nullptr,nullptr,DIF_EDITPATH|DIF_EDITPATHEXEC|DIF_EDITOR|State,L""}, {DI_EDIT,5,12,DLG_X-6,12,0,nullptr,nullptr,DIF_EDITPATH|DIF_EDITPATHEXEC|DIF_EDITOR|State,L""}, {DI_EDIT,5,13,DLG_X-6,13,0,nullptr,nullptr,DIF_EDITPATH|DIF_EDITPATHEXEC|DIF_EDITOR|State,L""}, {DI_EDIT,5,14,DLG_X-6,14,0,nullptr,nullptr,DIF_EDITPATH|DIF_EDITPATHEXEC|DIF_EDITOR|State,L""}, {DI_EDIT,5,15,DLG_X-6,15,0,nullptr,nullptr,DIF_EDITPATH|DIF_EDITPATHEXEC|DIF_EDITOR|State,L""}, {DI_EDIT,5,16,DLG_X-6,16,0,nullptr,nullptr,DIF_EDITPATH|DIF_EDITPATHEXEC|DIF_EDITOR|State,L""}, {DI_EDIT,5,17,DLG_X-6,17,0,nullptr,nullptr,DIF_EDITPATH|DIF_EDITPATHEXEC|DIF_EDITOR|State,L""}, #endif {DI_TEXT,3,DLG_Y-4,0,DLG_Y-4,0,nullptr,nullptr,DIF_SEPARATOR,L""}, {DI_BUTTON,0,DLG_Y-3,0,DLG_Y-3,0,nullptr,nullptr,DIF_DEFAULTBUTTON|DIF_CENTERGROUP,MSG(MOk)}, {DI_BUTTON,0,DLG_Y-3,0,DLG_Y-3,0,nullptr,nullptr,DIF_CENTERGROUP,MSG(MCancel)}, }; MakeDialogItemsEx(EditDlgData,EditDlg); #ifndef PROJECT_DI_MEMOEDIT enum {DI_EDIT_COUNT=EM_SEPARATOR2-EM_COMMANDS_TEXT-1}; #endif if (!Create) { EditDlg[EM_HOTKEY_EDIT].strData = MenuItem->strHotKey; EditDlg[EM_LABEL_EDIT].strData = MenuItem->strLabel; #if defined(PROJECT_DI_MEMOEDIT) /* ... здесь добавка строк из "Command%d" в EMR_MEMOEDIT ... */ string strBuffer; for (string *str=MenuItem->Commands.First(); str && CommandNumber < DI_EDIT_COUNT; str=MenuItem->Commands.Next(str)) { strBuffer+=*str; strBuffer+=L"\n"; //??? "\n\r" } EditDlg[EM_MEMOEDIT].strData = strBuffer; //??? #else int CommandNumber=0; for (string *str=MenuItem->Commands.First(); str && CommandNumber < DI_EDIT_COUNT; str=MenuItem->Commands.Next(str)) { EditDlg[EM_EDITLINE_0+CommandNumber].strData = *str; CommandNumber++; } #endif } Dialog Dlg(EditDlg,ARRAYSIZE(EditDlg),EditMenuDlgProc); Dlg.SetHelp(L"UserMenu"); Dlg.SetPosition(-1,-1,DLG_X,DLG_Y); Dlg.Process(); if (Dlg.GetExitCode()==EM_BUTTON_OK) { MenuModified=true; if (Create) { MenuItem = Menu->InsertBefore(MenuItem); } MenuItem->strHotKey = EditDlg[EM_HOTKEY_EDIT].strData; MenuItem->strLabel = EditDlg[EM_LABEL_EDIT].strData; MenuItem->Submenu = SubMenu; if (SubMenu) { if (Create) MenuItem->Menu = new DList<UserMenuItem>(); } else { #if defined(PROJECT_DI_MEMOEDIT) /* ... здесь преобразование содержимого итема EMR_MEMOEDIT в "Command%d" ... */ #else int CommandNumber=0; for (int i=0 ; i < DI_EDIT_COUNT ; i++) if (!EditDlg[i+EM_EDITLINE_0].strData.IsEmpty()) CommandNumber=i+1; MenuItem->Commands.Clear(); for (int i=0 ; i < DI_EDIT_COUNT ; i++) { if (i>=CommandNumber) break; else MenuItem->Commands.Push(&EditDlg[i+EM_EDITLINE_0].strData); } #endif } Result=true; } } return Result; }
void ShellMakeDir(Panel *SrcPanel) { string strDirName; string strOriginalDirName; wchar_t *lpwszDirName; UserDefinedList DirList(0,0,ULF_UNIQUE); DialogDataEx MkDirDlgData[]= { DI_DOUBLEBOX,3,1,72,8,0,0,MSG(MMakeFolderTitle), DI_TEXT, 5,2, 0,2,0,0,MSG(MCreateFolder), DI_EDIT, 5,3,70,3,(DWORD_PTR)L"NewFolder",DIF_FOCUS|DIF_EDITEXPAND|DIF_HISTORY|DIF_USELASTHISTORY|DIF_EDITPATH,L"", DI_TEXT, 0,4, 0,4,0,DIF_SEPARATOR,L"", DI_CHECKBOX, 5,5, 0,5,Opt.MultiMakeDir,0,MSG(MMultiMakeDir), DI_TEXT, 0,6, 0,6,0,DIF_SEPARATOR,L"", DI_BUTTON, 0,7, 0,7,0,DIF_DEFAULT|DIF_CENTERGROUP,MSG(MOk), DI_BUTTON, 0,7, 0,7,0,DIF_CENTERGROUP,MSG(MCancel), }; MakeDialogItemsEx(MkDirDlgData,MkDirDlg); Dialog Dlg(MkDirDlg,ARRAYSIZE(MkDirDlg),MkDirDlgProc,reinterpret_cast<LONG_PTR>(&DirList)); Dlg.SetPosition(-1,-1,76,10); Dlg.SetHelp(L"MakeFolder"); Dlg.SetId(MakeFolderId); Dlg.Process(); if (Dlg.GetExitCode()==MKDIR_OK) { strDirName=MkDirDlg[MKDIR_EDIT].strData; const wchar_t *OneDir; DirList.Reset(); while (nullptr!=(OneDir=DirList.GetNext())) { strDirName = OneDir; strOriginalDirName = strDirName; //Unquote(DirName); if (Opt.CreateUppercaseFolders && !IsCaseMixed(strDirName)) strDirName.Upper(); DeleteEndSlash(strDirName,true); lpwszDirName = strDirName.GetBuffer(); bool bSuccess = false; if(HasPathPrefix(lpwszDirName)) { lpwszDirName += 4; } for (wchar_t *ChPtr=lpwszDirName; *ChPtr; ChPtr++) { if (IsSlash(*ChPtr)) { WCHAR Ch = ChPtr[1]; ChPtr[1] = 0; if (*lpwszDirName && (apiGetFileAttributes(lpwszDirName) == INVALID_FILE_ATTRIBUTES) && apiCreateDirectory(lpwszDirName,nullptr)) { TreeList::AddTreeName(lpwszDirName); bSuccess = true; } ChPtr[1] = Ch; } } strDirName.ReleaseBuffer(); BOOL bSuccess2; bool bSkip=false; while (!(bSuccess2=apiCreateDirectory(strDirName,nullptr))) { int LastError=GetLastError(); if (LastError==ERROR_ALREADY_EXISTS || LastError==ERROR_BAD_PATHNAME || LastError==ERROR_INVALID_NAME || LastError == ERROR_DIRECTORY) { int ret; if (DirList.IsEmpty()) ret=Message(MSG_WARNING|MSG_ERRORTYPE,1,MSG(MError),MSG(MCannotCreateFolder),strOriginalDirName,MSG(MCancel)); else ret=Message(MSG_WARNING|MSG_ERRORTYPE,2,MSG(MError),MSG(MCannotCreateFolder),strOriginalDirName,MSG(MOk),MSG(MSkip)); bSkip = ret==1; if (bSuccess || bSkip) break; else return; } else { int ret; if (DirList.IsEmpty()) { ret=Message(MSG_WARNING|MSG_ERRORTYPE,2,MSG(MError),MSG(MCannotCreateFolder),strOriginalDirName,MSG(MRetry),MSG(MCancel)); } else { ret=Message(MSG_WARNING|MSG_ERRORTYPE,3,MSG(MError),MSG(MCannotCreateFolder),strOriginalDirName,MSG(MRetry),MSG(MSkip),MSG(MCancel)); bSkip = ret==1; } if (ret) { if (bSuccess || bSkip) break; else return; } } } if (bSuccess2) TreeList::AddTreeName(strDirName); else if (!bSkip) break; } SrcPanel->Update(UPDATE_KEEP_SELECTION); if (!strDirName.IsEmpty()) { size_t pos; if (FindSlash(pos,strDirName)) strDirName.SetLength(pos); if (!SrcPanel->GoToFile(strDirName) && strDirName.At(strDirName.GetLength()-1)==L'.') { strDirName.SetLength(strDirName.GetLength()-1); SrcPanel->GoToFile(strDirName); } } SrcPanel->Redraw(); Panel *AnotherPanel=CtrlObject->Cp()->GetAnotherPanel(SrcPanel); int AnotherType=AnotherPanel->GetType(); if (AnotherPanel->NeedUpdatePanel(SrcPanel) || AnotherType==QVIEW_PANEL) { AnotherPanel->Update(UPDATE_KEEP_SELECTION|UPDATE_SECONDARY); AnotherPanel->Redraw(); } } }
void ShellMakeDir(Panel *SrcPanel) { FarList ComboList={sizeof(FarList)}; FarListItem LinkTypeItems[3]={}; ComboList.ItemsNumber=ARRAYSIZE(LinkTypeItems); ComboList.Items=LinkTypeItems; ComboList.Items[0].Text=MSG(MMakeFolderLinkNone); ComboList.Items[1].Text=MSG(MMakeFolderLinkJunction); ComboList.Items[2].Text=MSG(MMakeFolderLinkSymlink); ComboList.Items[0].Flags|=LIF_SELECTED; #if 1 //Maximus: поддержка "узких" дисплеев if (ScrX < 10) { _ASSERTE(ScrX>=10); return; } int BorderW = (72<(ScrX-1))?72:(ScrX-1); // 72 int ElemW = BorderW - 2; // 70 #endif FarDialogItem MkDirDlgData[]= { #if 1 //Maximus: поддержка "узких" дисплеев {DI_DOUBLEBOX,3,1,BorderW,10,0,nullptr,nullptr,0,MSG(MMakeFolderTitle)}, #else {DI_DOUBLEBOX,3,1,72,10,0,nullptr,nullptr,0,MSG(MMakeFolderTitle)}, #endif {DI_TEXT, 5,2, 0,2,0,nullptr,nullptr,0,MSG(MCreateFolder)}, #if 1 //Maximus: поддержка "узких" дисплеев {DI_EDIT, 5,3,ElemW,3,0,L"NewFolder",nullptr,DIF_FOCUS|DIF_EDITEXPAND|DIF_HISTORY|DIF_USELASTHISTORY|DIF_EDITPATH,L""}, #else {DI_EDIT, 5,3,70,3,0,L"NewFolder",nullptr,DIF_FOCUS|DIF_EDITEXPAND|DIF_HISTORY|DIF_USELASTHISTORY|DIF_EDITPATH,L""}, #endif {DI_TEXT, -1,4, 0,4,0,nullptr,nullptr,DIF_SEPARATOR,L""}, {DI_TEXT, 5,5, 0,5,0,nullptr,nullptr,0,MSG(MMakeFolderLinkType)}, #if 1 //Maximus: поддержка "узких" дисплеев {DI_COMBOBOX,20,5,ElemW,5,0,nullptr,nullptr,DIF_DROPDOWNLIST|DIF_LISTNOAMPERSAND|DIF_LISTWRAPMODE,L""}, #else {DI_COMBOBOX,20,5,70,5,0,nullptr,nullptr,DIF_DROPDOWNLIST|DIF_LISTNOAMPERSAND|DIF_LISTWRAPMODE,L""}, #endif {DI_TEXT, 5,6, 0,6,0,nullptr,nullptr,0,MSG(MMakeFolderLinkTarget)}, #if 1 //Maximus: поддержка "узких" дисплеев {DI_EDIT, 20,6,ElemW,6,0,L"NewFolderLinkTarget",nullptr,DIF_DISABLE|DIF_EDITEXPAND|DIF_HISTORY|DIF_USELASTHISTORY|DIF_EDITPATH,L""}, #else {DI_EDIT, 20,6,70,6,0,L"NewFolderLinkTarget",nullptr,DIF_DISABLE|DIF_EDITEXPAND|DIF_HISTORY|DIF_USELASTHISTORY|DIF_EDITPATH,L""}, #endif {DI_CHECKBOX, 5,7, 0,7,Global->Opt->MultiMakeDir,nullptr,nullptr,0,MSG(MMultiMakeDir)}, {DI_TEXT, -1,8, 0,8,0,nullptr,nullptr,DIF_SEPARATOR,L""}, {DI_BUTTON, 0,9, 0,9,0,nullptr,nullptr,DIF_DEFAULTBUTTON|DIF_CENTERGROUP,MSG(MOk)}, {DI_BUTTON, 0,9, 0,9,0,nullptr,nullptr,DIF_CENTERGROUP,MSG(MCancel)}, }; auto MkDirDlg = MakeDialogItemsEx(MkDirDlgData); MkDirDlg[MKDIR_COMBOBOX_LINKTYPE].ListItems=&ComboList; std::vector<string> DirList; auto Dlg = Dialog::create(MkDirDlg, MkDirDlgProc, &DirList); #if 1 //Maximus: поддержка "узких" дисплеев Dlg->SetPosition(-1,-1,BorderW+4,12); #else Dlg->SetPosition(-1,-1,76,12); #endif Dlg->SetHelp(L"MakeFolder"); Dlg->SetId(MakeFolderId); Dlg->Process(); if (Dlg->GetExitCode()==MKDIR_OK) { string strDirName=MkDirDlg[MKDIR_EDIT].strData; string strOriginalDirName; bool SkipAll = false; FOR(const auto& i, DirList) { // TODO: almost the same code in dirmix::CreatePath() strDirName = i; strOriginalDirName = strDirName; ConvertNameToFull(strDirName, strDirName); DeleteEndSlash(strDirName); bool bSuccess = false; size_t DirOffset = 0; ParsePath(strDirName, &DirOffset); string Part; Part.reserve(strDirName.size()); for (size_t j = DirOffset; j <= strDirName.size(); ++j) { if (j == strDirName.size() || IsSlash(strDirName[j])) { Part = strDirName.substr(0, j); if (!os::fs::exists(Part) || j == strDirName.size()) // skip all intermediate dirs, but not last. { while(!(bSuccess=(os::CreateDirectory(Part, nullptr)!=FALSE)) && !SkipAll) { Global->CatchError(); int Ret = OperationFailed(strOriginalDirName, MError, MSG(MCannotCreateFolder)); if(Ret == 1) // skip { break; } else if(Ret == 2) { SkipAll = true; break; } else if (Ret < 0 || Ret == 3) // cancel { return; } } if(bSuccess) { TreeList::AddTreeName(Part); } } } } if (bSuccess) { if(MkDirDlg[MKDIR_COMBOBOX_LINKTYPE].ListPos) { string strTarget=MkDirDlg[MKDIR_EDIT_LINKPATH].strData; Unquote(strTarget); while(!CreateReparsePoint(strTarget, strDirName, MkDirDlg[MKDIR_COMBOBOX_LINKTYPE].ListPos==1?RP_JUNCTION:RP_SYMLINKDIR) && !SkipAll) { Global->CatchError(); int Ret = OperationFailed(strDirName, MError, MSG(MCopyCannotCreateLink)); if(Ret == 1) // skip { break; } else if(Ret == 2) { SkipAll = true; break; } else if (Ret < 0 || Ret == 3) // cancel { return; } } } } }
bool EditTypeRecord(int EditPos,int TotalRecords,bool NewRec) { bool Result=false; const int DlgX=76,DlgY=23; DialogDataEx EditDlgData[]= { DI_DOUBLEBOX,3, 1,DlgX-4,DlgY-2,0,0,MSG(MFileAssocTitle), DI_TEXT, 5, 2, 0, 2,0,0,MSG(MFileAssocMasks), DI_EDIT, 5, 3,DlgX-6, 3,(DWORD_PTR)L"Masks",DIF_FOCUS|DIF_HISTORY,L"", DI_TEXT, 5, 4, 0, 4,0,0,MSG(MFileAssocDescr), DI_EDIT, 5, 5,DlgX-6, 5,0,0,L"", DI_TEXT, 3, 6, 0, 6,0,DIF_SEPARATOR,L"", DI_CHECKBOX, 5, 7, 0, 7,1,0,MSG(MFileAssocExec), DI_EDIT, 9, 8,DlgX-6, 8,0,DIF_EDITPATH,L"", DI_CHECKBOX, 5, 9, 0, 9,1,0,MSG(MFileAssocAltExec), DI_EDIT, 9,10,DlgX-6,10,0,DIF_EDITPATH,L"", DI_CHECKBOX, 5,11, 0,11,1,0,MSG(MFileAssocView), DI_EDIT, 9,12,DlgX-6,12,0,DIF_EDITPATH,L"", DI_CHECKBOX, 5,13, 0,13,1,0,MSG(MFileAssocAltView), DI_EDIT, 9,14,DlgX-6,14,0,DIF_EDITPATH,L"", DI_CHECKBOX, 5,15, 0,15,1,0,MSG(MFileAssocEdit), DI_EDIT, 9,16,DlgX-6,16,0,DIF_EDITPATH,L"", DI_CHECKBOX, 5,17, 0,17,1,0,MSG(MFileAssocAltEdit), DI_EDIT, 9,18,DlgX-6,18,0,DIF_EDITPATH,L"", DI_TEXT, 3,DlgY-4, 0,DlgY-4,0,DIF_SEPARATOR,L"", DI_BUTTON, 0,DlgY-3, 0,DlgY-3,0,DIF_DEFAULT|DIF_CENTERGROUP,MSG(MOk), DI_BUTTON, 0,DlgY-3, 0,DlgY-3,0,DIF_CENTERGROUP,MSG(MCancel), }; MakeDialogItemsEx(EditDlgData,EditDlg); string strRegKey; strRegKey.Format(FTS.TypeFmt,EditPos); if (!NewRec) { GetRegKey(strRegKey,FTS.Mask,EditDlg[ETR_EDIT_MASKS].strData,L""); GetRegKey(strRegKey,FTS.Desc,EditDlg[ETR_EDIT_DESCR].strData,L""); GetRegKey(strRegKey,FTS.Execute,EditDlg[ETR_EDIT_EXEC].strData,L""); GetRegKey(strRegKey,FTS.AltExec,EditDlg[ETR_EDIT_ALTEXEC].strData,L""); GetRegKey(strRegKey,FTS.View,EditDlg[ETR_EDIT_VIEW].strData,L""); GetRegKey(strRegKey,FTS.AltView,EditDlg[ETR_EDIT_ALTVIEW].strData,L""); GetRegKey(strRegKey,FTS.Edit,EditDlg[ETR_EDIT_EDIT].strData,L""); GetRegKey(strRegKey,FTS.AltEdit,EditDlg[ETR_EDIT_ALTEDIT].strData,L""); DWORD State=GetRegKey(strRegKey,FTS.State,0xffffffff); for (int i=FILETYPE_EXEC,Item=ETR_COMBO_EXEC; i<=FILETYPE_ALTEDIT; i++,Item+=2) { if (!(State&(1<<i))) { EditDlg[Item].Selected=BSTATE_UNCHECKED; EditDlg[Item+1].Flags|=DIF_DISABLE; } } } Dialog Dlg(EditDlg,ARRAYSIZE(EditDlg),EditTypeRecordDlgProc); Dlg.SetHelp(FTS.HelpModify); Dlg.SetPosition(-1,-1,DlgX,DlgY); Dlg.Process(); if (Dlg.GetExitCode()==ETR_BUTTON_OK) { if (NewRec) { InsertKeyRecord(FTS.TypeFmt,EditPos,TotalRecords); } SetRegKey(strRegKey,FTS.Mask,EditDlg[ETR_EDIT_MASKS].strData); SetRegKey(strRegKey,FTS.Desc,EditDlg[ETR_EDIT_DESCR].strData); SetRegKey(strRegKey,FTS.Execute,EditDlg[ETR_EDIT_EXEC].strData); SetRegKey(strRegKey,FTS.AltExec,EditDlg[ETR_EDIT_ALTEXEC].strData); SetRegKey(strRegKey,FTS.View,EditDlg[ETR_EDIT_VIEW].strData); SetRegKey(strRegKey,FTS.AltView,EditDlg[ETR_EDIT_ALTVIEW].strData); SetRegKey(strRegKey,FTS.Edit,EditDlg[ETR_EDIT_EDIT].strData); SetRegKey(strRegKey,FTS.AltEdit,EditDlg[ETR_EDIT_ALTEDIT].strData); DWORD State=0; for (int i=FILETYPE_EXEC,Item=ETR_COMBO_EXEC; i<=FILETYPE_ALTEDIT; i++,Item+=2) { if (EditDlg[Item].Selected==BSTATE_CHECKED) { State|=(1<<i); } } SetRegKey(strRegKey,FTS.State,State); Result=true; } return Result; }
bool FileFilterConfig(FileFilterParams *FF, bool ColorConfig) { const wchar_t VerticalLine[] = {BoxSymbols[BS_T_H1V1],BoxSymbols[BS_V1],BoxSymbols[BS_V1],BoxSymbols[BS_V1],BoxSymbols[BS_B_H1V1],0}; // Временная маска. CFileMask FileMask; // История для маски файлов const wchar_t FilterMasksHistoryName[] = L"FilterMasks"; // История для имени фильтра const wchar_t FilterNameHistoryName[] = L"FilterName"; // Маски для диалога настройки // Маска для ввода дней для относительной даты const wchar_t DaysMask[] = L"9999"; string strDateMask, strTimeMask; // Определение параметров даты и времени в системе. wchar_t DateSeparator=GetDateSeparator(); wchar_t TimeSeparator=GetTimeSeparator(); wchar_t DecimalSeparator=GetDecimalSeparator(); int DateFormat=GetDateFormat(); switch (DateFormat) { case 0: // Маска даты для форматов DD.MM.YYYYY и MM.DD.YYYYY strDateMask = FormatString() << L"99" << DateSeparator << "99" << DateSeparator << "9999N"; break; case 1: // Маска даты для форматов DD.MM.YYYYY и MM.DD.YYYYY strDateMask = FormatString() << L"99" << DateSeparator << "99" << DateSeparator << "9999N"; break; default: // Маска даты для формата YYYYY.MM.DD strDateMask = FormatString() << L"N9999" << DateSeparator << "c99" << DateSeparator << "c99"; break; } // Маска времени strTimeMask = FormatString() << L"99" << TimeSeparator << "99" << TimeSeparator << "99" << DecimalSeparator << "999"; FarDialogItem FilterDlgData[]= { {DI_DOUBLEBOX,3,1,76,20,0,nullptr,nullptr,DIF_SHOWAMPERSAND,MSG(MFileFilterTitle)}, {DI_TEXT,5,2,0,2,0,nullptr,nullptr,DIF_FOCUS,MSG(MFileFilterName)}, {DI_EDIT,5,2,74,2,0,FilterNameHistoryName,nullptr,DIF_HISTORY,L""}, {DI_TEXT,0,3,0,3,0,nullptr,nullptr,DIF_SEPARATOR,L""}, {DI_CHECKBOX,5,4,0,4,0,nullptr,nullptr,DIF_AUTOMATION,MSG(MFileFilterMatchMask)}, {DI_EDIT,5,4,74,4,0,FilterMasksHistoryName,nullptr,DIF_HISTORY,L""}, {DI_TEXT,0,5,0,5,0,nullptr,nullptr,DIF_SEPARATOR,L""}, {DI_CHECKBOX,5,6,0,6,0,nullptr,nullptr,DIF_AUTOMATION,MSG(MFileFilterSize)}, {DI_TEXT,7,7,8,7,0,nullptr,nullptr,0,MSG(MFileFilterSizeFromSign)}, {DI_EDIT,10,7,20,7,0,nullptr,nullptr,0,L""}, {DI_TEXT,7,8,8,8,0,nullptr,nullptr,0,MSG(MFileFilterSizeToSign)}, {DI_EDIT,10,8,20,8,0,nullptr,nullptr,0,L""}, {DI_CHECKBOX,24,6,0,6,0,nullptr,nullptr,DIF_AUTOMATION,MSG(MFileFilterDate)}, {DI_COMBOBOX,26,7,41,7,0,nullptr,nullptr,DIF_DROPDOWNLIST|DIF_LISTNOAMPERSAND,L""}, {DI_CHECKBOX,26,8,0,8,0,nullptr,nullptr,0,MSG(MFileFilterDateRelative)}, {DI_TEXT,48,7,50,7,0,nullptr,nullptr,0,MSG(MFileFilterDateBeforeSign)}, {DI_FIXEDIT,51,7,61,7,0,nullptr,strDateMask.CPtr(),DIF_MASKEDIT,L""}, {DI_FIXEDIT,51,7,61,7,0,nullptr,DaysMask,DIF_MASKEDIT,L""}, {DI_FIXEDIT,63,7,74,7,0,nullptr,strTimeMask.CPtr(),DIF_MASKEDIT,L""}, {DI_TEXT,48,8,50,8,0,nullptr,nullptr,0,MSG(MFileFilterDateAfterSign)}, {DI_FIXEDIT,51,8,61,8,0,nullptr,strDateMask.CPtr(),DIF_MASKEDIT,L""}, {DI_FIXEDIT,51,8,61,8,0,nullptr,DaysMask,DIF_MASKEDIT,L""}, {DI_FIXEDIT,63,8,74,8,0,nullptr,strTimeMask.CPtr(),DIF_MASKEDIT,L""}, {DI_BUTTON,0,6,0,6,0,nullptr,nullptr,DIF_BTNNOCLOSE,MSG(MFileFilterCurrent)}, {DI_BUTTON,0,6,74,6,0,nullptr,nullptr,DIF_BTNNOCLOSE,MSG(MFileFilterBlank)}, {DI_TEXT,0,9,0,9,0,nullptr,nullptr,DIF_SEPARATOR,L""}, {DI_VTEXT,22,5,22,9,0,nullptr,nullptr,DIF_BOXCOLOR,VerticalLine}, {DI_CHECKBOX, 5,10,0,10,0,nullptr,nullptr,DIF_AUTOMATION,MSG(MFileFilterAttr)}, {DI_CHECKBOX, 7,11,0,11,0,nullptr,nullptr,DIF_3STATE,MSG(MFileFilterAttrR)}, {DI_CHECKBOX, 7,12,0,12,0,nullptr,nullptr,DIF_3STATE,MSG(MFileFilterAttrA)}, {DI_CHECKBOX, 7,13,0,13,0,nullptr,nullptr,DIF_3STATE,MSG(MFileFilterAttrH)}, {DI_CHECKBOX, 7,14,0,14,0,nullptr,nullptr,DIF_3STATE,MSG(MFileFilterAttrS)}, {DI_CHECKBOX,29,11,0,11,0,nullptr,nullptr,DIF_3STATE,MSG(MFileFilterAttrD)}, {DI_CHECKBOX,29,12,0,12,0,nullptr,nullptr,DIF_3STATE,MSG(MFileFilterAttrC)}, {DI_CHECKBOX,29,13,0,13,0,nullptr,nullptr,DIF_3STATE,MSG(MFileFilterAttrE)}, {DI_CHECKBOX,29,14,0,14,0,nullptr,nullptr,DIF_3STATE,MSG(MFileFilterAttrNI)}, {DI_CHECKBOX,29,15,0,15,0,nullptr,nullptr,DIF_3STATE,MSG(MFileFilterAttrReparse)}, {DI_CHECKBOX,51,11,0,11,0,nullptr,nullptr,DIF_3STATE,MSG(MFileFilterAttrSparse)}, {DI_CHECKBOX,51,12,0,12,0,nullptr,nullptr,DIF_3STATE,MSG(MFileFilterAttrT)}, {DI_CHECKBOX,51,13,0,13,0,nullptr,nullptr,DIF_3STATE,MSG(MFileFilterAttrOffline)}, {DI_CHECKBOX,51,14,0,14,0,nullptr,nullptr,DIF_3STATE,MSG(MFileFilterAttrVirtual)}, {DI_TEXT,-1,14,0,14,0,nullptr,nullptr,DIF_SEPARATOR,MSG(MHighlightColors)}, {DI_TEXT,7,15,0,15,0,nullptr,nullptr,0,MSG(MHighlightMarkChar)}, {DI_FIXEDIT,5,15,5,15,0,nullptr,nullptr,0,L""}, {DI_CHECKBOX,0,15,0,15,0,nullptr,nullptr,0,MSG(MHighlightTransparentMarkChar)}, {DI_BUTTON,5,16,0,16,0,nullptr,nullptr,DIF_BTNNOCLOSE|DIF_NOBRACKETS,MSG(MHighlightFileName1)}, {DI_BUTTON,0,16,0,16,0,nullptr,nullptr,DIF_BTNNOCLOSE|DIF_NOBRACKETS,MSG(MHighlightMarking1)}, {DI_BUTTON,5,17,0,17,0,nullptr,nullptr,DIF_BTNNOCLOSE|DIF_NOBRACKETS,MSG(MHighlightFileName2)}, {DI_BUTTON,0,17,0,17,0,nullptr,nullptr,DIF_BTNNOCLOSE|DIF_NOBRACKETS,MSG(MHighlightMarking2)}, {DI_BUTTON,5,18,0,18,0,nullptr,nullptr,DIF_BTNNOCLOSE|DIF_NOBRACKETS,MSG(MHighlightFileName3)}, {DI_BUTTON,0,18,0,18,0,nullptr,nullptr,DIF_BTNNOCLOSE|DIF_NOBRACKETS,MSG(MHighlightMarking3)}, {DI_BUTTON,5,19,0,19,0,nullptr,nullptr,DIF_BTNNOCLOSE|DIF_NOBRACKETS,MSG(MHighlightFileName4)}, {DI_BUTTON,0,19,0,19,0,nullptr,nullptr,DIF_BTNNOCLOSE|DIF_NOBRACKETS,MSG(MHighlightMarking4)}, {DI_USERCONTROL,73-15-1,16,73-2,19,0,nullptr,nullptr,DIF_NOFOCUS,L""}, {DI_CHECKBOX,5,20,0,20,0,nullptr,nullptr,0,MSG(MHighlightContinueProcessing)}, {DI_TEXT,0,16,0,16,0,nullptr,nullptr,DIF_SEPARATOR,L""}, {DI_CHECKBOX,5,17,0,17,0,nullptr,nullptr,0,MSG(MFileHardLinksCount)},//добавляем новый чекбокс в панель {DI_TEXT,0,18,0,18,0,nullptr,nullptr,DIF_SEPARATOR,L""},// и разделитель {DI_BUTTON,0,19,0,19,0,nullptr,nullptr,DIF_DEFAULTBUTTON|DIF_CENTERGROUP,MSG(MOk)}, {DI_BUTTON,0,19,0,19,0,nullptr,nullptr,DIF_CENTERGROUP|DIF_BTNNOCLOSE,MSG(MFileFilterReset)}, {DI_BUTTON,0,19,0,19,0,nullptr,nullptr,DIF_CENTERGROUP,MSG(MFileFilterCancel)}, {DI_BUTTON,0,19,0,19,0,nullptr,nullptr,DIF_CENTERGROUP|DIF_BTNNOCLOSE,MSG(MFileFilterMakeTransparent)}, }; FilterDlgData[0].Data=MSG(ColorConfig?MFileHilightTitle:MFileFilterTitle); MakeDialogItemsEx(FilterDlgData,FilterDlg); if (ColorConfig) { FilterDlg[ID_FF_TITLE].Y2+=5; for (int i=ID_FF_NAME; i<=ID_FF_SEPARATOR1; i++) FilterDlg[i].Flags|=DIF_HIDDEN; for (int i=ID_FF_MATCHMASK; i<=ID_FF_VIRTUAL; i++) { FilterDlg[i].Y1-=2; FilterDlg[i].Y2-=2; } for (int i=ID_FF_SEPARATOR5; i<=ID_FF_MAKETRANSPARENT; i++) { FilterDlg[i].Y1+=5; FilterDlg[i].Y2+=5; } } else { for (int i=ID_HER_SEPARATOR1; i<=ID_HER_CONTINUEPROCESSING; i++) FilterDlg[i].Flags|=DIF_HIDDEN; FilterDlg[ID_FF_MAKETRANSPARENT].Flags=DIF_HIDDEN; } FilterDlg[ID_FF_NAMEEDIT].X1=FilterDlg[ID_FF_NAME].X1+(int)FilterDlg[ID_FF_NAME].strData.GetLength()-(FilterDlg[ID_FF_NAME].strData.Contains(L'&')?1:0)+1; FilterDlg[ID_FF_MASKEDIT].X1=FilterDlg[ID_FF_MATCHMASK].X1+(int)FilterDlg[ID_FF_MATCHMASK].strData.GetLength()-(FilterDlg[ID_FF_MATCHMASK].strData.Contains(L'&')?1:0)+5; FilterDlg[ID_FF_BLANK].X1=FilterDlg[ID_FF_BLANK].X2-(int)FilterDlg[ID_FF_BLANK].strData.GetLength()+(FilterDlg[ID_FF_BLANK].strData.Contains(L'&')?1:0)-3; FilterDlg[ID_FF_CURRENT].X2=FilterDlg[ID_FF_BLANK].X1-2; FilterDlg[ID_FF_CURRENT].X1=FilterDlg[ID_FF_CURRENT].X2-(int)FilterDlg[ID_FF_CURRENT].strData.GetLength()+(FilterDlg[ID_FF_CURRENT].strData.Contains(L'&')?1:0)-3; FilterDlg[ID_HER_MARKTRANSPARENT].X1=FilterDlg[ID_HER_MARK_TITLE].X1+(int)FilterDlg[ID_HER_MARK_TITLE].strData.GetLength()-(FilterDlg[ID_HER_MARK_TITLE].strData.Contains(L'&')?1:0)+1; for (int i=ID_HER_NORMALMARKING; i<=ID_HER_SELECTEDCURSORMARKING; i+=2) FilterDlg[i].X1=FilterDlg[ID_HER_NORMALFILE].X1+(int)FilterDlg[ID_HER_NORMALFILE].strData.GetLength()-(FilterDlg[ID_HER_NORMALFILE].strData.Contains(L'&')?1:0)+1; FAR_CHAR_INFO VBufColorExample[15*4]= {}; HighlightDataColor Colors; FF->GetColors(&Colors); HighlightDlgUpdateUserControl(VBufColorExample,Colors); FilterDlg[ID_HER_COLOREXAMPLE].VBuf=VBufColorExample; wchar_t MarkChar[] = {static_cast<wchar_t>(Colors.MarkChar), 0}; FilterDlg[ID_HER_MARKEDIT].strData=MarkChar; FilterDlg[ID_HER_MARKTRANSPARENT].Selected=(Colors.MarkChar&0xFF0000?1:0); FilterDlg[ID_HER_CONTINUEPROCESSING].Selected=(FF->GetContinueProcessing()?1:0); FilterDlg[ID_FF_NAMEEDIT].strData = FF->GetTitle(); const wchar_t *FMask; FilterDlg[ID_FF_MATCHMASK].Selected=FF->GetMask(&FMask)?1:0; FilterDlg[ID_FF_MASKEDIT].strData=FMask; if (!FilterDlg[ID_FF_MATCHMASK].Selected) FilterDlg[ID_FF_MASKEDIT].Flags|=DIF_DISABLE; const wchar_t *SizeAbove, *SizeBelow; FilterDlg[ID_FF_MATCHSIZE].Selected=FF->GetSize(&SizeAbove,&SizeBelow)?1:0; FilterDlg[ID_FF_SIZEFROMEDIT].strData=SizeAbove; FilterDlg[ID_FF_SIZETOEDIT].strData=SizeBelow; FilterDlg[ID_FF_HARDLINKS].Selected=FF->GetHardLinks(nullptr,nullptr)?1:0; //пока что мы проверям только флаг использования данного условия if (!FilterDlg[ID_FF_MATCHSIZE].Selected) for (int i=ID_FF_SIZEFROMSIGN; i <= ID_FF_SIZETOEDIT; i++) FilterDlg[i].Flags|=DIF_DISABLE; // Лист для комбобокса времени файла FarList DateList= {sizeof(FarList)}; FarListItem TableItemDate[FDATE_COUNT]= {}; // Настройка списка типов дат файла DateList.Items=TableItemDate; DateList.ItemsNumber=FDATE_COUNT; for (int i=0; i < FDATE_COUNT; ++i) TableItemDate[i].Text=MSG(MFileFilterWrited+i); DWORD DateType; FILETIME DateAfter, DateBefore; bool bRelative; FilterDlg[ID_FF_MATCHDATE].Selected=FF->GetDate(&DateType,&DateAfter,&DateBefore,&bRelative)?1:0; FilterDlg[ID_FF_DATERELATIVE].Selected=bRelative?1:0; FilterDlg[ID_FF_DATETYPE].ListItems=&DateList; TableItemDate[DateType].Flags=LIF_SELECTED; if (bRelative) { ConvertRelativeDate(DateAfter, FilterDlg[ID_FF_DAYSAFTEREDIT].strData, FilterDlg[ID_FF_TIMEAFTEREDIT].strData); ConvertRelativeDate(DateBefore, FilterDlg[ID_FF_DAYSBEFOREEDIT].strData, FilterDlg[ID_FF_TIMEBEFOREEDIT].strData); } else { ConvertDate(DateAfter,FilterDlg[ID_FF_DATEAFTEREDIT].strData,FilterDlg[ID_FF_TIMEAFTEREDIT].strData,12,FALSE,FALSE,2); ConvertDate(DateBefore,FilterDlg[ID_FF_DATEBEFOREEDIT].strData,FilterDlg[ID_FF_TIMEBEFOREEDIT].strData,12,FALSE,FALSE,2); } if (!FilterDlg[ID_FF_MATCHDATE].Selected) for (int i=ID_FF_DATETYPE; i <= ID_FF_BLANK; i++) FilterDlg[i].Flags|=DIF_DISABLE; DWORD AttrSet, AttrClear; FilterDlg[ID_FF_MATCHATTRIBUTES].Selected=FF->GetAttr(&AttrSet,&AttrClear)?1:0; FilterDlg[ID_FF_READONLY].Selected=(AttrSet & FILE_ATTRIBUTE_READONLY?1:AttrClear & FILE_ATTRIBUTE_READONLY?0:2); FilterDlg[ID_FF_ARCHIVE].Selected=(AttrSet & FILE_ATTRIBUTE_ARCHIVE?1:AttrClear & FILE_ATTRIBUTE_ARCHIVE?0:2); FilterDlg[ID_FF_HIDDEN].Selected=(AttrSet & FILE_ATTRIBUTE_HIDDEN?1:AttrClear & FILE_ATTRIBUTE_HIDDEN?0:2); FilterDlg[ID_FF_SYSTEM].Selected=(AttrSet & FILE_ATTRIBUTE_SYSTEM?1:AttrClear & FILE_ATTRIBUTE_SYSTEM?0:2); FilterDlg[ID_FF_COMPRESSED].Selected=(AttrSet & FILE_ATTRIBUTE_COMPRESSED?1:AttrClear & FILE_ATTRIBUTE_COMPRESSED?0:2); FilterDlg[ID_FF_ENCRYPTED].Selected=(AttrSet & FILE_ATTRIBUTE_ENCRYPTED?1:AttrClear & FILE_ATTRIBUTE_ENCRYPTED?0:2); FilterDlg[ID_FF_DIRECTORY].Selected=(AttrSet & FILE_ATTRIBUTE_DIRECTORY?1:AttrClear & FILE_ATTRIBUTE_DIRECTORY?0:2); FilterDlg[ID_FF_NOTINDEXED].Selected=(AttrSet & FILE_ATTRIBUTE_NOT_CONTENT_INDEXED?1:AttrClear & FILE_ATTRIBUTE_NOT_CONTENT_INDEXED?0:2); FilterDlg[ID_FF_SPARSE].Selected=(AttrSet & FILE_ATTRIBUTE_SPARSE_FILE?1:AttrClear & FILE_ATTRIBUTE_SPARSE_FILE?0:2); FilterDlg[ID_FF_TEMP].Selected=(AttrSet & FILE_ATTRIBUTE_TEMPORARY?1:AttrClear & FILE_ATTRIBUTE_TEMPORARY?0:2); FilterDlg[ID_FF_REPARSEPOINT].Selected=(AttrSet & FILE_ATTRIBUTE_REPARSE_POINT?1:AttrClear & FILE_ATTRIBUTE_REPARSE_POINT?0:2); FilterDlg[ID_FF_OFFLINE].Selected=(AttrSet & FILE_ATTRIBUTE_OFFLINE?1:AttrClear & FILE_ATTRIBUTE_OFFLINE?0:2); FilterDlg[ID_FF_VIRTUAL].Selected=(AttrSet & FILE_ATTRIBUTE_VIRTUAL?1:AttrClear & FILE_ATTRIBUTE_VIRTUAL?0:2); if (!FilterDlg[ID_FF_MATCHATTRIBUTES].Selected) { for (int i=ID_FF_READONLY; i <= ID_FF_VIRTUAL; i++) FilterDlg[i].Flags|=DIF_DISABLE; } Dialog Dlg(FilterDlg,ARRAYSIZE(FilterDlg),FileFilterConfigDlgProc,ColorConfig?&Colors:nullptr); Dlg.SetHelp(ColorConfig?L"HighlightEdit":L"Filter"); Dlg.SetPosition(-1,-1,FilterDlg[ID_FF_TITLE].X2+4,FilterDlg[ID_FF_TITLE].Y2+2); Dlg.SetAutomation(ID_FF_MATCHMASK,ID_FF_MASKEDIT,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHSIZE,ID_FF_SIZEFROMSIGN,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHSIZE,ID_FF_SIZEFROMEDIT,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHSIZE,ID_FF_SIZETOSIGN,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHSIZE,ID_FF_SIZETOEDIT,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHDATE,ID_FF_DATETYPE,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHDATE,ID_FF_DATERELATIVE,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHDATE,ID_FF_DATEAFTERSIGN,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHDATE,ID_FF_DATEAFTEREDIT,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHDATE,ID_FF_DAYSAFTEREDIT,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHDATE,ID_FF_TIMEAFTEREDIT,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHDATE,ID_FF_DATEBEFORESIGN,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHDATE,ID_FF_DATEBEFOREEDIT,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHDATE,ID_FF_DAYSBEFOREEDIT,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHDATE,ID_FF_TIMEBEFOREEDIT,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHDATE,ID_FF_CURRENT,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHDATE,ID_FF_BLANK,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHATTRIBUTES,ID_FF_READONLY,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHATTRIBUTES,ID_FF_ARCHIVE,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHATTRIBUTES,ID_FF_HIDDEN,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHATTRIBUTES,ID_FF_SYSTEM,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHATTRIBUTES,ID_FF_COMPRESSED,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHATTRIBUTES,ID_FF_ENCRYPTED,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHATTRIBUTES,ID_FF_NOTINDEXED,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHATTRIBUTES,ID_FF_SPARSE,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHATTRIBUTES,ID_FF_TEMP,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHATTRIBUTES,ID_FF_REPARSEPOINT,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHATTRIBUTES,ID_FF_OFFLINE,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHATTRIBUTES,ID_FF_VIRTUAL,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); Dlg.SetAutomation(ID_FF_MATCHATTRIBUTES,ID_FF_DIRECTORY,DIF_DISABLE,DIF_NONE,DIF_NONE,DIF_DISABLE); for (;;) { Dlg.ClearDone(); Dlg.Process(); int ExitCode=Dlg.GetExitCode(); if (ExitCode==ID_FF_OK) // Ok { // Если введённая пользователем маска не корректна, тогда вернёмся в диалог if (FilterDlg[ID_FF_MATCHMASK].Selected && !FileMask.Set(FilterDlg[ID_FF_MASKEDIT].strData,0)) continue; if (FilterDlg[ID_HER_MARKTRANSPARENT].Selected) Colors.MarkChar|=0x00FF0000; else Colors.MarkChar&=0x0000FFFF; FF->SetColors(&Colors); FF->SetContinueProcessing(FilterDlg[ID_HER_CONTINUEPROCESSING].Selected!=0); FF->SetTitle(FilterDlg[ID_FF_NAMEEDIT].strData); FF->SetMask(FilterDlg[ID_FF_MATCHMASK].Selected!=0, FilterDlg[ID_FF_MASKEDIT].strData); FF->SetSize(FilterDlg[ID_FF_MATCHSIZE].Selected!=0, FilterDlg[ID_FF_SIZEFROMEDIT].strData, FilterDlg[ID_FF_SIZETOEDIT].strData); FF->SetHardLinks(FilterDlg[ID_FF_HARDLINKS].Selected!=0,0,0); //пока устанавливаем только флаг использования признака bRelative = FilterDlg[ID_FF_DATERELATIVE].Selected!=0; LPWSTR TimeBefore = FilterDlg[ID_FF_TIMEBEFOREEDIT].strData.GetBuffer(); TimeBefore[8] = TimeSeparator; FilterDlg[ID_FF_TIMEBEFOREEDIT].strData.ReleaseBuffer(FilterDlg[ID_FF_TIMEBEFOREEDIT].strData.GetLength()); LPWSTR TimeAfter = FilterDlg[ID_FF_TIMEAFTEREDIT].strData.GetBuffer(); TimeAfter[8] = TimeSeparator; FilterDlg[ID_FF_TIMEAFTEREDIT].strData.ReleaseBuffer(FilterDlg[ID_FF_TIMEAFTEREDIT].strData.GetLength()); StrToDateTime(FilterDlg[bRelative?ID_FF_DAYSAFTEREDIT:ID_FF_DATEAFTEREDIT].strData,FilterDlg[ID_FF_TIMEAFTEREDIT].strData,DateAfter,DateFormat,DateSeparator,TimeSeparator,bRelative); StrToDateTime(FilterDlg[bRelative?ID_FF_DAYSBEFOREEDIT:ID_FF_DATEBEFOREEDIT].strData,FilterDlg[ID_FF_TIMEBEFOREEDIT].strData,DateBefore,DateFormat,DateSeparator,TimeSeparator,bRelative); FF->SetDate(FilterDlg[ID_FF_MATCHDATE].Selected!=0, FilterDlg[ID_FF_DATETYPE].ListPos, DateAfter, DateBefore, bRelative); AttrSet=0; AttrClear=0; AttrSet|=(FilterDlg[ID_FF_READONLY].Selected==1?FILE_ATTRIBUTE_READONLY:0); AttrSet|=(FilterDlg[ID_FF_ARCHIVE].Selected==1?FILE_ATTRIBUTE_ARCHIVE:0); AttrSet|=(FilterDlg[ID_FF_HIDDEN].Selected==1?FILE_ATTRIBUTE_HIDDEN:0); AttrSet|=(FilterDlg[ID_FF_SYSTEM].Selected==1?FILE_ATTRIBUTE_SYSTEM:0); AttrSet|=(FilterDlg[ID_FF_COMPRESSED].Selected==1?FILE_ATTRIBUTE_COMPRESSED:0); AttrSet|=(FilterDlg[ID_FF_ENCRYPTED].Selected==1?FILE_ATTRIBUTE_ENCRYPTED:0); AttrSet|=(FilterDlg[ID_FF_DIRECTORY].Selected==1?FILE_ATTRIBUTE_DIRECTORY:0); AttrSet|=(FilterDlg[ID_FF_NOTINDEXED].Selected==1?FILE_ATTRIBUTE_NOT_CONTENT_INDEXED:0); AttrSet|=(FilterDlg[ID_FF_SPARSE].Selected==1?FILE_ATTRIBUTE_SPARSE_FILE:0); AttrSet|=(FilterDlg[ID_FF_TEMP].Selected==1?FILE_ATTRIBUTE_TEMPORARY:0); AttrSet|=(FilterDlg[ID_FF_REPARSEPOINT].Selected==1?FILE_ATTRIBUTE_REPARSE_POINT:0); AttrSet|=(FilterDlg[ID_FF_OFFLINE].Selected==1?FILE_ATTRIBUTE_OFFLINE:0); AttrSet|=(FilterDlg[ID_FF_VIRTUAL].Selected==1?FILE_ATTRIBUTE_VIRTUAL:0); AttrClear|=(FilterDlg[ID_FF_READONLY].Selected==0?FILE_ATTRIBUTE_READONLY:0); AttrClear|=(FilterDlg[ID_FF_ARCHIVE].Selected==0?FILE_ATTRIBUTE_ARCHIVE:0); AttrClear|=(FilterDlg[ID_FF_HIDDEN].Selected==0?FILE_ATTRIBUTE_HIDDEN:0); AttrClear|=(FilterDlg[ID_FF_SYSTEM].Selected==0?FILE_ATTRIBUTE_SYSTEM:0); AttrClear|=(FilterDlg[ID_FF_COMPRESSED].Selected==0?FILE_ATTRIBUTE_COMPRESSED:0); AttrClear|=(FilterDlg[ID_FF_ENCRYPTED].Selected==0?FILE_ATTRIBUTE_ENCRYPTED:0); AttrClear|=(FilterDlg[ID_FF_DIRECTORY].Selected==0?FILE_ATTRIBUTE_DIRECTORY:0); AttrClear|=(FilterDlg[ID_FF_NOTINDEXED].Selected==0?FILE_ATTRIBUTE_NOT_CONTENT_INDEXED:0); AttrClear|=(FilterDlg[ID_FF_SPARSE].Selected==0?FILE_ATTRIBUTE_SPARSE_FILE:0); AttrClear|=(FilterDlg[ID_FF_TEMP].Selected==0?FILE_ATTRIBUTE_TEMPORARY:0); AttrClear|=(FilterDlg[ID_FF_REPARSEPOINT].Selected==0?FILE_ATTRIBUTE_REPARSE_POINT:0); AttrClear|=(FilterDlg[ID_FF_OFFLINE].Selected==0?FILE_ATTRIBUTE_OFFLINE:0); AttrClear|=(FilterDlg[ID_FF_VIRTUAL].Selected==0?FILE_ATTRIBUTE_VIRTUAL:0); FF->SetAttr(FilterDlg[ID_FF_MATCHATTRIBUTES].Selected!=0, AttrSet, AttrClear); return true; } else break; } return false; }
int GetSearchReplaceString( bool IsReplaceMode, const wchar_t *Title, const wchar_t *SubTitle, string& SearchStr, string& ReplaceStr, const wchar_t *TextHistoryName, const wchar_t *ReplaceHistoryName, bool* pCase, bool* pWholeWords, bool* pReverse, bool* pRegexp, bool* pPreserveStyle, const wchar_t *HelpTopic, bool HideAll, const GUID* Id) { int Result = 0; if (!TextHistoryName) TextHistoryName = L"SearchText"; if (!ReplaceHistoryName) ReplaceHistoryName = L"ReplaceText"; if (!Title) Title=MSG(IsReplaceMode?MEditReplaceTitle:MEditSearchTitle); if (!SubTitle) SubTitle=MSG(MEditSearchFor); bool Case=pCase?*pCase:false; bool WholeWords=pWholeWords?*pWholeWords:false; bool Reverse=pReverse?*pReverse:false; bool Regexp=pRegexp?*pRegexp:false; bool PreserveStyle=pPreserveStyle?*pPreserveStyle:false; #if 1 //Maximus: поддержка "узких" дисплеев int BorderW = (72<(ScrX-1))?72:(ScrX-1); int ElemW = BorderW - 2; // 70 int ElemX2 = (BorderW + 4) / 2; // 40 #endif if (IsReplaceMode) { /* 0 1 2 3 4 5 6 7 0123456789012345678901234567890123456789012345678901234567890123456789012345 00 01 +----------------------------- Replace ------------------------------+ 02 | Search for | 03 | | 04 | Replace with | 05 | | 06 +--------------------------------------------------------------------+ 07 | [ ] Case sensitive [ ] Regular expressions | 08 | [ ] Whole words [ ] Preserve style | 09 | [ ] Reverse search | 10 +--------------------------------------------------------------------+ 11 | [ Replace ] [ Cancel ] | 12 +--------------------------------------------------------------------+ 13 */ FarDialogItem ReplaceDlgData[]= { #if 1 //Maximus: поддержка "узких" дисплеев {DI_DOUBLEBOX,3,1,BorderW,12,0,nullptr,nullptr,0,Title}, #else {DI_DOUBLEBOX,3,1,72,12,0,nullptr,nullptr,0,Title}, #endif {DI_TEXT,5,2,0,2,0,nullptr,nullptr,0,SubTitle}, #if 1 //Maximus: поддержка "узких" дисплеев {DI_EDIT,5,3,ElemW,3,0,TextHistoryName,nullptr,DIF_FOCUS|DIF_USELASTHISTORY|(*TextHistoryName?DIF_HISTORY:0),SearchStr.data()}, #else {DI_EDIT,5,3,70,3,0,TextHistoryName,nullptr,DIF_FOCUS|DIF_USELASTHISTORY|(*TextHistoryName?DIF_HISTORY:0),SearchStr.data()}, #endif {DI_TEXT,5,4,0,4,0,nullptr,nullptr,0,MSG(MEditReplaceWith)}, #if 1 //Maximus: поддержка "узких" дисплеев {DI_EDIT,5,5,ElemW,5,0,ReplaceHistoryName,nullptr,(*ReplaceHistoryName?DIF_HISTORY:0)/*|DIF_USELASTHISTORY*/,ReplaceStr.data()}, #else {DI_EDIT,5,5,70,5,0,ReplaceHistoryName,nullptr,(*ReplaceHistoryName?DIF_HISTORY:0)/*|DIF_USELASTHISTORY*/,ReplaceStr.data()}, #endif {DI_TEXT,-1,6,0,6,0,nullptr,nullptr,DIF_SEPARATOR,L""}, {DI_CHECKBOX,5,7,0,7,Case,nullptr,nullptr,0,MSG(MEditSearchCase)}, {DI_CHECKBOX,5,8,0,8,WholeWords,nullptr,nullptr,0,MSG(MEditSearchWholeWords)}, {DI_CHECKBOX,5,9,0,9,Reverse,nullptr,nullptr,0,MSG(MEditSearchReverse)}, #if 1 //Maximus: поддержка "узких" дисплеев {DI_CHECKBOX,ElemX2,7,0,7,Regexp,nullptr,nullptr,0,MSG(MEditSearchRegexp)}, #else {DI_CHECKBOX,40,7,0,7,Regexp,nullptr,nullptr,0,MSG(MEditSearchRegexp)}, #endif {DI_CHECKBOX,40,8,0,8,PreserveStyle,nullptr,nullptr,0,MSG(MEditSearchPreserveStyle)}, {DI_TEXT,-1,10,0,10,0,nullptr,nullptr,DIF_SEPARATOR,L""}, {DI_BUTTON,0,11,0,11,0,nullptr,nullptr,DIF_DEFAULTBUTTON|DIF_CENTERGROUP,MSG(MEditReplaceReplace)}, {DI_BUTTON,0,11,0,11,0,nullptr,nullptr,DIF_CENTERGROUP,MSG(MEditSearchCancel)}, }; auto ReplaceDlg = MakeDialogItemsEx(ReplaceDlgData); if (!pCase) ReplaceDlg[6].Flags |= DIF_DISABLE; // DIF_HIDDEN ?? if (!pWholeWords) ReplaceDlg[7].Flags |= DIF_DISABLE; // DIF_HIDDEN ?? if (!pReverse) ReplaceDlg[8].Flags |= DIF_DISABLE; // DIF_HIDDEN ?? if (!pRegexp) ReplaceDlg[9].Flags |= DIF_DISABLE; // DIF_HIDDEN ?? if (!pPreserveStyle) ReplaceDlg[10].Flags |= DIF_DISABLE; // DIF_HIDDEN ?? auto Dlg = Dialog::create(ReplaceDlg); #if 1 //Maximus: поддержка "узких" дисплеев Dlg->SetPosition(-1,-1,BorderW+4,14); #else Dlg->SetPosition(-1,-1,76,14); #endif if (HelpTopic && *HelpTopic) Dlg->SetHelp(HelpTopic); if(Id) Dlg->SetId(*Id); Dlg->Process(); if(Dlg->GetExitCode() == 12) { Result = 1; SearchStr = ReplaceDlg[2].strData; ReplaceStr = ReplaceDlg[4].strData; Case=ReplaceDlg[6].Selected == BSTATE_CHECKED; WholeWords=ReplaceDlg[7].Selected == BSTATE_CHECKED; Reverse=ReplaceDlg[8].Selected == BSTATE_CHECKED; Regexp=ReplaceDlg[9].Selected == BSTATE_CHECKED; PreserveStyle=ReplaceDlg[10].Selected == BSTATE_CHECKED; } } else { /* 0 1 2 3 4 5 6 7 0123456789012345678901234567890123456789012345678901234567890123456789012345 00 01 +------------------------------ Search ------------------------------+ 02 | Search for | 03 | | 04 +--------------------------------------------------------------------+ 05 | [ ] Case sensitive [ ] Regular expressions | 06 | [ ] Whole words [ ] Reverse search | 07 +--------------------------------------------------------------------+ 08 | { Search } [ All ] [ Cancel ] | 09 +--------------------------------------------------------------------+ */ FarDialogItem SearchDlgData[]= { #if 1 //Maximus: поддержка "узких" дисплеев {DI_DOUBLEBOX,3,1,BorderW,9,0,nullptr,nullptr,0,Title}, #else {DI_DOUBLEBOX,3,1,72,9,0,nullptr,nullptr,0,Title}, #endif {DI_TEXT,5,2,0,2,0,nullptr,nullptr,0,SubTitle}, #if 1 //Maximus: поддержка "узких" дисплеев {DI_EDIT,5,3,ElemW,3,0,TextHistoryName,nullptr,DIF_FOCUS|DIF_USELASTHISTORY|(*TextHistoryName?DIF_HISTORY:0),SearchStr.data()}, #else {DI_EDIT,5,3,70,3,0,TextHistoryName,nullptr,DIF_FOCUS|DIF_USELASTHISTORY|(*TextHistoryName?DIF_HISTORY:0),SearchStr.data()}, #endif {DI_TEXT,-1,4,0,4,0,nullptr,nullptr,DIF_SEPARATOR,L""}, {DI_CHECKBOX,5,5,0,5,Case,nullptr,nullptr,0,MSG(MEditSearchCase)}, {DI_CHECKBOX,5,6,0,6,WholeWords,nullptr,nullptr,0,MSG(MEditSearchWholeWords)}, #if 1 //Maximus: поддержка "узких" дисплеев {DI_CHECKBOX,ElemX2,5,0,5,Regexp,nullptr,nullptr,0,MSG(MEditSearchRegexp)}, {DI_CHECKBOX,ElemX2,6,0,6,Reverse,nullptr,nullptr,0,MSG(MEditSearchReverse)}, #else {DI_CHECKBOX,40,5,0,5,Regexp,nullptr,nullptr,0,MSG(MEditSearchRegexp)}, {DI_CHECKBOX,40,6,0,6,Reverse,nullptr,nullptr,0,MSG(MEditSearchReverse)}, #endif {DI_TEXT,-1,7,0,7,0,nullptr,nullptr,DIF_SEPARATOR,L""}, {DI_BUTTON,0,8,0,8,0,nullptr,nullptr,DIF_DEFAULTBUTTON|DIF_CENTERGROUP,MSG(MEditSearchSearch)}, {DI_BUTTON,0,8,0,8,0,nullptr,nullptr,DIF_CENTERGROUP,MSG(MEditSearchAll)}, {DI_BUTTON,0,8,0,8,0,nullptr,nullptr,DIF_CENTERGROUP,MSG(MEditSearchCancel)}, }; auto SearchDlg = MakeDialogItemsEx(SearchDlgData); if (!pCase) SearchDlg[4].Flags |= DIF_DISABLE; // DIF_HIDDEN ?? if (!pWholeWords) SearchDlg[5].Flags |= DIF_DISABLE; // DIF_HIDDEN ?? if (!pRegexp) SearchDlg[6].Flags |= DIF_DISABLE; // DIF_HIDDEN ?? if (!pReverse) SearchDlg[7].Flags |= DIF_DISABLE; // DIF_HIDDEN ?? if (HideAll) SearchDlg[10].Flags |= DIF_HIDDEN; auto Dlg = Dialog::create(SearchDlg); #if 1 //Maximus: поддержка "узких" дисплеев Dlg->SetPosition(-1,-1,BorderW+4,11); #else Dlg->SetPosition(-1,-1,76,11); #endif if (HelpTopic && *HelpTopic) Dlg->SetHelp(HelpTopic); if(Id) Dlg->SetId(*Id); Dlg->Process(); int ExitCode = Dlg->GetExitCode(); if (ExitCode == 9 || ExitCode == 10) { Result = ExitCode == 9? 1 : 2; SearchStr = SearchDlg[2].strData; ReplaceStr.clear(); Case=SearchDlg[4].Selected == BSTATE_CHECKED; WholeWords=SearchDlg[5].Selected == BSTATE_CHECKED; Regexp=SearchDlg[6].Selected == BSTATE_CHECKED; Reverse=SearchDlg[7].Selected == BSTATE_CHECKED; } } if (pCase) *pCase=Case; if (pWholeWords) *pWholeWords=WholeWords; if (pReverse) *pReverse=Reverse; if (pRegexp) *pRegexp=Regexp; if (pPreserveStyle) *pPreserveStyle=PreserveStyle; return Result; }
int GetString( const wchar_t *Title, const wchar_t *Prompt, const wchar_t *HistoryName, const wchar_t *SrcText, string &strDestText, const wchar_t *HelpTopic, DWORD Flags, int *CheckBoxValue, const wchar_t *CheckBoxText, Plugin* PluginNumber, const GUID* Id ) { int Substract=5; // дополнительная величина :-) int ExitCode; bool addCheckBox=Flags&FIB_CHECKBOX && CheckBoxValue && CheckBoxText; int offset=addCheckBox?2:0; FarDialogItem StrDlgData[]= { {DI_DOUBLEBOX, 3, 1, 72, 4, 0, nullptr, nullptr, 0, L""}, {DI_TEXT, 5, 2, 0, 2, 0, nullptr, nullptr, DIF_SHOWAMPERSAND, L""}, {DI_EDIT, 5, 3, 70, 3, 0, nullptr, nullptr, DIF_FOCUS|DIF_DEFAULTBUTTON, L""}, {DI_TEXT, -1, 4, 0, 4, 0, nullptr, nullptr, DIF_SEPARATOR, L""}, {DI_CHECKBOX, 5, 5, 0, 5, 0, nullptr, nullptr, 0, L""}, {DI_TEXT, -1, 6, 0, 6, 0, nullptr, nullptr, DIF_SEPARATOR, L""}, {DI_BUTTON, 0, 7, 0, 7, 0, nullptr, nullptr, DIF_CENTERGROUP, L""}, {DI_BUTTON, 0, 7, 0, 7, 0, nullptr, nullptr, DIF_CENTERGROUP, L""}, }; auto StrDlg = MakeDialogItemsEx(StrDlgData); if (addCheckBox) { Substract-=2; StrDlg[0].Y2+=2; StrDlg[4].Selected = *CheckBoxValue != 0; StrDlg[4].strData = CheckBoxText; } if (Flags&FIB_BUTTONS) { Substract-=3; StrDlg[0].Y2+=2; StrDlg[2].Flags&=~DIF_DEFAULTBUTTON; StrDlg[5+offset].Y1=StrDlg[4+offset].Y1=5+offset; StrDlg[4+offset].Type=StrDlg[5+offset].Type=DI_BUTTON; StrDlg[4+offset].Flags=StrDlg[5+offset].Flags=DIF_CENTERGROUP; StrDlg[4+offset].Flags|=DIF_DEFAULTBUTTON; StrDlg[4+offset].strData = MSG(MOk); StrDlg[5+offset].strData = MSG(MCancel); } if (Flags&FIB_EXPANDENV) { StrDlg[2].Flags|=DIF_EDITEXPAND; } if (Flags&FIB_EDITPATH) { StrDlg[2].Flags|=DIF_EDITPATH; } if (Flags&FIB_EDITPATHEXEC) { StrDlg[2].Flags|=DIF_EDITPATHEXEC; } if (HistoryName) { StrDlg[2].strHistory=HistoryName; StrDlg[2].Flags|=DIF_HISTORY|(Flags&FIB_NOUSELASTHISTORY?0:DIF_USELASTHISTORY); } if (Flags&FIB_PASSWORD) StrDlg[2].Type=DI_PSWEDIT; if (Title) StrDlg[0].strData = Title; if (Prompt) { StrDlg[1].strData = Prompt; TruncStrFromEnd(StrDlg[1].strData, 66); if (Flags&FIB_NOAMPERSAND) StrDlg[1].Flags&=~DIF_SHOWAMPERSAND; } if (SrcText) StrDlg[2].strData = SrcText; { auto Dlg = Dialog::create(make_range(StrDlg.data(), StrDlg.data() + StrDlg.size() - Substract)); Dlg->SetPosition(-1,-1,76,offset+((Flags&FIB_BUTTONS)?8:6)); if(Id) Dlg->SetId(*Id); if (HelpTopic) Dlg->SetHelp(HelpTopic); Dlg->SetPluginOwner(PluginNumber); Dlg->Process(); ExitCode=Dlg->GetExitCode(); if (ExitCode == -2 && Global->CtrlObject->Macro.IsExecuting() != MACROSTATE_NOMACRO) Global->CtrlObject->Macro.SendDropProcess(); } if (ExitCode == 2 || ExitCode == 4 || (addCheckBox && ExitCode == 6)) { if (!(Flags&FIB_ENABLEEMPTY) && StrDlg[2].strData.empty()) return FALSE; strDestText = StrDlg[2].strData; if (addCheckBox) *CheckBoxValue=StrDlg[4].Selected; return TRUE; } return FALSE; }
void ShellMakeDir(Panel *SrcPanel) { FarList ComboList={sizeof(FarList)}; FarListItem LinkTypeItems[3]={}; ComboList.ItemsNumber=ARRAYSIZE(LinkTypeItems); ComboList.Items=LinkTypeItems; ComboList.Items[0].Text=MSG(MMakeFolderLinkNone); ComboList.Items[1].Text=MSG(MMakeFolderLinkJunction); ComboList.Items[2].Text=MSG(MMakeFolderLinkSymlink); ComboList.Items[0].Flags|=LIF_SELECTED; FarDialogItem MkDirDlgData[]= { {DI_DOUBLEBOX,3,1,72,10,0,nullptr,nullptr,0,MSG(MMakeFolderTitle)}, {DI_TEXT, 5,2, 0,2,0,nullptr,nullptr,0,MSG(MCreateFolder)}, {DI_EDIT, 5,3,70,3,0,L"NewFolder",nullptr,DIF_FOCUS|DIF_EDITEXPAND|DIF_HISTORY|DIF_USELASTHISTORY|DIF_EDITPATH,L""}, {DI_TEXT, 0,4, 0,4,0,nullptr,nullptr,DIF_SEPARATOR,L""}, {DI_TEXT, 5,5, 0,5,0,nullptr,nullptr,0,MSG(MMakeFolderLinkType)}, {DI_COMBOBOX,20,5,70,5,0,nullptr,nullptr,DIF_DROPDOWNLIST|DIF_LISTNOAMPERSAND|DIF_LISTWRAPMODE,L""}, {DI_TEXT, 5,6, 0,6,0,nullptr,nullptr,0,MSG(MMakeFolderLinkTarget)}, {DI_EDIT, 20,6,70,6,0,L"NewFolderLinkTarget",nullptr,DIF_DISABLE|DIF_EDITEXPAND|DIF_HISTORY|DIF_USELASTHISTORY|DIF_EDITPATH,L""}, {DI_CHECKBOX, 5,7, 0,7,Opt.MultiMakeDir,nullptr,nullptr,0,MSG(MMultiMakeDir)}, {DI_TEXT, 0,8, 0,8,0,nullptr,nullptr,DIF_SEPARATOR,L""}, {DI_BUTTON, 0,9, 0,9,0,nullptr,nullptr,DIF_DEFAULTBUTTON|DIF_CENTERGROUP,MSG(MOk)}, {DI_BUTTON, 0,9, 0,9,0,nullptr,nullptr,DIF_CENTERGROUP,MSG(MCancel)}, }; MakeDialogItemsEx(MkDirDlgData,MkDirDlg); MkDirDlg[MKDIR_COMBOBOX_LINKTYPE].ListItems=&ComboList; UserDefinedList DirList(ULF_UNIQUE); Dialog Dlg(MkDirDlg,ARRAYSIZE(MkDirDlg),MkDirDlgProc,&DirList); Dlg.SetPosition(-1,-1,76,12); Dlg.SetHelp(L"MakeFolder"); Dlg.SetId(MakeFolderId); Dlg.Process(); if (Dlg.GetExitCode()==MKDIR_OK) { string strDirName=MkDirDlg[MKDIR_EDIT].strData; string strOriginalDirName; const wchar_t *OneDir; DirList.Reset(); bool SkipAll = false; while (nullptr!=(OneDir=DirList.GetNext())) { strDirName = OneDir; strOriginalDirName = strDirName; //Unquote(DirName); if (Opt.CreateUppercaseFolders && !IsCaseMixed(strDirName)) strDirName.Upper(); DeleteEndSlash(strDirName,true); wchar_t* lpwszDirName = strDirName.GetBuffer(); bool bSuccess = false; wchar_t *ChPtr; if(ParsePath(lpwszDirName, const_cast<const wchar_t **>(&ChPtr)) == PATH_UNKNOWN) { ChPtr = lpwszDirName; } for (; ; ChPtr++) { if (IsSlash(*ChPtr) || !*ChPtr) { WCHAR Ch=0; if(*ChPtr) { Ch = ChPtr[1]; ChPtr[1] = 0; } if (*lpwszDirName) { string _strDirName(lpwszDirName); if (apiGetFileAttributes(_strDirName) == INVALID_FILE_ATTRIBUTES || !*ChPtr) // skip all intermediate dirs, but not last. { while(!(bSuccess=(apiCreateDirectory(_strDirName, nullptr)!=FALSE)) && !SkipAll) { int Ret = OperationFailed(strOriginalDirName, MError, MSG(MCannotCreateFolder)); if(Ret == 1) // skip { break; } else if(Ret == 2) { SkipAll = true; break; } else if (Ret < 0 || Ret == 3) // cancel { return; } } if(bSuccess) { TreeList::AddTreeName(_strDirName); } } } if(*ChPtr) { ChPtr[1] = Ch; } else { break; } } } strDirName.ReleaseBuffer(); if (bSuccess) { if(MkDirDlg[MKDIR_COMBOBOX_LINKTYPE].ListPos) { string strTarget=MkDirDlg[MKDIR_EDIT_LINKPATH].strData; Unquote(strTarget); while(!CreateReparsePoint(strTarget, strDirName, MkDirDlg[MKDIR_COMBOBOX_LINKTYPE].ListPos==1?RP_JUNCTION:RP_SYMLINKDIR) && !SkipAll) { int Ret = OperationFailed(strDirName, MError, MSG(MCopyCannotCreateLink)); if(Ret == 1) // skip { break; } else if(Ret == 2) { SkipAll = true; break; } else if (Ret < 0 || Ret == 3) // cancel { return; } } } TreeList::AddTreeName(strDirName); } } SrcPanel->Update(UPDATE_KEEP_SELECTION); if (!strDirName.IsEmpty()) { size_t pos; if (FindSlash(pos,strDirName)) strDirName.SetLength(pos); if (!SrcPanel->GoToFile(strDirName) && strDirName.At(strDirName.GetLength()-1)==L'.') { strDirName.SetLength(strDirName.GetLength()-1); SrcPanel->GoToFile(strDirName); } } SrcPanel->Redraw(); Panel *AnotherPanel=CtrlObject->Cp()->GetAnotherPanel(SrcPanel); int AnotherType=AnotherPanel->GetType(); if (AnotherPanel->NeedUpdatePanel(SrcPanel) || AnotherType==QVIEW_PANEL) { AnotherPanel->Update(UPDATE_KEEP_SELECTION|UPDATE_SECONDARY); AnotherPanel->Redraw(); } } }