project groups: consistent filename in projectgroup and its target

git-svn-id: trunk@50388 -
This commit is contained in:
mattias 2015-11-18 13:09:37 +00:00
parent 9d10346a71
commit 8fa20c95fa
3 changed files with 213 additions and 149 deletions

View File

@ -46,13 +46,13 @@ type
// Since a project group iself is also a target, we need a target to represent // Since a project group iself is also a target, we need a target to represent
// the root projectgroup. // the root projectgroup.
{ TProjectGroupTarget } { TRootProjectGroupTarget }
TProjectGroupTarget = class(TIDECompileTarget) TRootProjectGroupTarget = class(TIDECompileTarget)
protected protected
procedure SetTargetType(AValue: TPGTargetType); override; procedure SetTargetType(AValue: TPGTargetType); override;
public public
constructor Create(aParent: TPGCompileTarget); constructor Create(aOwner: TProjectGroup);
end; end;
TTargetEvent = procedure(Sender: TObject; Target: TPGCompileTarget) of object; TTargetEvent = procedure(Sender: TObject; Target: TPGCompileTarget) of object;
@ -504,19 +504,21 @@ begin
end; end;
end; end;
{ TProjectGroupTarget } { TRootProjectGroupTarget }
procedure TProjectGroupTarget.SetTargetType(AValue: TPGTargetType); procedure TRootProjectGroupTarget.SetTargetType(AValue: TPGTargetType);
begin begin
if (AValue<>ttProjectGroup) then if (AValue<>ttProjectGroup) then
Raise Exception.Create(lisErronlyProjectGroupAllowed); Raise Exception.Create(lisErronlyProjectGroupAllowed);
inherited SetTargetType(AValue); inherited SetTargetType(AValue);
end; end;
constructor TProjectGroupTarget.Create(aParent: TPGCompileTarget); constructor TRootProjectGroupTarget.Create(aOwner: TProjectGroup);
begin begin
inherited Create(aParent); inherited Create(nil);
TargetType:=ttProjectGroup; TargetType:=ttProjectGroup;
FProjectGroup:=aOwner;
Filename:=ProjectGroup.FileName;
end; end;
{ TIDEProjectGroup } { TIDEProjectGroup }
@ -553,7 +555,7 @@ constructor TIDEProjectGroup.Create(aCompileTarget: TIDECompileTarget);
begin begin
inherited Create; inherited Create;
if aCompileTarget=nil then begin if aCompileTarget=nil then begin
FCompileTarget:=TProjectGroupTarget.Create(nil); FCompileTarget:=TRootProjectGroupTarget.Create(Self);
end else begin end else begin
FCompileTarget:=aCompileTarget; FCompileTarget:=aCompileTarget;
end; end;
@ -773,6 +775,8 @@ end;
procedure TIDECompileTarget.UnLoadTarget; procedure TIDECompileTarget.UnLoadTarget;
begin begin
if FProjectGroup<>nil then
FreeAndNil(FProjectGroup);
if FFiles<>nil then if FFiles<>nil then
FreeAndNil(FFiles); FreeAndNil(FFiles);
if FRequiredPackages<>nil then if FRequiredPackages<>nil then
@ -1002,7 +1006,7 @@ begin
if AAction=taOpen then if AAction=taOpen then
ProjectGroupManager.LoadProjectGroup(FileName,[]) ProjectGroupManager.LoadProjectGroup(FileName,[])
else else
Result:=ProjectGroup.PerformFrom(0,AAction); Result:=ParentProjectGroup.PerformFrom(0,AAction);
end; end;
function TIDECompileTarget.PerformAction(AAction: TPGTargetAction): TPGActionResult; function TIDECompileTarget.PerformAction(AAction: TPGTargetAction): TPGActionResult;

View File

