/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,
77
                              ())
307 by Daniel Schierbeck
Made load notification work again.
78
    }
79
401.1.3 by Daniel Schierbeck
Made the compact view toggling cleaner.
80
    def __init__(self, branch, start, maxnum, compact=True):
322 by Jelmer Vernooij
Add docstrings.
81
        """Create a new TreeView.
82
83
        :param branch: Branch object for branch to show.
84
        :param start: Revision id of top revision.
85
        :param maxnum: Maximum number of revisions to display, 
86
                       None for no limit.
329 by Jelmer Vernooij
Make broken_line_length setting from higher up.
87
        :param broken_line_length: After how much lines to break 
88
                                   branches.
322 by Jelmer Vernooij
Add docstrings.
89
        """
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
90
        gtk.ScrolledWindow.__init__(self)
91
303 by Daniel Schierbeck
Made basic signaling work.
92
        self.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
93
        self.set_shadow_type(gtk.SHADOW_IN)
94
303 by Daniel Schierbeck
Made basic signaling work.
95
        self.construct_treeview()
96
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
97
        self.iter   = None
316 by Daniel Schierbeck
Removed viz.TreeView.set_branch()
98
        self.branch = branch
99
401.1.1 by Daniel Schierbeck
Added update() method to TreeView.
100
        self.start = start
101
        self.maxnum = maxnum
401.1.3 by Daniel Schierbeck
Made the compact view toggling cleaner.
102
        self.compact = compact
401.1.1 by Daniel Schierbeck
Added update() method to TreeView.
103
104
        gobject.idle_add(self.populate)
316 by Daniel Schierbeck
Removed viz.TreeView.set_branch()
105
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.
106
        self.connect("destroy", lambda x: self.branch.unlock())
107
347 by Daniel Schierbeck
Added property getter and setter method to the treeview.
108
    def do_get_property(self, property):
109
        if property.name == 'revno-column-visible':
352 by Daniel Schierbeck
Added branch property to treeview.
110
            return self.revno_column.get_visible()
357 by Daniel Schierbeck
Added support for showing the date column in the viz.
111
        elif property.name == 'date-column-visible':
112
            return self.date_column.get_visible()
401.1.3 by Daniel Schierbeck
Made the compact view toggling cleaner.
113
        elif property.name == 'compact':
114
            return self.compact
352 by Daniel Schierbeck
Added branch property to treeview.
115
        elif property.name == 'branch':
116
            return self.branch
356 by Daniel Schierbeck
Made revision a property on TreeView.
117
        elif property.name == 'revision':
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
118
            return self.model.get_value(self.iter, treemodel.REVISION)
395.1.2 by Daniel Schierbeck
Added revision-number property to the TreeView.
119
        elif property.name == 'revision-number':
120
            return self.model.get_value(self.iter, treemodel.REVNO)
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
121
        elif property.name == 'children':
122
            return self.model.get_value(self.iter, treemodel.CHILDREN)
123
        elif property.name == 'parents':
124
            return self.model.get_value(self.iter, treemodel.PARENTS)
347 by Daniel Schierbeck
Added property getter and setter method to the treeview.
125
        else:
126
            raise AttributeError, 'unknown property %s' % property.name
127
128
    def do_set_property(self, property, value):
129
        if property.name == 'revno-column-visible':
130
            self.revno_column.set_visible(value)
357 by Daniel Schierbeck
Added support for showing the date column in the viz.
131
        elif property.name == 'date-column-visible':
132
            self.date_column.set_visible(value)
401.1.3 by Daniel Schierbeck
Made the compact view toggling cleaner.
133
        elif property.name == 'compact':
134
            self.compact = value
352 by Daniel Schierbeck
Added branch property to treeview.
135
        elif property.name == 'branch':
136
            self.branch = value
356 by Daniel Schierbeck
Made revision a property on TreeView.
137
        elif property.name == 'revision':
138
            self.set_revision_id(value.revision_id)
347 by Daniel Schierbeck
Added property getter and setter method to the treeview.
139
        else:
140
            raise AttributeError, 'unknown property %s' % property.name
141
303 by Daniel Schierbeck
Made basic signaling work.
142
    def get_revision(self):
322 by Jelmer Vernooij
Add docstrings.
143
        """Return revision id of currently selected revision, or None."""
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
144
        return self.get_property('revision')
145
146
    def set_revision(self, revision):
147
        self.set_property('revision', revision)
303 by Daniel Schierbeck
Made basic signaling work.
148
356 by Daniel Schierbeck
Made revision a property on TreeView.
149
    def set_revision_id(self, revid):
