IDE: package editor: fixed not keeping references to IDE structures in treeview

git-svn-id: trunk@41768 -
This commit is contained in:
mattias 2013-06-19 07:58:27 +00:00
parent bfea494e05
commit 52c6ef4a82
3 changed files with 217 additions and 93 deletions

View File

@ -39,7 +39,8 @@ type
fImgIndex: Integer; fImgIndex: Integer;
// Full filename in node data is needed when showing the directory hierarchy. // Full filename in node data is needed when showing the directory hierarchy.
// It is stored automatically if AFullFilename is passed to contructor. // It is stored automatically if AFullFilename is passed to contructor.
fFilenameMap: TStringToStringTree; fNodeTextToFullFilenameMap: TStringToStringTree;
fNodeTextToDataMap: TStringToPointerTree;
fTVNodeStack: TTreeNodeList; fTVNodeStack: TTreeNodeList;
function CompareFNs(AFilename1,AFilename2: string): integer; function CompareFNs(AFilename1,AFilename2: string): integer;
procedure SortAndFilter; procedure SortAndFilter;
@ -102,8 +103,9 @@ type
TFileNameItem = class TFileNameItem = class
public public
Data: Pointer;
Filename: string; Filename: string;
constructor Create(AFilename: string); constructor Create(AFilename: string; aData: Pointer);
end; end;
var var
@ -128,13 +130,15 @@ begin
fRootNode:=ARootNode; // RootNode can also be Nil. Then all items are at top level. fRootNode:=ARootNode; // RootNode can also be Nil. Then all items are at top level.
fOriginalData:=TStringList.Create; fOriginalData:=TStringList.Create;
fSortedData:=TStringList.Create; fSortedData:=TStringList.Create;
fFilenameMap:=TStringToStringTree.Create(True); fNodeTextToFullFilenameMap:=TStringToStringTree.Create(True);
fNodeTextToDataMap:=TStringToPointerTree.Create(True);
fImgIndex:=-1; fImgIndex:=-1;
end; end;
destructor TTreeFilterBranch.Destroy; destructor TTreeFilterBranch.Destroy;
begin begin
FreeAndNil(fFilenameMap); FreeAndNil(fNodeTextToFullFilenameMap);
FreeAndNil(fNodeTextToDataMap);
FreeAndNil(fSortedData); FreeAndNil(fSortedData);
FreeAndNil(fOriginalData); FreeAndNil(fOriginalData);
FreeTVNodeData(fRootNode); FreeTVNodeData(fRootNode);
@ -144,8 +148,9 @@ end;
procedure TTreeFilterBranch.AddNodeData(ANodeText: string; AData: TObject; AFullFilename: string); procedure TTreeFilterBranch.AddNodeData(ANodeText: string; AData: TObject; AFullFilename: string);
begin begin
fOriginalData.AddObject(ANodeText, AData); fOriginalData.AddObject(ANodeText, AData);
fNodeTextToDataMap[ANodeText]:=AData;
if AFullFilename <> '' then if AFullFilename <> '' then
fFilenameMap[ANodeText]:=AFullFilename; fNodeTextToFullFilenameMap[ANodeText]:=AFullFilename;
end; end;
function TTreeFilterBranch.GetData(AIndex: integer): TObject; function TTreeFilterBranch.GetData(AIndex: integer): TObject;
@ -193,7 +198,7 @@ var
FileN, s: string; FileN, s: string;
ena: Boolean; ena: Boolean;
begin begin
if fFilenameMap.Count > 0 then // FilenameMap stores short filename -> long filename if fNodeTextToFullFilenameMap.Count > 0 then // FilenameMap stores short filename -> long filename
FreeTVNodeData(fRootNode); // Free node data now, it will be filled later. FreeTVNodeData(fRootNode); // Free node data now, it will be filled later.
if Assigned(fRootNode) then if Assigned(fRootNode) then
fRootNode.DeleteChildren // Delete old tree nodes. fRootNode.DeleteChildren // Delete old tree nodes.
@ -210,11 +215,11 @@ begin
else else
TVNode:=fOwner.fFilteredTreeview.Items.AddChild(fRootNode,FileN); TVNode:=fOwner.fFilteredTreeview.Items.AddChild(fRootNode,FileN);
// Save the long filename to Node.Data // Save the long filename to Node.Data
if fFilenameMap.Count > 0 then begin if fNodeTextToFullFilenameMap.Count > 0 then begin
s:=FileN; s:=FileN;
if fFilenameMap.Contains(FileN) then if fNodeTextToFullFilenameMap.Contains(FileN) then
s:=fFilenameMap[FileN]; // Full file name. s:=fNodeTextToFullFilenameMap[FileN]; // Full file name.
TVNode.Data:=TFileNameItem.Create(s); TVNode.Data:=TFileNameItem.Create(s,fNodeTextToDataMap[FileN]);
end; end;
// Get ImageIndex for Node // Get ImageIndex for Node
ena := True; ena := True;
@ -326,9 +331,10 @@ end;
{ TFileNameItem } { TFileNameItem }
constructor TFileNameItem.Create(AFilename: string); constructor TFileNameItem.Create(AFilename: string; aData: Pointer);
begin begin
Filename:=AFilename; Filename:=AFilename;
Data:=aData;
end; end;
{ TTreeFilterEdit } { TTreeFilterEdit }

