{ ***************************************************************************** * * * 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 NewWidthnil 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.