static bool SelectLanguage(bool HelpLanguage) { const wchar_t *Title,*Mask; StringOption *strDest; if (HelpLanguage) { Title=MSG(MHelpLangTitle); Mask=Global->HelpFileMask; strDest=&Global->Opt->strHelpLanguage; } else { Title=MSG(MLangTitle); Mask=LangFileMask; strDest=&Global->Opt->strLanguage; } VMenu2 LangMenu(Title,nullptr,0,ScrY-4); LangMenu.SetFlags(VMENU_WRAPMODE); LangMenu.SetPosition(ScrX/2-8+5*HelpLanguage,ScrY/2-4+2*HelpLanguage,0,0); string strFullName; api::FAR_FIND_DATA FindData; ScanTree ScTree(false, false); ScTree.SetFindPath(Global->g_strFarPath, Mask); while (ScTree.GetNextName(&FindData,strFullName)) { api::File LangFile; if (!LangFile.Open(strFullName, FILE_READ_DATA, FILE_SHARE_READ, nullptr, OPEN_EXISTING)) continue; uintptr_t nCodePage=CP_OEMCP; GetFileFormat(LangFile, nCodePage, nullptr, false); string strLangName, strLangDescr; if (GetLangParam(LangFile,L"Language",&strLangName,&strLangDescr,nCodePage)) { string strEntryName; if (!HelpLanguage || (!GetLangParam(LangFile,L"PluginContents",&strEntryName,nullptr,nCodePage) && !GetLangParam(LangFile,L"DocumentContents",&strEntryName,nullptr,nCodePage))) { MenuItemEx LangMenuItem(str_printf(L"%.40s", !strLangDescr.empty() ? strLangDescr.data():strLangName.data())); /* $ 01.08.2001 SVS Не допускаем дубликатов! Если в каталог с ФАРом положить еще один HLF с одноименным языком, то... фигня получается при выборе языка. */ if (LangMenu.FindItem(0,LangMenuItem.strName,LIFIND_EXACTMATCH) == -1) { LangMenuItem.SetSelect(!StrCmpI(*strDest, strLangName)); LangMenu.SetUserData(strLangName.data(), (strLangName.size()+1)*sizeof(wchar_t), LangMenu.AddItem(LangMenuItem)); } } } } LangMenu.AssignHighlights(FALSE); LangMenu.Run(); if (LangMenu.GetExitCode()<0) return false; *strDest = static_cast<const wchar_t*>(LangMenu.GetUserData(nullptr, 0)); return true; }
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; }