]> git.saurik.com Git - wxWidgets.git/blame - src/stc/gen_iface.py
use WXSIZEOF(x) instead of sizeof(x)/sizeof(x[0]) (closes #10701)
[wxWidgets.git] / src / stc / gen_iface.py
CommitLineData
3a38f8c1 1#!/usr/bin/env python
f97d84a6
RD
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
65ec6247 15import sys, string, re, os
f97d84a6
RD
16from fileinput import FileInput
17
18
65ec6247
RD
19IFACE = os.path.abspath('./scintilla/include/Scintilla.iface')
20H_TEMPLATE = os.path.abspath('./stc.h.in')
21CPP_TEMPLATE = os.path.abspath('./stc.cpp.in')
22H_DEST = os.path.abspath('../../include/wx/stc/stc.h')
23CPP_DEST = os.path.abspath('./stc.cpp')
2bfca191 24DOCSTR_DEST = '/dev/null' #os.path.abspath('../../../wxPython/contrib/stc/_stc_gendocs.i')
f97d84a6
RD
25
26
27# Value prefixes to convert
28valPrefixes = [('SCI_', ''),
29 ('SC_', ''),
37d62433 30 ('SCN_', None), # just toss these out...
f97d84a6
RD
31 ('SCEN_', None),
32 ('SCE_', ''),
33 ('SCLEX_', 'LEX_'),
34 ('SCK_', 'KEY_'),
35 ('SCFIND_', 'FIND_'),
36 ('SCWS_', 'WS_'),
37]
38
c26dba42 39# Message function values that should have a CMD_ constant generated
7e0c58e9 40cmdValues = [ 2011,
2b5f62a0
VZ
41 2013,
42 (2176, 2180),
7e0c58e9 43 (2300, 2349),
2b5f62a0
VZ
44 (2390, 2393),
45 (2395, 2396),
9e730a78
RD
46 2404,
47 (2413, 2416),
8e54aaed 48 (2426, 2442),
c26dba42 49 (2450, 2455),
7e0c58e9 50 2518,
2b5f62a0 51 ]
f97d84a6
RD
52
53
c26dba42
RD
54# Should a funciton be also generated for the CMDs?
55FUNC_FOR_CMD = True
56
57
f97d84a6
RD
58# Map some generic typenames to wx types, using return value syntax
59retTypeMap = {
60 'position': 'int',
61 'string': 'wxString',
62 'colour': 'wxColour',
63 }
64
65# Map some generic typenames to wx types, using parameter syntax
66paramTypeMap = {
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#
82methodOverrideMap = {
83 'AddText' : (0,
84 'void %s(const wxString& text);',
85
86 '''void %s(const wxString& text) {
0c5b83b0 87 wxWX2MBbuf buf = (wxWX2MBbuf)wx2stc(text);
b796ba39 88 SendMsg(%s, strlen(buf), (sptr_t)(const char*)buf);''',
f97d84a6
RD
89 0),
90
91 'AddStyledText' : (0,
10ef30eb 92 'void %s(const wxMemoryBuffer& data);',
f97d84a6 93
10ef30eb 94 '''void %s(const wxMemoryBuffer& data) {
b796ba39 95 SendMsg(%s, data.GetDataLen(), (sptr_t)data.GetData());''',
f97d84a6
RD
96 0),
97
41a499cd
RD
98 'AppendText' : (0,
99 'void %s(const wxString& text);',
100
101 '''void %s(const wxString& text) {
102 wxWX2MBbuf buf = (wxWX2MBbuf)wx2stc(text);
b796ba39 103 SendMsg(%s, strlen(buf), (sptr_t)(const char*)buf);''',
41a499cd
RD
104 0),
105
f97d84a6
RD
106 'GetViewWS' : ( 'GetViewWhiteSpace', 0, 0, 0),
107 'SetViewWS' : ( 'SetViewWhiteSpace', 0, 0, 0),
108
9e730a78
RD
109 'GetCharAt' :
110 ( 0, 0,
8e0945da 111 '''int %s(int pos) const {
9e730a78
RD
112 return (unsigned char)SendMsg(%s, pos, 0);''',
113 0),
114
115 'GetStyleAt' :
116 ( 0, 0,
8e0945da 117 '''int %s(int pos) const {
9e730a78
RD
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;
b796ba39 138 len = SendMsg(%s, 0, (sptr_t)&tr);
9e730a78
RD
139 buf.UngetWriteBuf(len);
140 return buf;''',
141
142 ('Retrieve a buffer of cells.',)),
143
144
145 'PositionFromPoint' :
146 (0,
2bfca191 147 'int %s(wxPoint pt) const;',
9e730a78 148
2bfca191 149 '''int %s(wxPoint pt) const {
9e730a78
RD
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
b796ba39 167 int pos = SendMsg(%s, len+1, (sptr_t)buf);
9e730a78
RD
168 mbuf.UngetWriteBuf(len);
169 mbuf.AppendByte(0);
170 if (linePos) *linePos = pos;
171 return stc2wx(buf);''',
172
173 0),
f97d84a6
RD
174
175 'SetUsePalette' : (None, 0,0,0),
176
177 'MarkerSetFore' : ('MarkerSetForeground', 0, 0, 0),
178 'MarkerSetBack' : ('MarkerSetBackground', 0, 0, 0),
179
9e730a78
RD
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();
e45b3f17
RD
207 if (img.HasAlpha())
208 img.ConvertAlphaToMask();
9e730a78
RD
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;
b796ba39 214 SendMsg(%s, markerNumber, (sptr_t)buff);
9e730a78
RD
215 delete [] buff;
216 ''',
217 ('Define a marker from a bitmap',)),
f97d84a6 218
f97d84a6
RD
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
7e0c58e9
RD
229
230 'StyleGetFore' : ('StyleGetForeground', 0, 0, 0),
231 'StyleGetBack' : ('StyleGetBackground', 0, 0, 0),
f97d84a6
RD
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),
591e2d8e 237 'StyleGetFont' :
7e0c58e9
RD
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);
b796ba39 245 SendMsg(msg, style, (sptr_t)buf);
7e0c58e9
RD
246 mbuf.UngetWriteBuf(len);
247 mbuf.AppendByte(0);
248 return stc2wx(buf);''',
249 ('Get the font facename of a style',)),
f97d84a6 250 'StyleSetFont' : ('StyleSetFaceName', 0, 0, 0),
3727c043 251 'StyleSetCharacterSet' : (None, 0, 0, 0),
591e2d8e 252
9e730a78
RD
253 'AssignCmdKey' :
254 ('CmdKeyAssign',
255 'void %s(int key, int modifiers, int cmd);',
f97d84a6 256
9e730a78
RD
257 '''void %s(int key, int modifiers, int cmd) {
258 SendMsg(%s, MAKELONG(key, modifiers), cmd);''',
259 0),
f97d84a6 260
f97d84a6 261
9e730a78
RD
262 'ClearCmdKey' :
263 ('CmdKeyClear',
264 'void %s(int key, int modifiers);',
f97d84a6 265
9e730a78
RD
266 '''void %s(int key, int modifiers) {
267 SendMsg(%s, MAKELONG(key, modifiers));''',
268 0),
f97d84a6
RD
269
270 'ClearAllCmdKeys' : ('CmdKeyClearAll', 0, 0, 0),
271
272
9e730a78
RD
273 'SetStylingEx' :
274 ('SetStyleBytes',
275 'void %s(int length, char* styleBytes);',
f97d84a6 276
9e730a78 277 '''void %s(int length, char* styleBytes) {
b796ba39 278 SendMsg(%s, length, (sptr_t)styleBytes);''',
9e730a78 279 0),
f97d84a6
RD
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),
7e0c58e9
RD
286 'IndicSetUnder': ('IndicatorSetUnder', 0, 0, 0),
287 'IndicGetUnder': ('IndicatorGetUnder', 0, 0, 0),
591e2d8e 288
f114b858
RD
289 'SetWhitespaceFore' : ('SetWhitespaceForeground', 0, 0, 0),
290 'SetWhitespaceBack' : ('SetWhitespaceBackground', 0, 0, 0),
291
f97d84a6
RD
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),
65ec6247
RD
308 'AutoCSetAutoHide' : ('AutoCompSetAutoHide', 0, 0, 0),
309 'AutoCGetAutoHide' : ('AutoCompGetAutoHide', 0, 0, 0),
1a2fb4cd
RD
310 'AutoCSetDropRestOfWord' : ('AutoCompSetDropRestOfWord', 0,0,0),
311 'AutoCGetDropRestOfWord' : ('AutoCompGetDropRestOfWord', 0,0,0),
9e730a78
RD
312 'AutoCGetTypeSeparator' : ('AutoCompGetTypeSeparator', 0, 0, 0),
313 'AutoCSetTypeSeparator' : ('AutoCompSetTypeSeparator', 0, 0, 0),
8e54aaed 314 'AutoCGetCurrent' : ('AutoCompGetCurrent', 0, 0, 0),
1e9bafca
RD
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),
591e2d8e 320
9e730a78
RD
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();
e45b3f17
RD
328 if (img.HasAlpha())
329 img.ConvertAlphaToMask();
9e730a78
RD
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;
b796ba39 335 SendMsg(%s, type, (sptr_t)buff);
9e730a78
RD
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.',)),
65ec6247 343
f97d84a6
RD
344
345 'SetHScrollBar' : ('SetUseHorizontalScrollBar', 0, 0, 0),
346 'GetHScrollBar' : ('GetUseHorizontalScrollBar', 0, 0, 0),
347
9e730a78
RD
348 'SetVScrollBar' : ('SetUseVerticalScrollBar', 0, 0, 0),
349 'GetVScrollBar' : ('GetUseVerticalScrollBar', 0, 0, 0),
350
f97d84a6
RD
351 'GetCaretFore' : ('GetCaretForeground', 0, 0, 0),
352
353 'GetUsePalette' : (None, 0, 0, 0),
354
9e730a78
RD
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
b796ba39 368 return SendMsg(%s, flags, (sptr_t)&ft);''',
9e730a78
RD
369 0),
370
371 'FormatRange' :
372 (0,
373 '''int %s(bool doDraw,
374 int startPos,
375 int endPos,
376 wxDC* draw,
591e2d8e 377 wxDC* target,
9e730a78
RD
378 wxRect renderRect,
379 wxRect pageRect);''',
380 ''' int %s(bool doDraw,
381 int startPos,
382 int endPos,
383 wxDC* draw,
591e2d8e 384 wxDC* target,
9e730a78
RD
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
b796ba39 407 return SendMsg(%s, doDraw, (sptr_t)&fr);''',
9e730a78
RD
408 0),
409
410
411 'GetLine' :
412 (0,
2bfca191 413 'wxString %s(int line) const;',
9e730a78 414
2bfca191 415 '''wxString %s(int line) const {
9e730a78
RD
416 int len = LineLength(line);
417 if (!len) return wxEmptyString;
418
419 wxMemoryBuffer mbuf(len+1);
420 char* buf = (char*)mbuf.GetWriteBuf(len+1);
b796ba39 421 SendMsg(%s, line, (sptr_t)buf);
9e730a78
RD
422 mbuf.UngetWriteBuf(len);
423 mbuf.AppendByte(0);
424 return stc2wx(buf);''',
425
426 ('Retrieve the contents of a line.',)),
f97d84a6 427
fa70ec2b 428 'SetSel' : (None, 0,0,0), #'SetSelection', 0, 0, 0),
9e730a78
RD
429
430 'GetSelText' :
431 ('GetSelectedText',
432 'wxString %s();',
433
434 '''wxString %s() {
fa70ec2b
RD
435 long start;
436 long end;
9e730a78
RD
437
438 GetSelection(&start, &end);
439 int len = end - start;
440 if (!len) return wxEmptyString;
441
3d7a4fe8 442 wxMemoryBuffer mbuf(len+2);
9e730a78 443 char* buf = (char*)mbuf.GetWriteBuf(len+1);
b796ba39 444 SendMsg(%s, 0, (sptr_t)buf);
9e730a78
RD
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;
b796ba39 470 SendMsg(%s, 0, (sptr_t)&tr);
9e730a78
RD
471 mbuf.UngetWriteBuf(len);
472 mbuf.AppendByte(0);
473 return stc2wx(buf);''',
474
475 ('Retrieve a range of text.',)),
f97d84a6
RD
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
9e730a78
RD
484 'GetText' :
485 (0,
93578927 486 'wxString %s() const;',
f97d84a6 487
93578927 488 '''wxString %s() const {
9e730a78
RD
489 int len = GetTextLength();
490 wxMemoryBuffer mbuf(len+1); // leave room for the null...
491 char* buf = (char*)mbuf.GetWriteBuf(len+1);
b796ba39 492 SendMsg(%s, len+1, (sptr_t)buf);
9e730a78
RD
493 mbuf.UngetWriteBuf(len);
494 mbuf.AppendByte(0);
495 return stc2wx(buf);''',
f97d84a6 496
9e730a78 497 ('Retrieve all the text in the document.', )),
f97d84a6
RD
498
499 'GetDirectFunction' : (None, 0, 0, 0),
500 'GetDirectPointer' : (None, 0, 0, 0),
501
9e730a78
RD
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),
7e0c58e9
RD
510 'GetHotspotActiveFore' : ('GetHotspotActiveForeground', 0, 0, 0),
511 'GetHotspotActiveBack' : ('GetHotspotActiveBackground', 0, 0, 0),
591e2d8e 512
6a93571d
RD
513 'GetCaretLineBack' : ('GetCaretLineBackground', 0, 0, 0),
514 'SetCaretLineBack' : ('SetCaretLineBackground', 0, 0, 0),
9e730a78
RD
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);
b796ba39 523 return SendMsg(%s, strlen(buf), (sptr_t)(const char*)buf);''',
9e730a78
RD
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);
b796ba39 533 return SendMsg(%s, strlen(buf), (sptr_t)(const char*)buf);''',
9e730a78
RD
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);
b796ba39 543 return SendMsg(%s, strlen(buf), (sptr_t)(const char*)buf);''',
9e730a78
RD
544 0),
545
a33203cb
RD
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),
1e9bafca
RD
550
551
552 'GetProperty' :
553 (0,
554 'wxString %s(const wxString& key);',
555
556 '''wxString %s(const wxString& key) {
b796ba39 557 int len = SendMsg(SCI_GETPROPERTY, (sptr_t)(const char*)wx2stc(key), 0);
1e9bafca
RD
558 if (!len) return wxEmptyString;
559
560 wxMemoryBuffer mbuf(len+1);
561 char* buf = (char*)mbuf.GetWriteBuf(len+1);
b796ba39 562 SendMsg(%s, (uptr_t)(const char*)wx2stc(key), (sptr_t)buf);
1e9bafca
RD
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) {
b796ba39 573 int len = SendMsg(SCI_GETPROPERTYEXPANDED, (uptr_t)(const char*)wx2stc(key), 0);
1e9bafca
RD
574 if (!len) return wxEmptyString;
575
576 wxMemoryBuffer mbuf(len+1);
577 char* buf = (char*)mbuf.GetWriteBuf(len+1);
b796ba39 578 SendMsg(%s, (uptr_t)(const char*)wx2stc(key), (sptr_t)buf);
1e9bafca
RD
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
9e730a78
RD
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) {
b796ba39 601 SendMsg(%s, 0, (sptr_t)docPointer);''',
9e730a78
RD
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) {
b796ba39 615 SendMsg(%s, 0, (sptr_t)docPointer);''',
9e730a78
RD
616 0),
617
618 'ReleaseDocument' :
619 (0,
620 'void %s(void* docPointer);',
621 '''void %s(void* docPointer) {
b796ba39 622 SendMsg(%s, 0, (sptr_t)docPointer);''',
9e730a78
RD
623 0),
624
625 'SetCodePage' :
626 (0,
627 0,
628 '''void %s(int codePage) {
2b5f62a0
VZ
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
9e730a78
RD
636 SendMsg(%s, codePage);''',
637 ("Set the code page used to interpret the bytes of the document as characters.",) ),
2b5f62a0
VZ
638
639
640 'GrabFocus' : (None, 0, 0, 0),
88a8b04e 641
c26dba42 642 # Rename some that would otherwise hide the wxWindow methods
2b5f62a0
VZ
643 'SetFocus' : ('SetSTCFocus', 0, 0, 0),
644 'GetFocus' : ('GetSTCFocus', 0, 0, 0),
88a8b04e
RD
645 'SetCursor' : ('SetSTCCursor', 0, 0, 0),
646 'GetCursor' : ('GetSTCCursor', 0, 0, 0),
2b5f62a0 647
9e730a78
RD
648 'LoadLexerLibrary' : (None, 0,0,0),
649
7e0c58e9
RD
650 'SetPositionCache' : ('SetPositionCacheSize', 0, 0, 0),
651 'GetPositionCache' : ('GetPositionCacheSize', 0, 0, 0),
652
9e730a78 653
f97d84a6
RD
654 '' : ('', 0, 0, 0),
655
656 }
657
2bfca191
VZ
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)
662constNonGetterMethods = set((
663 'LineFromPosition',
664 'PositionFromLine',
665 'LineLength',
7d6d76d0 666 'CanPaste',
93578927
VZ
667 'CanRedo',
668 'CanUndo',
2bfca191
VZ
669))
670
f97d84a6
RD
671#----------------------------------------------------------------------------
672
f2ccce28 673def processIface(iface, h_tmplt, cpp_tmplt, h_dest, cpp_dest, docstr_dest):
f97d84a6
RD
674 curDocStrings = []
675 values = []
676 methods = []
2b5f62a0 677 cmds = []
f97d84a6
RD
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 ':
8e0945da 696 parseFun(line[4:], methods, curDocStrings, cmds, op == 'get ')
f97d84a6
RD
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
a834585d
RD
706 elif op == 'enu ':
707 pass
708
709 elif op == 'lex ':
710 pass
711
f97d84a6
RD
712 else:
713 print '***** Unknown line type: ', line
714
715
716 # process templates
717 data = {}
718 data['VALUES'] = processVals(values)
2b5f62a0 719 data['CMDS'] = processVals(cmds)
f2ccce28 720 defs, imps, docstrings = processMethods(methods)
f97d84a6
RD
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)
f2ccce28 735 open(docstr_dest, 'w').write(docstrings)
f97d84a6
RD
736
737
738
739#----------------------------------------------------------------------------
740
741def processVals(values):
742 text = []
743 for name, value, docs in values:
744 if docs:
745 text.append('')
746 for x in docs:
747 text.append('// ' + x)
748 text.append('#define %s %s' % (name, value))
749 return string.join(text, '\n')
750
751#----------------------------------------------------------------------------
752
753def processMethods(methods):
754 defs = []
755 imps = []
f2ccce28 756 dstr = []
f97d84a6 757
8e0945da 758 for retType, name, number, param1, param2, docs, is_const in methods:
f97d84a6
RD
759 retType = retTypeMap.get(retType, retType)
760 params = makeParamString(param1, param2)
761
762 name, theDef, theImp, docs = checkMethodOverride(name, number, docs)
763
764 if name is None:
765 continue
766
f2ccce28
RD
767 # Build docstrings
768 st = 'DocStr(wxStyledTextCtrl::%s,\n' \
769 '"%s", "");\n' % (name, '\n'.join(docs))
770 dstr.append(st)
8e0945da 771
f97d84a6
RD
772 # Build the method definition for the .h file
773 if docs:
774 defs.append('')
775 for x in docs:
776 defs.append(' // ' + x)
777 if not theDef:
8e0945da
VZ
778 theDef = ' %s %s(%s)' % (retType, name, params)
779 if is_const:
780 theDef = theDef + ' const'
781 theDef = theDef + ';'
f97d84a6
RD
782 defs.append(theDef)
783
784 # Build the method implementation string
785 if docs:
786 imps.append('')
787 for x in docs:
788 imps.append('// ' + x)
789 if not theImp:
8e0945da
VZ
790 theImp = '%s wxStyledTextCtrl::%s(%s)' % (retType, name, params)
791 if is_const:
792 theImp = theImp + ' const'
793 theImp = theImp + '\n{\n '
f97d84a6
RD
794 if retType == 'wxColour':
795 theImp = theImp + 'long c = '
796 elif retType != 'void':
797 theImp = theImp + 'return '
798 theImp = theImp + 'SendMsg(%s, %s, %s)' % (number,
799 makeArgString(param1),
800 makeArgString(param2))
801 if retType == 'bool':
802 theImp = theImp + ' != 0'
803 if retType == 'wxColour':
804 theImp = theImp + ';\n return wxColourFromLong(c)'
805
806 theImp = theImp + ';\n}'
807 imps.append(theImp)
808
809
f2ccce28 810 return '\n'.join(defs), '\n'.join(imps), '\n'.join(dstr)
f97d84a6
RD
811
812
813#----------------------------------------------------------------------------
814
815def checkMethodOverride(name, number, docs):
816 theDef = theImp = None
817 if methodOverrideMap.has_key(name):
818 item = methodOverrideMap[name]
819
c13219d6
RD
820 try:
821 if item[0] != 0:
822 name = item[0]
823 if item[1] != 0:
824 theDef = ' ' + (item[1] % name)
825 if item[2] != 0:
826 theImp = item[2] % ('wxStyledTextCtrl::'+name, number) + '\n}'
827 if item[3] != 0:
828 docs = item[3]
829 except:
830 print "*************", name
831 raise
f97d84a6
RD
832
833 return name, theDef, theImp, docs
834
835#----------------------------------------------------------------------------
836
837def makeArgString(param):
838 if not param:
839 return '0'
840
841 typ, name = param
842
843 if typ == 'string':
b796ba39 844 return '(sptr_t)(const char*)wx2stc(%s)' % name
f97d84a6
RD
845 if typ == 'colour':
846 return 'wxColourAsLong(%s)' % name
847
848 return name
849
850#----------------------------------------------------------------------------
851
852def makeParamString(param1, param2):
853 def doOne(param):
854 if param:
855 aType = paramTypeMap.get(param[0], param[0])
856 return aType + ' ' + param[1]
857 else:
858 return ''
859
860 st = doOne(param1)
861 if st and param2:
862 st = st + ', '
863 st = st + doOne(param2)
864 return st
865
866
867#----------------------------------------------------------------------------
868
869def parseVal(line, values, docs):
870 name, val = string.split(line, '=')
871
872 # remove prefixes such as SCI, etc.
873 for old, new in valPrefixes:
874 lo = len(old)
875 if name[:lo] == old:
876 if new is None:
877 return
878 name = new + name[lo:]
879
880 # add it to the list
881 values.append( ('wxSTC_' + name, val, docs) )
882
883#----------------------------------------------------------------------------
884
885funregex = re.compile(r'\s*([a-zA-Z0-9_]+)' # <ws>return type
886 '\s+([a-zA-Z0-9_]+)=' # <ws>name=
887 '([0-9]+)' # number
888 '\(([ a-zA-Z0-9_]*),' # (param,
889 '([ a-zA-Z0-9_]*)\)') # param)
890
8e0945da 891def parseFun(line, methods, docs, values, is_const):
f97d84a6
RD
892 def parseParam(param):
893 param = string.strip(param)
894 if param == '':
895 param = None
896 else:
897 param = tuple(string.split(param))
898 return param
899
900 mo = funregex.match(line)
901 if mo is None:
902 print "***** Line doesn't match! : " + line
903
904 retType, name, number, param1, param2 = mo.groups()
905
906 param1 = parseParam(param1)
907 param2 = parseParam(param2)
908
2b5f62a0 909 # Special case. For the key command functions we want a value defined too
f97d84a6
RD
910 num = string.atoi(number)
911 for v in cmdValues:
2b5f62a0 912 if (type(v) == type(()) and v[0] <= num <= v[1]) or v == num:
10ef30eb 913 parseVal('CMD_%s=%s' % (string.upper(name), number), values, docs)
591e2d8e 914
c26dba42
RD
915 # if we are not also doing a function for CMD values, then
916 # just return, otherwise fall through to the append blow.
917 if not FUNC_FOR_CMD:
918 return
591e2d8e 919
2bfca191
VZ
920 methods.append( (retType, name, number, param1, param2, tuple(docs),
921 is_const or name in constNonGetterMethods) )
f97d84a6
RD
922
923
924#----------------------------------------------------------------------------
925
926
927def main(args):
928 # TODO: parse command line args to replace default input/output files???
929
591e2d8e
VZ
930 if not os.path.exists(IFACE):
931 print 'Please run this script from src/stc subdirectory.'
932 sys.exit(1)
933
f97d84a6 934 # Now just do it
f2ccce28 935 processIface(IFACE, H_TEMPLATE, CPP_TEMPLATE, H_DEST, CPP_DEST, DOCSTR_DEST)
f97d84a6
RD
936
937
938
939if __name__ == '__main__':
940 main(sys.argv)
941
942#----------------------------------------------------------------------------
943