def run(): # Parse the XML file(s) building a collection of Extractor objects module = etgtools.ModuleDef(PACKAGE, MODULE, NAME, DOCSTRING) etgtools.parseDoxyXML(module, ITEMS) module.check4unittest = False #----------------------------------------------------------------- # Tweak the parsed meta objects in the module object as needed for # customizing the generated code and docstrings. module.addHeaderCode('#include <wxpy_api.h>') module.addImport('_core') module.addPyCode('''\ import wx ID_ANY = wx.ID_ANY # Needed for some parameter defaults in this module ''', order=10) module.addInclude(INCLUDES) #----------------------------------------------------------------- module.addHeaderCode('#include <wx/stc/stc.h>') module.addHeaderCode('#include "wxpybuffer.h"') c = module.find('wxStyledTextCtrl') assert isinstance(c, etgtools.ClassDef) c.bases = ['wxControl'] # wxTextCtrlIface is also a base... c.piBases = ['wx.Control', 'wx.TextEntry'] tools.fixWindowClass(c, False) module.addGlobalStr('wxSTCNameStr', c) c.find('GetCurLine.linePos').out = True c.find('GetCurLineRaw.linePos').out = True for name in ['Remove', 'Replace', 'SetSelection', 'GetSelection']: m = c.find(name) m.find('from').name = 'from_' m.find('to').name = 'to_' c.find('GetSelection.from_').out = True c.find('GetSelection.to_').out = True c.find('PositionToXY.x').out = True c.find('PositionToXY.y').out = True # Split the HitTest overloads into separately named methods since once # the output parameters are applied they will have the same function # signature. ht1 = c.find('HitTest') ht2 = ht1.overloads[0] ht1.overloads = [] c.insertItemAfter(ht1, ht2) ht1.pyName = 'HitTestPos' ht1.find('pos').out = True ht2.find('row').out = True ht2.find('col').out = True # Replace the *Pointer methods with ones that return a memoryview object instead. c.find('GetCharacterPointer').ignore() c.addCppMethod('PyObject*', 'GetCharacterPointer', '()', doc="""\ Compact the document buffer and return a read-only memoryview object of the characters in the document.""", body=""" const char* ptr = self->GetCharacterPointer(); Py_ssize_t len = self->GetLength(); PyObject* rv; wxPyBLOCK_THREADS( rv = wxPyMakeBuffer((void*)ptr, len, true) ); return rv; """) c.find('GetRangePointer').ignore() c.addCppMethod('PyObject*', 'GetRangePointer', '(int position, int rangeLength)', doc="""\ Return a read-only pointer to a range of characters in the document. May move the gap so that the range is contiguous, but will only move up to rangeLength bytes.""", body=""" const char* ptr = self->GetRangePointer(position, rangeLength); Py_ssize_t len = rangeLength; PyObject* rv; wxPyBLOCK_THREADS( rv = wxPyMakeBuffer((void*)ptr, len, true) ); return rv; """) # Generate the code for this differently because it needs to be # forcibly mashed into an int in the C code module.find('wxSTC_MASK_FOLDERS').forcedInt = True # Make sure that all the methods from wxTextEntry and wxTextCtrl are # included. This is needed because we are pretending that this class only # derives from wxControl but the real C++ class also derives from # wxTextCtrlIface which derives from wxTextEntryBase. import textentry mod = textentry.parseAndTweakModule() klass = mod.find('wxTextEntry') items = [ item for item in klass.items if isinstance(item, etgtools.MethodDef) and not item.isCtor and not item.isDtor and not c.findItem(item.name) ] c.items.extend(items) import textctrl mod = textctrl.parseAndTweakModule() klass = mod.find('wxTextCtrl') items = [ item for item in klass.items if isinstance(item, etgtools.MethodDef) and not item.isCtor and not item.isDtor and not c.findItem(item.name) ] c.items.extend(items) c.find('EmulateKeyPress').ignore() c.find('IsMultiLine').ignore() c.find('IsSingleLine').ignore() c.find('MacCheckSpelling').ignore() c.find('ShowNativeCaret').ignore() c.find('HideNativeCaret').ignore() # Change the *RGBAImage methods to accept any buffer object c.find('MarkerDefineRGBAImage').ignore() c.addCppMethod('void', 'MarkerDefineRGBAImage', '(int markerNumber, wxPyBuffer* pixels)', doc="""\ Define a marker from RGBA data.\n It has the width and height from RGBAImageSetWidth/Height. You must ensure that the buffer is at least width*height*4 bytes long. """, body="""\ self->MarkerDefineRGBAImage(markerNumber, (unsigned char*)pixels->m_ptr); """) c.find('RegisterRGBAImage').ignore() c.addCppMethod('void', 'RegisterRGBAImage', '(int type, wxPyBuffer* pixels)', doc="""\ Register an RGBA image for use in autocompletion lists.\n It has the width and height from RGBAImageSetWidth/Height. You must ensure that the buffer is at least width*height*4 bytes long. """, body="""\ self->RegisterRGBAImage(type, (unsigned char*)pixels->m_ptr); """) # TODO: Add the UTF8 PyMethods from classic (see _stc_utf8_methods.py) #----------------------------------------------------------------- c = module.find('wxStyledTextEvent') tools.fixEventClass(c) module.addPyCode("""\ EVT_STC_CHANGE = wx.PyEventBinder( wxEVT_STC_CHANGE, 1 ) EVT_STC_STYLENEEDED = wx.PyEventBinder( wxEVT_STC_STYLENEEDED, 1 ) EVT_STC_CHARADDED = wx.PyEventBinder( wxEVT_STC_CHARADDED, 1 ) EVT_STC_SAVEPOINTREACHED = wx.PyEventBinder( wxEVT_STC_SAVEPOINTREACHED, 1 ) EVT_STC_SAVEPOINTLEFT = wx.PyEventBinder( wxEVT_STC_SAVEPOINTLEFT, 1 ) EVT_STC_ROMODIFYATTEMPT = wx.PyEventBinder( wxEVT_STC_ROMODIFYATTEMPT, 1 ) EVT_STC_KEY = wx.PyEventBinder( wxEVT_STC_KEY, 1 ) EVT_STC_DOUBLECLICK = wx.PyEventBinder( wxEVT_STC_DOUBLECLICK, 1 ) EVT_STC_UPDATEUI = wx.PyEventBinder( wxEVT_STC_UPDATEUI, 1 ) EVT_STC_MODIFIED = wx.PyEventBinder( wxEVT_STC_MODIFIED, 1 ) EVT_STC_MACRORECORD = wx.PyEventBinder( wxEVT_STC_MACRORECORD, 1 ) EVT_STC_MARGINCLICK = wx.PyEventBinder( wxEVT_STC_MARGINCLICK, 1 ) EVT_STC_NEEDSHOWN = wx.PyEventBinder( wxEVT_STC_NEEDSHOWN, 1 ) EVT_STC_PAINTED = wx.PyEventBinder( wxEVT_STC_PAINTED, 1 ) EVT_STC_USERLISTSELECTION = wx.PyEventBinder( wxEVT_STC_USERLISTSELECTION, 1 ) EVT_STC_URIDROPPED = wx.PyEventBinder( wxEVT_STC_URIDROPPED, 1 ) EVT_STC_DWELLSTART = wx.PyEventBinder( wxEVT_STC_DWELLSTART, 1 ) EVT_STC_DWELLEND = wx.PyEventBinder( wxEVT_STC_DWELLEND, 1 ) EVT_STC_START_DRAG = wx.PyEventBinder( wxEVT_STC_START_DRAG, 1 ) EVT_STC_DRAG_OVER = wx.PyEventBinder( wxEVT_STC_DRAG_OVER, 1 ) EVT_STC_DO_DROP = wx.PyEventBinder( wxEVT_STC_DO_DROP, 1 ) EVT_STC_ZOOM = wx.PyEventBinder( wxEVT_STC_ZOOM, 1 ) EVT_STC_HOTSPOT_CLICK = wx.PyEventBinder( wxEVT_STC_HOTSPOT_CLICK, 1 ) EVT_STC_HOTSPOT_DCLICK = wx.PyEventBinder( wxEVT_STC_HOTSPOT_DCLICK, 1 ) EVT_STC_HOTSPOT_RELEASE_CLICK = wx.PyEventBinder( wxEVT_STC_HOTSPOT_RELEASE_CLICK, 1 ) EVT_STC_CALLTIP_CLICK = wx.PyEventBinder( wxEVT_STC_CALLTIP_CLICK, 1 ) EVT_STC_AUTOCOMP_SELECTION = wx.PyEventBinder( wxEVT_STC_AUTOCOMP_SELECTION, 1 ) EVT_STC_INDICATOR_CLICK = wx.PyEventBinder( wxEVT_STC_INDICATOR_CLICK, 1 ) EVT_STC_INDICATOR_RELEASE = wx.PyEventBinder( wxEVT_STC_INDICATOR_RELEASE, 1 ) EVT_STC_AUTOCOMP_CANCELLED = wx.PyEventBinder( wxEVT_STC_AUTOCOMP_CANCELLED, 1 ) EVT_STC_AUTOCOMP_CHAR_DELETED = wx.PyEventBinder( wxEVT_STC_AUTOCOMP_CHAR_DELETED, 1 ) """) #----------------------------------------------------------------- #----------------------------------------------------------------- tools.doCommonTweaks(module) tools.runGenerators(module)
def run(): # Parse the XML file(s) building a collection of Extractor objects module = etgtools.ModuleDef(PACKAGE, MODULE, NAME, DOCSTRING) etgtools.parseDoxyXML(module, ITEMS) #----------------------------------------------------------------- # Tweak the parsed meta objects in the module object as needed for # customizing the generated code and docstrings. module.addHeaderCode('#include <wx/srchctrl.h>') c = module.find('wxSearchCtrl') assert isinstance(c, etgtools.ClassDef) module.addGlobalStr('wxSearchCtrlNameStr', c) c.find('SetMenu.menu').transfer = True c.addCppMethod('void', 'SetSearchBitmap', '(const wxBitmap* bmp)', """\ #ifdef __WXMAC__ #else self->SetSearchBitmap(*bmp); #endif """) c.addCppMethod('void', 'SetSearchMenuBitmap', '(const wxBitmap* bmp)', """\ #ifdef __WXMAC__ #else self->SetSearchMenuBitmap(*bmp); #endif """) c.addCppMethod('void', 'SetCancelBitmap', '(const wxBitmap* bmp)', """\ #ifdef __WXMAC__ #else self->SetCancelBitmap(*bmp); #endif """) searchCtrl = c # The safest way to reconcile the differences in the class hierachy # between the native wxSearchCtrl on Mac and the generic one on the other # platforms is to just say that this class derives directly from # wxControl (the first common ancestor) instead of wxTextCtrl, and then # redeclare all the wxTextEntry and/or wxTextCtrlIface methods that we # are interested in having here. That way the C++ compiler can sort out # the proper way to call those methods and avoid calling the wrong # implementations like would happen if try to force it another way... searchCtrl.bases = ['wxControl'] # Instead of duplicating those declarations here, let's use the parser # and tweakers we already have and then just transplant those MethodDefs # into this ClassDef. That will then preserve things like the # documentation and custom tweaks that would be real tedious to duplicate # and maintain. import textentry mod = textentry.parseAndTweakModule() klass = mod.find('wxTextEntry') searchCtrl.items.extend(klass.items) # Do the same with wxTextCtrl, but also remove things like the # Constructors and Create methods first. import textctrl mod = textctrl.parseAndTweakModule() klass = mod.find('wxTextCtrl') # get just the methods that are not ctors, dtor or Create items = [item for item in klass.items if isinstance(item, etgtools.MethodDef) and not item.isCtor and not item.isDtor and item.name != 'Create'] searchCtrl.items.extend(items) searchCtrl.find('LoadFile').ignore() searchCtrl.find('SaveFile').ignore() searchCtrl.find('MacCheckSpelling').ignore() searchCtrl.find('ShowNativeCaret').ignore() searchCtrl.find('HideNativeCaret').ignore() # Add some properties that autoProperties would not see because they are # not using 'Get' and 'Set' searchCtrl.addProperty('SearchButtonVisible IsSearchButtonVisible ShowSearchButton') searchCtrl.addProperty('CancelButtonVisible IsCancelButtonVisible ShowCancelButton') searchCtrl.addAutoProperties() tools.fixWindowClass(searchCtrl) module.addPyCode("""\ EVT_SEARCH_CANCEL = wx.PyEventBinder( wxEVT_SEARCH_CANCEL, 1) EVT_SEARCH = wx.PyEventBinder( wxEVT_SEARCH, 1) # deprecated wxEVT aliases wxEVT_SEARCHCTRL_CANCEL_BTN = wxEVT_SEARCH_CANCEL wxEVT_SEARCHCTRL_SEARCH_BTN = wxEVT_SEARCH wxEVT_COMMAND_SEARCHCTRL_CANCEL_BTN = wxEVT_SEARCHCTRL_CANCEL_BTN wxEVT_COMMAND_SEARCHCTRL_SEARCH_BTN = wxEVT_SEARCHCTRL_SEARCH_BTN EVT_SEARCHCTRL_CANCEL_BTN = wx.PyEventBinder( wxEVT_SEARCHCTRL_CANCEL_BTN, 1) EVT_SEARCHCTRL_SEARCH_BTN = wx.PyEventBinder( wxEVT_SEARCHCTRL_SEARCH_BTN, 1) """) #----------------------------------------------------------------- tools.doCommonTweaks(module) tools.runGenerators(module)
def run(): # Parse the XML file(s) building a collection of Extractor objects module = etgtools.ModuleDef(PACKAGE, MODULE, NAME, DOCSTRING) etgtools.parseDoxyXML(module, ITEMS) #----------------------------------------------------------------- # Tweak the parsed meta objects in the module object as needed for # customizing the generated code and docstrings. #----------------------------------------------------------------- # ignore some macros since most of this set are not simple numbers for item in module.items: if item.name.startswith('wxRICHTEXT_DEFAULT'): item.ignore() #----------------------------------------------------------------- c = module.find('wxRichTextContextMenuPropertiesInfo') assert isinstance(c, etgtools.ClassDef) tools.ignoreConstOverloads(c) #----------------------------------------------------------------- c = module.find('wxRichTextCtrl') tools.fixWindowClass(c) c.bases = ['wxControl'] # wxTextCtrlIface, wxScrollHelper are also bases... c.find('GetSelection').findOverload('from').ignore() tools.ignoreConstOverloads(c) c.find('PositionToXY.x').out = True c.find('PositionToXY.y').out = True c.find('HitTest.pos').out = True c.find('HitTest.col').out = True c.find('HitTest.row').out = True c.find('HitTest').renameOverload('row', 'HitTestXY') c.find('GetRange.from').name = 'from_' c.find('GetRange.to').name = 'to_' c.find('Remove.from').name = 'from_' c.find('Remove.to').name = 'to_' c.find('Replace.from').name = 'from_' c.find('Replace.to').name = 'to_' c.find('SetSelection.from').name = 'from_' c.find('SetSelection.to').name = 'to_' c.find('SetListStyle.def').name = 'styleDef' c.find('ApplyStyle.def').name = 'styleDef' c.addPyMethod('GetDefaultStyle', '(self)', 'return self.GetDefaultStyleEx()', deprecated='Use GetDefaultStyleEx instead') # Make sure that all the methods from wxTextEntry are included. This is # needed because we are pretending that this class only derives from # wxControl but the real C++ class also derives from wxTextCtrlIface # which derives from wxTextEntryBase. import textentry mod = textentry.parseAndTweakModule() klass = mod.find('wxTextEntry') items = [item for item in klass.items if isinstance(item, etgtools.MethodDef) and not item.isCtor and not item.isDtor and not c.findItem(item.name)] c.items.extend(items) # TODO: What about the wxScrollHelper base class #----------------------------------------------------------------- c = module.find('wxRichTextEvent') tools.fixEventClass(c) module.addPyCode("""\ EVT_RICHTEXT_LEFT_CLICK = wx.PyEventBinder(wxEVT_RICHTEXT_LEFT_CLICK) EVT_RICHTEXT_RIGHT_CLICK = wx.PyEventBinder(wxEVT_RICHTEXT_RIGHT_CLICK) EVT_RICHTEXT_MIDDLE_CLICK = wx.PyEventBinder(wxEVT_RICHTEXT_MIDDLE_CLICK) EVT_RICHTEXT_LEFT_DCLICK = wx.PyEventBinder(wxEVT_RICHTEXT_LEFT_DCLICK) EVT_RICHTEXT_RETURN = wx.PyEventBinder(wxEVT_RICHTEXT_RETURN) EVT_RICHTEXT_CHARACTER = wx.PyEventBinder(wxEVT_RICHTEXT_CHARACTER) EVT_RICHTEXT_DELETE = wx.PyEventBinder(wxEVT_RICHTEXT_DELETE) EVT_RICHTEXT_STYLESHEET_CHANGING = wx.PyEventBinder(wxEVT_RICHTEXT_STYLESHEET_CHANGING) EVT_RICHTEXT_STYLESHEET_CHANGED = wx.PyEventBinder(wxEVT_RICHTEXT_STYLESHEET_CHANGED) EVT_RICHTEXT_STYLESHEET_REPLACING = wx.PyEventBinder(wxEVT_RICHTEXT_STYLESHEET_REPLACING) EVT_RICHTEXT_STYLESHEET_REPLACED = wx.PyEventBinder(wxEVT_RICHTEXT_STYLESHEET_REPLACED) EVT_RICHTEXT_CONTENT_INSERTED = wx.PyEventBinder(wxEVT_RICHTEXT_CONTENT_INSERTED) EVT_RICHTEXT_CONTENT_DELETED = wx.PyEventBinder(wxEVT_RICHTEXT_CONTENT_DELETED) EVT_RICHTEXT_STYLE_CHANGED = wx.PyEventBinder(wxEVT_RICHTEXT_STYLE_CHANGED) EVT_RICHTEXT_STYLE_CHANGED = wx.PyEventBinder(wxEVT_RICHTEXT_PROPERTIES_CHANGED) EVT_RICHTEXT_SELECTION_CHANGED = wx.PyEventBinder(wxEVT_RICHTEXT_SELECTION_CHANGED) EVT_RICHTEXT_BUFFER_RESET = wx.PyEventBinder(wxEVT_RICHTEXT_BUFFER_RESET) EVT_RICHTEXT_FOCUS_OBJECT_CHANGED = wx.PyEventBinder(wxEVT_RICHTEXT_FOCUS_OBJECT_CHANGED) """); #----------------------------------------------------------------- tools.doCommonTweaks(module) tools.runGenerators(module)
def run(): # Parse the XML file(s) building a collection of Extractor objects module = etgtools.ModuleDef(PACKAGE, MODULE, NAME, DOCSTRING) etgtools.parseDoxyXML(module, ITEMS) #----------------------------------------------------------------- # Tweak the parsed meta objects in the module object as needed for # customizing the generated code and docstrings. #----------------------------------------------------------------- # ignore some macros since most of this set are not simple numbers for item in module.items: if item.name.startswith('wxRICHTEXT_DEFAULT'): item.ignore() #----------------------------------------------------------------- c = module.find('wxRichTextContextMenuPropertiesInfo') assert isinstance(c, etgtools.ClassDef) tools.ignoreConstOverloads(c) #----------------------------------------------------------------- c = module.find('wxRichTextCtrl') tools.fixWindowClass(c) c.bases = ['wxControl' ] # wxTextCtrlIface, wxScrollHelper are also bases... c.find('GetSelection').findOverload('from').ignore() tools.ignoreConstOverloads(c) c.find('PositionToXY.x').out = True c.find('PositionToXY.y').out = True c.find('HitTest.pos').out = True c.find('HitTest.col').out = True c.find('HitTest.row').out = True c.find('HitTest').renameOverload('row', 'HitTestXY') c.find('GetRange.from').name = 'from_' c.find('GetRange.to').name = 'to_' c.find('Remove.from').name = 'from_' c.find('Remove.to').name = 'to_' c.find('Replace.from').name = 'from_' c.find('Replace.to').name = 'to_' c.find('SetSelection.from').name = 'from_' c.find('SetSelection.to').name = 'to_' c.find('SetListStyle.def').name = 'styleDef' c.find('ApplyStyle.def').name = 'styleDef' c.addPyMethod('GetDefaultStyle', '(self)', 'return self.GetDefaultStyleEx()', deprecated='Use GetDefaultStyleEx instead') # Make sure that all the methods from wxTextEntry are included. This is # needed because we are pretending that this class only derives from # wxControl but the real C++ class also derives from wxTextCtrlIface # which derives from wxTextEntryBase. import textentry mod = textentry.parseAndTweakModule() klass = mod.find('wxTextEntry') items = [ item for item in klass.items if isinstance(item, etgtools.MethodDef) and not item.isCtor and not item.isDtor and not c.findItem(item.name) ] c.items.extend(items) # TODO: What about the wxScrollHelper base class #----------------------------------------------------------------- c = module.find('wxRichTextEvent') tools.fixEventClass(c) module.addPyCode("""\ EVT_RICHTEXT_LEFT_CLICK = wx.PyEventBinder(wxEVT_RICHTEXT_LEFT_CLICK) EVT_RICHTEXT_RIGHT_CLICK = wx.PyEventBinder(wxEVT_RICHTEXT_RIGHT_CLICK) EVT_RICHTEXT_MIDDLE_CLICK = wx.PyEventBinder(wxEVT_RICHTEXT_MIDDLE_CLICK) EVT_RICHTEXT_LEFT_DCLICK = wx.PyEventBinder(wxEVT_RICHTEXT_LEFT_DCLICK) EVT_RICHTEXT_RETURN = wx.PyEventBinder(wxEVT_RICHTEXT_RETURN) EVT_RICHTEXT_CHARACTER = wx.PyEventBinder(wxEVT_RICHTEXT_CHARACTER) EVT_RICHTEXT_DELETE = wx.PyEventBinder(wxEVT_RICHTEXT_DELETE) EVT_RICHTEXT_STYLESHEET_CHANGING = wx.PyEventBinder(wxEVT_RICHTEXT_STYLESHEET_CHANGING) EVT_RICHTEXT_STYLESHEET_CHANGED = wx.PyEventBinder(wxEVT_RICHTEXT_STYLESHEET_CHANGED) EVT_RICHTEXT_STYLESHEET_REPLACING = wx.PyEventBinder(wxEVT_RICHTEXT_STYLESHEET_REPLACING) EVT_RICHTEXT_STYLESHEET_REPLACED = wx.PyEventBinder(wxEVT_RICHTEXT_STYLESHEET_REPLACED) EVT_RICHTEXT_CONTENT_INSERTED = wx.PyEventBinder(wxEVT_RICHTEXT_CONTENT_INSERTED) EVT_RICHTEXT_CONTENT_DELETED = wx.PyEventBinder(wxEVT_RICHTEXT_CONTENT_DELETED) EVT_RICHTEXT_STYLE_CHANGED = wx.PyEventBinder(wxEVT_RICHTEXT_STYLE_CHANGED) EVT_RICHTEXT_STYLE_CHANGED = wx.PyEventBinder(wxEVT_RICHTEXT_PROPERTIES_CHANGED) EVT_RICHTEXT_SELECTION_CHANGED = wx.PyEventBinder(wxEVT_RICHTEXT_SELECTION_CHANGED) EVT_RICHTEXT_BUFFER_RESET = wx.PyEventBinder(wxEVT_RICHTEXT_BUFFER_RESET) EVT_RICHTEXT_FOCUS_OBJECT_CHANGED = wx.PyEventBinder(wxEVT_RICHTEXT_FOCUS_OBJECT_CHANGED) """) #----------------------------------------------------------------- tools.doCommonTweaks(module) tools.runGenerators(module)
def run(): # Parse the XML file(s) building a collection of Extractor objects module = etgtools.ModuleDef(PACKAGE, MODULE, NAME, DOCSTRING) etgtools.parseDoxyXML(module, ITEMS) #----------------------------------------------------------------- # Tweak the parsed meta objects in the module object as needed for # customizing the generated code and docstrings. module.addHeaderCode('#include <wx/srchctrl.h>') c = module.find('wxSearchCtrl') assert isinstance(c, etgtools.ClassDef) module.addGlobalStr('wxSearchCtrlNameStr', c) c.find('SetMenu.menu').transfer = True c.addCppMethod('void', 'SetSearchBitmap', '(const wxBitmap* bmp)', """\ #ifdef __WXMAC__ #else self->SetSearchBitmap(*bmp); #endif """) c.addCppMethod('void', 'SetSearchMenuBitmap', '(const wxBitmap* bmp)', """\ #ifdef __WXMAC__ #else self->SetSearchMenuBitmap(*bmp); #endif """) c.addCppMethod('void', 'SetCancelBitmap', '(const wxBitmap* bmp)', """\ #ifdef __WXMAC__ #else self->SetSearchMenuBitmap(*bmp); #endif """) searchCtrl = c # The safest way to reconcile the differences in the class hierachy # between the native wxSearchCtrl on Mac and the generic one on the other # platforms is to just say that this class derives directly from # wxControl (the first common ancestor) instead of wxTextCtrl, and then # redeclare all the wxTextEntry and/or wxTextCtrlIface methods that we # are interested in having here. That way the C++ compiler can sort out # the proper way to call those methods and avoid calling the wrong # implementations like would happen if try to force it another way... searchCtrl.bases = ['wxControl'] # Instead of duplicating those declarations here, let's use the parser # and tweakers we already have and then just transplant those MethodDefs # into this ClassDef. That will then preserve things like the # documentation and custom tweaks that would be real tedious to duplicate # and maintain. import textentry mod = textentry.parseAndTweakModule() klass = mod.find('wxTextEntry') searchCtrl.items.extend(klass.items) # Do the same with wxTextCtrl, but also remove things like the # Constructors and Create methods first. import textctrl mod = textctrl.parseAndTweakModule() klass = mod.find('wxTextCtrl') # get just the methods that are not ctors, dtor or Create items = [item for item in klass.items if isinstance(item, etgtools.MethodDef) and not item.isCtor and not item.isDtor and item.name != 'Create'] searchCtrl.items.extend(items) searchCtrl.find('LoadFile').ignore() searchCtrl.find('SaveFile').ignore() searchCtrl.find('MacCheckSpelling').ignore() searchCtrl.find('ShowNativeCaret').ignore() searchCtrl.find('HideNativeCaret').ignore() # Add some properties that autoProperties would not see because they are # not using 'Get' and 'Set' searchCtrl.addProperty('SearchButtonVisible IsSearchButtonVisible ShowSearchButton') searchCtrl.addProperty('CancelButtonVisible IsCancelButtonVisible ShowCancelButton') searchCtrl.addAutoProperties() tools.fixWindowClass(searchCtrl) module.addPyCode("""\ EVT_SEARCHCTRL_CANCEL_BTN = wx.PyEventBinder( wxEVT_SEARCHCTRL_CANCEL_BTN, 1) EVT_SEARCHCTRL_SEARCH_BTN = wx.PyEventBinder( wxEVT_SEARCHCTRL_SEARCH_BTN, 1) # deprecated wxEVT aliases wxEVT_COMMAND_SEARCHCTRL_CANCEL_BTN = wxEVT_SEARCHCTRL_CANCEL_BTN wxEVT_COMMAND_SEARCHCTRL_SEARCH_BTN = wxEVT_SEARCHCTRL_SEARCH_BTN """) #----------------------------------------------------------------- tools.doCommonTweaks(module) tools.runGenerators(module)
def run(): # Parse the XML file(s) building a collection of Extractor objects module = etgtools.ModuleDef(PACKAGE, MODULE, NAME, DOCSTRING) etgtools.parseDoxyXML(module, ITEMS) module.check4unittest = False #----------------------------------------------------------------- # Tweak the parsed meta objects in the module object as needed for # customizing the generated code and docstrings. module.addHeaderCode('#include <wxpy_api.h>') module.addImport('_core') module.addPyCode('''\ import wx ID_ANY = wx.ID_ANY # Needed for some parameter defaults in this module ''', order=10) module.addInclude(INCLUDES) #----------------------------------------------------------------- module.addHeaderCode('#include <wx/stc/stc.h>') c = module.find('wxStyledTextCtrl') assert isinstance(c, etgtools.ClassDef) c.bases = ['wxControl'] # wxTextCtrlIface is also a base... c.piBases = ['wx.Control', 'wx.TextEntry'] tools.fixWindowClass(c, False) module.addGlobalStr('wxSTCNameStr', c) c.find('GetCurLine.linePos').out = True c.find('GetCurLineRaw.linePos').out = True for name in ['Remove', 'Replace', 'SetSelection', 'GetSelection']: m = c.find(name) m.find('from').name = 'from_' m.find('to').name = 'to_' c.find('GetSelection.from_').out = True c.find('GetSelection.to_').out = True c.find('PositionToXY.x').out = True c.find('PositionToXY.y').out = True # Split the HitTest overloads into separately named methods since once # the output parameters are applied they will have the same function # signature. ht1 = c.find('HitTest') ht2 = ht1.overloads[0] ht1.overloads = [] c.insertItemAfter(ht1, ht2) ht1.pyName = 'HitTestPos' ht1.find('pos').out = True ht2.find('row').out = True ht2.find('col').out = True # Replace the *Pointer methods with ones that return a memoryview object instead. c.find('GetCharacterPointer').ignore() c.addCppMethod('PyObject*', 'GetCharacterPointer', '()', doc="""\ Compact the document buffer and return a read-only memoryview object of the characters in the document.""", body=""" const char* ptr = self->GetCharacterPointer(); Py_ssize_t len = self->GetLength(); PyObject* rv; wxPyBLOCK_THREADS( rv = wxPyMakeBuffer((void*)ptr, len, true) ); return rv; """) c.find('GetRangePointer').ignore() c.addCppMethod('PyObject*', 'GetRangePointer', '(int position, int rangeLength)', doc="""\ Return a read-only pointer to a range of characters in the document. May move the gap so that the range is contiguous, but will only move up to rangeLength bytes.""", body=""" const char* ptr = self->GetRangePointer(position, rangeLength); Py_ssize_t len = rangeLength; PyObject* rv; wxPyBLOCK_THREADS( rv = wxPyMakeBuffer((void*)ptr, len, true) ); return rv; """) # Generate the code for this differently because it needs to be # forcibly mashed into an int in the C code module.find('wxSTC_MASK_FOLDERS').forcedInt = True # Make sure that all the methods from wxTextEntry and wxTextCtrl are # included. This is needed because we are pretending that this class only # derives from wxControl but the real C++ class also derives from # wxTextCtrlIface which derives from wxTextEntryBase. import textentry mod = textentry.parseAndTweakModule() klass = mod.find('wxTextEntry') items = [item for item in klass.items if isinstance(item, etgtools.MethodDef) and not item.isCtor and not item.isDtor and not c.findItem(item.name)] c.items.extend(items) import textctrl mod = textctrl.parseAndTweakModule() klass = mod.find('wxTextCtrl') items = [item for item in klass.items if isinstance(item, etgtools.MethodDef) and not item.isCtor and not item.isDtor and not c.findItem(item.name)] c.items.extend(items) c.find('EmulateKeyPress').ignore() c.find('IsMultiLine').ignore() c.find('IsSingleLine').ignore() c.find('MacCheckSpelling').ignore() c.find('ShowNativeCaret').ignore() c.find('HideNativeCaret').ignore() # TODO: Add the UTF8 PyMethods from classic (see _stc_utf8_methods.py) #----------------------------------------------------------------- c = module.find('wxStyledTextEvent') tools.fixEventClass(c) c.addPyCode("""\ EVT_STC_CHANGE = wx.PyEventBinder( wxEVT_STC_CHANGE, 1 ) EVT_STC_STYLENEEDED = wx.PyEventBinder( wxEVT_STC_STYLENEEDED, 1 ) EVT_STC_CHARADDED = wx.PyEventBinder( wxEVT_STC_CHARADDED, 1 ) EVT_STC_SAVEPOINTREACHED = wx.PyEventBinder( wxEVT_STC_SAVEPOINTREACHED, 1 ) EVT_STC_SAVEPOINTLEFT = wx.PyEventBinder( wxEVT_STC_SAVEPOINTLEFT, 1 ) EVT_STC_ROMODIFYATTEMPT = wx.PyEventBinder( wxEVT_STC_ROMODIFYATTEMPT, 1 ) EVT_STC_KEY = wx.PyEventBinder( wxEVT_STC_KEY, 1 ) EVT_STC_DOUBLECLICK = wx.PyEventBinder( wxEVT_STC_DOUBLECLICK, 1 ) EVT_STC_UPDATEUI = wx.PyEventBinder( wxEVT_STC_UPDATEUI, 1 ) EVT_STC_MODIFIED = wx.PyEventBinder( wxEVT_STC_MODIFIED, 1 ) EVT_STC_MACRORECORD = wx.PyEventBinder( wxEVT_STC_MACRORECORD, 1 ) EVT_STC_MARGINCLICK = wx.PyEventBinder( wxEVT_STC_MARGINCLICK, 1 ) EVT_STC_NEEDSHOWN = wx.PyEventBinder( wxEVT_STC_NEEDSHOWN, 1 ) EVT_STC_PAINTED = wx.PyEventBinder( wxEVT_STC_PAINTED, 1 ) EVT_STC_USERLISTSELECTION = wx.PyEventBinder( wxEVT_STC_USERLISTSELECTION, 1 ) EVT_STC_URIDROPPED = wx.PyEventBinder( wxEVT_STC_URIDROPPED, 1 ) EVT_STC_DWELLSTART = wx.PyEventBinder( wxEVT_STC_DWELLSTART, 1 ) EVT_STC_DWELLEND = wx.PyEventBinder( wxEVT_STC_DWELLEND, 1 ) EVT_STC_START_DRAG = wx.PyEventBinder( wxEVT_STC_START_DRAG, 1 ) EVT_STC_DRAG_OVER = wx.PyEventBinder( wxEVT_STC_DRAG_OVER, 1 ) EVT_STC_DO_DROP = wx.PyEventBinder( wxEVT_STC_DO_DROP, 1 ) EVT_STC_ZOOM = wx.PyEventBinder( wxEVT_STC_ZOOM, 1 ) EVT_STC_HOTSPOT_CLICK = wx.PyEventBinder( wxEVT_STC_HOTSPOT_CLICK, 1 ) EVT_STC_HOTSPOT_DCLICK = wx.PyEventBinder( wxEVT_STC_HOTSPOT_DCLICK, 1 ) EVT_STC_HOTSPOT_RELEASE_CLICK = wx.PyEventBinder( wxEVT_STC_HOTSPOT_RELEASE_CLICK, 1 ) EVT_STC_CALLTIP_CLICK = wx.PyEventBinder( wxEVT_STC_CALLTIP_CLICK, 1 ) EVT_STC_AUTOCOMP_SELECTION = wx.PyEventBinder( wxEVT_STC_AUTOCOMP_SELECTION, 1 ) EVT_STC_INDICATOR_CLICK = wx.PyEventBinder( wxEVT_STC_INDICATOR_CLICK, 1 ) EVT_STC_INDICATOR_RELEASE = wx.PyEventBinder( wxEVT_STC_INDICATOR_RELEASE, 1 ) EVT_STC_AUTOCOMP_CANCELLED = wx.PyEventBinder( wxEVT_STC_AUTOCOMP_CANCELLED, 1 ) EVT_STC_AUTOCOMP_CHAR_DELETED = wx.PyEventBinder( wxEVT_STC_AUTOCOMP_CHAR_DELETED, 1 ) """) #----------------------------------------------------------------- #----------------------------------------------------------------- tools.doCommonTweaks(module) tools.runGenerators(module)