From 5b38f381dd67c67e6bdfeb0a1b505d0f742f842d Mon Sep 17 00:00:00 2001 From: mattias Date: Thu, 27 Jun 2013 03:17:22 +0000 Subject: [PATCH] IDE: project inspector: do not keep references to files and dependencies git-svn-id: trunk@41913 - --- ide/project.pp | 9 ++- ide/projectinspector.pas | 131 ++++++++++++++++++------------------- packager/packageeditor.pas | 14 ++-- 3 files changed, 78 insertions(+), 76 deletions(-) diff --git a/ide/project.pp b/ide/project.pp index fea5212f96..f0c99f095a 100644 --- a/ide/project.pp +++ b/ide/project.pp @@ -49,7 +49,7 @@ uses MemCheck, {$ENDIF} Classes, SysUtils, TypInfo, FPCAdds, LCLProc, LCLIntf, LCLType, Forms, - FileUtil, Laz2_XMLCfg, Controls, Dialogs, InterfaceBase, maps, + FileUtil, Laz2_XMLCfg, Controls, Dialogs, maps, // codetools CodeToolsConfig, ExprEval, FileProcs, DefineTemplates, BasicCodeTools, CodeToolsCfgScript, CodeToolManager, CodeCache, @@ -955,6 +955,7 @@ type // package dependencies function FindDependencyByName(const PackageName: string): TPkgDependency; + function FindRemovedDependencyByName(const PkgName: string): TPkgDependency; function RequiredDepByIndex(Index: integer): TPkgDependency; function RemovedDepByIndex(Index: integer): TPkgDependency; procedure AddRequiredDependency(Dependency: TPkgDependency); @@ -4712,6 +4713,12 @@ begin PackageName); end; +function TProject.FindRemovedDependencyByName(const PkgName: string + ): TPkgDependency; +begin + Result:=FindDependencyByNameInList(FFirstRemovedDependency,pdlRequires,PkgName); +end; + function TProject.RequiredDepByIndex(Index: integer): TPkgDependency; begin Result:=GetDependencyWithIndex(FFirstRequiredDependency,pdlRequires,Index); diff --git a/ide/projectinspector.pas b/ide/projectinspector.pas index d5ce0bca2d..9ce98793e5 100644 --- a/ide/projectinspector.pas +++ b/ide/projectinspector.pas @@ -57,11 +57,10 @@ unit ProjectInspector; interface uses - Classes, SysUtils, LCLProc, LCLType, AvgLvlTree, Forms, Controls, Buttons, - ComCtrls, StdCtrls, Menus, Dialogs, Graphics, FileUtil, ExtCtrls, - LazIDEIntf, IDEHelpIntf, IDECommands, IDEDialogs, - LazarusIDEStrConsts, IDEProcs, IDEOptionDefs, EnvironmentOpts, - Project, AddToProjectDlg, PackageSystem, PackageDefs, TreeFilterEdit; + Classes, SysUtils, LCLProc, LCLType, Forms, Controls, Buttons, + ComCtrls, Menus, Dialogs, FileUtil, ExtCtrls, IDEHelpIntf, IDECommands, IDEDialogs, ProjectIntf, + LazarusIDEStrConsts, IDEProcs, IDEOptionDefs, + Project, AddToProjectDlg, PackageDefs, TreeFilterEdit; type TOnAddUnitToProject = @@ -88,7 +87,6 @@ type public Typ: TProjectNodeType; Name: string; // file or package name - Data : TObject; Removed : Boolean; Next : TProjectNodeData; end; @@ -161,13 +159,15 @@ type FProjectNodeDataList : array [TProjectNodeType] of TProjectNodeData; procedure FreeNodeData(Typ: TProjectNodeType); function CreateNodeData(Typ: TProjectNodeType; aName: string; aRemoved: boolean): TProjectNodeData; + function GetNodeData(TVNode: TTreeNode): TProjectNodeData; + function GetNodeItem(NodeData: TProjectNodeData): TObject; procedure SetDependencyDefaultFilename(AsPreferred: boolean); procedure SetIdleConnected(const AValue: boolean); procedure SetLazProject(const AValue: TProject); procedure SetShowDirectoryHierarchy(const AValue: boolean); procedure SetSortAlphabetically(const AValue: boolean); procedure SetupComponents; - function ChooseImageIndex(Str: String; Data: TObject; var AIsEnabled: Boolean): Integer; + function OnTreeViewGetImageIndex(Str: String; Data: TObject; var AIsEnabled: Boolean): Integer; procedure UpdateProjectFiles; procedure UpdateRequiredPackages; procedure OnProjectBeginUpdate(Sender: TObject); @@ -608,7 +608,7 @@ begin ItemsTreeView.Images := IDEImages.Images_16; ToolBar.Images := IDEImages.Images_16; - FilterEdit.OnGetImageIndex:=@ChooseImageIndex; + FilterEdit.OnGetImageIndex:=@OnTreeViewGetImageIndex; AddBitBtn := CreateToolButton('AddBitBtn', lisAdd, lisPckEditAddAnItem, 'laz_add', @AddBitBtnClick); RemoveBitBtn := CreateToolButton('RemoveBitBtn', lisRemove, lisPckEditRemoveSelectedItem, 'laz_delete', @RemoveBitBtnClick); @@ -634,31 +634,30 @@ begin end; end; -function TProjectInspectorForm.ChooseImageIndex(Str: String; Data: TObject; +function TProjectInspectorForm.OnTreeViewGetImageIndex(Str: String; Data: TObject; var AIsEnabled: Boolean): Integer; -Var - ANodeData : TProjectNodeData; - AObject : TObject; +var + NodeData: TProjectNodeData; + Item: TObject; begin Result := -1; - AObject := NIL; - ANodeData := TProjectNodeData(Data); - If Assigned(ANodeData) Then - AObject := ANodeData.Data; - if Not Assigned(AObject) Then - Exit; - if AObject is TUnitInfo then begin - if FilenameIsPascalUnit(TUnitInfo(AObject).Filename) then + if not (Data is TProjectNodeData) then exit; + NodeData:=TProjectNodeData(Data); + Item:=GetNodeItem(NodeData); + if Item=nil then exit; + + if Item is TUnitInfo then begin + if FilenameIsPascalUnit(TUnitInfo(Item).Filename) then Result:=ImageIndexUnit - else if (LazProject<>nil) and (LazProject.MainUnitinfo=Data) then + else if (LazProject<>nil) and (LazProject.MainUnitinfo=Item) then Result:=ImageIndexProject else Result:=ImageIndexText; end - else if AObject is TPkgDependency then begin - if TPkgDependency(AObject).Removed then + else if Item is TPkgDependency then begin + if TPkgDependency(Item).Removed then Result:=ImageIndexRemovedRequired - else if TPkgDependency(AObject).LoadPackageResult=lprSuccess then + else if TPkgDependency(Item).LoadPackageResult=lprSuccess then Result:=ImageIndexRequired else Result:=ImageIndexConflict; @@ -687,8 +686,7 @@ begin while CurFile<>nil do begin Filename:=CurFile.GetShortFilename(true); if Filename<>'' then Begin - ANodeData := CreateNodeData(pntFile, FileName, False); - ANodeData.Data := CurFile; + ANodeData := CreateNodeData(pntFile, CurFile.Filename, False); FilesBranch.AddNodeData(Filename, ANodeData, CurFile.Filename); end; CurFile:=CurFile.NextPartOfProject; @@ -727,8 +725,7 @@ begin NodeText:=Format(lisPckEditDefault, [NodeText, AFilename]); end; // Add the required package under the branch - ANodeData := CreateNodeData(pntDependency, NodeText, False); - ANodeData.Data := Dependency; + ANodeData := CreateNodeData(pntDependency, Dependency.PackageName, False); RequiredBranch.AddNodeData(NodeText, ANodeData); Dependency:=Dependency.NextRequiresDependency; end; @@ -746,8 +743,7 @@ begin RemovedBranch:=FilterEdit.GetBranch(RemovedDependenciesNode); // Add all removed dependencies under the branch while Dependency<>nil do begin - ANodeData := CreateNodeData(pntDependency, Dependency.AsString, True); - ANodeData.Data := Dependency; + ANodeData := CreateNodeData(pntDependency, Dependency.PackageName, True); RemovedBranch.AddNodeData(Dependency.AsString, ANodeData); Dependency:=Dependency.NextRequiresDependency; end; @@ -822,50 +818,22 @@ end; function TProjectInspectorForm.GetSelectedFile: TUnitInfo; var - CurNode: TTreeNode; - Item: TFileNameItem; - ADataNode : TProjectNodeData; - AObject : TObject; + Item: TObject; begin Result:=nil; - AObject := NIL; - if LazProject=nil then exit; - CurNode:=ItemsTreeView.Selected; - if (CurNode=nil) then exit; - //debugln(['TProjectInspectorForm.GetCurrentFile ',DbgSName(TObject(CurNode.Data)),' ',CurNode.Text]); - ADataNode := TProjectNodeData(CurNode.Data); - If Assigned(ADataNode) Then - AObject := ADataNode; - if Assigned(AObject) And (AObject is TFileNameItem) then - begin - Item:=TFileNameItem(AObject); - //debugln(['TProjectInspectorForm.GetCurrentFile Item=',Item.Filename,' ',Item.IsDirectory]); - Result:=LazProject.UnitInfoWithFilename(Item.Filename); - end; + Item:=GetNodeItem(GetNodeData(ItemsTreeView.Selected)); + if Item is TUnitInfo then + Result:=TUnitInfo(Item); end; function TProjectInspectorForm.GetSelectedDependency: TPkgDependency; var - CurNode: TTreeNode; - Branch: TTreeFilterBranch; - AnObject: TObject; - ADataNode : TProjectNodeData; + Item: TObject; begin Result:=nil; - AnObject := Nil; - if LazProject=nil then exit; - CurNode:=ItemsTreeView.Selected; - if Assigned(CurNode) and Assigned(CurNode.Parent) - and ((CurNode.Parent=DependenciesNode) or (CurNode.Parent=RemovedDependenciesNode)) - then begin - Branch:=FilterEdit.GetExistingBranch(CurNode.Parent); - Assert(Assigned(Branch)); - ADataNode := TProjectNodeData(Branch.GetData(CurNode.Index)); - If Assigned(ADataNode) Then - AnObject := ADataNode.Data; - if (AnObject <> nil) and (AnObject is TPkgDependency) then - Result := TPkgDependency(AnObject); - end; + Item:=GetNodeItem(GetNodeData(ItemsTreeView.Selected)); + if Item is TPkgDependency then + Result:=TPkgDependency(Item); end; constructor TProjectInspectorForm.Create(TheOwner: TComponent); @@ -1022,5 +990,36 @@ Begin FProjectNodeDataList[Typ] := Result; end; +function TProjectInspectorForm.GetNodeData(TVNode: TTreeNode): TProjectNodeData; +var + o: TObject; +begin + Result:=nil; + if (TVNode=nil) then exit; + o:=TObject(TVNode.Data); + if o is TFileNameItem then + o:=TObject(TFileNameItem(o).Data); + if o is TProjectNodeData then + Result:=TProjectNodeData(o); +end; + +function TProjectInspectorForm.GetNodeItem(NodeData: TProjectNodeData): TObject; +begin + Result:=nil; + if (LazProject=nil) or (NodeData=nil) then exit; + case NodeData.Typ of + pntFile: + if NodeData.Removed then + Result:=nil + else + Result:=LazProject.UnitInfoWithFilename(NodeData.Name,[pfsfOnlyProjectFiles]); + pntDependency: + if NodeData.Removed then + Result:=LazProject.FindRemovedDependencyByName(NodeData.Name) + else + Result:=LazProject.FindDependencyByName(NodeData.Name); + end; +end; + end. diff --git a/packager/packageeditor.pas b/packager/packageeditor.pas index b72ca3cd41..6a52026e55 100644 --- a/packager/packageeditor.pas +++ b/packager/packageeditor.pas @@ -31,16 +31,12 @@ interface uses // LCL FCL - Classes, SysUtils, Math, Forms, Controls, StdCtrls, ComCtrls, Buttons, - LResources, Graphics, LCLType, LCLProc, Menus, Dialogs, FileUtil, AVL_Tree, - contnrs, Laz2_XMLCfg, + Classes, SysUtils, Forms, Controls, StdCtrls, ComCtrls, Buttons, Graphics, LCLType, LCLProc, Menus, Dialogs, FileUtil, + contnrs, // IDEIntf CodeTools - IDEImagesIntf, MenuIntf, HelpIntfs, ExtCtrls, LazIDEIntf, ProjectIntf, + IDEImagesIntf, MenuIntf, ExtCtrls, LazIDEIntf, ProjectIntf, CodeToolsStructs, FormEditingIntf, TreeFilterEdit, PackageIntf, - IDEDialogs, IDEHelpIntf, IDEOptionsIntf, - // IDE - MainIntf, IDEProcs, LazConf, LazarusIDEStrConsts, IDEOptionDefs, IDEDefs, - IDEContextHelpEdit, CompilerOptions, ComponentReg, + IDEDialogs, IDEHelpIntf, IDEOptionsIntf, IDEProcs, LazarusIDEStrConsts, IDEDefs, CompilerOptions, ComponentReg, PackageDefs, AddToPackageDlg, PkgVirtualUnitEditor, MissingPkgFilesDlg, PackageSystem, CleanPkgDeps; @@ -2066,7 +2062,7 @@ end; function TPackageEditorForm.GetNodeItem(NodeData: TPENodeData): TObject; begin Result:=nil; - if LazPackage=nil then exit; + if (LazPackage=nil) or (NodeData=nil) then exit; case NodeData.Typ of penFile: if NodeData.Removed then