IDE: configure install packages dialog: added icons

git-svn-id: trunk@26661 -
This commit is contained in:
mattias 2010-07-15 10:44:48 +00:00
parent b18be4646a
commit 8851d2a322
5 changed files with 211 additions and 117 deletions

View File

@ -2,7 +2,7 @@
This source is only used to compile and install the package. This source is only used to compile and install the package.
} }
unit LazControls; unit lazcontrols;
interface interface

View File

@ -2,7 +2,7 @@
This source is only used to compile and install the package. This source is only used to compile and install the package.
} }
unit AnchorDockingDsgn; unit anchordockingdsgn;
interface interface

View File

@ -4837,6 +4837,8 @@ resourcestring
lisHideMessageViaDirective = 'Hide message via directive'; lisHideMessageViaDirective = 'Hide message via directive';
lisRemoveLocalVariable2 = 'Remove local variable'; lisRemoveLocalVariable2 = 'Remove local variable';
lisNoHints = 'no hints'; lisNoHints = 'no hints';
lisToInstallYouMustCompileAndRestartTheIDE = 'To install you must compile '
+'and restart the IDE';
implementation implementation

View File

@ -3,7 +3,7 @@ object InstallPkgSetDialog: TInstallPkgSetDialog
Height = 442 Height = 442
Top = 167 Top = 167
Width = 572 Width = 572
ActiveControl = InstallListBox ActiveControl = InstallTreeView
BorderStyle = bsSizeToolWin BorderStyle = bsSizeToolWin
Caption = 'InstallPkgSetDialog' Caption = 'InstallPkgSetDialog'
ClientHeight = 442 ClientHeight = 442
@ -15,101 +15,107 @@ object InstallPkgSetDialog: TInstallPkgSetDialog
LCLVersion = '0.9.29' LCLVersion = '0.9.29'
object InstallPkgGroupBox: TGroupBox object InstallPkgGroupBox: TGroupBox
AnchorSideLeft.Control = Owner AnchorSideLeft.Control = Owner
AnchorSideTop.Control = Owner AnchorSideTop.Control = NoteLabel
AnchorSideTop.Side = asrBottom
AnchorSideBottom.Control = PkgInfoGroupBox AnchorSideBottom.Control = PkgInfoGroupBox
Left = 6 Left = 6
Height = 292 Height = 269
Top = 6 Top = 30
Width = 255 Width = 255
Anchors = [akTop, akLeft, akBottom] Anchors = [akTop, akLeft, akBottom]
BorderSpacing.Around = 6 BorderSpacing.Around = 6
Caption = 'InstallPkgGroupBox' Caption = 'InstallPkgGroupBox'
ClientHeight = 273 ClientHeight = 250
ClientWidth = 251 ClientWidth = 251
TabOrder = 0 TabOrder = 0
object InstallListBox: TListBox
Left = 6
Height = 168
Top = 6
Width = 239
Align = alClient
BorderSpacing.Around = 6
ClickOnSelChange = False
ItemHeight = 0
MultiSelect = True
OnDblClick = InstallListBoxDblClick
OnSelectionChange = InstallListBoxSelectionChange
TabOrder = 0
TopIndex = -1
end
object UninstallButton: TButton
Left = 6
Height = 25
Top = 180
Width = 239
Align = alBottom
BorderSpacing.Around = 6
Caption = 'UninstallButton'
OnClick = UninstallButtonClick
TabOrder = 1
end
object ImportButton: TButton object ImportButton: TButton
Left = 6 Left = 6
Height = 25 Height = 25
Top = 211 Top = 188
Width = 239 Width = 239
Align = alBottom Align = alBottom
BorderSpacing.Around = 6 BorderSpacing.Around = 6
Caption = 'ImportButton' Caption = 'ImportButton'
OnClick = ImportButtonClick OnClick = ImportButtonClick
TabOrder = 2 TabOrder = 0
end end
object ExportButton: TButton object ExportButton: TButton
Left = 6 Left = 6
Height = 25 Height = 25
Top = 242 Top = 219
Width = 239 Width = 239
Align = alBottom Align = alBottom
BorderSpacing.Around = 6 BorderSpacing.Around = 6
Caption = 'ExportButton' Caption = 'ExportButton'
OnClick = ExportButtonClick OnClick = ExportButtonClick
TabOrder = 1
end
object InstallTreeView: TTreeView
Left = 6
Height = 145
Top = 6
Width = 239
Align = alClient
BorderSpacing.Around = 6
DefaultItemHeight = 19
ReadOnly = True
ShowButtons = False
ShowLines = False
ShowRoot = False
TabOrder = 2
OnDblClick = InstallTreeViewDblClick
OnSelectionChanged = InstallTreeViewSelectionChanged
Options = [tvoAllowMultiselect, tvoAutoItemHeight, tvoHideSelection, tvoKeepCollapsedNodes, tvoReadOnly, tvoToolTips, tvoThemedDraw]
end
object UninstallButton: TBitBtn
Left = 6
Height = 25
Top = 157
Width = 239
Align = alBottom
BorderSpacing.Around = 6
Caption = 'UninstallButton'
OnClick = UninstallButtonClick
TabOrder = 3 TabOrder = 3
end end
end end
object AvailablePkgGroupBox: TGroupBox object AvailablePkgGroupBox: TGroupBox
AnchorSideTop.Control = Owner AnchorSideTop.Control = NoteLabel
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Owner AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = PkgInfoGroupBox AnchorSideBottom.Control = PkgInfoGroupBox
Left = 267 Left = 267
Height = 292 Height = 269
Top = 6 Top = 30
Width = 299 Width = 299
Anchors = [akTop, akLeft, akRight, akBottom] Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Around = 6 BorderSpacing.Around = 6
Caption = 'AvailablePkgGroupBox' Caption = 'AvailablePkgGroupBox'
ClientHeight = 273 ClientHeight = 250
ClientWidth = 295 ClientWidth = 295
TabOrder = 1 TabOrder = 1
object AvailableListBox: TListBox object AvailableTreeView: TTreeView
Left = 6 Left = 6
Height = 230 Height = 207
Top = 6 Top = 6
Width = 283 Width = 283
Align = alClient Align = alClient
BorderSpacing.Around = 6 BorderSpacing.Around = 6
ClickOnSelChange = False DefaultItemHeight = 19
ItemHeight = 0 ReadOnly = True
MultiSelect = True ShowButtons = False
OnDblClick = AvailableListBoxDblClick ShowLines = False
OnSelectionChange = AvailableListBoxSelectionChange ShowRoot = False
TabOrder = 0 TabOrder = 0
TopIndex = -1 OnDblClick = AvailableTreeViewDblClick
OnSelectionChanged = AvailableTreeViewSelectionChanged
Options = [tvoAllowMultiselect, tvoAutoItemHeight, tvoHideSelection, tvoKeepCollapsedNodes, tvoReadOnly, tvoToolTips, tvoThemedDraw]
end end
object AddToInstallButton: TButton object AddToInstallButton: TBitBtn
Left = 6 Left = 6
Height = 25 Height = 25
Top = 242 Top = 219
Width = 283 Width = 283
Align = alBottom Align = alBottom
BorderSpacing.Around = 6 BorderSpacing.Around = 6
@ -122,7 +128,7 @@ object InstallPkgSetDialog: TInstallPkgSetDialog
AnchorSideBottom.Control = HelpButton AnchorSideBottom.Control = HelpButton
Left = 0 Left = 0
Height = 93 Height = 93
Top = 308 Top = 305
Width = 572 Width = 572
Align = alBottom Align = alBottom
Caption = 'PkgInfoGroupBox' Caption = 'PkgInfoGroupBox'
@ -143,19 +149,19 @@ object InstallPkgSetDialog: TInstallPkgSetDialog
end end
object BtnPanel: TPanel object BtnPanel: TPanel
Left = 0 Left = 0
Height = 41 Height = 44
Top = 401 Top = 398
Width = 572 Width = 572
Align = alBottom Align = alBottom
AutoSize = True AutoSize = True
BevelOuter = bvNone BevelOuter = bvNone
ClientHeight = 41 ClientHeight = 44
ClientWidth = 572 ClientWidth = 572
TabOrder = 3 TabOrder = 3
object HelpButton: TBitBtn object HelpButton: TBitBtn
AnchorSideBottom.Side = asrBottom AnchorSideBottom.Side = asrBottom
Left = 6 Left = 6
Height = 29 Height = 32
Top = 6 Top = 6
Width = 75 Width = 75
Align = alLeft Align = alLeft
@ -171,10 +177,10 @@ object InstallPkgSetDialog: TInstallPkgSetDialog
object CancelButton: TBitBtn object CancelButton: TBitBtn
AnchorSideRight.Side = asrBottom AnchorSideRight.Side = asrBottom
AnchorSideBottom.Side = asrBottom AnchorSideBottom.Side = asrBottom
Left = 149 Left = 140
Height = 29 Height = 32
Top = 6 Top = 6
Width = 75 Width = 79
Align = alRight Align = alRight
AutoSize = True AutoSize = True
BorderSpacing.Around = 6 BorderSpacing.Around = 6
@ -188,10 +194,10 @@ object InstallPkgSetDialog: TInstallPkgSetDialog
end end
object SaveAndExitButton: TBitBtn object SaveAndExitButton: TBitBtn
AnchorSideBottom.Side = asrBottom AnchorSideBottom.Side = asrBottom
Left = 412 Left = 410
Height = 29 Height = 32
Top = 6 Top = 6
Width = 154 Width = 156
Align = alRight Align = alRight
AutoSize = True AutoSize = True
BorderSpacing.Around = 6 BorderSpacing.Around = 6
@ -239,10 +245,10 @@ object InstallPkgSetDialog: TInstallPkgSetDialog
end end
object SaveAndRebuildButton: TBitBtn object SaveAndRebuildButton: TBitBtn
AnchorSideBottom.Side = asrBottom AnchorSideBottom.Side = asrBottom
Left = 230 Left = 225
Height = 29 Height = 32
Top = 6 Top = 6
Width = 176 Width = 179
Align = alRight Align = alRight
AutoSize = True AutoSize = True
BorderSpacing.Around = 6 BorderSpacing.Around = 6
@ -289,4 +295,14 @@ object InstallPkgSetDialog: TInstallPkgSetDialog
TabOrder = 3 TabOrder = 3
end end
end end
object NoteLabel: TLabel
Left = 6
Height = 18
Top = 6
Width = 560
Align = alTop
BorderSpacing.Around = 6
Caption = 'NoteLabel'
ParentColor = False
end
end end

