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