IDE: Reuse more code between Package Editor and Project Inspector.

git-svn-id: trunk@63954 -
This commit is contained in:
juha 2020-10-04 17:34:10 +00:00
parent 0907626dec
commit 5286e8b775
3 changed files with 77 additions and 99 deletions

View File

@ -172,15 +172,12 @@ type
ImageIndexBinary: integer;
ImageIndexDirectory: integer;
FFlags: TPEFlags;
FProjectNodeDataList : array [TPENodeType] of TPENodeData;
FPropGui: TProjPackFilePropGui;
procedure AddMenuItemClick(Sender: TObject);
function AddOneFile(aFilename: string): TModalResult;
procedure DoAddMoreDialog;
procedure DoAddDepDialog;
procedure DoAddFPMakeDepDialog;
procedure FreeNodeData(Typ: TPENodeType);
function CreateNodeData(Typ: TPENodeType; aName: string; aRemoved: boolean): TPENodeData;
function CreateToolButton(AName, ACaption, AHint, AImageName: String;
AOnClick: TNotifyEvent): TToolButton;
function CreateDivider: TToolButton;
@ -473,19 +470,11 @@ begin
end;
procedure TProjectInspectorForm.AddMenuItemClick(Sender: TObject);
function _NodeTreeIsIn(xIterNode, xParentNode: TTreeNode): Boolean;
begin
Result := (xIterNode = xParentNode);
if not Result and Assigned(xIterNode) then
Result := _NodeTreeIsIn(xIterNode.Parent, xParentNode);
end;
begin
//check the selected item in ItemsTreeView
// -> if it's "Required Packages", call "New Requirement" (mnuAddReqClick)
// -> otherwise (selected = "Files") call "Add files from file system" (AddBitBtnClick)
if _NodeTreeIsIn(ItemsTreeView.Selected, FDependenciesNode) then
if NodeTreeIsIn(ItemsTreeView.Selected, FDependenciesNode) then
mnuAddReqClick(Sender)
else
mnuAddBitBtnClick(Sender);
@ -806,26 +795,33 @@ begin
NeedToRebuild := False;
BeginUpdate;
try
for i:=0 to ItemsTreeView.SelectionCount-1 do begin
for i:=0 to ItemsTreeView.SelectionCount-1 do
begin
TVNode:=ItemsTreeView.Selections[i];
if not GetNodeDataItem(TVNode,NodeData,Item) then continue;
if Item is TUnitInfo then begin
if Item is TUnitInfo then
begin
CurFile:=TUnitInfo(Item);
if LazarusIDE.DoOpenEditorFile(CurFile.Filename,-1,-1,[ofAddToRecent])<>mrOk then begin
PkgLinks.Free;
Exit;
if LazarusIDE.DoOpenEditorFile(CurFile.Filename,-1,-1,[ofAddToRecent])<>mrOk then
begin
FreeAndNil(PkgLinks);
Exit;
end;
end
else if Item is TPkgDependency then begin
else if Item is TPkgDependency then
begin
CurDependency:=TPkgDependency(Item);
if CurDependency.DependencyType=pdtLazarus then begin
if CurDependency.LoadPackageResult = lprSuccess then begin
if PackageEditingInterface.DoOpenPackageWithName(CurDependency.PackageName,[],false)<>mrOk then begin
PkgLinks.Free;
if CurDependency.DependencyType=pdtLazarus then
begin
if CurDependency.LoadPackageResult = lprSuccess then
begin
if PackageEditingInterface.DoOpenPackageWithName(CurDependency.PackageName,[],false)<>mrOk then
begin
FreeAndNil(PkgLinks);
Exit;
end;
end else begin
PackageLink:=FPropGui.FindOnlinePackageLink(CurDependency);
PackageLink:=FPropGui.FindOPLink(CurDependency);
if PackageLink<>nil then
PkgLinks.Add(PackageLink);
end;
@ -1154,7 +1150,6 @@ begin
DirectoryHierarchyButton.Hint:=lisPEShowDirectoryHierarchy;
IDEImages.AssignImage(DirectoryHierarchyButton, 'pkg_hierarchical');
FPropGui:=TProjPackFilePropGui.Create(PropsGroupBox, False);
FPropGui.OnGetPkgDep := @GetDependencyToUpdate;
FPropGui.ApplyDependencyButton.OnClick := @ApplyDependencyButtonClick;
@ -1201,7 +1196,7 @@ begin
if not CanUpdate(pefNeedUpdateFiles) then exit;
FilesBranch:=FilterEdit.GetCleanBranch(FFilesNode);
FilesBranch.ClearNodeData;
FreeNodeData(penFile);
FPropGui.FreeNodeData(penFile);
if LazProject<>nil then begin
FilterEdit.SelectedPart:=FNextSelectedPart;
FilterEdit.ShowDirHierarchy:=ShowDirectoryHierarchy;
@ -1212,7 +1207,7 @@ begin
while CurFile<>nil do begin
Filename:=CurFile.GetShortFilename(true);
if Filename<>'' then Begin
ANodeData := CreateNodeData(penFile, CurFile.Filename, False);
ANodeData := FPropGui.CreateNodeData(penFile, CurFile.Filename, False);
FilesBranch.AddNodeData(Filename, ANodeData, CurFile.Filename);
end;
CurFile:=CurFile.NextPartOfProject;
@ -1233,7 +1228,7 @@ begin
if not CanUpdate(pefNeedUpdateRequiredPkgs) then exit;
RequiredBranch:=FilterEdit.GetCleanBranch(FDependenciesNode);
RequiredBranch.ClearNodeData;
FreeNodeData(penDependency);
FPropGui.FreeNodeData(penDependency);
Dependency:=Nil;
if LazProject<>nil then begin
// required packages
@ -1249,12 +1244,12 @@ begin
NodeText:=Format(lisPckEditDefault, [NodeText, AFilename]);
end;
if Dependency.LoadPackageResult<>lprSuccess then
if FPropGui.FindOnlinePackageLink(Dependency)<>nil then
if FPropGui.FindOPLink(Dependency)<>nil then
NodeText:=NodeText+' '+lisPckEditAvailableOnline;
if Dependency.DependencyType=pdtFPMake then
NodeText:=NodeText+' '+lisPckEditFPMakePackage;
// Add the required package under the branch
ANodeData := CreateNodeData(penDependency, Dependency.PackageName, False);
ANodeData := FPropGui.CreateNodeData(penDependency, Dependency.PackageName, False);
RequiredBranch.AddNodeData(NodeText, ANodeData);
Dependency:=Dependency.NextRequiresDependency;
end;
@ -1272,7 +1267,7 @@ begin
RemovedBranch:=FilterEdit.GetCleanBranch(FRemovedDependenciesNode);
// Add all removed dependencies under the branch
while Dependency<>nil do begin
ANodeData := CreateNodeData(penDependency, Dependency.PackageName, True);
ANodeData := FPropGui.CreateNodeData(penDependency, Dependency.PackageName, True);
RemovedBranch.AddNodeData(Dependency.AsString, ANodeData);
Dependency:=Dependency.NextRequiresDependency;
end;
@ -1390,6 +1385,7 @@ begin
Name:=NonModalIDEWindowNames[nmiwProjectInspector];
Caption:=lisMenuProjectInspector;
KeyPreview:=true;
FPropGui:=TProjPackFilePropGui.Create(PropsGroupBox, False);
SetupComponents;
KeyPreview:=true;
SortAlphabetically := EnvironmentOptions.ProjInspSortAlphabetically;
@ -1397,17 +1393,13 @@ begin
end;
destructor TProjectInspectorForm.Destroy;
var
nt: TPENodeType;
begin
IdleConnected:=false;
LazProject:=nil;
inherited Destroy;
for nt:=Low(TPENodeType) to High(TPENodeType) do
FreeNodeData(nt);
FreeAndNil(FPropGui);
if ProjInspector=Self then
ProjInspector:=nil;
FreeAndNil(FPropGui);
end;
function TProjectInspectorForm.ExtendIncSearchPath(NewIncPaths: string): boolean;
@ -1684,28 +1676,6 @@ begin
end;
end;
procedure TProjectInspectorForm.FreeNodeData(Typ: TPENodeType);
var
NodeData,
n: TPENodeData;
begin
NodeData:=FProjectNodeDataList[Typ];
while NodeData<>nil do begin
n:=NodeData;
NodeData:=NodeData.Next;
n.Free;
end;
FProjectNodeDataList[Typ]:=nil;
End;
function TProjectInspectorForm.CreateNodeData(Typ: TPENodeType;
aName: string; aRemoved: boolean): TPENodeData;
Begin
Result := TPENodeData.Create(Typ,aName,aRemoved);
Result.Next := FProjectNodeDataList[Typ];
FProjectNodeDataList[Typ] := Result;
end;
function TProjectInspectorForm.GetNodeItem(NodeData: TPENodeData): TObject;
begin
Result:=nil;

