]> git.saurik.com Git - wxWidgets.git/blobdiff - wxPython/wx/tools/XRCed/xxx.py
searching for plugins in XRCEDPATH
[wxWidgets.git] / wxPython / wx / tools / XRCed / xxx.py
index 659ddebfccbcbe6d7df36e030e6eccb19e372e41..cdbc54c0307f7d8166e83a75beefb7706709fa61 100644 (file)
@@ -7,6 +7,7 @@
 from xml.dom import minidom
 from globals import *
 from params import *
+import traceback, types
 
 # Base class for interface parameter classes
 class xxxNode:
@@ -918,10 +919,105 @@ class xxxUnknown(xxxObject):
 ################################################################################
 # Comment
 
+_handlers = []                          # custom handler classes/funcs
+def getHandlers():
+    return _handlers
+def setHandlers(handlers):
+    global _handlers
+    _handlers = handlers
+_CFuncPtr = None                        # ctypes function type
+
+def register(hndlr):
+    """Register hndlr function or XmlResourceHandler class."""
+    if _CFuncPtr and isinstance(hndlr, _CFuncPtr):
+        _handlers.append(hndlr)
+        return
+    if not isinstance(hndlr, type):
+        wx.LogError('handler is not a type: %s' % hndlr)
+    elif not issubclass(hndlr, wx.xrc.XmlResourceHandler):
+        wx.LogError('handler is not a XmlResourceHandler: %s' % hndlr)
+    else:
+        _handlers.append(hndlr)
+
+def load_dl(path, localname=''):
+    """Load shared/dynamic library into xxx namespace.
+
+    If path is not absolute or relative, try to find in the module's directory.
+    """
+    if not localname:
+        localname = os.path.basename(os.path.splitext(path)[0])
+    try:
+        import ctypes
+        global _CFuncPtr
+        _CFuncPtr = ctypes._CFuncPtr    # use as a flag of loaded ctypes
+        #if not os.path.dirname(path) and os.path.isfile(path):
+            
+    except ImportError:
+        wx.LogError('ctypes module not found')
+        globals()[localname] = None
+        return
+    try:
+        dl = ctypes.CDLL(path)
+        globals()[localname] = dl
+        # Register AddXmlHandlers() if exists
+        try:
+            register(dl.AddXmlHandlers)
+        except:
+            pass
+    except:
+        wx.LogError('error loading dynamic library: %s' % path)
+        print traceback.print_exc()
+
+# Called when creating test window
+def addHandlers():
+    for h in _handlers:
+        if _CFuncPtr and isinstance(h, _CFuncPtr):
+            try:
+                apply(h, ())
+            except:
+                wx.LogError('error calling DL func: "%s"' % h)
+                print traceback.print_exc()
+        else:
+            try:
+                xrc.XmlResource.Get().AddHandler(apply(h, ()))
+            except:
+                wx.LogError('error adding XmlHandler: "%s"' % h)
+                print traceback.print_exc()
+
+def custom(klassName, klass='unknown'):
+    """Define custom control based on xrcClass.
+
+    klass: new object name
+    xrcClass: name of an existing XRC object class or
+              a class object defining class parameters.
+    """
+    if type(klass) is str:
+        # Copy correct xxx class under new name
+        kl = xxxDict[klass]
+        xxxClass = types.ClassType('xxx' + klassName, kl.__bases__, kl.__dict__)
+    else:
+        xxxClass = klass
+        # Register param IDs
+        for param in klass.allParams + klass.paramDict.keys():
+            if not paramIDs.has_key(param):
+                paramIDs[param] = wx.NewId()
+    # Insert in dictionaty
+    xxxDict[klassName] = xxxClass
+    # Add to menu
+    g.pullDownMenu.addCustom(klassName)
+
 class xxxParamComment(xxxParam):
     def __init__(self, node):
         xxxNode.__init__(self, node)
         self.textNode = node
+        # Parse "pragma" comments
+        if node.data and node.data[0] == '%':
+            try:
+                code = node.data[1:]
+                exec code in globals()
+            except:
+                wx.LogError('exec error: "%s"' % code)
+                print traceback.print_exc()
 
 class xxxComment(xxxObject):
     hasStyle = hasName = False
@@ -942,6 +1038,7 @@ class xxxComment(xxxObject):
 
 ################################################################################
 
+# Mapping of XRC names to xxx classes
 xxxDict = {
     'wxPanel': xxxPanel,
     'wxDialog': xxxDialog,