From a8f6d6961d73993fa8dc9cf41f0cddd7de7c3928 Mon Sep 17 00:00:00 2001 From: Robin Dunn Date: Tue, 17 May 2016 10:26:33 -0700 Subject: [PATCH] Move axbase to an etg script, add tests --- etg/axbase.py | 101 +++++++++++++++++++++++++++++++++++++ src/axbase.sip | 79 ----------------------------- unittests/test_axbase.py | 40 +++++++++++++++ unittests/test_metafile.py | 10 ++-- 4 files changed, 146 insertions(+), 84 deletions(-) create mode 100644 etg/axbase.py delete mode 100644 src/axbase.sip create mode 100644 unittests/test_axbase.py diff --git a/etg/axbase.py b/etg/axbase.py new file mode 100644 index 00000000..a6d4ec5b --- /dev/null +++ b/etg/axbase.py @@ -0,0 +1,101 @@ +#--------------------------------------------------------------------------- +# Name: etg/axbase.py +# Author: Robin Dunn +# +# Created: 13-May-2016 +# Copyright: (c) 2016 by Total Control Software +# License: wxWindows License +#--------------------------------------------------------------------------- + +import etgtools +import etgtools.tweaker_tools as tools +from etgtools import (ClassDef, MethodDef, ParamDef, TypedefDef) + +PACKAGE = "wx" +MODULE = "_msw" +NAME = "axbase" # Base name of the file to generate to for this script +DOCSTRING = "" + +# The classes and/or the basename of the Doxygen XML files to be processed by +# this script. +ITEMS = [ ] + +#--------------------------------------------------------------------------- + +def run(): + # Parse the XML file(s) building a collection of Extractor objects + module = etgtools.ModuleDef(PACKAGE, MODULE, NAME, DOCSTRING) + etgtools.parseDoxyXML(module, ITEMS) + + #----------------------------------------------------------------- + # The wxPyAxBaseWindow class does not come from the parsed Doxygen xml, + # instead it is manufactured entirely in this ETG script. We're doing it + # here instead of in a raw .sip file so we can run the generators on it + # and get things like documentation and .pyi files generated like any + # normal class. + + # First, output some C++ code + module.addHeaderCode("""\ + class wxPyAxBaseWindow : public wxWindow + { + DECLARE_DYNAMIC_CLASS(wxPyAxBaseWindow) + public: + wxPyAxBaseWindow(wxWindow* parent, const wxWindowID id=-1, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxPanelNameStr) + : wxWindow(parent, id, pos, size, style, name) {} + wxPyAxBaseWindow() : wxWindow() {} + virtual bool MSWTranslateMessage(WXMSG* msg) + { + return wxWindow::MSWTranslateMessage(msg); + } + }; + """) + module.addCppCode("""\ + IMPLEMENT_DYNAMIC_CLASS(wxPyAxBaseWindow, wxWindow); + """) + + # Now create the extractor objects that will be run through the generators + module.addItem(TypedefDef(type='void', name='WXMSG')) + + cls = ClassDef(name='wxPyAxBaseWindow', bases=['wxWindow'], + briefDoc="""\ + A Window class for use with ActiveX controls. + + This Window class exposes some low-level Microsoft Windows + specific methods which can be overridden in Python. Intended for + use as an ActiveX container, but could also be useful + elsewhere.""", + items=[ + MethodDef( + name='wxPyAxBaseWindow', isCtor=True, items=[ + ParamDef(type='wxWindow*', name='parent'), + ParamDef(type='wxWindowID', name='id', isConst=True, default='-1'), + ParamDef(type='wxPoint&', name='pos', isConst=True, default='wxDefaultPosition'), + ParamDef(type='wxSize&', name='size', isConst=True, default='wxDefaultSize'), + ParamDef(type='long', name='style', default='0'), + ParamDef(type='wxString&', name='name', isConst=True, default='wxPanelNameStr'), + ], + overloads=[ + MethodDef( + name='wxPyAxBaseWindow', isCtor=True), + ]), + + MethodDef(type='bool', name='MSWTranslateMessage', isVirtual=True, items=[ + ParamDef(type='WXMSG*', name='msg') + ]) + ]) + + module.addItem(cls) + + #----------------------------------------------------------------- + tools.doCommonTweaks(module) + tools.runGenerators(module) + + +#--------------------------------------------------------------------------- +if __name__ == '__main__': + run() + diff --git a/src/axbase.sip b/src/axbase.sip deleted file mode 100644 index d0b58ec0..00000000 --- a/src/axbase.sip +++ /dev/null @@ -1,79 +0,0 @@ -//-------------------------------------------------------------------------- -// Name: src/axbase.sip -// Purpose: A wxWindow class and wrapper interface that virtualizes -// MSWTranslateMessage for use in ActiveX Controls. See _axbase in Classic -// -// Author: Robin Dunn -// -// Created: 13-May-2016 -// Copyright: (c) 2016 by Total Control Software -// Licence: wxWindows license -//-------------------------------------------------------------------------- - - -%ModuleHeaderCode -class wxPyAxBaseWindow : public wxWindow -{ - DECLARE_DYNAMIC_CLASS(wxPyAxBaseWindow) - -public: - wxPyAxBaseWindow(wxWindow* parent, const wxWindowID id=-1, - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, - long style = 0, - const wxString& name = wxPanelNameStr) - : wxWindow(parent, id, pos, size, style, name) {} - - wxPyAxBaseWindow() : wxWindow() {} - - virtual bool MSWTranslateMessage(WXMSG* msg) - { - return wxWindow::MSWTranslateMessage(msg); - } -}; - -wxPyAxBaseWindow* wxPyAxBaseWindow_FromHWND(wxWindow* parent, unsigned long _hWnd); -%End - -//-------------------------------------------------------------------------- - - -%ModuleCode -IMPLEMENT_DYNAMIC_CLASS(wxPyAxBaseWindow, wxWindow); - -wxPyAxBaseWindow* wxPyAxBaseWindow_FromHWND(wxWindow* parent, unsigned long _hWnd) -{ - WXHWND hWnd = (WXHWND)_hWnd; - wxPyAxBaseWindow* win = new wxPyAxBaseWindow; - if (parent) - parent->AddChild(win); - win->SetEventHandler(win); - win->SetHWND(hWnd); - win->SubclassWin(hWnd); - win->AdoptAttributesFromHWND(); - win->SetupColours(); - return win; -} -%End - - -//-------------------------------------------------------------------------- - -typedef void WXMSG; - - -class wxPyAxBaseWindow : wxWindow -{ -public: - wxPyAxBaseWindow(wxWindow* parent, const wxWindowID id=-1, - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, - long style = 0, - const wxString& name = wxPanelNameStr); - wxPyAxBaseWindow(); - virtual bool MSWTranslateMessage(WXMSG* msg); -}; - -//-------------------------------------------------------------------------- - - diff --git a/unittests/test_axbase.py b/unittests/test_axbase.py new file mode 100644 index 00000000..41074e8f --- /dev/null +++ b/unittests/test_axbase.py @@ -0,0 +1,40 @@ +import unittest +import wtc +import wx + +#--------------------------------------------------------------------------- + +class axbase_Tests(wtc.WidgetTestCase): + + @unittest.skipIf('wxMSW' not in wx.PlatformInfo, + 'PyAxBaseWindow only available on Windows') + def test_axbase1(self): + import wx.msw + w = wx.msw.PyAxBaseWindow(self.frame) + + + @unittest.skipIf('wxMSW' not in wx.PlatformInfo, + 'PyAxBaseWindow only available on Windows') + def test_axbase2(self): + import wx.msw + w = wx.msw.PyAxBaseWindow() + w.Create(self.frame) + + + @unittest.skipIf('wxMSW' not in wx.PlatformInfo, + 'PyAxBaseWindow only available on Windows') + def test_axbase3(self): + import wx.msw + w = wx.msw.PyAxBaseWindow(self.frame, + id=-1, + pos=wx.DefaultPosition, + size=wx.DefaultSize, + style=0, + name='testing') + + + +#--------------------------------------------------------------------------- + +if __name__ == '__main__': + unittest.main() diff --git a/unittests/test_metafile.py b/unittests/test_metafile.py index e1729b83..2a18624c 100644 --- a/unittests/test_metafile.py +++ b/unittests/test_metafile.py @@ -1,18 +1,18 @@ import unittest import wtc import wx -import wx.msw #--------------------------------------------------------------------------- class MetafileDCTests(wtc.WidgetTestCase): - @unittest.skipIf('wxMSW' not in wx.PlatformInfo, "Metafile classes only imsplemented on Windows") + @unittest.skipIf('wxMSW' not in wx.PlatformInfo, "Metafile classes only implemented on Windows") def test_MetafileDC1(self): - # Not testing with output file because it is not released soon enough - # to be able to delete the file in this test, resulting in permission - # errors. + import wx.msw + # Not testing with output file because the file resource is not released + # soon enough to be able to delete the file in this test, resulting in + # permission errors. dc = wx.msw.MetafileDC() dc.DrawLine(0,0, 50,50) metafile = dc.Close()