2
0

CompSignTools.pas 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. unit CompSignTools;
  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. private
  28. FSignTools: TStringList;
  29. procedure UpdateSignTools;
  30. procedure UpdateSignToolsButtons;
  31. procedure SetSignTools(SignTools: TStringList);
  32. function InputSignTool(var SignToolName, SignToolCommand: String;
  33. ExistingIndex: Integer): Boolean;
  34. protected
  35. procedure CreateWnd; override;
  36. procedure CreateParams(var Params: TCreateParams); override;
  37. public
  38. property SignTools: TStringList read FSignTools write SetSignTools;
  39. end;
  40. implementation
  41. uses
  42. Windows, Messages, CompFunc, CmnFunc, Dialogs, SysUtils;
  43. {$R *.DFM}
  44. procedure TSignToolsForm.UpdateSignTools;
  45. begin
  46. SignToolsListBox.Items.Assign(FSignTools);
  47. UpdateHorizontalExtent(SignToolsListBox);
  48. end;
  49. procedure TSignToolsForm.UpdateSignToolsButtons;
  50. var
  51. Enabled: Boolean;
  52. begin
  53. Enabled := SignToolsListBox.ItemIndex >= 0;
  54. EditButton.Enabled := Enabled;
  55. RemoveButton.Enabled := Enabled;
  56. end;
  57. procedure TSignToolsForm.SetSignTools(SignTools: TStringList);
  58. begin
  59. FSignTools.Assign(SignTools);
  60. UpdateSignTools;
  61. UpdateSignToolsButtons;
  62. end;
  63. procedure TSignToolsForm.FormCreate(Sender: TObject);
  64. begin
  65. FSignTools := TStringList.Create();
  66. InitFormFont(Self);
  67. end;
  68. { This and CreateParams make bsSizeable (which has an unwanted icon) look like bsDialog, see:
  69. https://stackoverflow.com/questions/32096482/delphi-resizable-bsdialog-form/32098633 }
  70. procedure TSignToolsForm.CreateWnd;
  71. begin
  72. inherited;
  73. SendMessage(Handle, WM_SETICON, ICON_BIG, 0);
  74. end;
  75. procedure TSignToolsForm.CreateParams(var Params: TCreateParams);
  76. begin
  77. inherited CreateParams(Params);
  78. Params.ExStyle := Params.ExStyle or WS_EX_DLGMODALFRAME or WS_EX_WINDOWEDGE;
  79. end;
  80. procedure TSignToolsForm.FormDestroy(Sender: TObject);
  81. begin
  82. FSignTools.Free();
  83. end;
  84. function TSignToolsForm.InputSignTool(var SignToolName, SignToolCommand: String;
  85. ExistingIndex: Integer): Boolean;
  86. var
  87. I: Integer;
  88. begin
  89. Result := False;
  90. if InputQuery(Caption, 'Name of the Sign Tool:', SignToolName) then begin
  91. if (SignToolName = '') or (Pos('=', SignToolName) <> 0) then begin
  92. AppMessageBox(PChar('Invalid name.'), PChar(Caption), MB_OK or MB_ICONSTOP);
  93. Exit;
  94. end;
  95. for I := 0 to FSignTools.Count-1 do begin
  96. if (I <> ExistingIndex) and (Pos(SignToolName + '=', FSignTools[I]) = 1) then begin
  97. AppMessageBox(PChar('Duplicate name.'), PChar(Caption), MB_OK or MB_ICONSTOP);
  98. Exit;
  99. end;
  100. end;
  101. if InputQuery(Caption, 'Command of the Sign Tool:', SignToolCommand) then begin
  102. if SignToolCommand = '' then begin
  103. AppMessageBox(PChar('Invalid command.'), PChar(Caption), MB_OK or MB_ICONSTOP);
  104. Exit;
  105. end;
  106. end;
  107. Result := True;
  108. end;
  109. end;
  110. procedure TSignToolsForm.AddButtonClick(Sender: TObject);
  111. var
  112. SignToolName, SignToolCommand: String;
  113. begin
  114. SignToolName := '';
  115. SignToolCommand := '';
  116. if InputSignTool(SignToolName, SignToolCommand, -1) then begin
  117. FSignTools.Add(SignToolName + '=' + SignToolCommand);
  118. UpdateSignTools;
  119. UpdateSignToolsButtons;
  120. end;
  121. end;
  122. procedure TSignToolsForm.EditButtonClick(Sender: TObject);
  123. var
  124. SignToolName, SignToolCommand: String;
  125. I, P: Integer;
  126. begin
  127. I := SignToolsListBox.ItemIndex;
  128. P := Pos('=', FSignTools[I]);
  129. if P = 0 then
  130. raise Exception.Create('Internal error: ''='' not found in SignTool');
  131. SignToolName := Copy(FSignTools[I], 1, P-1);
  132. SignToolCommand := Copy(FSignTools[I], P+1, MaxInt);
  133. if InputSignTool(SignToolName, SignToolCommand, I) then begin
  134. FSignTools[I] := SignToolName + '=' + SignToolCommand;
  135. UpdateSignTools;
  136. UpdateSignToolsButtons;
  137. end;
  138. end;
  139. procedure TSignToolsForm.RemoveButtonClick(Sender: TObject);
  140. var
  141. I: Integer;
  142. begin
  143. I := SignToolsListBox.ItemIndex;
  144. FSignTools.Delete(I);
  145. UpdateSignTools;
  146. UpdateSignToolsButtons;
  147. end;
  148. procedure TSignToolsForm.SignToolsListBoxClick(Sender: TObject);
  149. begin
  150. UpdateSignToolsButtons;
  151. end;
  152. end.