// 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; }
// Обработка добавления/удаления в/из список выбранных таблиц символов void ProcessSelected(bool select) { if (Opt.CPMenuMode && select) return; UINT itemPosition = CodePages->GetSelectPos(); UINT codePage = GetMenuItemCodePage(); if ((select && IsPositionFavorite(itemPosition)) || (!select && IsPositionNormal(itemPosition))) { // Преобразуем номер таблицы символов в строку FormatString strCPName; strCPName<<codePage; // Получаем текущее состояние флага в реестре int selectType = 0; GetRegKey(FavoriteCodePagesKey, strCPName, selectType, 0); // Удаляем/добавляем в ресестре информацию о выбранной кодовой странице if (select) SetRegKey(FavoriteCodePagesKey, strCPName, CPST_FAVORITE | (selectType & CPST_FIND ? CPST_FIND : 0)); else if (selectType & CPST_FIND) SetRegKey(FavoriteCodePagesKey, strCPName, CPST_FIND); else DeleteRegValue(FavoriteCodePagesKey, strCPName); // Создаём новый элемент меню MenuItemEx newItem; newItem.Clear(); newItem.strName = CodePages->GetItemPtr()->strName; newItem.UserData = (char *)(UINT_PTR)codePage; newItem.UserDataSize = sizeof(UINT); // Сохраняем позицию курсора int position=CodePages->GetSelectPos(); // Удаляем старый пункт меню CodePages->DeleteItem(CodePages->GetSelectPos()); // Добавляем пункт меню в новое место if (select) { // Добавляем разделитель, если выбранных кодовых страниц ещё не было // и после добавления останутся нормальные кодовые страницы if (!favoriteCodePages && normalCodePages>1) AddSeparator(MSG(MGetCodePageFavorites),CodePages->GetItemCount()-normalCodePages); // Ищем позицию, куда добавить элемент int newPosition = GetCodePageInsertPosition( codePage, CodePages->GetItemCount()-normalCodePages-favoriteCodePages, favoriteCodePages ); // Добавляем кодовою страницу в выбранные CodePages->AddItem(&newItem, newPosition); // Удаляем разделитель, если нет обыкновынных кодовых страниц if (normalCodePages==1) CodePages->DeleteItem(CodePages->GetItemCount()-1); // Изменяем счётчики нормальных и выбранных кодовых страниц favoriteCodePages++; normalCodePages--; position++; } else { // Удаляем разделитеь, если после удаления не останнется ни одной // выбранной таблицы символов if (favoriteCodePages==1 && normalCodePages>0) CodePages->DeleteItem(CodePages->GetItemCount()-normalCodePages-2); // Переносим элемент в нормальные таблицы, только если они показываются if (!Opt.CPMenuMode) { // Добавляем разделитель, если не было ни одной нормальной кодовой страницы if (!normalCodePages) AddSeparator(MSG(MGetCodePageOther)); // Добавляем кодовою страницу в нормальные CodePages->AddItem( &newItem, GetCodePageInsertPosition( codePage, CodePages->GetItemCount()-normalCodePages, normalCodePages ) ); normalCodePages++; } // Если в режиме скрытия нормальных таблиц мы удалили последнюю выбранную таблицу, то удаляем и разделитель else if (favoriteCodePages==1) CodePages->DeleteItem(CodePages->GetItemCount()-normalCodePages-1); favoriteCodePages--; if (position==CodePages->GetItemCount()-normalCodePages-1) position--; } // Устанавливаем позицию в меню CodePages->SetSelectPos(position>=CodePages->GetItemCount() ? CodePages->GetItemCount()-1 : position, 1); // Показываем меню if (Opt.CPMenuMode) CodePages->SetPosition(-1, -1, 0, 0); CodePages->Show(); } }
// 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; }