CompScintEdit.pas 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. unit CompScintEdit;
  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. Compiler IDE's TScintEdit
  8. }
  9. interface
  10. uses
  11. Windows, Graphics, Classes, Generics.Collections, ScintEdit, ModernColors;
  12. const
  13. { Memo marker numbers }
  14. mmIconHasEntry = 0; { grey dot }
  15. mmIconEntryProcessed = 1; { green dot }
  16. mmIconBreakpoint = 2; { stop sign }
  17. mmIconBreakpointGood = 3; { stop sign + check }
  18. mmIconBreakpointBad = 4; { stop sign + X }
  19. mmLineError = 10; { red line highlight }
  20. mmLineBreakpoint = 11; { red line highlight }
  21. mmLineBreakpointBad = 12; { ugly olive line highlight }
  22. mmLineStep = 13; { blue line highlight }
  23. { Memo indicator numbers (also in ScintStylerInnoSetup) }
  24. inSquiggly = 0;
  25. inPendingSquiggly = 1;
  26. { Just some invalid value used to indicate an unknown/uninitialized compiler FileIndex value }
  27. UnknownCompilerFileIndex = -2;
  28. type
  29. TLineState = (lnUnknown, lnHasEntry, lnEntryProcessed);
  30. PLineStateArray = ^TLineStateArray;
  31. TLineStateArray = array[0..0] of TLineState;
  32. TSaveEncoding = (seAuto, seUTF8, seUTF8NoPreamble);
  33. TCompScintEdit = class(TScintEdit)
  34. private
  35. FTheme: TTheme;
  36. FUsed: Boolean; { The IDE only shows 1 memo at a time so can't use .Visible to check if a memo is used }
  37. protected
  38. procedure CreateWnd; override;
  39. public
  40. property Theme: TTheme read FTheme write FTheme;
  41. property Used: Boolean read FUsed write FUsed;
  42. procedure UpdateThemeColorsAndStyleAttributes;
  43. end;
  44. TCompScintFileEdit = class(TCompScintEdit)
  45. private
  46. FBreakPoints: TList<Integer>;
  47. FCompilerFileIndex: Integer;
  48. FFilename: String;
  49. FFileLastWriteTime: TFileTime;
  50. FSaveEncoding: TSaveEncoding;
  51. public
  52. ErrorLine, ErrorCaretPosition: Integer;
  53. StepLine: Integer;
  54. LineState: PLineStateArray;
  55. LineStateCapacity, LineStateCount: Integer;
  56. constructor Create(AOwner: TComponent); override;
  57. destructor Destroy; override;
  58. property BreakPoints: TList<Integer> read FBreakPoints;
  59. property Filename: String read FFileName write FFilename;
  60. property CompilerFileIndex: Integer read FCompilerFileIndex write FCompilerFileIndex;
  61. property FileLastWriteTime: TFileTime read FFileLastWriteTime write FFileLastWriteTime;
  62. property SaveEncoding: TSaveEncoding read FSaveEncoding write FSaveEncoding;
  63. end;
  64. implementation
  65. uses
  66. ScintInt;
  67. { TCompScintEdit }
  68. procedure TCompScintEdit.CreateWnd;
  69. const
  70. PixmapHasEntry: array[0..8] of PAnsiChar = (
  71. '5 5 2 1',
  72. 'o c #808080',
  73. '. c #c0c0c0',
  74. 'ooooo',
  75. 'o...o',
  76. 'o...o',
  77. 'o...o',
  78. 'ooooo',
  79. nil);
  80. PixmapEntryProcessed: array[0..8] of PAnsiChar = (
  81. '5 5 2 1',
  82. 'o c #008000',
  83. '. c #00ff00',
  84. 'ooooo',
  85. 'o...o',
  86. 'o...o',
  87. 'o...o',
  88. 'ooooo',
  89. nil);
  90. PixmapBreakpoint: array[0..14] of PAnsiChar = (
  91. '9 10 3 1',
  92. '= c none',
  93. 'o c #000000',
  94. '. c #ff0000',
  95. '=========',
  96. '==ooooo==',
  97. '=o.....o=',
  98. 'o.......o',
  99. 'o.......o',
  100. 'o.......o',
  101. 'o.......o',
  102. 'o.......o',
  103. '=o.....o=',
  104. '==ooooo==',
  105. nil);
  106. PixmapBreakpointGood: array[0..15] of PAnsiChar = (
  107. '9 10 4 1',
  108. '= c none',
  109. 'o c #000000',
  110. '. c #ff0000',
  111. '* c #00ff00',
  112. '======oo=',
  113. '==oooo**o',
  114. '=o....*o=',
  115. 'o....**.o',
  116. 'o....*..o',
  117. 'o...**..o',
  118. 'o**.*...o',
  119. 'o.***...o',
  120. '=o.*...o=',
  121. '==ooooo==',
  122. nil);
  123. PixmapBreakpointBad: array[0..15] of PAnsiChar = (
  124. '9 10 4 1',
  125. '= c none',
  126. 'o c #000000',
  127. '. c #ff0000',
  128. '* c #ffff00',
  129. '=========',
  130. '==ooooo==',
  131. '=o.....o=',
  132. 'o.*...*.o',
  133. 'o.**.**.o',
  134. 'o..***..o',
  135. 'o.**.**.o',
  136. 'o.*...*.o',
  137. '=o.....o=',
  138. '==ooooo==',
  139. nil);
  140. const
  141. SC_MARK_BACKFORE = 3030; { new marker type added in Inno Setup's Scintilla build }
  142. begin
  143. inherited;
  144. Call(SCI_SETCARETWIDTH, 2, 0);
  145. Call(SCI_AUTOCSETAUTOHIDE, 0, 0);
  146. Call(SCI_AUTOCSETCANCELATSTART, 0, 0);
  147. Call(SCI_AUTOCSETDROPRESTOFWORD, 1, 0);
  148. Call(SCI_AUTOCSETIGNORECASE, 1, 0);
  149. Call(SCI_AUTOCSETMAXHEIGHT, 7, 0);
  150. Call(SCI_ASSIGNCMDKEY, Ord('Z') or ((SCMOD_SHIFT or SCMOD_CTRL) shl 16), SCI_REDO);
  151. Call(SCI_SETSCROLLWIDTH, 1024 * CallStr(SCI_TEXTWIDTH, 0, 'X'), 0);
  152. Call(SCI_INDICSETSTYLE, inSquiggly, INDIC_SQUIGGLE);
  153. Call(SCI_INDICSETFORE, inSquiggly, clRed); { May be overwritten by UpdateThemeColors }
  154. Call(SCI_INDICSETSTYLE, inPendingSquiggly, INDIC_HIDDEN);
  155. Call(SCI_SETMARGINTYPEN, 1, SC_MARGIN_SYMBOL);
  156. Call(SCI_SETMARGINWIDTHN, 1, 21);
  157. Call(SCI_SETMARGINSENSITIVEN, 1, 1);
  158. Call(SCI_SETMARGINCURSORN, 1, SC_CURSORARROW);
  159. Call(SCI_SETMARGINLEFT, 0, 2);
  160. Call(SCI_MARKERDEFINEPIXMAP, mmIconHasEntry, LPARAM(@PixmapHasEntry));
  161. Call(SCI_MARKERDEFINEPIXMAP, mmIconEntryProcessed, LPARAM(@PixmapEntryProcessed));
  162. Call(SCI_MARKERDEFINEPIXMAP, mmIconBreakpoint, LPARAM(@PixmapBreakpoint));
  163. Call(SCI_MARKERDEFINEPIXMAP, mmIconBreakpointGood, LPARAM(@PixmapBreakpointGood));
  164. Call(SCI_MARKERDEFINEPIXMAP, mmIconBreakpointBad, LPARAM(@PixmapBreakpointBad));
  165. Call(SCI_MARKERDEFINE, mmLineError, SC_MARK_BACKFORE);
  166. Call(SCI_MARKERSETFORE, mmLineError, clWhite);
  167. Call(SCI_MARKERSETBACK, mmLineError, clMaroon);
  168. Call(SCI_MARKERDEFINE, mmLineBreakpoint, SC_MARK_BACKFORE);
  169. Call(SCI_MARKERSETFORE, mmLineBreakpoint, clWhite);
  170. Call(SCI_MARKERSETBACK, mmLineBreakpoint, clRed);
  171. Call(SCI_MARKERDEFINE, mmLineBreakpointBad, SC_MARK_BACKFORE);
  172. Call(SCI_MARKERSETFORE, mmLineBreakpointBad, clLime);
  173. Call(SCI_MARKERSETBACK, mmLineBreakpointBad, clOlive);
  174. Call(SCI_MARKERDEFINE, mmLineStep, SC_MARK_BACKFORE);
  175. Call(SCI_MARKERSETFORE, mmLineStep, clWhite);
  176. Call(SCI_MARKERSETBACK, mmLineStep, clBlue);
  177. end;
  178. procedure TCompScintEdit.UpdateThemeColorsAndStyleAttributes;
  179. begin
  180. if FTheme <> nil then begin
  181. Font.Color := FTheme.Colors[tcFore];
  182. Color := FTheme.Colors[tcBack];
  183. Call(SCI_SETSELBACK, 1, FTheme.Colors[tcSelBack]);
  184. Call(SCI_INDICSETFORE, inSquiggly, FTheme.Colors[tcRed]);
  185. end;
  186. UpdateStyleAttributes;
  187. end;
  188. { TCompScintFileEdit }
  189. constructor TCompScintFileEdit.Create;
  190. begin
  191. inherited;
  192. FBreakPoints := TList<Integer>.Create;
  193. end;
  194. destructor TCompScintFileEdit.Destroy;
  195. begin
  196. FBreakPoints.Free;
  197. inherited;
  198. end;
  199. end.