IDE: Fix wrong typecasts in TAddPkgDependencyDialog. Local packages could be marked as Online. Issue #37330.

git-svn-id: trunk@63545 -
This commit is contained in:
juha 2020-07-11 20:34:25 +00:00
parent f091c464a5
commit b429d78258

View File

@ -5,16 +5,17 @@ unit AddPkgDependencyDlg;
interface interface
uses uses
Classes, SysUtils, Types, Laz_AVL_Tree, fgl, Classes, SysUtils, Laz_AVL_Tree, fgl,
// LCL // LCL
Forms, Controls, Dialogs, StdCtrls, ButtonPanel, LCLProc, LCLType, Graphics, LCLType, LCLIntf, Forms, Controls, Dialogs, StdCtrls, ButtonPanel, Graphics, ExtCtrls,
LCLIntf, ExtCtrls,
// LazControls // LazControls
ListFilterEdit, ListFilterEdit,
// BuildIntf
PackageIntf, PackageLinkIntf, PackageDependencyIntf,
// IDEIntf // IDEIntf
IDEWindowIntf, PackageDependencyIntf, PackageIntf, IDEDialogs, IDEImagesIntf, PackageLinkIntf, MainIntf, IDEWindowIntf, IDEDialogs,
// IDE // IDE
LazarusIDEStrConsts, PackageDefs, PackageSystem, ProjPackCommon, ProjPackChecks; MainIntf, LazarusIDEStrConsts, PackageDefs, PackageSystem, ProjPackCommon, ProjPackChecks;
type type
@ -44,13 +45,11 @@ type
procedure FormClose(Sender: TObject; var {%H-}CloseAction: TCloseAction); procedure FormClose(Sender: TObject; var {%H-}CloseAction: TCloseAction);
procedure FormCreate(Sender: TObject); procedure FormCreate(Sender: TObject);
procedure OKButtonClick(Sender: TObject); procedure OKButtonClick(Sender: TObject);
function FindPackageLink(const ALazPackageID: TLazPackageID): TPackageLink;
function InstallOnlinePackages(out ANeedToRebuild: Boolean): TModalResult; function InstallOnlinePackages(out ANeedToRebuild: Boolean): TModalResult;
private private
fUpdating: Boolean; fUpdating: Boolean;
fSL: TStringList; fPackages: TAVLTree; // tree of TLazPackage or TPackageLink.
fPackages: TAVLTree; // tree of TLazPackage or TPackageLink fProjPack: IProjPack; // Project or package, a recipient of the dependency.
fProjPack: IProjPack;
fResultDependencies: TPkgDependencyList; fResultDependencies: TPkgDependencyList;
procedure AddUniquePackagesToList(APackageID: TLazPackageID); procedure AddUniquePackagesToList(APackageID: TLazPackageID);
procedure UpdateAvailableDependencyNames; procedure UpdateAvailableDependencyNames;
@ -118,44 +117,23 @@ end;
procedure TAddPkgDependencyDialog.FormClose(Sender: TObject; var CloseAction: TCloseAction); procedure TAddPkgDependencyDialog.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin begin
fSL.Free;
fSL := nil;
IDEDialogLayoutList.SaveLayout(Self); IDEDialogLayoutList.SaveLayout(Self);
end; end;
procedure TAddPkgDependencyDialog.FormCreate(Sender: TObject); procedure TAddPkgDependencyDialog.FormCreate(Sender: TObject);
begin begin
fSL := TStringList.Create;
DependPkgTypeLabel.Visible := OPMInterface <> nil; DependPkgTypeLabel.Visible := OPMInterface <> nil;
pnLocalPkg.Visible := OPMInterface <> nil; pnLocalPkg.Visible := OPMInterface <> nil;
pnOnlinePkg.Visible := OPMInterface <> nil; pnOnlinePkg.Visible := OPMInterface <> nil;
BP.CloseButton.Visible := False; BP.CloseButton.Visible := False; // CloseButton is now "Install".
DependPkgNameListBox.ItemHeight := MulDiv(20, Screen.PixelsPerInch, 96); DependPkgNameListBox.ItemHeight := MulDiv(20, Screen.PixelsPerInch, 96);
end; end;
function TAddPkgDependencyDialog.FindPackageLink(const ALazPackageID:
TLazPackageID): TPackageLink;
var
I: Integer;
begin
Result := nil;
if (fSL = nil) or (fSL.Count = 0) then
Exit;
for I := 0 to fSL.Count - 1 do
begin
if TLazPackageID(fSL.Objects[I]) = ALazPackageID then
begin
Result := TPackageLink(fSL.Objects[I]);
Break;
end;
end;
end;
procedure TAddPkgDependencyDialog.DependPkgNameListBoxDrawItem( procedure TAddPkgDependencyDialog.DependPkgNameListBoxDrawItem(
Control: TWinControl; Index: Integer; ARect: TRect; State: TOwnerDrawState); Control: TWinControl; Index: Integer; ARect: TRect; State: TOwnerDrawState);
var var
ItemText: string; Txt: string;
PackageLink: TPackageLink; Pkg: TLazPackageID;
begin begin
with (Control as TListBox).Canvas do with (Control as TListBox).Canvas do
begin begin
@ -164,60 +142,44 @@ begin
Pen.Color := clHighlightText; Pen.Color := clHighlightText;
Brush.Color := clHighlight; Brush.Color := clHighlight;
end end
else else begin
begin
Pen.Color := (Control as TListBox).Font.Color; Pen.Color := (Control as TListBox).Font.Color;
Brush.Color := (Control as TListBox).Color; Pkg := TLazPackageID(DependPkgNameListBox.Items.Objects[Index]);
if Assigned(OPMInterface) then if (Pkg is TPackageLink) and (TPackageLink(Pkg).Origin = ploOnline) then
begin
PackageLink := FindPackageLink(TLazPackageID(DependPkgNameListBox.Items.Objects[Index]));
if PackageLink <> nil then
begin
if PackageLink.Origin = ploOnline then
Brush.Color := pnOnlinePkg.Color Brush.Color := pnOnlinePkg.Color
else else
Brush.Color := pnLocalPkg.Color Brush.Color := pnLocalPkg.Color
end; end;
end
end;
FillRect(ARect); FillRect(ARect);
ItemText := (Control as TListBox).Items[Index]; Txt := (Control as TListBox).Items[Index];
InflateRect(ARect, -1, -1); InflateRect(ARect, -1, -1);
inc(ARect.Left,3); inc(ARect.Left,3);
DrawText(Handle, PChar(ItemText), Length(ItemText), ARect, DT_LEFT or DT_VCENTER or DT_SINGLELINE); DrawText(Handle, PChar(Txt), Length(Txt), ARect, DT_LEFT or DT_VCENTER or DT_SINGLELINE);
end; end;
end; end;
function TAddPkgDependencyDialog.IsInstallButtonVisible: Boolean; function TAddPkgDependencyDialog.IsInstallButtonVisible: Boolean;
var var
I: Integer; I: Integer;
PackageLink: TPackageLink; Pkg: TLazPackageID;
begin begin
Result := False;
if (OPMInterface = nil) or (fSL = nil) or (fSL.Count = 0) then
Exit;
for I := 0 to DependPkgNameListBox.Count - 1 do for I := 0 to DependPkgNameListBox.Count - 1 do
begin begin
if DependPkgNameListBox.Selected[I] then if DependPkgNameListBox.Selected[I] then
begin begin
PackageLink := FindPackageLink(TLazPackageID(DependPkgNameListBox.Items.Objects[I])); Pkg := TLazPackageID(DependPkgNameListBox.Items.Objects[I]);
if (PackageLink <> nil) and (PackageLink.Origin = ploOnline) then if (Pkg is TPackageLink) and (TPackageLink(Pkg).Origin = ploOnline) then
begin Exit(True);
Result := True;
Break;
end;
end; end;
end; end;
Result := False;
end; end;
procedure TAddPkgDependencyDialog.DependPkgNameListBoxSelectionChange( procedure TAddPkgDependencyDialog.DependPkgNameListBoxSelectionChange(
Sender: TObject; User: boolean); Sender: TObject; User: boolean);
begin begin
BP.CloseButton.Visible := IsInstallButtonVisible; BP.CloseButton.Visible := IsInstallButtonVisible;
if BP.CloseButton.Visible then BP.OKButton.Enabled := not BP.CloseButton.Visible;
BP.OKButton.Enabled := False
else
BP.OKButton.Enabled := True;
end; end;
procedure TAddPkgDependencyDialog.cbLocalPkgChange(Sender: TObject); procedure TAddPkgDependencyDialog.cbLocalPkgChange(Sender: TObject);
@ -228,7 +190,7 @@ end;
function TAddPkgDependencyDialog.InstallOnlinePackages(out ANeedToRebuild: Boolean): TModalResult; function TAddPkgDependencyDialog.InstallOnlinePackages(out ANeedToRebuild: Boolean): TModalResult;
var var
I: Integer; I: Integer;
PackageLink: TPackageLink; Pkg: TLazPackageID;
PkgList: TList; PkgList: TList;
begin begin
ANeedToRebuild := False; ANeedToRebuild := False;
@ -239,16 +201,18 @@ begin
begin begin
if DependPkgNameListBox.Selected[I] then if DependPkgNameListBox.Selected[I] then
begin begin
PackageLink := FindPackageLink(TLazPackageID(DependPkgNameListBox.Items.Objects[I])); Pkg := TLazPackageID(DependPkgNameListBox.Items.Objects[I]);
if (PackageLink <> nil) and (PackageLink.Origin = ploOnline) then if (Pkg is TPackageLink) and (TPackageLink(Pkg).Origin = ploOnline) then
PkgList.Add(PackageLink); PkgList.Add(Pkg);
end; end;
end; end;
if PkgList.Count > 0 then if PkgList.Count > 0 then
begin
Assert(Assigned(OPMInterface), 'InstallOnlinePackages: OPMInterface=Nil');
Result := OPMInterface.InstallPackages(PkgList, ANeedToRebuild); Result := OPMInterface.InstallPackages(PkgList, ANeedToRebuild);
end;
finally finally
PkgList.Free; PkgList.Free;
PkgList := nil;
end; end;
end; end;
@ -277,50 +241,39 @@ end;
procedure TAddPkgDependencyDialog.UpdateAvailableDependencyNames; procedure TAddPkgDependencyDialog.UpdateAvailableDependencyNames;
var var
ANode: TAVLTreeNode; ANode: TAVLTreeNode;
Pkg: TLazPackageID;
CntLocalPkg: Integer; CntLocalPkg: Integer;
CntOnlinePkg: Integer; CntOnlinePkg: Integer;
begin begin
if fUpdating then if fUpdating then
Exit; Exit;
fUpdating := True; fUpdating := True;
try try
CntLocalPkg := 0; CntLocalPkg := 0;
CntOnlinePkg := 0; CntOnlinePkg := 0;
DependPkgNameListBox.Clear; DependPkgNameFilter.Items.Clear;
fSL.Clear;
fPackages.Clear; fPackages.Clear;
PackageGraph.IteratePackages(fpfSearchAllExisting,@AddUniquePackagesToList); PackageGraph.IteratePackages(fpfSearchAllExisting,@AddUniquePackagesToList);
ANode:=fPackages.FindLowest; ANode:=fPackages.FindLowest;
while ANode<>nil do begin while ANode<>nil do
if Assigned(OPMInterface) then
begin begin
if (TPackageLink(ANode.Data).Origin = ploOnline) and (cbOnlinePkg.Checked) then Pkg := TLazPackageID(ANode.Data);
if (Pkg is TPackageLink) and (TPackageLink(Pkg).Origin = ploOnline) then
begin
if cbOnlinePkg.Checked then
begin begin
Inc(CntOnlinePkg); Inc(CntOnlinePkg);
fSL.AddObject(TLazPackageID(ANode.Data).Name, TLazPackageID(ANode.Data)); DependPkgNameFilter.Items.AddObject(Pkg.Name, Pkg);
end;
if (TPackageLink(ANode.Data).Origin <> ploOnline) and (cbLocalPkg.Checked) then
begin
Inc(CntLocalPkg);
fSL.AddObject(TLazPackageID(ANode.Data).Name, TLazPackageID(ANode.Data));
end; end;
end end
else else if cbLocalPkg.Checked then
begin begin
Inc(CntLocalPkg); Inc(CntLocalPkg);
fSL.AddObject(TLazPackageID(ANode.Data).Name, TLazPackageID(ANode.Data)); DependPkgNameFilter.Items.AddObject(Pkg.Name, Pkg);
end; end;
ANode:=fPackages.FindSuccessor(ANode); ANode:=fPackages.FindSuccessor(ANode);
end; end;
DependPkgNameFilter.Items.BeginUpdate;
try
DependPkgNameFilter.Items.Clear;
DependPkgNameFilter.Items.Assign(fSL);
DependPkgNameFilter.InvalidateFilter; DependPkgNameFilter.InvalidateFilter;
finally
DependPkgNameFilter.Items.EndUpdate;
end;
if Assigned(OPMInterface) then if Assigned(OPMInterface) then
begin begin
cbLocalPkg.Caption := Format(lisProjAddLocalPkg, [IntToStr(CntLocalPkg)]); cbLocalPkg.Caption := Format(lisProjAddLocalPkg, [IntToStr(CntLocalPkg)]);