void VMenu2::SetBoxType(int BoxType) { ShortBox=(BoxType==SHORT_SINGLE_BOX || BoxType==SHORT_DOUBLE_BOX || BoxType==NO_BOX); if(BoxType==NO_BOX) SetMenuFlags(VMENU_SHOWNOBOX); if(BoxType==SINGLE_BOX || BoxType==SHORT_SINGLE_BOX) SetMenuFlags(VMENU_LISTSINGLEBOX); Resize(); }
history_return_type History::Select(const wchar_t *Title, const wchar_t *HelpTopic, string &strStr, history_record_type &Type, GUID* Guid, string *File, string *Data) { int Height=ScrY-8; auto HistoryMenu = VMenu2::create(Title, nullptr, 0, Height); HistoryMenu->SetMenuFlags(VMENU_WRAPMODE); if (HelpTopic) HistoryMenu->SetHelp(HelpTopic); HistoryMenu->SetPosition(-1,-1,0,0); if (m_TypeHistory == HISTORYTYPE_CMD || m_TypeHistory == HISTORYTYPE_FOLDER || m_TypeHistory == HISTORYTYPE_VIEW) HistoryMenu->SetId(m_TypeHistory == HISTORYTYPE_CMD?HistoryCmdId:(m_TypeHistory == HISTORYTYPE_FOLDER?HistoryFolderId:HistoryEditViewId)); auto ret = ProcessMenu(strStr, Guid, File, Data, Title, *HistoryMenu, Height, Type, nullptr); Global->ScrBuf->Flush(); return ret; }
bool FileFilter::FilterEdit() { if (bMenuOpen) return false; Changed = true; bMenuOpen = true; int ExitCode; bool bNeedUpdate=false; const auto FilterList = VMenu2::create(MSG(MFilterTitle), nullptr, 0, ScrY - 6); FilterList->SetHelp(L"FiltersMenu"); FilterList->SetPosition(-1,-1,0,0); FilterList->SetBottomTitle(MSG(MFilterBottom)); FilterList->SetMenuFlags(/*VMENU_SHOWAMPERSAND|*/VMENU_WRAPMODE); FilterList->SetId(FiltersMenuId); std::for_each(RANGE(FilterData(), i) { MenuItemEx ListItem(MenuString(&i)); ListItem.SetCheck(GetCheck(i)); FilterList->AddItem(ListItem); });
void AssignHighlights(int Reverse) { SetMenuFlags(Reverse ? VMENU_REVERSEHIGHLIGHT | VMENU_AUTOHIGHLIGHT : VMENU_AUTOHIGHLIGHT); }
void ShowProcessList() { static bool Active = false; if (Active) return; Active = true; SCOPE_EXIT{ Active = false; }; const auto ProcList = VMenu2::create(msg(lng::MProcessListTitle), {}, ScrY - 4); ProcList->SetMenuFlags(VMENU_WRAPMODE); ProcList->SetPosition({ -1, -1, 0, 0 }); bool ShowImage = false; const auto FillProcList = [&] { ProcList->clear(); ProcInfo Info{ ProcList.get(), ShowImage }; if (!EnumWindows(EnumWindowsProc, reinterpret_cast<LPARAM>(&Info))) { rethrow_if(Info.ExceptionPtr); return false; } ProcList->SortItems([](const MenuItemEx& a, const MenuItemEx& b, SortItemParam&) { return string_sort::less(std::any_cast<const menu_data&>(a.ComplexUserData).Title, std::any_cast<const menu_data&>(b.ComplexUserData).Title); }); return true; }; if (!FillProcList()) return; ProcList->AssignHighlights(FALSE); ProcList->SetBottomTitle(msg(lng::MProcessListBottom)); ProcList->Run([&](const Manager::Key& RawKey) { const auto Key=RawKey(); int KeyProcessed = 1; switch (Key) { case KEY_F1: help::show(L"TaskList"sv); break; case KEY_NUMDEL: case KEY_DEL: { if (const auto MenuData = ProcList->GetComplexUserDataPtr<menu_data>()) { if (Message(MSG_WARNING, msg(lng::MKillProcessTitle), { msg(lng::MAskKillProcess), MenuData->Title, msg(lng::MKillProcessWarning) }, { lng::MKillProcessKill, lng::MCancel }) == Message::first_button) { const os::handle Process(OpenProcess(PROCESS_TERMINATE, FALSE, MenuData->Pid)); if (!Process || !TerminateProcess(Process.native_handle(), 0xFFFFFFFF)) { const auto ErrorState = error_state::fetch(); Message(MSG_WARNING, ErrorState, msg(lng::MKillProcessTitle), { msg(lng::MCannotKillProcess) }, { lng::MOk }); } } } } [[fallthrough]]; case KEY_CTRLR: case KEY_RCTRLR: { if (!FillProcList()) ProcList->Close(-1); break; } case KEY_F2: { // TODO: change titles, don't enumerate again ShowImage = !ShowImage; const auto SelectPos = ProcList->GetSelectPos(); if (!FillProcList()) { ProcList->Close(-1); } else { ProcList->SetSelectPos(SelectPos); } break; } default: KeyProcessed = 0; } return KeyProcessed; }); if (ProcList->GetExitCode() < 0) return; const auto MenuData = ProcList->GetComplexUserDataPtr<menu_data>(); if (!MenuData) return; SwitchToWindow(MenuData->Hwnd); }
void ShowProcessList() { static bool Active = false; if (Active) return; Active = true; auto ProcList = VMenu2::create(MSG(MProcessListTitle), nullptr, 0, ScrY - 4); ProcList->SetMenuFlags(VMENU_WRAPMODE); ProcList->SetPosition(-1,-1,0,0); static bool bShowImage = false; ProcInfo pi = {ProcList.get(), bShowImage}; if (EnumWindows(EnumWindowsProc,(LPARAM)&pi)) { ProcList->AssignHighlights(FALSE); ProcList->SetBottomTitle(MSG(MProcessListBottom)); ProcList->SortItems(TaskSort); ProcList->Run([&](const Manager::Key& RawKey)->int { const auto Key=RawKey.FarKey(); int KeyProcessed = 1; switch (Key) { case KEY_F1: { Help::create(L"TaskList"); break; } case KEY_NUMDEL: case KEY_DEL: { auto ProcWnd = *static_cast<HWND*>(ProcList->GetUserData(nullptr, 0)); if (ProcWnd) { wchar_t_ptr Title; int LenTitle=GetWindowTextLength(ProcWnd); if (LenTitle) { Title.reset(LenTitle + 1); if (Title && (LenTitle=GetWindowText(ProcWnd, Title.get(), LenTitle+1))) Title[LenTitle]=0; } DWORD ProcID; GetWindowThreadProcessId(ProcWnd,&ProcID); if (!Message(MSG_WARNING,2,MSG(MKillProcessTitle),MSG(MAskKillProcess), NullToEmpty(Title.get()),MSG(MKillProcessWarning),MSG(MKillProcessKill),MSG(MCancel))) { if (KillProcess(ProcID)) Sleep(500); else { Global->CatchError(); Message(MSG_WARNING|MSG_ERRORTYPE,1,MSG(MKillProcessTitle),MSG(MCannotKillProcess),MSG(MOk)); } } } } case KEY_CTRLR: case KEY_RCTRLR: { ProcList->DeleteItems(); if (!EnumWindows(EnumWindowsProc,(LPARAM)&pi)) ProcList->Close(-1); else ProcList->SortItems(TaskSort); break; } case KEY_F2: { pi.bShowImage=(bShowImage=!bShowImage); int SelectPos=ProcList->GetSelectPos(); ProcList->DeleteItems(); if (!EnumWindows(EnumWindowsProc,(LPARAM)&pi)) ProcList->Close(-1); else { ProcList->SortItems(TaskSort); ProcList->SetSelectPos(SelectPos); } break; } default: KeyProcessed = 0; } return KeyProcessed; }); if (ProcList->GetExitCode()>=0) { auto ProcWnd = *static_cast<HWND*>(ProcList->GetUserData(nullptr, 0)); if (ProcWnd) { //SetForegroundWindow(ProcWnd); // Allow SetForegroundWindow on Win98+. DWORD dwMs; // Remember the current value. BOOL bSPI = SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, &dwMs, 0); if (bSPI) // Reset foreground lock timeout bSPI = SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0, 0); SetForegroundWindow(ProcWnd); if (bSPI) // Restore old value SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, ToPtr(dwMs), 0); WINDOWPLACEMENT wp = { sizeof(wp) }; if (!GetWindowPlacement(ProcWnd,&wp) || wp.showCmd!=SW_SHOWMAXIMIZED) ShowWindowAsync(ProcWnd,SW_RESTORE); } } } Active = false; }
/* $ 06.07.2001 + Используем filemasks вместо GetCommaWord, этим самым добиваемся того, что можно использовать маски исключения - Убрал непонятный мне запрет на использование маски файлов типа "*.*" (был когда-то, вроде, такой баг-репорт) */ bool ProcessLocalFileTypes(const string& Name, const string& ShortName, FILETYPE_MODE Mode, bool AlwaysWaitFinish) { string strCommand, strDescription, strMask; { const auto TypesMenu = VMenu2::create(MSG(MSelectAssocTitle), nullptr, 0, ScrY - 4); TypesMenu->SetHelp(L"FileAssoc"); TypesMenu->SetMenuFlags(VMENU_WRAPMODE); TypesMenu->SetId(SelectAssocMenuId); int ActualCmdCount=0; // отображаемых ассоциаций в меню filemasks FMask; // для работы с масками файлов int CommandCount=0; DWORD Index=0; unsigned __int64 id; string FileName = PointToName(Name); while (ConfigProvider().AssocConfig()->EnumMasksForType(Mode,Index++,&id,strMask)) { strCommand.clear(); if (FMask.Set(strMask,FMF_SILENT)) { if (FMask.Compare(FileName)) { ConfigProvider().AssocConfig()->GetCommand(id,Mode,strCommand); if (!strCommand.empty()) { ConfigProvider().AssocConfig()->GetDescription(id,strDescription); CommandCount++; } } if (strCommand.empty()) continue; } string strCommandText = strCommand; SubstFileName(nullptr,strCommandText,Name, ShortName,nullptr,nullptr,nullptr,nullptr,TRUE); // все "подставлено", теперь проверим условия "if exist" if (!ExtractIfExistCommand(strCommandText)) continue; ActualCmdCount++; if (!strDescription.empty()) SubstFileName(nullptr,strDescription, Name, ShortName, nullptr, nullptr, nullptr, nullptr, TRUE); else strDescription = strCommandText; MenuItemEx TypesMenuItem(strDescription); TypesMenuItem.SetSelect(Index==1); TypesMenuItem.UserData = strCommand; TypesMenu->AddItem(TypesMenuItem); } if (!CommandCount) return false; if (!ActualCmdCount) return true; int ExitCode=0; if (ActualCmdCount>1) { ExitCode=TypesMenu->Run(); if (ExitCode<0) return true; } strCommand = *TypesMenu->GetUserDataPtr<string>(ExitCode); } string strListName, strAnotherListName, strShortListName, strAnotherShortListName; const string* ListNames[] = { &strListName, &strAnotherListName, &strShortListName, &strAnotherShortListName }; int PreserveLFN=SubstFileName(nullptr,strCommand, Name, ShortName, &strListName, &strAnotherListName, &strShortListName, &strAnotherShortListName); const auto ListFileUsed = !std::all_of(ALL_CONST_RANGE(ListNames), std::mem_fn(&string::empty)); // Снова все "подставлено", теперь проверим условия "if exist" if (ExtractIfExistCommand(strCommand)) { SCOPED_ACTION(PreserveLongName)(ShortName, PreserveLFN); RemoveExternalSpaces(strCommand); if (!strCommand.empty()) { Global->CtrlObject->CmdLine()->ExecString(strCommand,AlwaysWaitFinish, false, false, ListFileUsed, false, Mode == FILETYPE_VIEW || Mode == FILETYPE_ALTVIEW || Mode == FILETYPE_EDIT || Mode == FILETYPE_ALTEDIT); if (!(Global->Opt->ExcludeCmdHistory&EXCLUDECMDHISTORY_NOTFARASS) && !AlwaysWaitFinish) //AN { const auto curDir = Global->CtrlObject->CmdLine()->GetCurDir(); Global->CtrlObject->CmdHistory->AddToHistory(strCommand, HR_DEFAULT, nullptr, nullptr, curDir.data()); } } } std::for_each(CONST_RANGE(ListNames, i) { if (!i->empty()) os::DeleteFile(*i); });
static bool SelectLanguage(bool HelpLanguage, string& Dest) { lng Title; string_view Mask; if (HelpLanguage) { Title = lng::MHelpLangTitle; Mask=Global->HelpFileMask; } else { Title = lng::MLangTitle; Mask=LangFileMask; } const auto LangMenu = VMenu2::create(msg(Title), {}, ScrY - 4); LangMenu->SetMenuFlags(VMENU_WRAPMODE); LangMenu->SetPosition(ScrX/2-8+5*HelpLanguage,ScrY/2-4+2*HelpLanguage,0,0); for (const auto& FindData: os::fs::enum_files(path::join(Global->g_strFarPath, Mask))) { const os::fs::file LangFile(path::join(Global->g_strFarPath, FindData.FileName), FILE_READ_DATA, FILE_SHARE_READ, nullptr, OPEN_EXISTING); if (!LangFile) continue; const auto Codepage = GetFileCodepage(LangFile, encoding::codepage::oem(), nullptr, false); string strLangName, strLangDescr; if (GetLangParam(LangFile, L"Language"sv, strLangName, &strLangDescr, Codepage)) { string strEntryName; if (!HelpLanguage || ( !GetLangParam(LangFile, L"PluginContents"sv, strEntryName, nullptr, Codepage) && !GetLangParam(LangFile, L"DocumentContents"sv, strEntryName, nullptr, Codepage))) { MenuItemEx LangMenuItem(!strLangDescr.empty()? strLangDescr : strLangName); /* $ 01.08.2001 SVS Не допускаем дубликатов! Если в каталог с ФАРом положить еще один HLF с одноименным языком, то... фигня получается при выборе языка. */ if (LangMenu->FindItem(0,LangMenuItem.Name,LIFIND_EXACTMATCH) == -1) { LangMenuItem.SetSelect(equal_icase(Dest, strLangName)); LangMenuItem.ComplexUserData = strLangName; LangMenu->AddItem(LangMenuItem); } } } } LangMenu->AssignHighlights(FALSE); LangMenu->Run(); if (LangMenu->GetExitCode()<0) return false; Dest = *LangMenu->GetComplexUserDataPtr<string>(); return true; }