// Каллбак для диалога редактирования имени кодовой страницы 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); }
// Добавляем таблицу символов void AddCodePage(const wchar_t *codePageName, UINT codePage, int position, bool enabled, bool checked, bool IsCodePageNameCustom) { if (CallbackCallSource == CodePagesFill) { // Вычисляем позицию вставляемого элемента if (position==-1) { FarListInfo info; SendDlgMessage(dialog, DM_LISTINFO, control, (LONG_PTR)&info); position = info.ItemsNumber; } // Вставляем элемент FarListInsert item = {position, {}}; FormatString name; FormatCodePageString(codePage, codePageName, name, IsCodePageNameCustom); item.Item.Text = name; if (selectedCodePages && checked) { item.Item.Flags |= MIF_CHECKED; } if (!enabled) { item.Item.Flags |= MIF_GRAYED; } SendDlgMessage(dialog, DM_LISTINSERT, control, (LONG_PTR)&item); // Устанавливаем данные для элемента FarListItemData data; data.Index = position; data.Data = (void*)(DWORD_PTR)codePage; data.DataSize = sizeof(UINT); SendDlgMessage(dialog, DM_LISTSETDATA, control, (LONG_PTR)&data); } else { // Создаём новый элемент меню MenuItemEx item; item.Clear(); if (!enabled) item.Flags |= MIF_GRAYED; FormatString name; FormatCodePageString(codePage, codePageName, name, IsCodePageNameCustom); item.strName = name; item.UserData = (char *)(UINT_PTR)codePage; item.UserDataSize = sizeof(UINT); // Добавляем новый элемент в меню if (position>=0) CodePages->AddItem(&item, position); else CodePages->AddItem(&item); // Если надо позиционируем курсор на добавленный элемент if (currentCodePage==codePage) { if ((CodePages->GetSelectPos()==-1 || GetMenuItemCodePage()!=codePage)) { CodePages->SetSelectPos(position>=0?position:CodePages->GetItemCount()-1, 1); } } } }