Inno-Setup-issrc/Projects/Src/IDE.Wizard.WizardFormFilesHelper.pas

239 lines
6.9 KiB
ObjectPascal

unit IDE.Wizard.WizardFormFilesHelper;
{
Inno Setup
Copyright (C) 1997-2024 Jordan Russell
Portions by Martijn Laan
For conditions of distribution and use, see LICENSE.TXT.
Helper to avoid duplicate code between WizardForm and FilesDesignerForm
}
interface
uses
Windows, Classes, Forms, StdCtrls,
DropListBox;
type
TWizardFormFilesHelper = class
private
FWizardFiles: TList;
FForm: TForm;
FNotCreateAppDirCheck: TCheckBox;
FFilesListBox: TDropListBox;
FEditButton: TButton;
FRemoveButton: TButton;
procedure AddWizardFile(const Source: String; const RecurseSubDirs, CreateAllSubDirs: Boolean);
function GetWizardFilesCount: Integer;
procedure UpdateWizardFiles;
procedure UpdateWizardFilesButtons;
procedure FilesListBoxClick(Sender: TObject);
procedure FilesListBoxDblClick(Sender: TObject);
procedure FilesListBoxDropFile(Sender: TDropListBox; const FileName: String);
procedure AddButtonClick(Sender: TObject);
procedure AddDirButtonClick(Sender: TObject);
procedure EditButtonClick(Sender: TObject);
procedure RemoveButtonClick(Sender: TObject);
public
constructor Create(const Form: TForm;
const NotCreateAppDirCheck: TCheckBox; const FilesListBox: TDropListBox;
const AddButton, AddDirButton, EditButton, RemoveButton: TButton);
destructor Destroy; override;
procedure AddScript(var Files: String);
property FilesCount: Integer read GetWizardFilesCount;
end;
implementation
uses
SysUtils, UITypes,
Shared.CommonFunc.Vcl, Shared.CommonFunc, BrowseFunc, PathFunc,
IDE.Messages, IDE.Wizard.WizardFileForm;
constructor TWizardFormFilesHelper.Create(const Form: TForm;
const NotCreateAppDirCheck: TCheckBox; const FilesListBox: TDropListBox;
const AddButton, AddDirButton, EditButton, RemoveButton: TButton);
begin
inherited Create;
FWizardFiles := TList.Create;
FForm := Form;
FNotCreateAppDirCheck := NotCreateAppDirCheck;
FFilesListBox := FilesListBox;
FEditButton := EditButton;
FRemoveButton := RemoveButton;
FilesListBox.OnClick := FilesListBoxClick;
FilesListBox.OnDblClick := FilesListBoxDblClick;
FilesListBox.OnDropFile := FilesListBoxDropFile;
AddButton.OnClick := AddButtonClick;
AddDirButton.OnClick := AddDirButtonClick;
EditButton.OnClick := EditButtonClick;
RemoveButton.OnClick := RemoveButtonClick;
UpdateWizardFilesButtons;
end;
destructor TWizardFormFilesHelper.Destroy;
begin
for var I := 0 to FWizardFiles.Count-1 do
Dispose(FWizardFiles[i]);
FWizardFiles.Free;
end;
procedure TWizardFormFilesHelper.AddWizardFile(const Source: String; const RecurseSubDirs, CreateAllSubDirs: Boolean);
var
WizardFile: PWizardFile;
begin
New(WizardFile);
WizardFile.Source := Source;
WizardFile.RecurseSubDirs := RecurseSubDirs;
WizardFile.CreateAllSubDirs := CreateAllSubDirs;
WizardFile.DestRootDirIsConstant := True;
if not FNotCreateAppDirCheck.Checked then
WizardFile.DestRootDir := '{app}'
else
WizardFile.DestRootDir := '{win}';
WizardFile.DestSubDir := '';
FWizardFiles.Add(WizardFile);
end;
function TWizardFormFilesHelper.GetWizardFilesCount: Integer;
begin
Result := FWizardFiles.Count;
end;
procedure TWizardFormFilesHelper.UpdateWizardFiles;
var
WizardFile: PWizardFile;
I: Integer;
begin
FFilesListBox.Items.BeginUpdate;
FFilesListBox.Items.Clear;
for I := 0 to FWizardFiles.Count-1 do begin
WizardFile := FWizardFiles[i];
FFilesListBox.Items.Add(WizardFile.Source);
end;
FFilesListBox.Items.EndUpdate;
UpdateHorizontalExtent(FFilesListBox);
end;
procedure TWizardFormFilesHelper.UpdateWizardFilesButtons;
var
Enabled: Boolean;
begin
Enabled := FFilesListBox.ItemIndex >= 0;
FEditButton.Enabled := Enabled;
FRemoveButton.Enabled := Enabled;
end;
procedure TWizardFormFilesHelper.FilesListBoxClick(Sender: TObject);
begin
UpdateWizardFilesButtons;
end;
procedure TWizardFormFilesHelper.FilesListBoxDblClick(Sender: TObject);
begin
if FEditButton.Enabled then
FEditButton.Click;
end;
procedure TWizardFormFilesHelper.FilesListBoxDropFile(Sender: TDropListBox;
const FileName: String);
begin
if DirExists(FileName) then
AddWizardFile(AddBackslash(FileName) + '*', True, True)
else
AddWizardFile(FileName, False, False);
UpdateWizardFiles;
UpdateWizardFilesButtons;
end;
procedure TWizardFormFilesHelper.AddButtonClick(Sender: TObject);
var
FileList: TStringList;
I: Integer;
begin
FileList := TStringList.Create;
try
if NewGetOpenFileNameMulti('', FileList, '', SWizardAllFilesFilter, '', FForm.Handle) then begin
FileList.Sort;
for I := 0 to FileList.Count-1 do
AddWizardFile(FileList[I], False, False);
UpdateWizardFiles;
end;
finally
FileList.Free;
end
end;
procedure TWizardFormFilesHelper.AddDirButtonClick(Sender: TObject);
var
Path: String;
Recurse: Boolean;
begin
Path := '';
if BrowseForFolder(SWizardAppFiles3, Path, FForm.Handle, False) then begin
case MsgBox(Format(SWizardAppFilesSubDirsMessage, [Path]), '', mbConfirmation, MB_YESNOCANCEL) of
IDYES: Recurse := True;
IDNO: Recurse := False;
else
Exit;
end;
AddWizardFile(AddBackslash(Path) + '*', Recurse, Recurse);
UpdateWizardFiles;
end;
end;
procedure TWizardFormFilesHelper.EditButtonClick(Sender: TObject);
var
WizardFileForm: TWizardFileForm;
Index: Integer;
begin
WizardFileForm := TWizardFileForm.Create(Application);
try
Index := FFilesListBox.ItemIndex;
WizardFileForm.AllowAppDestRootDir := not FNotCreateAppDirCheck.Checked;
WizardFileForm.WizardFile := FWizardFiles[Index];
if WizardFileForm.ShowModal = mrOk then begin
UpdateWizardFiles;
FFilesListBox.ItemIndex := Index;
FFilesListBox.TopIndex := Index;
UpdateWizardFilesButtons;
end;
finally
WizardFileForm.Free;
end;
end;
procedure TWizardFormFilesHelper.RemoveButtonClick(Sender: TObject);
var
I: Integer;
begin
I := FFilesListBox.ItemIndex;
Dispose(FWizardFiles[I]);
FWizardFiles.Delete(I);
UpdateWizardFiles;
UpdateWizardFilesButtons;
end;
procedure TWizardFormFilesHelper.AddScript(var Files: String);
var
WizardFile: PWizardFile;
I: Integer;
begin
for I := 0 to FWizardFiles.Count-1 do begin
WizardFile := FWizardFiles[I];
Files := Files + 'Source: "' + WizardFile.Source + '"; DestDir: "' + RemoveBackslashUnlessRoot(AddBackslash(WizardFile.DestRootDir) + WizardFile.DestSubDir) + '"; Flags: ignoreversion';
if WizardFile.RecurseSubDirs then
Files := Files + ' recursesubdirs';
if WizardFile.CreateAllSubDirs then
Files := Files + ' createallsubdirs';
Files := Files + SNewLine;
end;
end;
end.