/b-gtk/fix-viz

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
1
# -*- coding: UTF-8 -*-
2
"""Revision history view.
3
4
"""
5
6
__copyright__ = "Copyright © 2005 Canonical Ltd."
7
__author__    = "Daniel Schierbeck <daniel.schierbeck@gmail.com>"
8
314 by Daniel Schierbeck
Moved branch locking into treeview.
9
import sys
10
import string
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
11
import gtk
12
import gobject
13
import pango
14
import re
303 by Daniel Schierbeck
Made basic signaling work.
15
import treemodel
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
16
17
from linegraph import linegraph, same_branch
18
from graphcell import CellRendererGraph
19
from treemodel import TreeModel
330.4.3 by Daniel Schierbeck
Switched to using NULL_REVISION instead of None.
20
from bzrlib.revision import NULL_REVISION
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
21
303 by Daniel Schierbeck
Made basic signaling work.
22
class TreeView(gtk.ScrolledWindow):
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
23
346 by Daniel Schierbeck
Added revno-column-visible property to treeview.
24
    __gproperties__ = {
352 by Daniel Schierbeck
Added branch property to treeview.
25
        'branch': (gobject.TYPE_PYOBJECT,
26
                   'Branch',
27
                   'The Bazaar branch being visualized',
28
                   gobject.PARAM_CONSTRUCT_ONLY | gobject.PARAM_WRITABLE),
29
356 by Daniel Schierbeck
Made revision a property on TreeView.
30
        'revision': (gobject.TYPE_PYOBJECT,
31
                     'Revision',
32
                     'The currently selected revision',
33
                     gobject.PARAM_READWRITE),
34
395.1.2 by Daniel Schierbeck
Added revision-number property to the TreeView.
35
        'revision-number': (gobject.TYPE_STRING,
36
                            'Revision number',
37
                            'The number of the selected revision',
38
                            '',
39
                            gobject.PARAM_READABLE),
40
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
41
        'children': (gobject.TYPE_PYOBJECT,
42
                     'Child revisions',
43
                     'Children of the currently selected revision',
44
                     gobject.PARAM_READABLE),
45
46
        'parents': (gobject.TYPE_PYOBJECT,
47
                    'Parent revisions',
48
                    'Parents to the currently selected revision',
49
                    gobject.PARAM_READABLE),
50
346 by Daniel Schierbeck
Added revno-column-visible property to treeview.
51
        'revno-column-visible': (gobject.TYPE_BOOLEAN,
52
                                 'Revision number',
53
                                 'Show revision number column',
54
                                 True,
357 by Daniel Schierbeck
Added support for showing the date column in the viz.
55
                                 gobject.PARAM_READWRITE),
56
57
        'date-column-visible': (gobject.TYPE_BOOLEAN,
360 by Daniel Schierbeck
Fixed wrong text in date property.
58
                                 'Date',
59
                                 'Show date column',
357 by Daniel Schierbeck
Added support for showing the date column in the viz.
60
                                 False,
401.1.3 by Daniel Schierbeck
Made the compact view toggling cleaner.
61
                                 gobject.PARAM_READWRITE),
62
63
        'compact': (gobject.TYPE_BOOLEAN,
64
                    'Compact view',
65
                    'Break ancestry lines to save space',
66
                    True,
67
                    gobject.PARAM_CONSTRUCT | gobject.PARAM_READWRITE)
357 by Daniel Schierbeck
Added support for showing the date column in the viz.
68
346 by Daniel Schierbeck
Added revno-column-visible property to treeview.
69
    }
70
307 by Daniel Schierbeck
Made load notification work again.
71
    __gsignals__ = {
345 by Daniel Schierbeck
Made treeview columns instance variables.
72
        'revisions-loaded': (gobject.SIGNAL_RUN_FIRST, 
73
                             gobject.TYPE_NONE,
74
                             ()),
75
        'revision-selected': (gobject.SIGNAL_RUN_FIRST,
76
                              gobject.TYPE_NONE,
423.7.4 by Daniel Schierbeck
Made revisionview and branchview update when a tag is added.
77
                              ()),
78
        'tag-added': (gobject.SIGNAL_RUN_FIRST,
79
                              gobject.TYPE_NONE,
80
                              (gobject.TYPE_STRING, gobject.TYPE_STRING))
307 by Daniel Schierbeck
Made load notification work again.
81
    }
