inline static bool IsValid(UINT cp) { if (cp==CP_ACP || cp==CP_OEMCP || cp==CP_MACCP || cp==CP_THREAD_ACP || cp==CP_SYMBOL) return false; if (cp==CP_UTF8 || cp==CP_UNICODE || cp==CP_REVERSEBOM) return false; return GetCodePageInfo(cp).first == 2; }
bool IsCodePageSupported(UINT CodePage) { // Для стандартных кодовых страниц ничего проверять не надо // BUGBUG: мы не везде поддержиаем все стандартные кодовые страницы. Это не проверяется if (CodePage == CP_AUTODETECT || IsStandardCodePage(CodePage)) return true; CPINFOEX cpiex; return GetCodePageInfo(CodePage, cpiex); }
// Каллбак для диалога редактирования имени кодовой страницы intptr_t WINAPI EditDialogProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, void* Param2) { if (Msg==DN_CLOSE) { if (Param1==EDITCP_OK || Param1==EDITCP_RESET) { string strCodePageName; uintptr_t CodePage = GetMenuItemCodePage(); FormatString strCodePage; strCodePage<<CodePage; if (Param1==EDITCP_OK) { FarDialogItemData item = {sizeof(FarDialogItemData)}; item.PtrLength = SendDlgMessage(hDlg, DM_GETTEXT, EDITCP_EDIT, 0); item.PtrData = strCodePageName.GetBuffer(item.PtrLength+1); SendDlgMessage(hDlg, DM_GETTEXT, EDITCP_EDIT, &item); strCodePageName.ReleaseBuffer(); } // Если имя кодовой страницы пустое, то считаем, что имя не задано if (!strCodePageName.GetLength()) GeneralCfg->DeleteValue(NamesOfCodePagesKey, strCodePage); else GeneralCfg->SetValue(NamesOfCodePagesKey, strCodePage, strCodePageName); // Получаем информацию о кодовой странице CPINFOEX cpiex; if (GetCodePageInfo(CodePage, cpiex)) { // Формируем имя таблиц символов bool IsCodePageNameCustom = false; wchar_t *CodePageName = FormatCodePageName(CodePage, cpiex.CodePageName, sizeof(cpiex.CodePageName)/sizeof(wchar_t), IsCodePageNameCustom); // Формируем строку представления strCodePage.Clear(); FormatCodePageString(CodePage, CodePageName, strCodePage, IsCodePageNameCustom); // Обновляем имя кодовой страницы int Position = CodePages->GetSelectPos(); CodePages->DeleteItem(Position); MenuItemEx NewItem; NewItem.Clear(); NewItem.strName = strCodePage; NewItem.UserData = &CodePage; NewItem.UserDataSize = sizeof(CodePage); CodePages->AddItem(&NewItem, Position); CodePages->SetSelectPos(Position, 1); } } } return DefDlgProc(hDlg, Msg, Param1, Param2); }
// Каллбак для диалога редактирования имени кодовой страницы LONG_PTR WINAPI EditDialogProc(HANDLE hDlg, int Msg, int Param1, LONG_PTR Param2) { if (Msg==DN_CLOSE) { if (Param1==EDITCP_OK || Param1==EDITCP_RESET) { FARString strCodePageName; UINT CodePage = GetMenuItemCodePage(); FormatString strCodePage; strCodePage<<CodePage; if (Param1==EDITCP_OK) { wchar_t *CodePageName = strCodePageName.GetBuffer(SendDlgMessage(hDlg, DM_GETTEXTPTR, EDITCP_EDIT, 0)+1); SendDlgMessage(hDlg, DM_GETTEXTPTR, EDITCP_EDIT, (LONG_PTR)CodePageName); strCodePageName.ReleaseBuffer(); } // Если имя кодовой страницы пустое, то считаем, что имя не задано if (!strCodePageName.GetLength()) DeleteRegValue(NamesOfCodePagesKey, strCodePage); else SetRegKey(NamesOfCodePagesKey, strCodePage, strCodePageName); // Получаем информацию о кодовой странице CPINFOEX cpiex; if (GetCodePageInfo(CodePage, cpiex)) { // Формируем имя таблиц символов bool IsCodePageNameCustom = false; wchar_t *CodePageName = FormatCodePageName(CodePage, cpiex.CodePageName, sizeof(cpiex.CodePageName)/sizeof(wchar_t), IsCodePageNameCustom); // Формируем строку представления strCodePage.Clear(); FormatCodePageString(CodePage, CodePageName, strCodePage, IsCodePageNameCustom); // Обновляем имя кодовой страницы int Position = CodePages->GetSelectPos(); CodePages->DeleteItem(Position); MenuItemEx NewItem; NewItem.Clear(); NewItem.strName = strCodePage; NewItem.UserData = (char *)(UINT_PTR)CodePage; NewItem.UserDataSize = sizeof(UINT); CodePages->AddItem(&NewItem, Position); CodePages->SetSelectPos(Position, 1); } } } return DefDlgProc(hDlg, Msg, Param1, Param2); }
// Callback-функция получения таблиц символов BOOL __stdcall EnumCodePagesProc(const wchar_t *lpwszCodePage) { UINT codePage = _wtoi(lpwszCodePage); // Получаем информацию о кодовой странице. Если информацию по какой-либо причине получить не удалось, то // для списков продолжаем енумерацию, а для процедуры же проверки поддерживаемости кодовой страницы выходим CPINFOEX cpiex; if (!GetCodePageInfo(codePage, cpiex)) { return CallbackCallSource == CodePageCheck ? FALSE : TRUE; } if (IsStandardCodePage(codePage)) { return TRUE; // continue } // Формируем имя таблиц символов bool IsCodePageNameCustom = false; wchar_t *codePageName = FormatCodePageName(_wtoi(lpwszCodePage), cpiex.CodePageName, sizeof(cpiex.CodePageName)/sizeof(wchar_t), IsCodePageNameCustom); // Получаем признак выбранности таблицы символов int selectType = 0; GetRegKey(FavoriteCodePagesKey, lpwszCodePage, selectType, 0); // Добавляем таблицу символов либо в нормальные, либо в выбранные таблицы симовлов if (selectType & CPST_FAVORITE) { // Если надо добавляем разделитель между выбранными и нормальными таблицами симовлов if (!favoriteCodePages) AddSeparator(MSG(MGetCodePageFavorites),GetItemsCount()-normalCodePages-(normalCodePages?1:0)); // Добавляем таблицу символов в выбранные AddCodePage( codePageName, codePage, GetCodePageInsertPosition( codePage, GetItemsCount()-normalCodePages-favoriteCodePages-(normalCodePages?1:0), favoriteCodePages ), true, selectType & CPST_FIND ? true : false, IsCodePageNameCustom ); // Увеличиваем счётчик выбранных таблиц символов favoriteCodePages++; } else if (CallbackCallSource == CodePagesFill || Opt.CPMenuMode) { // добавляем разделитель между стандартными и системными таблицами символов if (!favoriteCodePages && !normalCodePages) AddSeparator(MSG(MGetCodePageOther)); // Добавляем таблицу символов в нормальные AddCodePage( codePageName, codePage, GetCodePageInsertPosition( codePage, GetItemsCount()-normalCodePages, normalCodePages ), true, false, IsCodePageNameCustom ); // Увеличиваем счётчик выбранных таблиц символов normalCodePages++; } return TRUE; }
// Callback-функция получения таблиц символов BOOL WINAPI EnumCodePagesProc(const wchar_t *lpwszCodePage) { uintptr_t codePage = _wtoi(lpwszCodePage); // Для функции проверки нас не интересует информация о кодовых страницах отличных от проверяемой if (CallbackCallSource == CodePageCheck && codePage != currentCodePage) return TRUE; // Получаем информацию о кодовой странице. Если информацию по какой-либо причине получить не удалось, то // для списков прожолжаем енумерацию, а для процедуры же проверки поддерживаемости кодовой страницы выходим CPINFOEX cpiex; if (!GetCodePageInfo(codePage, cpiex)) return CallbackCallSource == CodePageCheck ? FALSE : TRUE; // Для функции проверки поддерживаемости кодовой страницы мы прошли все проверки и можем выходить if (CallbackCallSource == CodePageCheck) { CodePageSupported = true; return FALSE; } // Формируем имя таблиц символов bool IsCodePageNameCustom = false; wchar_t *codePageName = FormatCodePageName(_wtoi(lpwszCodePage), cpiex.CodePageName, sizeof(cpiex.CodePageName)/sizeof(wchar_t), IsCodePageNameCustom); // Получаем признак выбранности таблицы символов int selectType = 0; GeneralCfg->GetValue(FavoriteCodePagesKey, lpwszCodePage, &selectType, 0); // Добавляем таблицу символов либо в нормальные, либо в выбранные таблицы симовлов if (selectType & CPST_FAVORITE) { // Если надо добавляем разделитель между выбранными и нормальными таблицами симовлов if (!favoriteCodePages) AddSeparator(MSG(MGetCodePageFavorites),GetItemsCount()-normalCodePages-(normalCodePages?1:0)); // Добавляем таблицу символов в выбранные AddCodePage( codePageName, codePage, GetCodePageInsertPosition( codePage, GetItemsCount()-normalCodePages-favoriteCodePages-(normalCodePages?1:0), favoriteCodePages ), true, selectType & CPST_FIND ? true : false, IsCodePageNameCustom ); // Увеличиваем счётчик выбранных таблиц символов favoriteCodePages++; } else if (CallbackCallSource == CodePagesFill || !Opt.CPMenuMode) { // добавляем разделитель между стандартными и системными таблицами символов if (!favoriteCodePages && !normalCodePages) AddSeparator(MSG(MGetCodePageOther)); // Добавляем таблицу символов в нормальные AddCodePage( codePageName, codePage, GetCodePageInsertPosition( codePage, GetItemsCount()-normalCodePages, normalCodePages ), true, false, IsCodePageNameCustom ); // Увеличиваем счётчик выбранных таблиц символов normalCodePages++; } return TRUE; }