From 798249cf3bdf6e93f755bae0c45307cca6e5f32e Mon Sep 17 00:00:00 2001 From: mattias Date: Fri, 21 Dec 2012 10:44:47 +0000 Subject: [PATCH] filebrowser: dockable git-svn-id: trunk@39611 - --- .../filebrowser/frmconfigfilebrowser.pp | 2 +- components/filebrowser/frmfilebrowser.pas | 11 +- components/filebrowser/idefilebrowser.lpk | 26 ++-- components/filebrowser/idefilebrowser.pas | 14 +- components/filebrowser/regidefilebrowser.pp | 146 ++++++++++-------- 5 files changed, 101 insertions(+), 98 deletions(-) diff --git a/components/filebrowser/frmconfigfilebrowser.pp b/components/filebrowser/frmconfigfilebrowser.pp index 700a68a807..9e2ad7e902 100644 --- a/components/filebrowser/frmconfigfilebrowser.pp +++ b/components/filebrowser/frmconfigfilebrowser.pp @@ -1,4 +1,4 @@ -unit frmconfigfilebrowser; +unit frmConfigFileBrowser; {$mode objfpc}{$H+} diff --git a/components/filebrowser/frmfilebrowser.pas b/components/filebrowser/frmfilebrowser.pas index 2fe170dbf2..2457456d3c 100644 --- a/components/filebrowser/frmfilebrowser.pas +++ b/components/filebrowser/frmfilebrowser.pas @@ -38,12 +38,10 @@ type private FOnConfigure: TNotifyEvent; FOnOpenFile: TOpenFileEvent; - FOnSaveLayout: TNotifyEvent; FOnSelectDir: TNotifyEvent; FRootDir: string; FDir: string; FShowHidden: Boolean; - FOnLoadLayout: TNotifyEvent; procedure AddDirectories(Node: TTreeNode; Dir: string); function GetAbsolutePath(Node: TTreeNode): string; procedure SetDir(const Value: string); @@ -67,9 +65,6 @@ type property OnConfigure: TNotifyEvent read FOnConfigure write FOnConfigure; { Called when a new directory is selected } property OnSelectDir: TNotifyEvent read FOnSelectDir write FOnSelectDir; - { OnLoadLayout } - property OnSaveLayout: TNotifyEvent read FOnSaveLayout write FOnSaveLayout; - property OnLoadLayout: TNotifyEvent read FOnLoadLayout write FOnLoadLayout; end; var @@ -202,9 +197,7 @@ end; procedure TFileBrowserForm.FormClose(Sender: TObject; var CloseAction: TCloseAction); begin - if Assigned(FOnSaveLayout) then - FOnSaveLayout(Self); - CloseAction := caFree; + end; procedure TFileBrowserForm.FormCreate(Sender: TObject); @@ -216,8 +209,6 @@ end; procedure TFileBrowserForm.FormShow(Sender: TObject); begin - if Assigned(FOnLoadLayout) then - FOnLoadLayout(Self); if TV.Selected <> nil then TV.Selected.Expand(False); end; diff --git a/components/filebrowser/idefilebrowser.lpk b/components/filebrowser/idefilebrowser.lpk index 9ea67557c5..3f1ee0cbb4 100644 --- a/components/filebrowser/idefilebrowser.lpk +++ b/components/filebrowser/idefilebrowser.lpk @@ -1,13 +1,19 @@ - + + - + + + + + + @@ -15,28 +21,24 @@ - + - - - - - - + + - - + + - + diff --git a/components/filebrowser/idefilebrowser.pas b/components/filebrowser/idefilebrowser.pas index 899b77f37d..f08d73047b 100644 --- a/components/filebrowser/idefilebrowser.pas +++ b/components/filebrowser/idefilebrowser.pas @@ -1,21 +1,21 @@ -{ This file was automatically created by Lazarus. do not edit! +{ This file was automatically created by Lazarus. Do not edit! This source is only used to compile and install the package. } -unit idefilebrowser; +unit idefilebrowser; interface uses - frmFileBrowser, regidefilebrowser, frmconfigfilebrowser, LazarusPackageIntf; + frmFileBrowser, RegIDEFileBrowser, frmConfigFileBrowser, LazarusPackageIntf; implementation -procedure Register; +procedure Register; begin - RegisterUnit('regidefilebrowser', @regidefilebrowser.Register); -end; + RegisterUnit('RegIDEFileBrowser', @RegIDEFileBrowser.Register); +end; initialization - RegisterPackage('idefilebrowser', @Register); + RegisterPackage('idefilebrowser', @Register); end. diff --git a/components/filebrowser/regidefilebrowser.pp b/components/filebrowser/regidefilebrowser.pp index ee8baeb7c9..153d76bf82 100644 --- a/components/filebrowser/regidefilebrowser.pp +++ b/components/filebrowser/regidefilebrowser.pp @@ -1,29 +1,34 @@ -unit regidefilebrowser; +unit RegIDEFileBrowser; {$mode objfpc}{$H+} interface uses - Classes, - SysUtils, - frmfilebrowser, - frmconfigfilebrowser; + Classes, SysUtils, + LazLogger, + Controls, Forms, + LazIDEIntf, MenuIntf, IDECommands, IDEWindowIntf, BaseIDEIntf, + frmFileBrowser, frmConfigFileBrowser; type + + { TFileBrowserController } + TFileBrowserController = class(TComponent) private FStartDir: TStartDir; FCustomDir: string; - FWindow: TFileBrowserForm; + FWindow: TFileBrowserForm; // same as FileBrowserForm, which one is redundant? FNeedSave: Boolean; - procedure DoLoadLayout(Sender: TObject); + FSplitterPos: integer; procedure DoSelectDir(Sender: TObject); - procedure DoSaveLayout(Sender: TObject); procedure ReadConfig; virtual; + procedure SetSplitterPos(AValue: integer); procedure WriteConfig; virtual; + procedure OnFormClose(Sender: TObject; var {%H-}CloseAction: TCloseAction); protected - procedure CreateWindow; virtual; + procedure CreateWindow(AForm: TFileBrowserForm); virtual; { Called by file browser window } procedure DoOpenFile(Sender: TObject; const AFileName: string); virtual; { Called by file browser window } @@ -31,26 +36,22 @@ type public constructor Create(AOwner: TComponent); override; destructor Destroy; override; - procedure ShowWindow; function ShowConfig: Boolean; procedure Notification(AComponent: TComponent; Operation: TOperation); override; property StartDir: TStartDir read FStartDir write FStartDir; property CustomDir: string read FCustomDir write FCustomDir; + property SplitterPos: integer read FSplitterPos write SetSplitterPos; end; +var + FileBrowserCreator: TIDEWindowCreator; // set by Register procedure + +procedure ShowFileBrowser(Sender: TObject); procedure Register; implementation -uses - Controls, - Forms, - lazideintf, - menuintf, - baseideintf, - idewindowintf; - const SConfigFile = 'idebrowserwin.xml'; KeyStartDir = 'StartDir'; @@ -58,7 +59,6 @@ const KeySplitterPos = 'SplitterPos'; resourcestring - SFileBrowserIDEMenu = 'IDEFileBrowser'; SFileBrowserIDEMenuCaption = 'File Browser'; @@ -70,37 +70,45 @@ begin try FStartDir := TStartDir(GetValue(KeyStartDir, Ord(sdProjectDir))); FCustomDir := GetValue(KeyCustomDir, ''); + FSplitterPos:=GetValue(KeySplitterPos, 150); finally Free; end; end; +procedure TFileBrowserController.SetSplitterPos(AValue: integer); +begin + if FSplitterPos=AValue then Exit; + FSplitterPos:=AValue; + FNeedSave:=true; +end; + procedure TFileBrowserController.WriteConfig; begin with GetIDEConfigStorage(SConfigFile, True) do try - SetValue(KeyStartDir, Ord(FstartDir)); - SetValue(KeyCustomDir, CustomDir); + SetDeleteValue(KeyStartDir, Ord(FStartDir), ord('C')); + SetDeleteValue(KeyCustomDir, CustomDir, ''); + SetDeleteValue(KeySplitterPos, FSplitterPos, 150); FNeedSave := False; finally Free; end; end; -procedure TFileBrowserController.CreateWindow; +procedure TFileBrowserController.CreateWindow(AForm: TFileBrowserForm); var D: string; begin - FWindow := TFileBrowserForm.Create(Self); + FWindow := AForm; FWindow.Caption:=SFileBrowserIDEMenuCaption; FWindow.FreeNotification(Self); FWindow.OnOpenFile := @DoOpenFile; FWindow.OnConfigure := @DoConfig; FWindow.OnSelectDir := @DoSelectDir; - FWindow.OnSaveLayout := @DoSaveLayout; - FWindow.OnLoadLayout := @DoLoadLayout; - IDEDialogLayoutList.ApplyLayout(FWindow); - D := FCustomDir; + FWindow.AddHandlerClose(@OnFormClose); + FWindow.TV.Height:=FSplitterPos; + D := FCustomDir; if (FStartDir = sdProjectDir) and Assigned(LazarusIDE.ActiveProject) then D := ExtractFilePath(LazarusIDE.ActiveProject.ProjectInfoFile); FWindow.Directory := D; @@ -115,18 +123,10 @@ begin LazarusIDE.DoOpenEditorFile(AFileName, 0, 0, Flags); end; -procedure TFileBrowserController.DoLoadLayout(Sender: TObject); +procedure TFileBrowserController.OnFormClose(Sender: TObject; + var CloseAction: TCloseAction); begin - with GetIDEConfigStorage(SConfigFile, True) do - begin - try - FWindow.Top := GetValue('Position/Top', FWindow.Top); - FWindow.Left := GetValue('Position/Left', FWindow.Left); - FWindow.TV.Height := GetValue(KeySplitterPos, FWindow.TV.Height); - finally - Free; - end; - end; + SplitterPos:=FWindow.Splitter1.Top; end; procedure TFileBrowserController.DoSelectDir(Sender: TObject); @@ -138,20 +138,6 @@ begin end; end; -procedure TFileBrowserController.DoSaveLayout(Sender: TObject); -begin - IDEDialogLayoutList.SaveLayout(FWindow); - with GetIDEConfigStorage(SConfigFile, True) do - try - SetValue(KeySplitterPos, FWindow.TV.Height); - SetValue('Position/Top', FWindow.Top); - SetValue('Position/Left', FWindow.Left); - FNeedSave := False; - finally - Free; - end; -end; - procedure TFileBrowserController.DoConfig(Sender: TObject); begin // Maybe later some reconfiguration of FWindow is needed after ShowConfig ? @@ -174,17 +160,6 @@ begin inherited; end; -procedure TFileBrowserController.ShowWindow; -begin - if (FWindow = nil) then - begin - CreateWindow; - FWindow.Show; - end - else - FWindow.BringToFront; -end; - function TFileBrowserController.ShowConfig: Boolean; var F: TFileBrowserConfigForm; @@ -212,19 +187,54 @@ begin end; procedure ShowFileBrowser(Sender: TObject); +begin + IDEWindowCreators.ShowForm(FileBrowserCreator.FormName,true); +end; + +procedure CreateFileBrowser(Sender: TObject; aFormName: string; + var AForm: TCustomForm; DoDisableAutoSizing: boolean); var C: TFileBrowserController; begin - C := Application.FindComponent('IDEFileBrowserController') as TFileBrowserController; + // sanity check to avoid clashing with another package that has registered a window with the same name + if CompareText(aFormName,'FileBrowser')<>0 then begin + DebugLn(['ERROR: CreateFileBrowser: there is already a form with this name']); + exit; + end; + C := LazarusIDE.OwningComponent.FindComponent('IDEFileBrowserController') as TFileBrowserController; if (C = nil) then - C := TFileBrowserController.Create(Application); - C.ShowWindow; + C := TFileBrowserController.Create(LazarusIDE.OwningComponent); + IDEWindowCreators.CreateForm(AForm,TFileBrowserForm,true,C); + AForm.Name:=aFormName; + FileBrowserForm:=AForm as TFileBrowserForm; + C.CreateWindow(FileBrowserForm); + if not DoDisableAutoSizing then + AForm.EnableAutoSizing; end; procedure Register; +var + CmdCatViewMenu: TIDECommandCategory; + ViewFileBrowserCommand: TIDECommand; begin - RegisterIDEMenuCommand(itmViewMainWindows, SFileBrowserIDEMEnu, - SFileBrowserIDEMenuCaption, nil, @ShowFileBrowser, nil, ''); + // search shortcut category + CmdCatViewMenu:=IDECommandList.FindCategoryByName(CommandCategoryViewName); + // register shortcut + ViewFileBrowserCommand:=RegisterIDECommand(CmdCatViewMenu, + 'ViewFileBrowser',SFileBrowserIDEMenuCaption, + CleanIDEShortCut,nil,@ShowFileBrowser); + // register menu item in View menu + RegisterIDEMenuCommand(itmViewMainWindows, + ViewFileBrowserCommand.Name, + SFileBrowserIDEMenuCaption, nil, nil, ViewFileBrowserCommand); + + // register dockable Window + FileBrowserCreator:=IDEWindowCreators.Add( + 'FileBrowser', + @CreateFileBrowser,nil, + '200','100','400','400' // default place at left=200, top=100, right=400, bottom=400 + // you can also define percentage values of screen or relative positions, see wiki + ); end; end.