Fix the STC sources generation script to work with ancient Python.
[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 = '/dev/null' #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 = 1
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), (sptr_t)(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(), (sptr_t)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), (sptr_t)(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, (sptr_t)&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) const;',
148
149 '''int %s(wxPoint pt) const {
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, (sptr_t)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, (sptr_t)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, (sptr_t)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, (sptr_t)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, (sptr_t)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, (sptr_t)&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, (sptr_t)&fr);''',
408 0),
409
410
411 'GetLine' :
412 (0,
413 'wxString %s(int line) const;',
414
415 '''wxString %s(int line) const {
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, (sptr_t)buf);
422 mbuf.UngetWriteBuf(len);
423 mbuf.AppendByte(0);
424 return stc2wx(buf);''',
425
426 ('Retrieve the contents of a line.',)),
427
428 'SetSel' : (None, 0,0,0), #'SetSelection', 0, 0, 0),
429
430 'GetSelText' :
431 ('GetSelectedText',
432 'wxString %s();',
433
434 '''wxString %s() {
435 long start;
436 long 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, (sptr_t)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, (sptr_t)&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() const;',
487
488 '''wxString %s() const {
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, (sptr_t)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), (sptr_t)(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), (sptr_t)(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), (sptr_t)(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, (sptr_t)(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, (uptr_t)(const char*)wx2stc(key), (sptr_t)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, (uptr_t)(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, (uptr_t)(const char*)wx2stc(key), (sptr_t)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, (sptr_t)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, (sptr_t)docPointer);''',
616 0),
617
618 'ReleaseDocument' :
619 (0,
620 'void %s(void* docPointer);',
621 '''void %s(void* docPointer) {
622 SendMsg(%s, 0, (sptr_t)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 # all Scintilla getters are transformed into const member of wxSTC class but
659 # some non-getter methods are also logically const and this set contains their
660 # names (notice that it's useless to include here methods manually overridden
661 # above)
662 constNonGetterMethods = (
663 'LineFromPosition',
664 'PositionFromLine',
665 'LineLength',
666 'CanPaste',
667 'CanRedo',
668 'CanUndo',
669 )
670
671 #----------------------------------------------------------------------------
672
673 def processIface(iface, h_tmplt, cpp_tmplt, h_dest, cpp_dest, docstr_dest):
674 curDocStrings = []
675 values = []
676 methods = []
677 cmds = []
678
679 # parse iface file
680 fi = FileInput(iface)
681 for line in fi:
682 line = line[:-1]
683 if line[:2] == '##' or line == '':
684 #curDocStrings = []
685 continue
686
687 op = line[:4]
688 if line[:2] == '# ': # a doc string
689 curDocStrings.append(line[2:])
690
691 elif op == 'val ':
692 parseVal(line[4:], values, curDocStrings)
693 curDocStrings = []
694
695 elif op == 'fun ' or op == 'set ' or op == 'get ':
696 parseFun(line[4:], methods, curDocStrings, cmds, op == 'get ')
697 curDocStrings = []
698
699 elif op == 'cat ':
700 if string.strip(line[4:]) == 'Deprecated':
701 break # skip the rest of the file
702
703 elif op == 'evt ':
704 pass
705
706 elif op == 'enu ':
707 pass
708
709 elif op == 'lex ':
710 pass
711
712 else:
713 print '***** Unknown line type: ', line
714
715
716 # process templates
717 data = {}
718 data['VALUES'] = processVals(values)
719 data['CMDS'] = processVals(cmds)
720 defs, imps, docstrings = processMethods(methods)
721 data['METHOD_DEFS'] = defs
722 data['METHOD_IMPS'] = imps
723
724 # get template text
725 h_text = open(h_tmplt).read()
726 cpp_text = open(cpp_tmplt).read()
727
728 # do the substitutions
729 h_text = h_text % data
730 cpp_text = cpp_text % data
731
732 # write out destination files
733 open(h_dest, 'w').write(h_text)
734 open(cpp_dest, 'w').write(cpp_text)
735 open(docstr_dest, 'w').write(docstrings)
736
737
738
739 def joinWithNewLines(values):
740 return string.join(values, '\n')
741
742 #----------------------------------------------------------------------------
743
744 def processVals(values):
745 text = []
746 for name, value, docs in values:
747 if docs:
748 text.append('')
749 for x in docs:
750 text.append('// ' + x)
751 text.append('#define %s %s' % (name, value))
752 return joinWithNewLines(text)
753
754 #----------------------------------------------------------------------------
755
756 def processMethods(methods):
757 defs = []
758 imps = []
759 dstr = []
760
761 for retType, name, number, param1, param2, docs, is_const in methods:
762 retType = retTypeMap.get(retType, retType)
763 params = makeParamString(param1, param2)
764
765 name, theDef, theImp, docs = checkMethodOverride(name, number, docs)
766
767 if name is None:
768 continue
769
770 # Build docstrings
771 st = 'DocStr(wxStyledTextCtrl::%s,\n' \
772 '"%s", "");\n' % (name, joinWithNewLines(docs))
773 dstr.append(st)
774
775 # Build the method definition for the .h file
776 if docs:
777 defs.append('')
778 for x in docs:
779 defs.append(' // ' + x)
780 if not theDef:
781 theDef = ' %s %s(%s)' % (retType, name, params)
782 if is_const:
783 theDef = theDef + ' const'
784 theDef = theDef + ';'
785 defs.append(theDef)
786
787 # Build the method implementation string
788 if docs:
789 imps.append('')
790 for x in docs:
791 imps.append('// ' + x)
792 if not theImp:
793 theImp = '%s wxStyledTextCtrl::%s(%s)' % (retType, name, params)
794 if is_const:
795 theImp = theImp + ' const'
796 theImp = theImp + '\n{\n '
797 if retType == 'wxColour':
798 theImp = theImp + 'long c = '
799 elif retType != 'void':
800 theImp = theImp + 'return '
801 theImp = theImp + 'SendMsg(%s, %s, %s)' % (number,
802 makeArgString(param1),
803 makeArgString(param2))
804 if retType == 'bool':
805 theImp = theImp + ' != 0'
806 if retType == 'wxColour':
807 theImp = theImp + ';\n return wxColourFromLong(c)'
808
809 theImp = theImp + ';\n}'
810 imps.append(theImp)
811
812
813 return joinWithNewLines(defs), joinWithNewLines(imps), joinWithNewLines(dstr)
814
815
816 #----------------------------------------------------------------------------
817
818 def checkMethodOverride(name, number, docs):
819 theDef = theImp = None
820 if methodOverrideMap.has_key(name):
821 item = methodOverrideMap[name]
822
823 try:
824 if item[0] != 0:
825 name = item[0]
826 if item[1] != 0:
827 theDef = ' ' + (item[1] % name)
828 if item[2] != 0:
829 theImp = item[2] % ('wxStyledTextCtrl::'+name, number) + '\n}'
830 if item[3] != 0:
831 docs = item[3]
832 except:
833 print "*************", name
834 raise
835
836 return name, theDef, theImp, docs
837
838 #----------------------------------------------------------------------------
839
840 def makeArgString(param):
841 if not param:
842 return '0'
843
844 typ, name = param
845
846 if typ == 'string':
847 return '(sptr_t)(const char*)wx2stc(%s)' % name
848 if typ == 'colour':
849 return 'wxColourAsLong(%s)' % name
850
851 return name
852
853 #----------------------------------------------------------------------------
854
855 def makeParamString(param1, param2):
856 def doOne(param):
857 if param:
858 aType = paramTypeMap.get(param[0], param[0])
859 return aType + ' ' + param[1]
860 else:
861 return ''
862
863 st = doOne(param1)
864 if st and param2:
865 st = st + ', '
866 st = st + doOne(param2)
867 return st
868
869
870 #----------------------------------------------------------------------------
871
872 def parseVal(line, values, docs):
873 name, val = string.split(line, '=')
874
875 # remove prefixes such as SCI, etc.
876 for old, new in valPrefixes:
877 lo = len(old)
878 if name[:lo] == old:
879 if new is None:
880 return
881 name = new + name[lo:]
882
883 # add it to the list
884 values.append( ('wxSTC_' + name, val, docs) )
885
886 #----------------------------------------------------------------------------
887
888 funregex = re.compile(r'\s*([a-zA-Z0-9_]+)' # <ws>return type
889 '\s+([a-zA-Z0-9_]+)=' # <ws>name=
890 '([0-9]+)' # number
891 '\(([ a-zA-Z0-9_]*),' # (param,
892 '([ a-zA-Z0-9_]*)\)') # param)
893
894 def parseFun(line, methods, docs, values, is_const):
895 def parseParam(param):
896 param = string.strip(param)
897 if param == '':
898 param = None
899 else:
900 param = tuple(string.split(param))
901 return param
902
903 mo = funregex.match(line)
904 if mo is None:
905 print "***** Line doesn't match! : " + line
906
907 retType, name, number, param1, param2 = mo.groups()
908
909 param1 = parseParam(param1)
910 param2 = parseParam(param2)
911
912 # Special case. For the key command functions we want a value defined too
913 num = string.atoi(number)
914 for v in cmdValues:
915 if (type(v) == type(()) and v[0] <= num <= v[1]) or v == num:
916 parseVal('CMD_%s=%s' % (string.upper(name), number), values, docs)
917
918 # if we are not also doing a function for CMD values, then
919 # just return, otherwise fall through to the append blow.
920 if not FUNC_FOR_CMD:
921 return
922
923 methods.append( (retType, name, number, param1, param2, tuple(docs),
924 is_const or name in constNonGetterMethods) )
925
926
927 #----------------------------------------------------------------------------
928
929
930 def main(args):
931 # TODO: parse command line args to replace default input/output files???
932
933 if not os.path.exists(IFACE):
934 print 'Please run this script from src/stc subdirectory.'
935 sys.exit(1)
936
937 # Now just do it
938 processIface(IFACE, H_TEMPLATE, CPP_TEMPLATE, H_DEST, CPP_DEST, DOCSTR_DEST)
939
940
941
942 if __name__ == '__main__':
943 main(sys.argv)
944
945 #----------------------------------------------------------------------------
946