IDE.Wizard.WizardFormFilesHelper.pas 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. unit IDE.Wizard.WizardFormFilesHelper;
  2. {
  3. Inno Setup
  4. Copyright (C) 1997-2024 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;
  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. procedure AddWizardFile(const Source: String; const RecurseSubDirs, CreateAllSubDirs: Boolean);
  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 EditButtonClick(Sender: TObject);
  32. procedure RemoveButtonClick(Sender: TObject);
  33. public
  34. constructor Create(const Form: TForm;
  35. const NotCreateAppDirCheck: TCheckBox; const FilesListBox: TDropListBox;
  36. const AddButton, AddDirButton, EditButton, RemoveButton: TButton);
  37. destructor Destroy; override;
  38. procedure AddScript(var Files: String);
  39. property FilesCount: Integer read GetWizardFilesCount;
  40. end;
  41. implementation
  42. uses
  43. SysUtils, UITypes,
  44. Shared.CommonFunc.Vcl, Shared.CommonFunc, BrowseFunc, PathFunc,
  45. IDE.Messages, IDE.Wizard.WizardFileForm;
  46. constructor TWizardFormFilesHelper.Create(const Form: TForm;
  47. const NotCreateAppDirCheck: TCheckBox; const FilesListBox: TDropListBox;
  48. const AddButton, AddDirButton, EditButton, RemoveButton: TButton);
  49. begin
  50. inherited Create;
  51. FWizardFiles := TList.Create;
  52. FForm := Form;
  53. FNotCreateAppDirCheck := NotCreateAppDirCheck;
  54. FFilesListBox := FilesListBox;
  55. FEditButton := EditButton;
  56. FRemoveButton := RemoveButton;
  57. FilesListBox.OnClick := FilesListBoxClick;
  58. FilesListBox.OnDblClick := FilesListBoxDblClick;
  59. FilesListBox.OnDropFile := FilesListBoxDropFile;
  60. AddButton.OnClick := AddButtonClick;
  61. AddDirButton.OnClick := AddDirButtonClick;
  62. EditButton.OnClick := EditButtonClick;
  63. RemoveButton.OnClick := RemoveButtonClick;
  64. UpdateWizardFilesButtons;
  65. end;
  66. destructor TWizardFormFilesHelper.Destroy;
  67. begin
  68. for var I := 0 to FWizardFiles.Count-1 do
  69. Dispose(FWizardFiles[i]);
  70. FWizardFiles.Free;
  71. end;
  72. procedure TWizardFormFilesHelper.AddWizardFile(const Source: String; const RecurseSubDirs, CreateAllSubDirs: Boolean);
  73. var
  74. WizardFile: PWizardFile;
  75. begin
  76. New(WizardFile);
  77. WizardFile.Source := Source;
  78. WizardFile.RecurseSubDirs := RecurseSubDirs;
  79. WizardFile.CreateAllSubDirs := CreateAllSubDirs;
  80. WizardFile.DestRootDirIsConstant := True;
  81. if not FNotCreateAppDirCheck.Checked then
  82. WizardFile.DestRootDir := '{app}'
  83. else
  84. WizardFile.DestRootDir := '{win}';
  85. WizardFile.DestSubDir := '';
  86. FWizardFiles.Add(WizardFile);
  87. end;
  88. function TWizardFormFilesHelper.GetWizardFilesCount: Integer;
  89. begin
  90. Result := FWizardFiles.Count;
  91. end;
  92. procedure TWizardFormFilesHelper.UpdateWizardFiles;
  93. var
  94. WizardFile: PWizardFile;
  95. I: Integer;
  96. begin
  97. FFilesListBox.Items.BeginUpdate;
  98. FFilesListBox.Items.Clear;
  99. for I := 0 to FWizardFiles.Count-1 do begin
  100. WizardFile := FWizardFiles[i];
  101. FFilesListBox.Items.Add(WizardFile.Source);
  102. end;
  103. FFilesListBox.Items.EndUpdate;
  104. UpdateHorizontalExtent(FFilesListBox);
  105. end;
  106. procedure TWizardFormFilesHelper.UpdateWizardFilesButtons;
  107. var
  108. Enabled: Boolean;
  109. begin
  110. Enabled := FFilesListBox.ItemIndex >= 0;
  111. FEditButton.Enabled := Enabled;
  112. FRemoveButton.Enabled := Enabled;
  113. end;
  114. procedure TWizardFormFilesHelper.FilesListBoxClick(Sender: TObject);
  115. begin
  116. UpdateWizardFilesButtons;
  117. end;
  118. procedure TWizardFormFilesHelper.FilesListBoxDblClick(Sender: TObject);
  119. begin
  120. if FEditButton.Enabled then
  121. FEditButton.Click;
  122. end;
  123. procedure TWizardFormFilesHelper.FilesListBoxDropFile(Sender: TDropListBox;
  124. const FileName: String);
  125. begin
  126. if DirExists(FileName) then
  127. AddWizardFile(AddBackslash(FileName) + '*', True, True)
  128. else
  129. AddWizardFile(FileName, False, False);
  130. UpdateWizardFiles;
  131. UpdateWizardFilesButtons;
  132. end;
  133. procedure TWizardFormFilesHelper.AddButtonClick(Sender: TObject);
  134. var
  135. FileList: TStringList;
  136. I: Integer;
  137. begin
  138. FileList := TStringList.Create;
  139. try
  140. if NewGetOpenFileNameMulti('', FileList, '', SWizardAllFilesFilter, '', FForm.Handle) then begin
  141. FileList.Sort;
  142. for I := 0 to FileList.Count-1 do
  143. AddWizardFile(FileList[I], False, False);
  144. UpdateWizardFiles;
  145. end;
  146. finally
  147. FileList.Free;
  148. end
  149. end;
  150. procedure TWizardFormFilesHelper.AddDirButtonClick(Sender: TObject);
  151. var
  152. Path: String;
  153. Recurse: Boolean;
  154. begin
  155. Path := '';
  156. if BrowseForFolder(SWizardAppFiles3, Path, FForm.Handle, False) then begin
  157. case MsgBox(Format(SWizardAppFilesSubDirsMessage, [Path]), '', mbConfirmation, MB_YESNOCANCEL) of
  158. IDYES: Recurse := True;
  159. IDNO: Recurse := False;
  160. else
  161. Exit;
  162. end;
  163. AddWizardFile(AddBackslash(Path) + '*', Recurse, Recurse);
  164. UpdateWizardFiles;
  165. end;
  166. end;
  167. procedure TWizardFormFilesHelper.EditButtonClick(Sender: TObject);
  168. var
  169. WizardFileForm: TWizardFileForm;
  170. Index: Integer;
  171. begin
  172. WizardFileForm := TWizardFileForm.Create(Application);
  173. try
  174. Index := FFilesListBox.ItemIndex;
  175. WizardFileForm.AllowAppDestRootDir := not FNotCreateAppDirCheck.Checked;
  176. WizardFileForm.WizardFile := FWizardFiles[Index];
  177. if WizardFileForm.ShowModal = mrOk then begin
  178. UpdateWizardFiles;
  179. FFilesListBox.ItemIndex := Index;
  180. FFilesListBox.TopIndex := Index;
  181. UpdateWizardFilesButtons;
  182. end;
  183. finally
  184. WizardFileForm.Free;
  185. end;
  186. end;
  187. procedure TWizardFormFilesHelper.RemoveButtonClick(Sender: TObject);
  188. var
  189. I: Integer;
  190. begin
  191. I := FFilesListBox.ItemIndex;
  192. Dispose(FWizardFiles[I]);
  193. FWizardFiles.Delete(I);
  194. UpdateWizardFiles;
  195. UpdateWizardFilesButtons;
  196. end;
  197. procedure TWizardFormFilesHelper.AddScript(var Files: String);
  198. var
  199. WizardFile: PWizardFile;
  200. I: Integer;
  201. begin
  202. for I := 0 to FWizardFiles.Count-1 do begin
  203. WizardFile := FWizardFiles[I];
  204. Files := Files + 'Source: "' + WizardFile.Source + '"; DestDir: "' + RemoveBackslashUnlessRoot(AddBackslash(WizardFile.DestRootDir) + WizardFile.DestSubDir) + '"; Flags: ignoreversion';
  205. if WizardFile.RecurseSubDirs then
  206. Files := Files + ' recursesubdirs';
  207. if WizardFile.CreateAllSubDirs then
  208. Files := Files + ' createallsubdirs';
  209. Files := Files + SNewLine;
  210. end;
  211. end;
  212. end.