82
401.1.3 by Daniel Schierbeck
Made the compact view toggling cleaner.
83
    def __init__(self, branch, start, maxnum, compact=True):
322 by Jelmer Vernooij
Add docstrings.
84
        """Create a new TreeView.
85
86
        :param branch: Branch object for branch to show.
87
        :param start: Revision id of top revision.
88
        :param maxnum: Maximum number of revisions to display, 
89
                       None for no limit.
329 by Jelmer Vernooij
Make broken_line_length setting from higher up.
90
        :param broken_line_length: After how much lines to break 
91
                                   branches.
322 by Jelmer Vernooij
Add docstrings.
92
        """
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
93
        gtk.ScrolledWindow.__init__(self)
94
303 by Daniel Schierbeck
Made basic signaling work.
95
        self.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
96
        self.set_shadow_type(gtk.SHADOW_IN)
97
303 by Daniel Schierbeck
Made basic signaling work.
98
        self.construct_treeview()
99
423.7.3 by Daniel Schierbeck
Moved tag writing logic inside the branchview treemodel.
100
        self.iter = None
316 by Daniel Schierbeck
Removed viz.TreeView.set_branch()
101
        self.branch = branch
423.7.3 by Daniel Schierbeck
Moved tag writing logic inside the branchview treemodel.
102
        self.revision = None
316 by Daniel Schierbeck
Removed viz.TreeView.set_branch()
103
401.1.1 by Daniel Schierbeck
Added update() method to TreeView.
104
        self.start = start
105
        self.maxnum = maxnum
401.1.3 by Daniel Schierbeck
Made the compact view toggling cleaner.
106
        self.compact = compact
401.1.1 by Daniel Schierbeck
Added update() method to TreeView.
107
108
        gobject.idle_add(self.populate)
316 by Daniel Schierbeck
Removed viz.TreeView.set_branch()
109
392 by Daniel Schierbeck
Fixed performance issue by only releasing the branch lock when the treeview is destroyed. This will surely fuck up the tagging code.
110
        self.connect("destroy", lambda x: self.branch.unlock())
111
347 by Daniel Schierbeck
Added property getter and setter method to the treeview.
112
    def do_get_property(self, property):
113
        if property.name == 'revno-column-visible':
352 by Daniel Schierbeck
Added branch property to treeview.
114
            return self.revno_column.get_visible()
357 by Daniel Schierbeck
Added support for showing the date column in the viz.
115
        elif property.name == 'date-column-visible':
116
            return self.date_column.get_visible()
401.1.3 by Daniel Schierbeck
Made the compact view toggling cleaner.
117
        elif property.name == 'compact':
118
            return self.compact
352 by Daniel Schierbeck
Added branch property to treeview.
119
        elif property.name == 'branch':
120
            return self.branch
356 by Daniel Schierbeck
Made revision a property on TreeView.
121
        elif property.name == 'revision':
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
122
            return self.model.get_value(self.iter, treemodel.REVISION)
395.1.2 by Daniel Schierbeck
Added revision-number property to the TreeView.
123
        elif property.name == 'revision-number':
124
            return self.model.get_value(self.iter, treemodel.REVNO)
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
125
        elif property.name == 'children':
126
            return self.model.get_value(self.iter, treemodel.CHILDREN)
127
        elif property.name == 'parents':
128
            return self.model.get_value(self.iter, treemodel.PARENTS)
347 by Daniel Schierbeck
Added property getter and setter method to the treeview.
129
        else:
130
            raise AttributeError, 'unknown property %s' % property.name
131
132
    def do_set_property(self, property, value):
133
        if property.name == 'revno-column-visible':
134
            self.revno_column.set_visible(value)
357 by Daniel Schierbeck
Added support for showing the date column in the viz.
135
        elif property.name == 'date-column-visible':
136
            self.date_column.set_visible(value)
401.1.3 by Daniel Schierbeck
Made the compact view toggling cleaner.
137
        elif property.name == 'compact':
