IDE.Wizard.WizardFormFilesHelper.pas 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. unit IDE.Wizard.WizardFormFilesHelper;
  2. {
  3. Inno Setup
  4. Copyright (C) 1997-2025 Jordan Russell
  5. Portions by Martijn Laan
  6. For conditions of distribution and use, see LICENSE.TXT.
  7. Helper to avoid duplicate code between WizardForm and FilesDesignerForm
  8. }
  9. interface
  10. uses
  11. Windows, Classes, Forms, StdCtrls,
  12. DropListBox, IDE.Wizard.WizardFileForm;
  13. type
  14. TWizardFormFilesHelper = class
  15. private
  16. FWizardFiles: TList;
  17. FForm: TForm;
  18. FNotCreateAppDirCheck: TCheckBox;
  19. FFilesListBox: TDropListBox;
  20. FEditButton: TButton;
  21. FRemoveButton: TButton;
  22. function AddWizardFile(const Source: String; const Options: TWizardFileOptions): PWizardFile;
  23. function GetWizardFilesCount: Integer;
  24. procedure UpdateWizardFiles;
  25. procedure UpdateWizardFilesButtons;
  26. procedure FilesListBoxClick(Sender: TObject);
  27. procedure FilesListBoxDblClick(Sender: TObject);
  28. procedure FilesListBoxDropFile(Sender: TDropListBox; const FileName: String);
  29. procedure AddButtonClick(Sender: TObject);
  30. procedure AddDirButtonClick(Sender: TObject);
  31. procedure AddDownloadButtonClick(Sender: TObject);
  32. procedure EditButtonClick(Sender: TObject);
  33. procedure RemoveButtonClick(Sender: TObject);
  34. public
  35. constructor Create(const Form: TForm;
  36. const NotCreateAppDirCheck: TCheckBox; const FilesListBox: TDropListBox;
  37. const AddButton, AddDirButton, AddDownloadButton, EditButton, RemoveButton: TButton);
  38. destructor Destroy; override;
  39. procedure AddScript(var Files: String); overload;
  40. procedure AddScript(var Files: String; out HasExtractArchive: Boolean); overload;
  41. property FilesCount: Integer read GetWizardFilesCount;
  42. end;
  43. implementation
  44. uses
  45. SysUtils, UITypes, Dialogs,
  46. Shared.CommonFunc.Vcl, Shared.CommonFunc, BrowseFunc, PathFunc,
  47. IDE.Messages;
  48. constructor TWizardFormFilesHelper.Create(const Form: TForm;
  49. const NotCreateAppDirCheck: TCheckBox; const FilesListBox: TDropListBox;
  50. const AddButton, AddDirButton, AddDownloadButton, EditButton, RemoveButton: TButton);
  51. begin
  52. inherited Create;
  53. FWizardFiles := TList.Create;
  54. FForm := Form;
  55. FNotCreateAppDirCheck := NotCreateAppDirCheck;
  56. FFilesListBox := FilesListBox;
  57. FEditButton := EditButton;
  58. FRemoveButton := RemoveButton;
  59. FilesListBox.OnClick := FilesListBoxClick;
  60. FilesListBox.OnDblClick := FilesListBoxDblClick;
  61. FilesListBox.OnDropFile := FilesListBoxDropFile;
  62. AddButton.OnClick := AddButtonClick;
  63. AddDirButton.OnClick := AddDirButtonClick;
  64. AddDownloadButton.OnClick := AddDownloadButtonClick;
  65. EditButton.OnClick := EditButtonClick;
  66. RemoveButton.OnClick := RemoveButtonClick;
  67. UpdateWizardFilesButtons;
  68. end;
  69. destructor TWizardFormFilesHelper.Destroy;
  70. begin
  71. for var I := 0 to FWizardFiles.Count-1 do
  72. Dispose(PWizardFile(FWizardFiles[i]));
  73. FWizardFiles.Free;
  74. end;
  75. function TWizardFormFilesHelper.AddWizardFile(const Source: String; const Options: TWizardFileOptions): PWizardFile;
  76. var
  77. WizardFile: PWizardFile;
  78. begin
  79. New(WizardFile);
  80. WizardFile.Source := Source;
  81. WizardFile.Options := Options;
  82. WizardFile.DestRootDirIsConstant := True;
  83. if not FNotCreateAppDirCheck.Checked then
  84. WizardFile.DestRootDir := '{app}'
  85. else
  86. WizardFile.DestRootDir := '{win}';
  87. WizardFile.DestSubDir := '';
  88. WizardFile.DestName := '';
  89. WizardFile.ExternalSize := 0;
  90. FWizardFiles.Add(WizardFile);
  91. Result := WizardFile;
  92. end;
  93. function TWizardFormFilesHelper.GetWizardFilesCount: Integer;
  94. begin
  95. Result := FWizardFiles.Count;
  96. end;
  97. procedure TWizardFormFilesHelper.UpdateWizardFiles;
  98. var
  99. WizardFile: PWizardFile;
  100. I: Integer;
  101. begin
  102. FFilesListBox.Items.BeginUpdate;
  103. FFilesListBox.Items.Clear;
  104. for I := 0 to FWizardFiles.Count-1 do begin
  105. WizardFile := FWizardFiles[i];
  106. FFilesListBox.Items.Add(WizardFile.Source);
  107. end;
  108. FFilesListBox.Items.EndUpdate;
  109. UpdateHorizontalExtent(FFilesListBox);
  110. end;
  111. procedure TWizardFormFilesHelper.UpdateWizardFilesButtons;
  112. var
  113. Enabled: Boolean;
  114. begin
  115. Enabled := FFilesListBox.ItemIndex >= 0;
  116. FEditButton.Enabled := Enabled;
  117. FRemoveButton.Enabled := Enabled;
  118. end;
  119. procedure TWizardFormFilesHelper.FilesListBoxClick(Sender: TObject);
  120. begin
  121. UpdateWizardFilesButtons;
  122. end;
  123. procedure TWizardFormFilesHelper.FilesListBoxDblClick(Sender: TObject);
  124. begin
  125. if FEditButton.Enabled then
  126. FEditButton.Click;
  127. end;
  128. procedure TWizardFormFilesHelper.FilesListBoxDropFile(Sender: TDropListBox;
  129. const FileName: String);
  130. begin
  131. if DirExists(FileName) then
  132. AddWizardFile(AddBackslash(FileName) + '*', [foRecurseSubDirs, foCreateAllSubDirs])
  133. else
  134. AddWizardFile(FileName, []);
  135. UpdateWizardFiles;
  136. UpdateWizardFilesButtons;
  137. end;
  138. procedure TWizardFormFilesHelper.AddButtonClick(Sender: TObject);
  139. var
  140. FileList: TStringList;
  141. I: Integer;
  142. begin
  143. FileList := TStringList.Create;
  144. try
  145. if NewGetOpenFileNameMulti('', FileList, '', SWizardAllFilesFilter, '', FForm.Handle) then begin
  146. FileList.Sort;
  147. for I := 0 to FileList.Count-1 do
  148. AddWizardFile(FileList[I], []);
  149. UpdateWizardFiles;
  150. end;
  151. finally
  152. FileList.Free;
  153. end
  154. end;
  155. procedure TWizardFormFilesHelper.AddDirButtonClick(Sender: TObject);
  156. var
  157. Path: String;
  158. Recurse: Boolean;
  159. begin
  160. Path := '';
  161. if BrowseForFolder(SWizardAppFiles3, Path, FForm.Handle, False) then begin
  162. case MsgBox(Format(SWizardAppFilesSubDirsMessage, [Path]), '', mbConfirmation, MB_YESNOCANCEL) of
  163. IDYES: Recurse := True;
  164. IDNO: Recurse := False;
  165. else
  166. Exit;
  167. end;
  168. var Options: TWizardFileOptions;
  169. if Recurse then
  170. Options := [foRecurseSubDirs, foCreateAllSubDirs]
  171. else
  172. Options := [];
  173. AddWizardFile(AddBackslash(Path) + '*', Options);
  174. UpdateWizardFiles;
  175. end;
  176. end;
  177. procedure TWizardFormFilesHelper.AddDownloadButtonClick(Sender: TObject);
  178. const
  179. DestNamePrompts: array [Boolean] of string = (SWizardAppFilesDownloadDestNamePrompt, SWizardAppFilesDownloadArchiveDestNamePrompt);
  180. begin
  181. var Source := 'https://www.example.com/MyProg.7z';
  182. repeat
  183. if not InputQuery(FForm.Caption, SWizardAppFilesDownloadSourcePrompt, Source) then
  184. Exit;
  185. until Source <> '';
  186. const ExtractArchive = MsgBox(SWizardAppFilesDownloadExtractArchiveMessage, '', mbConfirmation, MB_YESNO or MB_DEFBUTTON2) = IDYES;
  187. var DestName := 'MyProg.7z';
  188. repeat
  189. if not InputQuery(FForm.Caption, DestNamePrompts[ExtractArchive], DestName) then
  190. Exit;
  191. until DestName <> '';
  192. var ExternalSizeAsString := '';
  193. var ExternalSize: Extended;
  194. repeat
  195. if not InputQuery(FForm.Caption, SWizardAppFilesDownloadExternalSizePrompt, ExternalSizeAsString) then
  196. Exit;
  197. until TryStrToFloat(ExternalSizeAsString, ExternalSize);
  198. var Options: TWizardFileOptions := [foDownload];
  199. if ExtractArchive then
  200. Options := Options + [foExtractArchive, foRecurseSubDirs, foCreateAllSubDirs];
  201. const WizardFile = AddWizardFile(Source, Options);
  202. WizardFile.DestName := DestName;
  203. WizardFile.ExternalSize := Round(ExternalSize*1024*1024);
  204. UpdateWizardFiles;
  205. end;
  206. procedure TWizardFormFilesHelper.EditButtonClick(Sender: TObject);
  207. var
  208. WizardFileForm: TWizardFileForm;
  209. Index: Integer;
  210. begin
  211. WizardFileForm := TWizardFileForm.Create(Application);
  212. try
  213. Index := FFilesListBox.ItemIndex;
  214. WizardFileForm.AllowAppDestRootDir := not FNotCreateAppDirCheck.Checked;
  215. WizardFileForm.WizardFile := FWizardFiles[Index];
  216. if WizardFileForm.ShowModal = mrOk then begin
  217. UpdateWizardFiles;
  218. FFilesListBox.ItemIndex := Index;
  219. FFilesListBox.TopIndex := Index;
  220. UpdateWizardFilesButtons;
  221. end;
  222. finally
  223. WizardFileForm.Free;
  224. end;
  225. end;
  226. procedure TWizardFormFilesHelper.RemoveButtonClick(Sender: TObject);
  227. var
  228. I: Integer;
  229. begin
  230. I := FFilesListBox.ItemIndex;
  231. Dispose(PWizardFile(FWizardFiles[I]));
  232. FWizardFiles.Delete(I);
  233. UpdateWizardFiles;
  234. UpdateWizardFilesButtons;
  235. end;
  236. procedure TWizardFormFilesHelper.AddScript(var Files: String; out HasExtractArchive: Boolean);
  237. var
  238. WizardFile: PWizardFile;
  239. I: Integer;
  240. begin
  241. var AddedVerificationNote := False;
  242. for I := 0 to FWizardFiles.Count-1 do begin
  243. WizardFile := FWizardFiles[I];
  244. if (foDownload in WizardFile.Options) and not AddedVerificationNote then begin
  245. Files := Files + '; NOTE: Use the "issigverify" flag or the "Hash" parameter to verify downloads' + SNewLine;
  246. AddedVerificationNote := True;
  247. end;
  248. if foExtractArchive in WizardFile.Options then
  249. HasExtractArchive := True;
  250. Files := Files + 'Source: "' + WizardFile.Source + '"; DestDir: "' + RemoveBackslashUnlessRoot(AddBackslash(WizardFile.DestRootDir) + WizardFile.DestSubDir) + '"';
  251. if WizardFile.DestName <> '' then
  252. Files := Files + '; DestName: "' + WizardFile.DestName + '"';
  253. if WizardFile.ExternalSize <> 0 then
  254. Files := Files + '; ExternalSize: "' + WizardFile.ExternalSize.ToString + '"';
  255. Files := Files + '; Flags: ignoreversion';
  256. if WizardFile.Options * [foDownload, foExtractArchive] <> [] then
  257. Files := Files + ' external';
  258. if foDownload in WizardFile.Options then
  259. Files := Files + ' download';
  260. if foExtractArchive in WizardFile.Options then
  261. Files := Files + ' extractarchive';
  262. if foRecurseSubDirs in WizardFile.Options then
  263. Files := Files + ' recursesubdirs';
  264. if foCreateAllSubDirs in WizardFile.Options then
  265. Files := Files + ' createallsubdirs';
  266. Files := Files + SNewLine;
  267. end;
  268. end;
  269. procedure TWizardFormFilesHelper.AddScript(var Files: String);
  270. begin
  271. var HasExtractArchive: Boolean;
  272. AddScript(Files, HasExtractArchive);
  273. end;
  274. end.