// Заполняем список таблицами символов UINT FillCodePagesList(HANDLE dialogHandle, UINT controlId, UINT codePage, bool allowAuto, bool allowAll) { CallbackCallSource = CodePagesFill; // Устанавливаем переменные для доступа из каллбака dialog = dialogHandle; control = controlId; currentCodePage = codePage; favoriteCodePages = normalCodePages = 0; selectedCodePages = !allowAuto && allowAll; // Добавляем стндартные элементы в список AddCodePages((allowAuto ? ::Auto : 0) | (allowAll ? ::SearchAll : 0) | ::AllStandard); if (CallbackCallSource == CodePagesFill) { // Если надо выбираем элемент FarListInfo info; SendDlgMessage(dialogHandle, DM_LISTINFO, control, (LONG_PTR)&info); for (int i=0; i<info.ItemsNumber; i++) { if (GetListItemCodePage(i)==codePage) { FarListGetItem Item={i, {}}; SendDlgMessage(dialog, DM_LISTGETITEM, control, reinterpret_cast<LONG_PTR>(&Item)); SendDlgMessage(dialog, DM_SETTEXTPTR, control, reinterpret_cast<LONG_PTR>(Item.Item.Text)); FarListPos Pos={i,-1}; SendDlgMessage(dialog, DM_LISTSETCURPOS, control, reinterpret_cast<LONG_PTR>(&Pos)); break; } } } // Возвращаем число любимых таблиц символов return favoriteCodePages; }
// Заполняем список таблицами символов UINT FillCodePagesList(HANDLE dialogHandle, UINT controlId, uintptr_t codePage, bool allowAuto, bool allowAll, bool allowDefault, bool allowM2) { CallbackCallSource = CodePagesFill; // Устанавливаем переменные для доступа из каллбака dialog = dialogHandle; control = controlId; currentCodePage = codePage; favoriteCodePages = normalCodePages = 0; selectedCodePages = !allowAuto && allowAll; // Добавляем стндартные элементы в список AddCodePages((allowM2 ? ::AllowM2 : 0) | (allowDefault ? ::DefaultCP : 0) | (allowAuto ? ::Auto : 0) | (allowAll ? ::SearchAll : 0) | ::AllStandard); if (CallbackCallSource == CodePagesFill) { // Если надо выбираем элемент FarListInfo info={sizeof(FarListInfo)}; SendDlgMessage(dialogHandle, DM_LISTINFO, control, &info); for (int i=0; i<static_cast<int>(info.ItemsNumber); i++) { if (GetListItemCodePage(i)==codePage) { FarListGetItem Item={sizeof(FarListGetItem),i}; SendDlgMessage(dialog, DM_LISTGETITEM, control, &Item); SendDlgMessage(dialog, DM_SETTEXTPTR, control, const_cast<wchar_t*>(Item.Item.Text)); FarListPos Pos={sizeof(FarListPos),i,-1}; SendDlgMessage(dialog, DM_LISTSETCURPOS, control, &Pos); break; } } } // Возвращаем число любимых таблиц символов return favoriteCodePages; }
// Добавляем разделитель void AddSeparator(LPCWSTR Label=nullptr,int position = -1) { if (CallbackCallSource == CodePagesFill) { if (position==-1) { FarListInfo info; SendDlgMessage(dialog, DM_LISTINFO, control, (LONG_PTR)&info); position = info.ItemsNumber; } FarListInsert item = {position, {}}; item.Item.Text = Label; item.Item.Flags = LIF_SEPARATOR; SendDlgMessage(dialog, DM_LISTINSERT, control, (LONG_PTR)&item); } else { MenuItemEx item; item.Clear(); item.strName = Label; item.Flags = MIF_SEPARATOR; if (position>=0) CodePages->AddItem(&item, position); else CodePages->AddItem(&item); } }
intptr_t WINAPI MkDirDlgProc(HANDLE hDlg,intptr_t Msg,intptr_t Param1,void* Param2) { switch (Msg) { case DN_LISTCHANGE: { if (Param1 == MKDIR_COMBOBOX_LINKTYPE) { SendDlgMessage(hDlg, DM_ENABLE, MKDIR_EDIT_LINKPATH, ToPtr(Param2 != 0)); } } break; case DN_CLOSE: { if (Param1==MKDIR_OK) { string strDirName=reinterpret_cast<LPCWSTR>(SendDlgMessage(hDlg,DM_GETCONSTTEXTPTR,MKDIR_EDIT,0)); Opt.MultiMakeDir=(SendDlgMessage(hDlg,DM_GETCHECK,MKDIR_CHECKBOX,0)==BSTATE_CHECKED); // это по поводу создания одиночного каталога, который // начинается с пробела! Чтобы ручками не заключать // такой каталог в кавычки if (Opt.MultiMakeDir && !wcspbrk(strDirName,L";,\"")) { QuoteSpaceOnly(strDirName); } // нужно создать только ОДИН каталог if (!Opt.MultiMakeDir) { // уберем все лишние кавычки Unquote(strDirName); // возьмем в кавычки, т.к. могут быть разделители InsertQuote(strDirName); } UserDefinedList* pDirList=reinterpret_cast<UserDefinedList*>(SendDlgMessage(hDlg,DM_GETDLGDATA,0,0)); if (!pDirList->Set(strDirName)) { Message(MSG_WARNING,1,MSG(MWarning),MSG(MIncorrectDirList),MSG(MOk)); return FALSE; } } } break; default: break; } return DefDlgProc(hDlg,Msg,Param1,Param2); }
// Каллбак для диалога редактирования имени кодовой страницы 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 MsgDlgProc(HANDLE hDlg,int Msg,int Param1,LONG_PTR Param2) { switch (Msg) { case DN_INITDIALOG: { FarDialogItem di; for (int i=0; SendDlgMessage(hDlg,DM_GETDLGITEMSHORT,i,(LONG_PTR)&di); i++) { if (di.Type==DI_EDIT) { COORD pos={0,0}; SendDlgMessage(hDlg,DM_SETCURSORPOS,i,(LONG_PTR)&pos); } } } break; case DN_CTLCOLORDLGITEM: { FarDialogItem di; SendDlgMessage(hDlg,DM_GETDLGITEMSHORT,Param1,(LONG_PTR)&di); if (di.Type==DI_EDIT) { int Color=FarColorToReal(IsWarningStyle?COL_WARNDIALOGTEXT:COL_DIALOGTEXT)&0xFF; return ((Param2&0xFF00FF00)|(Color<<16)|Color); } } break; case DN_KEY: { if (Param1==FirstButtonIndex && (Param2==KEY_LEFT || Param2 == KEY_NUMPAD4 || Param2==KEY_SHIFTTAB)) { SendDlgMessage(hDlg,DM_SETFOCUS,LastButtonIndex,0); return TRUE; } else if (Param1==LastButtonIndex && (Param2==KEY_RIGHT || Param2 == KEY_NUMPAD6 || Param2==KEY_TAB)) { SendDlgMessage(hDlg,DM_SETFOCUS,FirstButtonIndex,0); return TRUE; } } break; } return DefDlgProc(hDlg,Msg,Param1,Param2); }
void DlgEdit::DoEditChange() { if (m_Dialog->IsInited()) { SendDlgMessage((HANDLE)m_Dialog,DN_EDITCHANGE,m_Index,0); } }
// Каллбак для диалога редактирования имени кодовой страницы 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); }
INT_PTR WINAPI ExcDlgProc(HANDLE hDlg,int Msg,int Param1,void* Param2) { switch (Msg) { case DN_CTLCOLORDLGITEM: { FarDialogItem di; SendDlgMessage(hDlg,DM_GETDLGITEMSHORT,Param1,&di); if (di.Type==DI_EDIT) { FarColor Color=ColorIndexToColor(COL_WARNDIALOGTEXT); FarDialogItemColors* Colors = static_cast<FarDialogItemColors*>(Param2); Colors->Colors[0] = Color; Colors->Colors[2] = Color; } } break; case DN_CONTROLINPUT: { const INPUT_RECORD* record=(const INPUT_RECORD *)Param2; if (record->EventType==KEY_EVENT) { int key = InputRecordToKey(record); if (Param1==10 && (key==KEY_LEFT || key == KEY_NUMPAD4 || key==KEY_SHIFTTAB)) { SendDlgMessage(hDlg,DM_SETFOCUS,11,0); return TRUE; } else if (Param1==11 && (key==KEY_RIGHT || key == KEY_NUMPAD6 || key==KEY_TAB)) { SendDlgMessage(hDlg,DM_SETFOCUS,10,0); return TRUE; } } } break; default: break; } return DefDlgProc(hDlg,Msg,Param1,Param2); }
LONG_PTR WINAPI EditTypeRecordDlgProc(HANDLE hDlg,int Msg,int Param1,LONG_PTR Param2) { switch (Msg) { case DN_BTNCLICK: switch (Param1) { case ETR_COMBO_EXEC: case ETR_COMBO_ALTEXEC: case ETR_COMBO_VIEW: case ETR_COMBO_ALTVIEW: case ETR_COMBO_EDIT: case ETR_COMBO_ALTEDIT: SendDlgMessage(hDlg,DM_ENABLE,Param1+1,Param2==BSTATE_CHECKED?TRUE:FALSE); break; } break; case DN_CLOSE: if (Param1==ETR_BUTTON_OK) { BOOL Result=TRUE; LPCWSTR Masks=reinterpret_cast<LPCWSTR>(SendDlgMessage(hDlg,DM_GETCONSTTEXTPTR,ETR_EDIT_MASKS,0)); CFileMask FMask; if (!FMask.Set(Masks,0)) { Result=FALSE; } return Result; } break; } return DefDlgProc(hDlg,Msg,Param1,Param2); }
// Получаем количество элементов в списке int GetItemsCount() { if (CallbackCallSource == CodePageSelect) { return CodePages->GetItemCount(); } else { FarListInfo info={sizeof(FarListInfo)}; SendDlgMessage(dialog, DM_LISTINFO, control, &info); return static_cast<int>(info.ItemsNumber); } }
// Получаем количество элементов в списке int GetItemsCount() { if (CallbackCallSource == CodePageSelect) { return CodePages->GetItemCount(); } else { FarListInfo info; SendDlgMessage(dialog, DM_LISTINFO, control, (LONG_PTR)&info); return info.ItemsNumber; } }
void CPlugin::CfgDlgProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, void *Param2) { if (DN_INITDIALOG==Msg) { SendDlgMessage(hDlg, DM_ENABLE, m_nShowMessId, (void *)(0==SendDlgMessage(hDlg, DM_GETCHECK, m_nSilentId, 0))); SendDlgMessage(hDlg, DM_ENABLE, m_nDifferentId, (void *)(0==SendDlgMessage(hDlg, DM_GETCHECK, m_nDifferentId-3, 0))); } if (DN_BTNCLICK==Msg && m_nSilentId==Param1) { SendDlgMessage(hDlg, DM_ENABLE, m_nShowMessId, (void *)(0==Param2)); } if (DN_BTNCLICK==Msg && Param1>=m_nDifferentId-2 && Param1<m_nDifferentId) { SendDlgMessage(hDlg, DM_ENABLE, m_nDifferentId, (void *)(0!=Param2)); } }
int Message( DWORD Flags, int Buttons, const wchar_t *Title, const wchar_t * const *Items, int ItemsNumber, INT_PTR PluginNumber ) { FARString strTempStr; int X1,Y1,X2,Y2; int Length, BtnLength, J; DWORD I, MaxLength, StrCount; BOOL ErrorSets=FALSE; const wchar_t **Str; wchar_t *PtrStr; const wchar_t *CPtrStr; FARString strErrStr; if (Flags & MSG_ERRORTYPE) ErrorSets = GetErrorString(strErrStr); // выделим память под рабочий массив указателей на строки (+запас 16) Str=(const wchar_t **)xf_malloc((ItemsNumber+ADDSPACEFORPSTRFORMESSAGE) * sizeof(wchar_t*)); if (!Str) return -1; StrCount=ItemsNumber-Buttons; // предварительный обсчет максимального размера. for (BtnLength=0,I=0; I<static_cast<DWORD>(Buttons); I++) //?? { BtnLength+=HiStrlen(Items[I+StrCount])+2+2+1; // "[ ", " ]", " " } if(BtnLength) { BtnLength--; } for (MaxLength=BtnLength,I=0; I<StrCount; I++) { if (static_cast<DWORD>(Length=StrLength(Items[I]))>MaxLength) MaxLength=Length; } // учтем так же размер заголовка if (Title && *Title) { I=(DWORD)StrLength(Title)+2; if (MaxLength < I) MaxLength=I; } // певая коррекция максимального размера if (MaxLength > MAX_WIDTH_MESSAGE) MaxLength=MAX_WIDTH_MESSAGE; // теперь обработаем MSG_ERRORTYPE DWORD CountErrorLine=0; if ((Flags & MSG_ERRORTYPE) && ErrorSets) { // подсчет количества строк во врапенном сообщениеи ++CountErrorLine; //InsertQuote(ErrStr); // оквочим // вычисление "красивого" размера DWORD LenErrStr=(DWORD)strErrStr.GetLength(); if (LenErrStr > MAX_WIDTH_MESSAGE) { // половина меньше? if (LenErrStr/2 < MAX_WIDTH_MESSAGE) { // а половина + 1/3? if ((LenErrStr+LenErrStr/3)/2 < MAX_WIDTH_MESSAGE) LenErrStr=(LenErrStr+LenErrStr/3)/2; else LenErrStr/=2; } else LenErrStr=MAX_WIDTH_MESSAGE; } else if (LenErrStr < MaxLength) LenErrStr=MaxLength; if (MaxLength > LenErrStr && MaxLength >= MAX_WIDTH_MESSAGE) MaxLength=LenErrStr; if (MaxLength < LenErrStr && LenErrStr <= MAX_WIDTH_MESSAGE) MaxLength=LenErrStr; // а теперь проврапим //PtrStr=FarFormatText(ErrStr,MaxLength-(MaxLength > MAX_WIDTH_MESSAGE/2?1:0),ErrStr,sizeof(ErrStr),"\n",0); //?? MaxLength ?? FarFormatText(strErrStr,LenErrStr,strErrStr,L"\n",0); //?? MaxLength ?? PtrStr = strErrStr.GetBuffer(); //BUGBUG: FARString не преднозначен для хранения строк разделённых \0 while ((PtrStr=wcschr(PtrStr,L'\n')) ) { *PtrStr++=0; if (*PtrStr) CountErrorLine++; } strErrStr.ReleaseBuffer(); if (CountErrorLine > ADDSPACEFORPSTRFORMESSAGE) CountErrorLine=ADDSPACEFORPSTRFORMESSAGE; //?? } //BUGBUG: FARString не преднозначен для хранения строк разделённых \0 // заполняем массив... CPtrStr=strErrStr; for (I=0; I < CountErrorLine; I++) { Str[I]=CPtrStr; CPtrStr+=StrLength(CPtrStr)+1; if (!*CPtrStr) // два идущих подряд нуля - "хандец" всему { ++I; break; } } bool EmptyText=false; if(ItemsNumber==Buttons && !I) { EmptyText=true; Str[I]=L""; I++; StrCount++; ItemsNumber++; } for (J=0; J < ItemsNumber-(EmptyText?1:0); ++J, ++I) { Str[I]=Items[J]; } StrCount+=CountErrorLine; MessageX1=X1=(ScrX-MaxLength)/2-4; MessageX2=X2=X1+MaxLength+9; Y1=(ScrY-StrCount)/2-2; if (Y1 < 0) Y1=0; MessageY1=Y1; MessageY2=Y2=Y1+StrCount+3; FARString strHelpTopic(strMsgHelpTopic); strMsgHelpTopic.Clear(); // *** Вариант с Диалогом *** if (Buttons>0) { DWORD ItemCount=StrCount+Buttons+1; DialogItemEx *PtrMsgDlg; DialogItemEx *MsgDlg = new(std::nothrow) DialogItemEx[ItemCount+1]; if (!MsgDlg) { xf_free(Str); return -1; } for (DWORD i=0; i<ItemCount+1; i++) MsgDlg[i].Clear(); int RetCode; MessageY2=++Y2; MsgDlg[0].Type=DI_DOUBLEBOX; MsgDlg[0].X1=3; MsgDlg[0].Y1=1; MsgDlg[0].X2=X2-X1-3; MsgDlg[0].Y2=Y2-Y1-1; if (Title && *Title) MsgDlg[0].strData = Title; int TypeItem=DI_TEXT; DWORD FlagsItem=DIF_SHOWAMPERSAND; BOOL IsButton=FALSE; int CurItem=0; bool StrSeparator=false; bool Separator=false; for (PtrMsgDlg=MsgDlg+1,I=1; I < ItemCount; ++I, ++PtrMsgDlg, ++CurItem) { if (I==StrCount+1 && !StrSeparator && !Separator) { PtrMsgDlg->Type=DI_TEXT; PtrMsgDlg->Flags=DIF_SEPARATOR; PtrMsgDlg->Y1=PtrMsgDlg->Y2=I+1; CurItem--; I--; Separator=true; continue; } if(I==StrCount+1) { PtrMsgDlg->DefaultButton=TRUE; PtrMsgDlg->Focus=TRUE; TypeItem=DI_BUTTON; FlagsItem=DIF_CENTERGROUP; IsButton=TRUE; FirstButtonIndex=CurItem+1; LastButtonIndex=CurItem; } PtrMsgDlg->Type=TypeItem; PtrMsgDlg->Flags|=FlagsItem; CPtrStr=Str[CurItem]; if (IsButton) { PtrMsgDlg->Y1=Y2-Y1-2+(Separator?1:0); PtrMsgDlg->strData+=CPtrStr; LastButtonIndex++; } else { PtrMsgDlg->X1=(Flags & MSG_LEFTALIGN)?5:-1; PtrMsgDlg->Y1=I+1; wchar_t Chr=*CPtrStr; if (Chr == L'\1' || Chr == L'\2') { CPtrStr++; PtrMsgDlg->Flags|=(Chr==2?DIF_SEPARATOR2:DIF_SEPARATOR); if(I==StrCount) { StrSeparator=true; } } else if (StrLength(CPtrStr)>X2-X1-9) { PtrMsgDlg->Type=DI_EDIT; PtrMsgDlg->Flags|=DIF_READONLY|DIF_BTNNOCLOSE|DIF_SELECTONENTRY; PtrMsgDlg->X1=5; PtrMsgDlg->X2=X2-X1-5; PtrMsgDlg->strData=CPtrStr; continue; } //xstrncpy(PtrMsgDlg->Data,CPtrStr,Min((int)MAX_WIDTH_MESSAGE,(int)sizeof(PtrMsgDlg->Data))); //?? ScrX-15 ?? PtrMsgDlg->strData = CPtrStr; //BUGBUG, wrong len } } { if(Separator) { FirstButtonIndex++; LastButtonIndex++; MessageY2++; Y2++; MsgDlg[0].Y2++; ItemCount++; } IsWarningStyle=Flags&MSG_WARNING; Dialog Dlg(MsgDlg,ItemCount,MsgDlgProc); Dlg.SetPosition(X1,Y1,X2,Y2); if (!strHelpTopic.IsEmpty()) Dlg.SetHelp(strHelpTopic); Dlg.SetPluginNumber(PluginNumber); // Запомним номер плагина if (IsWarningStyle) { Dlg.SetDialogMode(DMODE_WARNINGSTYLE); } Dlg.SetDialogMode(DMODE_MSGINTERNAL); FlushInputBuffer(); if (Flags & MSG_KILLSAVESCREEN) SendDlgMessage((HANDLE)&Dlg,DM_KILLSAVESCREEN,0,0); Dlg.Process(); RetCode=Dlg.GetExitCode(); } delete [] MsgDlg; xf_free(Str); return(RetCode<0?RetCode:RetCode-StrCount-1-(Separator?1:0)); } // *** Без Диалога! *** SetCursorType(0,0); if (!(Flags & MSG_KEEPBACKGROUND)) { SetScreen(X1,Y1,X2,Y2,L' ',(Flags & MSG_WARNING)?COL_WARNDIALOGTEXT:COL_DIALOGTEXT); MakeShadow(X1+2,Y2+1,X2+2,Y2+1); MakeShadow(X2+1,Y1+1,X2+2,Y2+1); Box(X1+3,Y1+1,X2-3,Y2-1,(Flags & MSG_WARNING)?COL_WARNDIALOGBOX:COL_DIALOGBOX,DOUBLE_BOX); } SetColor((Flags & MSG_WARNING)?COL_WARNDIALOGTEXT:COL_DIALOGTEXT); if (Title && *Title) { FARString strTempTitle = Title; if (strTempTitle.GetLength() > MaxLength) strTempTitle.SetLength(MaxLength); GotoXY(X1+(X2-X1-1-(int)strTempTitle.GetLength())/2,Y1+1); FS<<L" "<<strTempTitle<<L" "; } for (I=0; I<StrCount; I++) { int PosX; CPtrStr=Str[I]; wchar_t Chr=*CPtrStr; if (Chr == 1 || Chr == 2) { int Length=X2-X1-5; if (Length>1) { SetColor((Flags & MSG_WARNING)?COL_WARNDIALOGBOX:COL_DIALOGBOX); GotoXY(X1+3,Y1+I+2); DrawLine(Length,(Chr == 2?3:1)); CPtrStr++; int TextLength=StrLength(CPtrStr); if (TextLength<Length) { GotoXY(X1+3+(Length-TextLength)/2,Y1+I+2); Text(CPtrStr); } SetColor((Flags & MSG_WARNING)?COL_WARNDIALOGBOX:COL_DIALOGTEXT); } continue; } if ((Length=StrLength(CPtrStr))>ScrX-15) Length=ScrX-15; int Width=X2-X1+1; wchar_t *lpwszTemp = nullptr; if (Flags & MSG_LEFTALIGN) { lpwszTemp = (wchar_t*)xf_malloc((Width-10+1)*sizeof(wchar_t)); swprintf(lpwszTemp,Width-10+1,L"%.*ls",Width-10,CPtrStr); GotoXY(X1+5,Y1+I+2); } else { PosX=X1+(Width-Length)/2; lpwszTemp = (wchar_t*)xf_malloc((PosX-X1-4+Length+X2-PosX-Length-3+1)*sizeof(wchar_t)); swprintf(lpwszTemp,PosX-X1-4+Length+X2-PosX-Length-3+1,L"%*ls%.*ls%*ls",PosX-X1-4,L"",Length,CPtrStr,X2-PosX-Length-3,L""); GotoXY(X1+4,Y1+I+2); } Text(lpwszTemp); xf_free(lpwszTemp); } /* $ 13.01.2003 IS - Принудительно уберем запрет отрисовки экрана, если количество кнопок в сообщении равно нулю и макрос закончил выполняться. Это необходимо, чтобы заработал прогресс-бар от плагина, который был запущен при помощи макроса запретом отрисовки (bugz#533). */ xf_free(Str); if (!Buttons) { if (ScrBuf.GetLockCount()>0 && !CtrlObject->Macro.PeekKey()) ScrBuf.SetLockCount(0); ScrBuf.Flush(); } return 0; }
intptr_t WINAPI EditMenuDlgProc(HANDLE hDlg,intptr_t Msg,intptr_t Param1,void* Param2) { #if defined(PROJECT_DI_MEMOEDIT) Dialog* Dlg=(Dialog*)hDlg; switch (Msg) { case DN_INITDIALOG: { break; } } #endif switch (Msg) { case DN_CLOSE: if (Param1==EM_BUTTON_OK) { BOOL Result=TRUE; LPCWSTR HotKey=reinterpret_cast<LPCWSTR>(SendDlgMessage(hDlg,DM_GETCONSTTEXTPTR,EM_HOTKEY_EDIT,0)); LPCWSTR Label=reinterpret_cast<LPCWSTR>(SendDlgMessage(hDlg,DM_GETCONSTTEXTPTR,EM_LABEL_EDIT,0)); int FocusPos=-1; if(StrCmp(HotKey,L"--")) { if (!*Label) { FocusPos=EM_LABEL_EDIT; } else if (StrLength(HotKey)>1) { FocusPos=EM_HOTKEY_EDIT; if (Upper(*HotKey)==L'F') { int FuncNum=_wtoi(HotKey+1); if (FuncNum > 0 && FuncNum < 25) FocusPos=-1; } } } if (FocusPos!=-1) { Message(MSG_WARNING,1,MSG(MUserMenuTitle),MSG((*Label?MUserMenuInvalidInputHotKey:MUserMenuInvalidInputLabel)),MSG(MOk)); SendDlgMessage(hDlg,DM_SETFOCUS,FocusPos,0); Result=FALSE; } return Result; } break; default: break; } return DefDlgProc(hDlg,Msg,Param1,Param2); }
inline uintptr_t GetListItemCodePage(int Position = -1) { intptr_t Data = SendDlgMessage(dialog, DM_LISTGETDATA, control, ToPtr(Position)); return Data? *reinterpret_cast<uintptr_t*>(Data) : 0; }
int Message( DWORD Flags, size_t Buttons, const wchar_t *Title, const wchar_t * const *Items, size_t ItemsNumber, Plugin* PluginNumber, const GUID* Id ) { string strTempStr; string strClipText; int X1,Y1,X2,Y2; int Length, BtnLength; DWORD I, MaxLength, StrCount; BOOL ErrorSets=FALSE; const wchar_t **Str; wchar_t *PtrStr; const wchar_t *CPtrStr; string strErrStr; IsWarningStyle = (Flags&MSG_WARNING) != 0; IsErrorType = (Flags&MSG_ERRORTYPE) != 0; if(IsErrorType) { LastError = GetLastError(); NtStatus = ifn.RtlGetLastNtStatus(); ErrorSets = GetErrorString(strErrStr); } #if 1 // try to replace inserts if (Items && 0 != (Flags & MSG_INSERT_STRINGS)) { string str_err(strErrStr); DWORD insert_mask = 0; size_t len = strErrStr.GetLength(), pos = 0, inserts_n = 0, inserts[10]; for (size_t i = 1; i <= ItemsNumber-Buttons; ++i) { if (0 != (Flags & MSG_INSERT_STR(i))) { inserts[inserts_n++] = i; if (inserts_n >= ARRAYSIZE(inserts)) break; } } while (str_err.Pos(pos, L"%", pos)) { if (pos >= len-1) break; if (str_err.At(pos+1) >= L'1' && str_err.At(pos+1) <= L'9') { size_t insert_i = 0, pos1 = pos+1; while (pos1 < len && str_err.At(pos1) >= L'0' && str_err.At(pos1) <= L'9') { insert_i = 10*insert_i + str_err.At(pos1) - L'0'; ++pos1; } if (insert_i >= 1 && insert_i <= inserts_n) { insert_mask |= MSG_INSERT_STR(inserts[insert_i-1]); const wchar_t *replacement = Items[inserts[insert_i-1]-1]; str_err.Replace(pos,pos1-pos,replacement); len += wcslen(replacement) - (pos1-pos); pos += wcslen(replacement) - (pos1-pos); } else pos = pos1; } else if (str_err.At(pos+1) == L'%') // "%%" pos += 2; else ++pos; } if (insert_mask == (Flags & MSG_INSERT_STRINGS)) strErrStr = str_err; } #endif // выделим пам¤ть под рабочий массив указателей на строки (+запас 16) Str=(const wchar_t **)xf_malloc((ItemsNumber+ADDSPACEFORPSTRFORMESSAGE) * sizeof(wchar_t*)); if (!Str) return -1; StrCount=static_cast<DWORD>(ItemsNumber-Buttons); // предварительный обсчет максимального размера. for (BtnLength=0,I=0; I<static_cast<DWORD>(Buttons); I++) //?? { BtnLength+=HiStrlen(Items[I+StrCount])+2+2+1; // "[ ", " ]", " " } if(BtnLength) { BtnLength--; } DWORD MAX_WIDTH_MESSAGE = Max(ScrX-1-5-5, BtnLength); for (MaxLength=BtnLength,I=0; I<StrCount; I++) { if (static_cast<DWORD>(Length=StrLength(Items[I]))>MaxLength) MaxLength=Length; } // учтем размер заголовка if (Title && *Title) { I=(DWORD)StrLength(Title)+2; if (MaxLength < I) MaxLength=I; strClipText.Append(Title).Append(L"\r\n\r\n"); } // перва¤ коррекци¤ максимального размера MaxLength = Min(MaxLength, MAX_WIDTH_MESSAGE); // теперь обработаем MSG_ERRORTYPE DWORD CountErrorLine=0; if ((Flags & MSG_ERRORTYPE) && ErrorSets) { strClipText.Append(strErrStr).Append(L"\r\n"); // подсчет количества строк во врапенном сообщениеи ++CountErrorLine; //InsertQuote(ErrStr); // оквочим // вычисление "красивого" размера DWORD LenErrStr=(DWORD)strErrStr.GetLength(); if (LenErrStr > MAX_WIDTH_MESSAGE) { // половина меньше? if (LenErrStr/2 < MAX_WIDTH_MESSAGE) { // а половина + 1/3? if ((LenErrStr+LenErrStr/3)/2 < MAX_WIDTH_MESSAGE) LenErrStr=(LenErrStr+LenErrStr/3)/2; else LenErrStr/=2; } else LenErrStr=MAX_WIDTH_MESSAGE; } MaxLength = Max(MaxLength, LenErrStr); // а теперь проврапим FarFormatText(strErrStr,LenErrStr,strErrStr,L"\n",0); //?? MaxLength ?? PtrStr = strErrStr.GetBuffer(); //BUGBUG: string не предназначен дл¤ хранени¤ строк разделЄнных \0 while ((PtrStr=wcschr(PtrStr,L'\n')) ) { *PtrStr++=0; if (*PtrStr) CountErrorLine++; } strErrStr.ReleaseBuffer(); if (CountErrorLine > ADDSPACEFORPSTRFORMESSAGE) CountErrorLine=ADDSPACEFORPSTRFORMESSAGE; //?? } //BUGBUG: string не предназначен дл¤ хранени¤ строк разделЄнных \0 // заполн¤ем массив... CPtrStr=strErrStr; for (I=0; I < CountErrorLine; I++) { Str[I]=CPtrStr; CPtrStr+=StrLength(CPtrStr)+1; if (!*CPtrStr) // два идущих подр¤д нул¤ - "хандец" всему { ++I; break; } } bool EmptyText=false; if(ItemsNumber==Buttons && !I) { EmptyText=true; Str[I]=L""; I++; StrCount++; ItemsNumber++; } for (size_t J=0; J < ItemsNumber-(EmptyText?1:0); ++J, ++I) { Str[I]=Items[J]; } for (size_t i = 0; i < ItemsNumber-Buttons; ++i) { strClipText.Append(Items[i]).Append(L"\r\n"); } strClipText.Append(L"\r\n"); for (size_t i = ItemsNumber-Buttons; i < ItemsNumber; ++i) { if(i > ItemsNumber-Buttons) { strClipText.Append(L' '); } strClipText.Append(Items[i]); } StrCount+=CountErrorLine; MessageX1=X1=(int(ScrX-MaxLength))/2-4; MessageX2=X2=X1+MaxLength+9; Y1=(ScrY-static_cast<int>(StrCount))/2-2; if (Y1 < 0) Y1=0; MessageY1=Y1; MessageY2=Y2=Y1+StrCount+3; string strHelpTopic(strMsgHelpTopic); strMsgHelpTopic.Clear(); // *** ¬ариант с ƒиалогом *** if (Buttons>0) { size_t ItemCount=StrCount+Buttons+1; DialogItemEx *PtrMsgDlg; DialogItemEx *MsgDlg = new DialogItemEx[ItemCount+1]; if (!MsgDlg) { xf_free(Str); return -1; } for (DWORD i=0; i<ItemCount+1; i++) MsgDlg[i].Clear(); int RetCode; MessageY2=++Y2; MsgDlg[0].Type=DI_DOUBLEBOX; MsgDlg[0].X1=3; MsgDlg[0].Y1=1; MsgDlg[0].X2=X2-X1-3; MsgDlg[0].Y2=Y2-Y1-1; if (Title && *Title) MsgDlg[0].strData = Title; FARDIALOGITEMTYPES TypeItem=DI_TEXT; unsigned __int64 FlagsItem=DIF_SHOWAMPERSAND; BOOL IsButton=FALSE; int CurItem=0; bool StrSeparator=false; bool Separator=false; for (PtrMsgDlg=MsgDlg+1,I=1; I < ItemCount; ++I, ++PtrMsgDlg, ++CurItem) { if (I==StrCount+1 && !StrSeparator && !Separator) { PtrMsgDlg->Type=DI_TEXT; PtrMsgDlg->Flags=DIF_SEPARATOR; PtrMsgDlg->Y1=PtrMsgDlg->Y2=I+1; CurItem--; I--; Separator=true; continue; } if(I==StrCount+1) { TypeItem=DI_BUTTON; FlagsItem=DIF_CENTERGROUP|DIF_DEFAULTBUTTON|DIF_FOCUS; IsButton=TRUE; FirstButtonIndex=CurItem+1; LastButtonIndex=CurItem; } else { FlagsItem&=~DIF_DEFAULTBUTTON; } PtrMsgDlg->Type=TypeItem; PtrMsgDlg->Flags|=FlagsItem; CPtrStr=Str[CurItem]; if (IsButton) { PtrMsgDlg->Y1=Y2-Y1-2+(Separator?1:0); PtrMsgDlg->strData+=CPtrStr; LastButtonIndex++; } else { PtrMsgDlg->X1=(Flags & MSG_LEFTALIGN)?5:-1; PtrMsgDlg->Y1=I+1; wchar_t Chr=*CPtrStr; if (Chr == L'\1' || Chr == L'\2') { CPtrStr++; PtrMsgDlg->Flags|=(Chr==2?DIF_SEPARATOR2:DIF_SEPARATOR); if(I==StrCount) { StrSeparator=true; } } else { if (StrLength(CPtrStr)>X2-X1-9) { PtrMsgDlg->Type=DI_EDIT; PtrMsgDlg->Flags|=DIF_READONLY|DIF_BTNNOCLOSE|DIF_SELECTONENTRY; PtrMsgDlg->X1=5; PtrMsgDlg->X2=X2-X1-5; PtrMsgDlg->strData=CPtrStr; } else { //xstrncpy(PtrMsgDlg->Data,CPtrStr,Min((int)MAX_WIDTH_MESSAGE,(int)sizeof(PtrMsgDlg->Data))); //?? ScrX-15 ?? PtrMsgDlg->strData = CPtrStr; //BUGBUG, wrong len } } } } { if(Separator) { FirstButtonIndex++; LastButtonIndex++; MessageY2++; Y2++; MsgDlg[0].Y2++; ItemCount++; } Dialog Dlg(MsgDlg,ItemCount,MsgDlgProc, &strClipText); if (X1 == -1) X1 = 0; if (Y1 == -1) Y1 = 0; Dlg.SetPosition(X1,Y1,X2,Y2); if(Id) Dlg.SetId(*Id); if (!strHelpTopic.IsEmpty()) Dlg.SetHelp(strHelpTopic); Dlg.SetPluginOwner(reinterpret_cast<Plugin*>(PluginNumber)); // «апомним номер плагина if (IsWarningStyle) { Dlg.SetDialogMode(DMODE_WARNINGSTYLE); } Dlg.SetDialogMode(DMODE_MSGINTERNAL); if (Flags & MSG_NOPLUGINS) Dlg.SetDialogMode(DMODE_NOPLUGINS); FlushInputBuffer(); if (Flags & MSG_KILLSAVESCREEN) SendDlgMessage((HANDLE)&Dlg,DM_KILLSAVESCREEN,0,0); Dlg.Process(); RetCode=Dlg.GetExitCode(); } delete [] MsgDlg; xf_free(Str); return(RetCode<0?RetCode:RetCode-StrCount-1-(Separator?1:0)); } // *** Ѕез ƒиалога! *** SetCursorType(0,0); if (!(Flags & MSG_KEEPBACKGROUND)) { SetScreen(X1,Y1,X2,Y2,L' ',ColorIndexToColor((Flags & MSG_WARNING)?COL_WARNDIALOGTEXT:COL_DIALOGTEXT)); MakeShadow(X1+2,Y2+1,X2+2,Y2+1); MakeShadow(X2+1,Y1+1,X2+2,Y2+1); Box(X1+3,Y1+1,X2-3,Y2-1,ColorIndexToColor((Flags & MSG_WARNING)?COL_WARNDIALOGBOX:COL_DIALOGBOX),DOUBLE_BOX); } SetColor((Flags & MSG_WARNING)?COL_WARNDIALOGTEXT:COL_DIALOGTEXT); if (Title && *Title) { string strTempTitle = Title; if (strTempTitle.GetLength() > MaxLength) strTempTitle.SetLength(MaxLength); GotoXY(X1+(X2-X1-1-(int)strTempTitle.GetLength())/2,Y1+1); FS<<L" "<<strTempTitle<<L" "; } for (I=0; I<StrCount; I++) { CPtrStr=Str[I]; wchar_t Chr=*CPtrStr; if (Chr == 1 || Chr == 2) { Length=X2-X1-5; if (Length>1) { SetColor((Flags & MSG_WARNING)?COL_WARNDIALOGBOX:COL_DIALOGBOX); GotoXY(X1+3,Y1+I+2); DrawLine(Length,(Chr == 2?3:1)); CPtrStr++; int TextLength=StrLength(CPtrStr); if (TextLength<Length) { GotoXY(X1+3+(Length-TextLength)/2,Y1+I+2); Text(CPtrStr); } SetColor((Flags & MSG_WARNING)?COL_WARNDIALOGBOX:COL_DIALOGTEXT); } continue; } if ((Length=StrLength(CPtrStr))>ScrX-15) Length=ScrX-15; int Width=X2-X1+1; wchar_t *lpwszTemp = nullptr; int PosX; if (Flags & MSG_LEFTALIGN) { lpwszTemp = (wchar_t*)xf_malloc((Width-10+1)*sizeof(wchar_t)); _snwprintf(lpwszTemp,Width-10+1,L"%.*s",Width-10,CPtrStr); GotoXY(X1+5,Y1+I+2); } else { PosX=X1+(Width-Length)/2; lpwszTemp = (wchar_t*)xf_malloc((PosX-X1-4+Length+X2-PosX-Length-3+1)*sizeof(wchar_t)); _snwprintf(lpwszTemp,PosX-X1-4+Length+X2-PosX-Length-3+1,L"%*s%.*s%*s",PosX-X1-4,L"",Length,CPtrStr,X2-PosX-Length-3,L""); GotoXY(X1+4,Y1+I+2); } Text(lpwszTemp); xf_free(lpwszTemp); } /* $ 13.01.2003 IS - ѕринудительно уберем запрет отрисовки экрана, если количество кнопок в сообщении равно нулю и макрос закончил выполн¤тьс¤. Ёто необходимо, чтобы заработал прогресс-бар от плагина, который был запущен при помощи макроса запретом отрисовки (bugz#533). */ xf_free(Str); if (!Buttons) { if (ScrBuf.GetLockCount()>0 && !CtrlObject->Macro.PeekKey()) ScrBuf.SetLockCount(0); ScrBuf.Flush(); } return 0; }
intptr_t WINAPI MsgDlgProc(HANDLE hDlg,intptr_t Msg,intptr_t Param1,void* Param2) { switch (Msg) { case DN_INITDIALOG: { FarDialogItem di; for (int i=0; SendDlgMessage(hDlg,DM_GETDLGITEMSHORT,i,&di); i++) { if (di.Type==DI_EDIT) { COORD pos={}; SendDlgMessage(hDlg,DM_SETCURSORPOS,i,&pos); } } } break; case DN_CTLCOLORDLGITEM: { FarDialogItem di; SendDlgMessage(hDlg,DM_GETDLGITEMSHORT,Param1,&di); if (di.Type==DI_EDIT) { FarColor Color=ColorIndexToColor(IsWarningStyle?COL_WARNDIALOGTEXT:COL_DIALOGTEXT); FarDialogItemColors* Colors = static_cast<FarDialogItemColors*>(Param2); Colors->Colors[0] = Color; Colors->Colors[2] = Color; } } break; case DN_CONTROLINPUT: { const INPUT_RECORD* record=(const INPUT_RECORD *)Param2; if (record->EventType==KEY_EVENT) { int key = InputRecordToKey(record); switch(key) { case KEY_F3: if(IsErrorType) { string Txt[2]; GetWin32ErrorString(LastError, Txt[0]); GetNtErrorString(NtStatus, Txt[1]); DialogBuilder Builder(MError, nullptr); Builder.AddConstEditField(FormatString() << L"LastError: 0x" << fmt::MinWidth(8) << fmt::FillChar(L'0') << fmt::Radix(16) << LastError << L" - " << Txt[0], 65); Builder.AddConstEditField(FormatString() << L"NTSTATUS: 0x" << fmt::MinWidth(8) << fmt::FillChar(L'0') << fmt::Radix(16) << NtStatus << L" - " << Txt[1], 65); Builder.AddOK(); Builder.ShowDialog(); } break; case KEY_TAB: case KEY_RIGHT: case KEY_NUMPAD6: if(Param1==LastButtonIndex) { SendDlgMessage(hDlg,DM_SETFOCUS,FirstButtonIndex,0); return TRUE; } break; case KEY_SHIFTTAB: case KEY_LEFT: case KEY_NUMPAD4: if(Param1==FirstButtonIndex) { SendDlgMessage(hDlg,DM_SETFOCUS,LastButtonIndex,0); return TRUE; } break; case KEY_CTRLC: case KEY_RCTRLC: case KEY_CTRLINS: case KEY_RCTRLINS: case KEY_CTRLNUMPAD0: case KEY_RCTRLNUMPAD0: { string* strText = reinterpret_cast<string*>(SendDlgMessage(hDlg, DM_GETDLGDATA, 0, 0)); CopyToClipboard(*strText); } break; } } } break; default: break; } return DefDlgProc(hDlg,Msg,Param1,Param2); }
void FilterDlgRelativeDateItemsUpdate(HANDLE hDlg, bool bClear) { SendDlgMessage(hDlg,DM_ENABLEREDRAW,FALSE,0); if (SendDlgMessage(hDlg,DM_GETCHECK,ID_FF_DATERELATIVE,0)) { SendDlgMessage(hDlg,DM_SHOWITEM,ID_FF_DATEBEFOREEDIT,0); SendDlgMessage(hDlg,DM_SHOWITEM,ID_FF_DATEAFTEREDIT,0); SendDlgMessage(hDlg,DM_SHOWITEM,ID_FF_CURRENT,0); SendDlgMessage(hDlg,DM_SHOWITEM,ID_FF_DAYSBEFOREEDIT,ToPtr(1)); SendDlgMessage(hDlg,DM_SHOWITEM,ID_FF_DAYSAFTEREDIT,ToPtr(1)); } else { SendDlgMessage(hDlg,DM_SHOWITEM,ID_FF_DAYSBEFOREEDIT,0); SendDlgMessage(hDlg,DM_SHOWITEM,ID_FF_DAYSAFTEREDIT,0); SendDlgMessage(hDlg,DM_SHOWITEM,ID_FF_DATEBEFOREEDIT,ToPtr(1)); SendDlgMessage(hDlg,DM_SHOWITEM,ID_FF_DATEAFTEREDIT,ToPtr(1)); SendDlgMessage(hDlg,DM_SHOWITEM,ID_FF_CURRENT,ToPtr(1)); } if (bClear) { SendDlgMessage(hDlg,DM_SETTEXTPTR,ID_FF_DATEAFTEREDIT,nullptr); SendDlgMessage(hDlg,DM_SETTEXTPTR,ID_FF_DAYSAFTEREDIT,nullptr); SendDlgMessage(hDlg,DM_SETTEXTPTR,ID_FF_TIMEAFTEREDIT,nullptr); SendDlgMessage(hDlg,DM_SETTEXTPTR,ID_FF_DATEBEFOREEDIT,nullptr); SendDlgMessage(hDlg,DM_SETTEXTPTR,ID_FF_TIMEBEFOREEDIT,nullptr); SendDlgMessage(hDlg,DM_SETTEXTPTR,ID_FF_DAYSBEFOREEDIT,nullptr); } SendDlgMessage(hDlg,DM_ENABLEREDRAW,TRUE,0); }
intptr_t WINAPI FileFilterConfigDlgProc(HANDLE hDlg,intptr_t Msg,intptr_t Param1,void* Param2) { switch (Msg) { case DN_INITDIALOG: { FilterDlgRelativeDateItemsUpdate(hDlg, false); return TRUE; } case DN_BTNCLICK: { if (Param1==ID_FF_CURRENT || Param1==ID_FF_BLANK) //Current и Blank { FILETIME ft; string strDate, strTime; if (Param1==ID_FF_CURRENT) { GetSystemTimeAsFileTime(&ft); ConvertDate(ft,strDate,strTime,12,FALSE,FALSE,2); } else { strDate.Clear(); strTime.Clear(); } SendDlgMessage(hDlg,DM_ENABLEREDRAW,FALSE,0); int relative = (int)SendDlgMessage(hDlg,DM_GETCHECK,ID_FF_DATERELATIVE,0); int db = relative ? ID_FF_DAYSBEFOREEDIT : ID_FF_DATEBEFOREEDIT; int da = relative ? ID_FF_DAYSAFTEREDIT : ID_FF_DATEAFTEREDIT; SendDlgMessage(hDlg,DM_SETTEXTPTR,da,const_cast<wchar_t*>(strDate.CPtr())); SendDlgMessage(hDlg,DM_SETTEXTPTR,ID_FF_TIMEAFTEREDIT,const_cast<wchar_t*>(strTime.CPtr())); SendDlgMessage(hDlg,DM_SETTEXTPTR,db,const_cast<wchar_t*>(strDate.CPtr())); SendDlgMessage(hDlg,DM_SETTEXTPTR,ID_FF_TIMEBEFOREEDIT,const_cast<wchar_t*>(strTime.CPtr())); SendDlgMessage(hDlg,DM_SETFOCUS,da,0); COORD r; r.X=r.Y=0; SendDlgMessage(hDlg,DM_SETCURSORPOS,da,&r); SendDlgMessage(hDlg,DM_ENABLEREDRAW,TRUE,0); break; } else if (Param1==ID_FF_RESET) // Reset { SendDlgMessage(hDlg,DM_ENABLEREDRAW,FALSE,0); intptr_t ColorConfig = SendDlgMessage(hDlg, DM_GETDLGDATA, 0, 0); SendDlgMessage(hDlg,DM_SETTEXTPTR,ID_FF_MASKEDIT,const_cast<wchar_t*>(L"*")); SendDlgMessage(hDlg,DM_SETTEXTPTR,ID_FF_SIZEFROMEDIT,nullptr); SendDlgMessage(hDlg,DM_SETTEXTPTR,ID_FF_SIZETOEDIT,nullptr); for (int I=ID_FF_READONLY; I <= ID_FF_VIRTUAL; ++I) { SendDlgMessage(hDlg,DM_SETCHECK,I,ToPtr(BSTATE_3STATE)); } if (!ColorConfig) SendDlgMessage(hDlg,DM_SETCHECK,ID_FF_DIRECTORY,ToPtr(BSTATE_UNCHECKED)); FarListPos LPos= {sizeof(FarListPos)}; SendDlgMessage(hDlg,DM_LISTSETCURPOS,ID_FF_DATETYPE,&LPos); SendDlgMessage(hDlg,DM_SETCHECK,ID_FF_MATCHMASK,ToPtr(BSTATE_CHECKED)); SendDlgMessage(hDlg,DM_SETCHECK,ID_FF_MATCHSIZE,ToPtr(BSTATE_UNCHECKED)); SendDlgMessage(hDlg,DM_SETCHECK,ID_FF_HARDLINKS,ToPtr(BSTATE_UNCHECKED)); SendDlgMessage(hDlg,DM_SETCHECK,ID_FF_MATCHDATE,ToPtr(BSTATE_UNCHECKED)); SendDlgMessage(hDlg,DM_SETCHECK,ID_FF_DATERELATIVE,ToPtr(BSTATE_UNCHECKED)); FilterDlgRelativeDateItemsUpdate(hDlg, true); SendDlgMessage(hDlg,DM_SETCHECK,ID_FF_MATCHATTRIBUTES,ToPtr(ColorConfig?BSTATE_UNCHECKED:BSTATE_CHECKED)); SendDlgMessage(hDlg,DM_ENABLEREDRAW,TRUE,0); break; } else if (Param1==ID_FF_MAKETRANSPARENT) { HighlightDataColor *Colors = (HighlightDataColor *) SendDlgMessage(hDlg, DM_GETDLGDATA, 0, 0); for (int i=0; i<2; i++) for (int j=0; j<4; j++) { MAKE_TRANSPARENT(Colors->Color[i][j].ForegroundColor); MAKE_TRANSPARENT(Colors->Color[i][j].BackgroundColor); } SendDlgMessage(hDlg,DM_SETCHECK,ID_HER_MARKTRANSPARENT,ToPtr(BSTATE_CHECKED)); break; } else if (Param1==ID_FF_DATERELATIVE) { FilterDlgRelativeDateItemsUpdate(hDlg, true); break; } } case DN_CONTROLINPUT: if ((Msg==DN_BTNCLICK && Param1 >= ID_HER_NORMALFILE && Param1 <= ID_HER_SELECTEDCURSORMARKING) || (Msg==DN_CONTROLINPUT && Param1==ID_HER_COLOREXAMPLE && ((INPUT_RECORD *)Param2)->EventType == MOUSE_EVENT && ((INPUT_RECORD *)Param2)->Event.MouseEvent.dwButtonState==FROM_LEFT_1ST_BUTTON_PRESSED)) { HighlightDataColor *EditData = (HighlightDataColor *) SendDlgMessage(hDlg, DM_GETDLGDATA, 0, 0); if (Msg==DN_CONTROLINPUT) { Param1 = ID_HER_NORMALFILE + ((INPUT_RECORD *)Param2)->Event.MouseEvent.dwMousePosition.Y*2; if (((INPUT_RECORD *)Param2)->Event.MouseEvent.dwMousePosition.X==1 && (EditData->MarkChar&0x0000FFFF)) Param1 = ID_HER_NORMALMARKING + ((INPUT_RECORD *)Param2)->Event.MouseEvent.dwMousePosition.Y*2; } //Color[0=file, 1=mark][0=normal,1=selected,2=undercursor,3=selectedundercursor] FarColor Color=EditData->Color[(Param1-ID_HER_NORMALFILE)&1][(Param1-ID_HER_NORMALFILE)/2]; Global->Console->GetColorDialog(Color,true,true); EditData->Color[(Param1-ID_HER_NORMALFILE)&1][(Param1-ID_HER_NORMALFILE)/2]=Color; size_t Size = SendDlgMessage(hDlg,DM_GETDLGITEM,ID_HER_COLOREXAMPLE,0); FarGetDialogItem gdi = {sizeof(FarGetDialogItem), Size, static_cast<FarDialogItem*>(xf_malloc(Size))}; SendDlgMessage(hDlg,DM_GETDLGITEM,ID_HER_COLOREXAMPLE,&gdi); //MarkChar это FIXEDIT размером в 1 символ wchar_t MarkChar[2]; FarDialogItemData item= {sizeof(FarDialogItemData),1,MarkChar}; SendDlgMessage(hDlg,DM_GETTEXT,ID_HER_MARKEDIT,&item); EditData->MarkChar=*MarkChar; HighlightDlgUpdateUserControl(gdi.Item->VBuf,*EditData); SendDlgMessage(hDlg,DM_SETDLGITEM,ID_HER_COLOREXAMPLE,gdi.Item); xf_free(gdi.Item); return TRUE; } break; case DN_EDITCHANGE: if (Param1 == ID_HER_MARKEDIT) { HighlightDataColor *EditData = (HighlightDataColor *) SendDlgMessage(hDlg, DM_GETDLGDATA, 0, 0); size_t Size = SendDlgMessage(hDlg,DM_GETDLGITEM,ID_HER_COLOREXAMPLE,0); FarGetDialogItem gdi = {sizeof(FarGetDialogItem), Size, static_cast<FarDialogItem*>(xf_malloc(Size))}; SendDlgMessage(hDlg,DM_GETDLGITEM,ID_HER_COLOREXAMPLE,&gdi); //MarkChar это FIXEDIT размером в 1 символ wchar_t MarkChar[2]; FarDialogItemData item= {sizeof(FarDialogItemData),1,MarkChar}; SendDlgMessage(hDlg,DM_GETTEXT,ID_HER_MARKEDIT,&item); EditData->MarkChar=*MarkChar; HighlightDlgUpdateUserControl(gdi.Item->VBuf,*EditData); SendDlgMessage(hDlg,DM_SETDLGITEM,ID_HER_COLOREXAMPLE,gdi.Item); xf_free(gdi.Item); return TRUE; } break; case DN_CLOSE: if (Param1 == ID_FF_OK && SendDlgMessage(hDlg,DM_GETCHECK,ID_FF_MATCHSIZE,0)) { string strTemp; FarDialogItemData item = {sizeof(FarDialogItemData)}; item.PtrLength = SendDlgMessage(hDlg,DM_GETTEXT,ID_FF_SIZEFROMEDIT,0); item.PtrData = strTemp.GetBuffer(item.PtrLength+1); SendDlgMessage(hDlg,DM_GETTEXT,ID_FF_SIZEFROMEDIT,&item); bool bTemp = !*item.PtrData || CheckFileSizeStringFormat(item.PtrData); item.PtrLength = SendDlgMessage(hDlg,DM_GETTEXT,ID_FF_SIZETOEDIT,0); item.PtrData = strTemp.GetBuffer(item.PtrLength+1); SendDlgMessage(hDlg,DM_GETTEXT,ID_FF_SIZETOEDIT,&item); bTemp = bTemp && (!*item.PtrData || CheckFileSizeStringFormat(item.PtrData)); if (!bTemp) { intptr_t ColorConfig = SendDlgMessage(hDlg, DM_GETDLGDATA, 0, 0); Message(MSG_WARNING,1,ColorConfig?MSG(MFileHilightTitle):MSG(MFileFilterTitle),MSG(MBadFileSizeFormat),MSG(MOk)); return FALSE; } } break; default: break; } 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); } } } }
inline UINT GetListItemCodePage(int Position = -1) { return static_cast<UINT>(SendDlgMessage(dialog, DM_LISTGETDATA, control, Position)); }