138
            self.compact = value
352 by Daniel Schierbeck
Added branch property to treeview.
139
        elif property.name == 'branch':
140
            self.branch = value
356 by Daniel Schierbeck
Made revision a property on TreeView.
141
        elif property.name == 'revision':
142
            self.set_revision_id(value.revision_id)
347 by Daniel Schierbeck
Added property getter and setter method to the treeview.
143
        else:
144
            raise AttributeError, 'unknown property %s' % property.name
145
303 by Daniel Schierbeck
Made basic signaling work.
146
    def get_revision(self):
322 by Jelmer Vernooij
Add docstrings.
147
        """Return revision id of currently selected revision, or None."""
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
148
        return self.get_property('revision')
149
150
    def set_revision(self, revision):
151
        self.set_property('revision', revision)
303 by Daniel Schierbeck
Made basic signaling work.
152
356 by Daniel Schierbeck
Made revision a property on TreeView.
153
    def set_revision_id(self, revid):
322 by Jelmer Vernooij
Add docstrings.
154
        """Change the currently selected revision.
155
156
        :param revid: Revision id of revision to display.
157
        """
305 by Daniel Schierbeck
Moved revision selection to the new view.
158
        self.treeview.set_cursor(self.index[revid])
159
        self.treeview.grab_focus()
160
303 by Daniel Schierbeck
Made basic signaling work.
161
    def get_children(self):
322 by Jelmer Vernooij
Add docstrings.
162
        """Return the children of the currently selected revision.
163
164
        :return: list of revision ids.
165
        """
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
166
        return self.get_property('children')
303 by Daniel Schierbeck
Made basic signaling work.
167
168
    def get_parents(self):
322 by Jelmer Vernooij
Add docstrings.
169
        """Return the parents of the currently selected revision.
170
171
        :return: list of revision ids.
172
        """
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
173
        return self.get_property('parents')
423.7.3 by Daniel Schierbeck
Moved tag writing logic inside the branchview treemodel.
174
175
    def add_tag(self, tag, revid=None):
176
        if revid is None: revid = self.revision.revision_id
177
178
        try:
179
            self.branch.unlock()
180
181
            try:
182
                self.branch.lock_write()
183
                self.model.add_tag(tag, revid)
184
            finally:
185
                self.branch.unlock()
186
187
        finally:
188
            self.branch.lock_read()
423.7.4 by Daniel Schierbeck
Made revisionview and branchview update when a tag is added.
189
190
        self.emit('tag-added', tag, revid)
316 by Daniel Schierbeck
Removed viz.TreeView.set_branch()
191
        
401.1.2 by Daniel Schierbeck
Allowed the treeview to be refreshed.
192
    def refresh(self):
193
        gobject.idle_add(self.populate, self.get_revision())
401.1.1 by Daniel Schierbeck
Added update() method to TreeView.
194
404 by Daniel Schierbeck
Made the refresh use proper locking.
195
    def update(self):
196
        try:
197
            self.branch.unlock()
198
            try:
199
                self.branch.lock_write()
200
                self.branch.update()
201
            finally:
202
                self.branch.unlock()
203
        finally:
204
            self.branch.lock_read()
205
304 by Daniel Schierbeck
Made forward/back buttons work again.
206
    def back(self):
322 by Jelmer Vernooij
Add docstrings.
207
        """Signal handler for the Back button."""
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
208
        parents = self.get_parents()
304 by Daniel Schierbeck
Made forward/back buttons work again.
209
        if not len(parents):
210
            return
211
212
        for parent_id in parents:
213
            parent_index = self.index[parent_id]
214
            parent = self.model[parent_index][treemodel.REVISION]
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
215
            if same_branch(self.get_revision(), parent):
395.1.2 by Daniel Schierbeck
Added revision-number property to the TreeView.
216
                self.set_revision(parent)
304 by Daniel Schierbeck
Made forward/back buttons work again.
217
                break
218
        else:
395.1.2 by Daniel Schierbeck
Added revision-number property to the TreeView.
219
            self.set_revision_id(parents[0])
304 by Daniel Schierbeck
Made forward/back buttons work again.
220
221
    def forward(self):