View File

@ -734,6 +734,7 @@ type
function MainUnitHasPkgName: boolean; function MainUnitHasPkgName: boolean;
// required dependencies (plus removed required dependencies) // required dependencies (plus removed required dependencies)
function FindDependencyByName(const PkgName: string): TPkgDependency; function FindDependencyByName(const PkgName: string): TPkgDependency;
function FindRemovedDependencyByName(const PkgName: string): TPkgDependency;
function RequiredDepByIndex(Index: integer): TPkgDependency; function RequiredDepByIndex(Index: integer): TPkgDependency;
function RemovedDepByIndex(Index: integer): TPkgDependency; function RemovedDepByIndex(Index: integer): TPkgDependency;
procedure AddRequiredDependency(Dependency: TPkgDependency); procedure AddRequiredDependency(Dependency: TPkgDependency);
@ -3173,6 +3174,13 @@ begin
PkgName); PkgName);
end; end;
function TLazPackage.FindRemovedDependencyByName(const PkgName: string
): TPkgDependency;
begin
Result:=FindDependencyByNameInList(FFirstRemovedDependency,pdlRequires,
PkgName);
end;
function TLazPackage.RequiredDepByIndex(Index: integer): TPkgDependency; function TLazPackage.RequiredDepByIndex(Index: integer): TPkgDependency;
begin begin
Result:=GetDependencyWithIndex(FFirstRequiredDependency,pdlRequires,Index); Result:=GetDependencyWithIndex(FFirstRequiredDependency,pdlRequires,Index);

View File

