mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-05-13 00:53:08 +02:00
351 lines
9.4 KiB
ObjectPascal
351 lines
9.4 KiB
ObjectPascal
{
|
|
*****************************************************************************
|
|
* *
|
|
* See the file COPYING.modifiedLGPL, included in this distribution, *
|
|
* for details about the copyright. *
|
|
* *
|
|
* This program is distributed in the hope that it will be useful, *
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
|
|
* *
|
|
*****************************************************************************
|
|
|
|
Author: Mattias Gaertner
|
|
|
|
Abstract:
|
|
Provides general classes and methods to access and handle IDE dialogs and
|
|
windows.
|
|
}
|
|
unit IDEWindowIntf;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, LazConfigStorage, Forms, Controls;
|
|
|
|
//----------------------------------------------------------------------------
|
|
// layout settings of modal forms (dialogs) in the IDE
|
|
type
|
|
|
|
TIDEDialogLayoutList = class;
|
|
|
|
{ TIDEDialogLayout }
|
|
|
|
TIDEDialogLayout = class
|
|
private
|
|
FHeight: integer;
|
|
FList: TIDEDialogLayoutList;
|
|
FModified: boolean;
|
|
FName: string;
|
|
FWidth: integer;
|
|
procedure SetHeight(const AValue: integer);
|
|
procedure SetList(const AValue: TIDEDialogLayoutList);
|
|
procedure SetModified(const AValue: boolean);
|
|
procedure SetWidth(const AValue: integer);
|
|
public
|
|
constructor Create(const TheName: string; TheList: TIDEDialogLayoutList);
|
|
function SizeValid: boolean;
|
|
property Width: integer read FWidth write SetWidth;
|
|
property Height: integer read FHeight write SetHeight;
|
|
property Name: string read FName;
|
|
procedure LoadFromConfig(Config: TConfigStorage; const Path: string);
|
|
procedure SaveToConfig(Config: TConfigStorage; const Path: string);
|
|
property List: TIDEDialogLayoutList read FList write SetList;
|
|
property Modified: boolean read FModified write SetModified;
|
|
end;
|
|
TIDEDialogLayoutClass = class of TIDEDialogLayout;
|
|
|
|
{ TIDEDialogLayoutList }
|
|
|
|
TIDEDialogLayoutList = class
|
|
private
|
|
FItemClass: TIDEDialogLayoutClass;
|
|
FItems: TList;
|
|
FModified: boolean;
|
|
function GetItems(Index: integer): TIDEDialogLayout;
|
|
protected
|
|
procedure SetModified(const AValue: boolean); virtual;
|
|
public
|
|
constructor Create;
|
|
destructor Destroy; override;
|
|
procedure ApplyLayout(ADialog: TControl;
|
|
DefaultWidth, DefaultHeight: integer;
|
|
UseAsMin: boolean = true);
|
|
procedure ApplyLayout(ADialog: TControl);
|
|
procedure SaveLayout(ADialog: TControl);
|
|
procedure Clear;
|
|
function Count: integer;
|
|
function Find(const DialogName: string;
|
|
CreateIfNotExists: boolean): TIDEDialogLayout;
|
|
function Find(ADialog: TObject;
|
|
CreateIfNotExists: boolean): TIDEDialogLayout;
|
|
function IndexOf(const DialogName: string): integer;
|
|
procedure LoadFromConfig(Config: TConfigStorage; const Path: string);
|
|
procedure SaveToConfig(Config: TConfigStorage; const Path: string);
|
|
property Items[Index: integer]: TIDEDialogLayout read GetItems;
|
|
property Modified: boolean read FModified write SetModified;
|
|
property ItemClass: TIDEDialogLayoutClass read FItemClass write FItemClass;
|
|
end;
|
|
|
|
{ TIDEDialogLayoutStorage }
|
|
|
|
TIDEDialogLayoutStorage = class(TComponent)
|
|
protected
|
|
procedure OnCreateForm(Sender: TObject);
|
|
procedure OnCloseForm(Sender: TObject; var CloseAction: TCloseAction);
|
|
public
|
|
constructor Create(TheOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
end;
|
|
|
|
var
|
|
IDEDialogLayoutList: TIDEDialogLayoutList = nil;// set by the IDE
|
|
|
|
procedure Register;
|
|
|
|
implementation
|
|
|
|
procedure Register;
|
|
begin
|
|
RegisterComponents('Misc',[TIDEDialogLayoutStorage]);
|
|
end;
|
|
|
|
{ TIDEDialogLayout }
|
|
|
|
procedure TIDEDialogLayout.SetHeight(const AValue: integer);
|
|
begin
|
|
if FHeight=AValue then exit;
|
|
FHeight:=AValue;
|
|
Modified:=true;
|
|
end;
|
|
|
|
procedure TIDEDialogLayout.SetList(const AValue: TIDEDialogLayoutList);
|
|
begin
|
|
if FList=AValue then exit;
|
|
FList:=AValue;
|
|
if (List<>nil) and Modified then List.Modified:=true;
|
|
end;
|
|
|
|
procedure TIDEDialogLayout.SetModified(const AValue: boolean);
|
|
begin
|
|
FModified:=AValue;
|
|
if FModified and (FList<>nil) then FList.Modified:=true;
|
|
end;
|
|
|
|
procedure TIDEDialogLayout.SetWidth(const AValue: integer);
|
|
begin
|
|
if FWidth=AValue then exit;
|
|
FWidth:=AValue;
|
|
Modified:=true;
|
|
end;
|
|
|
|
constructor TIDEDialogLayout.Create(const TheName: string;
|
|
TheList: TIDEDialogLayoutList);
|
|
begin
|
|
FName:=TheName;
|
|
FList:=TheList;
|
|
end;
|
|
|
|
function TIDEDialogLayout.SizeValid: boolean;
|
|
begin
|
|
Result:=(Width>10) and (Height>10);
|
|
end;
|
|
|
|
procedure TIDEDialogLayout.LoadFromConfig(Config: TConfigStorage;
|
|
const Path: string);
|
|
begin
|
|
FName:=Config.GetValue(Path+'Name/Value','');
|
|
FWidth:=Config.GetValue(Path+'Size/Width',0);
|
|
FHeight:=Config.GetValue(Path+'Size/Height',0);
|
|
Modified:=false;
|
|
end;
|
|
|
|
procedure TIDEDialogLayout.SaveToConfig(Config: TConfigStorage;
|
|
const Path: string);
|
|
begin
|
|
Config.SetValue(Path+'Name/Value',Name);
|
|
Config.SetValue(Path+'Size/Width',Width);
|
|
Config.SetValue(Path+'Size/Height',Height);
|
|
Modified:=false;
|
|
end;
|
|
|
|
{ TIDEDialogLayoutList }
|
|
|
|
function TIDEDialogLayoutList.GetItems(Index: integer): TIDEDialogLayout;
|
|
begin
|
|
Result:=TIDEDialogLayout(FItems[Index]);
|
|
end;
|
|
|
|
procedure TIDEDialogLayoutList.SetModified(const AValue: boolean);
|
|
begin
|
|
if FModified=AValue then exit;
|
|
FModified:=AValue;
|
|
end;
|
|
|
|
constructor TIDEDialogLayoutList.Create;
|
|
begin
|
|
inherited Create;
|
|
FItems:=TList.Create;
|
|
FItemClass:=TIDEDialogLayout;
|
|
end;
|
|
|
|
destructor TIDEDialogLayoutList.Destroy;
|
|
begin
|
|
Clear;
|
|
FreeAndNil(FItems);
|
|
inherited Destroy;
|
|
end;
|
|
|
|
procedure TIDEDialogLayoutList.ApplyLayout(ADialog: TControl;
|
|
DefaultWidth, DefaultHeight: integer; UseAsMin: boolean);
|
|
var
|
|
ALayout: TIDEDialogLayout;
|
|
NewWidth, NewHeight: integer;
|
|
begin
|
|
if (ADialog=nil) or (Self=nil) then exit;
|
|
ALayout:=Find(ADialog,true);
|
|
if ALayout.SizeValid then begin
|
|
NewWidth:=ALayout.Width;
|
|
NewHeight:=ALayout.Height;
|
|
end else begin
|
|
NewWidth:=DefaultWidth;
|
|
NewHeight:=DefaultHeight;
|
|
end;
|
|
if UseAsMin then begin
|
|
if NewWidth<DefaultWidth then NewWidth:=DefaultWidth;
|
|
if NewHeight<DefaultHeight then NewHeight:=DefaultHeight;
|
|
end;
|
|
ADialog.SetBounds(ADialog.Left,ADialog.Top,NewWidth,NewHeight);
|
|
end;
|
|
|
|
procedure TIDEDialogLayoutList.ApplyLayout(ADialog: TControl);
|
|
begin
|
|
ApplyLayout(ADialog,ADialog.Width,ADialog.Height);
|
|
end;
|
|
|
|
procedure TIDEDialogLayoutList.SaveLayout(ADialog: TControl);
|
|
var
|
|
ALayout: TIDEDialogLayout;
|
|
begin
|
|
if (ADialog=nil) or (Self=nil) then exit;
|
|
ALayout:=Find(ADialog,true);
|
|
ALayout.Width:=ADialog.Width;
|
|
ALayout.Height:=ADialog.Height;
|
|
end;
|
|
|
|
procedure TIDEDialogLayoutList.Clear;
|
|
var i: integer;
|
|
begin
|
|
for i:=0 to FItems.Count-1 do
|
|
Items[i].Free;
|
|
FItems.Clear;
|
|
end;
|
|
|
|
function TIDEDialogLayoutList.Count: integer;
|
|
begin
|
|
Result:=FItems.Count;
|
|
end;
|
|
|
|
function TIDEDialogLayoutList.Find(const DialogName: string;
|
|
CreateIfNotExists: boolean): TIDEDialogLayout;
|
|
var i: integer;
|
|
begin
|
|
i:=IndexOf(DialogName);
|
|
if (i<0) then begin
|
|
if CreateIfNotExists then begin
|
|
Result:=FItemClass.Create(DialogName,Self);
|
|
FItems.Add(Result);
|
|
end else begin
|
|
Result:=nil;
|
|
end;
|
|
end else begin
|
|
Result:=Items[i];
|
|
end;
|
|
end;
|
|
|
|
function TIDEDialogLayoutList.Find(ADialog: TObject; CreateIfNotExists: boolean
|
|
): TIDEDialogLayout;
|
|
begin
|
|
if ADialog<>nil then begin
|
|
Result:=Find(ADialog.ClassName,CreateIfNotExists);
|
|
end else begin
|
|
Result:=nil;
|
|
end;
|
|
end;
|
|
|
|
function TIDEDialogLayoutList.IndexOf(const DialogName: string): integer;
|
|
begin
|
|
Result:=Count-1;
|
|
while (Result>=0) and (CompareText(DialogName,Items[Result].Name)<>0) do
|
|
dec(Result);
|
|
end;
|
|
|
|
procedure TIDEDialogLayoutList.LoadFromConfig(Config: TConfigStorage;
|
|
const Path: string);
|
|
var
|
|
NewCount, i: integer;
|
|
NewDialogLayout: TIDEDialogLayout;
|
|
begin
|
|
Clear;
|
|
NewCount:=Config.GetValue(Path+'Count',0);
|
|
for i:=0 to NewCount-1 do begin
|
|
NewDialogLayout:=FItemClass.Create('',Self);
|
|
FItems.Add(NewDialogLayout);
|
|
NewDialogLayout.LoadFromConfig(Config,Path+'Dialog'+IntToStr(i+1)+'/');
|
|
end;
|
|
Modified:=false;
|
|
end;
|
|
|
|
procedure TIDEDialogLayoutList.SaveToConfig(Config: TConfigStorage;
|
|
const Path: string);
|
|
var i: integer;
|
|
begin
|
|
Config.SetDeleteValue(Path+'Count',Count,0);
|
|
for i:=0 to Count-1 do
|
|
Items[i].SaveToConfig(Config,Path+'Dialog'+IntToStr(i+1)+'/');
|
|
Modified:=false;
|
|
end;
|
|
|
|
{ TIDEDialogLayoutStorage }
|
|
|
|
procedure TIDEDialogLayoutStorage.OnCreateForm(Sender: TObject);
|
|
begin
|
|
if Sender=nil then ;
|
|
IDEDialogLayoutList.ApplyLayout(Sender as TControl);
|
|
end;
|
|
|
|
procedure TIDEDialogLayoutStorage.OnCloseForm(Sender: TObject;
|
|
var CloseAction: TCloseAction);
|
|
begin
|
|
if Sender=nil then ;
|
|
IDEDialogLayoutList.SaveLayout(Sender as TControl);
|
|
end;
|
|
|
|
constructor TIDEDialogLayoutStorage.Create(TheOwner: TComponent);
|
|
var
|
|
Form: TCustomForm;
|
|
begin
|
|
inherited Create(TheOwner);
|
|
if Owner is TCustomForm then begin
|
|
Form:=TCustomForm(Owner);
|
|
Form.AddHandlerCreate(@OnCreateForm);
|
|
Form.AddHandlerClose(@OnCloseForm);
|
|
end;
|
|
end;
|
|
|
|
destructor TIDEDialogLayoutStorage.Destroy;
|
|
var
|
|
Form: TCustomForm;
|
|
begin
|
|
if Owner is TCustomForm then begin
|
|
Form:=TCustomForm(Owner);
|
|
Form.RemoveAllHandlersOfObject(Self);
|
|
end;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
end.
|
|
|