322 by Jelmer Vernooij
Add docstrings.
222
        """Signal handler for the Forward button."""
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
223
        children = self.get_children()
304 by Daniel Schierbeck
Made forward/back buttons work again.
224
        if not len(children):
225
            return
226
227
        for child_id in children:
228
            child_index = self.index[child_id]
229
            child = self.model[child_index][treemodel.REVISION]
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
230
            if same_branch(child, self.get_revision()):
395.1.2 by Daniel Schierbeck
Added revision-number property to the TreeView.
231
                self.set_revision(child)
304 by Daniel Schierbeck
Made forward/back buttons work again.
232
                break
233
        else:
395.1.2 by Daniel Schierbeck
Added revision-number property to the TreeView.
234
            self.set_revision_id(children[0])
304 by Daniel Schierbeck
Made forward/back buttons work again.
235
401.1.2 by Daniel Schierbeck
Allowed the treeview to be refreshed.
236
    def populate(self, revision=None):
322 by Jelmer Vernooij
Add docstrings.
237
        """Fill the treeview with contents.
238
239
        :param start: Revision id of revision to start with.
240
        :param maxnum: Maximum number of revisions to display, or None 
241
                       for no limit.
329 by Jelmer Vernooij
Make broken_line_length setting from higher up.
242
        :param broken_line_length: After how much lines branches \
243
                       should be broken.
322 by Jelmer Vernooij
Add docstrings.
244
        """
401.1.3 by Daniel Schierbeck
Made the compact view toggling cleaner.
245
246
        if self.compact:
247
            broken_line_length = 32
248
        else:
249
            broken_line_length = None
250
392 by Daniel Schierbeck
Fixed performance issue by only releasing the branch lock when the treeview is destroyed. This will surely fuck up the tagging code.
251
        self.branch.lock_read()
252
        (linegraphdata, index, columns_len) = linegraph(self.branch.repository,
401.1.1 by Daniel Schierbeck
Added update() method to TreeView.
253
                                                        self.start,
254
                                                        self.maxnum, 
401.1.3 by Daniel Schierbeck
Made the compact view toggling cleaner.
255
                                                        broken_line_length)
392 by Daniel Schierbeck
Fixed performance issue by only releasing the branch lock when the treeview is destroyed. This will surely fuck up the tagging code.
256
423.5.1 by Ali Sabil
Added tags visualization in the graph
257
        self.model = TreeModel(self.branch, linegraphdata)
392 by Daniel Schierbeck
Fixed performance issue by only releasing the branch lock when the treeview is destroyed. This will surely fuck up the tagging code.
258
        self.graph_cell.columns_len = columns_len
259
        width = self.graph_cell.get_size(self.treeview)[2]
403 by Daniel Schierbeck
Set a maximum width on the graph column.
260
        if width > 500:
261
            width = 500
392 by Daniel Schierbeck
Fixed performance issue by only releasing the branch lock when the treeview is destroyed. This will surely fuck up the tagging code.
262
        self.graph_column.set_fixed_width(width)
263
        self.graph_column.set_max_width(width)
264
        self.index = index
265
        self.treeview.set_model(self.model)
401.1.2 by Daniel Schierbeck
Allowed the treeview to be refreshed.
266
267
        if revision is None:
268
            self.treeview.set_cursor(0)
269
        else:
270
            self.set_revision(revision)
271
392 by Daniel Schierbeck
Fixed performance issue by only releasing the branch lock when the treeview is destroyed. This will surely fuck up the tagging code.
272
        self.emit('revisions-loaded')
304 by Daniel Schierbeck
Made forward/back buttons work again.
273
274
        return False
275
364 by Daniel Schierbeck
Simplified TreeView.show_diff() and made the Revision -> View Changes menu item work.
276
    def show_diff(self, revid=None, parentid=None):
306 by Daniel Schierbeck
Made clicking a row work again.
277
        """Open a new window to show a diff between the given revisions."""
278
        from bzrlib.plugins.gtk.diff import DiffWindow
279
        window = DiffWindow(parent=self)
330.4.1 by Daniel Schierbeck
Made it possible to view the diff of an orphant revision.
280
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
281
        parents = self.get_parents()
