extension module called wx.activex. Lots of demo and lib updates to go along with it. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@26301 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			212 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			212 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
 | |
| 
 | |
| #---------------------------------------------------------------------------
 | |
| # Some helper and utility functions for ActiveX
 | |
| 
 | |
| 
 | |
| t4 = " " * 4
 | |
| t8 = " " * 8
 | |
| 
 | |
| def GetAXInfo(ax):
 | |
|     """
 | |
|     Returns a printable summary of the TypeInfo from the ActiveX instance
 | |
|     passed in.
 | |
|     """
 | |
| 
 | |
|     def ProcessFuncX(f, out, name):
 | |
|         out.append(name)
 | |
|         out.append(t4 + "retType:  %s" % f.retType.vt_type)
 | |
|         if f.params:
 | |
|             out.append(t4 + "params:")
 | |
|             for p in f.params:
 | |
|                 out.append(t8 + p.name)
 | |
|                 out.append(t8+t4+ "in:%s  out:%s  optional:%s  type:%s" % (p.isIn, p.isOut, p.isOptional, p.vt_type))
 | |
|         out.append('')
 | |
| 
 | |
|     def ProcessPropX(p, out):
 | |
|         out.append(GernerateAXModule.trimPropName(p.name))
 | |
|         out.append(t4+ "type:%s  arg:%s  canGet:%s  canSet:%s" % (p.type.vt_type, p.arg.vt_type, p.canGet, p.canSet))
 | |
|         out.append('')
 | |
| 
 | |
|     out = []
 | |
| 
 | |
|     out.append("PROPERTIES")
 | |
|     out.append("-"*20)
 | |
|     for p in ax.GetAXProperties():
 | |
|         ProcessPropX(p, out)
 | |
|     out.append('\n\n')
 | |
| 
 | |
|     out.append("METHODS")
 | |
|     out.append("-"*20)
 | |
|     for m in ax.GetAXMethods():
 | |
|         ProcessFuncX(m, out, GernerateAXModule.trimMethodName(m.name))
 | |
|     out.append('\n\n')
 | |
| 
 | |
|     out.append("EVENTS")
 | |
|     out.append("-"*20)
 | |
|     for e in ax.GetAXEvents():
 | |
|         ProcessFuncX(e, out, GernerateAXModule.trimEventName(e.name))
 | |
|     out.append('\n\n')
 | |
| 
 | |
|     return "\n".join(out)
 | |
| 
 | |
| 
 | |
| 
 | |
| class GernerateAXModule:
 | |
|     def __init__(self, ax, className, modulePath, moduleName=None, verbose=False):
 | |
|         """
 | |
|         Make a Python module file with a class that has been specialized
 | |
|         for the AcitveX object.
 | |
| 
 | |
|             ax           An instance of the ActiveXWindow class
 | |
|             className    The name to use for the new class
 | |
|             modulePath   The path where the new module should be written to
 | |
|             moduleName   The name of the .py file to create.  If not given
 | |
|                          then the className will be used.
 | |
|         """
 | |
|         import os
 | |
|         if moduleName is None:
 | |
|             moduleName = className + '.py'
 | |
|         filename = os.path.join(modulePath, moduleName)
 | |
|         if verbose:
 | |
|             print "Creating module in:", filename
 | |
|             print "  ProgID:  ", ax.GetCLSID().GetProgIDString()
 | |
|             print "  CLSID:   ", ax.GetCLSID().GetCLSIDString()
 | |
|             print
 | |
|         self.mf = file(filename, "w")
 | |
|         self.WriteFileHeader(ax)
 | |
|         self.WriteEvents(ax)
 | |
|         self.WriteClassHeader(ax, className)
 | |
|         self.WriteMethods(ax)
 | |
|         self.WriteProperties(ax)
 | |
|         self.WriteDocs(ax)
 | |
|         self.mf.close()
 | |
|         del self.mf
 | |
| 
 | |
| 
 | |
|     def WriteFileHeader(self, ax):
 | |
|         self.write("# This module was generated by the wx.activex.GernerateAXModule class\n"
 | |
|                    "# (See also the genaxmodule script.)\n")
 | |
|         self.write("import wx")
 | |
|         self.write("import wx.activex\n")
 | |
|         self.write("clsID = '%s'\nprogID = '%s'\n"
 | |
|                    % (ax.GetCLSID().GetCLSIDString(), ax.GetCLSID().GetProgIDString()))
 | |
|         self.write("\n")
 | |
| 
 | |
| 
 | |
|     def WriteEvents(self, ax):
 | |
|         events = ax.GetAXEvents()
 | |
|         if events:
 | |
|             self.write("# Create eventTypes and event binders")
 | |
|             for e in events:
 | |
|                 self.write("wxEVT_%s = wx.activex.RegisterActiveXEvent('%s')"
 | |
|                            % (self.trimEventName(e.name), e.name))
 | |
