⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 outlineservice.py

📁 wxPython的基本示例程序
💻 PY
📖 第 1 页 / 共 2 页
字号:
#----------------------------------------------------------------------------# Name:         OutlineService.py# Purpose:      Outline View Service for pydocview## Author:       Morgan Hua## Created:      8/3/04# CVS-ID:       $Id: OutlineService.py,v 1.6 2006/04/20 06:25:59 RD Exp $# Copyright:    (c) 2004-2005 ActiveGrid, Inc.# License:      wxWindows License#----------------------------------------------------------------------------import wximport wx.lib.docviewimport wx.lib.pydocviewimport Service_ = wx.GetTranslation#----------------------------------------------------------------------------# Constants#----------------------------------------------------------------------------SORT_NONE = 0SORT_ASC = 1SORT_DESC = 2class OutlineView(Service.ServiceView):    """ Reusable Outline View for any document.        As a default, it uses a modified tree control (OutlineTreeCtrl) that allows sorting.        Subclass OutlineTreeCtrl to customize the tree control and call SetTreeCtrl to install a customized tree control.        When an item is selected, the document view is called back (with DoSelectCallback) to highlight and display the corresponding item in the document view.    """    #----------------------------------------------------------------------------    # Overridden methods    #----------------------------------------------------------------------------    def __init__(self, service):        Service.ServiceView.__init__(self, service)        self._actionOnSelect = True    def _CreateControl(self, parent, id):        treeCtrl = OutlineTreeCtrl(parent, id)        wx.EVT_TREE_SEL_CHANGED(treeCtrl, treeCtrl.GetId(), self.DoSelection)        wx.EVT_SET_FOCUS(treeCtrl, self.DoSelection)        wx.EVT_ENTER_WINDOW(treeCtrl, treeCtrl.CallDoLoadOutlineCallback)        wx.EVT_RIGHT_DOWN(treeCtrl, self.OnRightClick)        return treeCtrl    #----------------------------------------------------------------------------    # Service specific methods    #----------------------------------------------------------------------------    def OnRightClick(self, event):        menu = wx.Menu()        menu.AppendRadioItem(OutlineService.SORT_NONE, _("Unsorted"), _("Display items in original order"))        menu.AppendRadioItem(OutlineService.SORT_ASC, _("Sort A-Z"), _("Display items in ascending order"))        menu.AppendRadioItem(OutlineService.SORT_DESC, _("Sort Z-A"), _("Display items in descending order"))        config = wx.ConfigBase_Get()        sort = config.ReadInt("OutlineSort", SORT_NONE)        if sort == SORT_NONE:            menu.Check(OutlineService.SORT_NONE, True)        elif sort == SORT_ASC:            menu.Check(OutlineService.SORT_ASC, True)        elif sort == SORT_DESC:            menu.Check(OutlineService.SORT_DESC, True)        self.GetControl().PopupMenu(menu, event.GetPosition())        menu.Destroy()    #----------------------------------------------------------------------------    # Tree Methods    #----------------------------------------------------------------------------    def DoSelection(self, event):        if not self._actionOnSelect:            return        item = self.GetControl().GetSelection()        if item:            self.GetControl().CallDoSelectCallback(item)        event.Skip()    def ResumeActionOnSelect(self):        self._actionOnSelect = True    def StopActionOnSelect(self):        self._actionOnSelect = False    def SetTreeCtrl(self, tree):        self.SetControl(tree)        wx.EVT_TREE_SEL_CHANGED(self.GetControl(), self.GetControl().GetId(), self.DoSelection)        wx.EVT_ENTER_WINDOW(self.GetControl(), treeCtrl.CallDoLoadOutlineCallback)        wx.EVT_RIGHT_DOWN(self.GetControl(), self.OnRightClick)    def GetTreeCtrl(self):        return self.GetControl()    def OnSort(self, sortOrder):        treeCtrl = self.GetControl()        treeCtrl.SetSortOrder(sortOrder)        treeCtrl.SortAllChildren(treeCtrl.GetRootItem())    def ClearTreeCtrl(self):        if self.GetControl():            self.GetControl().DeleteAllItems()    def GetExpansionState(self):        expanded = []        treeCtrl = self.GetControl()        if not treeCtrl:            return expanded        parentItem = treeCtrl.GetRootItem()        if not parentItem:            return expanded        if not treeCtrl.IsExpanded(parentItem):            return expanded        expanded.append(treeCtrl.GetItemText(parentItem))        (child, cookie) = treeCtrl.GetFirstChild(parentItem)        while child.IsOk():            if treeCtrl.IsExpanded(child):                expanded.append(treeCtrl.GetItemText(child))            (child, cookie) = treeCtrl.GetNextChild(parentItem, cookie)        return expanded    def SetExpansionState(self, expanded):        if not expanded or len(expanded) == 0:            return        treeCtrl = self.GetControl()                parentItem = treeCtrl.GetRootItem()        if not parentItem:            return                    if expanded[0] != treeCtrl.GetItemText(parentItem):            return        (child, cookie) = treeCtrl.GetFirstChild(parentItem)        while child.IsOk():            if treeCtrl.GetItemText(child) in expanded:                treeCtrl.Expand(child)            (child, cookie) = treeCtrl.GetNextChild(parentItem, cookie)        treeCtrl.EnsureVisible(parentItem)class OutlineTreeCtrl(wx.TreeCtrl):    """ Default Tree Control Class for OutlineView.        This class has the added functionality of sorting by the labels    """    #----------------------------------------------------------------------------    # Constants    #----------------------------------------------------------------------------    ORIG_ORDER = 0    VIEW = 1    CALLBACKDATA = 2    #----------------------------------------------------------------------------    # Overridden Methods    #----------------------------------------------------------------------------    def __init__(self, parent, id, style=wx.TR_HAS_BUTTONS|wx.TR_DEFAULT_STYLE):        wx.TreeCtrl.__init__(self, parent, id, style = style)        self._origOrderIndex = 0        self._sortOrder = SORT_NONE    def DeleteAllItems(self):        self._origOrderIndex = 0        wx.TreeCtrl.DeleteAllItems(self)    #----------------------------------------------------------------------------    # Sort Methods    #----------------------------------------------------------------------------    def SetSortOrder(self, sortOrder = SORT_NONE):        """ Sort Order constants are defined at top of file """        self._sortOrder = sortOrder    def OnCompareItems(self, item1, item2):        if self._sortOrder == SORT_ASC:            return cmp(self.GetItemText(item1).lower(), self.GetItemText(item2).lower())  # sort A-Z        elif self._sortOrder == SORT_DESC:            return cmp(self.GetItemText(item2).lower(), self.GetItemText(item1).lower())  # sort Z-A        else:            return (self.GetPyData(item1)[self.ORIG_ORDER] > self.GetPyData(item2)[self.ORIG_ORDER]) # unsorted    def SortAllChildren(self, parentItem):        if parentItem and self.GetChildrenCount(parentItem, False):            self.SortChildren(parentItem)            (child, cookie) = self.GetFirstChild(parentItem)            while child.IsOk():                self.SortAllChildren(child)                (child, cookie) = self.GetNextChild(parentItem, cookie)    #----------------------------------------------------------------------------    # Select Callback Methods    #----------------------------------------------------------------------------    def CallDoSelectCallback(self, item):        """ Invoke the DoSelectCallback of the given view to highlight text in the document view        """        data = self.GetPyData(item)        if not data:            return        view = data[self.VIEW]        cbdata = data[self.CALLBACKDATA]        if view:            view.DoSelectCallback(cbdata)    def SelectClosestItem(self, position):        tree = self        distances = []        items = []        self.FindDistanceToTreeItems(tree.GetRootItem(), position, distances, items)        mindist = 1000000        mindex = -1        for index in range(0, len(distances)):            if distances[index] <= mindist:                mindist = distances[index]                mindex = index        if mindex != -1:            item = items[mindex]            self.EnsureVisible(item)            os_view = wx.GetApp().GetService(OutlineService).GetView()            if os_view:               os_view.StopActionOnSelect()            self.SelectItem(item)            if os_view:               os_view.ResumeActionOnSelect()

⌨️ 快捷键说明

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