CompScintEdit.pas 6.3 KB

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