X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8e54aaedb5329a49ffd9c5d50071f9c8cdd5c59e..55ab731681a0e89be47defb252d3949620e7fb25:/src/stc/gen_iface.py diff --git a/src/stc/gen_iface.py b/src/stc/gen_iface.py old mode 100644 new mode 100755 index 070d4cbe90..1ed1ce7b14 --- a/src/stc/gen_iface.py +++ b/src/stc/gen_iface.py @@ -1,4 +1,4 @@ -#!/bin/env python +#!/usr/bin/env python #---------------------------------------------------------------------------- # Name: gen_iface.py # Purpose: Generate stc.h and stc.cpp from the info in Scintilla.iface @@ -8,7 +8,7 @@ # Created: 5-Sept-2000 # RCS-ID: $Id$ # Copyright: (c) 2000 by Total Control Software -# Licence: wxWindows license +# Licence: wxWindows licence #---------------------------------------------------------------------------- @@ -18,9 +18,15 @@ from fileinput import FileInput IFACE = os.path.abspath('./scintilla/include/Scintilla.iface') H_TEMPLATE = os.path.abspath('./stc.h.in') +IH_TEMPLATE = os.path.abspath('./stc.interface.h.in') CPP_TEMPLATE = os.path.abspath('./stc.cpp.in') H_DEST = os.path.abspath('../../include/wx/stc/stc.h') +IH_DEST = os.path.abspath('../../interface/wx/stc/stc.h') CPP_DEST = os.path.abspath('./stc.cpp') +if len(sys.argv) > 1 and sys.argv[1] == '--wxpython': + DOCSTR_DEST = os.path.abspath('../../../wxPython/src/_stc_gendocs.i') +else: + DOCSTR_DEST = None # Value prefixes to convert @@ -28,6 +34,7 @@ valPrefixes = [('SCI_', ''), ('SC_', ''), ('SCN_', None), # just toss these out... ('SCEN_', None), + ('SC_EFF', None), ('SCE_', ''), ('SCLEX_', 'LEX_'), ('SCK_', 'KEY_'), @@ -35,20 +42,27 @@ valPrefixes = [('SCI_', ''), ('SCWS_', 'WS_'), ] -# Message function values that should have a CMD_ constant as well -cmdValues = [ (2300, 2349), - 2011, +# Message function values that should have a CMD_ constant generated +cmdValues = [ 2011, 2013, (2176, 2180), + (2300, 2349), (2390, 2393), (2395, 2396), 2404, (2413, 2416), (2426, 2442), - (2450, 2454), + (2450, 2455), + 2518, + (2619, 2621), + (2628, 2629) ] +# Should a funciton be also generated for the CMDs? +FUNC_FOR_CMD = 1 + + # Map some generic typenames to wx types, using return value syntax retTypeMap = { 'position': 'int', @@ -78,29 +92,37 @@ methodOverrideMap = { 'void %s(const wxString& text);', '''void %s(const wxString& text) { - wxWX2MBbuf buf = (wxWX2MBbuf)wx2stc(text); - SendMsg(%s, strlen(buf), (long)(const char*)buf);''', + const wxWX2MBbuf buf = wx2stc(text); + SendMsg(%s, wx2stclen(text, buf), (sptr_t)(const char*)buf);''', 0), 'AddStyledText' : (0, 'void %s(const wxMemoryBuffer& data);', '''void %s(const wxMemoryBuffer& data) { - SendMsg(%s, data.GetDataLen(), (long)data.GetData());''', + SendMsg(%s, data.GetDataLen(), (sptr_t)data.GetData());''', 0), + 'AppendText' : (0, + 'void %s(const wxString& text);', + + '''void %s(const wxString& text) { + const wxWX2MBbuf buf = wx2stc(text); + SendMsg(%s, wx2stclen(text, buf), (sptr_t)(const char*)buf);''', + 0), + 'GetViewWS' : ( 'GetViewWhiteSpace', 0, 0, 0), 'SetViewWS' : ( 'SetViewWhiteSpace', 0, 0, 0), 'GetCharAt' : ( 0, 0, - '''int %s(int pos) { + '''int %s(int pos) const { return (unsigned char)SendMsg(%s, pos, 0);''', 0), 'GetStyleAt' : ( 0, 0, - '''int %s(int pos) { + '''int %s(int pos) const { return (unsigned char)SendMsg(%s, pos, 0);''', 0), @@ -121,7 +143,7 @@ methodOverrideMap = { tr.lpstrText = (char*)buf.GetWriteBuf(len*2+1); tr.chrg.cpMin = startPos; tr.chrg.cpMax = endPos; - len = SendMsg(%s, 0, (long)&tr); + len = SendMsg(%s, 0, (sptr_t)&tr); buf.UngetWriteBuf(len); return buf;''', @@ -130,9 +152,9 @@ methodOverrideMap = { 'PositionFromPoint' : (0, - 'int %s(wxPoint pt);', + 'int %s(wxPoint pt) const;', - '''int %s(wxPoint pt) { + '''int %s(wxPoint pt) const { return SendMsg(%s, pt.x, pt.y);''', 0), @@ -150,7 +172,7 @@ methodOverrideMap = { wxMemoryBuffer mbuf(len+1); char* buf = (char*)mbuf.GetWriteBuf(len+1); - int pos = SendMsg(%s, len+1, (long)buf); + int pos = SendMsg(%s, len+1, (sptr_t)buf); mbuf.UngetWriteBuf(len); mbuf.AppendByte(0); if (linePos) *linePos = pos; @@ -162,6 +184,9 @@ methodOverrideMap = { 'MarkerSetFore' : ('MarkerSetForeground', 0, 0, 0), 'MarkerSetBack' : ('MarkerSetBackground', 0, 0, 0), + 'MarkerSetBackSelected' : ('MarkerSetBackgroundSelected', 0,0,0), + + 'MarkerSymbolDefined' : ('GetMarkerSymbolDefined', 0, 0, 0), 'MarkerDefine' : (0, @@ -174,9 +199,9 @@ methodOverrideMap = { const wxColour& background) { SendMsg(%s, markerNumber, markerSymbol); - if (foreground.Ok()) + if (foreground.IsOk()) MarkerSetForeground(markerNumber, foreground); - if (background.Ok()) + if (background.IsOk()) MarkerSetBackground(markerNumber, background);''', ('Set the symbol used for a particular marker number,', @@ -190,12 +215,14 @@ methodOverrideMap = { // convert bmp to a xpm in a string wxMemoryOutputStream strm; wxImage img = bmp.ConvertToImage(); + if (img.HasAlpha()) + img.ConvertAlphaToMask(); img.SaveFile(strm, wxBITMAP_TYPE_XPM); size_t len = strm.GetSize(); char* buff = new char[len+1]; strm.CopyTo(buff, len); buff[len] = 0; - SendMsg(%s, markerNumber, (long)buff); + SendMsg(%s, markerNumber, (sptr_t)buff); delete [] buff; ''', ('Define a marker from a bitmap',)), @@ -209,13 +236,100 @@ methodOverrideMap = { 'GetMarginMaskN' : ('GetMarginMask', 0, 0, 0), 'SetMarginSensitiveN' : ('SetMarginSensitive', 0, 0, 0), 'GetMarginSensitiveN' : ('GetMarginSensitive', 0, 0, 0), + 'SetMarginCursorN' : ('SetMarginCursor', 0, 0, 0), + 'GetMarginCursorN' : ('GetMarginCursor', 0, 0, 0), + + 'MarginGetText' : + (0, + 'wxString %s(int line) const;', + + '''wxString %s(int line) const { + long msg = %s; + long len = SendMsg(msg, line, 0); + + wxMemoryBuffer mbuf(len+1); + char* buf = (char*)mbuf.GetWriteBuf(len+1); + SendMsg(msg, line, (sptr_t)buf); + mbuf.UngetWriteBuf(len); + mbuf.AppendByte(0); + return stc2wx(buf);''', + 0), + + 'MarginGetStyles' : + (0, + 'wxString %s(int line) const;', + + '''wxString %s(int line) const { + long msg = %s; + long len = SendMsg(msg, line, 0); + + wxMemoryBuffer mbuf(len+1); + char* buf = (char*)mbuf.GetWriteBuf(len+1); + SendMsg(msg, line, (sptr_t)buf); + mbuf.UngetWriteBuf(len); + mbuf.AppendByte(0); + return stc2wx(buf);''', + 0), + + 'SetAdditionalSelFore' : ('SetAdditionalSelForeground', 0, 0, 0), + 'SetAdditionalSelBack' : ('SetAdditionalSelBackground', 0, 0, 0), + 'SetAdditionalCaretFore' : ('SetAdditionalCaretForeground', 0, 0, 0), + 'GetAdditionalCaretFore' : ('GetAdditionalCaretForeground', 0, 0, 0), + + 'AnnotationGetText' : + (0, + 'wxString %s(int line) const;', + + '''wxString %s(int line) const { + long msg = %s; + long len = SendMsg(msg, line, 0); + + wxMemoryBuffer mbuf(len+1); + char* buf = (char*)mbuf.GetWriteBuf(len+1); + SendMsg(msg, line, (sptr_t)buf); + mbuf.UngetWriteBuf(len); + mbuf.AppendByte(0); + return stc2wx(buf);''', + 0), + + 'AnnotationGetStyles' : + (0, + 'wxString %s(int line) const;', + + '''wxString %s(int line) const { + long msg = %s; + long len = SendMsg(msg, line, 0); + + wxMemoryBuffer mbuf(len+1); + char* buf = (char*)mbuf.GetWriteBuf(len+1); + SendMsg(msg, line, (sptr_t)buf); + mbuf.UngetWriteBuf(len); + mbuf.AppendByte(0); + return stc2wx(buf);''', + 0), + 'StyleGetFore' : ('StyleGetForeground', 0, 0, 0), + 'StyleGetBack' : ('StyleGetBackground', 0, 0, 0), 'StyleSetFore' : ('StyleSetForeground', 0, 0, 0), 'StyleSetBack' : ('StyleSetBackground', 0, 0, 0), 'SetSelFore' : ('SetSelForeground', 0, 0, 0), 'SetSelBack' : ('SetSelBackground', 0, 0, 0), 'SetCaretFore' : ('SetCaretForeground', 0, 0, 0), + 'StyleGetFont' : + ('StyleGetFaceName', + 'wxString %s(int style);', + '''wxString %s(int style) { + long msg = %s; + long len = SendMsg(msg, style, 0); + wxMemoryBuffer mbuf(len+1); + char* buf = (char*)mbuf.GetWriteBuf(len+1); + SendMsg(msg, style, (sptr_t)buf); + mbuf.UngetWriteBuf(len); + mbuf.AppendByte(0); + return stc2wx(buf);''', + ('Get the font facename of a style',)), 'StyleSetFont' : ('StyleSetFaceName', 0, 0, 0), + 'StyleSetCharacterSet' : (None, 0, 0, 0), 'AssignCmdKey' : ('CmdKeyAssign', @@ -242,14 +356,20 @@ methodOverrideMap = { 'void %s(int length, char* styleBytes);', '''void %s(int length, char* styleBytes) { - SendMsg(%s, length, (long)styleBytes);''', + SendMsg(%s, length, (sptr_t)styleBytes);''', 0), + 'IndicSetAlpha' : ('IndicatorSetAlpha', 0, 0, 0), + 'IndicGetAlpha' : ('IndicatorGetAlpha', 0, 0, 0), + 'IndicSetOutlineAlpha' : ('IndicatorSetOutlineAlpha', 0, 0, 0), + 'IndicGetOutlineAlpha' : ('IndicatorGetOutlineAlpha', 0, 0, 0), 'IndicSetStyle' : ('IndicatorSetStyle', 0, 0, 0), 'IndicGetStyle' : ('IndicatorGetStyle', 0, 0, 0), 'IndicSetFore' : ('IndicatorSetForeground', 0, 0, 0), 'IndicGetFore' : ('IndicatorGetForeground', 0, 0, 0), + 'IndicSetUnder': ('IndicatorSetUnder', 0, 0, 0), + 'IndicGetUnder': ('IndicatorGetUnder', 0, 0, 0), 'SetWhitespaceFore' : ('SetWhitespaceForeground', 0, 0, 0), 'SetWhitespaceBack' : ('SetWhitespaceBackground', 0, 0, 0), @@ -277,6 +397,14 @@ methodOverrideMap = { 'AutoCGetTypeSeparator' : ('AutoCompGetTypeSeparator', 0, 0, 0), 'AutoCSetTypeSeparator' : ('AutoCompSetTypeSeparator', 0, 0, 0), 'AutoCGetCurrent' : ('AutoCompGetCurrent', 0, 0, 0), + 'AutoCGetCurrentText' : (None, 0, 0, 0), + 'AutoCSetMaxWidth' : ('AutoCompSetMaxWidth', 0, 0, 0), + 'AutoCGetMaxWidth' : ('AutoCompGetMaxWidth', 0, 0, 0), + 'AutoCSetMaxHeight' : ('AutoCompSetMaxHeight', 0, 0, 0), + 'AutoCGetMaxHeight' : ('AutoCompGetMaxHeight', 0, 0, 0), + 'AutoCGetMaxHeight' : ('AutoCompGetMaxHeight', 0, 0, 0), + 'AutoCSetCaseInsensitiveBehaviour' : ('AutoCompSetCaseInsensitiveBehaviour', 0, 0, 0), + 'AutoCGetCaseInsensitiveBehaviour' : ('AutoCompGetCaseInsensitiveBehaviour', 0, 0, 0), 'RegisterImage' : (0, @@ -285,12 +413,14 @@ methodOverrideMap = { // convert bmp to a xpm in a string wxMemoryOutputStream strm; wxImage img = bmp.ConvertToImage(); + if (img.HasAlpha()) + img.ConvertAlphaToMask(); img.SaveFile(strm, wxBITMAP_TYPE_XPM); size_t len = strm.GetSize(); char* buff = new char[len+1]; strm.CopyTo(buff, len); buff[len] = 0; - SendMsg(%s, type, (long)buff); + SendMsg(%s, type, (sptr_t)buff); delete [] buff; ''', ('Register an image for use in autocompletion lists.',)), @@ -320,10 +450,10 @@ methodOverrideMap = { TextToFind ft; ft.chrg.cpMin = minPos; ft.chrg.cpMax = maxPos; - wxWX2MBbuf buf = (wxWX2MBbuf)wx2stc(text); + const wxWX2MBbuf buf = wx2stc(text); ft.lpstrText = (char*)(const char*)buf; - return SendMsg(%s, flags, (long)&ft);''', + return SendMsg(%s, flags, (sptr_t)&ft);''', 0), 'FormatRange' : @@ -332,14 +462,14 @@ methodOverrideMap = { int startPos, int endPos, wxDC* draw, - wxDC* target, + wxDC* target, wxRect renderRect, wxRect pageRect);''', ''' int %s(bool doDraw, int startPos, int endPos, wxDC* draw, - wxDC* target, + wxDC* target, wxRect renderRect, wxRect pageRect) { RangeToFormat fr; @@ -362,44 +492,40 @@ methodOverrideMap = { fr.chrg.cpMin = startPos; fr.chrg.cpMax = endPos; - return SendMsg(%s, doDraw, (long)&fr);''', + return SendMsg(%s, doDraw, (sptr_t)&fr);''', 0), 'GetLine' : (0, - 'wxString %s(int line);', + 'wxString %s(int line) const;', - '''wxString %s(int line) { + '''wxString %s(int line) const { int len = LineLength(line); if (!len) return wxEmptyString; wxMemoryBuffer mbuf(len+1); char* buf = (char*)mbuf.GetWriteBuf(len+1); - SendMsg(%s, line, (long)buf); + SendMsg(%s, line, (sptr_t)buf); mbuf.UngetWriteBuf(len); mbuf.AppendByte(0); return stc2wx(buf);''', ('Retrieve the contents of a line.',)), - 'SetSel' : ('SetSelection', 0, 0, 0), + 'SetSel' : (None, 0,0,0), #'SetSelection', 0, 0, 0), 'GetSelText' : ('GetSelectedText', 'wxString %s();', '''wxString %s() { - int start; - int end; - - GetSelection(&start, &end); - int len = end - start; + const int len = SendMsg(SCI_GETSELTEXT, 0, (sptr_t)0); if (!len) return wxEmptyString; wxMemoryBuffer mbuf(len+2); char* buf = (char*)mbuf.GetWriteBuf(len+1); - SendMsg(%s, 0, (long)buf); + SendMsg(%s, 0, (sptr_t)buf); mbuf.UngetWriteBuf(len); mbuf.AppendByte(0); return stc2wx(buf);''', @@ -425,7 +551,7 @@ methodOverrideMap = { tr.lpstrText = buf; tr.chrg.cpMin = startPos; tr.chrg.cpMax = endPos; - SendMsg(%s, 0, (long)&tr); + SendMsg(%s, 0, (sptr_t)&tr); mbuf.UngetWriteBuf(len); mbuf.AppendByte(0); return stc2wx(buf);''', @@ -441,13 +567,13 @@ methodOverrideMap = { 'GetText' : (0, - 'wxString %s();', + 'wxString %s() const;', - '''wxString %s() { + '''wxString %s() const { int len = GetTextLength(); wxMemoryBuffer mbuf(len+1); // leave room for the null... char* buf = (char*)mbuf.GetWriteBuf(len+1); - SendMsg(%s, len+1, (long)buf); + SendMsg(%s, len+1, (sptr_t)buf); mbuf.UngetWriteBuf(len); mbuf.AppendByte(0); return stc2wx(buf);''', @@ -465,7 +591,11 @@ methodOverrideMap = { 'SetHotspotActiveFore' : ('SetHotspotActiveForeground', 0, 0, 0), 'SetHotspotActiveBack' : ('SetHotspotActiveBackground', 0, 0, 0), + 'GetHotspotActiveFore' : ('GetHotspotActiveForeground', 0, 0, 0), + 'GetHotspotActiveBack' : ('GetHotspotActiveBackground', 0, 0, 0), + 'GetCaretLineBack' : ('GetCaretLineBackground', 0, 0, 0), + 'SetCaretLineBack' : ('SetCaretLineBackground', 0, 0, 0), 'ReplaceTarget' : (0, @@ -473,8 +603,8 @@ methodOverrideMap = { ''' int %s(const wxString& text) { - wxWX2MBbuf buf = (wxWX2MBbuf)wx2stc(text); - return SendMsg(%s, strlen(buf), (long)(const char*)buf);''', + const wxWX2MBbuf buf = wx2stc(text); + return SendMsg(%s, wx2stclen(text, buf), (sptr_t)(const char*)buf);''', 0), 'ReplaceTargetRE' : @@ -483,8 +613,8 @@ methodOverrideMap = { ''' int %s(const wxString& text) { - wxWX2MBbuf buf = (wxWX2MBbuf)wx2stc(text); - return SendMsg(%s, strlen(buf), (long)(const char*)buf);''', + const wxWX2MBbuf buf = wx2stc(text); + return SendMsg(%s, wx2stclen(text, buf), (sptr_t)(const char*)buf);''', 0), 'SearchInTarget' : @@ -493,10 +623,53 @@ methodOverrideMap = { ''' int %s(const wxString& text) { - wxWX2MBbuf buf = (wxWX2MBbuf)wx2stc(text); - return SendMsg(%s, strlen(buf), (long)(const char*)buf);''', + const wxWX2MBbuf buf = wx2stc(text); + return SendMsg(%s, wx2stclen(text, buf), (sptr_t)(const char*)buf);''', 0), + # not sure what to do about these yet + 'TargetAsUTF8' : ( None, 0, 0, 0), + 'SetLengthForEncode' : ( None, 0, 0, 0), + 'EncodedFromUTF8' : ( None, 0, 0, 0), + + + 'GetProperty' : + (0, + 'wxString %s(const wxString& key);', + + '''wxString %s(const wxString& key) { + int len = SendMsg(SCI_GETPROPERTY, (sptr_t)(const char*)wx2stc(key), 0); + if (!len) return wxEmptyString; + + wxMemoryBuffer mbuf(len+1); + char* buf = (char*)mbuf.GetWriteBuf(len+1); + SendMsg(%s, (uptr_t)(const char*)wx2stc(key), (sptr_t)buf); + mbuf.UngetWriteBuf(len); + mbuf.AppendByte(0); + return stc2wx(buf);''', + ("Retrieve a 'property' value previously set with SetProperty.",)), + + 'GetPropertyExpanded' : + (0, + 'wxString %s(const wxString& key);', + + '''wxString %s(const wxString& key) { + int len = SendMsg(SCI_GETPROPERTYEXPANDED, (uptr_t)(const char*)wx2stc(key), 0); + if (!len) return wxEmptyString; + + wxMemoryBuffer mbuf(len+1); + char* buf = (char*)mbuf.GetWriteBuf(len+1); + SendMsg(%s, (uptr_t)(const char*)wx2stc(key), (sptr_t)buf); + mbuf.UngetWriteBuf(len); + mbuf.AppendByte(0); + return stc2wx(buf);''', + ("Retrieve a 'property' value previously set with SetProperty,", + "with '$()' variable replacement on returned buffer.")), + + 'GetPropertyInt' : (0, 0, 0, + ("Retrieve a 'property' value previously set with SetProperty,", + "interpreted as an int AFTER any '$()' variable replacement.")), + 'GetDocPointer' : (0, @@ -509,7 +682,7 @@ methodOverrideMap = { (0, 'void %s(void* docPointer);', '''void %s(void* docPointer) { - SendMsg(%s, 0, (long)docPointer);''', + SendMsg(%s, 0, (sptr_t)docPointer);''', 0), 'CreateDocument' : @@ -523,14 +696,14 @@ methodOverrideMap = { (0, 'void %s(void* docPointer);', '''void %s(void* docPointer) { - SendMsg(%s, 0, (long)docPointer);''', + SendMsg(%s, 0, (sptr_t)docPointer);''', 0), 'ReleaseDocument' : (0, 'void %s(void* docPointer);', '''void %s(void* docPointer) { - SendMsg(%s, 0, (long)docPointer);''', + SendMsg(%s, 0, (sptr_t)docPointer);''', 0), 'SetCodePage' : @@ -550,7 +723,7 @@ methodOverrideMap = { 'GrabFocus' : (None, 0, 0, 0), - # Rename some that woudl otherwise hid the wxWindow methods + # Rename some that would otherwise hide the wxWindow methods 'SetFocus' : ('SetSTCFocus', 0, 0, 0), 'GetFocus' : ('GetSTCFocus', 0, 0, 0), 'SetCursor' : ('SetSTCCursor', 0, 0, 0), @@ -558,90 +731,210 @@ methodOverrideMap = { 'LoadLexerLibrary' : (None, 0,0,0), + 'SetPositionCache' : ('SetPositionCacheSize', 0, 0, 0), + 'GetPositionCache' : ('GetPositionCacheSize', 0, 0, 0), + + 'GetLexerLanguage' : (None, 0, 0, 0), + 'SetFontQuality' : (None, 0, 0, 0), + 'GetFontQuality' : (None, 0, 0, 0), + 'SetSelection' : (None, 0, 0, 0), + + 'GetCharacterPointer' : (0, + 'const char* %s() const;', + 'const char* %s() const {\n' + ' return (const char*)SendMsg(%s, 0, 0);', + 0), + + 'GetRangePointer' : (0, + 'const char* %s(int position, int rangeLength) const;', + 'const char* %s(int position, int rangeLength) const {\n' + ' return (const char*)SendMsg(%s, position, rangeLength);', + 0), + + + 'GetWordChars' : + (0, + 'wxString %s() const;', + + '''wxString %s() const { + int msg = %s; + int len = SendMsg(msg, 0, (sptr_t)NULL); + if (!len) return wxEmptyString; + + wxMemoryBuffer mbuf(len+1); + char* buf = (char*)mbuf.GetWriteBuf(len+1); + SendMsg(msg, 0, (sptr_t)buf); + mbuf.UngetWriteBuf(len); + mbuf.AppendByte(0); + return stc2wx(buf);''', + + ('Get the set of characters making up words for when moving or selecting by word.',)), + + 'GetTag' : + (0, + 'wxString %s(int tagNumber) const;', + + '''wxString %s(int tagNumber) const { + int msg = %s; + int len = SendMsg(msg, tagNumber, (sptr_t)NULL); + if (!len) return wxEmptyString; + + wxMemoryBuffer mbuf(len+1); + char* buf = (char*)mbuf.GetWriteBuf(len+1); + SendMsg(msg, tagNumber, (sptr_t)buf); + mbuf.UngetWriteBuf(len); + mbuf.AppendByte(0); + return stc2wx(buf);''', + 0), + + 'GetWhitespaceChars' : + (0, + 'wxString %s() const;', + + '''wxString %s() const { + int msg = %s; + int len = SendMsg(msg, 0, (sptr_t)NULL); + if (!len) return wxEmptyString; + + wxMemoryBuffer mbuf(len+1); + char* buf = (char*)mbuf.GetWriteBuf(len+1); + SendMsg(msg, 0, (sptr_t)buf); + mbuf.UngetWriteBuf(len); + mbuf.AppendByte(0); + return stc2wx(buf);''', + 0), + + + 'GetPunctuationChars' : + (0, + 'wxString %s() const;', + + '''wxString %s() const { + int msg = %s; + int len = SendMsg(msg, 0, (sptr_t)NULL); + if (!len) return wxEmptyString; + + wxMemoryBuffer mbuf(len+1); + char* buf = (char*)mbuf.GetWriteBuf(len+1); + SendMsg(msg, 0, (sptr_t)buf); + mbuf.UngetWriteBuf(len); + mbuf.AppendByte(0); + return stc2wx(buf);''', + 0), + + + 'PropertyNames' : + (0, + 'wxString %s() const;', + + '''wxString %s() const { + int msg = %s; + int len = SendMsg(msg, 0, (sptr_t)NULL); + if (!len) return wxEmptyString; + + wxMemoryBuffer mbuf(len+1); + char* buf = (char*)mbuf.GetWriteBuf(len+1); + SendMsg(msg, 0, (sptr_t)buf); + mbuf.UngetWriteBuf(len); + mbuf.AppendByte(0); + return stc2wx(buf);''', + 0), + + + + 'DescribeProperty' : + (0, + 'wxString %s(const wxString& name) const;', + + '''wxString %s(const wxString& name) const { + int msg = %s; + int len = SendMsg(msg, (sptr_t)(const char*)wx2stc(name), (sptr_t)NULL); + if (!len) return wxEmptyString; + + wxMemoryBuffer mbuf(len+1); + char* buf = (char*)mbuf.GetWriteBuf(len+1); + SendMsg(msg, (sptr_t)(const char*)wx2stc(name), (sptr_t)buf); + mbuf.UngetWriteBuf(len); + mbuf.AppendByte(0); + return stc2wx(buf);''', + 0), + + + + 'DescribeKeyWordSets' : + (0, + 'wxString %s() const;', + + '''wxString %s() const { + int msg = %s; + int len = SendMsg(msg, 0, (sptr_t)NULL); + if (!len) return wxEmptyString; + + wxMemoryBuffer mbuf(len+1); + char* buf = (char*)mbuf.GetWriteBuf(len+1); + SendMsg(msg, 0, (sptr_t)buf); + mbuf.UngetWriteBuf(len); + mbuf.AppendByte(0); + return stc2wx(buf);''', + 0), + + + 'MarkerDefineRGBAImage' : + (0, + 'void %s(int markerNumber, const unsigned char* pixels);', + '''void %s(int markerNumber, const unsigned char* pixels) { + SendMsg(%s, markerNumber, (sptr_t)pixels);''', + 0), + + + 'RegisterRGBAImage' : + (0, + 'void %s(int type, const unsigned char* pixels);', + '''void %s(int type, const unsigned char* pixels) { + SendMsg(%s, type, (sptr_t)pixels);''', + 0), + + # I think these are only available on the native OSX backend, so + # don't add them to the wx API... + 'FindIndicatorShow' : (None, 0,0,0), + 'FindIndicatorFlash' : (None, 0,0,0), + 'FindIndicatorHide' : (None, 0,0,0), - # Remove all methods that are key commands since they can be - # executed with CmdKeyExecute - 'LineDown' : (None, 0, 0, 0), - 'LineDownExtend' : (None, 0, 0, 0), - 'LineUp' : (None, 0, 0, 0), - 'LineUpExtend' : (None, 0, 0, 0), - 'CharLeft' : (None, 0, 0, 0), - 'CharLeftExtend' : (None, 0, 0, 0), - 'CharRight' : (None, 0, 0, 0), - 'CharRightExtend' : (None, 0, 0, 0), - 'WordLeft' : (None, 0, 0, 0), - 'WordLeftExtend' : (None, 0, 0, 0), - 'WordRight' : (None, 0, 0, 0), - 'WordRightExtend' : (None, 0, 0, 0), - 'Home' : (None, 0, 0, 0), - 'HomeExtend' : (None, 0, 0, 0), - 'LineEnd' : (None, 0, 0, 0), - 'LineEndExtend' : (None, 0, 0, 0), - 'DocumentStart' : (None, 0, 0, 0), - 'DocumentStartExtend' : (None, 0, 0, 0), - 'DocumentEnd' : (None, 0, 0, 0), - 'DocumentEndExtend' : (None, 0, 0, 0), - 'PageUp' : (None, 0, 0, 0), - 'PageUpExtend' : (None, 0, 0, 0), - 'PageDown' : (None, 0, 0, 0), - 'PageDownExtend' : (None, 0, 0, 0), - 'EditToggleOvertype' : (None, 0, 0, 0), - 'Cancel' : (None, 0, 0, 0), - 'DeleteBack' : (None, 0, 0, 0), - 'Tab' : (None, 0, 0, 0), - 'BackTab' : (None, 0, 0, 0), - 'NewLine' : (None, 0, 0, 0), - 'FormFeed' : (None, 0, 0, 0), - 'VCHome' : (None, 0, 0, 0), - 'VCHomeExtend' : (None, 0, 0, 0), - 'ZoomIn' : (None, 0, 0, 0), - 'ZoomOut' : (None, 0, 0, 0), - 'DelWordLeft' : (None, 0, 0, 0), - 'DelWordRight' : (None, 0, 0, 0), - 'LineCut' : (None, 0, 0, 0), - 'LineDelete' : (None, 0, 0, 0), - 'LineTranspose' : (None, 0, 0, 0), - 'LowerCase' : (None, 0, 0, 0), - 'UpperCase' : (None, 0, 0, 0), - 'LineScrollDown' : (None, 0, 0, 0), - 'LineScrollUp' : (None, 0, 0, 0), - 'DeleteBackNotLine' : (None, 0, 0, 0), - 'HomeWrap' : (None, 0, 0, 0), - 'HomeWrapExtend' : (None, 0, 0, 0), - 'LineEndWrap' : (None, 0, 0, 0), - 'LineEndWrapExtend' : (None, 0, 0, 0), - 'VCHomeWrap' : (None, 0, 0, 0), - 'VCHomeWrapExtend' : (None, 0, 0, 0), - 'ParaDown' : (None, 0, 0, 0), - 'ParaDownExtend' : (None, 0, 0, 0), - 'ParaUp' : (None, 0, 0, 0), - 'ParaUpExtend' : (None, 0, 0, 0), - 'LineDownRectExtend' : (None, 0, 0, 0), - 'LineUpRectExtend' : (None, 0, 0, 0), - 'CharLeftRectExtend' : (None, 0, 0, 0), - 'CharRightRectExtend' : (None, 0, 0, 0), - 'HomeRectExtend' : (None, 0, 0, 0), - 'VCHomeRectExtend' : (None, 0, 0, 0), - 'LineEndRectExtend' : (None, 0, 0, 0), - 'PageUpRectExtend' : (None, 0, 0, 0), - 'PageDownRectExtend' : (None, 0, 0, 0), - 'StutteredPageUp' : (None, 0, 0, 0), - 'StutteredPageUpExtend' : (None, 0, 0, 0), - 'StutteredPageDown' : (None, 0, 0, 0), - 'StutteredPageDownExtend' : (None, 0, 0, 0), - 'WordLeftEnd' : (None, 0, 0, 0), - 'WordLeftEndExtend' : (None, 0, 0, 0), - 'WordRightEnd' : (None, 0, 0, 0), - 'WordRightEndExtend' : (None, 0, 0, 0), + 'CreateLoader' : + (0, + 'void* %s(int bytes) const;', + """void* %s(int bytes) const { + return (void*)(sptr_t)SendMsg(%s, bytes); """, + 0), + 'PrivateLexerCall' : + (0, + 'void* %s(int operation, void* pointer);', + """void* %s(int operation, void* pointer) { + return (void*)(sptr_t)SendMsg(%s, operation, (sptr_t)pointer); """, + 0), + '' : ('', 0, 0, 0), } +# all Scintilla getters are transformed into const member of wxSTC class but +# some non-getter methods are also logically const and this set contains their +# names (notice that it's useless to include here methods manually overridden +# above) +constNonGetterMethods = ( + 'LineFromPosition', + 'PositionFromLine', + 'LineLength', + 'CanPaste', + 'CanRedo', + 'CanUndo', +) + #---------------------------------------------------------------------------- -def processIface(iface, h_tmplt, cpp_tmplt, h_dest, cpp_dest): +def processIface(iface, h_tmplt, cpp_tmplt, ih_tmplt, h_dest, cpp_dest, docstr_dest, ih_dest): curDocStrings = [] values = [] methods = [] @@ -664,11 +957,11 @@ def processIface(iface, h_tmplt, cpp_tmplt, h_dest, cpp_dest): curDocStrings = [] elif op == 'fun ' or op == 'set ' or op == 'get ': - parseFun(line[4:], methods, curDocStrings, cmds) + parseFun(line[4:], methods, curDocStrings, cmds, op == 'get ') curDocStrings = [] elif op == 'cat ': - if string.strip(line[4:]) == 'Deprecated': + if line[4:].strip() == 'Deprecated': break # skip the rest of the file elif op == 'evt ': @@ -681,30 +974,38 @@ def processIface(iface, h_tmplt, cpp_tmplt, h_dest, cpp_dest): pass else: - print '***** Unknown line type: ', line + print('***** Unknown line type: %s' % line) # process templates data = {} data['VALUES'] = processVals(values) data['CMDS'] = processVals(cmds) - defs, imps = processMethods(methods) + defs, imps, docstrings, idefs = processMethods(methods) data['METHOD_DEFS'] = defs + data['METHOD_IDEFS'] = idefs data['METHOD_IMPS'] = imps # get template text h_text = open(h_tmplt).read() + ih_text = open(ih_tmplt).read() cpp_text = open(cpp_tmplt).read() # do the substitutions h_text = h_text % data cpp_text = cpp_text % data + ih_text = ih_text % data # write out destination files open(h_dest, 'w').write(h_text) open(cpp_dest, 'w').write(cpp_text) + if docstr_dest: + open(docstr_dest, 'w').write(docstrings) + open(ih_dest, 'w').write(ih_text) +def joinWithNewLines(values): + return '\n'.join(values) #---------------------------------------------------------------------------- @@ -714,17 +1015,19 @@ def processVals(values): if docs: text.append('') for x in docs: - text.append('// ' + x) + text.append('/// ' + x) text.append('#define %s %s' % (name, value)) - return string.join(text, '\n') + return joinWithNewLines(text) #---------------------------------------------------------------------------- def processMethods(methods): defs = [] + idefs = [] imps = [] + dstr = [] - for retType, name, number, param1, param2, docs in methods: + for retType, name, number, param1, param2, docs, is_const in methods: retType = retTypeMap.get(retType, retType) params = makeParamString(param1, param2) @@ -733,23 +1036,45 @@ def processMethods(methods): if name is None: continue + # Build docstrings + st = 'DocStr(wxStyledTextCtrl::%s,\n' \ + '"%s", "");\n' % (name, joinWithNewLines(docs)) + dstr.append(st) + # Build the method definition for the .h file if docs: defs.append('') for x in docs: defs.append(' // ' + x) if not theDef: - theDef = ' %s %s(%s);' % (retType, name, params) + theDef = ' %s %s(%s)' % (retType, name, params) + if is_const: + theDef = theDef + ' const' + theDef = theDef + ';' defs.append(theDef) + # Build the method definition for the interface .h file + if docs: + idefs.append('') + idefs.append(' /**') + for x in docs: + idefs.append(' ' + x) + idefs.append(' */') + if name == 'GetCurLine': + idefs.append(' wxString GetCurLine(int* linePos=NULL);') + else: + idefs.append(theDef) + # Build the method implementation string if docs: imps.append('') for x in docs: imps.append('// ' + x) if not theImp: - theImp = '%s wxStyledTextCtrl::%s(%s) {\n ' % (retType, name, params) - + theImp = '%s wxStyledTextCtrl::%s(%s)' % (retType, name, params) + if is_const: + theImp = theImp + ' const' + theImp = theImp + '\n{\n ' if retType == 'wxColour': theImp = theImp + 'long c = ' elif retType != 'void': @@ -766,14 +1091,14 @@ def processMethods(methods): imps.append(theImp) - return string.join(defs, '\n'), string.join(imps, '\n') + return joinWithNewLines(defs), joinWithNewLines(imps), joinWithNewLines(dstr), joinWithNewLines(idefs) #---------------------------------------------------------------------------- def checkMethodOverride(name, number, docs): theDef = theImp = None - if methodOverrideMap.has_key(name): + if name in methodOverrideMap: item = methodOverrideMap[name] try: @@ -786,7 +1111,7 @@ def checkMethodOverride(name, number, docs): if item[3] != 0: docs = item[3] except: - print "*************", name + print("************* " + name) raise return name, theDef, theImp, docs @@ -800,7 +1125,7 @@ def makeArgString(param): typ, name = param if typ == 'string': - return '(long)(const char*)wx2stc(%s)' % name + return '(sptr_t)(const char*)wx2stc(%s)' % name if typ == 'colour': return 'wxColourAsLong(%s)' % name @@ -826,7 +1151,7 @@ def makeParamString(param1, param2): #---------------------------------------------------------------------------- def parseVal(line, values, docs): - name, val = string.split(line, '=') + name, val = line.split('=') # remove prefixes such as SCI, etc. for old, new in valPrefixes: @@ -845,20 +1170,20 @@ funregex = re.compile(r'\s*([a-zA-Z0-9_]+)' # return type '\s+([a-zA-Z0-9_]+)=' # name= '([0-9]+)' # number '\(([ a-zA-Z0-9_]*),' # (param, - '([ a-zA-Z0-9_]*)\)') # param) + '([ a-zA-Z0-9_]*),*\)') # param) -def parseFun(line, methods, docs, values): +def parseFun(line, methods, docs, values, is_const): def parseParam(param): - param = string.strip(param) + param = param.strip() if param == '': param = None else: - param = tuple(string.split(param)) + param = tuple(param.split()) return param mo = funregex.match(line) if mo is None: - print "***** Line doesn't match! : " + line + print("***** Line doesn't match! : %s" % line) retType, name, number, param1, param2 = mo.groups() @@ -866,14 +1191,18 @@ def parseFun(line, methods, docs, values): param2 = parseParam(param2) # Special case. For the key command functions we want a value defined too - num = string.atoi(number) + num = int(number) for v in cmdValues: if (type(v) == type(()) and v[0] <= num <= v[1]) or v == num: - parseVal('CMD_%s=%s' % (string.upper(name), number), values, docs) + parseVal('CMD_%s=%s' % (name.upper(), number), values, docs) - #if retType == 'void' and not param1 and not param2: + # if we are not also doing a function for CMD values, then + # just return, otherwise fall through to the append blow. + if not FUNC_FOR_CMD: + return - methods.append( (retType, name, number, param1, param2, tuple(docs)) ) + methods.append( (retType, name, number, param1, param2, tuple(docs), + is_const or name in constNonGetterMethods) ) #---------------------------------------------------------------------------- @@ -882,8 +1211,12 @@ def parseFun(line, methods, docs, values): def main(args): # TODO: parse command line args to replace default input/output files??? + if not os.path.exists(IFACE): + print('Please run this script from src/stc subdirectory.') + sys.exit(1) + # Now just do it - processIface(IFACE, H_TEMPLATE, CPP_TEMPLATE, H_DEST, CPP_DEST) + processIface(IFACE, H_TEMPLATE, CPP_TEMPLATE, IH_TEMPLATE, H_DEST, CPP_DEST, DOCSTR_DEST, IH_DEST)