|             self.write()
 | |
|             for e in events:
 | |
|                 n = self.trimEventName(e.name)
 | |
|                 self.write("EVT_%s = wx.PyEventBinder(wxEVT_%s, 1)" % (n,n))
 | |
|             self.write("\n")
 | |
| 
 | |
| 
 | |
|     def WriteClassHeader(self, ax, className):
 | |
|         self.write("# Derive a new class from ActiveXWindow")
 | |
|         self.write("""\
 | |
| class %s(wx.activex.ActiveXWindow):
 | |
|     def __init__(self, parent, ID=-1, pos=wx.DefaultPosition,
 | |
|                  size=wx.DefaultSize, style=0, name='%s'):
 | |
|         wx.activex.ActiveXWindow.__init__(self, parent,
 | |
|             wx.activex.CLSID('%s'),
 | |
|             ID, pos, size, style, name)
 | |
|         """ % (className, className, ax.GetCLSID().GetCLSIDString()) )
 | |
| 
 | |
| 
 | |
|     def WriteMethods(self, ax):
 | |
|         methods = ax.GetAXMethods()
 | |
|         if methods:
 | |
|             self.write(t4, "# Methods exported by the ActiveX object")
 | |
|             for m in methods:
 | |
|                 name = self.trimMethodName(m.name)
 | |
|                 self.write(t4, "def %s(self%s):" % (name, self.getParameters(m, True)))
 | |
|                 self.write(t8, "return self.CallAXMethod('%s'%s)" % (m.name, self.getParameters(m, False)))
 | |
|                 self.write()
 | |
|             
 | |
| 
 | |
|     def WriteProperties(self, ax):
 | |
|         props = ax.GetAXProperties()
 | |
|         if props:
 | |
|             self.write(t4, "# Getters, Setters and properties")
 | |
|             for p in props:
 | |
|                 getterName = setterName = "None"
 | |
|                 if p.canGet:
 | |
|                     getterName = "_get_" + p.name
 | |
|                     self.write(t4, "def %s(self):" % getterName)
 | |
|                     self.write(t8, "return self.GetAXProp('%s')" % p.name)
 | |
|                 if p.canSet:
 | |
|                     setterName = "_set_" + p.name
 | |
|                     self.write(t4, "def %s(self, %s):" % (setterName, p.arg.name))
 | |
|                     self.write(t8, "self.SetAXProp('%s', %s)" % (p.name, p.arg.name))
 | |
| 
 | |
|                 self.write(t4, "%s = property(%s, %s)" %
 | |
|                            (self.trimPropName(p.name), getterName, setterName))
 | |
|                 self.write()
 | |
|                 
 | |
| 
 | |
|     def WriteDocs(self, ax):
 | |
|         self.write()
 | |
|         doc = GetAXInfo(ax)
 | |
|         for line in doc.split('\n'):
 | |
|             self.write("#  ", line)
 | |
|             
 | |
| 
 | |
| 
 | |
|     def write(self, *args):
 | |
|         for a in args:
 | |
|             self.mf.write(a)
 | |
|         self.mf.write("\n")
 | |
| 
 | |
| 
 | |
|     def trimEventName(name):
 | |
|         if name.startswith("On"):
 | |
|             name = name[2:]
 | |
|         return name
 | |
|     trimEventName = staticmethod(trimEventName)
 | |
| 
 | |
| 
 | |
|     def trimPropName(name):
 | |
|         #name = name[0].lower() + name[1:]
 | |
|         name = name.lower()
 | |
|         import keyword
 | |
|         if name in keyword.kwlist: name += '_'
 | |
|         return name
 | |
|     trimPropName = staticmethod(trimPropName)
 | |
| 
 | |
| 
 | |
|     def trimMethodName(name):
 | |
|         import keyword
 | |
|         if name in keyword.kwlist: name += '_'
 | |
|         return name
 | |
|     trimMethodName = staticmethod(trimMethodName)
 | |
|     
 | |
| 
 | |
|     def getParameters(self, m, withDefaults):
 | |
|         import keyword
 | |
|         st = ""
 | |
|         # collect the input parameters, if both isIn and isOut are
 | |
|         # False then assume it is an input paramater
 | |
|         params = []
 | |
|         for p in m.params:
 | |
|             if p.isIn or (not p.isIn and not p.isOut):
 | |
|                 params.append(p)
 | |
|         # did we get any?
 | |
|         for p in params:
 | |
|             name = p.name
 | |
|             if name in keyword.kwlist: name += '_'
 | |
|             st += ", "
 | |
|             st += name
 | |
|             if withDefaults and p.isOptional:
 | |
|                 st += '=None'
 | |
|         return st
 | |
| 
 | |
| 
 | |
| #---------------------------------------------------------------------------
 |