void CharMap::SplitCodePage(wxUint32 splitCodeFirst) { CodePage *page = GetCodePage(splitCodeFirst); if (page == NULL || page->GetRangeStart() == splitCodeFirst) { return; } CodePage oldPage(*page); CodePage newPage(*page, splitCodeFirst, page->GetRangeEnd()); RemoveCodePage(page); // Todo: delete only present glyphs for (wxUint32 i = splitCodeFirst; i <= oldPage.GetRangeEnd(); i++) { oldPage.Remove(i); } oldPage.SetEnd(splitCodeFirst - 1); AddCodePage(oldPage); AddCodePage(newPage); }
// Добавляем стандартную таблицу символов void AddStandardCodePage(const wchar_t *codePageName, uintptr_t codePage, int position = -1, bool enabled = true) { bool checked = false; if (selectedCodePages && codePage!=CP_DEFAULT) { int selectType = 0; GeneralCfg->GetValue(FavoriteCodePagesKey, FormatString() << codePage, &selectType, 0); if (selectType & CPST_FIND) checked = true; } AddCodePage(codePageName, codePage, position, enabled, checked, false); }
// Добавляем стандартную таблицу символов void AddStandardCodePage(const wchar_t *codePageName, UINT codePage, int position = -1, bool enabled = true) { bool checked = false; if (selectedCodePages && codePage!=CP_AUTODETECT) { FormatString strCodePageName; strCodePageName<<codePage; int selectType = 0; GetRegKey(FavoriteCodePagesKey, strCodePageName, selectType, 0); if (selectType & CPST_FIND) checked = true; } AddCodePage(codePageName, codePage, position, enabled, checked, false); }
// 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; }