]> git.saurik.com Git - wxWidgets.git/blame - wxPython/wx/lib/activexwrapper.py
DocView patches from Morgen Hua: bug fixes, and additional SVN
[wxWidgets.git] / wxPython / wx / lib / activexwrapper.py
CommitLineData
d14a1e28
RD
1#----------------------------------------------------------------------
2# Name: wxPython.lib.activexwrapper
3# Purpose: a wxWindow derived class that can hold an ActiveX control
4#
5# Author: Robin Dunn
6#
7# RCS-ID: $Id$
8# Copyright: (c) 2000 by Total Control Software
9# Licence: wxWindows license
10#----------------------------------------------------------------------
b881fc78
RD
11# 11/30/2003 - Jeff Grimmett (grimmtooth@softhome.net)
12#
13# o Updated for wx namespace
14# o Tested with updated demo
15#
d14a1e28 16
b881fc78 17import wx
d14a1e28
RD
18
19try:
20 import win32ui
21 import pywin.mfc.activex
22 import win32com.client
23except ImportError:
24 raise ImportError( "ActiveXWrapper requires PythonWin. Please install the win32all-xxx.exe package.")
25
26##from win32con import WS_TABSTOP, WS_VISIBLE
27WS_TABSTOP = 0x00010000
28WS_VISIBLE = 0x10000000
29
30#----------------------------------------------------------------------
31
32
33def MakeActiveXClass(CoClass, eventClass=None, eventObj=None):
34 """
35 Dynamically construct a new class that derives from wxWindow, the
36 ActiveX control and the appropriate COM classes. This new class
37 can be used just like the wxWindow class, but will also respond
38 appropriately to the methods and properties of the COM object. If
39 this class, a derived class or a mix-in class has method names
40 that match the COM object's event names, they will be called
41 automatically.
42
43 CoClass -- A COM control class from a module generated by
44 makepy.py from a COM TypeLibrary. Can also accept a
45 CLSID.
46
47 eventClass -- If given, this class will be added to the set of
48 base classes that the new class is drived from. It is
49 good for mix-in classes for catching events.
50
51 eventObj -- If given, this object will be searched for attributes
52 by the new class's __getattr__ method, (like a mix-in
53 object.) This is useful if you want to catch COM
54 callbacks in an existing object, (such as the parent
55 window.)
56
57 """
58
59
60 if type(CoClass) == type(""):
61 # use the CLSID to get the real class
62 CoClass = win32com.client.CLSIDToClass(CoClass)
63
64 # determine the base classes
65 axEventClass = CoClass.default_source
ebd7cc3a 66 baseClasses = [pywin.mfc.activex.Control, wx.Window, CoClass, axEventClass]
d14a1e28
RD
67 if eventClass:
68 baseClasses.append(eventClass)
69 baseClasses = tuple(baseClasses)
70
71 # define the class attributes
72 className = 'AXControl_'+CoClass.__name__
73 classDict = { '__init__' : axw__init__,
74 '__getattr__' : axw__getattr__,
75 'axw_OnSize' : axw_OnSize,
76 'axw_OEB' : axw_OEB,
77 '_name' : className,
78 '_eventBase' : axEventClass,
79 '_eventObj' : eventObj,
80 'Cleanup' : axw_Cleanup,
81 }
82
83 # make a new class object
84 import new
85 classObj = new.classobj(className, baseClasses, classDict)
86 return classObj
87
88
89
90
91# These functions will be used as methods in the new class
b881fc78
RD
92def axw__init__(self, parent, ID, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0):
93
d14a1e28
RD
94 # init base classes
95 pywin.mfc.activex.Control.__init__(self)
b881fc78 96 wx.Window.__init__( self, parent, -1, pos, size, style|wx.NO_FULL_REPAINT_ON_RESIZE)
d14a1e28
RD
97
98 win32ui.EnableControlContainer()
99 self._eventObj = self._eventObj # move from class to instance
100
101 # create a pythonwin wrapper around this wxWindow
102 handle = self.GetHandle()
103 self._wnd = win32ui.CreateWindowFromHandle(handle)
104
105 # create the control
106 sz = self.GetSize()
107 self.CreateControl(self._name, WS_TABSTOP | WS_VISIBLE,
108 (0, 0, sz.width, sz.height), self._wnd, ID)
109
110 # init the ax events part of the object
111 self._eventBase.__init__(self, self._dispobj_)
112
113 # hook some wx events
b881fc78 114 self.Bind(wx.EVT_SIZE, self.axw_OnSize)
d14a1e28
RD
115
116
117def axw__getattr__(self, attr):
118 try:
119 return pywin.mfc.activex.Control.__getattr__(self, attr)
120 except AttributeError:
121 try:
122 eo = self.__dict__['_eventObj']
123 return getattr(eo, attr)
124 except AttributeError:
125 raise AttributeError('Attribute not found: %s' % attr)
126
127
128def axw_OnSize(self, event):
129 sz = self.GetClientSize() # get wxWindow size
130 self.MoveWindow((0, 0, sz.width, sz.height), 1) # move the AXControl
131
132
133def axw_OEB(self, event):
134 pass
135
136
137def axw_Cleanup(self):
138 del self._wnd
139 self.close()
140 pass
d14a1e28
RD
141
142
143
1fded56b 144
1fded56b 145