View File

@ -256,12 +256,9 @@ type
FSortAlphabetically: boolean;
FDirSummaryLabel: TLabel;
FOptionsShownOfFile: TPkgFile;
FFirstNodeData: array[TPENodeType] of TPENodeData;
fUpdateLock: integer;
fForcedFlags: TPEFlags;
procedure DoAddNewFile(NewItem: TNewIDEItemTemplate);
procedure FreeNodeData(Typ: TPENodeType);
function CreateNodeData(Typ: TPENodeType; aName: string; aRemoved: boolean): TPENodeData;
function CreateToolButton(AName, ACaption, AHint, AImageName: String;
AOnClick: TNotifyEvent): TToolButton;
function CreateDivider: TToolButton;
@ -1354,28 +1351,25 @@ end;
procedure TPackageEditorForm.FormCreate(Sender: TObject);
begin
FPlugins:=TStringList.Create;
FPropGui:=TProjPackFilePropGui.Create(CommonOptionsTabSheet, True);
SetupComponents;
SortAlphabetically := EnvironmentOptions.PackageEditorSortAlphabetically;
ShowDirectoryHierarchy := EnvironmentOptions.PackageEditorShowDirHierarchy;
end;
procedure TPackageEditorForm.FormDestroy(Sender: TObject);
var
nt: TPENodeType;
begin
IdleConnected:=true;
FreeAndNil(FNextSelectedPart);
EnvironmentOptions.PackageEditorSortAlphabetically := SortAlphabetically;
EnvironmentOptions.PackageEditorShowDirHierarchy := ShowDirectoryHierarchy;
FilterEdit.ForceFilter('');
for nt:=Low(TPENodeType) to High(TPENodeType) do
FreeNodeData(nt);
if PackageEditorMenuRoot.MenuItem=ItemsPopupMenu.Items then
PackageEditorMenuRoot.MenuItem:=nil;
FreeAndNil(FPropGui);
PackageEditors.DoFreeEditor(LazPackage);
FLazPackage:=nil;
FreeAndNil(FPlugins);
FreeAndNil(FPropGui);
end;
procedure TPackageEditorForm.FormDropFiles(Sender: TObject;
@ -1448,30 +1442,6 @@ begin
PackageEditors.ViewPkgToDos(LazPackage);
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;
if Assigned(n.Branch) Then
n.Branch.FreeNodeData(n.Node);
n.Free;
end;
FFirstNodeData[Typ]:=nil;
end;
function TPackageEditorForm.CreateNodeData(Typ: TPENodeType; aName: string;
aRemoved: boolean): TPENodeData;
begin
Result:=TPENodeData.Create(Typ,aName,aRemoved);
Result.Next:=FFirstNodeData[Typ];
FFirstNodeData[Typ]:=Result;
end;
procedure TPackageEditorForm.UseAllUnitsInDirectoryMenuItemClick(Sender: TObject);
begin
DoUseUnitsInDirectory(true);
@ -1827,7 +1797,6 @@ begin
MoveUpBtn.Hint:=lisMoveSelectedUp;
MoveDownBtn.Hint:=lisMoveSelectedDown;
FPropGui:=TProjPackFilePropGui.Create(CommonOptionsTabSheet, True);
// file properties
FPropGui.AddToUsesPkgSectionCheckBox.OnChange := @AddToUsesPkgSectionCheckBoxChange;
FPropGui.CallRegisterProcCheckBox.OnChange := @CallRegisterProcCheckBoxChange;
@ -2266,7 +2235,7 @@ begin
// files belonging to package
FilesBranch:=FilterEdit.GetCleanBranch(FFilesNode);
FreeNodeData(penFile);
FPropGui.FreeNodeData(penFile);
FilesBranch.ClearNodeData;
FilterEdit.SelectedPart:=nil;
FilterEdit.ShowDirHierarchy:=ShowDirectoryHierarchy;
@ -2275,7 +2244,7 @@ begin
// collect and sort files
for i:=0 to LazPackage.FileCount-1 do begin
CurFile:=LazPackage.Files[i];
NodeData:=CreateNodeData(penFile,CurFile.Filename,false);
NodeData:=FPropGui.CreateNodeData(penFile,CurFile.Filename,false);
NodeData.FileType:=CurFile.FileType;
Filename:=CurFile.GetShortFilename(true);
if Filename='' then continue;
@ -2315,7 +2284,7 @@ begin
RemovedBranch.ClearNodeData;
for i:=0 to LazPackage.RemovedFilesCount-1 do begin
CurFile:=LazPackage.RemovedFiles[i];
NodeData:=CreateNodeData(penFile,CurFile.Filename,true);
NodeData:=FPropGui.CreateNodeData(penFile,CurFile.Filename,true);
RemovedBranch.AddNodeData(CurFile.GetShortFilename(true), NodeData);
end;
RemovedBranch.InvalidateBranch;
@ -2346,12 +2315,12 @@ begin
// required packages
RequiredBranch:=FilterEdit.GetCleanBranch(FRequiredPackagesNode);
FreeNodeData(penDependency);
FPropGui.FreeNodeData(penDependency);
RequiredBranch.ClearNodeData;
CurDependency:=LazPackage.FirstRequiredDependency;
FilterEdit.SelectedPart:=nil;
while CurDependency<>nil do begin
NodeData:=CreateNodeData(penDependency,CurDependency.PackageName,false);
NodeData:=FPropGui.CreateNodeData(penDependency,CurDependency.PackageName,false);
if (FNextSelectedPart<>nil) and (FNextSelectedPart.Typ=penDependency)
and (FNextSelectedPart.Name=NodeData.Name)
then
@ -2374,7 +2343,7 @@ begin
RemovedBranch:=FilterEdit.GetCleanBranch(FRemovedRequiredNode);
RemovedBranch.ClearNodeData;
while CurDependency<>nil do begin
NodeData:=CreateNodeData(penDependency,CurDependency.PackageName,true);
NodeData:=FPropGui.CreateNodeData(penDependency,CurDependency.PackageName,true);
RemovedBranch.AddNodeData(DependencyAsString(CurDependency), NodeData);
CurDependency:=CurDependency.NextRequiresDependency;
end;

View File

@ -56,6 +56,7 @@ type
TProjPackFilePropGui = class
private
fOwner: TWinControl;
FNodeDataList: array[TPENodeType] of TPENodeData;
fOnGetPkgDep: TGetPkgDepEvent;
procedure MinMaxVersionEditChange(Sender: TObject);
procedure UseMinVersionCheckBoxChange(Sender: TObject);
@ -83,8 +84,10 @@ type
constructor Create(aOwner: TWinControl; aPackageGui: Boolean);
destructor Destroy; override;
function CreateNodeData(Typ: TPENodeType; aName: string; aRemoved: boolean): TPENodeData;
procedure FreeNodeData(Typ: TPENodeType);
function GetDependencyImageIndex(aDep: TPkgDependencyID): Integer;
function FindOnlinePackageLink(const ADependency: TPkgDependencyID): TPackageLink;
function FindOPLink(const ADependency: TPkgDependencyID): TPackageLink;
procedure SetAddToUsesCB(State: TMultiBool);
procedure SetCallRegisterProcCB(State: TMultiBool);
procedure SetRegisteredPluginsGB(aPlugins: TStringList);
@ -98,6 +101,7 @@ type
end;
function GetNodeData(TVNode: TTreeNode): TPENodeData;
function NodeTreeIsIn(xIterNode, xParentNode: TTreeNode): Boolean;
implementation
@ -115,6 +119,14 @@ begin
Result:=TPENodeData(o);
end;
function NodeTreeIsIn(xIterNode, xParentNode: TTreeNode): Boolean;
// Is xIterNode under xParentNode, or the xParentNode itself?
begin
Result := (xIterNode = xParentNode);
if not Result and Assigned(xIterNode) then
Result := NodeTreeIsIn(xIterNode.Parent, xParentNode);
end;
{ TProjPackFilePropGui }
constructor TProjPackFilePropGui.Create(aOwner: TWinControl; aPackageGui: Boolean);
@ -251,23 +263,50 @@ begin
end;
destructor TProjPackFilePropGui.Destroy;
var
nt: TPENodeType;
begin
for nt:=Low(TPENodeType) to High(TPENodeType) do
FreeNodeData(nt);
inherited Destroy;
end;
function TProjPackFilePropGui.CreateNodeData(Typ: TPENodeType; aName: string;
aRemoved: boolean): TPENodeData;
begin
Result:=TPENodeData.Create(Typ,aName,aRemoved);
Result.Next:=FNodeDataList[Typ];
FNodeDataList[Typ]:=Result;
end;
procedure TProjPackFilePropGui.FreeNodeData(Typ: TPENodeType);
var
NodeData, n: TPENodeData;
begin
NodeData:=FNodeDataList[Typ];
while NodeData<>nil do begin
n:=NodeData;
NodeData:=NodeData.Next;
if Assigned(n.Branch) Then
n.Branch.FreeNodeData(n.Node);
n.Free;
end;
FNodeDataList[Typ]:=nil;
end;
function TProjPackFilePropGui.GetDependencyImageIndex(aDep: TPkgDependencyID): Integer;
begin
if aDep.Removed then
Result := ImageIndexRemovedRequired
else if aDep.LoadPackageResult=lprSuccess then
Result := ImageIndexRequired
else if Assigned(FindOnlinePackageLink(aDep)) then
else if Assigned(FindOPLink(aDep)) then
Result := ImageIndexAvailableOnline
else
Result := ImageIndexConflict;
end;
function TProjPackFilePropGui.FindOnlinePackageLink(const ADependency: TPkgDependencyID): TPackageLink;
function TProjPackFilePropGui.FindOPLink(const ADependency: TPkgDependencyID): TPackageLink;
var
PackageLink: TPackageLink;
begin