📄 outlineservice.py
字号:
#----------------------------------------------------------------------------# 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 + -