322 by Jelmer Vernooij
Add docstrings.
150
        """Change the currently selected revision.
151
152
        :param revid: Revision id of revision to display.
153
        """
305 by Daniel Schierbeck
Moved revision selection to the new view.
154
        self.treeview.set_cursor(self.index[revid])
155
        self.treeview.grab_focus()
156
303 by Daniel Schierbeck
Made basic signaling work.
157
    def get_children(self):
322 by Jelmer Vernooij
Add docstrings.
158
        """Return the children of the currently selected revision.
159
160
        :return: list of revision ids.
161
        """
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
162
        return self.get_property('children')
303 by Daniel Schierbeck
Made basic signaling work.
163
164
    def get_parents(self):
322 by Jelmer Vernooij
Add docstrings.
165
        """Return the parents of the currently selected revision.
166
167
        :return: list of revision ids.
168
        """
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
169
        return self.get_property('parents')
316 by Daniel Schierbeck
Removed viz.TreeView.set_branch()
170
        
401.1.2 by Daniel Schierbeck
Allowed the treeview to be refreshed.
171
    def refresh(self):
172
        gobject.idle_add(self.populate, self.get_revision())
401.1.1 by Daniel Schierbeck
Added update() method to TreeView.
173
404 by Daniel Schierbeck
Made the refresh use proper locking.
174
    def update(self):
175
        try:
176
            self.branch.unlock()
177
            try:
178
                self.branch.lock_write()
179
                self.branch.update()
180
            finally:
181
                self.branch.unlock()
182
        finally:
183
            self.branch.lock_read()
184
304 by Daniel Schierbeck
Made forward/back buttons work again.
185
    def back(self):
322 by Jelmer Vernooij
Add docstrings.
186
        """Signal handler for the Back button."""
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
187
        parents = self.get_parents()
304 by Daniel Schierbeck
Made forward/back buttons work again.
188
        if not len(parents):
189
            return
190
191
        for parent_id in parents:
192
            parent_index = self.index[parent_id]
193
            parent = self.model[parent_index][treemodel.REVISION]
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
194
            if same_branch(self.get_revision(), parent):
395.1.2 by Daniel Schierbeck
Added revision-number property to the TreeView.
195
                self.set_revision(parent)
304 by Daniel Schierbeck
Made forward/back buttons work again.
196
                break
197
        else:
395.1.2 by Daniel Schierbeck
Added revision-number property to the TreeView.
198
            self.set_revision_id(parents[0])
304 by Daniel Schierbeck
Made forward/back buttons work again.
199
200
    def forward(self):
322 by Jelmer Vernooij
Add docstrings.
201
        """Signal handler for the Forward button."""
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
202
        children = self.get_children()
304 by Daniel Schierbeck
Made forward/back buttons work again.
203
        if not len(children):
204
            return
205
206
        for child_id in children:
207
            child_index = self.index[child_id]
208
            child = self.model[child_index][treemodel.REVISION]
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
209
            if same_branch(child, self.get_revision()):
395.1.2 by Daniel Schierbeck
Added revision-number property to the TreeView.
210
                self.set_revision(child)
304 by Daniel Schierbeck
Made forward/back buttons work again.
211
                break
212
        else:
395.1.2 by Daniel Schierbeck
Added revision-number property to the TreeView.
213
            self.set_revision_id(children[0])
304 by Daniel Schierbeck
Made forward/back buttons work again.
214
401.1.2 by Daniel Schierbeck
Allowed the treeview to be refreshed.
215
    def populate(self, revision=None):
322 by Jelmer Vernooij
Add docstrings.
216
        """Fill the treeview with contents.
217
218
        :param start: Revision id of revision to start with.
219
        :param maxnum: Maximum number of revisions to display, or None 
220
                       for no limit.
329 by Jelmer Vernooij
Make broken_line_length setting from higher up.
221
        :param broken_line_length: After how much lines branches \
222
                       should be broken.
322 by Jelmer Vernooij
Add docstrings.
223
        """
401.1.3 by Daniel Schierbeck
Made the compact view toggling cleaner.
224
225
        if self.compact:
226
            broken_line_length = 32
227
        else:
228
            broken_line_length = None
229
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.
230
        self.branch.lock_read()