@ -129,6 +129,19 @@ type
const Filename: string): TModalResult of object; const Filename: string): TModalResult of object;
TOnFreePkgEditor = procedure(APackage: TLazPackage) of object; TOnFreePkgEditor = procedure(APackage: TLazPackage) of object;
TPENodeType = (
penFile,
penDependency
);
TPENodeData = class
public
Typ: TPENodeType;
Name: string; // file or package name
Removed: boolean;
Next: TPENodeData;
end;
{ TPackageEditorForm } { TPackageEditorForm }
TPackageEditorForm = class(TBasePackageEditor) TPackageEditorForm = class(TBasePackageEditor)
@ -242,11 +255,14 @@ type
FDirSummaryLabel: TLabel; FDirSummaryLabel: TLabel;
FSelectedFile: TPkgFile; FSelectedFile: TPkgFile;
FSelectedDependency: TPkgDependency; FSelectedDependency: TPkgDependency;
FFirstNodeData: array[TPENodeType] of TPENodeData;
procedure FreeNodeData(Typ: TPENodeType);
function CreateNodeData(Typ: TPENodeType; aName: string; aRemoved: boolean): TPENodeData;
procedure SetDependencyDefaultFilename(AsPreferred: boolean); procedure SetDependencyDefaultFilename(AsPreferred: boolean);
procedure SetShowDirectoryHierarchy(const AValue: boolean); procedure SetShowDirectoryHierarchy(const AValue: boolean);
procedure SetSortAlphabetically(const AValue: boolean); procedure SetSortAlphabetically(const AValue: boolean);
procedure SetupComponents; procedure SetupComponents;
function ChooseImageIndex(Str: String; Data: TObject; var AIsEnabled: Boolean): Integer; function OnTreeViewGetImageIndex(Str: String; Data: TObject; var AIsEnabled: Boolean): Integer;
procedure UpdateTitle; procedure UpdateTitle;
procedure UpdateButtons; procedure UpdateButtons;
procedure UpdateFiles; procedure UpdateFiles;
@ -256,6 +272,8 @@ type
procedure UpdateStatusBar; procedure UpdateStatusBar;
function GetCurrentDependency(out Removed: boolean): TPkgDependency; function GetCurrentDependency(out Removed: boolean): TPkgDependency;
function GetCurrentFile(out Removed: boolean): TPkgFile; function GetCurrentFile(out Removed: boolean): TPkgFile;
function GetNodeData(TVNode: TTreeNode): TPENodeData;
function GetNodeItem(NodeData: TPENodeData): TObject;
function IsDirectoryNode(Node: TTreeNode): boolean; function IsDirectoryNode(Node: TTreeNode): boolean;
procedure GetDirectorySummary(DirNode: TTreeNode; procedure GetDirectorySummary(DirNode: TTreeNode;
out FileCount, HasRegisterProcCount, AddToUsesPkgSectionCount: integer); out FileCount, HasRegisterProcCount, AddToUsesPkgSectionCount: integer);
@ -956,7 +974,6 @@ end;
procedure TPackageEditorForm.RemoveBitBtnClick(Sender: TObject); procedure TPackageEditorForm.RemoveBitBtnClick(Sender: TObject);
var var
ANode: TTreeNode; ANode: TTreeNode;
NodeIndex: Integer;
CurFile: TPkgFile; CurFile: TPkgFile;
CurDependency: TPkgDependency; CurDependency: TPkgDependency;
s: String; s: String;
@ -968,41 +985,42 @@ begin
UpdateButtons; UpdateButtons;
exit; exit;
end; end;
NodeIndex:=ANode.Index;
if TObject(ANode.Data) is TFileNameItem then begin // get current package file
// get current package file CurFile:=GetCurrentFile(Removed);
CurFile:=GetCurrentFile(Removed); if CurFile<>nil then begin
if CurFile<>nil then begin if Removed then exit;
// confirm deletion // confirm deletion
s:=''; s:='';
mt:=mtConfirmation; mt:=mtConfirmation;
if CurFile.FileType=pftMainUnit then begin if CurFile.FileType=pftMainUnit then begin
s:=Format(lisWarningThisIsTheMainUnitTheNewMainUnitWillBePas, s:=Format(lisWarningThisIsTheMainUnitTheNewMainUnitWillBePas,
[LineEnding+LineEnding, lowercase(LazPackage.Name)]); [LineEnding+LineEnding, lowercase(LazPackage.Name)]);
mt:=mtWarning; mt:=mtWarning;
end;
if MessageDlg(lisPckEditRemoveFile2,
Format(lisPckEditRemoveFileFromPackage, ['"', CurFile.Filename, '"',
LineEnding, '"', LazPackage.IDAsString, '"'])+s,
mt,[mbYes,mbNo],0)=mrNo
then
exit;
LazPackage.RemoveFile(CurFile);
end; end;
if MessageDlg(lisPckEditRemoveFile2,
Format(lisPckEditRemoveFileFromPackage, ['"', CurFile.Filename, '"',
LineEnding, '"', LazPackage.IDAsString, '"'])+s,
mt,[mbYes,mbNo],0)=mrNo
then
exit;
LazPackage.RemoveFile(CurFile);
UpdateAll(false); UpdateAll(false);
end else if ANode.Parent=FRequiredPackagesNode then begin exit;
// get current dependency end;
CurDependency:=LazPackage.RequiredDepByIndex(NodeIndex);
if CurDependency<>nil then begin // get current dependency
// confirm deletion CurDependency:=GetCurrentDependency(Removed);
if MessageDlg(lisPckEditRemoveDependency2, if (CurDependency<>nil) then begin
Format(lisPckEditRemoveDependencyFromPackage, ['"', if Removed then exit;
CurDependency.AsString, '"', LineEnding, '"', LazPackage.IDAsString, '"']), // confirm deletion
mtConfirmation,[mbYes,mbNo],0)=mrNo if MessageDlg(lisPckEditRemoveDependency2,
then Format(lisPckEditRemoveDependencyFromPackage, ['"',
exit; CurDependency.AsString, '"', LineEnding, '"', LazPackage.IDAsString, '"']),
PackageGraph.RemoveDependencyFromPackage(LazPackage,CurDependency,true); mtConfirmation,[mbYes,mbNo],0)=mrNo
end; then
exit;
PackageGraph.RemoveDependencyFromPackage(LazPackage,CurDependency,true);
end; end;
end; end;
@ -1066,6 +1084,31 @@ begin
PackageEditors.ViewPkgToDos(LazPackage); PackageEditors.ViewPkgToDos(LazPackage);
end; end;
procedure TPackageEditorForm.FreeNodeData(Typ: TPENodeType);
var
NodeData: TPENodeData;
n: TPENodeData;
begin
NodeData:=FFirstNodeData[Typ];
while NodeData<>nil do begin
n:=NodeData;
NodeData:=NodeData.Next;
n.Free;
end;
FFirstNodeData[Typ]:=nil;
end;
function TPackageEditorForm.CreateNodeData(Typ: TPENodeType; aName: string;
aRemoved: boolean): TPENodeData;
begin
Result:=TPENodeData.Create;
Result.Name:=aName;
Result.Typ:=Typ;
Result.Removed:=aRemoved;
Result.Next:=FFirstNodeData[Typ];
FFirstNodeData[Typ]:=Result;
end;
procedure TPackageEditorForm.UseMaxVersionCheckBoxChange(Sender: TObject); procedure TPackageEditorForm.UseMaxVersionCheckBoxChange(Sender: TObject);
begin begin
MaxVersionEdit.Enabled:=UseMaxVersionCheckBox.Checked; MaxVersionEdit.Enabled:=UseMaxVersionCheckBox.Checked;
@ -1334,7 +1377,7 @@ begin
FilesTreeView.Images := IDEImages.Images_16; FilesTreeView.Images := IDEImages.Images_16;
ToolBar.Images := IDEImages.Images_16; ToolBar.Images := IDEImages.Images_16;
FilterEdit.OnGetImageIndex:=@ChooseImageIndex; FilterEdit.OnGetImageIndex:=@OnTreeViewGetImageIndex;
SaveBitBtn := CreateToolButton('SaveBitBtn', lisMenuSave, lisPckEditSavePackage, 'laz_save', @SaveBitBtnClick); SaveBitBtn := CreateToolButton('SaveBitBtn', lisMenuSave, lisPckEditSavePackage, 'laz_save', @SaveBitBtnClick);
CompileBitBtn := CreateToolButton('CompileBitBtn', lisCompile, lisPckEditCompilePackage, 'pkg_compile', @CompileBitBtnClick); CompileBitBtn := CreateToolButton('CompileBitBtn', lisCompile, lisPckEditCompilePackage, 'pkg_compile', @CompileBitBtnClick);
@ -1650,18 +1693,26 @@ begin
end; end;
procedure TPackageEditorForm.UpdateButtons; procedure TPackageEditorForm.UpdateButtons;
var
Removed: boolean;
CurFile: TPkgFile;
CurDependency: TPkgDependency;
begin begin
if LazPackage=nil then exit; if LazPackage=nil then exit;
CurFile:=GetCurrentFile(Removed);
if CurFile=nil then
CurDependency:=GetCurrentDependency(Removed)
else
CurDependency:=nil;
SaveBitBtn.Enabled:=(not LazPackage.ReadOnly) SaveBitBtn.Enabled:=(not LazPackage.ReadOnly)
and (LazPackage.IsVirtual or LazPackage.Modified); and (LazPackage.IsVirtual or LazPackage.Modified);
CompileBitBtn.Enabled:=(not LazPackage.IsVirtual); CompileBitBtn.Enabled:=(not LazPackage.IsVirtual);
AddBitBtn.Enabled:=not LazPackage.ReadOnly; AddBitBtn.Enabled:=not LazPackage.ReadOnly;
RemoveBitBtn.Enabled:=(not LazPackage.ReadOnly) RemoveBitBtn.Enabled:=(not LazPackage.ReadOnly)
and (FilesTreeView.Selected<>nil) and (not Removed)
and ((TObject(FilesTreeView.Selected.Data) is TFileNameItem) and ((CurFile<>nil) or (CurDependency<>nil));
or (FilesTreeView.Selected.Parent=FRequiredPackagesNode)); OpenButton.Enabled:=(CurFile<>nil) or (CurDependency<>nil);
OpenButton.Enabled:=(FilesTreeView.Selected<>nil)
and (TObject(FilesTreeView.Selected.Data) is TFileNameItem);
UseBitBtn.Caption:=lisUseSub; UseBitBtn.Caption:=lisUseSub;
UseBitBtn.Hint:=lisClickToSeeThePossibleUses; UseBitBtn.Hint:=lisClickToSeeThePossibleUses;
UseBitBtn.OnClick:=nil; UseBitBtn.OnClick:=nil;
@ -1669,13 +1720,24 @@ begin
OptionsBitBtn.Enabled:=true; OptionsBitBtn.Enabled:=true;
end; end;
function TPackageEditorForm.ChooseImageIndex(Str: String; Data: TObject; function TPackageEditorForm.OnTreeViewGetImageIndex(Str: String; Data: TObject;
var AIsEnabled: Boolean): Integer; var AIsEnabled: Boolean): Integer;
var
PkgFile: TPkgFile;
Item: TObject;
PkgDependency: TPkgDependency;
NodeData: TPENodeData;
begin begin
if Data is TPkgFile then begin Result:=-1;
case TPkgFile(Data).FileType of if not (Data is TPENodeData) then exit;
NodeData:=TPENodeData(Data);
Item:=GetNodeItem(NodeData);
if Item=nil then exit;
if Item is TPkgFile then begin
PkgFile:=TPkgFile(Item);
case PkgFile.FileType of
pftUnit,pftVirtualUnit,pftMainUnit: pftUnit,pftVirtualUnit,pftMainUnit:
if TPkgFile(Data).HasRegisterProc then if PkgFile.HasRegisterProc then
Result:=ImageIndexRegisterUnit Result:=ImageIndexRegisterUnit
else else
Result:=ImageIndexUnit; Result:=ImageIndexUnit;
@ -1689,10 +1751,11 @@ begin
Result:=-1; Result:=-1;
end; end;
end end
else if Data is TPkgDependency then begin else if Item is TPkgDependency then begin
if TPkgDependency(Data).Removed then PkgDependency:=TPkgDependency(Item);
if PkgDependency.Removed then
Result:=ImageIndexRemovedRequired Result:=ImageIndexRemovedRequired
else if TPkgDependency(Data).LoadPackageResult=lprSuccess then else if PkgDependency.LoadPackageResult=lprSuccess then
Result:=ImageIndexRequired Result:=ImageIndexRequired
else else
Result:=ImageIndexConflict; Result:=ImageIndexConflict;
@ -1705,9 +1768,12 @@ var
CurFile: TPkgFile; CurFile: TPkgFile;
FilesBranch, RemovedBranch: TTreeFilterBranch; FilesBranch, RemovedBranch: TTreeFilterBranch;
Filename: String; Filename: String;
NodeData: TPENodeData;
begin begin
if LazPackage=nil then exit; if LazPackage=nil then exit;
FreeNodeData(penFile);
// files belonging to package // files belonging to package
FilesBranch:=FilterEdit.GetBranch(FFilesNode); FilesBranch:=FilterEdit.GetBranch(FFilesNode);
FilterEdit.SelectedPart:=FNextSelectedPart; FilterEdit.SelectedPart:=FNextSelectedPart;
@ -1717,9 +1783,10 @@ begin
// collect and sort files // collect and sort files
for i:=0 to LazPackage.FileCount-1 do begin for i:=0 to LazPackage.FileCount-1 do begin
CurFile:=LazPackage.Files[i]; CurFile:=LazPackage.Files[i];
NodeData:=CreateNodeData(penFile,CurFile.Filename,false);
Filename:=CurFile.GetShortFilename(true); Filename:=CurFile.GetShortFilename(true);
if Filename<>'' then if Filename<>'' then
FilesBranch.AddNodeData(Filename, CurFile, CurFile.Filename); FilesBranch.AddNodeData(Filename, NodeData, CurFile.Filename);
end; end;
// removed files // removed files
@ -1734,7 +1801,8 @@ begin
RemovedBranch:=FilterEdit.GetBranch(FRemovedFilesNode); RemovedBranch:=FilterEdit.GetBranch(FRemovedFilesNode);
for i:=0 to LazPackage.RemovedFilesCount-1 do begin for i:=0 to LazPackage.RemovedFilesCount-1 do begin
CurFile:=LazPackage.RemovedFiles[i]; CurFile:=LazPackage.RemovedFiles[i];
RemovedBranch.AddNodeData(CurFile.GetShortFilename(true), CurFile); NodeData:=CreateNodeData(penFile,CurFile.Filename,true);
RemovedBranch.AddNodeData(CurFile.GetShortFilename(true), NodeData);
end; end;
end else begin end else begin
// No removed dependencies -> delete the root node // No removed dependencies -> delete the root node
@ -1751,9 +1819,12 @@ var
CurDependency: TPkgDependency; CurDependency: TPkgDependency;
RequiredBranch, RemovedBranch: TTreeFilterBranch; RequiredBranch, RemovedBranch: TTreeFilterBranch;
CurNodeText, aFilename: String; CurNodeText, aFilename: String;
NodeData: TPENodeData;
begin begin
if LazPackage=nil then exit; if LazPackage=nil then exit;
FreeNodeData(penDependency);
// required packages // required packages
RequiredBranch:=FilterEdit.GetBranch(FRequiredPackagesNode); RequiredBranch:=FilterEdit.GetBranch(FRequiredPackagesNode);
FilterEdit.SelectedPart:=FNextSelectedPart; FilterEdit.SelectedPart:=FNextSelectedPart;
@ -1767,7 +1838,8 @@ begin
else else
CurNodeText:=Format(lisPckEditDefault, [CurNodeText, aFilename]); CurNodeText:=Format(lisPckEditDefault, [CurNodeText, aFilename]);
end; end;
RequiredBranch.AddNodeData(CurNodeText, CurDependency); NodeData:=CreateNodeData(penDependency,CurDependency.PackageName,false);
RequiredBranch.AddNodeData(CurNodeText, NodeData);
CurDependency:=CurDependency.NextRequiresDependency; CurDependency:=CurDependency.NextRequiresDependency;
end; end;
@ -1781,7 +1853,8 @@ begin
end; end;
RemovedBranch:=FilterEdit.GetBranch(FRemovedRequiredNode); RemovedBranch:=FilterEdit.GetBranch(FRemovedRequiredNode);
while CurDependency<>nil do begin while CurDependency<>nil do begin
RemovedBranch.AddNodeData(CurDependency.AsString, CurDependency); NodeData:=CreateNodeData(penDependency,CurDependency.PackageName,true);
RemovedBranch.AddNodeData(CurDependency.AsString, NodeData);
CurDependency:=CurDependency.NextRequiresDependency; CurDependency:=CurDependency.NextRequiresDependency;
end; end;
end else begin end else begin
@ -1936,36 +2009,65 @@ end;
function TPackageEditorForm.GetCurrentDependency(out Removed: boolean): TPkgDependency; function TPackageEditorForm.GetCurrentDependency(out Removed: boolean): TPkgDependency;
var var
CurNode: TTreeNode; NodeData: TPENodeData;
Branch: TTreeFilterBranch;
begin begin
Result:=nil; Result:=nil;
Removed:=false; Removed:=false;
CurNode:=FilesTreeView.Selected; NodeData:=GetNodeData(FilesTreeView.Selected);
if Assigned(CurNode) and Assigned(CurNode.Parent) if NodeData=nil then exit;
and ((CurNode.Parent=FRequiredPackagesNode) or (CurNode.Parent=FRemovedRequiredNode)) if NodeData.Typ<>penDependency then exit;
then begin Removed:=NodeData.Removed;
Removed:=CurNode.Parent=FRemovedRequiredNode; if Removed then
Branch:=FilterEdit.GetExistingBranch(CurNode.Parent); Result:=LazPackage.FindRemovedDependencyByName(NodeData.Name)
Result:=Branch.GetData(CurNode.Index) as TPkgDependency; else
end; Result:=LazPackage.FindDependencyByName(NodeData.Name);
end; end;
function TPackageEditorForm.GetCurrentFile(out Removed: boolean): TPkgFile; function TPackageEditorForm.GetCurrentFile(out Removed: boolean): TPkgFile;
var var
CurNode: TTreeNode; NodeData: TPENodeData;
begin begin
Result:=nil; Result:=nil;
Removed:=false; Removed:=false;
CurNode:=FilesTreeView.Selected; NodeData:=GetNodeData(FilesTreeView.Selected);
if (CurNode=nil) or (CurNode.Parent=nil) then exit; if NodeData=nil then exit;
if CurNode.Parent=FRemovedFilesNode then if NodeData.Typ<>penFile then exit;
begin Removed:=NodeData.Removed;
Result:=LazPackage.RemovedFiles[CurNode.Index]; if Removed then
Removed:=true; Result:=LazPackage.FindRemovedPkgFile(NodeData.Name)
end else
else if TObject(CurNode.Data) is TFileNameItem then Result:=LazPackage.FindPkgFile(NodeData.Name,true,true);
Result:=LazPackage.FindPkgFile(TFileNameItem(CurNode.Data).Filename, False, True); end;
function TPackageEditorForm.GetNodeData(TVNode: TTreeNode): TPENodeData;
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 TPENodeData then
Result:=TPENodeData(o);
end;
function TPackageEditorForm.GetNodeItem(NodeData: TPENodeData): TObject;
begin
Result:=nil;
if LazPackage=nil then exit;
case NodeData.Typ of
penFile:
if NodeData.Removed then
Result:=LazPackage.FindRemovedPkgFile(NodeData.Name)
else
Result:=LazPackage.FindPkgFile(NodeData.Name,true,true);
penDependency:
if NodeData.Removed then
Result:=LazPackage.FindRemovedDependencyByName(NodeData.Name)
else
Result:=LazPackage.FindDependencyByName(NodeData.Name);
end;
end; end;
function TPackageEditorForm.IsDirectoryNode(Node: TTreeNode): boolean; function TPackageEditorForm.IsDirectoryNode(Node: TTreeNode): boolean;
@ -1978,16 +2080,18 @@ procedure TPackageEditorForm.GetDirectorySummary(DirNode: TTreeNode; out
procedure Traverse(Node: TTreeNode); procedure Traverse(Node: TTreeNode);
var var
Item: TFileNameItem;
CurFile: TPkgFile; CurFile: TPkgFile;
NodeData: TPENodeData;
begin begin
if TObject(Node.Data) is TFileNameItem then begin NodeData:=GetNodeData(Node);
Item:=TFileNameItem(Node.Data); if NodeData<>nil then begin
CurFile:=LazPackage.FindPkgFile(Item.Filename,true,true); if NodeData.Typ=penFile then begin
if CurFile<>nil then begin CurFile:=LazPackage.FindPkgFile(NodeData.Name,true,true);
inc(FileCount); if CurFile<>nil then begin
if CurFile.HasRegisterProc then inc(HasRegisterProcCount); inc(FileCount);
if CurFile.AddToUsesPkgSection then inc(AddToUsesPkgSectionCount); if CurFile.HasRegisterProc then inc(HasRegisterProcCount);
if CurFile.AddToUsesPkgSection then inc(AddToUsesPkgSectionCount);
end;
end; end;
end; end;
Node:=Node.GetFirstChild; Node:=Node.GetFirstChild;
@ -2188,10 +2292,12 @@ procedure TPackageEditorForm.DoUseUnitsInDirectory(Use: boolean);
procedure Traverse(Node: TTreeNode); procedure Traverse(Node: TTreeNode);
var var
PkgFile: TPkgFile; PkgFile: TPkgFile;
NodeData: TPENodeData;
begin begin
if TObject(Node.Data) is TFileNameItem then NodeData:=GetNodeData(Node);
if (NodeData<>nil) and (NodeData.Typ=penFile) then
begin begin
PkgFile:=LazPackage.FindPkgFile(TFileNameItem(Node.Data).Filename,true,true); PkgFile:=LazPackage.FindPkgFile(NodeData.Name,true,true);
if (PkgFile<>nil) and (PkgFile.FileType in [pftUnit,pftVirtualUnit]) then if (PkgFile<>nil) and (PkgFile.FileType in [pftUnit,pftVirtualUnit]) then
begin begin
if PkgFile.AddToUsesPkgSection<>Use then if PkgFile.AddToUsesPkgSection<>Use then
@ -2291,11 +2397,15 @@ begin
end; end;
destructor TPackageEditorForm.Destroy; destructor TPackageEditorForm.Destroy;
var
nt: TPENodeType;
begin begin
if PackageEditorMenuRoot.MenuItem=FilesPopupMenu.Items then if PackageEditorMenuRoot.MenuItem=FilesPopupMenu.Items then
PackageEditorMenuRoot.MenuItem:=nil; PackageEditorMenuRoot.MenuItem:=nil;
PackageEditors.DoFreeEditor(LazPackage); PackageEditors.DoFreeEditor(LazPackage);
FreeAndNil(FPlugins); FreeAndNil(FPlugins);
for nt:=Low(TPENodeType) to High(TPENodeType) do
FreeNodeData(nt);
inherited Destroy; inherited Destroy;
end; end;