View File

@ -39,8 +39,8 @@ interface
uses uses
Classes, SysUtils, LCLProc, Forms, Controls, Graphics, Dialogs, Classes, SysUtils, LCLProc, Forms, Controls, Graphics, Dialogs,
KeywordFuncLists, StdCtrls, Buttons, FileUtil, ExtCtrls, KeywordFuncLists, StdCtrls, Buttons, FileUtil, ExtCtrls, ComCtrls,
AVL_Tree, Laz_XMLCfg, PackageIntf, AVL_Tree, Laz_XMLCfg, PackageIntf, IDEImagesIntf,
LazarusIDEStrConsts, EnvironmentOpts, InputHistory, LazConf, IDEProcs, LazarusIDEStrConsts, EnvironmentOpts, InputHistory, LazConf, IDEProcs,
PackageDefs, PackageSystem, PackageLinks, IDEContextHelpEdit; PackageDefs, PackageSystem, PackageLinks, IDEContextHelpEdit;
@ -51,33 +51,34 @@ type
{ TInstallPkgSetDialog } { TInstallPkgSetDialog }
TInstallPkgSetDialog = class(TForm) TInstallPkgSetDialog = class(TForm)
AddToInstallButton: TButton; AddToInstallButton: TBitBtn;
AvailableListBox: TListBox; AvailableTreeView: TTreeView;
AvailablePkgGroupBox: TGroupBox; AvailablePkgGroupBox: TGroupBox;
HelpButton: TBitBtn; HelpButton: TBitBtn;
CancelButton: TBitBtn; CancelButton: TBitBtn;
ExportButton: TButton; ExportButton: TButton;
BtnPanel: TPanel; BtnPanel: TPanel;
InstallTreeView: TTreeView;
NoteLabel: TLabel;
PkgInfoMemo: TMemo; PkgInfoMemo: TMemo;
PkgInfoGroupBox: TGroupBox; PkgInfoGroupBox: TGroupBox;
ImportButton: TButton; ImportButton: TButton;
SaveAndExitButton: TBitBtn; SaveAndExitButton: TBitBtn;
InstallListBox: TListBox;
InstallPkgGroupBox: TGroupBox; InstallPkgGroupBox: TGroupBox;
SaveAndRebuildButton: TBitBtn; SaveAndRebuildButton: TBitBtn;
UninstallButton: TButton; UninstallButton: TBitBtn;
procedure AddToInstallButtonClick(Sender: TObject); procedure AddToInstallButtonClick(Sender: TObject);
procedure AvailableListBoxDblClick(Sender: TObject); procedure AvailableTreeViewDblClick(Sender: TObject);
procedure AvailableListBoxSelectionChange(Sender: TObject; User: boolean); procedure AvailableTreeViewSelectionChanged(Sender: TObject);
procedure ExportButtonClick(Sender: TObject); procedure ExportButtonClick(Sender: TObject);
procedure HelpButtonClick(Sender: TObject); procedure HelpButtonClick(Sender: TObject);
procedure ImportButtonClick(Sender: TObject); procedure ImportButtonClick(Sender: TObject);
procedure InstallButtonClick(Sender: TObject); procedure InstallButtonClick(Sender: TObject);
procedure InstallListBoxDblClick(Sender: TObject); procedure InstallTreeViewDblClick(Sender: TObject);
procedure InstallListBoxSelectionChange(Sender: TObject; User: boolean);
procedure InstallPkgSetDialogCreate(Sender: TObject); procedure InstallPkgSetDialogCreate(Sender: TObject);
procedure InstallPkgSetDialogDestroy(Sender: TObject); procedure InstallPkgSetDialogDestroy(Sender: TObject);
procedure InstallPkgSetDialogResize(Sender: TObject); procedure InstallPkgSetDialogResize(Sender: TObject);
procedure InstallTreeViewSelectionChanged(Sender: TObject);
procedure SaveAndExitButtonClick(Sender: TObject); procedure SaveAndExitButtonClick(Sender: TObject);
procedure UninstallButtonClick(Sender: TObject); procedure UninstallButtonClick(Sender: TObject);
private private
@ -87,6 +88,12 @@ type
fPackages: TAVLTree;// tree of TLazPackageID (all available packages and links) fPackages: TAVLTree;// tree of TLazPackageID (all available packages and links)
FRebuildIDE: boolean; FRebuildIDE: boolean;
FSelectedPkg: TLazPackage; FSelectedPkg: TLazPackage;
ImgIndexPackage: integer;
ImgIndexInstallPackage: integer;
ImgIndexInstalledPackage: integer;
ImgIndexUninstallPackage: integer;
ImgIndexCirclePackage: integer;
ImgIndexMissingPackage: integer;
procedure SetOldInstalledPackages(const AValue: TPkgDependency); procedure SetOldInstalledPackages(const AValue: TPkgDependency);
procedure AssignOldInstalledPackagesToList; procedure AssignOldInstalledPackagesToList;
function PackageInInstallList(PkgName: string): boolean; function PackageInInstallList(PkgName: string): boolean;
@ -97,7 +104,7 @@ type
procedure ClearNewInstalledPackages; procedure ClearNewInstalledPackages;
function CheckSelection: boolean; function CheckSelection: boolean;
procedure UpdateButtonStates; procedure UpdateButtonStates;
procedure UpdatePackageInfo(List: TListBox); procedure UpdatePackageInfo(Tree: TTreeView);
function NewInstalledPackagesContains(APackageID: TLazPackageID): boolean; function NewInstalledPackagesContains(APackageID: TLazPackageID): boolean;
function IndexOfNewInstalledPackageID(APackageID: TLazPackageID): integer; function IndexOfNewInstalledPackageID(APackageID: TLazPackageID): integer;
function IndexOfNewInstalledPkgByName(const APackageName: string): integer; function IndexOfNewInstalledPkgByName(const APackageName: string): integer;
@ -150,13 +157,26 @@ end;
procedure TInstallPkgSetDialog.InstallPkgSetDialogCreate(Sender: TObject); procedure TInstallPkgSetDialog.InstallPkgSetDialogCreate(Sender: TObject);
begin begin
InstallTreeView.Images := IDEImages.Images_16;
AvailableTreeView.Images := IDEImages.Images_16;
ImgIndexPackage := IDEImages.LoadImage(16, 'item_package');
ImgIndexInstalledPackage := IDEImages.LoadImage(16, 'pkg_installed');
ImgIndexInstallPackage := IDEImages.LoadImage(16, 'pkg_package_autoinstall');
ImgIndexUninstallPackage := IDEImages.LoadImage(16, 'pkg_package_uninstall');
ImgIndexCirclePackage := IDEImages.LoadImage(16, 'pkg_package_circle');
ImgIndexMissingPackage := IDEImages.LoadImage(16, 'pkg_conflict');
Caption:=lisInstallUninstallPackages; Caption:=lisInstallUninstallPackages;
NoteLabel.Caption:=lisToInstallYouMustCompileAndRestartTheIDE;
AvailablePkgGroupBox.Caption:=lisDoNotInstall; AvailablePkgGroupBox.Caption:=lisDoNotInstall;
ExportButton.Caption:=lisExportList; ExportButton.Caption:=lisExportList;
ImportButton.Caption:=lisImportList; ImportButton.Caption:=lisImportList;
UninstallButton.Caption:=lisUninstallSelection; UninstallButton.Caption:=lisUninstallSelection;
UninstallButton.LoadGlyphFromLazarusResource('arrow_right');
InstallPkgGroupBox.Caption:=lisPckEditInstall; InstallPkgGroupBox.Caption:=lisPckEditInstall;
AddToInstallButton.Caption:=lisInstallSelection; AddToInstallButton.Caption:=lisInstallSelection;
AddToInstallButton.LoadGlyphFromLazarusResource('arrow_left');
PkgInfoGroupBox.Caption := lisPackageInfo; PkgInfoGroupBox.Caption := lisPackageInfo;
SaveAndRebuildButton.Caption:=lisSaveAndRebuildIDE; SaveAndRebuildButton.Caption:=lisSaveAndRebuildIDE;
SaveAndExitButton.Caption:=lisSaveAndExitDialog; SaveAndExitButton.Caption:=lisSaveAndExitDialog;
@ -176,16 +196,16 @@ begin
ModalResult:=mrOk; ModalResult:=mrOk;
end; end;
procedure TInstallPkgSetDialog.InstallListBoxDblClick(Sender: TObject); procedure TInstallPkgSetDialog.InstallTreeViewDblClick(Sender: TObject);
begin begin
AddToUninstall; AddToUninstall;
end; end;
procedure TInstallPkgSetDialog.AvailableListBoxSelectionChange(Sender: TObject; procedure TInstallPkgSetDialog.AvailableTreeViewSelectionChanged(Sender: TObject
User: boolean); );
begin begin
UpdateButtonStates; UpdateButtonStates;
UpdatePackageInfo(AvailableListBox); UpdatePackageInfo(AvailableTreeView);
end; end;
procedure TInstallPkgSetDialog.ExportButtonClick(Sender: TObject); procedure TInstallPkgSetDialog.ExportButtonClick(Sender: TObject);
@ -242,18 +262,11 @@ begin
AddToInstall; AddToInstall;
end; end;
procedure TInstallPkgSetDialog.AvailableListBoxDblClick(Sender: TObject); procedure TInstallPkgSetDialog.AvailableTreeViewDblClick(Sender: TObject);
begin begin
AddToInstall; AddToInstall;
end; end;
procedure TInstallPkgSetDialog.InstallListBoxSelectionChange(Sender: TObject;
User: boolean);
begin
UpdateButtonStates;
UpdatePackageInfo(InstallListBox);
end;
procedure TInstallPkgSetDialog.InstallPkgSetDialogDestroy(Sender: TObject); procedure TInstallPkgSetDialog.InstallPkgSetDialogDestroy(Sender: TObject);
begin begin
ClearNewInstalledPackages; ClearNewInstalledPackages;
@ -272,6 +285,12 @@ begin
AvailablePkgGroupBox.SetBounds(2 * x + w, x, w, Height - 150); AvailablePkgGroupBox.SetBounds(2 * x + w, x, w, Height - 150);
end; end;
procedure TInstallPkgSetDialog.InstallTreeViewSelectionChanged(Sender: TObject);
begin
UpdateButtonStates;
UpdatePackageInfo(InstallTreeView);
end;
procedure TInstallPkgSetDialog.SaveAndExitButtonClick(Sender: TObject); procedure TInstallPkgSetDialog.SaveAndExitButtonClick(Sender: TObject);
begin begin
if not CheckSelection then exit; if not CheckSelection then exit;
@ -305,6 +324,7 @@ begin
NewPackageID:=TLazPackageID.Create; NewPackageID:=TLazPackageID.Create;
if (Dependency.LoadPackageResult=lprSuccess) if (Dependency.LoadPackageResult=lprSuccess)
and (Dependency.RequiredPackage<>nil) then begin and (Dependency.RequiredPackage<>nil) then begin
// packages can be freed while the dialog runs => use packageid instead
NewPackageID.AssignID(Dependency.RequiredPackage); NewPackageID.AssignID(Dependency.RequiredPackage);
end else begin end else begin
NewPackageID.Name:=Dependency.PackageName; NewPackageID.Name:=Dependency.PackageName;
@ -320,8 +340,12 @@ function TInstallPkgSetDialog.PackageInInstallList(PkgName: string): boolean;
var var
i: Integer; i: Integer;
begin begin
for i:=0 to InstallListBox.Items.Count-1 do //for i:=0 to InstallTreeView.Items.TopLvlCount-1 do
if SysUtils.CompareText(ExtractNameFromPkgID(InstallListBox.Items[i]),PkgName)=0 then //debugln(['TInstallPkgSetDialog.PackageInInstallList ',i,' ',ExtractNameFromPkgID(InstallTreeView.Items.TopLvlItems[i].Text),' ',PkgName]);
for i:=0 to InstallTreeView.Items.TopLvlCount-1 do
if SysUtils.CompareText(
ExtractNameFromPkgID(InstallTreeView.Items.TopLvlItems[i].Text),PkgName)=0
then
exit(true); exit(true);
Result:=false; Result:=false;
end; end;
@ -332,6 +356,10 @@ var
sl: TStringList; sl: TStringList;
PkgName: String; PkgName: String;
Pkg: TLazPackageID; Pkg: TLazPackageID;
TVNode: TTreeNode;
APackage: TLazPackage;
ImgIndex: LongInt;
i: Integer;
begin begin
fPackages.Clear; fPackages.Clear;
PackageGraph.IteratePackages(fpfSearchAllExisting,@OnIteratePackages); PackageGraph.IteratePackages(fpfSearchAllExisting,@OnIteratePackages);
@ -346,13 +374,29 @@ begin
if not PackageInInstallList(Pkg.Name) then begin if not PackageInInstallList(Pkg.Name) then begin
PkgName:=Pkg.IDAsString; PkgName:=Pkg.IDAsString;
if (sl.IndexOf(PkgName)<0) then if (sl.IndexOf(PkgName)<0) then
sl.Add(PkgName); sl.AddObject(PkgName,Pkg);
end; end;
end; end;
ANode:=fPackages.FindSuccessor(ANode); ANode:=fPackages.FindSuccessor(ANode);
end; end;
sl.Sort; sl.Sort;
AvailableListBox.Items.Assign(sl); AvailableTreeView.BeginUpdate;
AvailableTreeView.Items.Clear;
for i:=0 to sl.Count-1 do begin
TVNode:=AvailableTreeView.Items.Add(nil,sl[i]);
Pkg:=TLazPackageID(sl.Objects[i]);
ImgIndex:=ImgIndexPackage;
if (Pkg is TLazPackage) then begin
APackage:=TLazPackage(Pkg);
if APackage.Installed<>pitNope then begin
// is installed and will be uninstalled
ImgIndex:=ImgIndexUninstallPackage;
end;
end;
TVNode.ImageIndex:=ImgIndex;
TVNode.SelectedIndex:=ImgIndex;
end;
AvailableTreeView.EndUpdate;
sl.Free; sl.Free;
end; end;
@ -362,16 +406,40 @@ var
NewPackageID: TLazPackageID; NewPackageID: TLazPackageID;
i: Integer; i: Integer;
sl: TStringList; sl: TStringList;
TVNode: TTreeNode;
APackage: TLazPackage;
ImgIndex: LongInt;
begin begin
sl:=TStringList.Create; sl:=TStringList.Create;
for i:=0 to FNewInstalledPackages.Count-1 do begin for i:=0 to FNewInstalledPackages.Count-1 do begin
NewPackageID:=TLazPackageID(FNewInstalledPackages[i]); NewPackageID:=TLazPackageID(FNewInstalledPackages[i]);
APackage:=PackageGraph.FindAPackageWithName(NewPackageID.Name,nil);
if APackage<>nil then
NewPackageID:=APackage;
s:=NewPackageID.IDAsString; s:=NewPackageID.IDAsString;
sl.Add(s); sl.AddObject(s,NewPackageID);
end; end;
sl.Sort; sl.Sort;
InstallListBox.Items.Assign(sl); InstallTreeView.BeginUpdate;
InstallTreeView.Items.Clear;
for i:=0 to sl.Count-1 do begin
TVNode:=InstallTreeView.Items.Add(nil,sl[i]);
NewPackageID:=TLazPackageID(sl.Objects[i]);
ImgIndex:=ImgIndexInstallPackage;
//debugln(['TInstallPkgSetDialog.UpdateNewInstalledPackages ',NewPackageID.IDAsString,' ',DbgSName(NewPackageID)]);
if NewPackageID is TLazPackage then begin
APackage:=TLazPackage(NewPackageID);
if APackage.Installed<>pitNope then begin
// stay installed
ImgIndex:=ImgIndexInstalledPackage;
end;
end;
TVNode.ImageIndex:=ImgIndex;
TVNode.SelectedIndex:=ImgIndex;
end;
InstallTreeView.EndUpdate;
sl.Free; sl.Free;
//debugln(['TInstallPkgSetDialog.UpdateNewInstalledPackages END ',InstallTreeView.Items.TopLvlCount]);
UpdateAvailablePackages; UpdateAvailablePackages;
end; end;
@ -416,28 +484,28 @@ var
s: String; s: String;
ListChanged: Boolean; ListChanged: Boolean;
begin begin
UninstallButton.Enabled:=InstallListBox.ItemIndex>=0; UninstallButton.Enabled:=InstallTreeView.Selected<>nil;
AddToInstallButton.Enabled:=AvailableListBox.ItemIndex>=0; AddToInstallButton.Enabled:=AvailableTreeView.Selected<>nil;
// check for changes // check for changes
ListChanged:=false; ListChanged:=false;
Cnt:=0; Cnt:=0;
Dependency:=OldInstalledPackages; Dependency:=OldInstalledPackages;
while Dependency<>nil do begin while Dependency<>nil do begin
s:=DependencyToStr(Dependency); s:=Dependency.PackageName;
if InstallListBox.Items.IndexOf(s)<0 then begin if not PackageInInstallList(s) then begin
ListChanged:=true; ListChanged:=true;
break; break;
end; end;
Dependency:=Dependency.NextRequiresDependency; Dependency:=Dependency.NextRequiresDependency;
inc(Cnt); inc(Cnt);
end; end;
if InstallListBox.Items.Count<>Cnt then if InstallTreeView.Items.TopLvlCount<>Cnt then
ListChanged:=true; ListChanged:=true;
SaveAndExitButton.Enabled:=ListChanged; SaveAndExitButton.Enabled:=ListChanged;
SaveAndRebuildButton.Enabled:=ListChanged; SaveAndRebuildButton.Enabled:=ListChanged;
end; end;
procedure TInstallPkgSetDialog.UpdatePackageInfo(List: TListBox); procedure TInstallPkgSetDialog.UpdatePackageInfo(Tree: TTreeView);
var var
PkgName: String; PkgName: String;
PkgID: TLazPackageID; PkgID: TLazPackageID;
@ -446,10 +514,10 @@ var
PkgLink: TPackageLink; PkgLink: TPackageLink;
XMLConfig: TXMLConfig; XMLConfig: TXMLConfig;
begin begin
if List = nil then Exit; if Tree = nil then Exit;
PkgName := ''; PkgName := '';
if List.ItemIndex >= 0 then if Tree.Selected <> nil then
PkgName := List.Items[List.ItemIndex]; PkgName := Tree.Selected.Text;
if PkgName = '' then Exit; if PkgName = '' then Exit;
if Assigned(FSelectedPkg) and (PkgName = FSelectedPkg.IDAsString) then Exit; if Assigned(FSelectedPkg) and (PkgName = FSelectedPkg.IDAsString) then Exit;
@ -638,17 +706,21 @@ var
j: LongInt; j: LongInt;
APackage: TLazPackage; APackage: TLazPackage;
Additions: TFPList; Additions: TFPList;
TVNode: TTreeNode;
PkgName: String;
begin begin
Additions:=TFPList.Create; Additions:=TFPList.Create;
NewPackageID:=TLazPackageID.Create; NewPackageID:=TLazPackageID.Create;
try try
for i:=0 to AvailableListBox.Items.Count-1 do begin for i:=0 to AvailableTreeView.Items.TopLvlCount-1 do begin
if not AvailableListBox.Selected[i] then continue; TVNode:=AvailableTreeView.Items.TopLvlItems[i];
if not TVNode.MultiSelected then continue;
PkgName:=TVNode.Text;
// check string // check string
if not NewPackageID.StringToID(AvailableListBox.Items[i]) then begin if not NewPackageID.StringToID(PkgName) then begin
AvailableListBox.Selected[i]:=false; TVNode.Selected:=false;
debugln('TInstallPkgSetDialog.AddToInstallButtonClick invalid ID: ', debugln('TInstallPkgSetDialog.AddToInstallButtonClick invalid ID: ',
AvailableListBox.Items[i]); PkgName);
continue; continue;
end; end;
// check if already in list // check if already in list
@ -656,7 +728,7 @@ begin
MessageDlg('Double', MessageDlg('Double',
'The package '+NewPackageID.Name+' is already in the list',mtError, 'The package '+NewPackageID.Name+' is already in the list',mtError,
[mbCancel],0); [mbCancel],0);
AvailableListBox.Selected[i]:=false; TVNode.Selected:=false;
exit; exit;
end; end;
// check if a package with same name is already in the list // check if a package with same name is already in the list
@ -665,7 +737,7 @@ begin
MessageDlg('Conflict', MessageDlg('Conflict',
'There is already a package '+NewPackageID.Name+' in the list', 'There is already a package '+NewPackageID.Name+' in the list',
mtError,[mbCancel],0); mtError,[mbCancel],0);
AvailableListBox.Selected[i]:=false; TVNode.Selected:=false;
exit; exit;
end; end;
// check if package is loaded and has some attributes that prevents // check if package is loaded and has some attributes that prevents
@ -677,7 +749,7 @@ begin
'The package '+APackage.IDAsString+' is not a design time package.' 'The package '+APackage.IDAsString+' is not a design time package.'
+' It can not be installed in the IDE',mtError, +' It can not be installed in the IDE',mtError,
[mbCancel],0); [mbCancel],0);
AvailableListBox.Selected[i]:=false; TVNode.Selected:=false;
exit; exit;
end; end;
end; end;
@ -708,18 +780,22 @@ var
Deletions: TFPList; Deletions: TFPList;
DelPackageID: TLazPackageID; DelPackageID: TLazPackageID;
j: LongInt; j: LongInt;
TVNode: TTreeNode;
PkgName: String;
begin begin
OldPackageID := nil; OldPackageID := nil;
Deletions:=TFPList.Create; Deletions:=TFPList.Create;
try try
for i:=0 to InstallListBox.Items.Count-1 do begin for i:=0 to InstallTreeView.Items.TopLvlCount-1 do begin
if not InstallListBox.Selected[i] then continue; TVNode:=InstallTreeView.Items.TopLvlItems[i];
if not TVNode.MultiSelected then continue;
if OldPackageID = nil then if OldPackageID = nil then
OldPackageID:=TLazPackageID.Create; OldPackageID:=TLazPackageID.Create;
if not OldPackageID.StringToID(InstallListBox.Items[i]) then begin PkgName:=TVNode.Text;
InstallListBox.Selected[i]:=false; if not OldPackageID.StringToID(PkgName) then begin
TVNode.Selected:=false;
debugln('TInstallPkgSetDialog.AddToUninstallButtonClick invalid ID: ', debugln('TInstallPkgSetDialog.AddToUninstallButtonClick invalid ID: ',
InstallListBox.Items[i]); PkgName);
continue; continue;
end; end;
// ok => add to deletions // ok => add to deletions
@ -732,7 +808,7 @@ begin
// check if package is a base package // check if package is a base package
if APackage.AutoCreated if APackage.AutoCreated
or PackageGraph.IsStaticBasePackage(APackage.Name) then begin or PackageGraph.IsStaticBasePackage(APackage.Name) then begin
InstallListBox.Selected[i]:=false; TVNode.Selected:=false;
MessageDlg(lisUninstallImpossible, MessageDlg(lisUninstallImpossible,
Format(lisThePackageCanNotBeUninstalledBecauseItIsNeededByTh, [ Format(lisThePackageCanNotBeUninstalledBecauseItIsNeededByTh, [
APackage.Name]), mtError, [mbCancel], 0); APackage.Name]), mtError, [mbCancel], 0);
@ -742,7 +818,7 @@ begin
end; end;
// ok => remove from list // ok => remove from list
InstallListBox.ItemIndex:=-1; InstallTreeView.Selected:=nil;
for i:=0 to Deletions.Count-1 do begin for i:=0 to Deletions.Count-1 do begin
DelPackageID:=TLazPackageID(Deletions[i]); DelPackageID:=TLazPackageID(Deletions[i]);
j:=IndexOfNewInstalledPackageID(DelPackageID); j:=IndexOfNewInstalledPackageID(DelPackageID);