glue.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572
  1. /*
  2. Copyright (c) 2014-2020 Bruce A Henderson
  3. Permission is hereby granted, free of charge, to any person obtaining a copy
  4. of this software and associated documentation files (the "Software"), to deal
  5. in the Software without restriction, including without limitation the rights
  6. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  7. copies of the Software, and to permit persons to whom the Software is
  8. furnished to do so, subject to the following conditions:
  9. The above copyright notice and this permission notice shall be included in
  10. all copies or substantial portions of the Software.
  11. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  12. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  13. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  14. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  15. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  16. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  17. THE SOFTWARE.
  18. */
  19. #include "Scintilla.h"
  20. #include "SciLexer.h"
  21. #include "blitz.h"
  22. #ifdef WIN32
  23. #define scintilla_send_message SendMessage
  24. typedef HWND SCI_HANDLE;
  25. #else
  26. #include <gtk/gtk.h>
  27. #include "ScintillaWidget.h"
  28. typedef ScintillaObject * SCI_HANDLE;
  29. #endif
  30. #define TEXTFORMAT_BOLD 1
  31. #define TEXTFORMAT_ITALIC 2
  32. #define TEXTFORMAT_UNDERLINE 4
  33. #define SCE_B_COMMENTREM 19
  34. #ifdef BMX_NG
  35. void maxgui_maxguitextareascintilla_common_TSCNotification__update(BBObject *, int, int, int);
  36. #else
  37. void _maxgui_maxguitextareascintilla_TSCNotification__update(BBObject *, int, int, int);
  38. #endif
  39. BBString * bmx_mgta_scintilla_gettext(SCI_HANDLE sci) {
  40. int len = scintilla_send_message(sci, SCI_GETLENGTH, 0, 0);
  41. char * buffer = malloc(len + 1);
  42. scintilla_send_message(sci, SCI_GETTEXT, len, (LPARAM)buffer);
  43. BBString * s = bbStringFromUTF8String(buffer);
  44. free(buffer);
  45. return s;
  46. }
  47. void bmx_mgta_scintilla_settext(SCI_HANDLE sci, BBString * text) {
  48. char * t = bbStringToUTF8String(text);
  49. scintilla_send_message(sci, SCI_SETTEXT, 0, (LPARAM)t);
  50. bbMemFree(t);
  51. }
  52. void bmx_mgta_scintilla_setfont(SCI_HANDLE sci, BBString * name, int size) {
  53. int style;
  54. char * n = bbStringToUTF8String(name);
  55. /* make sure all the styles are changed */
  56. for (style = 0; style < STYLE_MAX; style++) {
  57. scintilla_send_message(sci, SCI_STYLESETFONT, style, (LPARAM)n);
  58. scintilla_send_message(sci, SCI_STYLESETSIZE, style, size);
  59. }
  60. bbMemFree(n);
  61. }
  62. void bmx_mgta_scintilla_setlinedigits(SCI_HANDLE sci, int * digits, int show) {
  63. if (!show) {
  64. *digits = 0;
  65. scintilla_send_message(sci, SCI_SETMARGINWIDTHN, 0, 0);
  66. return;
  67. }
  68. int lines = scintilla_send_message(sci, SCI_GETLINECOUNT, 0, 0);
  69. int newDigits = (lines < 10 ? 1 : (lines < 100 ? 2 :
  70. (lines < 1000 ? 3 : (lines < 10000 ? 4 :
  71. (lines < 100000 ? 5 : (lines < 1000000 ? 6 :
  72. (lines < 10000000 ? 7 : (lines < 100000000 ? 8 :
  73. (lines < 1000000000 ? 9 : 10)))))))));
  74. if (*digits != newDigits) {
  75. *digits = newDigits;
  76. int i;
  77. int len = newDigits + 1;
  78. char * buf = malloc(len + 1);
  79. buf[0] = '_';
  80. buf[len] = 0;
  81. for (i = 1; i < len; i++) {
  82. buf[i] = '9';
  83. }
  84. /* set the linenumber margin width */
  85. int textWidth = scintilla_send_message(sci, SCI_TEXTWIDTH, STYLE_LINENUMBER, (LPARAM)buf) + 4;
  86. scintilla_send_message(sci, SCI_SETMARGINWIDTHN, 0, textWidth);
  87. free(buf);
  88. }
  89. }
  90. int bmx_mgta_scintilla_textwidth(SCI_HANDLE sci, BBString * text) {
  91. char * t = bbStringToUTF8String(text);
  92. int textWidth = scintilla_send_message(sci, SCI_TEXTWIDTH, STYLE_LINENUMBER, (LPARAM)t);
  93. bbMemFree(t);
  94. return textWidth;
  95. }
  96. int bmx_mgta_scintilla_charfrombyte(SCI_HANDLE sci, int pos, int startPos) {
  97. int i;
  98. int characterOffset = 0;
  99. int length = pos - startPos;
  100. if (length <= 0) {
  101. return 0;
  102. }
  103. struct Sci_TextRange range;
  104. range.chrg.cpMin = startPos;
  105. range.chrg.cpMax = pos;
  106. range.lpstrText = malloc(length + 1);
  107. int len = scintilla_send_message(sci, SCI_GETTEXTRANGE, 0, (LPARAM)(&range));
  108. for (i = 0; i < length; i++) {
  109. char c = range.lpstrText[i];
  110. if ((c & 0xc0) != 0x80) {
  111. characterOffset++;
  112. }
  113. }
  114. free(range.lpstrText);
  115. return characterOffset;
  116. }
  117. void bmx_mgta_scintilla_startendfromchar(SCI_HANDLE sci, int pos, int length, int * startPos, int * endPos) {
  118. // all
  119. if (length == -1) {
  120. *startPos = 0;
  121. *endPos = scintilla_send_message(sci, SCI_GETLENGTH, 0, 0);
  122. return;
  123. }
  124. int startLine = scintilla_send_message(sci, SCI_LINEFROMINDEXPOSITION, pos, SC_LINECHARACTERINDEX_UTF16);
  125. int startLinePos = scintilla_send_message(sci, SCI_INDEXPOSITIONFROMLINE, startLine, SC_LINECHARACTERINDEX_UTF16);
  126. int actualStartLinePos = scintilla_send_message(sci, SCI_POSITIONFROMLINE, startLine, 0);
  127. *startPos = scintilla_send_message(sci, SCI_POSITIONRELATIVECODEUNITS, actualStartLinePos, pos - startLinePos);
  128. if (length) {
  129. *endPos = scintilla_send_message(sci, SCI_POSITIONRELATIVECODEUNITS, *startPos, length);
  130. if (*endPos == 0) {
  131. *endPos = scintilla_send_message(sci, SCI_GETLENGTH, 0, 0);
  132. }
  133. } else {
  134. *endPos = *startPos;
  135. }
  136. }
  137. int bmx_mgta_scintilla_positionfromline(SCI_HANDLE sci, int line, int valueInBytes) {
  138. if (valueInBytes){
  139. return scintilla_send_message(sci, SCI_POSITIONFROMLINE, line, 0);
  140. } else {
  141. return scintilla_send_message(sci, SCI_INDEXPOSITIONFROMLINE, line, SC_LINECHARACTERINDEX_UTF16);
  142. }
  143. }
  144. void bmx_mgta_scintilla_setselectionstart(SCI_HANDLE sci, int pos) {
  145. scintilla_send_message(sci, SCI_SETSELECTIONSTART, pos, 0);
  146. }
  147. void bmx_mgta_scintilla_setselectionend(SCI_HANDLE sci, int pos) {
  148. scintilla_send_message(sci, SCI_SETSELECTIONEND, pos, 0);
  149. }
  150. void bmx_mgta_scintilla_scrollcaret(SCI_HANDLE sci) {
  151. scintilla_send_message(sci, SCI_SCROLLCARET, 0, 0);
  152. }
  153. void bmx_mgta_scintilla_setsel(SCI_HANDLE sci, int startPos, int endPos) {
  154. scintilla_send_message(sci, SCI_SETSEL, startPos, endPos);
  155. }
  156. void bmx_mgta_scintilla_replacesel(SCI_HANDLE sci, const char * text) {
  157. scintilla_send_message(sci, SCI_REPLACESEL, 0, (LPARAM)text);
  158. }
  159. void bmx_mgta_scintilla_stylesetback(SCI_HANDLE sci, int col) {
  160. int style;
  161. for (style = 0; style < 33; style++) {
  162. scintilla_send_message(sci, SCI_STYLESETBACK, style, col);
  163. }
  164. }
  165. void bmx_mgta_scintilla_stylesetfore(SCI_HANDLE sci, int style, int color) {
  166. scintilla_send_message(sci, SCI_STYLESETFORE, style, color);
  167. }
  168. void bmx_mgta_scintilla_stylesetitalic(SCI_HANDLE sci, int style, int value) {
  169. scintilla_send_message(sci, SCI_STYLESETITALIC, style, value);
  170. }
  171. void bmx_mgta_scintilla_stylesetbold(SCI_HANDLE sci, int style, int value) {
  172. scintilla_send_message(sci, SCI_STYLESETBOLD, style, value);
  173. }
  174. void bmx_mgta_scintilla_stylesetunderline(SCI_HANDLE sci, int style, int value) {
  175. scintilla_send_message(sci, SCI_STYLESETUNDERLINE, style, value);
  176. }
  177. void bmx_mgta_scintilla_startstyling(SCI_HANDLE sci, int startPos) {
  178. scintilla_send_message(sci, SCI_STARTSTYLING, startPos, 0x1f);
  179. }
  180. void bmx_mgta_scintilla_setstyling(SCI_HANDLE sci, int realLength, int style) {
  181. if (realLength == -1) {
  182. realLength = scintilla_send_message(sci, SCI_GETLENGTH, 0, 0);
  183. }
  184. scintilla_send_message(sci, SCI_SETSTYLING, realLength, style);
  185. }
  186. BBString * bmx_mgta_scintilla_gettextrange(SCI_HANDLE sci, int startPos, int endPos) {
  187. if (endPos == -1) {
  188. endPos = scintilla_send_message(sci, SCI_GETLENGTH, 0, 0);
  189. }
  190. struct Sci_TextRange range;
  191. range.chrg.cpMin = startPos;
  192. range.chrg.cpMax = endPos;
  193. range.lpstrText = malloc(endPos - startPos + 1);
  194. int len = scintilla_send_message(sci, SCI_GETTEXTRANGE, 0, (LPARAM)(&range));
  195. BBString * s = bbStringFromUTF8String(range.lpstrText);
  196. free(range.lpstrText);
  197. return s;
  198. }
  199. int bmx_mgta_scintilla_getlinecount(SCI_HANDLE sci) {
  200. return scintilla_send_message(sci, SCI_GETLINECOUNT, 0, 0);
  201. }
  202. int bmx_mgta_scintilla_getlength(SCI_HANDLE sci) {
  203. return scintilla_send_message(sci, SCI_GETLENGTH, 0, 0);
  204. }
  205. int bmx_mgta_scintilla_getcurrentline(SCI_HANDLE sci) {
  206. return scintilla_send_message(sci, SCI_LINEFROMPOSITION, scintilla_send_message(sci, SCI_GETSELECTIONSTART, 0, 0), 0);
  207. }
  208. int bmx_mgta_scintilla_getcurrentpos(SCI_HANDLE sci) {
  209. int line = bmx_mgta_scintilla_getcurrentline(sci);
  210. int startPos = scintilla_send_message(sci, SCI_POSITIONFROMLINE, line, 0);
  211. int endPos = scintilla_send_message(sci, SCI_GETSELECTIONSTART, 0, 0);
  212. return scintilla_send_message(sci, SCI_INDEXPOSITIONFROMLINE, line, SC_LINECHARACTERINDEX_UTF16) + scintilla_send_message(sci, SCI_COUNTCODEUNITS, startPos, endPos);
  213. }
  214. void bmx_mgta_scintilla_settabwidth(SCI_HANDLE sci, int tabs) {
  215. scintilla_send_message(sci, SCI_SETTABWIDTH, tabs, 0);
  216. }
  217. void bmx_mgta_scintilla_settargetstart(SCI_HANDLE sci, int pos) {
  218. scintilla_send_message(sci, SCI_SETTARGETSTART, pos, 0);
  219. }
  220. void bmx_mgta_scintilla_settargetend(SCI_HANDLE sci, int pos) {
  221. scintilla_send_message(sci, SCI_SETTARGETEND, pos, 0);
  222. }
  223. void bmx_mgta_scintilla_replacetarget(SCI_HANDLE sci, const char * text) {
  224. scintilla_send_message(sci, SCI_REPLACETARGET, -1, (LPARAM)text);
  225. }
  226. void bmx_mgta_scintilla_cut(SCI_HANDLE sci) {
  227. scintilla_send_message(sci, SCI_CUT, 0, 0);
  228. }
  229. void bmx_mgta_scintilla_copy(SCI_HANDLE sci) {
  230. scintilla_send_message(sci, SCI_COPY, 0, 0);
  231. }
  232. void bmx_mgta_scintilla_paste(SCI_HANDLE sci) {
  233. scintilla_send_message(sci, SCI_PASTE, 0, 0);
  234. }
  235. int bmx_mgta_scintilla_linefromposition(SCI_HANDLE sci, int pos) {
  236. return scintilla_send_message(sci, SCI_LINEFROMINDEXPOSITION, pos, SC_LINECHARACTERINDEX_UTF16);
  237. }
  238. void bmx_mgta_scintilla_appendtext(SCI_HANDLE sci, BBString * text) {
  239. char * s = bbStringToUTF8String(text);
  240. scintilla_send_message(sci, SCI_APPENDTEXT, strlen(s), (LPARAM)s);
  241. bbMemFree(s);
  242. }
  243. void bmx_mgta_scintilla_scrolltoend(SCI_HANDLE sci) {
  244. scintilla_send_message(sci, SCI_GOTOPOS, scintilla_send_message(sci, SCI_GETLENGTH, 0, 0), 0);
  245. }
  246. int bmx_mgta_scintilla_getselectionlength(SCI_HANDLE sci, int units) {
  247. if (units == 2) {
  248. /* lines */
  249. int startPos = scintilla_send_message(sci, SCI_LINEFROMPOSITION, scintilla_send_message(sci, SCI_GETSELECTIONSTART, 0, 0), 0);
  250. int endPos = scintilla_send_message(sci, SCI_LINEFROMPOSITION, scintilla_send_message(sci, SCI_GETSELECTIONEND, 0, 0) - 1, 0);
  251. return (endPos - startPos) + 1;
  252. } else {
  253. /* chars */
  254. int startPos = scintilla_send_message(sci, SCI_GETSELECTIONSTART, 0, 0);
  255. int endPos = scintilla_send_message(sci, SCI_GETSELECTIONEND, 0, 0);
  256. int length = scintilla_send_message(sci, SCI_COUNTCODEUNITS, startPos, endPos);
  257. return length;
  258. }
  259. }
  260. void bmx_mgta_scintilla_notifcation_update(BBObject * obj, struct SCNotification * notification) {
  261. #ifdef BMX_NG
  262. maxgui_maxguitextareascintilla_common_TSCNotification__update(obj, notification->nmhdr.code, notification->modificationType, notification->updated);
  263. #else
  264. _maxgui_maxguitextareascintilla_TSCNotification__update(obj, notification->nmhdr.code, notification->modificationType, notification->updated);
  265. #endif
  266. }
  267. void bmx_mgta_scintilla_setmarginleft(SCI_HANDLE sci, int leftmargin) {
  268. scintilla_send_message(sci, SCI_SETMARGINLEFT, 0, leftmargin);
  269. }
  270. void bmx_mgta_scintilla_setcaretlinevisible(SCI_HANDLE sci, int enable) {
  271. scintilla_send_message(sci, SCI_SETCARETLINEVISIBLE, enable, 0);
  272. }
  273. int bmx_mgta_scintilla_getcaretlinevisible(SCI_HANDLE sci) {
  274. return scintilla_send_message(sci, SCI_GETCARETLINEVISIBLE, 0, 0);
  275. }
  276. void bmx_mgta_scintilla_setcaretlineback(SCI_HANDLE sci, int r, int g, int b, int alpha) {
  277. scintilla_send_message(sci, SCI_SETCARETLINEBACK, r | (g << 8) | (b << 16), 0);
  278. scintilla_send_message(sci, SCI_SETCARETLINEBACKALPHA, alpha, 0);
  279. }
  280. int bmx_mgta_scintilla_getcaretlineback(SCI_HANDLE sci) {
  281. return scintilla_send_message(sci, SCI_GETCARETLINEBACK, 0, 0);
  282. }
  283. void bmx_mgta_scintilla_setcaretwidth(SCI_HANDLE sci, int width) {
  284. scintilla_send_message(sci, SCI_SETCARETWIDTH, width, 0);
  285. }
  286. void bmx_mgta_scintilla_setcaretcolor(SCI_HANDLE sci, int r, int g, int b) {
  287. scintilla_send_message(sci, SCI_SETCARETFORE, r | (g << 8) | (b << 16), 0);
  288. }
  289. void bmx_mgta_scintilla_enableundoredo(SCI_HANDLE sci, int enable) {
  290. scintilla_send_message(sci, SCI_SETUNDOCOLLECTION, enable, 0);
  291. }
  292. int bmx_mgta_scintilla_undoredoenabled(SCI_HANDLE sci) {
  293. return scintilla_send_message(sci, SCI_GETUNDOCOLLECTION, 0, 0);
  294. }
  295. void bmx_mgta_scintilla_undo(SCI_HANDLE sci) {
  296. scintilla_send_message(sci, SCI_UNDO, 0, 0);
  297. }
  298. void bmx_mgta_scintilla_redo(SCI_HANDLE sci) {
  299. scintilla_send_message(sci, SCI_REDO, 0, 0);
  300. }
  301. int bmx_mgta_scintilla_canundo(SCI_HANDLE sci) {
  302. return scintilla_send_message(sci, SCI_CANUNDO, 0, 0);
  303. }
  304. int bmx_mgta_scintilla_canredo(SCI_HANDLE sci) {
  305. return scintilla_send_message(sci, SCI_CANREDO, 0, 0);
  306. }
  307. void bmx_mgta_scintilla_clearundoredo(SCI_HANDLE sci) {
  308. scintilla_send_message(sci, SCI_EMPTYUNDOBUFFER, 0, 0);
  309. }
  310. void bmx_mgta_scintilla_sethighlightlanguage(SCI_HANDLE sci, BBString * lang) {
  311. char * t = (lang != &bbEmptyString) ? bbStringToUTF8String(lang) : 0;
  312. if (t) {
  313. scintilla_send_message(sci, SCI_SETLEXERLANGUAGE, 0, (LPARAM)t);
  314. bbMemFree(t);
  315. } else {
  316. scintilla_send_message(sci, SCI_SETLEXER, SCLEX_NULL, 0);
  317. }
  318. }
  319. void bmx_mgta_scintilla_sethighlightkeywords(SCI_HANDLE sci, int index, BBString * keywords) {
  320. char * t = (keywords != &bbEmptyString) ? bbStringToUTF8String(keywords) : 0;
  321. scintilla_send_message(sci, SCI_SETKEYWORDS, index, (LPARAM)(t != NULL ? t : ""));
  322. if (t) bbMemFree(t);
  323. }
  324. void bmx_mgta_scintilla_sethighlightstyle(SCI_HANDLE sci, int style, int flags, int color) {
  325. int lang = scintilla_send_message(sci, SCI_GETLEXER, 0, 0);
  326. if (style == 0) {
  327. scintilla_send_message(sci, SCI_STYLESETFORE, style, color);
  328. } else {
  329. switch (lang) {
  330. case 222:
  331. switch (style) {
  332. case 1:
  333. scintilla_send_message(sci, SCI_STYLESETFORE, SCE_B_COMMENT, color);
  334. scintilla_send_message(sci, SCI_STYLESETFORE, SCE_B_COMMENTREM, color);
  335. break;
  336. case 2:
  337. scintilla_send_message(sci, SCI_STYLESETFORE, SCE_B_STRING, color);
  338. break;
  339. case 3:
  340. scintilla_send_message(sci, SCI_STYLESETFORE, SCE_B_KEYWORD, color);
  341. break;
  342. case 4:
  343. scintilla_send_message(sci, SCI_STYLESETFORE, SCE_B_NUMBER, color);
  344. scintilla_send_message(sci, SCI_STYLESETFORE, SCE_B_HEXNUMBER, color);
  345. scintilla_send_message(sci, SCI_STYLESETFORE, SCE_B_BINNUMBER, color);
  346. break;
  347. }
  348. break;
  349. case SCLEX_CPP:
  350. switch (style) {
  351. case 1:
  352. scintilla_send_message(sci, SCI_STYLESETFORE, SCE_C_COMMENT, color);
  353. scintilla_send_message(sci, SCI_STYLESETFORE, SCE_C_COMMENTLINE, color);
  354. scintilla_send_message(sci, SCI_STYLESETFORE, SCE_C_COMMENTDOC, color);
  355. scintilla_send_message(sci, SCI_STYLESETFORE, SCE_C_COMMENTLINEDOC, color);
  356. scintilla_send_message(sci, SCI_STYLESETFORE, SCE_C_PREPROCESSORCOMMENT, color);
  357. break;
  358. case 2:
  359. scintilla_send_message(sci, SCI_STYLESETFORE, SCE_C_STRING, color);
  360. scintilla_send_message(sci, SCI_STYLESETFORE, SCE_C_CHARACTER, color);
  361. scintilla_send_message(sci, SCI_STYLESETFORE, SCE_C_PREPROCESSOR, color);
  362. break;
  363. case 3:
  364. scintilla_send_message(sci, SCI_STYLESETFORE, SCE_C_WORD, color);
  365. break;
  366. case 4:
  367. scintilla_send_message(sci, SCI_STYLESETFORE, SCE_C_NUMBER, color);
  368. break;
  369. }
  370. break;
  371. case SCLEX_HTML:
  372. break;
  373. case SCLEX_XML:
  374. break;
  375. case SCLEX_LUA:
  376. switch (style) {
  377. case 1:
  378. scintilla_send_message(sci, SCI_STYLESETFORE, SCE_LUA_COMMENT, color);
  379. scintilla_send_message(sci, SCI_STYLESETFORE, SCE_LUA_COMMENTLINE, color);
  380. scintilla_send_message(sci, SCI_STYLESETFORE, SCE_LUA_COMMENTDOC, color);
  381. break;
  382. case 2:
  383. scintilla_send_message(sci, SCI_STYLESETFORE, SCE_LUA_STRING, color);
  384. scintilla_send_message(sci, SCI_STYLESETFORE, SCE_LUA_CHARACTER, color);
  385. scintilla_send_message(sci, SCI_STYLESETFORE, SCE_LUA_LITERALSTRING, color);
  386. break;
  387. case 3:
  388. scintilla_send_message(sci, SCI_STYLESETFORE, SCE_LUA_WORD, color);
  389. break;
  390. case 4:
  391. scintilla_send_message(sci, SCI_STYLESETFORE, SCE_LUA_NUMBER, color);
  392. scintilla_send_message(sci, SCI_STYLESETFORE, SCE_B_HEXNUMBER, color);
  393. break;
  394. }
  395. break;
  396. }
  397. }
  398. if (flags & TEXTFORMAT_BOLD) {
  399. scintilla_send_message(sci, SCI_STYLESETBOLD, style, 1);
  400. }
  401. if (flags & TEXTFORMAT_ITALIC) {
  402. scintilla_send_message(sci, SCI_STYLESETITALIC, style, 1);
  403. }
  404. if (flags & TEXTFORMAT_UNDERLINE) {
  405. scintilla_send_message(sci, SCI_STYLESETUNDERLINE, style, 1);
  406. }
  407. }
  408. void bmx_mgta_scintilla_highlight(SCI_HANDLE sci) {
  409. scintilla_send_message(sci, SCI_COLOURISE, 0, -1);
  410. }
  411. void bmx_mgta_scintilla_clearhighlightstyles(SCI_HANDLE sci, int backcolor, int forecolor) {
  412. scintilla_send_message(sci, SCI_STYLERESETDEFAULT, 0, 0);
  413. scintilla_send_message(sci, SCI_STYLESETBACK, STYLE_DEFAULT, backcolor);
  414. scintilla_send_message(sci, SCI_STYLESETFORE, STYLE_DEFAULT, forecolor);
  415. scintilla_send_message(sci, SCI_STYLECLEARALL, 0, 0);
  416. }
  417. void bmx_mgta_scintilla_setlinenumberbackcolor(SCI_HANDLE sci, int color) {
  418. scintilla_send_message(sci, SCI_STYLESETBACK, STYLE_LINENUMBER, color);
  419. }
  420. void bmx_mgta_scintilla_setlinenumberforecolor(SCI_HANDLE sci, int color) {
  421. scintilla_send_message(sci, SCI_STYLESETFORE, STYLE_LINENUMBER, color);
  422. }
  423. void bmx_mgta_scintilla_beginundoaction(SCI_HANDLE sci) {
  424. scintilla_send_message(sci, SCI_BEGINUNDOACTION, 0, 0);
  425. }
  426. void bmx_mgta_scintilla_endundoaction(SCI_HANDLE sci) {
  427. scintilla_send_message(sci, SCI_ENDUNDOACTION, 0, 0);
  428. }
  429. void bmx_mgta_scintilla_setbracketmatchingcolor(SCI_HANDLE sci, int r, int g, int b, int flags) {
  430. scintilla_send_message(sci, SCI_STYLESETFORE, STYLE_BRACELIGHT, r | (g << 8) | (b << 16));
  431. scintilla_send_message(sci, SCI_STYLESETBOLD, STYLE_BRACELIGHT, 0);
  432. scintilla_send_message(sci, SCI_STYLESETITALIC, STYLE_BRACELIGHT, 0);
  433. scintilla_send_message(sci, SCI_STYLESETUNDERLINE, STYLE_BRACELIGHT, 0);
  434. if (flags & TEXTFORMAT_BOLD) {
  435. scintilla_send_message(sci, SCI_STYLESETBOLD, STYLE_BRACELIGHT, 1);
  436. }
  437. if (flags & TEXTFORMAT_ITALIC) {
  438. scintilla_send_message(sci, SCI_STYLESETITALIC, STYLE_BRACELIGHT, 1);
  439. }
  440. if (flags & TEXTFORMAT_UNDERLINE) {
  441. scintilla_send_message(sci, SCI_STYLESETUNDERLINE, STYLE_BRACELIGHT, 1);
  442. }
  443. }
  444. void bmx_mgta_scintilla_matchbrackets(SCI_HANDLE sci) {
  445. int pos = scintilla_send_message(sci, SCI_GETCURRENTPOS, 0, 0);
  446. int endPos = scintilla_send_message(sci, SCI_BRACEMATCH, pos, 0);
  447. if (endPos != -1) {
  448. scintilla_send_message(sci, SCI_BRACEHIGHLIGHT, pos, endPos);
  449. } else {
  450. scintilla_send_message(sci, SCI_BRACEBADLIGHT, -1, 0);
  451. }
  452. }
  453. void bmx_mgta_scintilla_resetscrollwidth(SCI_HANDLE sci) {
  454. scintilla_send_message(sci, SCI_SETSCROLLWIDTH, 1 , 0);
  455. }