IDE: Refactor code in InstallPkgSetDialog, remove Cancel button. Issue #40496, patch by n7800.

This commit is contained in:
Juha 2023-09-26 11:46:52 +03:00
parent 4cd413a986
commit 8563725a77
3 changed files with 140 additions and 152 deletions

View File

@ -10,9 +10,11 @@ object InstallPkgSetDialog: TInstallPkgSetDialog
ClientWidth = 607
Constraints.MinHeight = 400
Constraints.MinWidth = 450
KeyPreview = True
OnClose = FormClose
OnCreate = InstallPkgSetDialogCreate
OnDestroy = InstallPkgSetDialogDestroy
OnKeyDown = FormKeyDown
OnResize = InstallPkgSetDialogResize
OnShow = InstallPkgSetDialogShow
Position = poScreenCenter
@ -96,21 +98,6 @@ object InstallPkgSetDialog: TInstallPkgSetDialog
OnClick = HelpButtonClick
TabOrder = 0
end
object CancelButton: TBitBtn
Left = 164
Height = 29
Top = 6
Width = 83
Align = alRight
AutoSize = True
BorderSpacing.Around = 6
Cancel = True
Caption = 'Cancel'
Constraints.MinWidth = 75
Kind = bkCancel
ModalResult = 2
TabOrder = 1
end
object SaveAndExitButton: TBitBtn
Left = 442
Height = 29
@ -121,6 +108,7 @@ object InstallPkgSetDialog: TInstallPkgSetDialog
BorderSpacing.Around = 6
Caption = 'SaveAndExitButton'
Constraints.MinWidth = 75
Enabled = False
Glyph.Data = {
36040000424D3604000000000000360000002800000010000000100000000100
2000000000000004000064000000640000000000000000000000FFFFFF00FFFF
@ -158,7 +146,7 @@ object InstallPkgSetDialog: TInstallPkgSetDialog
FF00FFFFFF00FFFFFF00FFFFFF006D9CD4896A9AD2FB6697CFEE
}
OnClick = SaveAndExitButtonClick
TabOrder = 3
TabOrder = 2
end
object SaveAndRebuildButton: TBitBtn
Left = 253
@ -170,6 +158,7 @@ object InstallPkgSetDialog: TInstallPkgSetDialog
BorderSpacing.Around = 6
Caption = 'SaveAndRebuildButton'
Constraints.MinWidth = 75
Enabled = False
Glyph.Data = {
36040000424D3604000000000000360000002800000010000000100000000100
2000000000000004000064000000640000000000000000000000000000000000
@ -207,7 +196,7 @@ object InstallPkgSetDialog: TInstallPkgSetDialog
0000000000000000000000000000000000000000000000000000
}
OnClick = SaveAndRebuildButtonClick
TabOrder = 2
TabOrder = 1
end
end
object Splitter1: TSplitter
@ -293,8 +282,8 @@ object InstallPkgSetDialog: TInstallPkgSetDialog
ShowRoot = False
TabOrder = 1
OnAdvancedCustomDrawItem = TreeViewAdvancedCustomDrawItem
OnDblClick = InstallTreeViewDblClick
OnKeyPress = InstallTreeViewKeyPress
OnDblClick = AddToUninstall
OnKeyDown = InstallTreeViewKeyDown
OnSelectionChanged = InstallTreeViewSelectionChanged
Options = [tvoAllowMultiselect, tvoAutoItemHeight, tvoHideSelection, tvoKeepCollapsedNodes, tvoReadOnly, tvoToolTips, tvoThemedDraw]
end
@ -312,7 +301,7 @@ object InstallPkgSetDialog: TInstallPkgSetDialog
BorderSpacing.Bottom = 6
Caption = 'UninstallButton'
Layout = blGlyphRight
OnClick = UninstallButtonClick
OnClick = AddToUninstall
TabOrder = 2
end
object InstalledFilterEdit: TTreeFilterEdit
@ -422,8 +411,8 @@ object InstallPkgSetDialog: TInstallPkgSetDialog
ShowRoot = False
TabOrder = 1
OnAdvancedCustomDrawItem = TreeViewAdvancedCustomDrawItem
OnDblClick = AvailableTreeViewDblClick
OnKeyPress = AvailableTreeViewKeyPress
OnDblClick = AddToInstall
OnKeyDown = AvailableTreeViewKeyDown
OnSelectionChanged = AvailableTreeViewSelectionChanged
Options = [tvoAllowMultiselect, tvoAutoItemHeight, tvoHideSelection, tvoKeepCollapsedNodes, tvoReadOnly, tvoToolTips, tvoThemedDraw]
end
@ -441,7 +430,7 @@ object InstallPkgSetDialog: TInstallPkgSetDialog
BorderSpacing.Top = 6
BorderSpacing.Bottom = 6
Caption = 'AddToInstallButton'
OnClick = AddToInstallButtonClick
OnClick = AddToInstall
TabOrder = 2
end
object AvailableFilterEdit: TTreeFilterEdit

