]> git.saurik.com Git - wxWidgets.git/blob - src/stc/gen_iface.py
bde1a8447d3e5971a8ac448d446f05ba4f8bbf19
[wxWidgets.git] / src / stc / gen_iface.py
1 #!/usr/bin/env python
2 #----------------------------------------------------------------------------
3 # Name: gen_iface.py
4 # Purpose: Generate stc.h and stc.cpp from the info in Scintilla.iface
5 #
6 # Author: Robin Dunn
7 #
8 # Created: 5-Sept-2000
9 # RCS-ID: $Id$
10 # Copyright: (c) 2000 by Total Control Software
11 # Licence: wxWindows license
12 #----------------------------------------------------------------------------
13
14
15 import sys, string, re, os
16 from fileinput import FileInput
17
18
19 IFACE = os.path.abspath('./scintilla/include/Scintilla.iface')
20 H_TEMPLATE = os.path.abspath('./stc.h.in')
21 CPP_TEMPLATE = os.path.abspath('./stc.cpp.in')
22 H_DEST = os.path.abspath('../../include/wx/stc/stc.h')
23 CPP_DEST = os.path.abspath('./stc.cpp')
24 DOCSTR_DEST = os.path.abspath('../../../wxPython/contrib/stc/_stc_gendocs.i')
25
26
27 # Value prefixes to convert
28 valPrefixes = [('SCI_', ''),
29 ('SC_', ''),
30 ('SCN_', None), # just toss these out...
31 ('SCEN_', None),
32 ('SCE_', ''),
33 ('SCLEX_', 'LEX_'),
34 ('SCK_', 'KEY_'),
35 ('SCFIND_', 'FIND_'),
36 ('SCWS_', 'WS_'),
37 ]
38
39 # Message function values that should have a CMD_ constant generated
40 cmdValues = [ 2011,
41 2013,
42 (2176, 2180),
43 (2300, 2349),
44 (2390, 2393),
45 (2395, 2396),
46 2404,
47 (2413, 2416),
48 (2426, 2442),
49 (2450, 2455),
50 2518,
51 ]
52
53
54 # Should a funciton be also generated for the CMDs?
55 FUNC_FOR_CMD = True
56
57
58 # Map some generic typenames to wx types, using return value syntax
59 retTypeMap = {
60 'position': 'int',
61 'string': 'wxString',
62 'colour': 'wxColour',
63 }
64
65 # Map some generic typenames to wx types, using parameter syntax
66 paramTypeMap = {
67 'position': 'int',
68 'string': 'const wxString&',
69 'colour': 'const wxColour&',
70 'keymod': 'int',
71 }
72
73 # Map of method info that needs tweaked. Either the name needs changed, or
74 # the method definition/implementation. Tuple items are:
75 #
76 # 1. New method name. None to skip the method, 0 to leave the
77 # default name.
78 # 2. Method definition for the .h file, 0 to leave alone
79 # 3. Method implementation for the .cpp file, 0 to leave alone.
80 # 4. tuple of Doc string lines, or 0 to leave alone.
81 #
82 methodOverrideMap = {
83 'AddText' : (0,
84 'void %s(const wxString& text);',
85
86 '''void %s(const wxString& text) {
87 wxWX2MBbuf buf = (wxWX2MBbuf)wx2stc(text);
88 SendMsg(%s, strlen(buf), (long)(const char*)buf);''',
89 0),
90
91 'AddStyledText' : (0,
92 'void %s(const wxMemoryBuffer& data);',
93
94 '''void %s(const wxMemoryBuffer& data) {
95 SendMsg(%s, data.GetDataLen(), (long)data.GetData());''',
96 0),
97
98 'AppendText' : (0,
99 'void %s(const wxString& text);',
100
101 '''void %s(const wxString& text) {
102 wxWX2MBbuf buf = (wxWX2MBbuf)wx2stc(text);
103 SendMsg(%s, strlen(buf), (long)(const char*)buf);''',
104 0),
105
106 'GetViewWS' : ( 'GetViewWhiteSpace', 0, 0, 0),
107 'SetViewWS' : ( 'SetViewWhiteSpace', 0, 0, 0),
108
109 'GetCharAt' :
110 ( 0, 0,
111 '''int %s(int pos) const {
112 return (unsigned char)SendMsg(%s, pos, 0);''',
113 0),
114
115 'GetStyleAt' :
116 ( 0, 0,
117 '''int %s(int pos) const {
118 return (unsigned char)SendMsg(%s, pos, 0);''',
119 0),
120
121 'GetStyledText' :
122 (0,
123 'wxMemoryBuffer %s(int startPos, int endPos);',
124
125 '''wxMemoryBuffer %s(int startPos, int endPos) {
126 wxMemoryBuffer buf;
127 if (endPos < startPos) {
128 int temp = startPos;
129 startPos = endPos;
130 endPos = temp;
131 }
132 int len = endPos - startPos;
133 if (!len) return buf;
134 TextRange tr;
135 tr.lpstrText = (char*)buf.GetWriteBuf(len*2+1);
136 tr.chrg.cpMin = startPos;
137 tr.chrg.cpMax = endPos;
138 len = SendMsg(%s, 0, (long)&tr);
139 buf.UngetWriteBuf(len);
140 return buf;''',
141
142 ('Retrieve a buffer of cells.',)),
143
144
145 'PositionFromPoint' :
146 (0,
147 'int %s(wxPoint pt);',
148
149 '''int %s(wxPoint pt) {
150 return SendMsg(%s, pt.x, pt.y);''',
151 0),
152
153 'GetCurLine' :
154 (0,
155 '#ifdef SWIG\n wxString %s(int* OUTPUT);\n#else\n wxString GetCurLine(int* linePos=NULL);\n#endif',
156
157 '''wxString %s(int* linePos) {
158 int len = LineLength(GetCurrentLine());
159 if (!len) {
160 if (linePos) *linePos = 0;
161 return wxEmptyString;
162 }
163
164 wxMemoryBuffer mbuf(len+1);
165 char* buf = (char*)mbuf.GetWriteBuf(len+1);
166
167 int pos = SendMsg(%s, len+1, (long)buf);
168 mbuf.UngetWriteBuf(len);
169 mbuf.AppendByte(0);
170 if (linePos) *linePos = pos;
171 return stc2wx(buf);''',
172
173 0),
174
175 'SetUsePalette' : (None, 0,0,0),
176
177 'MarkerSetFore' : ('MarkerSetForeground', 0, 0, 0),
178 'MarkerSetBack' : ('MarkerSetBackground', 0, 0, 0),
179
180 'MarkerDefine' :
181 (0,
182 '''void %s(int markerNumber, int markerSymbol,
183 const wxColour& foreground = wxNullColour,
184 const wxColour& background = wxNullColour);''',
185
186 '''void %s(int markerNumber, int markerSymbol,
187 const wxColour& foreground,
188 const wxColour& background) {
189
190 SendMsg(%s, markerNumber, markerSymbol);
191 if (foreground.Ok())
192 MarkerSetForeground(markerNumber, foreground);
193 if (background.Ok())
194 MarkerSetBackground(markerNumber, background);''',
195
196 ('Set the symbol used for a particular marker number,',
197 'and optionally the fore and background colours.')),
198
199
200 'MarkerDefinePixmap' :
201 ('MarkerDefineBitmap',
202 '''void %s(int markerNumber, const wxBitmap& bmp);''',
203 '''void %s(int markerNumber, const wxBitmap& bmp) {
204 // convert bmp to a xpm in a string
205 wxMemoryOutputStream strm;
206 wxImage img = bmp.ConvertToImage();
207 if (img.HasAlpha())
208 img.ConvertAlphaToMask();
209 img.SaveFile(strm, wxBITMAP_TYPE_XPM);
210 size_t len = strm.GetSize();
211 char* buff = new char[len+1];
212 strm.CopyTo(buff, len);
213 buff[len] = 0;
214 SendMsg(%s, markerNumber, (long)buff);
215 delete [] buff;
216 ''',
217 ('Define a marker from a bitmap',)),
218
219
220 'SetMarginTypeN' : ('SetMarginType', 0, 0, 0),
221 'GetMarginTypeN' : ('GetMarginType', 0, 0, 0),
222 'SetMarginWidthN' : ('SetMarginWidth', 0, 0, 0),
223 'GetMarginWidthN' : ('GetMarginWidth', 0, 0, 0),
224 'SetMarginMaskN' : ('SetMarginMask', 0, 0, 0),
225 'GetMarginMaskN' : ('GetMarginMask', 0, 0, 0),
226 'SetMarginSensitiveN' : ('SetMarginSensitive', 0, 0, 0),
227 'GetMarginSensitiveN' : ('GetMarginSensitive', 0, 0, 0),
228
229
230 'StyleGetFore' : ('StyleGetForeground', 0, 0, 0),
231 'StyleGetBack' : ('StyleGetBackground', 0, 0, 0),
232 'StyleSetFore' : ('StyleSetForeground', 0, 0, 0),
233 'StyleSetBack' : ('StyleSetBackground', 0, 0, 0),
234 'SetSelFore' : ('SetSelForeground', 0, 0, 0),
235 'SetSelBack' : ('SetSelBackground', 0, 0, 0),
236 'SetCaretFore' : ('SetCaretForeground', 0, 0, 0),
237 'StyleGetFont' :
238 ('StyleGetFaceName',
239 'wxString %s(int style);',
240 '''wxString %s(int style) {
241 long msg = %s;
242 long len = SendMsg(msg, style, 0);
243 wxMemoryBuffer mbuf(len+1);
244 char* buf = (char*)mbuf.GetWriteBuf(len+1);
245 SendMsg(msg, style, (long)buf);
246 mbuf.UngetWriteBuf(len);
247 mbuf.AppendByte(0);
248 return stc2wx(buf);''',
249 ('Get the font facename of a style',)),
250 'StyleSetFont' : ('StyleSetFaceName', 0, 0, 0),
251 'StyleSetCharacterSet' : (None, 0, 0, 0),
252
253 'AssignCmdKey' :
254 ('CmdKeyAssign',
255 'void %s(int key, int modifiers, int cmd);',
256
257 '''void %s(int key, int modifiers, int cmd) {
258 SendMsg(%s, MAKELONG(key, modifiers), cmd);''',
259 0),
260
261
262 'ClearCmdKey' :
263 ('CmdKeyClear',
264 'void %s(int key, int modifiers);',
265
266 '''void %s(int key, int modifiers) {
267 SendMsg(%s, MAKELONG(key, modifiers));''',
268 0),
269
270 'ClearAllCmdKeys' : ('CmdKeyClearAll', 0, 0, 0),
271
272
273 'SetStylingEx' :
274 ('SetStyleBytes',
275 'void %s(int length, char* styleBytes);',
276
277 '''void %s(int length, char* styleBytes) {
278 SendMsg(%s, length, (long)styleBytes);''',
279 0),
280
281
282 'IndicSetStyle' : ('IndicatorSetStyle', 0, 0, 0),
283 'IndicGetStyle' : ('IndicatorGetStyle', 0, 0, 0),
284 'IndicSetFore' : ('IndicatorSetForeground', 0, 0, 0),
285 'IndicGetFore' : ('IndicatorGetForeground', 0, 0, 0),
286 'IndicSetUnder': ('IndicatorSetUnder', 0, 0, 0),
287 'IndicGetUnder': ('IndicatorGetUnder', 0, 0, 0),
288
289 'SetWhitespaceFore' : ('SetWhitespaceForeground', 0, 0, 0),
290 'SetWhitespaceBack' : ('SetWhitespaceBackground', 0, 0, 0),
291
292 'AutoCShow' : ('AutoCompShow', 0, 0, 0),
293 'AutoCCancel' : ('AutoCompCancel', 0, 0, 0),
294 'AutoCActive' : ('AutoCompActive', 0, 0, 0),
295 'AutoCPosStart' : ('AutoCompPosStart', 0, 0, 0),
296 'AutoCComplete' : ('AutoCompComplete', 0, 0, 0),
297 'AutoCStops' : ('AutoCompStops', 0, 0, 0),
298 'AutoCSetSeparator' : ('AutoCompSetSeparator', 0, 0, 0),
299 'AutoCGetSeparator' : ('AutoCompGetSeparator', 0, 0, 0),
300 'AutoCSelect' : ('AutoCompSelect', 0, 0, 0),
301 'AutoCSetCancelAtStart' : ('AutoCompSetCancelAtStart', 0, 0, 0),
302 'AutoCGetCancelAtStart' : ('AutoCompGetCancelAtStart', 0, 0, 0),
303 'AutoCSetFillUps' : ('AutoCompSetFillUps', 0, 0, 0),
304 'AutoCSetChooseSingle' : ('AutoCompSetChooseSingle', 0, 0, 0),
305 'AutoCGetChooseSingle' : ('AutoCompGetChooseSingle', 0, 0, 0),
306 'AutoCSetIgnoreCase' : ('AutoCompSetIgnoreCase', 0, 0, 0),
307 'AutoCGetIgnoreCase' : ('AutoCompGetIgnoreCase', 0, 0, 0),
308 'AutoCSetAutoHide' : ('AutoCompSetAutoHide', 0, 0, 0),
309 'AutoCGetAutoHide' : ('AutoCompGetAutoHide', 0, 0, 0),
310 'AutoCSetDropRestOfWord' : ('AutoCompSetDropRestOfWord', 0,0,0),
311 'AutoCGetDropRestOfWord' : ('AutoCompGetDropRestOfWord', 0,0,0),
312 'AutoCGetTypeSeparator' : ('AutoCompGetTypeSeparator', 0, 0, 0),
313 'AutoCSetTypeSeparator' : ('AutoCompSetTypeSeparator', 0, 0, 0),
314 'AutoCGetCurrent' : ('AutoCompGetCurrent', 0, 0, 0),
315 'AutoCSetMaxWidth' : ('AutoCompSetMaxWidth', 0, 0, 0),
316 'AutoCGetMaxWidth' : ('AutoCompGetMaxWidth', 0, 0, 0),
317 'AutoCSetMaxHeight' : ('AutoCompSetMaxHeight', 0, 0, 0),
318 'AutoCGetMaxHeight' : ('AutoCompGetMaxHeight', 0, 0, 0),
319 'AutoCGetMaxHeight' : ('AutoCompGetMaxHeight', 0, 0, 0),
320
321 'RegisterImage' :
322 (0,
323 '''void %s(int type, const wxBitmap& bmp);''',
324 '''void %s(int type, const wxBitmap& bmp) {
325 // convert bmp to a xpm in a string
326 wxMemoryOutputStream strm;
327 wxImage img = bmp.ConvertToImage();
328 if (img.HasAlpha())
329 img.ConvertAlphaToMask();
330 img.SaveFile(strm, wxBITMAP_TYPE_XPM);
331 size_t len = strm.GetSize();
332 char* buff = new char[len+1];
333 strm.CopyTo(buff, len);
334 buff[len] = 0;
335 SendMsg(%s, type, (long)buff);
336 delete [] buff;
337 ''',
338 ('Register an image for use in autocompletion lists.',)),
339
340
341 'ClearRegisteredImages' : (0, 0, 0,
342 ('Clear all the registered images.',)),
343
344
345 'SetHScrollBar' : ('SetUseHorizontalScrollBar', 0, 0, 0),
346 'GetHScrollBar' : ('GetUseHorizontalScrollBar', 0, 0, 0),
347
348 'SetVScrollBar' : ('SetUseVerticalScrollBar', 0, 0, 0),
349 'GetVScrollBar' : ('GetUseVerticalScrollBar', 0, 0, 0),
350
351 'GetCaretFore' : ('GetCaretForeground', 0, 0, 0),
352
353 'GetUsePalette' : (None, 0, 0, 0),
354
355 'FindText' :
356 (0,
357 '''int %s(int minPos, int maxPos, const wxString& text, int flags=0);''',
358
359 '''int %s(int minPos, int maxPos,
360 const wxString& text,
361 int flags) {
362 TextToFind ft;
363 ft.chrg.cpMin = minPos;
364 ft.chrg.cpMax = maxPos;
365 wxWX2MBbuf buf = (wxWX2MBbuf)wx2stc(text);
366 ft.lpstrText = (char*)(const char*)buf;
367
368 return SendMsg(%s, flags, (long)&ft);''',
369 0),
370
371 'FormatRange' :
372 (0,
373 '''int %s(bool doDraw,
374 int startPos,
375 int endPos,
376 wxDC* draw,
377 wxDC* target,
378 wxRect renderRect,
379 wxRect pageRect);''',
380 ''' int %s(bool doDraw,
381 int startPos,
382 int endPos,
383 wxDC* draw,
384 wxDC* target,
385 wxRect renderRect,
386 wxRect pageRect) {
387 RangeToFormat fr;
388
389 if (endPos < startPos) {
390 int temp = startPos;
391 startPos = endPos;
392 endPos = temp;
393 }
394 fr.hdc = draw;
395 fr.hdcTarget = target;
396 fr.rc.top = renderRect.GetTop();
397 fr.rc.left = renderRect.GetLeft();
398 fr.rc.right = renderRect.GetRight();
399 fr.rc.bottom = renderRect.GetBottom();
400 fr.rcPage.top = pageRect.GetTop();
401 fr.rcPage.left = pageRect.GetLeft();
402 fr.rcPage.right = pageRect.GetRight();
403 fr.rcPage.bottom = pageRect.GetBottom();
404 fr.chrg.cpMin = startPos;
405 fr.chrg.cpMax = endPos;
406
407 return SendMsg(%s, doDraw, (long)&fr);''',
408 0),
409
410
411 'GetLine' :
412 (0,
413 'wxString %s(int line);',
414
415 '''wxString %s(int line) {
416 int len = LineLength(line);
417 if (!len) return wxEmptyString;
418
419 wxMemoryBuffer mbuf(len+1);
420 char* buf = (char*)mbuf.GetWriteBuf(len+1);
421 SendMsg(%s, line, (long)buf);
422 mbuf.UngetWriteBuf(len);
423 mbuf.AppendByte(0);
424 return stc2wx(buf);''',
425
426 ('Retrieve the contents of a line.',)),
427
428 'SetSel' : ('SetSelection', 0, 0, 0),
429
430 'GetSelText' :
431 ('GetSelectedText',
432 'wxString %s();',
433
434 '''wxString %s() {
435 int start;
436 int end;
437
438 GetSelection(&start, &end);
439 int len = end - start;
440 if (!len) return wxEmptyString;
441
442 wxMemoryBuffer mbuf(len+2);
443 char* buf = (char*)mbuf.GetWriteBuf(len+1);
444 SendMsg(%s, 0, (long)buf);
445 mbuf.UngetWriteBuf(len);
446 mbuf.AppendByte(0);
447 return stc2wx(buf);''',
448
449 ('Retrieve the selected text.',)),
450
451
452 'GetTextRange' :
453 (0,
454 'wxString %s(int startPos, int endPos);',
455
456 '''wxString %s(int startPos, int endPos) {
457 if (endPos < startPos) {
458 int temp = startPos;
459 startPos = endPos;
460 endPos = temp;
461 }
462 int len = endPos - startPos;
463 if (!len) return wxEmptyString;
464 wxMemoryBuffer mbuf(len+1);
465 char* buf = (char*)mbuf.GetWriteBuf(len);
466 TextRange tr;
467 tr.lpstrText = buf;
468 tr.chrg.cpMin = startPos;
469 tr.chrg.cpMax = endPos;
470 SendMsg(%s, 0, (long)&tr);
471 mbuf.UngetWriteBuf(len);
472 mbuf.AppendByte(0);
473 return stc2wx(buf);''',
474
475 ('Retrieve a range of text.',)),
476
477 'PointXFromPosition' : (None, 0, 0, 0),
478 'PointYFromPosition' : (None, 0, 0, 0),
479
480 'ScrollCaret' : ('EnsureCaretVisible', 0, 0, 0),
481 'ReplaceSel' : ('ReplaceSelection', 0, 0, 0),
482 'Null' : (None, 0, 0, 0),
483
484 'GetText' :
485 (0,
486 'wxString %s();',
487
488 '''wxString %s() {
489 int len = GetTextLength();
490 wxMemoryBuffer mbuf(len+1); // leave room for the null...
491 char* buf = (char*)mbuf.GetWriteBuf(len+1);
492 SendMsg(%s, len+1, (long)buf);
493 mbuf.UngetWriteBuf(len);
494 mbuf.AppendByte(0);
495 return stc2wx(buf);''',
496
497 ('Retrieve all the text in the document.', )),
498
499 'GetDirectFunction' : (None, 0, 0, 0),
500 'GetDirectPointer' : (None, 0, 0, 0),
501
502 'CallTipPosStart' : ('CallTipPosAtStart', 0, 0, 0),
503 'CallTipSetHlt' : ('CallTipSetHighlight', 0, 0, 0),
504 'CallTipSetBack' : ('CallTipSetBackground', 0, 0, 0),
505 'CallTipSetFore' : ('CallTipSetForeground', 0, 0, 0),
506 'CallTipSetForeHlt' : ('CallTipSetForegroundHighlight', 0, 0, 0),
507
508 'SetHotspotActiveFore' : ('SetHotspotActiveForeground', 0, 0, 0),
509 'SetHotspotActiveBack' : ('SetHotspotActiveBackground', 0, 0, 0),
510 'GetHotspotActiveFore' : ('GetHotspotActiveForeground', 0, 0, 0),
511 'GetHotspotActiveBack' : ('GetHotspotActiveBackground', 0, 0, 0),
512
513 'GetCaretLineBack' : ('GetCaretLineBackground', 0, 0, 0),
514 'SetCaretLineBack' : ('SetCaretLineBackground', 0, 0, 0),
515
516 'ReplaceTarget' :
517 (0,
518 'int %s(const wxString& text);',
519
520 '''
521 int %s(const wxString& text) {
522 wxWX2MBbuf buf = (wxWX2MBbuf)wx2stc(text);
523 return SendMsg(%s, strlen(buf), (long)(const char*)buf);''',
524 0),
525
526 'ReplaceTargetRE' :
527 (0,
528 'int %s(const wxString& text);',
529
530 '''
531 int %s(const wxString& text) {
532 wxWX2MBbuf buf = (wxWX2MBbuf)wx2stc(text);
533 return SendMsg(%s, strlen(buf), (long)(const char*)buf);''',
534 0),
535
536 'SearchInTarget' :
537 (0,
538 'int %s(const wxString& text);',
539
540 '''
541 int %s(const wxString& text) {
542 wxWX2MBbuf buf = (wxWX2MBbuf)wx2stc(text);
543 return SendMsg(%s, strlen(buf), (long)(const char*)buf);''',
544 0),
545
546 # not sure what to do about these yet
547 'TargetAsUTF8' : ( None, 0, 0, 0),
548 'SetLengthForEncode' : ( None, 0, 0, 0),
549 'EncodedFromUTF8' : ( None, 0, 0, 0),
550
551
552 'GetProperty' :
553 (0,
554 'wxString %s(const wxString& key);',
555
556 '''wxString %s(const wxString& key) {
557 int len = SendMsg(SCI_GETPROPERTY, (long)(const char*)wx2stc(key), 0);
558 if (!len) return wxEmptyString;
559
560 wxMemoryBuffer mbuf(len+1);
561 char* buf = (char*)mbuf.GetWriteBuf(len+1);
562 SendMsg(%s, (long)(const char*)wx2stc(key), (long)buf);
563 mbuf.UngetWriteBuf(len);
564 mbuf.AppendByte(0);
565 return stc2wx(buf);''',
566 ("Retrieve a 'property' value previously set with SetProperty.",)),
567
568 'GetPropertyExpanded' :
569 (0,
570 'wxString %s(const wxString& key);',
571
572 '''wxString %s(const wxString& key) {
573 int len = SendMsg(SCI_GETPROPERTYEXPANDED, (long)(const char*)wx2stc(key), 0);
574 if (!len) return wxEmptyString;
575
576 wxMemoryBuffer mbuf(len+1);
577 char* buf = (char*)mbuf.GetWriteBuf(len+1);
578 SendMsg(%s, (long)(const char*)wx2stc(key), (long)buf);
579 mbuf.UngetWriteBuf(len);
580 mbuf.AppendByte(0);
581 return stc2wx(buf);''',
582 ("Retrieve a 'property' value previously set with SetProperty,",
583 "with '$()' variable replacement on returned buffer.")),
584
585 'GetPropertyInt' : (0, 0, 0,
586 ("Retrieve a 'property' value previously set with SetProperty,",
587 "interpreted as an int AFTER any '$()' variable replacement.")),
588
589
590 'GetDocPointer' :
591 (0,
592 'void* %s();',
593 '''void* %s() {
594 return (void*)SendMsg(%s);''',
595 0),
596
597 'SetDocPointer' :
598 (0,
599 'void %s(void* docPointer);',
600 '''void %s(void* docPointer) {
601 SendMsg(%s, 0, (long)docPointer);''',
602 0),
603
604 'CreateDocument' :
605 (0,
606 'void* %s();',
607 '''void* %s() {
608 return (void*)SendMsg(%s);''',
609 0),
610
611 'AddRefDocument' :
612 (0,
613 'void %s(void* docPointer);',
614 '''void %s(void* docPointer) {
615 SendMsg(%s, 0, (long)docPointer);''',
616 0),
617
618 'ReleaseDocument' :
619 (0,
620 'void %s(void* docPointer);',
621 '''void %s(void* docPointer) {
622 SendMsg(%s, 0, (long)docPointer);''',
623 0),
624
625 'SetCodePage' :
626 (0,
627 0,
628 '''void %s(int codePage) {
629 #if wxUSE_UNICODE
630 wxASSERT_MSG(codePage == wxSTC_CP_UTF8,
631 wxT("Only wxSTC_CP_UTF8 may be used when wxUSE_UNICODE is on."));
632 #else
633 wxASSERT_MSG(codePage != wxSTC_CP_UTF8,
634 wxT("wxSTC_CP_UTF8 may not be used when wxUSE_UNICODE is off."));
635 #endif
636 SendMsg(%s, codePage);''',
637 ("Set the code page used to interpret the bytes of the document as characters.",) ),
638
639
640 'GrabFocus' : (None, 0, 0, 0),
641
642 # Rename some that would otherwise hide the wxWindow methods
643 'SetFocus' : ('SetSTCFocus', 0, 0, 0),
644 'GetFocus' : ('GetSTCFocus', 0, 0, 0),
645 'SetCursor' : ('SetSTCCursor', 0, 0, 0),
646 'GetCursor' : ('GetSTCCursor', 0, 0, 0),
647
648 'LoadLexerLibrary' : (None, 0,0,0),
649
650 'SetPositionCache' : ('SetPositionCacheSize', 0, 0, 0),
651 'GetPositionCache' : ('GetPositionCacheSize', 0, 0, 0),
652
653
654 '' : ('', 0, 0, 0),
655
656 }
657
658 #----------------------------------------------------------------------------
659
660 def processIface(iface, h_tmplt, cpp_tmplt, h_dest, cpp_dest, docstr_dest):
661 curDocStrings = []
662 values = []
663 methods = []
664 cmds = []
665
666 # parse iface file
667 fi = FileInput(iface)
668 for line in fi:
669 line = line[:-1]
670 if line[:2] == '##' or line == '':
671 #curDocStrings = []
672 continue
673
674 op = line[:4]
675 if line[:2] == '# ': # a doc string
676 curDocStrings.append(line[2:])
677
678 elif op == 'val ':
679 parseVal(line[4:], values, curDocStrings)
680 curDocStrings = []
681
682 elif op == 'fun ' or op == 'set ' or op == 'get ':
683 parseFun(line[4:], methods, curDocStrings, cmds, op == 'get ')
684 curDocStrings = []
685
686 elif op == 'cat ':
687 if string.strip(line[4:]) == 'Deprecated':
688 break # skip the rest of the file
689
690 elif op == 'evt ':
691 pass
692
693 elif op == 'enu ':
694 pass
695
696 elif op == 'lex ':
697 pass
698
699 else:
700 print '***** Unknown line type: ', line
701
702
703 # process templates
704 data = {}
705 data['VALUES'] = processVals(values)
706 data['CMDS'] = processVals(cmds)
707 defs, imps, docstrings = processMethods(methods)
708 data['METHOD_DEFS'] = defs
709 data['METHOD_IMPS'] = imps
710
711 # get template text
712 h_text = open(h_tmplt).read()
713 cpp_text = open(cpp_tmplt).read()
714
715 # do the substitutions
716 h_text = h_text % data
717 cpp_text = cpp_text % data
718
719 # write out destination files
720 open(h_dest, 'w').write(h_text)
721 open(cpp_dest, 'w').write(cpp_text)
722 open(docstr_dest, 'w').write(docstrings)
723
724
725
726 #----------------------------------------------------------------------------
727
728 def processVals(values):
729 text = []
730 for name, value, docs in values:
731 if docs:
732 text.append('')
733 for x in docs:
734 text.append('// ' + x)
735 text.append('#define %s %s' % (name, value))
736 return string.join(text, '\n')
737
738 #----------------------------------------------------------------------------
739
740 def processMethods(methods):
741 defs = []
742 imps = []
743 dstr = []
744
745 for retType, name, number, param1, param2, docs, is_const in methods:
746 retType = retTypeMap.get(retType, retType)
747 params = makeParamString(param1, param2)
748
749 name, theDef, theImp, docs = checkMethodOverride(name, number, docs)
750
751 if name is None:
752 continue
753
754 # Build docstrings
755 st = 'DocStr(wxStyledTextCtrl::%s,\n' \
756 '"%s", "");\n' % (name, '\n'.join(docs))
757 dstr.append(st)
758
759 # Build the method definition for the .h file
760 if docs:
761 defs.append('')
762 for x in docs:
763 defs.append(' // ' + x)
764 if not theDef:
765 theDef = ' %s %s(%s)' % (retType, name, params)
766 if is_const:
767 theDef = theDef + ' const'
768 theDef = theDef + ';'
769 defs.append(theDef)
770
771 # Build the method implementation string
772 if docs:
773 imps.append('')
774 for x in docs:
775 imps.append('// ' + x)
776 if not theImp:
777 theImp = '%s wxStyledTextCtrl::%s(%s)' % (retType, name, params)
778 if is_const:
779 theImp = theImp + ' const'
780 theImp = theImp + '\n{\n '
781 if retType == 'wxColour':
782 theImp = theImp + 'long c = '
783 elif retType != 'void':
784 theImp = theImp + 'return '
785 theImp = theImp + 'SendMsg(%s, %s, %s)' % (number,
786 makeArgString(param1),
787 makeArgString(param2))
788 if retType == 'bool':
789 theImp = theImp + ' != 0'
790 if retType == 'wxColour':
791 theImp = theImp + ';\n return wxColourFromLong(c)'
792
793 theImp = theImp + ';\n}'
794 imps.append(theImp)
795
796
797 return '\n'.join(defs), '\n'.join(imps), '\n'.join(dstr)
798
799
800 #----------------------------------------------------------------------------
801
802 def checkMethodOverride(name, number, docs):
803 theDef = theImp = None
804 if methodOverrideMap.has_key(name):
805 item = methodOverrideMap[name]
806
807 try:
808 if item[0] != 0:
809 name = item[0]
810 if item[1] != 0:
811 theDef = ' ' + (item[1] % name)
812 if item[2] != 0:
813 theImp = item[2] % ('wxStyledTextCtrl::'+name, number) + '\n}'
814 if item[3] != 0:
815 docs = item[3]
816 except:
817 print "*************", name
818 raise
819
820 return name, theDef, theImp, docs
821
822 #----------------------------------------------------------------------------
823
824 def makeArgString(param):
825 if not param:
826 return '0'
827
828 typ, name = param
829
830 if typ == 'string':
831 return '(long)(const char*)wx2stc(%s)' % name
832 if typ == 'colour':
833 return 'wxColourAsLong(%s)' % name
834
835 return name
836
837 #----------------------------------------------------------------------------
838
839 def makeParamString(param1, param2):
840 def doOne(param):
841 if param:
842 aType = paramTypeMap.get(param[0], param[0])
843 return aType + ' ' + param[1]
844 else:
845 return ''
846
847 st = doOne(param1)
848 if st and param2:
849 st = st + ', '
850 st = st + doOne(param2)
851 return st
852
853
854 #----------------------------------------------------------------------------
855
856 def parseVal(line, values, docs):
857 name, val = string.split(line, '=')
858
859 # remove prefixes such as SCI, etc.
860 for old, new in valPrefixes:
861 lo = len(old)
862 if name[:lo] == old:
863 if new is None:
864 return
865 name = new + name[lo:]
866
867 # add it to the list
868 values.append( ('wxSTC_' + name, val, docs) )
869
870 #----------------------------------------------------------------------------
871
872 funregex = re.compile(r'\s*([a-zA-Z0-9_]+)' # <ws>return type
873 '\s+([a-zA-Z0-9_]+)=' # <ws>name=
874 '([0-9]+)' # number
875 '\(([ a-zA-Z0-9_]*),' # (param,
876 '([ a-zA-Z0-9_]*)\)') # param)
877
878 def parseFun(line, methods, docs, values, is_const):
879 def parseParam(param):
880 param = string.strip(param)
881 if param == '':
882 param = None
883 else:
884 param = tuple(string.split(param))
885 return param
886
887 mo = funregex.match(line)
888 if mo is None:
889 print "***** Line doesn't match! : " + line
890
891 retType, name, number, param1, param2 = mo.groups()
892
893 param1 = parseParam(param1)
894 param2 = parseParam(param2)
895
896 # Special case. For the key command functions we want a value defined too
897 num = string.atoi(number)
898 for v in cmdValues:
899 if (type(v) == type(()) and v[0] <= num <= v[1]) or v == num:
900 parseVal('CMD_%s=%s' % (string.upper(name), number), values, docs)
901
902 # if we are not also doing a function for CMD values, then
903 # just return, otherwise fall through to the append blow.
904 if not FUNC_FOR_CMD:
905 return
906
907 methods.append( (retType, name, number, param1, param2, tuple(docs), is_const) )
908
909
910 #----------------------------------------------------------------------------
911
912
913 def main(args):
914 # TODO: parse command line args to replace default input/output files???
915
916 if not os.path.exists(IFACE):
917 print 'Please run this script from src/stc subdirectory.'
918 sys.exit(1)
919
920 # Now just do it
921 processIface(IFACE, H_TEMPLATE, CPP_TEMPLATE, H_DEST, CPP_DEST, DOCSTR_DEST)
922
923
924
925 if __name__ == '__main__':
926 main(sys.argv)
927
928 #----------------------------------------------------------------------------
929