]> git.saurik.com Git - wxWidgets.git/blobdiff - wxPython/wx/lib/activexwrapper.py
Bug fix from Pierre
[wxWidgets.git] / wxPython / wx / lib / activexwrapper.py
index a10d050b831d26d187f92fcaacec670daa738adf..67d09d6fd114f44b24ffbf575d482a4b0066efd8 100644 (file)
@@ -1,8 +1,155 @@
+#----------------------------------------------------------------------
+# Name:        wxPython.lib.activexwrapper
+# Purpose:     a wxWindow derived class that can hold an ActiveX control
+#
+# Author:      Robin Dunn
+#
+# RCS-ID:      $Id$
+# Copyright:   (c) 2000 by Total Control Software
+# Licence:     wxWindows license
+#----------------------------------------------------------------------
+# 11/30/2003 - Jeff Grimmett (grimmtooth@softhome.net)
+#
+# o Updated for wx namespace
+# o Tested with updated demo
+# 
+
+import  wx
+
+try:
+    import win32ui
+    import pywin.mfc.activex
+    import win32com.client
+except ImportError:
+    import sys
+    if hasattr(sys, "frozen"):
+        import os, win32api
+        dllpath = os.path.join(win32api.GetSystemDirectory(), 'MFC71.DLL')
+        if sys.version[:3] >= '2.4' and not os.path.exists(dllpath):
+            message = "%s not found" % dllpath
+        else:
+            raise       # original error message
+    else:
+        message = "ActiveXWrapper requires PythonWin. Please install the PyWin32 package." 
+    raise ImportError(message) 
+
+##from win32con import WS_TABSTOP, WS_VISIBLE
+WS_TABSTOP = 0x00010000
+WS_VISIBLE = 0x10000000
+
+#----------------------------------------------------------------------
+
+
+def MakeActiveXClass(CoClass, eventClass=None, eventObj=None):
+    """
+    Dynamically construct a new class that derives from wxWindow, the
+    ActiveX control and the appropriate COM classes.  This new class
+    can be used just like the wxWindow class, but will also respond
+    appropriately to the methods and properties of the COM object.  If
+    this class, a derived class or a mix-in class has method names
+    that match the COM object's event names, they will be called
+    automatically.
+
+    CoClass -- A COM control class from a module generated by
+            makepy.py from a COM TypeLibrary.  Can also accept a
+            CLSID.
+
+    eventClass -- If given, this class will be added to the set of
+            base classes that the new class is drived from.  It is
+            good for mix-in classes for catching events.
+
+    eventObj -- If given, this object will be searched for attributes
+            by the new class's __getattr__ method, (like a mix-in
+            object.)  This is useful if you want to catch COM
+            callbacks in an existing object, (such as the parent
+            window.)
+
+    """
+
+
+    if type(CoClass) == type(""):
+        # use the CLSID to get the real class
+        CoClass = win32com.client.CLSIDToClass(CoClass)
+
+    # determine the base classes
+    axEventClass = CoClass.default_source
+    baseClasses = [pywin.mfc.activex.Control, wx.Window, CoClass, axEventClass]
+    if eventClass:
+        baseClasses.append(eventClass)
+    baseClasses = tuple(baseClasses)
+
+    # define the class attributes
+    className = 'AXControl_'+CoClass.__name__
+    classDict = { '__init__'    : axw__init__,
+                  '__getattr__' : axw__getattr__,
+                  'axw_OnSize'  : axw_OnSize,
+                  'axw_OEB'     : axw_OEB,
+                  '_name'       : className,
+                  '_eventBase'  : axEventClass,
+                  '_eventObj'   : eventObj,
+                  'Cleanup'     : axw_Cleanup,
+                  }
+
+    # make a new class object
+    import new
+    classObj = new.classobj(className, baseClasses, classDict)
+    return classObj
+
+
+
+
+# These functions will be used as methods in the new class
+def axw__init__(self, parent, ID=-1, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0):
+    
+    # init base classes
+    pywin.mfc.activex.Control.__init__(self)
+    wx.Window.__init__( self, parent, -1, pos, size, style|wx.NO_FULL_REPAINT_ON_RESIZE)
+    self.this.own(False)  # this should be set in wx.Window.__init__ when it calls _setOORInfo, but...
+        
+    win32ui.EnableControlContainer()
+    self._eventObj = self._eventObj  # move from class to instance
+
+    # create a pythonwin wrapper around this wxWindow
+    handle = self.GetHandle()
+    self._wnd = win32ui.CreateWindowFromHandle(handle)
+
+    # create the control
+    sz = self.GetSize()
+    self.CreateControl(self._name, WS_TABSTOP | WS_VISIBLE,
+                       (0, 0, sz.width, sz.height), self._wnd, ID)
+
+    # init the ax events part of the object
+    self._eventBase.__init__(self, self._dispobj_)
+
+    # hook some wx events
+    self.Bind(wx.EVT_SIZE, self.axw_OnSize)
+
+def axw__getattr__(self, attr):
+    try:
+        return pywin.mfc.activex.Control.__getattr__(self, attr)
+    except AttributeError:
+        try:
+            eo = self.__dict__['_eventObj']
+            return getattr(eo, attr)
+        except AttributeError:
+            raise AttributeError('Attribute not found: %s' % attr)
+
+
+def axw_OnSize(self, event):
+    sz = self.GetClientSize()                        # get wxWindow size
+    self.MoveWindow((0, 0, sz.width, sz.height), 1)  # move the AXControl
+
+
+def axw_OEB(self, event):
+    pass
+
+
+def axw_Cleanup(self):
+    #del self._wnd
+    self.close()
+    pass
+
+
+
 
-"""Renamer stub: provides a way to drop the wx prefix from wxPython objects."""
 
-from wx import _rename
-from wxPython.lib import activexwrapper
-_rename(globals(), activexwrapper.__dict__, modulename='lib.activexwrapper')
-del activexwrapper
-del _rename