File: codetree.py

package info (click to toggle)
pype 2.5-2
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k, lenny
  • size: 832 kB
  • ctags: 953
  • sloc: python: 9,007; makefile: 54
file content (107 lines) | stat: -rw-r--r-- 3,969 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import wx
import sys

icons = 1
colors = 1
newroot = sys.platform != 'win32'

class TreeCtrl(wx.TreeCtrl):
    def __init__(self, parent, st):
        wx.TreeCtrl.__init__(self, parent, -1, style=wx.TR_DEFAULT_STYLE|wx.TR_HAS_BUTTONS|wx.TR_HIDE_ROOT)
        
        if icons:
            isz = (16,16)
            il = wx.ImageList(isz[0], isz[1])
            self.images = [wx.ArtProvider_GetBitmap(wx.ART_FOLDER, wx.ART_OTHER, isz),
                        wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN, wx.ART_OTHER, isz),
                        wx.ArtProvider_GetBitmap(wx.ART_NORMAL_FILE, wx.ART_OTHER, isz)]
            for i in self.images:
                il.Add(i)
            self.SetImageList(il)
            self.il = il
        self.SORTTREE = st
        self.root = self.AddRoot("Unseen Root")

    def OnCompareItems(self, item1, item2):
        if self.SORTTREE:
            return cmp(self.GetItemData(item1).GetData(),\
                       self.GetItemData(item2).GetData())
        else:
            return cmp(self.GetItemData(item1).GetData()[1],\
                       self.GetItemData(item2).GetData()[1])

class hierCodeTreePanel(wx.Panel):
    def __init__(self, root, parent, st):
        # Use the WANTS_CHARS style so the panel doesn't eat the Return key.
        wx.Panel.__init__(self, parent, -1, style=wx.WANTS_CHARS)
        self.parent = parent

        self.root = root

        tID = wx.NewId()

        self.tree = TreeCtrl(self, st)
        
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.tree, 1, wx.EXPAND)
        self.SetSizer(sizer)
        
        #self.tree.Expand(self.root)
        self.Bind(wx.EVT_LEFT_DCLICK, self.OnLeftDClick)
        self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnActivate)

    def new_hierarchy(self, hier):
        self.tree.DeleteAllItems()
        if newroot:
            #on GTK/Linux, tree.DeleteAllItems() kills the unseen root,
            #not so on Windows.
            self.tree.root = self.tree.AddRoot("Unseen Root")
        root = [self.tree.root]
        stk = [hier[:]]
        blue = wx.Colour(0, 0, 200)
        red = wx.Colour(200, 0, 0)
        green = wx.Colour(0, 200, 0)
        D = {'cl':blue,
             'de':red,
             'cd':green,
             '\\l':red,
             '\\s':blue}
        while stk:
            cur = stk.pop()
            while cur:
                name, line_no, leading, children = cur.pop()
                item_no = self.tree.AppendItem(root[-1], name)
                self.tree.SetPyData(item_no, line_no)
                if colors: self.tree.SetItemTextColour(item_no, D.get(name[:2], blue))
                if children:
                    if icons:
                        self.tree.SetItemImage(item_no, 0, wx.TreeItemIcon_Normal)
                        self.tree.SetItemImage(item_no, 1, wx.TreeItemIcon_Expanded)
                    stk.append(cur)
                    root.append(item_no)
                    cur = children[:]
                elif icons:
                    self.tree.SetItemImage(item_no, 2, wx.TreeItemIcon_Normal)
                    self.tree.SetItemImage(item_no, 2, wx.TreeItemIcon_Selected)
            self.tree.SortChildren(root[-1])
            root.pop()

    def OnLeftDClick(self, event):
        #pity this doesn't do what it should.
        num, win = self.root.getNumWin(event)
        win.SetFocus()

    def OnActivate(self, event):
        num, win = self.root.getNumWin(event)
        dat = self.tree.GetItemData(event.GetItem()).GetData()
        if dat == None:
            return event.Skip()
        ln = dat[1]-1
        #print ln
        #print dir(win)
        linepos = win.GetLineEndPosition(ln)
        win.EnsureVisible(ln)
        win.SetSelection(linepos-len(win.GetLine(ln))+len(win.format), linepos)
        win.ScrollToColumn(0)
        win.SetFocus()