mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-09-08 11:19:16 +02:00
project groups: save as: rebase TreeView nodes
git-svn-id: trunk@50376 -
This commit is contained in:
parent
d87fdc7823
commit
0351081414
@ -42,8 +42,8 @@ type
|
||||
function GetProjectGroup: TProjectGroup; override;
|
||||
function PerformAction(AAction: TPGTargetAction): TPGActionResult; override;
|
||||
public
|
||||
procedure LoadTarget;
|
||||
procedure UnLoadTarget;
|
||||
procedure LoadTarget; virtual;
|
||||
procedure UnLoadTarget; virtual;
|
||||
end;
|
||||
|
||||
// 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;
|
||||
public
|
||||
constructor Create(AProjectGroup: TProjectGroup);
|
||||
procedure LoadTarget; override;
|
||||
procedure UnLoadTarget; override;
|
||||
end;
|
||||
|
||||
TTargetEvent = procedure(Sender: TObject; Target: TPGCompileTarget) of object;
|
||||
@ -432,8 +434,10 @@ begin
|
||||
F.Filter:=lisLazarusProjectGroup+'|*.lpg|'+lisAllFiles+'|'+AllFilesMask;
|
||||
F.DefaultExt:='.lpg';
|
||||
Result:=F.Execute;
|
||||
if Result then
|
||||
if Result then begin
|
||||
FProjectGroup.FileName:=TrimAndExpandFilename(FileName);
|
||||
|
||||
end;
|
||||
StoreIDEFileDialog(F);
|
||||
finally
|
||||
F.Free;
|
||||
@ -483,19 +487,30 @@ begin
|
||||
inherited SetTargetType(AValue);
|
||||
end;
|
||||
|
||||
Constructor TProjectGroupTarget.Create(AProjectGroup: TProjectGroup);
|
||||
constructor TProjectGroupTarget.Create(AProjectGroup: TProjectGroup);
|
||||
begin
|
||||
FTarget:=AProjectGroup;
|
||||
TargetType:=ttProjectGroup;
|
||||
end;
|
||||
|
||||
procedure TProjectGroupTarget.LoadTarget;
|
||||
begin
|
||||
|
||||
end;
|
||||
|
||||
procedure TProjectGroupTarget.UnLoadTarget;
|
||||
begin
|
||||
|
||||
end;
|
||||
|
||||
{ TIDEProjectGroup }
|
||||
|
||||
procedure TIDEProjectGroup.SetFileName(AValue: String);
|
||||
begin
|
||||
if FileName=AValue then Exit;
|
||||
debugln(['TIDEProjectGroup.SetFileName Old=',Filename,' New=',AValue]);
|
||||
inherited SetFileName(AValue);
|
||||
IncreaseChangeStamp;
|
||||
debugln(['TIDEProjectGroup.SetFileName Now=',Filename]);
|
||||
if Assigned(FOnFileNameChange) then
|
||||
FOnFileNameChange(Self);
|
||||
end;
|
||||
@ -612,7 +627,7 @@ begin
|
||||
TargetFileName:=XMLConfig.GetValue(Format(ARoot+'/Targets/Target%d/FileName',[i]),'');
|
||||
TargetFileName:=TrimFilename(SetDirSeparators(TargetFileName));
|
||||
if not FilenameIsAbsolute(TargetFileName) then
|
||||
TargetFileName:=BaseDir+TargetFileName;
|
||||
TargetFileName:=TrimFilename(BaseDir+TargetFileName);
|
||||
If (TargetFileName<>'') and FileExistsCached(TargetFileName) then begin
|
||||
Target:=AddTarget(TargetFileName);
|
||||
(Target as TIDECompileTarget).LoadTarget;
|
||||
|
@ -142,8 +142,10 @@ type
|
||||
function FindNodeFromTarget(ATarget: TPGCompileTarget): TTreeNode;
|
||||
procedure FreeNodeData;
|
||||
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; ANodeType: TNodeType; ANodeData: TPGCompileTarget; AProjectGroup: TProjectGroup): TTreeNode;
|
||||
procedure FillPackageNode(AParent: TTreeNode; AProjectGroup: TProjectGroup; T: TPGCompileTarget);
|
||||
procedure FillProjectNode(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);
|
||||
procedure SetProjectGroupEditorCallBack;
|
||||
|
||||
function dbgs(NodeType: TNodeType): string; overload;
|
||||
|
||||
implementation
|
||||
|
||||
{$R *.lfm}
|
||||
@ -250,6 +254,11 @@ begin
|
||||
OnShowProjectGroupEditor:=@ShowProjectGroupEditor;
|
||||
end;
|
||||
|
||||
function dbgs(NodeType: TNodeType): string;
|
||||
begin
|
||||
str(NodeType,Result);
|
||||
end;
|
||||
|
||||
{ TProjectGroupEditorForm }
|
||||
|
||||
procedure TProjectGroupEditorForm.ClearEventCallBacks(AProjectGroup: TProjectGroup);
|
||||
@ -423,11 +432,32 @@ begin
|
||||
end;
|
||||
|
||||
procedure TProjectGroupEditorForm.DoFileNameChange(Sender: TObject);
|
||||
var
|
||||
TVNode: TTreeNode;
|
||||
NodeData: TNodeData;
|
||||
begin
|
||||
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;
|
||||
|
||||
procedure TProjectGroupEditorForm.UpdateIDEMenuCommandFromAction(Sender: TObject; Item: TIDEMenuCommand);
|
||||
procedure TProjectGroupEditorForm.UpdateIDEMenuCommandFromAction(
|
||||
Sender: TObject; Item: TIDEMenuCommand);
|
||||
begin
|
||||
Item.Enabled:=(Sender as TAction).Enabled;
|
||||
Item.Visible:=(Sender as TAction).Visible;
|
||||
@ -497,7 +527,7 @@ begin
|
||||
PG:=Sender as TProjectGroup;
|
||||
(Target as TIDECompileTarget).LoadTarget;
|
||||
// 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);
|
||||
TVPG.Selected:=N;
|
||||
UpdateStatusBarTargetCount;
|
||||
@ -513,7 +543,7 @@ begin
|
||||
N:=FindNodeFromTarget(Target);
|
||||
TVPG.Items.Delete(N);
|
||||
// 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;
|
||||
UpdateStatusBarTargetCount;
|
||||
end;
|
||||
@ -828,22 +858,57 @@ begin
|
||||
ConfigNode(Result,'',ND);
|
||||
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
|
||||
P: String;
|
||||
PGBaseDir: String;
|
||||
begin
|
||||
if Assigned(AProjectGroup) then
|
||||
P:=ExtractFilePath(AProjectGroup.FileName)
|
||||
else
|
||||
P:='';
|
||||
if (P<>'') then
|
||||
Result:=ExtractRelativePath(P,AFileName)
|
||||
PGBaseDir:=ExtractFilePath(AProjectGroup.FileName)
|
||||
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;
|
||||
if not (NodeType in [ntFile, ntRemovedFile]) then
|
||||
Result:=ChangeFileExt(Result,'');
|
||||
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;
|
||||
Var
|
||||
N: String;
|
||||
@ -880,27 +945,32 @@ procedure TProjectGroupEditorForm.ShowProjectGroup;
|
||||
Var
|
||||
N: TTreeNode;
|
||||
begin
|
||||
ShowFileName; // Needs FNPG
|
||||
FreeNodeData;
|
||||
TVPG.Items.Clear;
|
||||
FTargetNodes[False]:=Nil;
|
||||
FTargetNodes[True]:=Nil;
|
||||
if FProjectGroup<>nil then begin
|
||||
FNPG:=CreateNode(Nil,
|
||||
DisplayFileName(FProjectGroup,ntProjectGroup,FProjectGroup.FileName),
|
||||
ntProjectGroup,FProjectGroupTarget,FProjectGroup);
|
||||
FillProjectGroupNode(FNPG,FProjectGroup,FTargetNodes);
|
||||
N:=FindNodeFromTarget(FActiveTarget);
|
||||
if (N=Nil) then
|
||||
begin
|
||||
FActiveTarget:=FProjectGroupTarget;
|
||||
TVPG.Selected:=FNPG;
|
||||
end else
|
||||
TVPG.Selected:=N;
|
||||
end else begin
|
||||
FNPG:=nil;
|
||||
TVPG.BeginUpdate;
|
||||
try
|
||||
ShowFileName; // Needs FNPG
|
||||
FreeNodeData;
|
||||
TVPG.Items.Clear;
|
||||
FTargetNodes[False]:=Nil;
|
||||
FTargetNodes[True]:=Nil;
|
||||
if FProjectGroup<>nil then begin
|
||||
FNPG:=CreateNode(Nil,
|
||||
DisplayFileName(FProjectGroup,ntProjectGroup,FProjectGroup.FileName),
|
||||
ntProjectGroup,FProjectGroupTarget,FProjectGroup);
|
||||
FillProjectGroupNode(FNPG,FProjectGroup,FTargetNodes);
|
||||
N:=FindNodeFromTarget(FActiveTarget);
|
||||
if (N=Nil) then
|
||||
begin
|
||||
FActiveTarget:=FProjectGroupTarget;
|
||||
TVPG.Selected:=FNPG;
|
||||
end else
|
||||
TVPG.Selected:=N;
|
||||
end else begin
|
||||
FNPG:=nil;
|
||||
end;
|
||||
UpdateStatusBarTargetCount;
|
||||
finally
|
||||
TVPG.EndUpdate;
|
||||
end;
|
||||
UpdateStatusBarTargetCount;
|
||||
end;
|
||||
|
||||
procedure TProjectGroupEditorForm.UpdateShowing;
|
||||
@ -919,30 +989,30 @@ Var
|
||||
TTN,TN: TTreeNode;
|
||||
I: Integer;
|
||||
begin
|
||||
TTN:=CreateNode(AParent,lisNodeTargets,ntTargets,Nil,AProjectGroup);
|
||||
TargetNodes[False]:=TTN;
|
||||
TargetNodes[True]:=CreateNode(AParent,lisNodeRemovedTargets,ntTargets,Nil,AProjectGroup);
|
||||
// 2 Passes: one to show all nodes, one to fill them with target-specific data.
|
||||
// Display all nodes
|
||||
For I:=0 to AProjectGroup.TargetCount-1 do
|
||||
begin
|
||||
T:=AProjectGroup.Targets[i];
|
||||
TN:=CreateNode(TargetNodes[T.Removed],DisplayFileName(AProjectGroup,TNT[T.Removed],T.FileName),TNT[T.Removed],T,AProjectGroup);
|
||||
end;
|
||||
// Fill all nodes.
|
||||
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);
|
||||
TVPG.BeginUpdate;
|
||||
try
|
||||
TTN:=CreateNode(AParent,lisNodeTargets,ntTargets,Nil,AProjectGroup);
|
||||
TargetNodes[False]:=TTN;
|
||||
TargetNodes[True]:=CreateNode(AParent,lisNodeRemovedTargets,ntTargets,Nil,AProjectGroup);
|
||||
// 2 Passes: one to show all nodes, one to fill them with target-specific data.
|
||||
// Display all nodes
|
||||
For I:=0 to AProjectGroup.TargetCount-1 do
|
||||
begin
|
||||
T:=AProjectGroup.Targets[i];
|
||||
TN:=CreateNode(TargetNodes[T.Removed],TNT[T.Removed],T,AProjectGroup);
|
||||
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;
|
||||
AParent.Expand(False);
|
||||
TargetNodes[False].Expand(False);
|
||||
TargetNodes[True].Expand(False);
|
||||
end;
|
||||
|
||||
procedure TProjectGroupEditorForm.ShowDependencies(AParent: TTreeNode;
|
||||
@ -971,14 +1041,19 @@ Var
|
||||
PF,PD: TTargetNodes;
|
||||
I: Integer;
|
||||
begin
|
||||
PF[False]:=CreateNode(AParent,lisNodeFiles,ntFiles,Nil,AProjectGroup);
|
||||
PF[True]:=CreateNode(AParent,lisNodeRemovedFiles,ntFiles,Nil,AProjectGroup);
|
||||
// TODO Ideally, we can show removed files
|
||||
For I:=0 to T.FileCount-1 do
|
||||
CreateNode(PF[False],DisplayFileName(AProjectGroup,
|
||||
ntFile,T.Files[i]),ntFile,Nil,AProjectGroup);
|
||||
ShowDependencies(AParent,AProjectGroup,T,PD);
|
||||
// TODO: Build mode info Not available ?
|
||||
TVPG.BeginUpdate;
|
||||
try
|
||||
PF[False]:=CreateNode(AParent,lisNodeFiles,ntFiles,Nil,AProjectGroup);
|
||||
PF[True]:=CreateNode(AParent,lisNodeRemovedFiles,ntFiles,Nil,AProjectGroup);
|
||||
// TODO Ideally, we can show removed files
|
||||
For I:=0 to T.FileCount-1 do
|
||||
CreateNode(PF[False],DisplayFileName(AProjectGroup,
|
||||
ntFile,T.Files[i]),ntFile,Nil,AProjectGroup);
|
||||
ShowDependencies(AParent,AProjectGroup,T,PD);
|
||||
// TODO: Build mode info Not available ?
|
||||
finally
|
||||
TVPG.EndUpdate;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TProjectGroupEditorForm.FillPackageNode(AParent: TTreeNode;
|
||||
@ -987,13 +1062,18 @@ Var
|
||||
PF,PD: TTargetNodes;
|
||||
I: Integer;
|
||||
begin
|
||||
PF[False]:=CreateNode(AParent,lisNodeFiles,ntFiles,Nil,AProjectGroup);
|
||||
PF[True]:=CreateNode(AParent,lisNodeRemovedFiles,ntFiles,Nil,AProjectGroup);
|
||||
// ToDo Ideally, we can show removed files
|
||||
For I:=0 to T.FileCount-1 do
|
||||
CreateNode(PF[False],DisplayFileName(AProjectGroup,
|
||||
ntFile,T.Files[i]),ntFile,Nil,AProjectGroup);
|
||||
ShowDependencies(AParent,AProjectGroup,T,PD);
|
||||
TVPG.BeginUpdate;
|
||||
try
|
||||
PF[False]:=CreateNode(AParent,lisNodeFiles,ntFiles,Nil,AProjectGroup);
|
||||
PF[True]:=CreateNode(AParent,lisNodeRemovedFiles,ntFiles,Nil,AProjectGroup);
|
||||
// ToDo Ideally, we can show removed files
|
||||
For I:=0 to T.FileCount-1 do
|
||||
CreateNode(PF[False],DisplayFileName(AProjectGroup,
|
||||
ntFile,T.Files[i]),ntFile,Nil,AProjectGroup);
|
||||
ShowDependencies(AParent,AProjectGroup,T,PD);
|
||||
finally
|
||||
TVPG.EndUpdate;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TProjectGroupEditorForm.FillTargetNode(AParent: TTreeNode;
|
||||
@ -1001,14 +1081,19 @@ procedure TProjectGroupEditorForm.FillTargetNode(AParent: TTreeNode;
|
||||
Var
|
||||
PN: TTargetNodes;
|
||||
begin
|
||||
If T=Nil then
|
||||
T:=TargetFromNode(AParent);
|
||||
if T=Nil then
|
||||
exit;
|
||||
Case T.TargetType of
|
||||
ttProject: FillProjectNode(AParent,AProjectGroup,T);
|
||||
ttPackage: FillPackageNode(AParent,AProjectGroup,T);
|
||||
ttProjectGroup: FillProjectgroupNode(AParent,T.ProjectGroup,PN);
|
||||
TVPG.BeginUpdate;
|
||||
try
|
||||
If T=Nil then
|
||||
T:=TargetFromNode(AParent);
|
||||
if T=Nil then
|
||||
exit;
|
||||
Case T.TargetType of
|
||||
ttProject: FillProjectNode(AParent,AProjectGroup,T);
|
||||
ttPackage: FillPackageNode(AParent,AProjectGroup,T);
|
||||
ttProjectGroup: FillProjectgroupNode(AParent,T.ProjectGroup,PN);
|
||||
end;
|
||||
finally
|
||||
TVPG.EndUpdate;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
@ -219,6 +219,7 @@ end;
|
||||
procedure TProjectGroup.SetActiveTarget(AValue: TPGCompileTarget);
|
||||
begin
|
||||
ActivateTarget(AValue);
|
||||
IncreaseChangeStamp;
|
||||
end;
|
||||
|
||||
procedure TProjectGroup.SetModified(AValue: Boolean);
|
||||
@ -233,6 +234,7 @@ procedure TProjectGroup.SetFileName(AValue: String);
|
||||
begin
|
||||
if FFileName=AValue then Exit;
|
||||
FFileName:=AValue;
|
||||
IncreaseChangeStamp;
|
||||
end;
|
||||
|
||||
function TProjectGroup.GetModified: Boolean;
|
||||
|
Loading…
Reference in New Issue
Block a user