282
364 by Daniel Schierbeck
Simplified TreeView.show_diff() and made the Revision -> View Changes menu item work.
283
        if revid is None:
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
284
            revid = self.get_revision().revision_id
364 by Daniel Schierbeck
Simplified TreeView.show_diff() and made the Revision -> View Changes menu item work.
285
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
286
            if parentid is None and len(parents) > 0:
287
                parentid = parents[0]
330.4.3 by Daniel Schierbeck
Switched to using NULL_REVISION instead of None.
288
289
        if parentid is None:
290
            parentid = NULL_REVISION
291
364 by Daniel Schierbeck
Simplified TreeView.show_diff() and made the Revision -> View Changes menu item work.
292
        rev_tree    = self.branch.repository.revision_tree(revid)
293
        parent_tree = self.branch.repository.revision_tree(parentid)
330.4.1 by Daniel Schierbeck
Made it possible to view the diff of an orphant revision.
294
364 by Daniel Schierbeck
Simplified TreeView.show_diff() and made the Revision -> View Changes menu item work.
295
        description = revid + " - " + self.branch.nick
306 by Daniel Schierbeck
Made clicking a row work again.
296
        window.set_diff(description, rev_tree, parent_tree)
297
        window.show()
298
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
299
    def construct_treeview(self):
300
        self.treeview = gtk.TreeView()
301
302
        self.treeview.set_rules_hint(True)
330.1.2 by Daniel Schierbeck
Replaced literal column index with equivalent symbol.
303
        self.treeview.set_search_column(treemodel.REVNO)
330.5.2 by Szilveszter Farkas (Phanatic)
Fixed set_tooltip_column() related issue.
304
        
330.5.5 by Szilveszter Farkas (Phanatic)
Use better fix by John.
305
        # Fix old PyGTK bug - by JAM
306
        set_tooltip = getattr(self.treeview, 'set_tooltip_column', None)
307
        if set_tooltip is not None:
423.4.3 by Daniel Schierbeck
Made the MESSAGE column be the tooltip column.
308
            set_tooltip(treemodel.MESSAGE)
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
309
391 by Daniel Schierbeck
Moved away from the changed signal on the treeview.
310
        self.treeview.connect("cursor-changed",
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
311
                self._on_selection_changed)
312
313
        self.treeview.connect("row-activated", 
314
                self._on_revision_activated)
315
316
        self.treeview.connect("button-release-event", 
317
                self._on_revision_selected)
318
319
        self.treeview.set_property('fixed-height-mode', True)
320
321
        self.add(self.treeview)
322
        self.treeview.show()
323
324
        cell = gtk.CellRendererText()
325
        cell.set_property("width-chars", 15)
326
        cell.set_property("ellipsize", pango.ELLIPSIZE_END)
345 by Daniel Schierbeck
Made treeview columns instance variables.
327
        self.revno_column = gtk.TreeViewColumn("Revision No")
328
        self.revno_column.set_resizable(True)
329
        self.revno_column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
330
        self.revno_column.set_fixed_width(cell.get_size(self.treeview)[2])
331
        self.revno_column.pack_start(cell, expand=True)
332
        self.revno_column.add_attribute(cell, "text", treemodel.REVNO)
333
        self.treeview.append_column(self.revno_column)
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
334
335
        self.graph_cell = CellRendererGraph()
336
        self.graph_column = gtk.TreeViewColumn()
337
        self.graph_column.set_resizable(True)
338
        self.graph_column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
339
        self.graph_column.pack_start(self.graph_cell, expand=False)
340
        self.graph_column.add_attribute(self.graph_cell, "node", treemodel.NODE)
423.5.1 by Ali Sabil
Added tags visualization in the graph
341
        self.graph_column.add_attribute(self.graph_cell, "tags", treemodel.TAGS)
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
342
        self.graph_column.add_attribute(self.graph_cell, "in-lines", treemodel.LAST_LINES)
343
        self.graph_column.add_attribute(self.graph_cell, "out-lines", treemodel.LINES)
344
        self.treeview.append_column(self.graph_column)
345
346
        cell = gtk.CellRendererText()
347
        cell.set_property("width-chars", 65)