@ -37,8 +37,8 @@ type
TNodeData = class(TObject) TNodeData = class(TObject)
NodeType: TNodeType; NodeType: TNodeType;
Target: TPGCompileTarget; Target, ParentTarget: TPGCompileTarget;
ProjectGroup: TProjectGroup; // projectgroup to which target belongs Value: string; // ntFile = Filename, ntDependency = PkgName
end; end;
TTargetNodes = Array[Boolean] of TTreeNode; TTargetNodes = Array[Boolean] of TTreeNode;
@ -136,7 +136,7 @@ type
procedure SetEventCallBacks(AProjectGroup: TProjectGroup); procedure SetEventCallBacks(AProjectGroup: TProjectGroup);
// Some helpers // Some helpers
procedure SetProjectGroup(AValue: TProjectGroup); procedure SetProjectGroup(AValue: TProjectGroup);
procedure ShowDependencies(AParent: TTreeNode; AProjectGroup: TProjectGroup; T: TPGCompileTarget; Out PD: TTargetNodes); procedure ShowDependencies(AParent: TTreeNode; T: TPGCompileTarget; Out PD: TTargetNodes);
procedure ShowFileName; procedure ShowFileName;
procedure Perform(ATargetAction: TPGTargetAction); procedure Perform(ATargetAction: TPGTargetAction);
function GetActiveTarget: TPGCompileTarget; function GetActiveTarget: TPGCompileTarget;
@ -144,17 +144,20 @@ type
function FindNodeFromTarget(ATarget: TPGCompileTarget): TTreeNode; function FindNodeFromTarget(ATarget: TPGCompileTarget): TTreeNode;
procedure FreeNodeData; procedure FreeNodeData;
class function TargetFromNode(N: TTreeNode): TPGCompileTarget; class function TargetFromNode(N: TTreeNode): TPGCompileTarget;
function DisplayFileName(AProjectGroup: TProjectGroup; NodeType: TNodeType; AFileName: String): String; function DisplayFileName(aTarget: TPGCompileTarget): string;
function DisplayFileName(Node: TTreeNode): string;
function DisplayFileName(NodeData: TNodeData): string; function DisplayFileName(NodeData: TNodeData): string;
function CreateNode(AParent: TTreeNode; Const ACaption: String; ANodeType: TNodeType; ANodeData: TPGCompileTarget; AProjectGroup: TProjectGroup): TTreeNode; function CreateSectionNode(AParent: TTreeNode; Const ACaption: String; ANodeType: TNodeType): TTreeNode;
function CreateNode(AParent: TTreeNode; ANodeType: TNodeType; ANodeData: TPGCompileTarget; AProjectGroup: TProjectGroup): TTreeNode; function CreateTargetNode(AParent: TTreeNode; ANodeType: TNodeType; aTarget: TPGCompileTarget): TTreeNode;
procedure FillPackageNode(AParent: TTreeNode; AProjectGroup: TProjectGroup; T: TPGCompileTarget); function CreateSubNode(AParent: TTreeNode; ANodeType: TNodeType; aParentTarget: TPGCompileTarget; aValue: string): TTreeNode;
procedure FillProjectNode(AParent: TTreeNode; AProjectGroup: TProjectGroup; T: TPGCompileTarget); procedure FillPackageNode(AParent: TTreeNode; T: TPGCompileTarget);
procedure FillTargetNode(AParent: TTreeNode; AProjectGroup: TProjectGroup; T: TPGCompileTarget); procedure FillProjectNode(AParent: TTreeNode; T: TPGCompileTarget);
procedure FillTargetNode(AParent: TTreeNode; T: TPGCompileTarget);
procedure FillProjectGroupNode(AParent: TTreeNode; AProjectGroup: TProjectGroup; Out TargetNodes: TTargetNodes); procedure FillProjectGroupNode(AParent: TTreeNode; AProjectGroup: TProjectGroup; Out TargetNodes: TTargetNodes);
function GetNodeIndex(ANodeType: TNodeType; ANodeData: TPGCompileTarget ): Integer; function GetNodeIndex(ANodeType: TNodeType; ANodeData: TPGCompileTarget ): Integer;
function SelectedNodeData: TNodeData; function SelectedNodeData: TNodeData;
function SelectedTarget: TPGCompileTarget; function SelectedTarget: TPGCompileTarget;
function GetTVNodeFilename(TVNode: TTreeNode): string;
function SelectedNodeType: TPGCompileTarget; function SelectedNodeType: TPGCompileTarget;
procedure UpdateIDEMenuCommandFromAction(Sender: TObject; Item: TIDEMenuCommand); procedure UpdateIDEMenuCommandFromAction(Sender: TObject; Item: TIDEMenuCommand);
procedure UpdateStatusBarTargetCount; procedure UpdateStatusBarTargetCount;
@ -352,31 +355,33 @@ procedure TProjectGroupEditorForm.ATargetEarlierExecute(Sender: TObject);
Var Var
T: TNodeData; T: TNodeData;
I,J: Integer; I,J: Integer;
PG: TProjectGroup;
begin begin
T:=SelectedNodeData; T:=SelectedNodeData;
If not Assigned(T) then if (T=nil) or (T.Target=nil) then
exit; exit;
I:=T.ProjectGroup.IndexOfTarget(T.Target); PG:=T.Target.ParentProjectGroup;
if PG=nil then exit;
I:=PG.IndexOfTarget(T.Target);
J:=I-1; J:=I-1;
if J>=0 then if J>=0 then
T.ProjectGroup.ExchangeTargets(I,J); PG.ExchangeTargets(I,J);
end; end;
procedure TProjectGroupEditorForm.ATargetEarlierUpdate(Sender: TObject); procedure TProjectGroupEditorForm.ATargetEarlierUpdate(Sender: TObject);
Var Var
T: TNodeData; T: TNodeData;
I: Integer; I: Integer;
B: Boolean; PG: TProjectGroup;
begin begin
I:=-1; I:=-1;
T:=SelectedNodeData; T:=SelectedNodeData;
B:=Assigned(T) and (T.NodeType=ntTarget) and Assigned(T.Target); if (T=nil) or (T.Target=nil) then
If B then exit;
begin PG:=T.Target.ParentProjectGroup;
I:=T.ProjectGroup.IndexOfTarget(T.Target)-1; if PG=nil then exit;
B:=(I>=0) I:=PG.IndexOfTarget(T.Target);
end; (Sender as TAction).Enabled:=I>0;
(Sender as TAction).Enabled:=B;
UpdateIDEMenuCommandFromAction(Sender,cmdTargetEarlier); UpdateIDEMenuCommandFromAction(Sender,cmdTargetEarlier);
end; end;
@ -384,30 +389,32 @@ procedure TProjectGroupEditorForm.ATargetLaterExecute(Sender: TObject);
Var Var
T: TNodeData; T: TNodeData;
I,J: Integer; I,J: Integer;
PG: TProjectGroup;
begin begin
T:=SelectedNodeData; T:=SelectedNodeData;
If Not Assigned(T) then if (T=nil) or (T.Target=nil) then
exit; exit;
I:=T.ProjectGroup.IndexOfTarget(T.Target); PG:=T.Target.ParentProjectGroup;
if PG=nil then exit;
I:=PG.IndexOfTarget(T.Target);
J:=I+1; J:=I+1;
if (J<T.ProjectGroup.TargetCount) then if (J<PG.TargetCount) then
T.ProjectGroup.ExchangeTargets(I,J); PG.ExchangeTargets(I,J);
end; end;
procedure TProjectGroupEditorForm.ATargetLaterUpdate(Sender: TObject); procedure TProjectGroupEditorForm.ATargetLaterUpdate(Sender: TObject);
Var Var
T: TNodeData; T: TNodeData;
I: Integer; I: Integer;
B: Boolean; PG: TProjectGroup;
begin begin
T:=SelectedNodeData; T:=SelectedNodeData;
B:=Assigned(T) and (T.NodeType=ntTarget) and Assigned(T.Target); if (T=nil) or (T.Target=nil) then
if B then exit;
begin PG:=T.Target.ParentProjectGroup;
I:=T.ProjectGroup.IndexOfTarget(T.Target)+1; if PG=nil then exit;
B:=(I<T.ProjectGroup.TargetCount); I:=PG.IndexOfTarget(T.Target);
end; (Sender as TAction).Enabled:=I+1<PG.TargetCount;
(Sender as TAction).Enabled:=B;
UpdateIDEMenuCommandFromAction(Sender,cmdTargetLater); UpdateIDEMenuCommandFromAction(Sender,cmdTargetLater);
end; end;
@ -434,7 +441,7 @@ begin
while TVNode<>nil do begin while TVNode<>nil do begin
NodeData:=TNodeData(TVNode.Data); NodeData:=TNodeData(TVNode.Data);
if NodeData is TNodeData then begin if NodeData is TNodeData then begin
if NodeData.Target<>nil then begin if NodeData.NodeType in [ntTarget] then begin
TVNode.Text:=DisplayFileName(NodeData); TVNode.Text:=DisplayFileName(NodeData);
end; end;
end; end;
@ -495,26 +502,45 @@ end;
procedure TProjectGroupEditorForm.TVPGDblClick(Sender: TObject); procedure TProjectGroupEditorForm.TVPGDblClick(Sender: TObject);
Var Var
ND: TNodeData; ND: TNodeData;
aFilename: String;
begin begin
ND:=SelectedNodeData; ND:=SelectedNodeData;
if (ND<>nil) and (ND.NodeType<>ntTarget) then debugln(['TProjectGroupEditorForm.TVPGDblClick ',DbgSName(Sender),' ',TVPG.Selected.Text,' ',ND<>nil]);
if ND=nil then exit;
case ND.NodeType of
ntUnknown: ;
ntProjectGroup: ;
ntTargets: ;
ntRemovedTargets: ;
ntTarget: ;
ntRemovedTarget: ;
ntFiles: ;
ntFile:
begin
aFilename:=GetTVNodeFilename(TVPG.Selected);
debugln(['TProjectGroupEditorForm.TVPGDblClick File=',aFilename]);
if aFilename='' then exit;
LazarusIDE.DoOpenEditorFile(aFilename,-1,-1,[ofAddToRecent]);
end;
ntDependencies: ;
ntDependency: ;
end;
{if (ND<>nil) and (ND.NodeType<>ntTarget) then
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.
OnTargetActivated(ND.ProjectGroup,ND.Target); OnTargetActivated(ND.ProjectGroup,ND.Target);
end; end;}
end; end;
procedure TProjectGroupEditorForm.OnTargetAdded(Sender: TObject; procedure TProjectGroupEditorForm.OnTargetAdded(Sender: TObject;
Target: TPGCompileTarget); Target: TPGCompileTarget);
Var Var
PG: TProjectGroup;
N: TTreeNode; N: TTreeNode;
begin begin
PG:=Sender as TProjectGroup;
// ToDo: use of FTargetNodes is wrong if PG<>FProjectGroup // ToDo: use of FTargetNodes is wrong if PG<>FProjectGroup
N:=CreateNode(FTargetNodes[False],ntTarget,Target,PG); N:=CreateTargetNode(FTargetNodes[False],ntTarget,Target);
FillTargetNode(N,PG,Target); FillTargetNode(N,Target);
TVPG.Selected:=N; TVPG.Selected:=N;
UpdateStatusBarTargetCount; UpdateStatusBarTargetCount;
end; end;
@ -522,14 +548,12 @@ end;
procedure TProjectGroupEditorForm.OnTargetDeleted(Sender: TObject; procedure TProjectGroupEditorForm.OnTargetDeleted(Sender: TObject;
Target: TPGCompileTarget); Target: TPGCompileTarget);
Var Var
PG: TProjectGroup;
N: TTreeNode; N: TTreeNode;
begin begin
PG:=Sender as TProjectGroup;
N:=FindNodeFromTarget(Target); N:=FindNodeFromTarget(Target);
TVPG.Items.Delete(N); TVPG.Items.Delete(N);
// ToDo: The use of FTargetNodes is not correct when PG<>FProjectGroup // ToDo: The use of FTargetNodes is not correct when PG<>FProjectGroup
CreateNode(FTargetNodes[True],ntRemovedTarget,Target,PG); CreateTargetNode(FTargetNodes[True],ntRemovedTarget,Target);
TVPG.Selected:=FProjectGroupTVNode; TVPG.Selected:=FProjectGroupTVNode;
UpdateStatusBarTargetCount; UpdateStatusBarTargetCount;
end; end;
@ -537,20 +561,20 @@ end;
procedure TProjectGroupEditorForm.OnTargetActivated(Sender: TObject; procedure TProjectGroupEditorForm.OnTargetActivated(Sender: TObject;
Target: TPGCompileTarget); Target: TPGCompileTarget);
Var Var
NC,NA: TTreeNode; OldActiveTVNode,NewActiveTVNode: TTreeNode;
N: String; N: String;
begin begin
NC:=FindNodeFromTarget(FActiveTarget); OldActiveTVNode:=FindNodeFromTarget(FActiveTarget);
NA:=FindNodeFromTarget(Target); NewActiveTVNode:=FindNodeFromTarget(Target);
if (NC<>NA) then if (OldActiveTVNode<>NewActiveTVNode) then
begin begin
if Assigned(NC) then if Assigned(OldActiveTVNode) then
NC.StateIndex:=-1; OldActiveTVNode.StateIndex:=-1;
If Assigned(NA) then if Assigned(NewActiveTVNode) then
NA.StateIndex:=NSIActive; NewActiveTVNode.StateIndex:=NSIActive;
FActiveTarget:=Target; FActiveTarget:=Target;
end; end;
N:=DisplayFileName(FProjectGroup,ntTarget,Target.FileName); N:=DisplayFileName(Target);
SBPG.Panels[piActiveTarget].Text:=Format(lisActiveTarget,[N]); SBPG.Panels[piActiveTarget].Text:=Format(lisActiveTarget,[N]);
end; end;
@ -622,12 +646,12 @@ end;
procedure TProjectGroupEditorForm.ATargetActivateExecute(Sender: TObject); procedure TProjectGroupEditorForm.ATargetActivateExecute(Sender: TObject);
Var Var
T: TNodeData; ND: TNodeData;
begin begin
T:=SelectedNodeData; ND:=SelectedNodeData;
if not (Assigned(T) and Assigned(T.Target) and Assigned(T.ProjectGroup)) then if (ND=nil) or (ND.Target=nil) then
exit; exit;
T.ProjectGroup.ActivateTarget(T.Target); ND.Target.ParentProjectGroup.ActivateTarget(ND.Target);
end; end;
procedure TProjectGroupEditorForm.ATargetCompileCleanExecute(Sender: TObject); procedure TProjectGroupEditorForm.ATargetCompileCleanExecute(Sender: TObject);
@ -653,11 +677,11 @@ end;
procedure TProjectGroupEditorForm.Perform(ATargetAction: TPGTargetAction); procedure TProjectGroupEditorForm.Perform(ATargetAction: TPGTargetAction);
Var Var
T: TNodeData; ND: TNodeData;
begin begin
T:=SelectedNodeData; ND:=SelectedNodeData;
if Assigned(T) and Assigned(T.Target) and Assigned(T.ProjectGroup) then if (ND=nil) or (ND.Target=nil) then exit;
T.ProjectGroup.Perform(T.Target,ATargetAction); ND.Target.ParentProjectGroup.Perform(ND.Target,ATargetAction);
end; end;
procedure TProjectGroupEditorForm.ATargetCompileExecute(Sender: TObject); procedure TProjectGroupEditorForm.ATargetCompileExecute(Sender: TObject);
@ -808,6 +832,20 @@ begin
Result:=Nil; Result:=Nil;
end; end;
function TProjectGroupEditorForm.GetTVNodeFilename(TVNode: TTreeNode): string;
var
ND: TNodeData;
begin
Result:='';
if (TVNode=nil) then exit;
ND:=TNodeData(TVNode.Data);
if (ND.Target<>nil) then
exit(ND.Target.Filename);
case ND.NodeType of
ntFile: Result:=ND.Value;
end;
end;
function TProjectGroupEditorForm.SelectedNodeType: TPGCompileTarget; function TProjectGroupEditorForm.SelectedNodeType: TPGCompileTarget;
Var Var
N: TNodeData; N: TNodeData;
@ -840,70 +878,90 @@ begin
end; end;
end; end;
function TProjectGroupEditorForm.CreateNode(AParent: TTreeNode; function TProjectGroupEditorForm.CreateSectionNode(AParent: TTreeNode;
const ACaption: String; ANodeType: TNodeType; ANodeData: TPGCompileTarget; const ACaption: String; ANodeType: TNodeType): TTreeNode;
AProjectGroup: TProjectGroup): TTreeNode;
Var Var
ND: TNodeData; ND: TNodeData;
begin begin
Result:=TVPG.Items.AddChild(AParent,ACaption);
ND:=TNodeData.Create; ND:=TNodeData.Create;
ND.NodeType:=ANodeType; ND.NodeType:=ANodeType;
ND.ProjectGroup:=AProjectGroup; Result:=TVPG.Items.AddChild(AParent,ACaption);
ND.Target:=ANodeData;
InitTVNode(Result,'',ND); InitTVNode(Result,'',ND);
end; end;
function TProjectGroupEditorForm.CreateNode(AParent: TTreeNode; function TProjectGroupEditorForm.CreateTargetNode(AParent: TTreeNode;
ANodeType: TNodeType; ANodeData: TPGCompileTarget; ANodeType: TNodeType; aTarget: TPGCompileTarget): TTreeNode;
AProjectGroup: TProjectGroup): TTreeNode;
var var
ND: TNodeData; ND: TNodeData;
begin begin
ND:=TNodeData.Create; ND:=TNodeData.Create;
ND.NodeType:=ANodeType; ND.NodeType:=ANodeType;
ND.ProjectGroup:=AProjectGroup; ND.Target:=aTarget;
ND.Target:=ANodeData; if aTarget<>nil then
ND.ParentTarget:=aTarget.Parent;
Result:=TVPG.Items.AddChild(AParent,DisplayFileName(ND)); Result:=TVPG.Items.AddChild(AParent,DisplayFileName(ND));
InitTVNode(Result,'',ND); InitTVNode(Result,'',ND);
end; end;
function TProjectGroupEditorForm.DisplayFileName(AProjectGroup: TProjectGroup; function TProjectGroupEditorForm.CreateSubNode(AParent: TTreeNode;
NodeType: TNodeType; AFileName: String): String; ANodeType: TNodeType; aParentTarget: TPGCompileTarget; aValue: string
Var ): TTreeNode;
PGBaseDir: String; var
ND: TNodeData;
aCaption: String;
begin begin
if Assigned(AProjectGroup) then ND:=TNodeData.Create;
PGBaseDir:=ExtractFilePath(AProjectGroup.FileName) ND.NodeType:=ANodeType;
ND.ParentTarget:=aParentTarget;
ND.Value:=aValue;
aCaption:=aValue;
if ANodeType=ntFile then
aCaption:=CreateRelativePath(aCaption,ExtractFilePath(aParentTarget.Filename));
Result:=TVPG.Items.AddChild(AParent,aCaption);
InitTVNode(Result,'',ND);
end;
function TProjectGroupEditorForm.DisplayFileName(aTarget: TPGCompileTarget
): string;
var
BaseDir: String;
begin
Result:='';
if aTarget=nil then exit('?');
if aTarget.Parent<>nil then
BaseDir:=ExtractFilePath(aTarget.Parent.Filename)
else else
PGBaseDir:=''; BaseDir:='';
if (PGBaseDir<>'') then begin Result:=aTarget.Filename;
//if CompareFilenames(PGBaseDir,AFileName)=0 then if Result='' then
// exit(ExtractFileName(aFilename)); Result:='?'
Result:=ExtractRelativePath(PGBaseDir,AFileName); else
//debugln(['TProjectGroupEditorForm.DisplayFileName PGBaseDir="',PGBaseDir,'" File="',AFileName,'" "',Result,'"']); Result:=CreateRelativePath(Result,BaseDir);
end else end;
Result:=AFileName;
if NodeType<>ntFile then function TProjectGroupEditorForm.DisplayFileName(Node: TTreeNode): string;
Result:=ChangeFileExt(Result,''); begin
Result:='';
if (Node=nil) or (Node.Data=nil) then exit;
Result:=DisplayFileName(TNodeData(Node.Data));
end; end;
function TProjectGroupEditorForm.DisplayFileName(NodeData: TNodeData): string; function TProjectGroupEditorForm.DisplayFileName(NodeData: TNodeData): string;
var var
aFilename: String; BaseDir: String;
begin begin
if NodeData.Target=nil then Result:='';
aFilename:='' if NodeData.ParentTarget<>nil then
else begin BaseDir:=ExtractFilePath(NodeData.ParentTarget.Filename)
aFilename:=NodeData.Target.Filename; else
if (aFilename='') then begin BaseDir:='';
if NodeData.Target is TProjectGroupTarget then if NodeData.Target<>nil then
aFilename:=NodeData.ProjectGroup.FileName Result:=NodeData.Target.Filename;
else debugln(['TProjectGroupEditorForm.DisplayFileName ',dbgs(NodeData.NodeType),' BaseDir=',BaseDir,' File=',Result]);
aFilename:='?'; if Result='' then
end; Result:='?'
end; else
Result:=DisplayFileName(NodeData.ProjectGroup,NodeData.NodeType,aFilename); Result:=CreateRelativePath(Result,BaseDir);
end; end;
procedure TProjectGroupEditorForm.ShowFileName; procedure TProjectGroupEditorForm.ShowFileName;
@ -917,25 +975,25 @@ begin
if (N='') then if (N='') then
Caption:=lisNewProjectGroup Caption:=lisNewProjectGroup
else else
Caption:=Format(LisProjectGroup,[DisplayFileName(FprojectGroup,ntProjectGroup,N)]); Caption:=Format(LisProjectGroup,[DisplayFileName(FProjectGroup.CompileTarget)]);
if Assigned(FProjectGroupTVNode) then if Assigned(FProjectGroupTVNode) then
if FProjectGroup<>nil then FProjectGroupTVNode.Text:=DisplayFileName(FProjectGroupTVNode);
FProjectGroupTVNode.Text:=DisplayFileName(FProjectGroup,ntProjectGroup,FProjectGroup.FileName);
end; end;
function TProjectGroupEditorForm.FindNodeFromTarget(ATarget: TPGCompileTarget): TTreeNode; function TProjectGroupEditorForm.FindNodeFromTarget(ATarget: TPGCompileTarget): TTreeNode;
Var Var
I: Integer; I: Integer;
begin begin
I:=0;
Result:=Nil; Result:=Nil;
if ATarget=nil then exit;
I:=0;
While (Result=Nil) and (I<TVPG.Items.Count) do While (Result=Nil) and (I<TVPG.Items.Count) do
begin begin
Result:=TVPG.Items[I]; Result:=TVPG.Items[I];
If Not (Assigned(Result.Data) and (TNodeData(Result.Data).Target=ATarget)) then If Not (Assigned(Result.Data) and (TNodeData(Result.Data).Target=ATarget)) then
Result:=Nil; Result:=Nil;
Inc(I); Inc(I);
end; end;
end; end;
procedure TProjectGroupEditorForm.ShowProjectGroup; procedure TProjectGroupEditorForm.ShowProjectGroup;
@ -950,9 +1008,8 @@ begin
FTargetNodes[False]:=Nil; FTargetNodes[False]:=Nil;
FTargetNodes[True]:=Nil; FTargetNodes[True]:=Nil;
if FProjectGroup<>nil then begin if FProjectGroup<>nil then begin
FProjectGroupTVNode:=CreateNode(Nil, FProjectGroupTVNode:=CreateTargetNode(Nil,
DisplayFileName(FProjectGroup,ntProjectGroup,FProjectGroup.FileName), ntProjectGroup,ProjectGroup.CompileTarget);
ntProjectGroup,ProjectGroup.CompileTarget,FProjectGroup);
FillProjectGroupNode(FProjectGroupTVNode,FProjectGroup,FTargetNodes); FillProjectGroupNode(FProjectGroupTVNode,FProjectGroup,FTargetNodes);
N:=FindNodeFromTarget(FActiveTarget); N:=FindNodeFromTarget(FActiveTarget);
if (N=Nil) then if (N=Nil) then
@ -988,21 +1045,21 @@ Var
begin begin
TVPG.BeginUpdate; TVPG.BeginUpdate;
try try
TTN:=CreateNode(AParent,lisNodeTargets,ntTargets,Nil,AProjectGroup); TTN:=CreateSectionNode(AParent,lisNodeTargets,ntTargets);
TargetNodes[False]:=TTN; TargetNodes[False]:=TTN;
TargetNodes[True]:=CreateNode(AParent,lisNodeRemovedTargets,ntTargets,Nil,AProjectGroup); TargetNodes[True]:=CreateSectionNode(AParent,lisNodeRemovedTargets,ntTargets);
// 2 Passes: one to show all nodes, one to fill them with target-specific data. // 2 Passes: one to show all nodes, one to fill them with target-specific data.
// Display all nodes // Display all nodes
For I:=0 to AProjectGroup.TargetCount-1 do For I:=0 to AProjectGroup.TargetCount-1 do
begin begin
T:=AProjectGroup.Targets[i]; T:=AProjectGroup.Targets[i];
TN:=CreateNode(TargetNodes[T.Removed],TNT[T.Removed],T,AProjectGroup); TN:=CreateTargetNode(TargetNodes[T.Removed],TNT[T.Removed],T);
end; end;
// Fill all nodes. // Fill all nodes.
For I:=0 to TTN.Count-1 do For I:=0 to TTN.Count-1 do
begin begin
TN:=TTN.Items[i]; TN:=TTN.Items[i];
FillTargetNode(TN,AProjectGroup,TargetFromNode(TN)); FillTargetNode(TN,TargetFromNode(TN));
end; end;
AParent.Expand(False); AParent.Expand(False);
TargetNodes[False].Expand(False); TargetNodes[False].Expand(False);
@ -1013,40 +1070,38 @@ begin
end; end;
procedure TProjectGroupEditorForm.ShowDependencies(AParent: TTreeNode; procedure TProjectGroupEditorForm.ShowDependencies(AParent: TTreeNode;
AProjectGroup: TProjectGroup; T: TPGCompileTarget; out PD: TTargetNodes); T: TPGCompileTarget; out PD: TTargetNodes);
Var Var
i: Integer; i: Integer;
Pkg: TIDEPackage; Pkg: TIDEPackage;
PkgName: String; PkgName: String;
begin begin
PD[False]:=CreateNode(AParent,lisNodeDependencies,ntDependencies,Nil,AProjectGroup); PD[False]:=CreateSectionNode(AParent,lisNodeDependencies,ntDependencies);
PD[True]:=nil; //CreateNode(AParent,lisNodeRemovedDependencies,ntRemovedDependencies,Nil,AProjectGroup); PD[True]:=nil; //CreateNode(AParent,lisNodeRemovedDependencies,ntRemovedDependencies,Nil,AProjectGroup);
For i:=0 to T.RequiredPackageCount-1 do For i:=0 to T.RequiredPackageCount-1 do
begin begin
PkgName:=T.RequiredPackages[i].PackageName; PkgName:=T.RequiredPackages[i].PackageName;
Pkg:=PackageEditingInterface.FindPackageWithName(PkgName); Pkg:=PackageEditingInterface.FindPackageWithName(PkgName);
if Pkg<>nil then begin if Pkg<>nil then
CreateNode(PD[False],Pkg.Name,ntDependency,Nil,AProjectGroup); PkgName:=Pkg.Name;
end else begin CreateSubNode(PD[False],ntDependency,T,Pkg.Name);
CreateNode(PD[False],PKgName,ntDependency,Nil,AProjectGroup);
end;
end; end;
end; end;
procedure TProjectGroupEditorForm.FillProjectNode(AParent: TTreeNode; AProjectGroup: TProjectGroup; T: TPGCompileTarget); procedure TProjectGroupEditorForm.FillProjectNode(AParent: TTreeNode;
T: TPGCompileTarget);
Var Var
PF,PD: TTargetNodes; PF,PD: TTargetNodes;
I: Integer; i: Integer;
begin begin
TVPG.BeginUpdate; TVPG.BeginUpdate;
try try
PF[False]:=CreateNode(AParent,lisNodeFiles,ntFiles,Nil,AProjectGroup); PF[False]:=CreateSectionNode(AParent,lisNodeFiles,ntFiles);
PF[True]:=nil; //CreateNode(AParent,lisNodeRemovedFiles,ntFiles,Nil,AProjectGroup); PF[True]:=nil; //CreateNode(AParent,lisNodeRemovedFiles,ntFiles,Nil,AProjectGroup);
// TODO Ideally, we can show removed files // TODO Ideally, we can show removed files
For I:=0 to T.FileCount-1 do for i:=0 to T.FileCount-1 do
CreateNode(PF[False],DisplayFileName(AProjectGroup, CreateSubNode(PF[False],ntFile,T,T.Files[i]);
ntFile,T.Files[i]),ntFile,Nil,AProjectGroup); ShowDependencies(AParent,T,PD);
ShowDependencies(AParent,AProjectGroup,T,PD);
// TODO: Build mode info Not available ? // TODO: Build mode info Not available ?
finally finally
TVPG.EndUpdate; TVPG.EndUpdate;
@ -1054,27 +1109,26 @@ begin
end; end;
procedure TProjectGroupEditorForm.FillPackageNode(AParent: TTreeNode; procedure TProjectGroupEditorForm.FillPackageNode(AParent: TTreeNode;
AProjectGroup: TProjectGroup; T: TPGCompileTarget); T: TPGCompileTarget);
Var Var
PF,PD: TTargetNodes; PF,PD: TTargetNodes;
I: Integer; i: Integer;
begin begin
TVPG.BeginUpdate; TVPG.BeginUpdate;
try try
PF[False]:=CreateNode(AParent,lisNodeFiles,ntFiles,Nil,AProjectGroup); PF[False]:=CreateSectionNode(AParent,lisNodeFiles,ntFiles);
PF[True]:=nil; //CreateNode(AParent,lisNodeRemovedFiles,ntFiles,Nil,AProjectGroup); PF[True]:=nil; //CreateNode(AParent,lisNodeRemovedFiles,ntFiles,Nil,AProjectGroup);
// ToDo Ideally, we can show removed files // ToDo Ideally, we can show removed files
For I:=0 to T.FileCount-1 do for i:=0 to T.FileCount-1 do
CreateNode(PF[False],DisplayFileName(AProjectGroup, CreateSubNode(PF[False],ntFile,T,T.Files[i]);
ntFile,T.Files[i]),ntFile,Nil,AProjectGroup); ShowDependencies(AParent,T,PD);
ShowDependencies(AParent,AProjectGroup,T,PD);
finally finally
TVPG.EndUpdate; TVPG.EndUpdate;
end; end;
end; end;
procedure TProjectGroupEditorForm.FillTargetNode(AParent: TTreeNode; procedure TProjectGroupEditorForm.FillTargetNode(AParent: TTreeNode;
AProjectGroup: TProjectGroup; T: TPGCompileTarget); T: TPGCompileTarget);
Var Var
PN: TTargetNodes; PN: TTargetNodes;
begin begin
@ -1085,9 +1139,9 @@ begin
if T=Nil then if T=Nil then
exit; exit;
Case T.TargetType of Case T.TargetType of
ttProject: FillProjectNode(AParent,AProjectGroup,T); ttProject: FillProjectNode(AParent,T);
ttPackage: FillPackageNode(AParent,AProjectGroup,T); ttPackage: FillPackageNode(AParent,T);
ttProjectGroup: FillProjectgroupNode(AParent,T.ProjectGroup,PN); ttProjectGroup: FillProjectgroupNode(AParent,T.ParentProjectGroup,PN);
end; end;
finally finally
TVPG.EndUpdate; TVPG.EndUpdate;

