+ 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):
+ locals = {} # namespace for comment directives
+ allow = None # undefined initial state for current file
+ def __init__(self, node):
+ xxxNode.__init__(self, node)
+ self.textNode = node
+ # Parse "pragma" comments if enabled
+ if node.data and node.data[0] == '%' and g.conf.allowExec != 'no' and \
+ xxxParamComment.allow is not False:
+ # Show warning
+ if g.conf.allowExec == 'ask' and xxxParamComment.allow is None:
+ flags = wx.ICON_EXCLAMATION | wx.YES_NO | wx.CENTRE
+ dlg = wx.MessageDialog(g.frame, '''
+This file contains executable %comment directives. Allow to execute?''',
+ 'Warning', flags)
+ say = dlg.ShowModal()
+ dlg.Destroy()
+ if say == wx.ID_YES:
+ xxxParamComment.allow = True
+ else:
+ xxxParamComment.allow = False
+ try:
+ code = node.data[1:]
+ exec code in globals(), self.locals
+ except:
+ wx.LogError('exec error: "%s"' % code)
+ print traceback.print_exc()
+
+class xxxComment(xxxObject):
+ hasStyle = hasName = False
+ allParams = required = ['comment']
+
+ def __init__(self, parent, node):
+ self.parent = parent
+ self.node = node
+ self.isElement = False
+ self.undo = None
+ self.className = 'comment'
+ self.ref = self.subclass = None
+ self.params = {'comment': xxxParamComment(node)}
+
+ def treeName(self):
+ # Replace newlines by \n to avoid tree item resizing
+ return self.params['comment'].value().replace('\n', r'\n')
+
+################################################################################
+
+# Mapping of XRC names to xxx classes