From f29d2f8b352cf037a9d0f0d3fab00fa2d4d824d7 Mon Sep 17 00:00:00 2001 From: mattias Date: Tue, 17 Nov 2015 23:40:01 +0000 Subject: [PATCH] project groups: fixed new project group git-svn-id: trunk@50378 - --- components/projectgroups/projectgroup.pp | 1 + .../projectgroups/projectgroupeditor.pas | 45 ++++++++----- components/projectgroups/projectgroupintf.pp | 63 ++++++++++++++++++- 3 files changed, 91 insertions(+), 18 deletions(-) diff --git a/components/projectgroups/projectgroup.pp b/components/projectgroups/projectgroup.pp index 54e6e064ea..fe098e4ac0 100644 --- a/components/projectgroups/projectgroup.pp +++ b/components/projectgroups/projectgroup.pp @@ -667,6 +667,7 @@ begin ActivateTarget(Target); Inc(I); end; + Modified:=false; finally XMLConfig.Free; end; diff --git a/components/projectgroups/projectgroupeditor.pas b/components/projectgroups/projectgroupeditor.pas index 62bcaa64df..438467b6e5 100644 --- a/components/projectgroups/projectgroupeditor.pas +++ b/components/projectgroups/projectgroupeditor.pas @@ -1,5 +1,6 @@ { Todo: + - show * when modified - close windows on IDE close - activate project when project is opened - deactivate project when project is closed @@ -112,7 +113,7 @@ type procedure ATargetLaterUpdate(Sender: TObject); procedure ATargetUninstallExecute(Sender: TObject); procedure ATargetUninstallUpdate(Sender: TObject); - procedure DoFileNameChange(Sender: TObject); + procedure OnProjectGroupFileNameChanged(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure TVPGDblClick(Sender: TObject); @@ -125,10 +126,11 @@ type // Project group callbacks procedure ConfigNode(Node: TTreeNode; Const ACaption: String; ANodeData: TNodeData); - procedure DoTargetAdded(Sender: TObject; Target: TPGCompileTarget); - procedure DoTargetDeleted(Sender: TObject; Target: TPGCompileTarget); - procedure DoTargetActivated(Sender: TObject; Target: TPGCompileTarget); - procedure DoTargetExchanged(Sender: TObject; Target1, Target2: TPGCompileTarget); + procedure OnProjectGroupDestroy(Sender: TObject); + procedure OnTargetAdded(Sender: TObject; Target: TPGCompileTarget); + procedure OnTargetDeleted(Sender: TObject; Target: TPGCompileTarget); + procedure OnTargetActivated(Sender: TObject; Target: TPGCompileTarget); + procedure OnTargetExchanged(Sender: TObject; Target1, Target2: TPGCompileTarget); function AllowPerform(ATargetAction: TPGTargetAction; AAction: TAction= Nil): Boolean; procedure ClearEventCallBacks(AProjectGroup: TProjectGroup); procedure SetEventCallBacks(AProjectGroup: TProjectGroup); @@ -269,6 +271,7 @@ begin PG:=TIDEProjectGroup(AProjectGroup) else exit; + PG.RemoveAllHandlersOfObject(Self); PG.OnFileNameChange:=Nil; PG.OnTargetAdded:=Nil; PG.OnTargetDeleted:=Nil; @@ -280,15 +283,16 @@ procedure TProjectGroupEditorForm.SetEventCallBacks(AProjectGroup: TProjectGroup Var PG: TIDEProjectGroup; begin - if AProjectGroup is TIDEProjectGroup then + if AProjectGroup is TIDEProjectGroup then PG:=TIDEProjectGroup(AProjectGroup) else exit; - PG.OnFileNameChange:=@DoFileNameChange; - PG.OnTargetAdded:=@DoTargetAdded; - PG.OnTargetDeleted:=@DoTargetDeleted; - PG.OnTargetActivated:=@DoTargetActivated; - PG.OnTargetsExchanged:=@DoTargetExchanged; + PG.AddHandlerOnDestroy(@OnProjectGroupDestroy); + PG.OnFileNameChange:=@OnProjectGroupFileNameChanged; + PG.OnTargetAdded:=@OnTargetAdded; + PG.OnTargetDeleted:=@OnTargetDeleted; + PG.OnTargetActivated:=@OnTargetActivated; + PG.OnTargetsExchanged:=@OnTargetExchanged; end; procedure TProjectGroupEditorForm.SetProjectGroup(AValue: TProjectGroup); @@ -432,7 +436,7 @@ begin UpdateIDEMenuCommandFromAction(Sender,cmdTargetUninstall); end; -procedure TProjectGroupEditorForm.DoFileNameChange(Sender: TObject); +procedure TProjectGroupEditorForm.OnProjectGroupFileNameChanged(Sender: TObject); var TVNode: TTreeNode; NodeData: TNodeData; @@ -515,11 +519,11 @@ begin begin ND.ProjectGroup.ActivateTarget(ND.Target); if (ND.ProjectGroup<>FProjectGroup) then // No callback, fake it. - DoTargetActivated(ND.ProjectGroup,ND.Target); + OnTargetActivated(ND.ProjectGroup,ND.Target); end; end; -procedure TProjectGroupEditorForm.DoTargetAdded(Sender: TObject; +procedure TProjectGroupEditorForm.OnTargetAdded(Sender: TObject; Target: TPGCompileTarget); Var PG: TProjectGroup; @@ -534,7 +538,7 @@ begin UpdateStatusBarTargetCount; end; -procedure TProjectGroupEditorForm.DoTargetDeleted(Sender: TObject; +procedure TProjectGroupEditorForm.OnTargetDeleted(Sender: TObject; Target: TPGCompileTarget); Var PG: TProjectGroup; @@ -549,7 +553,7 @@ begin UpdateStatusBarTargetCount; end; -procedure TProjectGroupEditorForm.DoTargetActivated(Sender: TObject; +procedure TProjectGroupEditorForm.OnTargetActivated(Sender: TObject; Target: TPGCompileTarget); Var NC,NA: TTreeNode; @@ -569,7 +573,7 @@ begin SBPG.Panels[piActiveTarget].Text:=Format(lisActiveTarget,[N]); end; -procedure TProjectGroupEditorForm.DoTargetExchanged(Sender: TObject; Target1, +procedure TProjectGroupEditorForm.OnTargetExchanged(Sender: TObject; Target1, Target2: TPGCompileTarget); Var S,N1,N2: TTreeNode; @@ -845,6 +849,13 @@ begin Node.StateIndex:=-1; end; +procedure TProjectGroupEditorForm.OnProjectGroupDestroy(Sender: TObject); +begin + if Sender=FProjectGroup then begin + ProjectGroup:=nil; + end; +end; + function TProjectGroupEditorForm.CreateNode(AParent: TTreeNode; const ACaption: String; ANodeType: TNodeType; ANodeData: TPGCompileTarget; AProjectGroup: TProjectGroup): TTreeNode; diff --git a/components/projectgroups/projectgroupintf.pp b/components/projectgroups/projectgroupintf.pp index 8e2d5f92db..39a67013e3 100644 --- a/components/projectgroups/projectgroupintf.pp +++ b/components/projectgroups/projectgroupintf.pp @@ -8,7 +8,7 @@ interface uses Classes, SysUtils, IDEOptionsIntf, PackageIntf, ProjectIntf, LazFileUtils, - LazFileCache; + LazFileCache, LazMethodList; Type TPGTargetType = ( @@ -81,10 +81,15 @@ Type property RequiredPackageCount: integer read GetRequiredPackageCount; end; + TProjectGroupHandler = ( + pghDestroy + ); + { TProjectGroup } TProjectGroup = class(TPersistent) private + FHandlers: array[TProjectGroupHandler] of TMethodList; FChangeStamp: int64; FFileName: String; FLastSavedChangeStamp: int64; @@ -98,7 +103,14 @@ Type function GetTarget(Index: Integer): TPGCompileTarget; virtual; abstract; function GetRemovedTargetCount: Integer; virtual; abstract; function GetRemovedTarget(Index: Integer): TPGCompileTarget; virtual; abstract; + procedure DoCallNotifyHandler(HandlerType: TProjectGroupHandler; + Sender: TObject); overload; + procedure AddHandler(HandlerType: TProjectGroupHandler; + const AMethod: TMethod; AsLast: boolean = false); + procedure RemoveHandler(HandlerType: TProjectGroupHandler; + const AMethod: TMethod); public + destructor Destroy; override; function Perform(Index: Integer; AAction: TPGTargetAction): TPGActionResult; function Perform(Const AFileName: String; AAction: TPGTargetAction): TPGActionResult; function Perform(Target: TPGCompileTarget; AAction: TPGTargetAction): TPGActionResult; virtual; @@ -125,6 +137,10 @@ Type property ActiveTarget: TPGCompileTarget Read GetActiveTarget Write SetActiveTarget; property Modified: Boolean Read GetModified write SetModified; property ChangeStamp: int64 read FChangeStamp; + // handlers + procedure RemoveAllHandlersOfObject(AnObject: TObject); + procedure AddHandlerOnDestroy(const OnDestroy: TNotifyEvent; AsLast: boolean = false); + procedure RemoveHandlerOnDestroy(const OnDestroy: TNotifyEvent); end; TProjectGroupLoadOption = ( @@ -242,6 +258,32 @@ begin Result:=FLastSavedChangeStamp<>FChangeStamp; end; +procedure TProjectGroup.DoCallNotifyHandler(HandlerType: TProjectGroupHandler; + Sender: TObject); +begin + FHandlers[HandlerType].CallNotifyEvents(Sender); +end; + +procedure TProjectGroup.AddHandler(HandlerType: TProjectGroupHandler; + const AMethod: TMethod; AsLast: boolean); +begin + if FHandlers[HandlerType]=nil then + FHandlers[HandlerType]:=TMethodList.Create; + FHandlers[HandlerType].Add(AMethod,AsLast); +end; + +procedure TProjectGroup.RemoveHandler(HandlerType: TProjectGroupHandler; + const AMethod: TMethod); +begin + FHandlers[HandlerType].Remove(AMethod); +end; + +destructor TProjectGroup.Destroy; +begin + DoCallNotifyHandler(pghDestroy,Self); + inherited Destroy; +end; + function TProjectGroup.Perform(Index: Integer; AAction: TPGTargetAction ): TPGActionResult; begin @@ -345,6 +387,25 @@ begin LUIncreaseChangeStamp64(FChangeStamp); end; +procedure TProjectGroup.RemoveAllHandlersOfObject(AnObject: TObject); +var + HandlerType: TProjectGroupHandler; +begin + for HandlerType in TProjectGroupHandler do + FHandlers[HandlerType].RemoveAllMethodsOfObject(AnObject); +end; + +procedure TProjectGroup.AddHandlerOnDestroy(const OnDestroy: TNotifyEvent; + AsLast: boolean); +begin + AddHandler(pghDestroy,TMethod(OnDestroy),AsLast); +end; + +procedure TProjectGroup.RemoveHandlerOnDestroy(const OnDestroy: TNotifyEvent); +begin + RemoveHandler(pghDestroy,TMethod(OnDestroy)); +end; + { TPGCompileTarget } function TPGCompileTarget.GetAllowedActions: TPGTargetActions;