project groups: fixed new project group

git-svn-id: trunk@50378 -
This commit is contained in:
mattias 2015-11-17 23:40:01 +00:00
parent b4330dfd9e
commit f29d2f8b35
3 changed files with 91 additions and 18 deletions

View File

@ -667,6 +667,7 @@ begin
ActivateTarget(Target); ActivateTarget(Target);
Inc(I); Inc(I);
end; end;
Modified:=false;
finally finally
XMLConfig.Free; XMLConfig.Free;
end; end;

View File

@ -1,5 +1,6 @@
{ {
Todo: Todo:
- show * when modified
- close windows on IDE close - close windows on IDE close
- activate project when project is opened - activate project when project is opened
- deactivate project when project is closed - deactivate project when project is closed
@ -112,7 +113,7 @@ type
procedure ATargetLaterUpdate(Sender: TObject); procedure ATargetLaterUpdate(Sender: TObject);
procedure ATargetUninstallExecute(Sender: TObject); procedure ATargetUninstallExecute(Sender: TObject);
procedure ATargetUninstallUpdate(Sender: TObject); procedure ATargetUninstallUpdate(Sender: TObject);
procedure DoFileNameChange(Sender: TObject); procedure OnProjectGroupFileNameChanged(Sender: TObject);
procedure FormCreate(Sender: TObject); procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject); procedure FormDestroy(Sender: TObject);
procedure TVPGDblClick(Sender: TObject); procedure TVPGDblClick(Sender: TObject);
@ -125,10 +126,11 @@ type
// Project group callbacks // Project group callbacks
procedure ConfigNode(Node: TTreeNode; Const ACaption: String; procedure ConfigNode(Node: TTreeNode; Const ACaption: String;
ANodeData: TNodeData); ANodeData: TNodeData);
procedure DoTargetAdded(Sender: TObject; Target: TPGCompileTarget); procedure OnProjectGroupDestroy(Sender: TObject);
procedure DoTargetDeleted(Sender: TObject; Target: TPGCompileTarget); procedure OnTargetAdded(Sender: TObject; Target: TPGCompileTarget);
procedure DoTargetActivated(Sender: TObject; Target: TPGCompileTarget); procedure OnTargetDeleted(Sender: TObject; Target: TPGCompileTarget);
procedure DoTargetExchanged(Sender: TObject; Target1, Target2: TPGCompileTarget); procedure OnTargetActivated(Sender: TObject; Target: TPGCompileTarget);
procedure OnTargetExchanged(Sender: TObject; Target1, Target2: TPGCompileTarget);
function AllowPerform(ATargetAction: TPGTargetAction; AAction: TAction= Nil): Boolean; function AllowPerform(ATargetAction: TPGTargetAction; AAction: TAction= Nil): Boolean;
procedure ClearEventCallBacks(AProjectGroup: TProjectGroup); procedure ClearEventCallBacks(AProjectGroup: TProjectGroup);
procedure SetEventCallBacks(AProjectGroup: TProjectGroup); procedure SetEventCallBacks(AProjectGroup: TProjectGroup);
@ -269,6 +271,7 @@ begin
PG:=TIDEProjectGroup(AProjectGroup) PG:=TIDEProjectGroup(AProjectGroup)
else else
exit; exit;
PG.RemoveAllHandlersOfObject(Self);
PG.OnFileNameChange:=Nil; PG.OnFileNameChange:=Nil;
PG.OnTargetAdded:=Nil; PG.OnTargetAdded:=Nil;
PG.OnTargetDeleted:=Nil; PG.OnTargetDeleted:=Nil;
@ -280,15 +283,16 @@ procedure TProjectGroupEditorForm.SetEventCallBacks(AProjectGroup: TProjectGroup
Var Var
PG: TIDEProjectGroup; PG: TIDEProjectGroup;
begin begin
if AProjectGroup is TIDEProjectGroup then if AProjectGroup is TIDEProjectGroup then
PG:=TIDEProjectGroup(AProjectGroup) PG:=TIDEProjectGroup(AProjectGroup)
else else
exit; exit;
PG.OnFileNameChange:=@DoFileNameChange; PG.AddHandlerOnDestroy(@OnProjectGroupDestroy);
PG.OnTargetAdded:=@DoTargetAdded; PG.OnFileNameChange:=@OnProjectGroupFileNameChanged;
PG.OnTargetDeleted:=@DoTargetDeleted; PG.OnTargetAdded:=@OnTargetAdded;
PG.OnTargetActivated:=@DoTargetActivated; PG.OnTargetDeleted:=@OnTargetDeleted;
PG.OnTargetsExchanged:=@DoTargetExchanged; PG.OnTargetActivated:=@OnTargetActivated;
PG.OnTargetsExchanged:=@OnTargetExchanged;
end; end;
procedure TProjectGroupEditorForm.SetProjectGroup(AValue: TProjectGroup); procedure TProjectGroupEditorForm.SetProjectGroup(AValue: TProjectGroup);
@ -432,7 +436,7 @@ begin
UpdateIDEMenuCommandFromAction(Sender,cmdTargetUninstall); UpdateIDEMenuCommandFromAction(Sender,cmdTargetUninstall);
end; end;
procedure TProjectGroupEditorForm.DoFileNameChange(Sender: TObject); procedure TProjectGroupEditorForm.OnProjectGroupFileNameChanged(Sender: TObject);
var var
TVNode: TTreeNode; TVNode: TTreeNode;
NodeData: TNodeData; NodeData: TNodeData;
@ -515,11 +519,11 @@ begin
begin begin
ND.ProjectGroup.ActivateTarget(ND.Target); ND.ProjectGroup.ActivateTarget(ND.Target);
if (ND.ProjectGroup<>FProjectGroup) then // No callback, fake it. if (ND.ProjectGroup<>FProjectGroup) then // No callback, fake it.
DoTargetActivated(ND.ProjectGroup,ND.Target); OnTargetActivated(ND.ProjectGroup,ND.Target);
end; end;
end; end;
procedure TProjectGroupEditorForm.DoTargetAdded(Sender: TObject; procedure TProjectGroupEditorForm.OnTargetAdded(Sender: TObject;
Target: TPGCompileTarget); Target: TPGCompileTarget);
Var Var
PG: TProjectGroup; PG: TProjectGroup;
@ -534,7 +538,7 @@ begin
UpdateStatusBarTargetCount; UpdateStatusBarTargetCount;
end; end;
procedure TProjectGroupEditorForm.DoTargetDeleted(Sender: TObject; procedure TProjectGroupEditorForm.OnTargetDeleted(Sender: TObject;
Target: TPGCompileTarget); Target: TPGCompileTarget);
Var Var
PG: TProjectGroup; PG: TProjectGroup;
@ -549,7 +553,7 @@ begin
UpdateStatusBarTargetCount; UpdateStatusBarTargetCount;
end; end;
procedure TProjectGroupEditorForm.DoTargetActivated(Sender: TObject; procedure TProjectGroupEditorForm.OnTargetActivated(Sender: TObject;
Target: TPGCompileTarget); Target: TPGCompileTarget);
Var Var
NC,NA: TTreeNode; NC,NA: TTreeNode;
@ -569,7 +573,7 @@ begin
SBPG.Panels[piActiveTarget].Text:=Format(lisActiveTarget,[N]); SBPG.Panels[piActiveTarget].Text:=Format(lisActiveTarget,[N]);
end; end;
procedure TProjectGroupEditorForm.DoTargetExchanged(Sender: TObject; Target1, procedure TProjectGroupEditorForm.OnTargetExchanged(Sender: TObject; Target1,
Target2: TPGCompileTarget); Target2: TPGCompileTarget);
Var Var
S,N1,N2: TTreeNode; S,N1,N2: TTreeNode;
@ -845,6 +849,13 @@ begin
Node.StateIndex:=-1; Node.StateIndex:=-1;
end; end;
procedure TProjectGroupEditorForm.OnProjectGroupDestroy(Sender: TObject);
begin
if Sender=FProjectGroup then begin
ProjectGroup:=nil;
end;
end;
function TProjectGroupEditorForm.CreateNode(AParent: TTreeNode; function TProjectGroupEditorForm.CreateNode(AParent: TTreeNode;
const ACaption: String; ANodeType: TNodeType; ANodeData: TPGCompileTarget; const ACaption: String; ANodeType: TNodeType; ANodeData: TPGCompileTarget;
AProjectGroup: TProjectGroup): TTreeNode; AProjectGroup: TProjectGroup): TTreeNode;

View File

@ -8,7 +8,7 @@ interface
uses uses
Classes, SysUtils, IDEOptionsIntf, PackageIntf, ProjectIntf, LazFileUtils, Classes, SysUtils, IDEOptionsIntf, PackageIntf, ProjectIntf, LazFileUtils,
LazFileCache; LazFileCache, LazMethodList;
Type Type
TPGTargetType = ( TPGTargetType = (
@ -81,10 +81,15 @@ Type
property RequiredPackageCount: integer read GetRequiredPackageCount; property RequiredPackageCount: integer read GetRequiredPackageCount;
end; end;
TProjectGroupHandler = (
pghDestroy
);
{ TProjectGroup } { TProjectGroup }
TProjectGroup = class(TPersistent) TProjectGroup = class(TPersistent)
private private
FHandlers: array[TProjectGroupHandler] of TMethodList;
FChangeStamp: int64; FChangeStamp: int64;
FFileName: String; FFileName: String;
FLastSavedChangeStamp: int64; FLastSavedChangeStamp: int64;
@ -98,7 +103,14 @@ Type
function GetTarget(Index: Integer): TPGCompileTarget; virtual; abstract; function GetTarget(Index: Integer): TPGCompileTarget; virtual; abstract;
function GetRemovedTargetCount: Integer; virtual; abstract; function GetRemovedTargetCount: Integer; virtual; abstract;
function GetRemovedTarget(Index: Integer): TPGCompileTarget; 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 public
destructor Destroy; override;
function Perform(Index: Integer; AAction: TPGTargetAction): TPGActionResult; function Perform(Index: Integer; AAction: TPGTargetAction): TPGActionResult;
function Perform(Const AFileName: String; AAction: TPGTargetAction): TPGActionResult; function Perform(Const AFileName: String; AAction: TPGTargetAction): TPGActionResult;
function Perform(Target: TPGCompileTarget; AAction: TPGTargetAction): TPGActionResult; virtual; function Perform(Target: TPGCompileTarget; AAction: TPGTargetAction): TPGActionResult; virtual;
@ -125,6 +137,10 @@ Type
property ActiveTarget: TPGCompileTarget Read GetActiveTarget Write SetActiveTarget; property ActiveTarget: TPGCompileTarget Read GetActiveTarget Write SetActiveTarget;
property Modified: Boolean Read GetModified write SetModified; property Modified: Boolean Read GetModified write SetModified;
property ChangeStamp: int64 read FChangeStamp; property ChangeStamp: int64 read FChangeStamp;
// handlers
procedure RemoveAllHandlersOfObject(AnObject: TObject);
procedure AddHandlerOnDestroy(const OnDestroy: TNotifyEvent; AsLast: boolean = false);
procedure RemoveHandlerOnDestroy(const OnDestroy: TNotifyEvent);
end; end;
TProjectGroupLoadOption = ( TProjectGroupLoadOption = (
@ -242,6 +258,32 @@ begin
Result:=FLastSavedChangeStamp<>FChangeStamp; Result:=FLastSavedChangeStamp<>FChangeStamp;
end; 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 function TProjectGroup.Perform(Index: Integer; AAction: TPGTargetAction
): TPGActionResult; ): TPGActionResult;
begin begin
@ -345,6 +387,25 @@ begin
LUIncreaseChangeStamp64(FChangeStamp); LUIncreaseChangeStamp64(FChangeStamp);
end; 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 } { TPGCompileTarget }
function TPGCompileTarget.GetAllowedActions: TPGTargetActions; function TPGCompileTarget.GetAllowedActions: TPGTargetActions;