string& __stdcall TruncStrFromEnd(string &strStr, int MaxLength) { wchar_t *lpwszBuffer = strStr.GetBuffer(); TruncStrFromEnd(lpwszBuffer, MaxLength); strStr.ReleaseBuffer(); return strStr; }
void Panel::DragMessage(int X,int Y,int Move) { const auto SelCount = SrcDragPanel->GetSelCount(); if (!SelCount) return; string strSelName; if (SelCount == 1) { os::fs::find_data Data; if (!SrcDragPanel->get_first_selected(Data)) return; assign(strSelName, PointToName(Data.FileName)); QuoteSpace(strSelName); } else { strSelName = format(msg(lng::MDragFiles), SelCount); } auto strDragMsg = format(msg(Move? lng::MDragMove : lng::MDragCopy), strSelName); auto Length = static_cast<int>(strDragMsg.size()); int MsgX = X; if (Length + X > ScrX) { MsgX=ScrX-Length; if (MsgX<0) { MsgX=0; TruncStrFromEnd(strDragMsg,ScrX); Length=(int)strDragMsg.size(); } } SCOPED_ACTION(ChangePriority)(THREAD_PRIORITY_NORMAL); // Important - the old one must be deleted before creating a new one, not after DragSaveScr.reset(); DragSaveScr = std::make_unique<SaveScreen>(MsgX, Y, MsgX + Length - 1, Y); GotoXY(MsgX,Y); SetColor(COL_PANELDRAGTEXT); Text(strDragMsg); }
int GetString( const wchar_t *Title, const wchar_t *Prompt, const wchar_t *HistoryName, const wchar_t *SrcText, string &strDestText, const wchar_t *HelpTopic, DWORD Flags, int *CheckBoxValue, const wchar_t *CheckBoxText, Plugin* PluginNumber, const GUID* Id ) { int Substract=5; // дополнительная величина :-) int ExitCode; bool addCheckBox=Flags&FIB_CHECKBOX && CheckBoxValue && CheckBoxText; int offset=addCheckBox?2:0; FarDialogItem StrDlgData[]= { {DI_DOUBLEBOX, 3, 1, 72, 4, 0, nullptr, nullptr, 0, L""}, {DI_TEXT, 5, 2, 0, 2, 0, nullptr, nullptr, DIF_SHOWAMPERSAND, L""}, {DI_EDIT, 5, 3, 70, 3, 0, nullptr, nullptr, DIF_FOCUS|DIF_DEFAULTBUTTON, L""}, {DI_TEXT, -1, 4, 0, 4, 0, nullptr, nullptr, DIF_SEPARATOR, L""}, {DI_CHECKBOX, 5, 5, 0, 5, 0, nullptr, nullptr, 0, L""}, {DI_TEXT, -1, 6, 0, 6, 0, nullptr, nullptr, DIF_SEPARATOR, L""}, {DI_BUTTON, 0, 7, 0, 7, 0, nullptr, nullptr, DIF_CENTERGROUP, L""}, {DI_BUTTON, 0, 7, 0, 7, 0, nullptr, nullptr, DIF_CENTERGROUP, L""}, }; auto StrDlg = MakeDialogItemsEx(StrDlgData); if (addCheckBox) { Substract-=2; StrDlg[0].Y2+=2; StrDlg[4].Selected = *CheckBoxValue != 0; StrDlg[4].strData = CheckBoxText; } if (Flags&FIB_BUTTONS) { Substract-=3; StrDlg[0].Y2+=2; StrDlg[2].Flags&=~DIF_DEFAULTBUTTON; StrDlg[5+offset].Y1=StrDlg[4+offset].Y1=5+offset; StrDlg[4+offset].Type=StrDlg[5+offset].Type=DI_BUTTON; StrDlg[4+offset].Flags=StrDlg[5+offset].Flags=DIF_CENTERGROUP; StrDlg[4+offset].Flags|=DIF_DEFAULTBUTTON; StrDlg[4+offset].strData = MSG(MOk); StrDlg[5+offset].strData = MSG(MCancel); } if (Flags&FIB_EXPANDENV) { StrDlg[2].Flags|=DIF_EDITEXPAND; } if (Flags&FIB_EDITPATH) { StrDlg[2].Flags|=DIF_EDITPATH; } if (Flags&FIB_EDITPATHEXEC) { StrDlg[2].Flags|=DIF_EDITPATHEXEC; } if (HistoryName) { StrDlg[2].strHistory=HistoryName; StrDlg[2].Flags|=DIF_HISTORY|(Flags&FIB_NOUSELASTHISTORY?0:DIF_USELASTHISTORY); } if (Flags&FIB_PASSWORD) StrDlg[2].Type=DI_PSWEDIT; if (Title) StrDlg[0].strData = Title; if (Prompt) { StrDlg[1].strData = Prompt; TruncStrFromEnd(StrDlg[1].strData, 66); if (Flags&FIB_NOAMPERSAND) StrDlg[1].Flags&=~DIF_SHOWAMPERSAND; } if (SrcText) StrDlg[2].strData = SrcText; { auto Dlg = Dialog::create(make_range(StrDlg.data(), StrDlg.data() + StrDlg.size() - Substract)); Dlg->SetPosition(-1,-1,76,offset+((Flags&FIB_BUTTONS)?8:6)); if(Id) Dlg->SetId(*Id); if (HelpTopic) Dlg->SetHelp(HelpTopic); Dlg->SetPluginOwner(PluginNumber); Dlg->Process(); ExitCode=Dlg->GetExitCode(); if (ExitCode == -2 && Global->CtrlObject->Macro.IsExecuting() != MACROSTATE_NOMACRO) Global->CtrlObject->Macro.SendDropProcess(); } if (ExitCode == 2 || ExitCode == 4 || (addCheckBox && ExitCode == 6)) { if (!(Flags&FIB_ENABLEEMPTY) && StrDlg[2].strData.empty()) return FALSE; strDestText = StrDlg[2].strData; if (addCheckBox) *CheckBoxValue=StrDlg[4].Selected; return TRUE; } return FALSE; }