xrced.py

来自「用python写的ide开发环境,巨强大,不过需要wxpython的支持」· Python 代码 · 共 1,616 行 · 第 1/5 页

PY
1,616
字号
            if selected == g.testWin.item:                g.testWin.Destroy()                g.testWin = None            else:                # Remove highlight, update testWin                if g.testWin.highLight:                    g.testWin.highLight.Remove()                tree.needUpdate = True        # Prepare undo data        panel.Apply()        index = tree.ItemFullIndex(selected)        xxx = tree.GetPyData(selected)        parent = tree.GetPyData(tree.GetItemParent(selected)).treeObject()        tree.UnselectAll()        elem = tree.RemoveLeaf(selected)        undoMan.RegisterUndo(UndoCutDelete(index, parent, elem))        if evt.GetId() == wx.ID_CUT:            if wx.TheClipboard.Open():                if xxx.isElement:                    data = wx.CustomDataObject('XRCED')                    # (False, True)                    s = elem.toxml(encoding=expat.native_encoding)                else:                    data = wx.CustomDataObject('XRCED_node')                    s = xxx.node.data                data.SetData(cPickle.dumps(s))                wx.TheClipboard.SetData(data)                wx.TheClipboard.Close()            else:                wx.MessageBox("Unable to open the clipboard", "Error")        tree.pendingHighLight = None        # Update tools        panel.Clear()        self.SetModified()        self.SetStatusText(status)    def OnSubclass(self, evt):        selected = tree.selection        xxx = tree.GetPyData(selected).treeObject()        elem = xxx.node        subclass = xxx.subclass        dlg = wx.TextEntryDialog(self, 'Subclass:', defaultValue=subclass)        if dlg.ShowModal() == wx.ID_OK:            subclass = dlg.GetValue()            if subclass:                elem.setAttribute('subclass', subclass)            elif elem.hasAttribute('subclass'):                elem.removeAttribute('subclass')            self.SetModified()            xxx.subclass = elem.getAttribute('subclass')            tree.SetItemText(selected, xxx.treeName())            panel.pages[0].box.SetLabel(xxx.panelName())        dlg.Destroy()    def OnEmbedPanel(self, evt):        conf.embedPanel = evt.IsChecked()        if conf.embedPanel:            # Remember last dimentions            conf.panelX, conf.panelY = self.miniFrame.GetPosition()            conf.panelWidth, conf.panelHeight = self.miniFrame.GetSize()            size = self.GetSize()            pos = self.GetPosition()            sizePanel = panel.GetSize()            panel.Reparent(self.splitter)            self.miniFrame.GetSizer().Remove(panel)            # Widen            self.SetDimensions(pos.x, pos.y, size.width + sizePanel.width, size.height)            self.splitter.SplitVertically(tree, panel, conf.sashPos)            self.miniFrame.Show(False)        else:            conf.sashPos = self.splitter.GetSashPosition()            pos = self.GetPosition()            size = self.GetSize()            sizePanel = panel.GetSize()            self.splitter.Unsplit(panel)            sizer = self.miniFrame.GetSizer()            panel.Reparent(self.miniFrame)            panel.Show(True)            sizer.Add(panel, 1, wx.EXPAND)            self.miniFrame.Show(True)            self.miniFrame.SetDimensions(conf.panelX, conf.panelY,                                         conf.panelWidth, conf.panelHeight)            self.miniFrame.Layout()            # Reduce width            self.SetDimensions(pos.x, pos.y,                               max(size.width - sizePanel.width, self.minWidth), size.height)    def OnShowTools(self, evt):        conf.showTools = evt.IsChecked()        g.tools.Show(conf.showTools)        if conf.showTools:            self.toolsSizer.Prepend(g.tools, 0, wx.EXPAND)        else:            self.toolsSizer.Remove(g.tools)        self.toolsSizer.Layout()            def OnTest(self, evt):        if not tree.selection: return   # key pressed event        tree.ShowTestWindow(tree.selection)    def OnTestHide(self, evt):        tree.CloseTestWindow()    # Find object by relative position    def FindObject(self, item, obj):        # We simply perform depth-first traversal, sinse it's too much        # hassle to deal with all sizer/window combinations        w = tree.FindNodeObject(item)        if w == obj or isinstance(w, wx.GBSizerItem) and w.GetWindow() == obj:            return item        if tree.ItemHasChildren(item):            child = tree.GetFirstChild(item)[0]            while child:                found = self.FindObject(child, obj)                if found: return found                child = tree.GetNextSibling(child)        return None    # Click event after locate activated    def OnTestWinLeftDown(self, evt):        # Restore normal event processing        self.SetHandler(g.testWin)        g.testWin.Disconnect(wx.ID_ANY, wx.ID_ANY, wx.wxEVT_LEFT_DOWN)        item = self.FindObject(g.testWin.item, evt.GetEventObject())        if item:            tree.EnsureVisible(item)            tree.SelectItem(item)        self.tb.ToggleTool(self.ID_TOOL_LOCATE, False)        if item:            self.SetStatusText('Selected %s' % tree.GetItemText(item))        else:            self.SetStatusText('Locate failed!')    def SetHandler(self, w, h=None):        if h:            w.SetEventHandler(h)            w.SetCursor(wx.CROSS_CURSOR)        else:            w.SetEventHandler(w)            w.SetCursor(wx.NullCursor)        for ch in w.GetChildren():            self.SetHandler(ch, h)    def OnLocate(self, evt):        if g.testWin:            if evt.GetId() == self.ID_LOCATE or \               evt.GetId() == self.ID_TOOL_LOCATE and evt.IsChecked():                self.SetHandler(g.testWin, g.testWin)                g.testWin.Connect(wx.ID_ANY, wx.ID_ANY, wx.wxEVT_LEFT_DOWN, self.OnTestWinLeftDown)                if evt.GetId() == self.ID_LOCATE:                    self.tb.ToggleTool(self.ID_TOOL_LOCATE, True)            elif evt.GetId() == self.ID_TOOL_LOCATE and not evt.IsChecked():                self.SetHandler(g.testWin, None)                g.testWin.Disconnect(wx.ID_ANY, wx.ID_ANY, wx.wxEVT_LEFT_DOWN)            self.SetStatusText('Click somewhere in your test window now')    def OnRefresh(self, evt):        # If modified, apply first        selection = tree.selection        if selection:            xxx = tree.GetPyData(selection)            if xxx and panel.IsModified():                tree.Apply(xxx, selection)        if g.testWin:            # (re)create            tree.CreateTestWin(g.testWin.item)        panel.modified = False        tree.needUpdate = False    def OnAutoRefresh(self, evt):        conf.autoRefresh = evt.IsChecked()        self.menuBar.Check(self.ID_AUTO_REFRESH, conf.autoRefresh)        self.tb.ToggleTool(self.ID_AUTO_REFRESH, conf.autoRefresh)    def OnAbout(self, evt):        str = '''\XRCed version %s(c) Roman Rolinsky <rollrom@users.sourceforge.net>Homepage: http://xrced.sourceforge.net\''' % version        dlg = wx.MessageDialog(self, str, 'About XRCed', wx.OK | wx.CENTRE)        dlg.ShowModal()        dlg.Destroy()    def OnReadme(self, evt):        text = open(os.path.join(basePath, 'README.txt'), 'r').read()        dlg = ScrolledMessageDialog(self, text, "XRCed README")        dlg.ShowModal()        dlg.Destroy()    # Simple emulation of python command line    def OnDebugCMD(self, evt):        while 1:            try:                exec raw_input('C:\> ')            except EOFError:                print '^D'                break            except:                (etype, value, tb) =sys.exc_info()                tblist =traceback.extract_tb(tb)[1:]                msg =' '.join(traceback.format_exception_only(etype, value)                        +traceback.format_list(tblist))                print msg    def OnCreate(self, evt):        # Ignore fake events generated while dragging        if g.tools.drag:             g.tools.drag = False            return        selected = tree.selection        if tree.ctrl: appendChild = False        else: appendChild = not tree.NeedInsert(selected)        xxx = tree.GetPyData(selected)        if not appendChild:            # If insert before            if tree.shift:                # If has previous item, insert after it, else append to parent                nextItem = selected                parentLeaf = tree.GetItemParent(selected)            else:                # If has next item, insert, else append to parent                nextItem = tree.GetNextSibling(selected)                parentLeaf = tree.GetItemParent(selected)        # Expanded container (must have children)        elif tree.shift and tree.IsExpanded(selected) \           and tree.GetChildrenCount(selected, False):            nextItem = tree.GetFirstChild(selected)[0]            parentLeaf = selected        else:            nextItem = wx.TreeItemId()            parentLeaf = selected        parent = tree.GetPyData(parentLeaf)        if parent.hasChild: parent = parent.child        self.CreateXXX(parent, parentLeaf, nextItem, evt.GetId())    # Actual method to create object and add to XML and wx trees    def CreateXXX(self, parent, parentLeaf, nextItem, id):        selected = tree.selection        # Create object_ref?        if id == ID_NEW.REF:            ref = wx.GetTextFromUser('Create reference to:', 'Create reference')            if not ref: return            xxx = MakeEmptyRefXXX(parent, ref)        elif id == ID_NEW.COMMENT:            xxx = MakeEmptyCommentXXX(parent)        else:            # Create empty element            if id >= ID_NEW.CUSTOM:                className = pullDownMenu.customMap[id]            else:                className = pullDownMenu.createMap[id]            xxx = MakeEmptyXXX(parent, className)        # Insert new node, register undo        if xxx.isElement:                 # true object            # 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]))            # And for some other standard controls            elif parent.__class__ == xxxStdDialogButtonSizer:                # ... we can even set automatically tree name                xxx.setTreeName(pullDownMenu.stdButtonIDs[id][0])                obj = xxx.treeObject()                # ... and label                elem = g.tree.dom.createElement('label')                elem.appendChild(g.tree.dom.createTextNode(pullDownMenu.stdButtonIDs[id][1]))                obj.params['label'] = xxxParam(elem)                xxx.treeObject().node.appendChild(elem)            # Else, set label if exists to class name            elif 'label' in xxx.treeObject().allParams:                label = className                if label[:2] == 'wx': label = label[2:]                xxx.treeObject().set('label', label.upper())        # For comment nodes, simply add node        newItem = tree.InsertNode(parentLeaf, parent, xxx.node, nextItem)        undoMan.RegisterUndo(UndoPasteCreate(parentLeaf, parent, newItem, selected))        tree.EnsureVisible(newItem)        tree.SelectItem(newItem)        if not tree.IsVisible(newItem):            tree.ScrollTo(newItem)            tree.Refresh()        # Update view?        if xxx.isElement and g.testWin and tree.IsHighlatable(newItem):            if conf.autoRefresh:                tree.needUpdate = True                tree.pendingHighLight = newItem            else:                tree.pendingHighLight = None        tree.SetFocus()        if not xxx.isElement:            tree.EditLabel(newItem)        self.SetModified()        return xxx    # Replace one object with another    def OnReplace(self, evt):        selected = tree.selection        xxx = tree.GetPyData(selected).treeObject()        elem = xxx.node        parent = elem.parentNode        undoMan.RegisterUndo(UndoReplace(selected))        # New class        className = pullDownMenu.createMap[evt.GetId() - 1000]                # Create temporary empty node (with default values)        dummy = MakeEmptyDOM(className)        if className == 'spacer' and xxx.className != 'spacer':            klass = xxxSpacer        elif xxx.className == 'spacer' and className != 'spacer':            klass = xxxSizerItem        else:            klass = xxxDict[className]        # Remove non-compatible children        if tree.ItemHasChildren(selected) and not klass.hasChildren:            tree.DeleteChildren(selected)        nodes = elem.childNodes[:]        tags = []        for node in nodes:            if node.nodeType != minidom.Node.ELEMENT_NODE: continue

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?