1 from Tkinter import *
2 import Pmw
3 import os
4 from images import getImage
5
6 global imageLabel, imageData
7 imageLabel = None
8 imageData = None
9
10
12 - def __init__(self, master, tree, icon=None,
13 openicon=None, name=None, action=None):
14 self.master, self.tree = master, tree
15 if icon:
16 self.icon = PhotoImage(file=icon)
17 else:
18 self.icon = None
19 if openicon:
20 self.openicon = PhotoImage(file=openicon)
21 else:
22 self.openicon = None
23 if self.icon:
24 self.width = max(self.icon.width(),25)
25 self.height = max(self.icon.height(),25)
26 else:
27 self.width = 25
28 self.height= 25
29 self.name = name
30 self.var = StringVar()
31 self.var.set(name)
32
33
34
35
36
37 self.text = None
38 self.box = None
39
40
41 self.action = action
42 self.context = None
43 self.x = self.y = 0
44 self.child = []
45 self.state = 'collapsed'
46 self.selected = False
47
48 - def addChild(self, tree, icon=None, openicon=None, name=None, action=None):
53
57
58 - def textForget(self):
59 if self.text:
60 self.tree.delete(self.text)
61 for child in self.child:
62 child.textForget()
63
68
75
83
84
85
87 tree, text = self.tree, self.text
88 if self.selected and self.openicon:
89 self.pic = tree.create_image(self.x, self.y, image=self.openicon)
90 x = self.x+self.width/2
91 elif self.icon:
92 self.pic = tree.create_image(self.x, self.y, image=self.icon)
93 x = self.x+self.width/2
94 else:
95 self.pic = None
96 x = self.x
97 if self.context or self.action:
98 font = tree['font'][:2]+('bold',)
99 else:
100 font = tree['font']
101 text = self.text = tree.create_text(x,self.y,anchor='w',
102 text=self.var.get(),font=font)
103
104 if self.selected:
105 palette = Pmw.Color.getdefaultpalette(self.tree.component('hull'))
106 bbox = tree.bbox(text)
107 self.box = tree.create_rectangle(bbox,
108 fill=palette['selectBackground'])
109 tree.interior().lower(self.box)
110 tree.itemconfigure(text,fill=palette['selectForeground'])
111 else:
112 if self.box:
113 tree.delete(self.box)
114 self.box = None
115 tree.itemconfigure(text,fill=tree['textcolor'])
116 tree.tag_bind(text,"<ButtonPress-1>", self.invoke)
117 if self.context:
118 tree.tag_bind(text,"<ButtonPress-3>",self.context)
119 if self.pic:
120 tree.tag_bind(self.pic, "<ButtonPress-1>", self.invoke, "+")
121 tree.tag_bind(text,"<Double-Button-1>", self.boxpress)
122 if self.pic:
123 tree.tag_bind(self.pic, "<Double-Button-1>", self.boxpress, "+")
124
130
137
139 master, tree = self.master, self.tree
140 x, y = self.x, self.y
141 tree.hline(y, master.x, x)
142 tree.vline(master.x, master.y, y)
143 font = ('Helvetica',32,'bold')
144 if self.state == 'expanded' and self.child != []:
145 for child in self.child:
146 child.display(debug)
147 box = tree.create_text(master.x,y,text='-',font=font)
148 elif self.state == 'collapsed' and self.child != []:
149 box = tree.create_text(master.x,y,text='+',font=font)
150 tree.tag_bind(box, "<ButtonPress-1>", self.boxpress, "+")
151 self.displayIconText()
152
158
180
181 -class Tree(Pmw.ScrolledCanvas):
183 palette = Pmw.Color.getdefaultpalette(master)
184 optiondefs = (
185 ('icon', None, None),
186 ('openicon',None,None),
187 ('action',None,None),
188 ('treename', 'Tree', None),
189 ('font', ('MS Sans Serif', 8), None),
190 ('linecolor', palette['foreground'], None),
191 ('textcolor', palette['foreground'], None),
192 )
193 self.defineoptions(kw, optiondefs)
194 Pmw.ScrolledCanvas.__init__(self, master,**kw)
195 self.master = master
196 try:
197 self.plusnode = PhotoImage(file=getImage('plusnode.gif'))
198 self.minusnode = PhotoImage(file=getImage('minusnode.gif'))
199 except:
200 self.plusnode = None
201 self.minusnode = None
202 self.inhibitDraw = 1
203 self.child = []
204 self.x = self.y = -10
205 self.child.append( Node( self, self, action=self['action'],
206 icon=self['icon'], openicon=self['openicon'],
207 name=self['treename']) )
208 self.initialiseoptions()
209
217
221
225
226 - def vline(self, x, y, y1):
227 for i in range(0, abs(y-y1), 2):
228 self.create_line(x, y+i, x, y+i+1, fill=self['linecolor'], tags='line')
229
230 - def hline(self, y, x, x1):
231 for i in range(0, abs(x-x1), 2):
232 self.create_line(x+i, y, x+i+1, y, fill=self['linecolor'], tags='line')
233
234
240