project groups: save as: rebase TreeView nodes

git-svn-id: trunk@50376 -
This commit is contained in:
mattias 2015-11-17 23:24:37 +00:00
parent d87fdc7823
commit 0351081414
3 changed files with 184 additions and 82 deletions

View File

@ -42,8 +42,8 @@ type
function GetProjectGroup: TProjectGroup; override; function GetProjectGroup: TProjectGroup; override;
function PerformAction(AAction: TPGTargetAction): TPGActionResult; override; function PerformAction(AAction: TPGTargetAction): TPGActionResult; override;
public public
procedure LoadTarget; procedure LoadTarget; virtual;
procedure UnLoadTarget; procedure UnLoadTarget; virtual;
end; end;
// 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
@ -56,6 +56,8 @@ type
procedure SetTargetType(AValue: TPGTargetType); override; procedure SetTargetType(AValue: TPGTargetType); override;
public public
constructor Create(AProjectGroup: TProjectGroup); constructor Create(AProjectGroup: TProjectGroup);
procedure LoadTarget; override;
procedure UnLoadTarget; override;
end; end;
TTargetEvent = procedure(Sender: TObject; Target: TPGCompileTarget) of object; TTargetEvent = procedure(Sender: TObject; Target: TPGCompileTarget) of object;
@ -432,8 +434,10 @@ begin
F.Filter:=lisLazarusProjectGroup+'|*.lpg|'+lisAllFiles+'|'+AllFilesMask; F.Filter:=lisLazarusProjectGroup+'|*.lpg|'+lisAllFiles+'|'+AllFilesMask;
F.DefaultExt:='.lpg'; F.DefaultExt:='.lpg';
Result:=F.Execute; Result:=F.Execute;
if Result then if Result then begin
FProjectGroup.FileName:=TrimAndExpandFilename(FileName); FProjectGroup.FileName:=TrimAndExpandFilename(FileName);
end;
StoreIDEFileDialog(F); StoreIDEFileDialog(F);
finally finally
F.Free; F.Free;
@ -483,19 +487,30 @@ begin
inherited SetTargetType(AValue); inherited SetTargetType(AValue);
end; end;
Constructor TProjectGroupTarget.Create(AProjectGroup: TProjectGroup); constructor TProjectGroupTarget.Create(AProjectGroup: TProjectGroup);
begin begin
FTarget:=AProjectGroup; FTarget:=AProjectGroup;
TargetType:=ttProjectGroup; TargetType:=ttProjectGroup;
end; end;
procedure TProjectGroupTarget.LoadTarget;
begin
end;
procedure TProjectGroupTarget.UnLoadTarget;
begin
end;
{ TIDEProjectGroup } { TIDEProjectGroup }
procedure TIDEProjectGroup.SetFileName(AValue: String); procedure TIDEProjectGroup.SetFileName(AValue: String);
begin begin
if FileName=AValue then Exit; if FileName=AValue then Exit;
debugln(['TIDEProjectGroup.SetFileName Old=',Filename,' New=',AValue]);
inherited SetFileName(AValue); inherited SetFileName(AValue);
IncreaseChangeStamp; debugln(['TIDEProjectGroup.SetFileName Now=',Filename]);
if Assigned(FOnFileNameChange) then if Assigned(FOnFileNameChange) then
FOnFileNameChange(Self); FOnFileNameChange(Self);
end; end;
@ -612,7 +627,7 @@ begin
TargetFileName:=XMLConfig.GetValue(Format(ARoot+'/Targets/Target%d/FileName',[i]),''); TargetFileName:=XMLConfig.GetValue(Format(ARoot+'/Targets/Target%d/FileName',[i]),'');
TargetFileName:=TrimFilename(SetDirSeparators(TargetFileName)); TargetFileName:=TrimFilename(SetDirSeparators(TargetFileName));
if not FilenameIsAbsolute(TargetFileName) then if not FilenameIsAbsolute(TargetFileName) then
TargetFileName:=BaseDir+TargetFileName; TargetFileName:=TrimFilename(BaseDir+TargetFileName);
If (TargetFileName<>'') and FileExistsCached(TargetFileName) then begin If (TargetFileName<>'') and FileExistsCached(TargetFileName) then begin
Target:=AddTarget(TargetFileName); Target:=AddTarget(TargetFileName);
(Target as TIDECompileTarget).LoadTarget; (Target as TIDECompileTarget).LoadTarget;

View File

