Move axbase to an etg script, add tests

This commit is contained in:
Robin Dunn
2016-05-17 10:26:33 -07:00
parent ae42d4d894
commit a8f6d6961d
4 changed files with 146 additions and 84 deletions

101
etg/axbase.py Normal file
View File

@@ -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()

View File

@@ -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);
};
//--------------------------------------------------------------------------

40
unittests/test_axbase.py Normal file
View File

@@ -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()

View File

@@ -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()