diff --git a/packager/packageeditor.pas b/packager/packageeditor.pas index 2134a8fcc7..ab8381c664 100644 --- a/packager/packageeditor.pas +++ b/packager/packageeditor.pas @@ -317,6 +317,7 @@ type FShowDirectoryHierarchy: boolean; FSortAlphabetically: boolean; FDirSummaryLabel: TLabel; + FSingleSelectedNode: TTreeNode; FSingleSelectedFile: TPkgFile; FSingleSelectedDep: TPkgDependency; FFirstNodeData: array[TPENodeType] of TPENodeData; @@ -325,6 +326,7 @@ type procedure DoAddNewFile(NewItem: TNewIDEItemTemplate); procedure FreeNodeData(Typ: TPENodeType); function CreateNodeData(Typ: TPENodeType; aName: string; aRemoved: boolean): TPENodeData; + function GetSingleSelectedDep: TPkgDependency; procedure SetDependencyDefaultFilename(AsPreferred: boolean); procedure SetIdleConnected(AValue: boolean); procedure SetShowDirectoryHierarchy(const AValue: boolean); @@ -332,7 +334,8 @@ type procedure SetupComponents; function OnTreeViewGetImageIndex({%H-}Str: String; Data: TObject; var {%H-}AIsEnabled: Boolean): Integer; procedure ShowAddDialogEx(AType: TAddToPkgType); - procedure UpdateNodeImage(TVNode: TTreeNode; NodeData: TPENodeData); + procedure UpdateNodeImage(TVNode: TTreeNode); + procedure UpdateNodeImage(TVNode: TTreeNode; NodeData: TPENodeData; Item: TObject); procedure UpdatePending; function CanUpdate(Flag: TPEFlag; Immediately: boolean): boolean; procedure UpdateTitle(Immediately: boolean = false); @@ -631,13 +634,29 @@ begin PkgEditMenuViewPackageSource:=RegisterIDEMenuCommand(AParent,'View Package Source',lisPckEditViewPackageSource); end; +function DependencyAsString(ADependency: TPkgDependency): string; +// A display text for a dependency including min/max versions + other info. +// ToDo: Modify Dependency.AsString output to replace this function, +// or create a new method for the task. +var + aFilename: String; +begin + Result:=ADependency.AsString; + if ADependency.DefaultFilename<>'' then begin + aFilename:=ADependency.MakeFilenameRelativeToOwner(ADependency.DefaultFilename); + if ADependency.PreferDefaultFilename then + Result:=Result+' in '+aFilename // like the 'in' keyword in uses section + else + Result:=Format(lisPckEditDefault, [Result, aFilename]); + end; +end; + { TPENodeData } -constructor TPENodeData.Create(aTyp: TPENodeType; aName: string; - aRemoved: boolean); +constructor TPENodeData.Create(aTyp: TPENodeType; aName: string; aRemoved: boolean); begin Typ:=aTyp; - Name:=aName;; + Name:=aName; Removed:=aRemoved; end; @@ -1405,7 +1424,7 @@ begin fForcedFlags:=fForcedFlags+[pefNeedUpdateRemovedFiles]; if PkgCount>0 then fForcedFlags:=fForcedFlags+[pefNeedUpdateRemovedFiles,pefNeedUpdateRequiredPkgs]; - LazPackage.Modified:=True; // This will update also other possible editors. + LazPackage.Modified:=True; finally EndUpdate; @@ -1659,9 +1678,8 @@ var Flags: TPkgDependencyFlags; MinVers, MaxVers: TPkgVersion; begin - if LazPackage=nil then exit; - if FSingleSelectedDep=nil then exit; - if LazPackage.FindDependencyByName(FSingleSelectedDep.PackageName)<>FSingleSelectedDep + if (LazPackage=nil) or (FSingleSelectedNode=nil) or (FSingleSelectedDep=nil) + or (LazPackage.FindDependencyByName(FSingleSelectedDep.PackageName)<>FSingleSelectedDep) then exit; MinVers:=TPkgVersion.Create; @@ -1704,7 +1722,10 @@ begin FSingleSelectedDep.Flags := Flags; FSingleSelectedDep.MinVersion.Assign(MinVers); FSingleSelectedDep.MaxVersion.Assign(MaxVers); - LazPackage.ModifySilently; + + UpdateNodeImage(FSingleSelectedNode); + //fForcedFlags:=[pefNeedUpdateRequiredPkgs]; + LazPackage.Modified:=True; finally MaxVers.Free; MinVers.Free; @@ -1730,7 +1751,7 @@ begin CurFile.HasRegisterProc:=CallRegisterProcCheckBox.Checked; if not NodeData.Removed then LazPackage.ModifySilently; - UpdateNodeImage(TVNode, NodeData); + UpdateNodeImage(TVNode, NodeData, Item); end; end; @@ -2303,13 +2324,31 @@ begin Caption:=NewCaption; end; -procedure TPackageEditorForm.UpdateNodeImage(TVNode: TTreeNode; NodeData: TPENodeData); +procedure TPackageEditorForm.UpdateNodeImage(TVNode: TTreeNode); var - ena: Boolean; - ImgIndex: Integer; + NodeData: TPENodeData; + Item: TObject; begin - ena := True; // String param is not used. - ImgIndex:=OnTreeViewGetImageIndex('', NodeData, ena); + if GetNodeDataItem(TVNode, NodeData, Item) then + UpdateNodeImage(TVNode, NodeData, Item); +end; + +procedure TPackageEditorForm.UpdateNodeImage(TVNode: TTreeNode; + NodeData: TPENodeData; Item: TObject); +var + PkgDependency: TPkgDependency; + ImgIndex: Integer; + Ena: Boolean; +begin + Assert(Assigned(Item), 'TPackageEditorForm.UpdateNodeImage: Item = Nil.'); + if Item is TPkgDependency then begin + PkgDependency:=TPkgDependency(Item); + // Try to load the package again. Min/max version may have changed. + PkgDependency.LoadPackageResult := lprUndefined; + PackageGraph.OpenDependency(PkgDependency, False); + end; + Ena := True; // Neither Ena nor the String param are used. + ImgIndex := OnTreeViewGetImageIndex('', NodeData, Ena); TVNode.ImageIndex:=ImgIndex; TVNode.SelectedIndex:=ImgIndex; end; @@ -2523,7 +2562,7 @@ procedure TPackageEditorForm.UpdateRequiredPkgs(Immediately: boolean); var CurDependency: TPkgDependency; RequiredBranch, RemovedBranch: TTreeFilterBranch; - CurNodeText, aFilename, OldFilter: String; + OldFilter: String; NodeData: TPENodeData; begin if not CanUpdate(pefNeedUpdateRequiredPkgs,Immediately) then exit; @@ -2537,20 +2576,12 @@ begin CurDependency:=LazPackage.FirstRequiredDependency; FilterEdit.SelectedPart:=nil; while CurDependency<>nil do begin - CurNodeText:=CurDependency.AsString; - if CurDependency.DefaultFilename<>'' then begin - aFilename:=CurDependency.MakeFilenameRelativeToOwner(CurDependency.DefaultFilename); - if CurDependency.PreferDefaultFilename then - CurNodeText:=CurNodeText+' in '+aFilename // like the 'in' keyword in uses section - else - CurNodeText:=Format(lisPckEditDefault, [CurNodeText, aFilename]); - end; NodeData:=CreateNodeData(penDependency,CurDependency.PackageName,false); if (FNextSelectedPart<>nil) and (FNextSelectedPart.Typ=penDependency) and (FNextSelectedPart.Name=NodeData.Name) then FilterEdit.SelectedPart:=NodeData; - RequiredBranch.AddNodeData(CurNodeText, NodeData); + RequiredBranch.AddNodeData(DependencyAsString(CurDependency), NodeData); CurDependency:=CurDependency.NextRequiresDependency; end; if (FNextSelectedPart<>nil) and (FNextSelectedPart.Typ=penDependency) then @@ -2569,7 +2600,7 @@ begin RemovedBranch.ClearNodeData; while CurDependency<>nil do begin NodeData:=CreateNodeData(penDependency,CurDependency.PackageName,true); - RemovedBranch.AddNodeData(CurDependency.AsString, NodeData); + RemovedBranch.AddNodeData(DependencyAsString(CurDependency), NodeData); CurDependency:=CurDependency.NextRequiresDependency; end; RemovedBranch.InvalidateBranch; @@ -2646,7 +2677,6 @@ var TVNode: TTreeNode; SingleSelectedDirectory: TTreeNode; SingleSelectedRemoved: Boolean; - SingleSelected: TTreeNode; FileCount: integer; HasRegisterProcCount: integer; AddToUsesPkgSectionCount: integer; @@ -2656,11 +2686,11 @@ begin FPlugins.Clear; // check selection + FSingleSelectedNode:=nil; FSingleSelectedDep:=nil; FSingleSelectedFile:=nil; SingleSelectedDirectory:=nil; SingleSelectedRemoved:=false; - SingleSelected:=nil; SelFileCount:=0; SelDepCount:=0; SelHasRegisterProc:=mubNone; @@ -2676,7 +2706,7 @@ begin CurFile:=TPkgFile(Item); inc(SelFileCount); FSingleSelectedFile:=CurFile; - SingleSelected:=TVNode; + FSingleSelectedNode:=TVNode; SingleSelectedRemoved:=NodeData.Removed; MergeMultiBool(SelHasRegisterProc,CurFile.HasRegisterProc); if CurFile.FileType in PkgFileUnitTypes then begin @@ -2703,13 +2733,13 @@ begin inc(SelDepCount); CurDependency:=TPkgDependency(Item); FSingleSelectedDep:=CurDependency; - SingleSelected:=TVNode; + FSingleSelectedNode:=TVNode; SingleSelectedRemoved:=NodeData.Removed; end; end else if IsDirectoryNode(TVNode) or (TVNode=FFilesNode) then begin inc(SelDirCount); SingleSelectedDirectory:=TVNode; - SingleSelected:=TVNode; + FSingleSelectedNode:=TVNode; end; end; @@ -2718,7 +2748,7 @@ begin FSingleSelectedFile:=nil; FSingleSelectedDep:=nil; SingleSelectedDirectory:=nil; - SingleSelected:=nil; + FSingleSelectedNode:=nil; end; OnlyFilesSelected:=(SelFileCount>0) and (SelDepCount=0) and (SelDirCount=0); OnlyFilesWithUnitsSelected:=OnlyFilesSelected and (SelUnitCount>0); @@ -2731,8 +2761,8 @@ begin // move up/down (only single selection) aVisible:=(not (SortAlphabetically or SingleSelectedRemoved)) and ((FSingleSelectedFile<>nil) or (FSingleSelectedDep<>nil)); - MoveUpBtn.Enabled :=aVisible and Assigned(SingleSelected.GetPrevVisibleSibling); - MoveDownBtn.Enabled:=aVisible and Assigned(SingleSelected.GetNextVisibleSibling); + MoveUpBtn.Enabled :=aVisible and Assigned(FSingleSelectedNode.GetPrevVisibleSibling); + MoveDownBtn.Enabled:=aVisible and Assigned(FSingleSelectedNode.GetNextVisibleSibling); // Min/Max version of dependency (only single selection) aVisible:=FSingleSelectedDep<>nil; @@ -2798,33 +2828,37 @@ begin end; end; -procedure TPackageEditorForm.UpdateApplyDependencyButton(Immediately: boolean); +function TPackageEditorForm.GetSingleSelectedDep: TPkgDependency; var - DependencyChanged: Boolean; - AVersion: TPkgVersion; i: Integer; TVNode: TTreeNode; NodeData: TPENodeData; Item: TObject; begin - if not CanUpdate(pefNeedUpdateApplyDependencyButton,Immediately) then exit; - - FSingleSelectedDep:=nil; + Result:=nil; for i:=0 to ItemsTreeView.SelectionCount-1 do begin TVNode:=ItemsTreeView.Selections[i]; if not GetNodeDataItem(TVNode,NodeData,Item) then continue; if Item is TPkgFile then begin - FSingleSelectedDep:=nil; + Result:=nil; break; end else if Item is TPkgDependency then begin - if FSingleSelectedDep<>nil then begin - FSingleSelectedDep:=nil; + if Result<>nil then begin + Result:=nil; break; end; - FSingleSelectedDep:=TPkgDependency(Item); + Result:=TPkgDependency(Item); end; end; +end; +procedure TPackageEditorForm.UpdateApplyDependencyButton(Immediately: boolean); +var + DependencyChanged: Boolean; + AVersion: TPkgVersion; +begin + if not CanUpdate(pefNeedUpdateApplyDependencyButton,Immediately) then exit; + FSingleSelectedDep:=GetSingleSelectedDep; DependencyChanged:=false; if (FSingleSelectedDep<>nil) then begin // check min version @@ -3257,8 +3291,9 @@ begin if not Moved then exit; LazPackage.ModifySilently; RequiredBranch:=FilterEdit.GetExistingBranch(FRequiredPackagesNode); - OldIndex:=RequiredBranch.Items.IndexOf(FSingleSelectedDep.PackageName); - Assert(OldIndex<>-1, 'TPackageEditorForm.DoMoveDependency: "'+FSingleSelectedDep.PackageName+'" not found in FilterBranch.'); + OldIndex:=RequiredBranch.Items.IndexOf(DependencyAsString(FSingleSelectedDep)); + Assert(OldIndex<>-1, 'TPackageEditorForm.DoMoveDependency: "' + + DependencyAsString(FSingleSelectedDep)+'" not found in FilterBranch.'); NewIndex:=OldIndex+Offset; RequiredBranch.Move(OldIndex,NewIndex); UpdatePEProperties;