📄 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 wx
import wx.lib.docview
import wx.lib.pydocview
import Service
_ = wx.GetTranslation
#----------------------------------------------------------------------------
# Constants
#----------------------------------------------------------------------------
SORT_NONE = 0
SORT_ASC = 1
SORT_DESC = 2
class 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 + -