From c303c71d2d7d2e4d0729514230408aa3377e4e04 Mon Sep 17 00:00:00 2001 From: mattias Date: Sat, 1 Oct 2016 11:03:21 +0000 Subject: [PATCH] =?UTF-8?q?IDE:=20added=20multi=20paste=20dialog=20like=20?= =?UTF-8?q?Delphi,=20patch=20#30671,=20from=20Silvio=20Cl=C3=A9cio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: trunk@53063 - --- components/ideintf/idecommands.pas | 8 +++++- docs/Contributors.txt | 2 +- ide/keymapping.pp | 5 ++++ ide/lazarusidestrconsts.pas | 2 ++ ide/main.pp | 8 ++++++ ide/mainbar.pas | 1 + ide/mainbase.pas | 2 ++ ide/sourceeditor.pp | 41 ++++++++++++++++++++++++++++-- 8 files changed, 65 insertions(+), 4 deletions(-) diff --git a/components/ideintf/idecommands.pas b/components/ideintf/idecommands.pas index 1a4c41a860..597c6c44a9 100644 --- a/components/ideintf/idecommands.pas +++ b/components/ideintf/idecommands.pas @@ -170,6 +170,9 @@ const ecQuit = ecFirstLazarus + 214; ecOpenUnit = ecFirstLazarus + 215; + // edit menu + ecMultiPaste = ecFirstLazarus + 230; + // IDE navigation ecToggleFormUnit = ecFirstLazarus + 301; ecToggleObjectInsp = ecFirstLazarus + 302; @@ -1909,7 +1912,7 @@ begin end; const - IDEEditorCommandStrs: array[0..315] of TIdentMapEntry = ( + IDEEditorCommandStrs: array[0..316] of TIdentMapEntry = ( // search (Value: ecFind; Name: 'ecFind'), (Value: ecFindAgain; Name: 'ecFindAgain'), @@ -2028,6 +2031,9 @@ const (Value: ecRestart; Name: 'ecRestart'), (Value: ecQuit; Name: 'ecQuit'), + // edit menu + (Value: ecMultiPaste; Name: 'ecMultiPaste'), + // IDE navigation (Value: ecToggleFormUnit; Name: 'ecToggleFormUnit'), (Value: ecToggleObjectInsp; Name: 'ecToggleObjectInsp'), diff --git a/docs/Contributors.txt b/docs/Contributors.txt index 8aa5ff6c58..42d89ceab5 100644 --- a/docs/Contributors.txt +++ b/docs/Contributors.txt @@ -191,7 +191,7 @@ Seppo Suutarla - Finnish translation Sérgio Marcelo Shane Miller Sileno Goedicke -Silvio Clecio +Silvio Clécio Simon Ameis Slavko Fedorik Stefan Hille diff --git a/ide/keymapping.pp b/ide/keymapping.pp index e80d7a6c75..90aa8c22fa 100644 --- a/ide/keymapping.pp +++ b/ide/keymapping.pp @@ -402,6 +402,7 @@ begin ecCut : Result:= srkmecCut; ecCopy : Result:= srkmecCopy; ecPaste : Result:= srkmecPaste; + ecMultiPaste : Result:= srkmecMultiPaste; ecScrollUp : Result:= srkmecScrollUp; ecScrollDown : Result:= srkmecScrollDown; ecScrollLeft : Result:= srkmecScrollLeft; @@ -986,6 +987,7 @@ begin ecCopy: SetSingle(VK_C,[XCtrl], VK_Insert,[XCtrl]); ecCut: SetSingle(VK_X,[XCtrl], VK_Delete,[ssShift]); ecPaste: SetSingle(VK_V,[XCtrl], VK_Insert,[ssShift]); + ecMultiPaste: SetSingle(VK_UNKNOWN,[]); ecNormalSelect: SetSingle(VK_UNKNOWN,[]); ecColumnSelect: SetSingle(VK_UNKNOWN,[]); ecLineSelect: SetSingle(VK_UNKNOWN,[]); @@ -1459,6 +1461,7 @@ begin ecCopy: SetSingle(VK_Insert,[ssCtrl]); ecCut: SetSingle(VK_Delete,[ssShift]); ecPaste: SetSingle(VK_Insert,[ssShift]); + ecMultiPaste: SetSingle(VK_UNKNOWN,[]); ecNormalSelect: SetCombo(VK_O,[ssCtrl],VK_K,[]); ecColumnSelect: SetCombo(VK_O,[ssCtrl],VK_C,[]); ecLineSelect: SetCombo(VK_K,[ssCtrl],VK_L,[]); @@ -2077,6 +2080,7 @@ begin ecCopy: SetSingle(VK_C,[ssMeta], VK_Insert,[ssCtrl]); ecCut: SetSingle(VK_X,[ssMeta], VK_Delete,[ssShift]); ecPaste: SetSingle(VK_V,[ssMeta], VK_Insert,[ssShift]); + ecMultiPaste: SetSingle(VK_UNKNOWN,[]); ecNormalSelect: SetSingle(VK_UNKNOWN,[]); ecColumnSelect: SetSingle(VK_UNKNOWN,[]); ecLineSelect: SetSingle(VK_UNKNOWN,[]); @@ -2623,6 +2627,7 @@ begin AddDefault(C, 'Copy selection to clipboard', srkmecCopy, ecCopy); AddDefault(C, 'Cut selection to clipboard', srkmecCut, ecCut); AddDefault(C, 'Paste clipboard to current position', srkmecPaste, ecPaste); + AddDefault(C, 'Multi paste clipboard to current position', srkmecMultiPaste, ecMultiPaste); AddDefault(C, 'Normal selection mode', srkmecNormalSelect, ecNormalSelect); AddDefault(C, 'Column selection mode', srkmecColumnSelect, ecColumnSelect); AddDefault(C, 'Line selection mode', srkmecLineSelect, ecLineSelect); diff --git a/ide/lazarusidestrconsts.pas b/ide/lazarusidestrconsts.pas index f7f5744f2e..a73b8856be 100644 --- a/ide/lazarusidestrconsts.pas +++ b/ide/lazarusidestrconsts.pas @@ -347,6 +347,7 @@ resourcestring lisKMSelectPageBottom = 'Select Page Bottom'; lisUseAndClose = 'Use and close'; lisMenuSelect = 'Select'; + lisMenuMultiPaste = 'MultiPaste'; lisMenuSelectAll = 'Select All'; lisCheckAll = 'Check All'; lisUncheckAll = 'Uncheck All'; @@ -2942,6 +2943,7 @@ resourcestring srkmecCut = 'Cut selection to clipboard'; srkmecCopy = 'Copy selection to clipboard'; srkmecPaste = 'Paste clipboard to current position'; + srkmecMultiPaste = 'MultiPaste clipboard to current position'; srkmecScrollUp = 'Scroll up one line'; srkmecScrollDown = 'Scroll down one line'; srkmecScrollLeft = 'Scroll left one char'; diff --git a/ide/main.pp b/ide/main.pp index 5aaef2d9ef..9a318f1bad 100644 --- a/ide/main.pp +++ b/ide/main.pp @@ -214,6 +214,7 @@ type procedure mnuEditCutClicked(Sender: TObject); procedure mnuEditCopyClicked(Sender: TObject); procedure mnuEditPasteClicked(Sender: TObject); + procedure mnuEditMultiPasteClicked(Sender: TObject); procedure mnuEditSelectAllClick(Sender: TObject); procedure mnuEditSelectCodeBlockClick(Sender: TObject); procedure mnuEditSelectToBraceClick(Sender: TObject); @@ -2598,6 +2599,7 @@ begin itmEditCut.OnClick:=@mnuEditCutClicked; itmEditCopy.OnClick:=@mnuEditCopyClicked; itmEditPaste.OnClick:=@mnuEditPasteClicked; + itmEditMultiPaste.OnClick:=@mnuEditMultiPasteClicked; itmEditSelectAll.OnClick:=@mnuEditSelectAllClick; itmEditSelectToBrace.OnClick:=@mnuEditSelectToBraceClick; itmEditSelectCodeBlock.OnClick:=@mnuEditSelectCodeBlockClick; @@ -3701,6 +3703,7 @@ begin IDECommandList.FindIDECommand(ecSelectAll).Enabled := Assigned(ASrcEdit) and (ASrcEdit.SourceText<>''); end; + IDECommandList.FindIDECommand(ecMultiPaste).Enabled := Editable; IDECommandList.FindIDECommand(ecBlockIndent).Enabled := Editable; IDECommandList.FindIDECommand(ecBlockUnindent).Enabled := Editable; IDECommandList.FindIDECommand(ecSelectionUpperCase).Enabled := SelEditable; @@ -12904,6 +12907,11 @@ begin DoSourceEditorCommand(ecPaste); end; +procedure TMainIDE.mnuEditMultiPasteClicked(Sender: TObject); +begin + DoSourceEditorCommand(ecMultiPaste); +end; + procedure TMainIDE.mnuEditRedoClicked(Sender: TObject); var ActiveDesigner: TComponentEditorDesigner; diff --git a/ide/mainbar.pas b/ide/mainbar.pas index ad1930489b..385d79df9a 100644 --- a/ide/mainbar.pas +++ b/ide/mainbar.pas @@ -106,6 +106,7 @@ type itmEditCut: TIDEMenuCommand; itmEditCopy: TIDEMenuCommand; itmEditPaste: TIDEMenuCommand; + itmEditMultiPaste: TIDEMenuCommand; //itmEditSelect: TIDEMenuSection; itmEditSelectAll: TIDEMenuCommand; itmEditSelectToBrace: TIDEMenuCommand; diff --git a/ide/mainbase.pas b/ide/mainbase.pas index 0106c83a70..659e63f07b 100644 --- a/ide/mainbase.pas +++ b/ide/mainbase.pas @@ -1021,6 +1021,7 @@ begin CreateMenuItem(ParentMI,itmEditCut,'itmEditCut',lisCut,'laz_cut'); CreateMenuItem(ParentMI,itmEditCopy,'itmEditCopy',lisCopy,'laz_copy'); CreateMenuItem(ParentMI,itmEditPaste,'itmEditPaste',lisPaste,'laz_paste'); + CreateMenuItem(ParentMI,itmEditMultiPaste,'itmEditMultiPaste',lisMenuMultiPaste); // "Select" menu items CreateMenuSeparatorSection(mnuEdit,itmEditSelect,'itmEditSelect'); @@ -1517,6 +1518,7 @@ begin itmEditCut.Command:=GetCommand(ecCut); itmEditCopy.Command:=GetCommand(ecCopy); itmEditPaste.Command:=GetCommand(ecPaste); + itmEditMultiPaste.Command:=GetCommand(ecMultiPaste); itmEditSelectAll.Command:=GetCommand(ecSelectAll); itmEditSelectToBrace.Command:=GetCommand(ecSelectToBrace); diff --git a/ide/sourceeditor.pp b/ide/sourceeditor.pp index 19df0f5908..6c3f97ba7d 100644 --- a/ide/sourceeditor.pp +++ b/ide/sourceeditor.pp @@ -42,7 +42,7 @@ uses {$IFDEF IDE_MEM_CHECK} MemCheck, {$ENDIF} - SynEditMouseCmds, Classes, SysUtils, types, Math, + SynEditMouseCmds, Classes, SysUtils, StrUtils, types, Math, Controls, Forms, ComCtrls, StdCtrls, Graphics, Dialogs, Extctrls, Menus, ExtendedNotebook, LCLProc, LCLType, LResources, LCLIntf, FileUtil, LazFileUtils, Translations, ClipBrd, HelpIntfs, @@ -69,7 +69,7 @@ uses CodeMacroPrompt, CodeTemplatesDlg, CodeToolsOptions, editor_general_options, SortSelectionDlg, EncloseSelectionDlg, EncloseIfDef, InvertAssignTool, - SourceEditProcs, SourceMarks, CharacterMapDlg, SearchFrm, + SourceEditProcs, SourceMarks, CharacterMapDlg, SearchFrm, MultiPasteDlg, FPDocHints, EditorMacroListViewer, EditorToolbarStatic, editortoolbar_options, DbgIntfBaseTypes, DbgIntfDebuggerBase, BaseDebugManager, Debugger, MainIntf, GotoFrm; @@ -465,6 +465,7 @@ type function IsCaretOnScreen(ACaret: TPoint; UseSoftCenter: Boolean = False): Boolean; // text + procedure MultiPasteText; function SearchReplace(const ASearch, AReplace: string; SearchOptions: TSrcEditSearchOptions): integer; override; function GetSourceText: string; override; @@ -1284,6 +1285,7 @@ var SrcEditMenuCut: TIDEMenuCommand; SrcEditMenuCopy: TIDEMenuCommand; SrcEditMenuPaste: TIDEMenuCommand; + SrcEditMenuMultiPaste: TIDEMenuCommand; SrcEditMenuCopyFilename: TIDEMenuCommand; SrcEditMenuFindDeclaration: TIDEMenuCommand; SrcEditMenuSelectAll: TIDEMenuCommand; @@ -1562,6 +1564,7 @@ begin SrcEditMenuCut:=RegisterIDEMenuCommand(AParent,'Cut',lisCut, nil, nil, nil, 'laz_cut'); SrcEditMenuCopy:=RegisterIDEMenuCommand(AParent,'Copy',lisCopy, nil, nil, nil, 'laz_copy'); SrcEditMenuPaste:=RegisterIDEMenuCommand(AParent,'Paste',lisPaste, nil, nil, nil, 'laz_paste'); + SrcEditMenuMultiPaste:=RegisterIDEMenuCommand(AParent,'MultiPaste',lisMenuMultiPaste); SrcEditMenuSelectAll:=RegisterIDEMenuCommand(AParent,'SelectAll',lisMenuSelectAll); SrcEditMenuCopyFilename:=RegisterIDEMenuCommand(AParent,'Copy filename', uemCopyFilename); {%endregion} @@ -3821,6 +3824,8 @@ Begin CheckActiveWindow; case Command of + ecMultiPaste: + MultiPasteText; ecContextHelp: FindHelpForSourceAtCursor; @@ -5780,6 +5785,37 @@ begin (ACaret.X <= FEditor.LeftChar + FEditor.CharsInWindow); end; +procedure TSourceEditor.MultiPasteText; +var + I, CaretX: Integer; + Content: TStringList; + Dialog: TMultiPasteDialog; +begin + if ReadOnly then Exit; + Dialog := TMultiPasteDialog.Create(nil); + try + if Dialog.ShowModal <> mrOK then Exit; + CaretX := FEditor.CaretX; + if CaretX > 1 then + begin + Content := TStringList.Create; + try + Content.Text := Dialog.Content.Text; + for I := 0 to Pred(Content.Count) do + if I > 0 then + Content[I] := Concat(DupeString(' ', Pred(CaretX)), Content[I]); + FEditor.InsertTextAtCaret(Content.Text); + finally + Content.Free; + end; + end + else + FEditor.InsertTextAtCaret(Dialog.Content.Text); + finally + Dialog.Free; + end; +end; + function TSourceEditor.SearchReplace(const ASearch, AReplace: string; SearchOptions: TSrcEditSearchOptions): integer; const @@ -10460,6 +10496,7 @@ begin SrcEditMenuCut.Command:=GetCommand(ecCut); SrcEditMenuCopy.Command:=GetCommand(ecCopy); SrcEditMenuPaste.Command:=GetCommand(ecPaste); + SrcEditMenuMultiPaste.Command:=GetCommand(ecMultiPaste); SrcEditMenuCopyFilename.OnClick:=@CopyFilenameClicked; SrcEditMenuSelectAll.Command:=GetCommand(ecSelectAll); {%endregion}