View File

@ -54,6 +54,7 @@ Type
FRemoved: boolean; FRemoved: boolean;
protected protected
FParent: TPGCompileTarget; FParent: TPGCompileTarget;
FParentProjectGroup: TProjectGroup;
FProjectGroup: TProjectGroup; FProjectGroup: TProjectGroup;
function GetAllowedActions: TPGTargetActions; virtual; // By default, return all allowed actions for target type. function GetAllowedActions: TPGTargetActions; virtual; // By default, return all allowed actions for target type.
function GetFileCount: integer; virtual; abstract; function GetFileCount: integer; virtual; abstract;
@ -77,7 +78,8 @@ Type
// Currently allowed actions. // Currently allowed actions.
property AllowedActions: TPGTargetActions Read GetAllowedActions; property AllowedActions: TPGTargetActions Read GetAllowedActions;
// //
property ProjectGroup: TProjectGroup Read FProjectGroup; // set if TargetType is ttProjectGroup property ParentProjectGroup: TProjectGroup Read FParentProjectGroup;
property ProjectGroup: TProjectGroup read FProjectGroup; // set if TargetType is ttProjectGroup
property Files[Index: integer]: string read GetFiles; property Files[Index: integer]: string read GetFiles;
property FileCount: integer read GetFileCount; property FileCount: integer read GetFileCount;
property RequiredPackages[Index: integer]: TPGDependency read GetRequiredPackages; property RequiredPackages[Index: integer]: TPGDependency read GetRequiredPackages;
@ -264,6 +266,8 @@ begin
if FFileName=AValue then Exit; if FFileName=AValue then Exit;
FFileName:=AValue; FFileName:=AValue;
IncreaseChangeStamp; IncreaseChangeStamp;
if CompileTarget<>nil then
CompileTarget.Filename:=Filename;
end; end;
function TProjectGroup.GetModified: Boolean; function TProjectGroup.GetModified: Boolean;
@ -442,6 +446,8 @@ begin
if FFileName=AValue then Exit; if FFileName=AValue then Exit;
FFileName:=AValue; FFileName:=AValue;
TargetType:=TargetTypeFromExtenstion(ExtractFileExt(AValue)); TargetType:=TargetTypeFromExtenstion(ExtractFileExt(AValue));
if ProjectGroup<>nil then
ProjectGroup.FileName:=Filename;
end; end;
procedure TPGCompileTarget.SetRemoved(const AValue: boolean); procedure TPGCompileTarget.SetRemoved(const AValue: boolean);