IDE.SignToolsForm.pas 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. unit IDE.SignToolsForm;
  2. {
  3. Inno Setup
  4. Copyright (C) 1997-2020 Jordan Russell
  5. Portions by Martijn Laan
  6. For conditions of distribution and use, see LICENSE.TXT.
  7. Compiler IDE SignTools form
  8. }
  9. interface
  10. uses
  11. Classes, Controls, StdCtrls, UIStateForm;
  12. type
  13. TSignToolsForm = class(TUIStateForm)
  14. OKButton: TButton;
  15. CancelButton: TButton;
  16. GroupBox1: TGroupBox;
  17. SignToolsListBox: TListBox;
  18. AddButton: TButton;
  19. RemoveButton: TButton;
  20. EditButton: TButton;
  21. procedure SignToolsListBoxClick(Sender: TObject);
  22. procedure FormCreate(Sender: TObject);
  23. procedure FormDestroy(Sender: TObject);
  24. procedure AddButtonClick(Sender: TObject);
  25. procedure RemoveButtonClick(Sender: TObject);
  26. procedure EditButtonClick(Sender: TObject);
  27. procedure SignToolsListBoxDblClick(Sender: TObject);
  28. private
  29. FSignTools: TStringList;
  30. procedure CommandDocImageClick(Sender: TObject);
  31. procedure UpdateSignTools;
  32. procedure UpdateSignToolsButtons;
  33. procedure SetSignTools(SignTools: TStringList);
  34. function InputSignTool(var SignToolName, SignToolCommand: String;
  35. ExistingIndex: Integer): Boolean;
  36. protected
  37. procedure CreateWnd; override;
  38. procedure CreateParams(var Params: TCreateParams); override;
  39. public
  40. property SignTools: TStringList read FSignTools write SetSignTools;
  41. end;
  42. implementation
  43. uses
  44. Windows, Messages, SysUtils, Dialogs,
  45. Shared.CommonFunc.Vcl, IDE.InputQueryMemoForm, IDE.HelperFunc,
  46. IDE.HtmlHelpFunc;
  47. {$R *.DFM}
  48. procedure TSignToolsForm.UpdateSignTools;
  49. begin
  50. SignToolsListBox.Items.Assign(FSignTools);
  51. UpdateHorizontalExtent(SignToolsListBox);
  52. end;
  53. procedure TSignToolsForm.UpdateSignToolsButtons;
  54. var
  55. Enabled: Boolean;
  56. begin
  57. Enabled := SignToolsListBox.ItemIndex >= 0;
  58. EditButton.Enabled := Enabled;
  59. RemoveButton.Enabled := Enabled;
  60. end;
  61. procedure TSignToolsForm.SetSignTools(SignTools: TStringList);
  62. begin
  63. FSignTools.Assign(SignTools);
  64. UpdateSignTools;
  65. UpdateSignToolsButtons;
  66. end;
  67. procedure TSignToolsForm.FormCreate(Sender: TObject);
  68. begin
  69. FSignTools := TStringList.Create();
  70. InitFormFont(Self);
  71. end;
  72. { This and CreateParams make bsSizeable (which has an unwanted icon) look like bsDialog, see:
  73. https://stackoverflow.com/questions/32096482/delphi-resizable-bsdialog-form/32098633 }
  74. procedure TSignToolsForm.CreateWnd;
  75. begin
  76. inherited;
  77. SendMessage(Handle, WM_SETICON, ICON_BIG, 0);
  78. end;
  79. procedure TSignToolsForm.CommandDocImageClick(Sender: TObject);
  80. begin
  81. if Assigned(HtmlHelp) then
  82. HtmlHelp(GetDesktopWindow, PChar(GetHelpFile), HH_DISPLAY_TOPIC, Cardinal(PChar('topic_setup_signtool.htm')));
  83. end;
  84. procedure TSignToolsForm.CreateParams(var Params: TCreateParams);
  85. begin
  86. inherited CreateParams(Params);
  87. Params.ExStyle := Params.ExStyle or WS_EX_DLGMODALFRAME or WS_EX_WINDOWEDGE;
  88. end;
  89. procedure TSignToolsForm.FormDestroy(Sender: TObject);
  90. begin
  91. FSignTools.Free();
  92. end;
  93. function TSignToolsForm.InputSignTool(var SignToolName, SignToolCommand: String;
  94. ExistingIndex: Integer): Boolean;
  95. var
  96. I: Integer;
  97. begin
  98. Result := False;
  99. if InputQuery(Caption, 'Name of the Sign Tool:', SignToolName) then begin
  100. if (SignToolName = '') or (Pos('=', SignToolName) <> 0) then begin
  101. AppMessageBox(PChar('Invalid name.'), PChar(Caption), MB_OK or MB_ICONSTOP);
  102. Exit;
  103. end;
  104. for I := 0 to FSignTools.Count-1 do begin
  105. if (I <> ExistingIndex) and (Pos(SignToolName + '=', FSignTools[I]) = 1) then begin
  106. AppMessageBox(PChar('Duplicate name.'), PChar(Caption), MB_OK or MB_ICONSTOP);
  107. Exit;
  108. end;
  109. end;
  110. if InputQueryMemo(Caption, 'Command of the Sign Tool:', SignToolCommand, True, CommandDocImageClick) then begin
  111. if SignToolCommand = '' then begin
  112. AppMessageBox(PChar('Invalid command.'), PChar(Caption), MB_OK or MB_ICONSTOP);
  113. Exit;
  114. end;
  115. end;
  116. Result := True;
  117. end;
  118. end;
  119. procedure TSignToolsForm.AddButtonClick(Sender: TObject);
  120. var
  121. SignToolName, SignToolCommand: String;
  122. begin
  123. SignToolName := '';
  124. SignToolCommand := '';
  125. if InputSignTool(SignToolName, SignToolCommand, -1) then begin
  126. FSignTools.Add(SignToolName + '=' + SignToolCommand);
  127. UpdateSignTools;
  128. UpdateSignToolsButtons;
  129. end;
  130. end;
  131. procedure TSignToolsForm.EditButtonClick(Sender: TObject);
  132. var
  133. SignToolName, SignToolCommand: String;
  134. I, P: Integer;
  135. begin
  136. I := SignToolsListBox.ItemIndex;
  137. P := Pos('=', FSignTools[I]);
  138. if P = 0 then
  139. raise Exception.Create('Internal error: ''='' not found in SignTool');
  140. SignToolName := Copy(FSignTools[I], 1, P-1);
  141. SignToolCommand := Copy(FSignTools[I], P+1, MaxInt);
  142. if InputSignTool(SignToolName, SignToolCommand, I) then begin
  143. FSignTools[I] := SignToolName + '=' + SignToolCommand;
  144. UpdateSignTools;
  145. UpdateSignToolsButtons;
  146. end;
  147. end;
  148. procedure TSignToolsForm.RemoveButtonClick(Sender: TObject);
  149. var
  150. I: Integer;
  151. begin
  152. I := SignToolsListBox.ItemIndex;
  153. FSignTools.Delete(I);
  154. UpdateSignTools;
  155. UpdateSignToolsButtons;
  156. end;
  157. procedure TSignToolsForm.SignToolsListBoxClick(Sender: TObject);
  158. begin
  159. UpdateSignToolsButtons;
  160. end;
  161. procedure TSignToolsForm.SignToolsListBoxDblClick(Sender: TObject);
  162. begin
  163. if EditButton.Enabled then
  164. EditButton.Click;
  165. end;
  166. end.