📄 xrced.py
字号:
remove = False tag = node.tagName if tag == 'object': if not klass.hasChildren: remove = True elif tag not in klass.allParams and \ (not klass.hasStyle or tag not in klass.styles): remove = True else: tags.append(tag) if remove: elem.removeChild(node) node.unlink() # Remove sizeritem child if spacer if className == 'spacer' and xxx.className != 'spacer': sizeritem = elem.parentNode assert sizeritem.getAttribute('class') == 'sizeritem' sizeritem.removeChild(elem) elem.unlink() elem = sizeritem tree.GetPyData(selected).hasChild = False elif xxx.className == 'spacer' and className != 'spacer': # Create sizeritem element assert xxx.parent.isSizer elem.setAttribute('class', 'sizeritem') node = MakeEmptyDOM(className) elem.appendChild(node) # Replace to point to new object xxx = xxxSizerItem(xxx.parent, elem) elem = node tree.SetPyData(selected, xxx) xxx = xxx.child else: # Copy parameters present in dummy but not in elem for node in dummy.childNodes: if node.tagName not in tags: elem.appendChild(node.cloneNode(True)) dummy.unlink() # Change class name elem.setAttribute('class', className) if elem.hasAttribute('subclass'): elem.removeAttribute('subclass') # clear subclassing # Re-create xxx element xxx = MakeXXXFromDOM(xxx.parent, elem) # Remove incompatible style flags if 'style' in xxx.params: styles = map(string.strip, xxx.params['style'].value().split('|')) newStyles = [s for s in styles if s in klass.winStyles or s in genericStyles] if newStyles != styles: if newStyles: value = reduce(lambda a,b: a+'|'+b, newStyles) else: value = '' xxx.params['style'].update(value) # Update parent in child objects if tree.ItemHasChildren(selected): i, cookie = tree.GetFirstChild(selected) while i.IsOk(): x = tree.GetPyData(i) x.parent = xxx if x.hasChild: x.child.parent = xxx i, cookie = tree.GetNextChild(selected, cookie) # Update tree if tree.GetPyData(selected).hasChild: # child container container = tree.GetPyData(selected) container.resetChild(xxx) xxx = container else: tree.SetPyData(selected, xxx) tree.SetItemText(selected, xxx.treeName()) tree.SetItemImage(selected, xxx.treeImage()) # Set default name for top-level windows if parent.__class__ == xxxMainNode: cl = xxx.treeObject().__class__ frame.maxIDs[cl] += 1 xxx.setTreeName('%s%d' % (defaultIDs[cl], frame.maxIDs[cl])) # Update panel g.panel.SetData(xxx) # Update tools g.tools.UpdateUI() #undoMan.RegisterUndo(UndoPasteCreate(parentLeaf, parent, newItem, selected)) # Update view? if g.testWin and tree.IsHighlatable(selected): if conf.autoRefresh: tree.needUpdate = True tree.pendingHighLight = selected else: tree.pendingHighLight = None tree.SetFocus() self.SetModified() # Expand/collapse subtree def OnExpand(self, evt): if tree.selection: tree.ExpandAll(tree.selection) else: tree.ExpandAll(tree.root) def OnCollapse(self, evt): if tree.selection: tree.CollapseAll(tree.selection) else: tree.CollapseAll(tree.root) def OnPullDownHighlight(self, evt): menuId = evt.GetMenuId() if menuId != -1: menu = evt.GetEventObject() try: help = menu.GetHelpString(menuId) self.SetStatusText(help) except: self.SetStatusText('') else: self.SetStatusText('') def OnUpdateUI(self, evt): if evt.GetId() in [wx.ID_CUT, wx.ID_COPY, self.ID_DELETE]: evt.Enable(tree.selection is not None and tree.selection != tree.root) elif evt.GetId() == wx.ID_SAVE: evt.Enable(self.modified) elif evt.GetId() in [wx.ID_PASTE, self.ID_TOOL_PASTE]: evt.Enable(tree.selection is not None) elif evt.GetId() in [self.ID_TEST, self.ID_MOVEUP, self.ID_MOVEDOWN, self.ID_MOVELEFT, self.ID_MOVERIGHT]: evt.Enable(tree.selection is not None and tree.selection != tree.root) elif evt.GetId() in [self.ID_LOCATE, self.ID_TOOL_LOCATE, self.ID_REFRESH]: evt.Enable(g.testWin is not None) elif evt.GetId() == wx.ID_UNDO: evt.Enable(undoMan.CanUndo()) elif evt.GetId() == wx.ID_REDO: evt.Enable(undoMan.CanRedo()) def OnIdle(self, evt): if self.inIdle: return # Recursive call protection self.inIdle = True #print 'onidle',tree.needUpdate,tree.pendingHighLight try: if tree.needUpdate: if conf.autoRefresh: if g.testWin: #self.SetStatusText('Refreshing test window...') # (re)create tree.CreateTestWin(g.testWin.item) #self.SetStatusText('') tree.needUpdate = False elif tree.pendingHighLight: try: tree.HighLight(tree.pendingHighLight) except: # Remove highlight if any problem if g.testWin and g.testWin.highLight: g.testWin.highLight.Remove() tree.pendingHighLight = None raise else: evt.Skip() finally: self.inIdle = False def OnIconize(self, evt): if evt.Iconized(): conf.x, conf.y = self.GetPosition() conf.width, conf.height = self.GetSize() if conf.embedPanel: conf.sashPos = self.splitter.GetSashPosition() else: conf.panelX, conf.panelY = self.miniFrame.GetPosition() conf.panelWidth, conf.panelHeight = self.miniFrame.GetSize() self.miniFrame.Show(False) else: if not conf.embedPanel: self.miniFrame.Show(True) evt.Skip() def OnCloseWindow(self, evt): if not self.AskSave(): return if g.testWin: g.testWin.Destroy() if not panel.GetPageCount() == 2: panel.page2.Destroy() else: # If we don't do this, page does not get destroyed (a bug?) panel.RemovePage(1) if not self.IsIconized(): conf.x, conf.y = self.GetPosition() if wx.Platform == '__WXMAC__': conf.width, conf.height = self.GetClientSize() else: conf.width, conf.height = self.GetSize() if conf.embedPanel: conf.sashPos = self.splitter.GetSashPosition() else: conf.panelX, conf.panelY = self.miniFrame.GetPosition() conf.panelWidth, conf.panelHeight = self.miniFrame.GetSize() evt.Skip() def CreateLocalConf(self, path): name = os.path.splitext(path)[0] name += '.xcfg' return wx.FileConfig(localFilename=name) def Clear(self): self.dataFile = '' conf.localconf = None undoMan.Clear() self.SetModified(False) tree.Clear() panel.Clear() if g.testWin: g.testWin.Destroy() g.testWin = None # Numbers for new controls self.maxIDs = {} for cl in [xxxPanel, xxxDialog, xxxFrame, xxxMenuBar, xxxMenu, xxxToolBar, xxxWizard, xxxBitmap, xxxIcon]: self.maxIDs[cl] = 0 # Restore handlers, menu, etc. to initial setHandlers(self.handlers[:]) g.pullDownMenu.custom = self.custom[:] # Remove modules imported from comment directives map(sys.modules.pop, [m for m in sys.modules if m not in self.modules]) xxxParamComment.locals = {} # clear local namespace xxxParamComment.allow = None # clear execution state def SetModified(self, state=True): self.modified = state name = os.path.basename(self.dataFile) if not name: name = defaultName if state: self.SetTitle(progname + ': ' + name + ' *') else: self.SetTitle(progname + ': ' + name) def Open(self, path): if not os.path.exists(path): wx.LogError('File does not exists: %s' % path) return False # Try to read the file try: f = open(path) self.Clear() dom = minidom.parse(f) f.close() # Set encoding global variable and default encoding if dom.encoding: g.currentEncoding = dom.encoding wx.SetDefaultPyEncoding(g.currentEncoding.encode()) else: g.currentEncoding = '' # Change dir self.dataFile = path = os.path.abspath(path) dir = os.path.dirname(path) if dir: os.chdir(dir) # Allow importing modules from the same directory sys.path = sys_path + [dir] tree.SetData(dom) self.SetTitle(progname + ': ' + os.path.basename(path)) conf.localconf = self.CreateLocalConf(self.dataFile) except: # Nice exception printing inf = sys.exc_info() wx.LogError(traceback.format_exception(inf[0], inf[1], None)[-1]) wx.LogError('Error reading file: %s' % path) if debug: raise return False return True def Indent(self, node, indent = 0): if node.nodeType == minidom.Node.COMMENT_NODE: text = self.domCopy.createTextNode('\n' + ' ' * indent) node.parentNode.insertBefore(text, node) return # no children # Copy child list because it will change soon children = node.childNodes[:] # Main node doesn't need to be indented if indent: text = self.domCopy.createTextNode('\n' + ' ' * indent) node.parentNode.insertBefore(text, node) if children: # Append newline after last child, except for text nodes if children[-1].nodeType == minidom.Node.ELEMENT_NODE: text = self.domCopy.createTextNode('\n' + ' ' * indent) node.appendChild(text) # Indent children which are elements for n in children: if n.nodeType == minidom.Node.ELEMENT_NODE or \ n.nodeType == minidom.Node.COMMENT_NODE: self.Indent(n, indent + 2) def Save(self, path): try: import codecs # Apply changes if tree.selection and panel.IsModified(): self.OnRefresh(wx.CommandEvent()) if g.currentEncoding: f = codecs.open(path, 'wt', g.currentEncoding) else: f = codecs.open(path, 'wt') # Make temporary copy for formatting it # !!! We can't clone dom node, it works only once #self.domCopy = tree.dom.cloneNode(True) self.domCopy = MyDocument() mainNode = self.domCopy.appendChild(tree.mainNode.cloneNode(True)) # Remove first child (test element) testElem = mainNode.firstChild mainNode.removeChild(testElem) testElem.unlink() self.Indent(mainNode) self.domCopy.writexml(f, encoding = g.currentEncoding) f.close() self.domCopy.unlink() self.domCopy = None self.SetModified(False) panel.SetModified(False) conf.localconf.Flush() except: inf = sys.exc_info()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -