mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-15 21:39:12 +02:00
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:
parent
f091c464a5
commit
b429d78258
@ -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)]);
|
||||||
|
Loading…
Reference in New Issue
Block a user