Merged revision(s) 56058 #648e0fd02c, 56068-56069 #0f43b7c709-#0f43b7c709, 56082 #e05552a178 from trunk:

Package editor: Fix moving dependencies up/down. Use the display name for searching. Issue #32546.
........
Package editor: Update the view after modifying dependent package parameters. Issue #32546.
........
Package editor: Refactoring.
........
Package editor: Update the image for dependent package after modifying min/max version. Issue #32546.
........

git-svn-id: branches/fixes_1_8@56089 -
This commit is contained in:
maxim 2017-10-16 22:44:47 +00:00
parent 0f7b690083
commit 682a2912bd

View File

@ -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;