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);
Inc(I);
end;
Modified:=false;
finally
XMLConfig.Free;
end;

View File

@ -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;

View File

@ -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;