View File

@ -50,7 +50,7 @@ uses
// BuildIntf
PackageIntf, PackageLinkIntf, PackageDependencyIntf,
// IdeIntf
IdeIntfStrConsts, IDEImagesIntf, IDEHelpIntf, IDEDialogs, IDEWindowIntf, InputHistory,
IDEImagesIntf, IDEHelpIntf, IDEDialogs, IDEWindowIntf, InputHistory,
// IdeConfig
LazConf,
// IDE
@ -66,7 +66,6 @@ type
AvailablePkgGroupBox: TGroupBox;
MiddleBevel: TBevel;
HelpButton: TBitBtn;
CancelButton: TBitBtn;
ExportButton: TButton;
BtnPanel: TPanel;
InstallTreeView: TTreeView;
@ -86,32 +85,33 @@ type
Splitter1: TSplitter;
Splitter2: TSplitter;
UninstallButton: TBitBtn;
procedure AddToInstallButtonClick(Sender: TObject);
procedure AvailableTreeViewKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
function FilterEditGetImageIndex({%H-}Str: String; {%H-}Data: TObject;
var {%H-}AIsEnabled: Boolean): Integer;
procedure FormClose(Sender: TObject; var {%H-}CloseAction: TCloseAction);
procedure InstallTreeViewKeyPress(Sender: TObject; var Key: char);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure InstallTreeViewKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure LPKParsingTimerTimer(Sender: TObject);
procedure OnAllLPKParsed(Sender: TObject);
procedure OnIdle(Sender: TObject; var {%H-}Done: Boolean);
procedure TreeViewAdvancedCustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; {%H-}State: TCustomDrawState; Stage: TCustomDrawStage;
var PaintImages, {%H-}DefaultDraw: Boolean);
procedure AvailableTreeViewDblClick(Sender: TObject);
procedure AvailableTreeViewKeyPress(Sender: TObject; var Key: char);
procedure AvailableTreeViewSelectionChanged(Sender: TObject);
procedure ExportButtonClick(Sender: TObject);
procedure HelpButtonClick(Sender: TObject);
procedure ImportButtonClick(Sender: TObject);
procedure SaveAndRebuildButtonClick(Sender: TObject);
procedure InstallTreeViewDblClick(Sender: TObject);
procedure InstallPkgSetDialogCreate(Sender: TObject);
procedure InstallPkgSetDialogDestroy(Sender: TObject);
procedure InstallPkgSetDialogShow(Sender: TObject);
procedure InstallPkgSetDialogResize(Sender: TObject);
procedure InstallTreeViewSelectionChanged(Sender: TObject);
procedure SaveAndExitButtonClick(Sender: TObject);
procedure UninstallButtonClick(Sender: TObject);
procedure AddToInstall(Sender: TObject);
procedure AddToUninstall(Sender: TObject);
private
FIdleConnected: boolean;
FNewInstalledPackages: TObjectList; // list of TLazPackageID (not TLazPackage)
@ -152,8 +152,6 @@ type
procedure SavePackageListToFile(const AFilename: string);
procedure LoadPackageListFromFile(const AFilename: string);
function ExtractNameFromPkgID(ID: string): string;
procedure AddToInstall;
procedure AddToUninstall;
procedure PkgInfosChanged;
procedure ChangePkgVersion(PkgInfo: TLPKInfo; NewVersion: TPkgVersion);
function FindOnlinePackageLink(const AName: String): TPackageLink;
@ -166,9 +164,11 @@ type
property IdleConnected: boolean read FIdleConnected write SetIdleConnected;
end;
function ShowEditInstallPkgsDialog(OldInstalledPackages: TPkgDependency;
var NewInstalledPackages: TObjectList; // list of TLazPackageID (must be freed)
var RebuildIDE: boolean): TModalResult;
function ShowEditInstallPkgsDialog(
OldInstalledPackages: TPkgDependency;
out NewInstalledPackages: TObjectList; // list of TLazPackageID (must be freed, may be null)
out RebuildIDE: boolean
): boolean;
implementation
@ -186,19 +186,26 @@ begin
AControls[i].Constraints.MinWidth:=MaxWidth; // AutoSize=True
end;
function ShowEditInstallPkgsDialog(OldInstalledPackages: TPkgDependency;
var NewInstalledPackages: TObjectList; var RebuildIDE: boolean): TModalResult;
function ShowEditInstallPkgsDialog(
OldInstalledPackages: TPkgDependency;
out NewInstalledPackages: TObjectList; // list of TLazPackageID (must be freed, may be null)
out RebuildIDE: boolean
): boolean;
var
InstallPkgSetDialog: TInstallPkgSetDialog;
begin
NewInstalledPackages:=nil;
InstallPkgSetDialog:=TInstallPkgSetDialog.Create(nil);
result := false;
NewInstalledPackages := nil;
RebuildIDE := false;
InstallPkgSetDialog := TInstallPkgSetDialog.Create(nil);
try
InstallPkgSetDialog.OldInstalledPackages:=OldInstalledPackages;
InstallPkgSetDialog.UpdateButtonStates;
Result:=InstallPkgSetDialog.ShowModal;
NewInstalledPackages:=InstallPkgSetDialog.GetNewInstalledPackages;
RebuildIDE:=InstallPkgSetDialog.RebuildIDE;
InstallPkgSetDialog.OldInstalledPackages := OldInstalledPackages;
result := InstallPkgSetDialog.ShowModal = mrOK;
if result then
begin
NewInstalledPackages := InstallPkgSetDialog.GetNewInstalledPackages;
RebuildIDE := InstallPkgSetDialog.RebuildIDE;
end;
finally
InstallPkgSetDialog.Free;
end;
@ -210,43 +217,47 @@ procedure TInstallPkgSetDialog.InstallPkgSetDialogCreate(Sender: TObject);
begin
IDEDialogLayoutList.ApplyLayout(Self);
InstallTreeView.Images := IDEImages.Images_16;
{ Captions }
Self .Caption := lisInstallUninstallPackages;
NoteLabel .Caption := lisIDECompileAndRestart;
AvailablePkgGroupBox.Caption := lisAvailableForInstallation;
ExportButton .Caption := lisExportList;
ImportButton .Caption := lisImportList;
UninstallButton .Caption := lisUninstallSelection;
InstallPkgGroupBox .Caption := lisPckEditInstall;
AddToInstallButton .Caption := lisInstallSelection;
PkgInfoGroupBox .Caption := lisPackageInfo;
SaveAndRebuildButton.Caption := lisSaveAndRebuildIDE;
SaveAndExitButton .Caption := lisSaveAndExitDialog;
HelpButton .Caption := lisMenuHelp;
{ Images }
InstallTreeView .Images := IDEImages.Images_16;
AvailableTreeView.Images := IDEImages.Images_16;
ImgIndexPackage := IDEImages.LoadImage('item_package');
ImgIndexInstalledPackage := IDEImages.LoadImage('pkg_installed');
ImgIndexInstallPackage := IDEImages.LoadImage('pkg_package_autoinstall');
ImgIndexUninstallPackage := IDEImages.LoadImage('pkg_package_uninstall');
ImgIndexCirclePackage := IDEImages.LoadImage('pkg_package_circle');
ImgIndexMissingPackage := IDEImages.LoadImage('pkg_conflict');
ImgIndexAvailableOnline := IDEImages.LoadImage('pkg_install');
ImgIndexOverlayUnknown := IDEImages.LoadImage('state_unknown');
ImgIndexOverlayBasePackage := IDEImages.LoadImage('pkg_core_overlay');
ImgIndexOverlayFPCPackage := IDEImages.LoadImage('pkg_fpc_overlay');
ImgIndexOverlayLazarusPackage := IDEImages.LoadImage('pkg_lazarus_overlay');
ImgIndexOverlayDesignTimePackage := IDEImages.LoadImage('pkg_design_overlay');
ImgIndexOverlayRunTimePackage := IDEImages.LoadImage('pkg_runtime_overlay');
Caption:=lisInstallUninstallPackages;
NoteLabel.Caption:=lisIDECompileAndRestart;
AvailablePkgGroupBox.Caption:=lisAvailableForInstallation;
ExportButton.Caption:=lisExportList;
ImportButton.Caption:=lisImportList;
UninstallButton.Caption:=lisUninstallSelection;
IDEImages.AssignImage(UninstallButton, 'arrow__darkred_right');
InstallPkgGroupBox.Caption:=lisPckEditInstall;
AddToInstallButton.Caption:=lisInstallSelection;
IDEImages.AssignImage(AddToInstallButton, 'arrow__darkgreen_left');
PkgInfoGroupBox.Caption := lisPackageInfo;
SaveAndRebuildButton.Caption:=lisSaveAndRebuildIDE;
SaveAndExitButton.Caption:=lisSaveAndExitDialog;
HelpButton.Caption:=lisMenuHelp;
CancelButton.Caption:=lisCancel;
IDEImages.AssignImage(UninstallButton , 'arrow__darkred_right');
ImgIndexPackage := IDEImages.LoadImage('item_package');
ImgIndexInstalledPackage := IDEImages.LoadImage('pkg_installed');
ImgIndexInstallPackage := IDEImages.LoadImage('pkg_package_autoinstall');
ImgIndexUninstallPackage := IDEImages.LoadImage('pkg_package_uninstall');
ImgIndexCirclePackage := IDEImages.LoadImage('pkg_package_circle');
ImgIndexMissingPackage := IDEImages.LoadImage('pkg_conflict');
ImgIndexAvailableOnline := IDEImages.LoadImage('pkg_install');
ImgIndexOverlayUnknown := IDEImages.LoadImage('state_unknown');
ImgIndexOverlayBasePackage := IDEImages.LoadImage('pkg_core_overlay');
ImgIndexOverlayFPCPackage := IDEImages.LoadImage('pkg_fpc_overlay');
ImgIndexOverlayLazarusPackage := IDEImages.LoadImage('pkg_lazarus_overlay');
ImgIndexOverlayDesignTimePackage := IDEImages.LoadImage('pkg_design_overlay');
ImgIndexOverlayRunTimePackage := IDEImages.LoadImage('pkg_runtime_overlay');
{}
FNewInstalledPackages := TObjectList.Create(true);
FNewInstalledPackages:=TObjectList.Create(true);
PkgInfoMemo.Clear;
PkgInfoMemoLicense.Clear;
LPKInfoCache.AddOnQueueEmpty(@OnAllLPKParsed);
LPKInfoCache.StartLPKReaderWithAllAvailable;
@ -277,11 +288,6 @@ begin
ModalResult:=mrOk;
end;
procedure TInstallPkgSetDialog.InstallTreeViewDblClick(Sender: TObject);
begin
AddToUninstall;
end;
procedure TInstallPkgSetDialog.AvailableTreeViewSelectionChanged(Sender: TObject);
begin
UpdateButtonStates;
@ -337,9 +343,14 @@ begin
end;
end;
procedure TInstallPkgSetDialog.AddToInstallButtonClick(Sender: TObject);
procedure TInstallPkgSetDialog.AvailableTreeViewKeyDown(Sender: TObject;
var Key: Word; Shift: TShiftState);
begin
AddToInstall;
if (Key = VK_RETURN) and (Shift = []) then
begin
AddToInstall(Sender);
Key := 0;
end;
end;
function TInstallPkgSetDialog.FilterEditGetImageIndex(Str: String;
@ -354,10 +365,24 @@ begin
IDEDialogLayoutList.SaveLayout(Self);
end;
procedure TInstallPkgSetDialog.InstallTreeViewKeyPress(Sender: TObject; var Key: char);
procedure TInstallPkgSetDialog.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = char(VK_RETURN) then
AddToUninstall;
if (Key = VK_ESCAPE) and (Shift = []) then
begin
Close;
Key := 0;
end;
end;
procedure TInstallPkgSetDialog.InstallTreeViewKeyDown(Sender: TObject;
var Key: Word; Shift: TShiftState);
begin
if (Key = VK_RETURN) and (Shift = []) then
begin
AddToUninstall(Sender);
Key := 0;
end;
end;
procedure TInstallPkgSetDialog.LPKParsingTimerTimer(Sender: TObject);
@ -368,9 +393,8 @@ end;
procedure TInstallPkgSetDialog.OnAllLPKParsed(Sender: TObject);
begin
LPKParsingTimer.Enabled:=false;
UpdateNewInstalledPackages;
UpdateAvailablePackages;
LPKParsingTimer.Enabled := false;
LPKParsingTimerTimer(Sender);
end;
procedure TInstallPkgSetDialog.OnIdle(Sender: TObject; var Done: Boolean);
@ -446,17 +470,6 @@ begin
PaintImages:=false;
end;
procedure TInstallPkgSetDialog.AvailableTreeViewDblClick(Sender: TObject);
begin
AddToInstall;
end;
procedure TInstallPkgSetDialog.AvailableTreeViewKeyPress(Sender: TObject; var Key: char);
begin
if Key = char(VK_RETURN) then
AddToInstall;
end;
procedure TInstallPkgSetDialog.InstallPkgSetDialogResize(Sender: TObject);
var
w: Integer;
@ -479,11 +492,6 @@ begin
ModalResult:=mrOk;
end;
procedure TInstallPkgSetDialog.UninstallButtonClick(Sender: TObject);
begin
AddToUninstall;
end;
procedure TInstallPkgSetDialog.SetOldInstalledPackages(const AValue: TPkgDependency);
begin
if FOldInstalledPackages=AValue then exit;
@ -754,33 +762,31 @@ begin
end;
procedure TInstallPkgSetDialog.UpdateButtonStates;
var
Cnt: Integer;
Dependency: TPkgDependency;
s: String;
ListChanged: Boolean;
FilteredBranch: TTreeFilterBranch;
begin
UninstallButton.Enabled:=InstallTreeView.Selected<>nil;
AddToInstallButton.Enabled:=AvailableTreeView.Selected<>nil;
// check for changes
ListChanged:=false;
Cnt:=0;
Dependency:=OldInstalledPackages;
while Dependency<>nil do begin
s:=Dependency.PackageName;
if not PackageInInstallList(s) then begin
ListChanged:=true;
break;
//
function ChangesFound: boolean;
var
Cnt: Integer;
Dependency: TPkgDependency;
FilteredBranch: TTreeFilterBranch;
begin
Cnt := 0;
Dependency := OldInstalledPackages;
while Dependency <> nil do
begin
if not PackageInInstallList(Dependency.PackageName) then
exit(true);
Dependency := Dependency.NextRequiresDependency;
inc(Cnt);
end;
Dependency:=Dependency.NextRequiresDependency;
inc(Cnt);
FilteredBranch := InstalledFilterEdit.GetExistingBranch(nil);
result := assigned(FilteredBranch) and (FilteredBranch.Items.Count <> Cnt);
end;
FilteredBranch:=InstalledFilterEdit.GetExistingBranch(nil);
if Assigned(FilteredBranch) and (FilteredBranch.Items.Count<>Cnt) then
ListChanged:=true;
SaveAndExitButton.Enabled:=ListChanged;
SaveAndRebuildButton.Enabled:=ListChanged;
//
begin
SaveAndRebuildButton.Enabled := ChangesFound;
SaveAndExitButton .Enabled := SaveAndRebuildButton.Enabled;
UninstallButton .Enabled := InstallTreeView.Selected <> nil;
AddToInstallButton .Enabled := AvailableTreeView.Selected <> nil;
end;
procedure TInstallPkgSetDialog.UpdatePackageInfo(Tree: TTreeView);
@ -1015,7 +1021,7 @@ begin
Result:=GetIdentifier(PChar(ID));
end;
procedure TInstallPkgSetDialog.AddToInstall;
procedure TInstallPkgSetDialog.AddToInstall(Sender: TObject);
function SelectionOk(aPackageID: TLazPackageID): Boolean;
var
@ -1077,11 +1083,12 @@ var
begin
NewSelectedIndex:=-1;
LastNonSelectedIndex:=-1;
FilteredBranch := AvailableFilterEdit.GetExistingBranch(Nil); // All items are top level
Additions:=TObjectList.Create(false);
AddedPkgNames:=TStringList.Create;
PkgLinks := TList.Create;
NewPackageID:=TLazPackageID.Create;
FilteredBranch := AvailableFilterEdit.GetExistingBranch(Nil); // All items are top level.
try
for i:=0 to AvailableTreeView.Items.TopLvlCount-1 do
begin
@ -1175,7 +1182,7 @@ begin
end;
end;
procedure TInstallPkgSetDialog.AddToUninstall;
procedure TInstallPkgSetDialog.AddToUninstall(Sender: TObject);
function SelectionOk(aPackageID: TLazPackageID): Boolean;
var
@ -1206,10 +1213,11 @@ var
begin
NewSelectedIndex:=-1;
LastNonSelectedIndex:=-1;
FilteredBranch := InstalledFilterEdit.GetExistingBranch(Nil); // All items are top level
Deletions:=TObjectList.Create(true);
DeletedPkgNames:=TStringList.Create;
DelPackageID:=TLazPackageID.Create;
FilteredBranch := InstalledFilterEdit.GetExistingBranch(Nil); // All items are top level.
try
for i:=0 to InstallTreeView.Items.TopLvlCount-1 do begin
TVNode:=InstallTreeView.Items.TopLvlItems[i];
@ -1250,9 +1258,9 @@ begin
// Don't call UpdateNewInstalledPackages here, only the selected nodes were removed.
UpdateAvailablePackages;
UpdateButtonStates;
if ((NewSelectedIndex=-1) or (NewSelectedIndex=InstallTreeView.Items.TopLvlCount)) then
if ((NewSelectedIndex<0) or (NewSelectedIndex=InstallTreeView.Items.TopLvlCount)) then
NewSelectedIndex:=LastNonSelectedIndex;
if NewSelectedIndex<>-1 then
if NewSelectedIndex>=0 then
InstallTreeView.Items.TopLvlItems[NewSelectedIndex].Selected:=True;
InstalledFilterEdit.InvalidateFilter;
finally

View File

@ -459,21 +459,12 @@ procedure TPkgManager.MainIDEitmPkgEditInstallPkgsClick(Sender: TObject);
var
RebuildIDE: Boolean;
PkgIDList: TObjectList;
Flags: TPkgInstallInIDEFlags;
begin
RebuildIDE:=false;
PkgIDList:=nil;
try
if ShowEditInstallPkgsDialog(PackageGraph.FirstInstallDependency,
PkgIDList,RebuildIDE)<>mrOk
then exit;
Flags:=[piiifSkipChecks,piiifClear];
if RebuildIDE then Include(Flags,piiifRebuildIDE);
InstallPackages(PkgIDList,Flags);
finally
PkgIDList.Free;
end;
if ShowEditInstallPkgsDialog(PackageGraph.FirstInstallDependency, PkgIDList, RebuildIDE) then
if RebuildIDE
then InstallPackages(PkgIDList, [piiifSkipChecks, piiifClear, piiifRebuildIDE])
else InstallPackages(PkgIDList, [piiifSkipChecks, piiifClear]);
FreeThenNil(PkgIDList);
end;
procedure TPkgManager.IDEComponentPaletteOpenPackage(Sender: TObject);