1
2 import gtk
3 import gtk.gdk as gdk
4 import vwidget.util as vw_util
5 from ConfigParser import ConfigParser
6
7 -class VView(gtk.ScrolledWindow):
8
9 __display_name__ = "Stuff!"
10
12 gtk.ScrolledWindow.__init__(self)
13 self.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
14 self.vwactive = True
15 self.vwname = None
16 self.closable = closable
17 self.connect("destroy", self.vwDestroy)
18
21
23 """
24 Set this view object as "sensitive" to user input
25 """
26 if self.vwactive != sensitive:
27 self.vwactive = sensitive
28 self.set_sensitive(sensitive)
29
31 if self.vwname == None:
32 return self.__class__.__display_name__
33 return self.vwname
34
37
39 return self.__class__.__name__
40
43
45 self.closable = closable
46
48 """
49 Use a glade file to define "views" with the same name as the class
50 (
51 """
53 VView.__init__(self)
54 self.vwglade = gtk.glade.XML(gladefile)
55 self.vwglade.signal_autoconnect(self)
56 win = self.vwglade.get_wiget(self.__class__.__name__)
57 frame = win.get_child()
58 p = view.get_parent()
59 if p != None:
60 p.remove(frame)
61 win.destroy()
62 self.add(frame)
63
66
68
69 __model_class__ = gtk.ListStore
70
71 __cols__ = (
72 (None, 0, object),
73 ("Address",1, str),
74 ("Stuff",2, str)
75 )
76
77 __editors__ = {}
78
87
90
92
93 for col in self.treeview.get_columns():
94 self.treeview.remove_column(col)
95
96 ftypes = []
97 for name,index,ctype in cols:
98 ftypes.append(ctype)
99 if name == None:
100 continue
101
102 onedit = None
103 emeth_name = self.__editors__.get(name)
104 if emeth_name != None:
105 onedit = getattr(self, emeth_name, None)
106 col = vw_util.makeColumn(name, index, onedit=onedit)
107 self.treeview.append_column(col)
108
109 self.model = modelclass(*ftypes)
110 self.treeview.set_model(self.model)
111
115
117
118 self.model.clear()
119
121 self.model.remove(iter)
122
126
128 """
129 Get the selected row's column by index
130 """
131 return vw_util.getTreeSelected(self.treeview, column)
132
133 -class VTextTag(gtk.TextTag):
134 - def __init__(self, tname):
135 gtk.TextTag.__init__(self, tname)
136 self.reversed = False
137
140
141 -class VRevTextTag(VTextTag):
142
144 front = self.get_property("foreground-gdk")
145 back = self.get_property("background-gdk")
146 self.set_property("foreground-gdk", back)
147 self.set_property("background-gdk", front)
148 self.reversed = not self.reversed
149
150 -class VTextView(VView):
151
152 - def __init__(self, tagtable=None):
153 VView.__init__(self)
154 self.textview = gtk.TextView()
155 self.textview.connect("populate_popup", self.vwGetPopup)
156 self.add(self.textview)
157
158 if tagtable == None:
159 tagtable = gtk.TextTagTable()
160
161 self.vwSetTagTable(tagtable)
162
163 style = gtk.Style()
164
165 style.base[gtk.STATE_NORMAL] = gdk.Color(0,0,0)
166 style.text[gtk.STATE_NORMAL] = gdk.Color(0,0,0xff)
167
168 style.base[gtk.STATE_INSENSITIVE] = gdk.Color(0,0,0)
169 style.text[gtk.STATE_INSENSITIVE] = gdk.Color(20,20,20)
170
171 self.textview.set_style(style)
172
173 self.tagcfg = ConfigParser()
174
175 self.curtag = None
176
177 self.vwInitTag(VTextTag("default"))
178
179 start,end = self.textbuf.get_bounds()
180 self.textbuf.create_mark("insertend", end)
181
182 - def vwSetTagTable(self, tagtable):
183 self.tagtable = tagtable
184 self.textbuf = gtk.TextBuffer(self.tagtable)
185 self.textview.set_buffer(self.textbuf)
186
187 - def vwGetTagTable(self):
189
190 - def vwInitTag(self, tag, typename="default", handler=None, *handleargs):
191 """
192 Initialize a tag for event processing and properties from
193 the tag config.
194 """
195 if handler != None:
196 tag.connect("event", handler, *handleargs)
197 self.tagtable.add(tag)
198 self.vwSetTagColor(tag, typename=typename)
199
200 - def vwSetTagColor(self, tag, typename="default"):
201 if self.tagcfg.has_section(typename):
202 for name in self.tagcfg.options(typename):
203 tag.set_property(name, self.tagcfg.get(typename,name))
204 else:
205 tag.set_property("font", "Monospace 10")
206 tag.set_property("foreground", "green")
207 tag.set_property("background", "black")
208
210 """
211 Use this as the event handler for tag events on exclusivly
212 selectable tags.
213 """
214 if event.type == gdk.BUTTON_PRESS:
215 if tag.get_property("name") != "default":
216 if self.curtag != None:
217 self.curtag.reverse()
218 tag.reverse()
219 self.curtag = tag
220 return True
221
223 self.tagcfg.read(tagfile)
224 for sec in self.tagcfg.sections():
225 tag = self.vwGetTag(sec)
226 if tag == None:
227 tag = VTextTag(sec)
228 self.tagtable.add(tag)
229
230 tag.connect("event",self.vwTagEvent)
231 for name in self.tagcfg.options(sec):
232 val = self.tagcfg.get(sec,name)
233 if val.isdigit():
234 val = int(val)
235 tag.set_property(name, val)
236
237 - def vwGetTag(self, name=None):
238 if name == None:
239 name = "default"
240 return self.tagtable.lookup(name)
241
242 - def vwTagEvent(self, tag, textview, event, iter):
245
247 """
248 Over-ride this to add elements to the right click menu on click.
249 """
250
251
252
253
254 pass
255
256 - def vwInsertText(self, text, iter=None, tagname=None, tag=None):
257 if iter == None:
258 iter = self.textbuf.get_end_iter()
259 if tagname == None and tag == None:
260 self.textbuf.insert(iter, text)
261 else:
262 if tagname != None:
263 tag = self.tagtable.lookup(tagname)
264 self.textbuf.insert_with_tags(iter, text, tag)
265 self.textbuf.move_mark_by_name("insertend", iter)
266
268 mark = self.textbuf.get_mark("insertend")
269 self.textview.scroll_to_mark(mark,0)
270
272 start,end = self.textbuf.get_bounds()
273 self.textview.scroll_to_iter(start, 0)
274
275 - def vwClearText(self):
276 start,end = self.textbuf.get_bounds()
277 self.textbuf.delete(start, end)
278
279 - def vwGetAppendIter(self):
280 return self.textbuf.get_end_iter()
281