231
        (linegraphdata, index, columns_len) = linegraph(self.branch.repository,
401.1.1 by Daniel Schierbeck
Added update() method to TreeView.
232
                                                        self.start,
233
                                                        self.maxnum, 
401.1.3 by Daniel Schierbeck
Made the compact view toggling cleaner.
234
                                                        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.
235
236
        self.model = TreeModel(self.branch.repository, linegraphdata)
237
        self.graph_cell.columns_len = columns_len
238
        width = self.graph_cell.get_size(self.treeview)[2]
403 by Daniel Schierbeck
Set a maximum width on the graph column.
239
        if width > 500:
240
            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.
241
        self.graph_column.set_fixed_width(width)
242
        self.graph_column.set_max_width(width)
243
        self.index = index
244
        self.treeview.set_model(self.model)
401.1.2 by Daniel Schierbeck
Allowed the treeview to be refreshed.
245
246
        if revision is None:
247
            self.treeview.set_cursor(0)
248
        else:
249
            self.set_revision(revision)
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.emit('revisions-loaded')
304 by Daniel Schierbeck
Made forward/back buttons work again.
252
253
        return False
254
364 by Daniel Schierbeck
Simplified TreeView.show_diff() and made the Revision -> View Changes menu item work.
255
    def show_diff(self, revid=None, parentid=None):
306 by Daniel Schierbeck
Made clicking a row work again.
256
        """Open a new window to show a diff between the given revisions."""
257
        from bzrlib.plugins.gtk.diff import DiffWindow
258
        window = DiffWindow(parent=self)
330.4.1 by Daniel Schierbeck
Made it possible to view the diff of an orphant revision.
259
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
260
        parents = self.get_parents()
261
364 by Daniel Schierbeck
Simplified TreeView.show_diff() and made the Revision -> View Changes menu item work.
262
        if revid is None:
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
263
            revid = self.get_revision().revision_id
364 by Daniel Schierbeck
Simplified TreeView.show_diff() and made the Revision -> View Changes menu item work.
264
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
265
            if parentid is None and len(parents) > 0:
266
                parentid = parents[0]
330.4.3 by Daniel Schierbeck
Switched to using NULL_REVISION instead of None.
267
268
        if parentid is None:
269
            parentid = NULL_REVISION
270
364 by Daniel Schierbeck
Simplified TreeView.show_diff() and made the Revision -> View Changes menu item work.
271
        rev_tree    = self.branch.repository.revision_tree(revid)
272
        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.
273
364 by Daniel Schierbeck
Simplified TreeView.show_diff() and made the Revision -> View Changes menu item work.
274
        description = revid + " - " + self.branch.nick
306 by Daniel Schierbeck
Made clicking a row work again.
275
        window.set_diff(description, rev_tree, parent_tree)
276
        window.show()
277
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
278
    def construct_treeview(self):
279
        self.treeview = gtk.TreeView()
280
281
        self.treeview.set_rules_hint(True)
330.1.2 by Daniel Schierbeck
Replaced literal column index with equivalent symbol.
282
        self.treeview.set_search_column(treemodel.REVNO)
330.5.2 by Szilveszter Farkas (Phanatic)
Fixed set_tooltip_column() related issue.
283
        
330.5.5 by Szilveszter Farkas (Phanatic)
Use better fix by John.
284
        # Fix old PyGTK bug - by JAM
285
        set_tooltip = getattr(self.treeview, 'set_tooltip_column', None)
286
        if set_tooltip is not None:
423.4.3 by Daniel Schierbeck
Made the MESSAGE column be the tooltip column.
287
            set_tooltip(treemodel.MESSAGE)
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
288
391 by Daniel Schierbeck
Moved away from the changed signal on the treeview.
289
        self.treeview.connect("cursor-changed",
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
290
                self._on_selection_changed)
291
292
        self.treeview.connect("row-activated", 
293
                self._on_revision_activated)
294
295
        self.treeview.connect("button-release-event", 
296
                self._on_revision_selected)
297
298
        self.treeview.set_property('fixed-height-mode', True)
299
300
        self.add(self.treeview)
301
        self.treeview.show()
302
303
        cell = gtk.CellRendererText()
304
        cell.set_property("width-chars", 15)
305
        cell.set_property("ellipsize", pango.ELLIPSIZE_END)
345 by Daniel Schierbeck
Made treeview columns instance variables.
306
        self.revno_column = gtk.TreeViewColumn("Revision No")
307
        self.revno_column.set_resizable(True)
308
        self.revno_column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
309
        self.revno_column.set_fixed_width(cell.get_size(self.treeview)[2])
310
        self.revno_column.pack_start(cell, expand=True)
311
        self.revno_column.add_attribute(cell, "text", treemodel.REVNO)
312
        self.treeview.append_column(self.revno_column)
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
313
314
        self.graph_cell = CellRendererGraph()
315
        self.graph_column = gtk.TreeViewColumn()
316
        self.graph_column.set_resizable(True)
317
        self.graph_column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
318
        self.graph_column.pack_start(self.graph_cell, expand=False)
319
        self.graph_column.add_attribute(self.graph_cell, "node", treemodel.NODE)
320
        self.graph_column.add_attribute(self.graph_cell, "in-lines", treemodel.LAST_LINES)
321
        self.graph_column.add_attribute(self.graph_cell, "out-lines", treemodel.LINES)
322
        self.treeview.append_column(self.graph_column)
323
324
        cell = gtk.CellRendererText()
325
        cell.set_property("width-chars", 65)
326
        cell.set_property("ellipsize", pango.ELLIPSIZE_END)
423.4.1 by Daniel Schierbeck
Renamed the MESSAGE column to SUMMARY.
327
        self.summary_column = gtk.TreeViewColumn("Summary")
328
        self.summary_column.set_resizable(True)
329
        self.summary_column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
330
        self.summary_column.set_fixed_width(cell.get_size(self.treeview)[2])
331
        self.summary_column.pack_start(cell, expand=True)
332
        self.summary_column.add_attribute(cell, "markup", treemodel.SUMMARY)
333
        self.treeview.append_column(self.summary_column)
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
334
335
        cell = gtk.CellRendererText()
336
        cell.set_property("width-chars", 15)
337
        cell.set_property("ellipsize", pango.ELLIPSIZE_END)
345 by Daniel Schierbeck
Made treeview columns instance variables.
338
        self.committer_column = gtk.TreeViewColumn("Committer")
339
        self.committer_column.set_resizable(True)
340
        self.committer_column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
341
        self.committer_column.set_fixed_width(cell.get_size(self.treeview)[2])
342
        self.committer_column.pack_start(cell, expand=True)
423.4.4 by Daniel Schierbeck
Renamed COMMITER column into the correct COMMITTER.
343
        self.committer_column.add_attribute(cell, "text", treemodel.COMMITTER)
345 by Daniel Schierbeck
Made treeview columns instance variables.
344
        self.treeview.append_column(self.committer_column)
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
345
357 by Daniel Schierbeck
Added support for showing the date column in the viz.
346
        cell = gtk.CellRendererText()
359 by Daniel Schierbeck
Simplified date format.
347
        cell.set_property("width-chars", 20)
357 by Daniel Schierbeck
Added support for showing the date column in the viz.
348
        cell.set_property("ellipsize", pango.ELLIPSIZE_END)
349
        self.date_column = gtk.TreeViewColumn("Date")
350
        self.date_column.set_visible(False)
351
        self.date_column.set_resizable(True)
352
        self.date_column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
353
        self.date_column.set_fixed_width(cell.get_size(self.treeview)[2])
354
        self.date_column.pack_start(cell, expand=True)
355
        self.date_column.add_attribute(cell, "text", treemodel.TIMESTAMP)
356
        self.treeview.append_column(self.date_column)
357
391 by Daniel Schierbeck
Moved away from the changed signal on the treeview.
358
    def _on_selection_changed(self, treeview):
303 by Daniel Schierbeck
Made basic signaling work.
359
        """callback for when the treeview changes."""
391 by Daniel Schierbeck
Moved away from the changed signal on the treeview.
360
        (path, focus) = treeview.get_cursor()
361
        if path is not None:
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
362
            self.iter = self.model.get_iter(path)
310 by Daniel Schierbeck
Moved to using custom signal for handling revision selections.
363
            self.emit('revision-selected')
364
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
365
    def _on_revision_selected(self, widget, event):
366
        from bzrlib.plugins.gtk.revisionmenu import RevisionPopupMenu
367
        if event.button == 3:
368
            menu = RevisionPopupMenu(self.branch.repository, 
312 by Daniel Schierbeck
Made right-clicking work again.
369
                [self.get_revision().revision_id],
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
370
                self.branch)
371
            menu.popup(None, None, None, event.button, event.get_time())
372
373
    def _on_revision_activated(self, widget, path, col):
374
        # TODO: more than one parent
375
        """Callback for when a treeview row gets activated."""
376
        revision_id = self.model[path][treemodel.REVID]
377
        parents = self.model[path][treemodel.PARENTS]
330.4.1 by Daniel Schierbeck
Made it possible to view the diff of an orphant revision.
378
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
379
        if len(parents) == 0:
330.4.1 by Daniel Schierbeck
Made it possible to view the diff of an orphant revision.
380
            parent_id = None
381
        else:
382
            parent_id = parents[0]
383
364 by Daniel Schierbeck
Simplified TreeView.show_diff() and made the Revision -> View Changes menu item work.
384
        self.show_diff(revision_id, parent_id)
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
385
        self.treeview.grab_focus()