📄 xxx.py
字号:
# Name: xxx.py ('xxx' is easy to distinguish from 'wx' :) )# Purpose: XML interface classes# Author: Roman Rolinsky <rolinsky@mema.ucl.ac.be># Created: 22.08.2001# RCS-ID: $Id: xxx.py 47172 2007-07-05 21:51:46Z ROL $from xml.dom import minidomfrom globals import *from params import *import traceback, types# Base class for interface parameter classesclass xxxNode: def __init__(self, node): self.node = node def remove(self): self.node.parentNode.removeChild(self.node) self.node.unlink()# Generic (text) parameter classclass xxxParam(xxxNode): # Standard use: for text nodes def __init__(self, node): xxxNode.__init__(self, node) if not node.hasChildNodes(): # If does not have child nodes, create empty text node text = g.tree.dom.createTextNode('') node.appendChild(text) else: text = node.childNodes[0] # first child must be text node assert text.nodeType == minidom.Node.TEXT_NODE # Append other text nodes if present and delete them extraText = '' for n in node.childNodes[1:]: if n.nodeType == minidom.Node.TEXT_NODE: extraText += n.data node.removeChild(n) n.unlink() else: break if extraText: text.data = text.data + extraText # Use convertion from unicode to current encoding self.textNode = text # Value returns string if wx.USE_UNICODE: # no conversion is needed def value(self): return self.textNode.data def update(self, value): self.textNode.data = value else: def value(self): try: return self.textNode.data.encode(g.currentEncoding) except LookupError: return self.textNode.data.encode() def update(self, value): try: # handle exception if encoding is wrong self.textNode.data = unicode(value, g.currentEncoding) except UnicodeDecodeError: self.textNode.data = unicode(value) #wx.LogMessage("Unicode error: set encoding in file\nglobals.py to something appropriate")# Integer parameterclass xxxParamInt(xxxParam): # Standard use: for text nodes def __init__(self, node): xxxParam.__init__(self, node) # Value returns string def value(self): try: return int(self.textNode.data) except ValueError: return -1 # invalid value def update(self, value): self.textNode.data = str(value)# Content parameterclass xxxParamContent(xxxNode): def __init__(self, node): xxxNode.__init__(self, node) data, l = [], [] # data is needed to quicker value retrieval nodes = node.childNodes[:] # make a copy of the child list for n in nodes: if n.nodeType == minidom.Node.ELEMENT_NODE: assert n.tagName == 'item', 'bad content content' if not n.hasChildNodes(): # If does not have child nodes, create empty text node text = g.tree.dom.createTextNode('') node.appendChild(text) else: # !!! normalize? text = n.childNodes[0] # first child must be text node assert text.nodeType == minidom.Node.TEXT_NODE l.append(text) data.append(text.data) else: # remove other node.removeChild(n) n.unlink() self.l, self.data = l, data def value(self): return self.data def update(self, value): # If number if items is not the same, recreate children if len(value) != len(self.l): # remove first if number of items has changed childNodes = self.node.childNodes[:] for n in childNodes: self.node.removeChild(n) l = [] for str in value: itemElem = g.tree.dom.createElement('item') itemText = g.tree.dom.createTextNode(str) itemElem.appendChild(itemText) self.node.appendChild(itemElem) l.append(itemText) self.l = l else: for i in range(len(value)): self.l[i].data = value[i] self.data = value# Content parameter for checklistclass xxxParamContentCheckList(xxxNode): def __init__(self, node): xxxNode.__init__(self, node) data, l = [], [] # data is needed to quicker value retrieval nodes = node.childNodes[:] # make a copy of the child list for n in nodes: if n.nodeType == minidom.Node.ELEMENT_NODE: assert n.tagName == 'item', 'bad content content' checked = n.getAttribute('checked') if not checked: checked = 0 if not n.hasChildNodes(): # If does not have child nodes, create empty text node text = g.tree.dom.createTextNode('') node.appendChild(text) else: # !!! normalize? text = n.childNodes[0] # first child must be text node assert text.nodeType == minidom.Node.TEXT_NODE l.append((text, n)) data.append((str(text.data), int(checked))) else: # remove other node.removeChild(n) n.unlink() self.l, self.data = l, data def value(self): return self.data def update(self, value): # If number if items is not the same, recreate children if len(value) != len(self.l): # remove first if number of items has changed childNodes = self.node.childNodes[:] for n in childNodes: self.node.removeChild(n) l = [] for s,ch in value: itemElem = g.tree.dom.createElement('item') # Add checked only if True if ch: itemElem.setAttribute('checked', '1') itemText = g.tree.dom.createTextNode(s) itemElem.appendChild(itemText) self.node.appendChild(itemElem) l.append((itemText, itemElem)) self.l = l else: for i in range(len(value)): self.l[i][0].data = value[i][0] self.l[i][1].setAttribute('checked', str(value[i][1])) self.data = value# Bitmap parameterclass xxxParamBitmap(xxxParam): def __init__(self, node): xxxParam.__init__(self, node) self.stock_id = node.getAttribute('stock_id') def value(self): return [self.stock_id, xxxParam.value(self)] def update(self, value): self.stock_id = value[0] if self.stock_id: self.node.setAttribute('stock_id', self.stock_id) elif self.node.hasAttribute('stock_id'): self.node.removeAttribute('stock_id') xxxParam.update(self, value[1])################################################################################# Classes to interface DOM objectsclass xxxObject: # Default behavior hasChildren = False # has children elements? hasStyle = True # almost everyone hasName = True # has name attribute? isSizer = hasChild = False isElement = True allParams = [] # Some nodes have no parameters # Style parameters (all optional) styles = ['fg', 'bg', 'font', 'enabled', 'focused', 'hidden', 'tooltip'] # Special parameters specials = [] # Bitmap tags bitmapTags = ['bitmap', 'bitmap2', 'icon'] # Required paremeters: none by default required = [] # Default parameters with default values default = {} # Parameter types paramDict = {} # Window styles and extended styles winStyles = [] # Tree icon index #image = -1 # Construct a new xxx object from DOM element # parent is parent xxx object (or None if none), element is DOM element object def __init__(self, parent, element, refElem=None): self.parent = parent self.node = element self.refElem = refElem self.undo = None # Reference are dereferenced if element.tagName == 'object_ref': # Find original object self.ref = element.getAttribute('ref') if refElem: self.className = self.refElem.getAttribute('class') else: self.className = 'xxxUnknown' self.required = [] else: # Get attributes self.ref = None self.className = element.getAttribute('class') self.subclass = element.getAttribute('subclass') if self.hasName: self.name = element.getAttribute('name') # Set parameters (text element children) self.params = {} for n in element.childNodes[:]: if n.nodeType == minidom.Node.ELEMENT_NODE: tag = n.tagName if tag in ['object', 'object_ref']: continue # do nothing for object children here elif tag not in self.allParams and tag not in self.styles: print 'WARNING: unknown parameter for %s: %s' % \ (self.className, tag) elif tag in self.specials: self.special(tag, n) elif tag == 'content': if self.className == 'wxCheckListBox': self.params[tag] = xxxParamContentCheckList(n) else: self.params[tag] = xxxParamContent(n) elif tag == 'font': # has children self.params[tag] = xxxParamFont(element, n) elif tag in self.bitmapTags: # Can have attributes self.params[tag] = xxxParamBitmap(n) else: # simple parameter self.params[tag] = xxxParam(n) elif n.nodeType == minidom.Node.TEXT_NODE and n.data.isspace(): # Remove empty text nodes element.removeChild(n) n.unlink() # Check that all required params are set for param in self.required: if not self.params.has_key(param): # If default is specified, set it if self.default.has_key(param): elem = g.tree.dom.createElement(param) if param == 'content': if self.className == 'wxCheckListBox': self.params[param] = xxxParamContentCheckList(elem) else: self.params[param] = xxxParamContent(elem) else: self.params[param] = xxxParam(elem) # Find place to put new element: first present element after param found = False paramStyles = self.allParams + self.styles for p in paramStyles[paramStyles.index(param) + 1:]: # Content params don't have same type if self.params.has_key(p) and p != 'content': found = True break if found: nextTextElem = self.params[p].node self.node.insertBefore(elem, nextTextElem) else: self.node.appendChild(elem) else: wx.LogWarning('Required parameter %s of %s missing' % (param, self.className)) # Returns real tree object def treeObject(self): if self.hasChild: return self.child return self # Returns tree image index def treeImage(self): if self.hasChild: return self.child.treeImage() return self.image # Class name plus wx name def treeName(self): if self.hasChild: return self.child.treeName() if self.subclass: className = self.subclass else: className = self.className if self.hasName and self.name: return className + ' "' + self.name + '"' return className # Class name or subclass def panelName(self): if self.subclass: name = self.subclass + '(' + self.className + ')' name = self.className if self.ref: name = 'ref: ' + self.ref + ', ' + name return name # Sets name of tree object def setTreeName(self, name): if self.hasChild: obj = self.child else: obj = self obj.name = name obj.node.setAttribute('name', name) # Set normal (text) params def set(self, param, value): try: self.params[param].update(value)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -