Packager: use the new ListFilterEdit control in Install Packages dialog

git-svn-id: trunk@31446 -
This commit is contained in:
juha 2011-06-29 00:04:58 +00:00
parent d23a3c8cc5
commit 53749f7249
2 changed files with 98 additions and 189 deletions

View File

@ -1,12 +1,12 @@
object InstallPkgSetDialog: TInstallPkgSetDialog
Left = 292
Height = 550
Height = 562
Top = 240
Width = 572
Width = 587
BorderStyle = bsSizeToolWin
Caption = 'InstallPkgSetDialog'
ClientHeight = 550
ClientWidth = 572
ClientHeight = 562
ClientWidth = 587
Constraints.MinHeight = 400
Constraints.MinWidth = 450
OnCreate = InstallPkgSetDialogCreate
@ -21,23 +21,23 @@ object InstallPkgSetDialog: TInstallPkgSetDialog
AnchorSideRight.Control = lblMiddle
AnchorSideBottom.Control = PkgInfoGroupBox
Left = 6
Height = 375
Top = 30
Width = 277
Height = 393
Top = 26
Width = 284
Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Left = 6
BorderSpacing.Top = 6
BorderSpacing.Right = 3
BorderSpacing.Bottom = 6
Caption = 'InstallPkgGroupBox'
ClientHeight = 354
ClientWidth = 269
ClientHeight = 376
ClientWidth = 280
TabOrder = 0
object ImportButton: TButton
Left = 6
Height = 25
Top = 292
Width = 257
Top = 314
Width = 268
Align = alBottom
BorderSpacing.Around = 6
Caption = 'ImportButton'
@ -47,8 +47,8 @@ object InstallPkgSetDialog: TInstallPkgSetDialog
object ExportButton: TButton
Left = 6
Height = 25
Top = 323
Width = 257
Top = 345
Width = 268
Align = alBottom
BorderSpacing.Around = 6
Caption = 'ExportButton'
@ -57,12 +57,12 @@ object InstallPkgSetDialog: TInstallPkgSetDialog
end
object InstallTreeView: TTreeView
Left = 6
Height = 249
Height = 271
Top = 6
Width = 257
Width = 268
Align = alClient
BorderSpacing.Around = 6
DefaultItemHeight = 19
DefaultItemHeight = 15
MultiSelect = True
ReadOnly = True
ShowButtons = False
@ -76,8 +76,8 @@ object InstallPkgSetDialog: TInstallPkgSetDialog
object UninstallButton: TBitBtn
Left = 6
Height = 25
Top = 261
Width = 257
Top = 283
Width = 268
Align = alBottom
BorderSpacing.Around = 6
Caption = 'UninstallButton'
@ -92,29 +92,29 @@ object InstallPkgSetDialog: TInstallPkgSetDialog
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = PkgInfoGroupBox
Left = 289
Height = 375
Top = 30
Width = 277
Left = 296
Height = 393
Top = 26
Width = 285
Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Left = 3
BorderSpacing.Top = 6
BorderSpacing.Right = 6
BorderSpacing.Bottom = 6
Caption = 'AvailablePkgGroupBox'
ClientHeight = 354
ClientWidth = 269
ClientHeight = 376
ClientWidth = 281
TabOrder = 1
object AvailableTreeView: TTreeView
Left = 6
Height = 284
Top = 33
Width = 257
Align = alClient
Height = 308
Top = 31
Width = 269
Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Left = 6
BorderSpacing.Right = 6
BorderSpacing.Bottom = 6
DefaultItemHeight = 19
DefaultItemHeight = 15
MultiSelect = True
ReadOnly = True
ShowButtons = False
@ -128,46 +128,45 @@ object InstallPkgSetDialog: TInstallPkgSetDialog
object AddToInstallButton: TBitBtn
Left = 6
Height = 25
Top = 323
Width = 257
Top = 345
Width = 269
Align = alBottom
BorderSpacing.Around = 6
Caption = 'AddToInstallButton'
OnClick = AddToInstallButtonClick
TabOrder = 1
end
object AvailableFilterEdit: TEdit
object AvailableFilterEdit: TListFilterEdit
Left = 6
Height = 27
Top = 6
Width = 257
Align = alTop
BorderSpacing.Left = 6
BorderSpacing.Top = 6
BorderSpacing.Right = 6
OnChange = AvailableFilterEditChange
OnEnter = AvailableFilterEditEnter
OnExit = AvailableFilterEditExit
Height = 20
Top = 7
Width = 247
FilteredTreeview = AvailableTreeView
ButtonWidth = 23
NumGlyphs = 0
Anchors = [akTop, akLeft, akRight]
Font.Color = clBtnShadow
MaxLength = 0
ParentFont = False
TabOrder = 2
Text = 'AvailableFilterEdit'
end
end
object PkgInfoGroupBox: TGroupBox
AnchorSideBottom.Control = BtnPanel
Left = 0
Height = 93
Top = 411
Width = 572
Top = 425
Width = 587
Align = alBottom
Caption = 'PkgInfoGroupBox'
ClientHeight = 72
ClientWidth = 564
ClientHeight = 76
ClientWidth = 583
TabOrder = 2
object PkgInfoMemo: TMemo
Left = 6
Height = 60
Height = 64
Top = 6
Width = 552
Width = 571
Align = alClient
BorderSpacing.Around = 6
Lines.Strings = (
@ -180,20 +179,20 @@ object InstallPkgSetDialog: TInstallPkgSetDialog
end
object BtnPanel: TPanel
Left = 0
Height = 46
Top = 504
Width = 572
Height = 44
Top = 518
Width = 587
Align = alBottom
AutoSize = True
BevelOuter = bvNone
ClientHeight = 46
ClientWidth = 572
ClientHeight = 44
ClientWidth = 587
TabOrder = 3
object HelpButton: TBitBtn
Left = 6
Height = 34
Height = 32
Top = 6
Width = 85
Width = 75
Align = alLeft
AutoSize = True
BorderSpacing.Around = 6
@ -205,10 +204,10 @@ object InstallPkgSetDialog: TInstallPkgSetDialog
TabOrder = 0
end
object CancelButton: TBitBtn
Left = 102
Height = 34
Left = 201
Height = 32
Top = 6
Width = 89
Width = 75
Align = alRight
AutoSize = True
BorderSpacing.Around = 6
@ -221,10 +220,10 @@ object InstallPkgSetDialog: TInstallPkgSetDialog
TabOrder = 1
end
object SaveAndExitButton: TBitBtn
Left = 397
Height = 34
Left = 445
Height = 32
Top = 6
Width = 169
Width = 136
Align = alRight
AutoSize = True
BorderSpacing.Around = 6
@ -271,10 +270,10 @@ object InstallPkgSetDialog: TInstallPkgSetDialog
TabOrder = 2
end
object SaveAndRebuildButton: TBitBtn
Left = 197
Height = 34
Left = 282
Height = 32
Top = 6
Width = 194
Width = 157
Align = alRight
AutoSize = True
BorderSpacing.Around = 6
@ -323,9 +322,9 @@ object InstallPkgSetDialog: TInstallPkgSetDialog
end
object NoteLabel: TLabel
Left = 6
Height = 18
Height = 14
Top = 6
Width = 560
Width = 575
Align = alTop
BorderSpacing.Around = 6
Caption = 'NoteLabel'
@ -336,9 +335,9 @@ object InstallPkgSetDialog: TInstallPkgSetDialog
AnchorSideLeft.Side = asrCenter
AnchorSideTop.Control = Owner
AnchorSideTop.Side = asrCenter
Left = 286
Left = 293
Height = 1
Top = 275
Top = 281
Width = 1
AutoSize = False
ParentColor = False

View File

@ -39,8 +39,8 @@ interface
uses
Classes, SysUtils, contnrs, LCLProc, Forms, Controls, Graphics, Dialogs,
KeywordFuncLists, StdCtrls, Buttons, FileUtil, ExtCtrls, ComCtrls,
AVL_Tree, Laz_XMLCfg,
KeywordFuncLists, StdCtrls, Buttons, FileUtil, ExtCtrls, ComCtrls, EditBtn,
AVL_Tree, Laz_XMLCfg, ListFilterEdit,
PackageIntf, IDEImagesIntf, IDEHelpIntf,
LazarusIDEStrConsts, EnvironmentOpts, InputHistory, LazConf, IDEProcs,
PackageDefs, PackageSystem, PackageLinks, IDEContextHelpEdit;
@ -53,7 +53,6 @@ type
TInstallPkgSetDialog = class(TForm)
AddToInstallButton: TBitBtn;
AvailableFilterEdit: TEdit;
AvailableTreeView: TTreeView;
AvailablePkgGroupBox: TGroupBox;
HelpButton: TBitBtn;
@ -62,6 +61,7 @@ type
BtnPanel: TPanel;
InstallTreeView: TTreeView;
lblMiddle: TLabel;
AvailableFilterEdit: TListFilterEdit;
NoteLabel: TLabel;
PkgInfoMemo: TMemo;
PkgInfoGroupBox: TGroupBox;
@ -71,9 +71,6 @@ type
SaveAndRebuildButton: TBitBtn;
UninstallButton: TBitBtn;
procedure AddToInstallButtonClick(Sender: TObject);
procedure AvailableFilterEditChange(Sender: TObject);
procedure AvailableFilterEditEnter(Sender: TObject);
procedure AvailableFilterEditExit(Sender: TObject);
procedure AvailableTreeViewDblClick(Sender: TObject);
procedure AvailableTreeViewSelectionChanged(Sender: TObject);
procedure ExportButtonClick(Sender: TObject);
@ -88,9 +85,6 @@ type
procedure SaveAndExitButtonClick(Sender: TObject);
procedure UninstallButtonClick(Sender: TObject);
private
FIdleConnected: boolean;
FAvailableFilter: string;
fAvailablePackagesNeedUpdate: boolean;
FNewInstalledPackages: TObjectList;
FOldInstalledPackages: TPkgDependency;
FOnCheckInstallPackageList: TOnCheckInstallPackageList;
@ -103,12 +97,10 @@ type
ImgIndexUninstallPackage: integer;
ImgIndexCirclePackage: integer;
ImgIndexMissingPackage: integer;
procedure OnIdle(Sender: TObject; var Done: Boolean);
procedure SetIdleConnected(const AValue: boolean);
procedure SetAvailableFilter(const AValue: string);
procedure SetOldInstalledPackages(const AValue: TPkgDependency);
procedure AssignOldInstalledPackagesToList;
function PackageInInstallList(PkgName: string): boolean;
function ChooseImageIndex(Str: String; Data: TObject): Integer;
procedure UpdateAvailablePackages(Immediately: boolean = false);
procedure UpdateNewInstalledPackages;
procedure OnIteratePackages(APackageID: TLazPackageID);
@ -125,8 +117,6 @@ type
function ExtractNameFromPkgID(ID: string): string;
procedure AddToInstall;
procedure AddToUninstall;
function FitsAvailableFilter(PkgName: string): boolean;
property IdleConnected: boolean read FIdleConnected write SetIdleConnected;
public
function GetNewInstalledPackages: TObjectList;
property OldInstalledPackages: TPkgDependency read FOldInstalledPackages
@ -135,7 +125,6 @@ type
property RebuildIDE: boolean read FRebuildIDE write FRebuildIDE;
property OnCheckInstallPackageList: TOnCheckInstallPackageList
read FOnCheckInstallPackageList write FOnCheckInstallPackageList;
property AvailableFilter: string read FAvailableFilter write SetAvailableFilter;
end;
function ShowEditInstallPkgsDialog(OldInstalledPackages: TPkgDependency;
@ -185,8 +174,9 @@ begin
Caption:=lisInstallUninstallPackages;
NoteLabel.Caption:=lisToInstallYouMustCompileAndRestartTheIDE;
AvailableFilterEdit.Text:=lisCEFilter;
AvailablePkgGroupBox.Caption:=lisDoNotInstall;
AvailableFilterEdit.OnGetImageIndex:=@ChooseImageIndex;
ExportButton.Caption:=lisExportList;
ImportButton.Caption:=lisImportList;
UninstallButton.Caption:=lisUninstallSelection;
@ -202,7 +192,7 @@ begin
fAvailablePackages:=TAVLTree.Create(@CompareLazPackageIDNames);
FNewInstalledPackages:=TObjectList.Create(true);
PkgInfoMemo.Clear;
end;
@ -278,23 +268,6 @@ begin
AddToInstall;
end;
procedure TInstallPkgSetDialog.AvailableFilterEditChange(Sender: TObject);
begin
AvailableFilter:=AvailableFilterEdit.Text;
end;
procedure TInstallPkgSetDialog.AvailableFilterEditEnter(Sender: TObject);
begin
if AvailableFilterEdit.Text=lisCEFilter then
AvailableFilterEdit.Text:='';
end;
procedure TInstallPkgSetDialog.AvailableFilterEditExit(Sender: TObject);
begin
if AvailableFilterEdit.Text='' then
AvailableFilterEdit.Text:=lisCEFilter;
end;
procedure TInstallPkgSetDialog.AvailableTreeViewDblClick(Sender: TObject);
begin
AddToInstall;
@ -302,7 +275,6 @@ end;
procedure TInstallPkgSetDialog.InstallPkgSetDialogDestroy(Sender: TObject);
begin
IdleConnected:=false;
ClearNewInstalledPackages;
FNewInstalledPackages.Free;
fAvailablePackages.Free;
@ -335,23 +307,6 @@ begin
AddToUninstall;
end;
procedure TInstallPkgSetDialog.OnIdle(Sender: TObject; var Done: Boolean);
begin
if fAvailablePackagesNeedUpdate then
UpdateAvailablePackages(true);
IdleConnected:=false;
end;
procedure TInstallPkgSetDialog.SetIdleConnected(const AValue: boolean);
begin
if FIdleConnected=AValue then exit;
FIdleConnected:=AValue;
if FIdleConnected then
Application.AddOnIdleHandler(@OnIdle)
else
Application.RemoveOnIdleHandler(@OnIdle);
end;
procedure TInstallPkgSetDialog.SetOldInstalledPackages(
const AValue: TPkgDependency);
begin
@ -360,23 +315,6 @@ begin
AssignOldInstalledPackagesToList;
end;
procedure TInstallPkgSetDialog.SetAvailableFilter(const AValue: string);
var
NewValue: String;
begin
NewValue:=AValue;
if NewValue=lisCEFilter then NewValue:='';
NewValue:=LowerCase(NewValue);
if FAvailableFilter=NewValue then exit;
FAvailableFilter:=NewValue;
if not AvailableFilterEdit.Focused then
if AvailableFilter='' then
AvailableFilterEdit.Text:=lisCEFilter
else
AvailableFilterEdit.Text:=AvailableFilter;
UpdateAvailablePackages(false);
end;
procedure TInstallPkgSetDialog.AssignOldInstalledPackagesToList;
var
Dependency: TPkgDependency;
@ -416,62 +354,44 @@ begin
Result:=false;
end;
function TInstallPkgSetDialog.ChooseImageIndex(Str: String; Data: TObject): Integer;
var
Pkg: TLazPackageID;
APackage: TLazPackage;
begin
Pkg:=TLazPackageID(Data);
Result:=ImgIndexPackage;
if (Pkg is TLazPackage) then begin
APackage:=TLazPackage(Pkg);
if APackage.Installed<>pitNope then
Result:=ImgIndexUninstallPackage; // is installed and will be uninstalled
end;
end;
procedure TInstallPkgSetDialog.UpdateAvailablePackages(Immediately: boolean);
var
ANode: TAVLTreeNode;
sl: TStringList;
PkgName: String;
Pkg: TLazPackageID;
TVNode: TTreeNode;
APackage: TLazPackage;
ImgIndex: LongInt;
i: Integer;
PkgName: String;
begin
if not Immediately then begin
if csDestroying in ComponentState then exit;
fAvailablePackagesNeedUpdate:=true;
IdleConnected:=true;
exit;
end;
fAvailablePackagesNeedUpdate:=false;
if fAvailablePackages.Count=0 then
PackageGraph.IteratePackages(fpfSearchAllExisting,@OnIteratePackages);
sl:=TStringList.Create;
AvailableFilterEdit.Data.Clear;
ANode:=fAvailablePackages.FindLowest;
while ANode<>nil do begin
Pkg:=TLazPackageID(ANode.Data);
//debugln('TInstallPkgSetDialog.UpdateAvailablePackages ',Pkg.IDAsString,' Pkg.PackageType=',dbgs(ord(Pkg.PackageType)));
if (not (Pkg is TLazPackage))
or (TLazPackage(Pkg).PackageType in [lptDesignTime,lptRunAndDesignTime])
then begin
if (not PackageInInstallList(Pkg.Name))
and (FitsAvailableFilter(Pkg.Name)) then begin
if (not PackageInInstallList(Pkg.Name)) then begin
PkgName:=Pkg.IDAsString;
if (sl.IndexOf(PkgName)<0) then
sl.AddObject(PkgName,Pkg);
if (AvailableFilterEdit.Data.IndexOf(PkgName)<0) then
AvailableFilterEdit.Data.AddObject(PkgName,Pkg);
end;
end;
ANode:=fAvailablePackages.FindSuccessor(ANode);
end;
sl.Sort;
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;
AvailableFilterEdit.Invalidate;
end;
procedure TInstallPkgSetDialog.UpdateNewInstalledPackages;
@ -500,20 +420,16 @@ 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;
if APackage.Installed<>pitNope then
ImgIndex:=ImgIndexInstalledPackage; // stay installed
end;
TVNode.ImageIndex:=ImgIndex;
TVNode.SelectedIndex:=ImgIndex;
end;
InstallTreeView.EndUpdate;
sl.Free;
//debugln(['TInstallPkgSetDialog.UpdateNewInstalledPackages END ',InstallTreeView.Items.TopLvlCount]);
UpdateAvailablePackages;
end;
@ -524,8 +440,7 @@ begin
fAvailablePackages.Add(APackageID);
end;
function TInstallPkgSetDialog.DependencyToStr(Dependency: TPkgDependency
): string;
function TInstallPkgSetDialog.DependencyToStr(Dependency: TPkgDependency): string;
begin
Result:='';
if Dependency=nil then exit;
@ -898,11 +813,6 @@ begin
end;
end;
function TInstallPkgSetDialog.FitsAvailableFilter(PkgName: string): boolean;
begin
Result:=(AvailableFilter='') or (System.Pos(AvailableFilter,lowercase(PkgName))>0);
end;
function TInstallPkgSetDialog.GetNewInstalledPackages: TObjectList;
var
i: Integer;