348
        cell.set_property("ellipsize", pango.ELLIPSIZE_END)
423.4.1 by Daniel Schierbeck
Renamed the MESSAGE column to SUMMARY.
349
        self.summary_column = gtk.TreeViewColumn("Summary")
350
        self.summary_column.set_resizable(True)
351
        self.summary_column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
352
        self.summary_column.set_fixed_width(cell.get_size(self.treeview)[2])
353
        self.summary_column.pack_start(cell, expand=True)
354
        self.summary_column.add_attribute(cell, "markup", treemodel.SUMMARY)
355
        self.treeview.append_column(self.summary_column)
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
356
357
        cell = gtk.CellRendererText()
358
        cell.set_property("width-chars", 15)
359
        cell.set_property("ellipsize", pango.ELLIPSIZE_END)
345 by Daniel Schierbeck
Made treeview columns instance variables.
360
        self.committer_column = gtk.TreeViewColumn("Committer")
361
        self.committer_column.set_resizable(True)
362
        self.committer_column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
363
        self.committer_column.set_fixed_width(cell.get_size(self.treeview)[2])
364
        self.committer_column.pack_start(cell, expand=True)
423.4.4 by Daniel Schierbeck
Renamed COMMITER column into the correct COMMITTER.
365
        self.committer_column.add_attribute(cell, "text", treemodel.COMMITTER)
345 by Daniel Schierbeck
Made treeview columns instance variables.
366
        self.treeview.append_column(self.committer_column)
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
367
357 by Daniel Schierbeck
Added support for showing the date column in the viz.
368
        cell = gtk.CellRendererText()
359 by Daniel Schierbeck
Simplified date format.
369
        cell.set_property("width-chars", 20)
357 by Daniel Schierbeck
Added support for showing the date column in the viz.
370
        cell.set_property("ellipsize", pango.ELLIPSIZE_END)
371
        self.date_column = gtk.TreeViewColumn("Date")
372
        self.date_column.set_visible(False)
373
        self.date_column.set_resizable(True)
374
        self.date_column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
375
        self.date_column.set_fixed_width(cell.get_size(self.treeview)[2])
376
        self.date_column.pack_start(cell, expand=True)
377
        self.date_column.add_attribute(cell, "text", treemodel.TIMESTAMP)
378
        self.treeview.append_column(self.date_column)
379
391 by Daniel Schierbeck
Moved away from the changed signal on the treeview.
380
    def _on_selection_changed(self, treeview):
303 by Daniel Schierbeck
Made basic signaling work.
381
        """callback for when the treeview changes."""
391 by Daniel Schierbeck
Moved away from the changed signal on the treeview.
382
        (path, focus) = treeview.get_cursor()
383
        if path is not None:
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
384
            self.iter = self.model.get_iter(path)
310 by Daniel Schierbeck
Moved to using custom signal for handling revision selections.
385
            self.emit('revision-selected')
386
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
387
    def _on_revision_selected(self, widget, event):
388
        from bzrlib.plugins.gtk.revisionmenu import RevisionPopupMenu
389
        if event.button == 3:
390
            menu = RevisionPopupMenu(self.branch.repository, 
312 by Daniel Schierbeck
Made right-clicking work again.
391
                [self.get_revision().revision_id],
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
392
                self.branch)
393
            menu.popup(None, None, None, event.button, event.get_time())
394
395
    def _on_revision_activated(self, widget, path, col):
396
        # TODO: more than one parent
397
        """Callback for when a treeview row gets activated."""
398
        revision_id = self.model[path][treemodel.REVID]
399
        parents = self.model[path][treemodel.PARENTS]
330.4.1 by Daniel Schierbeck
Made it possible to view the diff of an orphant revision.
400
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
401
        if len(parents) == 0:
330.4.1 by Daniel Schierbeck
Made it possible to view the diff of an orphant revision.
402
            parent_id = None
403
        else:
404
            parent_id = parents[0]
405
364 by Daniel Schierbeck
Simplified TreeView.show_diff() and made the Revision -> View Changes menu item work.
406
        self.show_diff(revision_id, parent_id)
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
407
        self.treeview.grab_focus()