lazarus/components/filebrowser/regidefilebrowser.pp

231 lines
5.4 KiB
ObjectPascal

unit regidefilebrowser;
{$mode objfpc}{$H+}
interface
uses
Classes,
SysUtils,
frmfilebrowser,
frmconfigfilebrowser;
type
TFileBrowserController = class(TComponent)
private
FStartDir: TStartDir;
FCustomDir: string;
FWindow: TFileBrowserForm;
FNeedSave: Boolean;
procedure DoLoadLayout(Sender: TObject);
procedure DoSelectDir(Sender: TObject);
procedure DoSaveLayout(Sender: TObject);
procedure ReadConfig; virtual;
procedure WriteConfig; virtual;
protected
procedure CreateWindow; virtual;
{ Called by file browser window }
procedure DoOpenFile(Sender: TObject; const AFileName: string); virtual;
{ Called by file browser window }
procedure DoConfig(Sender: TObject);
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;
end;
procedure Register;
implementation
uses
Controls,
Forms,
lazideintf,
menuintf,
baseideintf,
idewindowintf;
const
SConfigFile = 'idebrowserwin.xml';
KeyStartDir = 'StartDir';
KeyCustomDir = 'CustomDir';
KeySplitterPos = 'SplitterPos';
resourcestring
SFileBrowserIDEMenu = 'IDEFileBrowser';
SFileBrowserIDEMenuCaption = 'File Browser window';
{ TFileBrowserController }
procedure TFileBrowserController.ReadConfig;
begin
with GetIDEConfigStorage(SConfigFile, True) do
try
FStartDir := TStartDir(GetValue(KeyStartDir, Ord(sdProjectDir)));
FCustomDir := GetValue(KeyCustomDir, '');
finally
Free;
end;
end;
procedure TFileBrowserController.WriteConfig;
begin
with GetIDEConfigStorage(SConfigFile, True) do
try
SetValue(KeyStartDir, Ord(FstartDir));
SetValue(KeyCustomDir, CustomDir);
FNeedSave := False;
finally
Free;
end;
end;
procedure TFileBrowserController.CreateWindow;
var
D: string;
begin
FWindow := TFileBrowserForm.Create(Self);
FWindow.FreeNotification(Self);
FWindow.OnOpenFile := @DoOpenFile;
FWindow.OnConfigure := @DoConfig;
FWindow.OnSelectDir := @DoSelectDir;
FWindow.OnSaveLayout := @DoSaveLayout;
FWindow.OnLoadLayout := @DoLoadLayout;
IDEDialogLayoutList.ApplyLayout(FWindow);
D := FCustomDir;
if (FStartDir = sdProjectDir) and Assigned(LazarusIDE.ActiveProject) then
D := ExtractFilePath(LazarusIDE.ActiveProject.ProjectInfoFile);
FWindow.Directory := D;
end;
procedure TFileBrowserController.DoOpenFile(Sender: TObject; const AFileName: string);
var
Flags: TOpenFlags;
begin
// Set up as desired. Maybe create config settings;
Flags := [ofOnlyIfExists, ofAddToRecent, ofUseCache];
LazarusIDE.DoOpenEditorFile(AFileName, 0, 0, Flags);
end;
procedure TFileBrowserController.DoLoadLayout(Sender: TObject);
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;
end;
procedure TFileBrowserController.DoSelectDir(Sender: TObject);
begin
if FStartDir = sdLastOpened then
begin
FCustomDir := FWindow.Directory;
FNeedSave := True;
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 ?
if ShowConfig then
WriteConfig;
end;
constructor TFileBrowserController.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ReadConfig;
end;
destructor TFileBrowserController.Destroy;
begin
if FNeedSave then
WriteConfig;
if Assigned(FWindow) then
FreeAndNil(FWindow);
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;
begin
F := TFileBrowserConfigForm.Create(Self);
try
F.CustomDir := Self.FCustomDir;
F.StartDir := Self.StartDir;
Result := F.ShowModal = mrOk;
if Result then
begin
FCustomDir := F.CustomDir;
FStartDir := F.StartDir;
end;
finally
F.Free;
end;
end;
procedure TFileBrowserController.Notification(AComponent: TComponent; Operation: TOperation);
begin
inherited;
if (AComponent = FWindow) and (opRemove = Operation) then
FWindow := nil;
end;
procedure ShowFileBrowser(Sender: TObject);
var
C: TFileBrowserController;
begin
C := Application.FindComponent('IDEFileBrowserController') as TFileBrowserController;
if (C = nil) then
C := TFileBrowserController.Create(Application);
C.ShowWindow;
end;
procedure Register;
begin
RegisterIDEMenuCommand(itmViewMainWindows, SFileBrowserIDEMEnu,
SFileBrowserIDEMenuCaption, nil, @ShowFileBrowser, nil, '');
end;
end.