@ -142,8 +142,10 @@ 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(AProjectGroup: TProjectGroup; NodeType: TNodeType; AFileName: String): String;
function DisplayFileName(NodeData: TNodeData): string;
function CreateNode(AParent: TTreeNode; Const ACaption: String; ANodeType: TNodeType; ANodeData: TPGCompileTarget; AProjectGroup: TProjectGroup): TTreeNode; function CreateNode(AParent: TTreeNode; Const ACaption: String; ANodeType: TNodeType; ANodeData: TPGCompileTarget; AProjectGroup: TProjectGroup): TTreeNode;
function CreateNode(AParent: TTreeNode; ANodeType: TNodeType; ANodeData: TPGCompileTarget; AProjectGroup: TProjectGroup): TTreeNode;
procedure FillPackageNode(AParent: TTreeNode; AProjectGroup: TProjectGroup; T: TPGCompileTarget); procedure FillPackageNode(AParent: TTreeNode; AProjectGroup: TProjectGroup; T: TPGCompileTarget);
procedure FillProjectNode(AParent: TTreeNode; AProjectGroup: TProjectGroup; T: TPGCompileTarget); procedure FillProjectNode(AParent: TTreeNode; AProjectGroup: TProjectGroup; T: TPGCompileTarget);
procedure FillTargetNode(AParent: TTreeNode; AProjectGroup: TProjectGroup; T: TPGCompileTarget); procedure FillTargetNode(AParent: TTreeNode; AProjectGroup: TProjectGroup; T: TPGCompileTarget);
@ -174,6 +176,8 @@ procedure CreateProjectGroupEditor(Sender: TObject; aFormName: string;
var AForm: TCustomForm; DoDisableAutoSizing: boolean); var AForm: TCustomForm; DoDisableAutoSizing: boolean);
procedure SetProjectGroupEditorCallBack; procedure SetProjectGroupEditorCallBack;
function dbgs(NodeType: TNodeType): string; overload;
implementation implementation
{$R *.lfm} {$R *.lfm}
@ -250,6 +254,11 @@ begin
OnShowProjectGroupEditor:=@ShowProjectGroupEditor; OnShowProjectGroupEditor:=@ShowProjectGroupEditor;
end; end;
function dbgs(NodeType: TNodeType): string;
begin
str(NodeType,Result);
end;
{ TProjectGroupEditorForm } { TProjectGroupEditorForm }
procedure TProjectGroupEditorForm.ClearEventCallBacks(AProjectGroup: TProjectGroup); procedure TProjectGroupEditorForm.ClearEventCallBacks(AProjectGroup: TProjectGroup);
@ -423,11 +432,32 @@ begin
end; end;
procedure TProjectGroupEditorForm.DoFileNameChange(Sender: TObject); procedure TProjectGroupEditorForm.DoFileNameChange(Sender: TObject);
var
TVNode: TTreeNode;
NodeData: TNodeData;
begin begin
ShowFileName; ShowFileName;
// ToDo: update nodes
debugln(['TProjectGroupEditorForm.DoFileNameChange START']);
TVPG.BeginUpdate;
TVNode:=TVPG.Items.GetFirstNode;
while TVNode<>nil do begin
NodeData:=TNodeData(TVNode.Data);
debugln(['TProjectGroupEditorForm.DoFileNameChange AAA1 NodeData=',DbgSName(NodeData),' Text=',TVNode.Text]);
if NodeData is TNodeData then begin
debugln(['TProjectGroupEditorForm.DoFileNameChange AAA2 NodeType=',dbgs(NodeData.NodeType),' PGFile=',NodeData.ProjectGroup.Filename,' ',NodeData.Target<>nil]);
if NodeData.Target<>nil then begin
debugln(['TProjectGroupEditorForm.DoFileNameChange AAA3 TargetFile=',NodeData.Target.Filename]);
TVNode.Text:=DisplayFileName(NodeData);
end;
end;
TVNode:=TVNode.GetNext;
end;
TVPG.EndUpdate;
end; end;
procedure TProjectGroupEditorForm.UpdateIDEMenuCommandFromAction(Sender: TObject; Item: TIDEMenuCommand); procedure TProjectGroupEditorForm.UpdateIDEMenuCommandFromAction(
Sender: TObject; Item: TIDEMenuCommand);
begin begin
Item.Enabled:=(Sender as TAction).Enabled; Item.Enabled:=(Sender as TAction).Enabled;
Item.Visible:=(Sender as TAction).Visible; Item.Visible:=(Sender as TAction).Visible;
@ -497,7 +527,7 @@ begin
PG:=Sender as TProjectGroup; PG:=Sender as TProjectGroup;
(Target as TIDECompileTarget).LoadTarget; (Target as TIDECompileTarget).LoadTarget;
// ToDo: use of FTargetNodes is wrong if PG<>FProjectGroup // ToDo: use of FTargetNodes is wrong if PG<>FProjectGroup
N:=CreateNode(FTargetNodes[False],DisplayFileName(PG,ntTarget,Target.Filename),ntTarget,Target,PG); N:=CreateNode(FTargetNodes[False],ntTarget,Target,PG);
FillTargetNode(N,PG,Target); FillTargetNode(N,PG,Target);
TVPG.Selected:=N; TVPG.Selected:=N;
UpdateStatusBarTargetCount; UpdateStatusBarTargetCount;
@ -513,7 +543,7 @@ begin
N:=FindNodeFromTarget(Target); N:=FindNodeFromTarget(Target);
TVPG.Items.Delete(N); TVPG.Items.Delete(N);
// MVC TOD: The use of FTargetNodes is not correct when PG<>FProjectGroup // MVC TOD: The use of FTargetNodes is not correct when PG<>FProjectGroup
CreateNode(FTargetNodes[True],DisplayFileName(PG,ntRemovedTarget,Target.Filename),ntRemovedTarget,Target,PG); CreateNode(FTargetNodes[True],ntRemovedTarget,Target,PG);
TVPG.Selected:=FNPG; TVPG.Selected:=FNPG;
UpdateStatusBarTargetCount; UpdateStatusBarTargetCount;
end; end;
@ -828,22 +858,57 @@ begin
ConfigNode(Result,'',ND); ConfigNode(Result,'',ND);
end; end;
function TProjectGroupEditorForm.DisplayFileName(AProjectGroup: TProjectGroup;NodeType: TNodeType; AFileName: String): String; function TProjectGroupEditorForm.CreateNode(AParent: TTreeNode;
ANodeType: TNodeType; ANodeData: TPGCompileTarget;
AProjectGroup: TProjectGroup): TTreeNode;
var
ND: TNodeData;
begin
ND:=TNodeData.Create;
ND.NodeType:=ANodeType;
ND.ProjectGroup:=AProjectGroup;
ND.Target:=ANodeData;
Result:=TVPG.Items.AddChild(AParent,DisplayFileName(ND));
end;
function TProjectGroupEditorForm.DisplayFileName(AProjectGroup: TProjectGroup;
NodeType: TNodeType; AFileName: String): String;
Var Var
P: String; PGBaseDir: String;
begin begin
if Assigned(AProjectGroup) then if Assigned(AProjectGroup) then
P:=ExtractFilePath(AProjectGroup.FileName) PGBaseDir:=ExtractFilePath(AProjectGroup.FileName)
else
P:='';
if (P<>'') then
Result:=ExtractRelativePath(P,AFileName)
else else
PGBaseDir:='';
if (PGBaseDir<>'') then begin
//if CompareFilenames(PGBaseDir,AFileName)=0 then
// exit(ExtractFileName(aFilename));
Result:=ExtractRelativePath(PGBaseDir,AFileName);
debugln(['TProjectGroupEditorForm.DisplayFileName PGBaseDir="',PGBaseDir,'" File="',AFileName,'" "',Result,'"']);
end else
Result:=AFileName; Result:=AFileName;
if not (NodeType in [ntFile, ntRemovedFile]) then if not (NodeType in [ntFile, ntRemovedFile]) then
Result:=ChangeFileExt(Result,''); Result:=ChangeFileExt(Result,'');
end; end;
function TProjectGroupEditorForm.DisplayFileName(NodeData: TNodeData): string;
var
aFilename: String;
begin
if NodeData.Target=nil then
aFilename:=''
else begin
aFilename:=NodeData.Target.Filename;
if (aFilename='') then begin
if NodeData.Target is TProjectGroupTarget then
aFilename:=NodeData.ProjectGroup.FileName
else
aFilename:='?';
end;
end;
Result:=DisplayFileName(NodeData.ProjectGroup,NodeData.NodeType,aFilename);
end;
procedure TProjectGroupEditorForm.ShowFileName; procedure TProjectGroupEditorForm.ShowFileName;
Var Var
N: String; N: String;
@ -880,27 +945,32 @@ procedure TProjectGroupEditorForm.ShowProjectGroup;
Var Var
N: TTreeNode; N: TTreeNode;
begin begin
ShowFileName; // Needs FNPG TVPG.BeginUpdate;
FreeNodeData; try
TVPG.Items.Clear; ShowFileName; // Needs FNPG
FTargetNodes[False]:=Nil; FreeNodeData;
FTargetNodes[True]:=Nil; TVPG.Items.Clear;
if FProjectGroup<>nil then begin FTargetNodes[False]:=Nil;
FNPG:=CreateNode(Nil, FTargetNodes[True]:=Nil;
DisplayFileName(FProjectGroup,ntProjectGroup,FProjectGroup.FileName), if FProjectGroup<>nil then begin
ntProjectGroup,FProjectGroupTarget,FProjectGroup); FNPG:=CreateNode(Nil,
FillProjectGroupNode(FNPG,FProjectGroup,FTargetNodes); DisplayFileName(FProjectGroup,ntProjectGroup,FProjectGroup.FileName),
N:=FindNodeFromTarget(FActiveTarget); ntProjectGroup,FProjectGroupTarget,FProjectGroup);
if (N=Nil) then FillProjectGroupNode(FNPG,FProjectGroup,FTargetNodes);
begin N:=FindNodeFromTarget(FActiveTarget);
FActiveTarget:=FProjectGroupTarget; if (N=Nil) then
TVPG.Selected:=FNPG; begin
end else FActiveTarget:=FProjectGroupTarget;
TVPG.Selected:=N; TVPG.Selected:=FNPG;
end else begin end else
FNPG:=nil; TVPG.Selected:=N;
end else begin
FNPG:=nil;
end;
UpdateStatusBarTargetCount;
finally
TVPG.EndUpdate;
end; end;
UpdateStatusBarTargetCount;
end; end;
procedure TProjectGroupEditorForm.UpdateShowing; procedure TProjectGroupEditorForm.UpdateShowing;
@ -919,30 +989,30 @@ Var
TTN,TN: TTreeNode; TTN,TN: TTreeNode;
I: Integer; I: Integer;
begin begin
TTN:=CreateNode(AParent,lisNodeTargets,ntTargets,Nil,AProjectGroup); TVPG.BeginUpdate;
TargetNodes[False]:=TTN; try
TargetNodes[True]:=CreateNode(AParent,lisNodeRemovedTargets,ntTargets,Nil,AProjectGroup); TTN:=CreateNode(AParent,lisNodeTargets,ntTargets,Nil,AProjectGroup);
// 2 Passes: one to show all nodes, one to fill them with target-specific data. TargetNodes[False]:=TTN;
// Display all nodes TargetNodes[True]:=CreateNode(AParent,lisNodeRemovedTargets,ntTargets,Nil,AProjectGroup);
For I:=0 to AProjectGroup.TargetCount-1 do // 2 Passes: one to show all nodes, one to fill them with target-specific data.
begin // Display all nodes
T:=AProjectGroup.Targets[i]; For I:=0 to AProjectGroup.TargetCount-1 do
TN:=CreateNode(TargetNodes[T.Removed],DisplayFileName(AProjectGroup,TNT[T.Removed],T.FileName),TNT[T.Removed],T,AProjectGroup); begin
end; T:=AProjectGroup.Targets[i];
// Fill all nodes. TN:=CreateNode(TargetNodes[T.Removed],TNT[T.Removed],T,AProjectGroup);
For I:=0 to TTN.Count-1 do
begin
TN:=TTN.Items[i];
try
FillTargetNode(TN,AProjectGroup,TargetFromNode(TN));
except
On E: Exception do
Application.ShowException(E);
end; end;
// Fill all nodes.
For I:=0 to TTN.Count-1 do
begin
TN:=TTN.Items[i];
FillTargetNode(TN,AProjectGroup,TargetFromNode(TN));
end;
AParent.Expand(False);
TargetNodes[False].Expand(False);
TargetNodes[True].Expand(False);
finally
TVPG.EndUpdate;
end; end;
AParent.Expand(False);
TargetNodes[False].Expand(False);
TargetNodes[True].Expand(False);
end; end;
procedure TProjectGroupEditorForm.ShowDependencies(AParent: TTreeNode; procedure TProjectGroupEditorForm.ShowDependencies(AParent: TTreeNode;
@ -971,14 +1041,19 @@ Var
PF,PD: TTargetNodes; PF,PD: TTargetNodes;
I: Integer; I: Integer;
begin begin
PF[False]:=CreateNode(AParent,lisNodeFiles,ntFiles,Nil,AProjectGroup); TVPG.BeginUpdate;
PF[True]:=CreateNode(AParent,lisNodeRemovedFiles,ntFiles,Nil,AProjectGroup); try
// TODO Ideally, we can show removed files PF[False]:=CreateNode(AParent,lisNodeFiles,ntFiles,Nil,AProjectGroup);
For I:=0 to T.FileCount-1 do PF[True]:=CreateNode(AParent,lisNodeRemovedFiles,ntFiles,Nil,AProjectGroup);
CreateNode(PF[False],DisplayFileName(AProjectGroup, // TODO Ideally, we can show removed files
ntFile,T.Files[i]),ntFile,Nil,AProjectGroup); For I:=0 to T.FileCount-1 do
ShowDependencies(AParent,AProjectGroup,T,PD); CreateNode(PF[False],DisplayFileName(AProjectGroup,
// TODO: Build mode info Not available ? ntFile,T.Files[i]),ntFile,Nil,AProjectGroup);
ShowDependencies(AParent,AProjectGroup,T,PD);
// TODO: Build mode info Not available ?
finally
TVPG.EndUpdate;
end;
end; end;
procedure TProjectGroupEditorForm.FillPackageNode(AParent: TTreeNode; procedure TProjectGroupEditorForm.FillPackageNode(AParent: TTreeNode;
@ -987,13 +1062,18 @@ Var
PF,PD: TTargetNodes; PF,PD: TTargetNodes;
I: Integer; I: Integer;
begin begin
PF[False]:=CreateNode(AParent,lisNodeFiles,ntFiles,Nil,AProjectGroup); TVPG.BeginUpdate;
PF[True]:=CreateNode(AParent,lisNodeRemovedFiles,ntFiles,Nil,AProjectGroup); try
// ToDo Ideally, we can show removed files PF[False]:=CreateNode(AParent,lisNodeFiles,ntFiles,Nil,AProjectGroup);
For I:=0 to T.FileCount-1 do PF[True]:=CreateNode(AParent,lisNodeRemovedFiles,ntFiles,Nil,AProjectGroup);
CreateNode(PF[False],DisplayFileName(AProjectGroup, // ToDo Ideally, we can show removed files
ntFile,T.Files[i]),ntFile,Nil,AProjectGroup); For I:=0 to T.FileCount-1 do
ShowDependencies(AParent,AProjectGroup,T,PD); CreateNode(PF[False],DisplayFileName(AProjectGroup,
ntFile,T.Files[i]),ntFile,Nil,AProjectGroup);
ShowDependencies(AParent,AProjectGroup,T,PD);
finally
TVPG.EndUpdate;
end;
end; end;
procedure TProjectGroupEditorForm.FillTargetNode(AParent: TTreeNode; procedure TProjectGroupEditorForm.FillTargetNode(AParent: TTreeNode;
@ -1001,14 +1081,19 @@ procedure TProjectGroupEditorForm.FillTargetNode(AParent: TTreeNode;
Var Var
PN: TTargetNodes; PN: TTargetNodes;
begin begin
If T=Nil then TVPG.BeginUpdate;
T:=TargetFromNode(AParent); try
if T=Nil then If T=Nil then
exit; T:=TargetFromNode(AParent);
Case T.TargetType of if T=Nil then
ttProject: FillProjectNode(AParent,AProjectGroup,T); exit;
ttPackage: FillPackageNode(AParent,AProjectGroup,T); Case T.TargetType of
ttProjectGroup: FillProjectgroupNode(AParent,T.ProjectGroup,PN); ttProject: FillProjectNode(AParent,AProjectGroup,T);
ttPackage: FillPackageNode(AParent,AProjectGroup,T);
ttProjectGroup: FillProjectgroupNode(AParent,T.ProjectGroup,PN);
end;
finally
TVPG.EndUpdate;
end; end;
end; end;

View File

@ -219,6 +219,7 @@ end;
procedure TProjectGroup.SetActiveTarget(AValue: TPGCompileTarget); procedure TProjectGroup.SetActiveTarget(AValue: TPGCompileTarget);
begin begin
ActivateTarget(AValue); ActivateTarget(AValue);
IncreaseChangeStamp;
end; end;
procedure TProjectGroup.SetModified(AValue: Boolean); procedure TProjectGroup.SetModified(AValue: Boolean);
@ -233,6 +234,7 @@ procedure TProjectGroup.SetFileName(AValue: String);
begin begin
if FFileName=AValue then Exit; if FFileName=AValue then Exit;
FFileName:=AValue; FFileName:=AValue;
IncreaseChangeStamp;
end; end;
function TProjectGroup.GetModified: Boolean; function TProjectGroup.GetModified: Boolean;