From 123e7c50dd30858a86d3a439b9a37c800c27c93a Mon Sep 17 00:00:00 2001 From: Basile Burg Date: Thu, 21 Jan 2016 20:27:54 +0100 Subject: [PATCH] added D&D from mini-explorer and from proj inspectors --- lazproj/coedit.lpi | 6 +- lazproj/coedit.lpr | 2 +- src/ce_controls.pas | 25 +++++++ src/ce_dubprojeditor.lfm | 7 +- src/ce_editor.pas | 7 +- src/ce_lcldragdrop.pas | 154 +++++++++++++++++++++++++++++++++++++++ src/ce_main.pas | 6 +- src/ce_miniexplorer.lfm | 6 +- src/ce_miniexplorer.pas | 7 ++ src/ce_projinspect.lfm | 1 + src/ce_synmemo.pas | 5 +- 11 files changed, 215 insertions(+), 11 deletions(-) create mode 100644 src/ce_lcldragdrop.pas diff --git a/lazproj/coedit.lpi b/lazproj/coedit.lpi index 17a584c8..913de5dc 100644 --- a/lazproj/coedit.lpi +++ b/lazproj/coedit.lpi @@ -137,7 +137,7 @@ - + @@ -376,6 +376,10 @@ + + + + diff --git a/lazproj/coedit.lpr b/lazproj/coedit.lpr index 6e13bb22..ea60a93d 100644 --- a/lazproj/coedit.lpr +++ b/lazproj/coedit.lpr @@ -10,7 +10,7 @@ uses ce_observer, ce_libman, ce_tools, ce_dcd, ce_main, ce_writableComponent, ce_symstring, ce_staticmacro, ce_inspectors, ce_editoroptions, ce_dockoptions, ce_shortcutseditor, ce_mru, ce_processes, ce_dubproject, ce_dialogs, -ce_dubprojeditor, ce_gdb, ce_controls, ce_dfmt; +ce_dubprojeditor, ce_gdb, ce_controls, ce_dfmt, ce_lcldragdrop; {$R *.res} diff --git a/src/ce_controls.pas b/src/ce_controls.pas index 6970e11a..ece4a606 100644 --- a/src/ce_controls.pas +++ b/src/ce_controls.pas @@ -52,6 +52,8 @@ type fOnChanging: TTabChangingEvent; fSplitter: TSplitter; fOldSplitPos: integer; + fOnDragDrop: TDragDropEvent; + fOnDragOver: TDragOverEvent; procedure btnCloseClick(sender: TObject); procedure btnMoveLeftClick(sender: TObject); @@ -74,6 +76,9 @@ type procedure changedNotify; procedure updateButtonsState; + procedure setOnDragOver(value: TDragOverEvent); + procedure setOnDragDrop(value: TDragDropEvent); + public constructor Create(aowner: TComponent); override; destructor Destroy; override; @@ -99,6 +104,9 @@ type property onChanged: TNotifyEvent read fOnChanged write fOnChanged; property onChanging: TTabChangingEvent read fOnChanging write fOnChanging; + + property OnDragOver read fOnDragOver write setOnDragOver; + property OnDragDrop read fOnDragDrop write setOnDragDrop; end; implementation @@ -218,6 +226,23 @@ begin inherited; end; +procedure TCEPageControl.setOnDragOver(value: TDragOverEvent); +begin + if fOnDragOver = value then + exit; + fOnDragOver:=value; + fContent.OnDragOver:=value; + fTabs.OnDragOver:=value; +end; +procedure TCEPageControl.setOnDragDrop(value: TDragDropEvent); +begin + if fOnDragDrop = value then + exit; + fOnDragDrop:=value; + fContent.OnDragDrop:=value; + fTabs.OnDragDrop:=value; +end; + procedure TCEPageControl.changedNotify; begin updateButtonsState; diff --git a/src/ce_dubprojeditor.lfm b/src/ce_dubprojeditor.lfm index c705153f..f73cbdc6 100644 --- a/src/ce_dubprojeditor.lfm +++ b/src/ce_dubprojeditor.lfm @@ -65,6 +65,7 @@ inherited CEDubProjectEditorWidget: TCEDubProjectEditorWidget Align = alClient BorderSpacing.Around = 4 DefaultItemHeight = 16 + DragMode = dmAutomatic HideSelection = False Images = imgList ReadOnly = True @@ -85,12 +86,12 @@ inherited CEDubProjectEditorWidget: TCEDubProjectEditorWidget ClientWidth = 395 object propTree: TTreeView Left = 4 - Height = 324 + Height = 316 Top = 32 Width = 387 Align = alClient BorderSpacing.Around = 4 - DefaultItemHeight = 18 + DefaultItemHeight = 16 HideSelection = False Images = imgList ReadOnly = True @@ -152,7 +153,7 @@ inherited CEDubProjectEditorWidget: TCEDubProjectEditorWidget object Panel1: TPanel Left = 2 Height = 26 - Top = 360 + Top = 352 Width = 391 Align = alBottom BorderSpacing.Around = 2 diff --git a/src/ce_editor.pas b/src/ce_editor.pas index 00aebac7..863c88f6 100644 --- a/src/ce_editor.pas +++ b/src/ce_editor.pas @@ -85,6 +85,9 @@ type implementation {$R *.lfm} +uses + ce_lcldragdrop; + {$REGION Standard Comp/Obj------------------------------------------------------} constructor TCEEditorWidget.create(aOwner: TComponent); begin @@ -97,6 +100,8 @@ begin pageControl.onChanging:=@PageControlChanging; pageControl.closeButton.OnClick:=@pageCloseBtnClick; pageControl.addButton.OnClick:=@pageBtnAddCLick; + pageControl.OnDragDrop:= @ddHandler.DragDrop; + pageControl.OnDragOver:= @ddHandler.DragOver; AssignPng(pageControl.moveLeftButton, 'go_previous'); AssignPng(pageControl.moveRightButton, 'go_next'); AssignPng(pageControl.addButton, 'document_add'); @@ -380,7 +385,7 @@ begin if not DcdWrapper.available then exit; // DcdWrapper.getDeclFromCursor(fname, srcpos); - if (fname <> fDoc.fileName) and fileExists(fname) then + if (fname <> fDoc.fileName) and fname.fileExists then begin page := pageControl.splitPage; if assigned(page) then diff --git a/src/ce_lcldragdrop.pas b/src/ce_lcldragdrop.pas new file mode 100644 index 00000000..b1d9767f --- /dev/null +++ b/src/ce_lcldragdrop.pas @@ -0,0 +1,154 @@ +unit ce_lcldragdrop; + +{$I ce_defines.inc} + +interface + +uses + Classes, SysUtils, Controls, ComCtrls, + ce_common, ce_nativeproject, ce_dubproject, ce_interfaces, + ce_dialogs; + +type + + TDDHandler = class(TObject, ICEProjectObserver) + private + fProj: ICECommonProject; + procedure projNew(aProject: ICECommonProject); + procedure projChanged(aProject: ICECommonProject); + procedure projClosing(aProject: ICECommonProject); + procedure projFocused(aProject: ICECommonProject); + procedure projCompiling(aProject: ICECommonProject); + function getFilename(src: TObject): string; + public + constructor create; + destructor destroy; override; + procedure DragOver(Sender, Source: TObject; X, Y: Integer; + State: TDragState; var Accept: Boolean); + procedure DragDrop(Sender, Source: TObject; X, Y: Integer); + end; + +var + ddHandler: TDDHandler; + +implementation + +uses + ce_observer; + +constructor TDDHandler.create; +begin + EntitiesConnector.addObserver(self); +end; + +destructor TDDHandler.destroy; +begin + EntitiesConnector.removeObserver(self); + inherited; +end; + +procedure TDDHandler.projNew(aProject: ICECommonProject); +begin + fProj := aProject; +end; + +procedure TDDHandler.projChanged(aProject: ICECommonProject); +begin +end; + +procedure TDDHandler.projClosing(aProject: ICECommonProject); +begin + if (fProj <> nil) and (fProj = aProject) then + fProj := nil; +end; + +procedure TDDHandler.projFocused(aProject: ICECommonProject); +begin + fProj := aProject; +end; + +procedure TDDHandler.projCompiling(aProject: ICECommonProject); +begin +end; + +function TDDHandler.getFilename(src: TObject): string; +var + lst: TListView; + trv: TTreeView; +begin + result := ''; + if src.isNil then exit; + // from mini-explorer + if src is TListView then + begin + lst := TListView(src); + if lst.Selected.isNotNil and lst.Selected.Data.isNotNil then + result := PString(lst.Selected.Data)^; + end + // from CE/DUB project inspector + else if src is TTreeView then + begin + trv := TTreeView(src); + if trv.Selected.isNotNil then + begin + result := trv.Selected.Text; + if (not result.fileExists) and assigned(fProj) then + result := fProj.filename.extractFilePath + result; + end; + end; +end; + +procedure TDDHandler.DragOver(Sender, Source: TObject; X, Y: Integer; + State: TDragState; var Accept: Boolean); +var + fname: string; +begin + fname := getFilename(Source); + Accept := fname.fileExists and (not fname.dirExists); +end; + +procedure TDDHandler.DragDrop(Sender, Source: TObject; X, Y: Integer); +var + fname: string; + proj: boolean = false; +begin + if Source.isNil then exit; + fname := getFilename(Source); + if not fname.fileExists then exit; + + if isValidNativeProject(fname) then + begin + if assigned(fProj) then + begin + if fProj.modified and (dlgFileChangeClose(fname) = mrCancel) then + exit; + fProj.getProject.Free; + end; + TCENativeProject.create(nil); + proj := true; + end + else if isValidDubProject(fname) then + begin + if assigned(fProj) then + begin + if fProj.modified and (dlgFileChangeClose(fname) = mrCancel) then + exit; + fProj.getProject.Free; + end; + TCEDubProject.create(nil); + proj := true; + end; + if assigned(fProj) and proj then + fProj.loadFromFile(fname) + else + getMultiDocHandler.openDocument(fname); +end; + +initialization + ddHandler:= TDDHandler.create; + +finalization + ddHandler.free; + +end. + diff --git a/src/ce_main.pas b/src/ce_main.pas index 5a7c64a3..abf50a92 100644 --- a/src/ce_main.pas +++ b/src/ce_main.pas @@ -7,12 +7,12 @@ interface uses Classes, SysUtils, LazFileUtils, SynEditKeyCmds, SynHighlighterLFM, Forms, StdCtrls, AnchorDocking, AnchorDockStorage, AnchorDockOptionsDlg, Controls, Graphics, strutils, - Dialogs, Menus, ActnList, ExtCtrls, process, XMLPropStorage, SynExportHTML, + Dialogs, Menus, ActnList, ExtCtrls, process, XMLPropStorage, SynExportHTML, ComCtrls, ce_common, ce_dmdwrap, ce_nativeproject, ce_dcd, ce_synmemo, ce_writableComponent, ce_widget, ce_messages, ce_interfaces, ce_editor, ce_projinspect, ce_projconf, ce_search, ce_miniexplorer, ce_libman, ce_libmaneditor, ce_todolist, ce_observer, ce_toolseditor, ce_procinput, ce_optionseditor, ce_symlist, ce_mru, ce_processes, - ce_infos, ce_dubproject, ce_dialogs, ce_dubprojeditor, ce_gdb, ce_dfmt; + ce_infos, ce_dubproject, ce_dialogs, ce_dubprojeditor, ce_gdb, ce_dfmt, ce_lcldragdrop; type @@ -709,6 +709,8 @@ begin LoadSettings; layoutUpdateMenu; fMultidoc := getMultiDocHandler; + OnDragDrop:= @ddHandler.DragDrop; + OnDragOver:= @ddHandler.DragOver; // checkCompilo; // diff --git a/src/ce_miniexplorer.lfm b/src/ce_miniexplorer.lfm index 155b1ea7..2d963f93 100644 --- a/src/ce_miniexplorer.lfm +++ b/src/ce_miniexplorer.lfm @@ -29,7 +29,7 @@ inherited CEMiniExplorerWidget: TCEMiniExplorerWidget AutoWidthLastColumn = True Columns = < item - Width = 330 + Width = 314 end> ReadOnly = True ShowColumnHeaders = False @@ -91,8 +91,9 @@ inherited CEMiniExplorerWidget: TCEMiniExplorerWidget AutoWidthLastColumn = True Columns = < item - Width = 330 + Width = 314 end> + DragMode = dmAutomatic ReadOnly = True ShowColumnHeaders = False SmallImages = imgList @@ -100,6 +101,7 @@ inherited CEMiniExplorerWidget: TCEMiniExplorerWidget ViewStyle = vsReport OnDblClick = lstFilesDblClick OnEnter = lstFilesEnter + OnStartDrag = lstFilesStartDrag end object Panel1: TPanel Left = 0 diff --git a/src/ce_miniexplorer.pas b/src/ce_miniexplorer.pas index ff7fa71e..9e8a1c62 100644 --- a/src/ce_miniexplorer.pas +++ b/src/ce_miniexplorer.pas @@ -81,6 +81,7 @@ type procedure lstFavEnter(Sender: TObject); procedure lstFilesDblClick(Sender: TObject); procedure lstFilesEnter(Sender: TObject); + procedure lstFilesStartDrag(Sender: TObject; var DragObject: TDragObject); procedure TreeEnter(Sender: TObject); private fProj: ICECommonProject; @@ -503,6 +504,12 @@ begin fLastListOrTree := lstFiles; end; +procedure TCEMiniExplorerWidget.lstFilesStartDrag(Sender: TObject; + var DragObject: TDragObject); +begin + +end; + procedure TCEMiniExplorerWidget.shellOpenSelected; var fname: string = ''; diff --git a/src/ce_projinspect.lfm b/src/ce_projinspect.lfm index 9963cf38..08f93692 100644 --- a/src/ce_projinspect.lfm +++ b/src/ce_projinspect.lfm @@ -29,6 +29,7 @@ inherited CEProjectInspectWidget: TCEProjectInspectWidget AutoExpand = True BorderSpacing.Around = 2 DefaultItemHeight = 16 + DragMode = dmAutomatic Images = imgList ReadOnly = True RightClickSelect = True diff --git a/src/ce_synmemo.pas b/src/ce_synmemo.pas index c825bdec..977ff9b9 100644 --- a/src/ce_synmemo.pas +++ b/src/ce_synmemo.pas @@ -235,7 +235,7 @@ var implementation uses - ce_interfaces, ce_staticmacro, ce_dcd, SynEditHighlighterFoldBase; + ce_interfaces, ce_staticmacro, ce_dcd, SynEditHighlighterFoldBase, ce_lcldragdrop; function TCEEditorHintWindow.CalcHintRect(MaxWidth: Integer; const AHint: String; AData: Pointer): TRect; begin @@ -456,6 +456,9 @@ begin Font.Size:=10; SetDefaultCoeditKeystrokes(Self); // not called in inherited if owner = nil ! // + OnDragDrop:= @ddHandler.DragDrop; + OnDragOver:= @ddHandler.DragOver; + // ShowHint := false; InitHintWins; fDDocDelay := 200;