/b-gtk/fix-viz

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz
1 by Scott James Remnant
Commit the first version of bzrk.
1
# -*- coding: UTF-8 -*-
2
"""Branch window.
3
4
This module contains the code to manage the branch information window,
5
which contains both the revision graph and details panes.
6
"""
7
8
__copyright__ = "Copyright © 2005 Canonical Ltd."
9
__author__    = "Scott James Remnant <scott@ubuntu.com>"
10
11
12
import gtk
13
import gobject
14
import pango
15
450.4.1 by Daniel Schierbeck
Added tag icon to branch history window.
16
from bzrlib.plugins.gtk import icon_path
523.3.2 by Jelmer Vernooij
Share same menu for context menu and main menu.
17
from bzrlib.plugins.gtk.branchview import TreeView, treemodel
365 by Daniel Schierbeck
Fixed locks and made tagging work.
18
from bzrlib.plugins.gtk.tags import AddTagDialog
338 by Daniel Schierbeck
Added Preferences menu item.
19
from bzrlib.plugins.gtk.preferences import PreferencesWindow
523.3.2 by Jelmer Vernooij
Share same menu for context menu and main menu.
20
from bzrlib.plugins.gtk.revisionmenu import RevisionMenu
21
from bzrlib.plugins.gtk.window import Window
511.6.1 by Jelmer Vernooij
Add Branch/Index option if bzr-search is available.
22
23
from bzrlib.config import BranchConfig, GlobalConfig
443 by Szilveszter Farkas (Phanatic)
Trivial fix for #149061 (be able to show the diff for revision 1).
24
from bzrlib.revision import Revision, NULL_REVISION
511.6.1 by Jelmer Vernooij
Add Branch/Index option if bzr-search is available.
25
from bzrlib.trace import mutter
1 by Scott James Remnant
Commit the first version of bzrk.
26
298.2.1 by Daniel Schierbeck
Refactored the GTK window code, creating a single base window class that handles keyboard events.
27
class BranchWindow(Window):
1 by Scott James Remnant
Commit the first version of bzrk.
28
    """Branch window.
29
30
    This object represents and manages a single window containing information
31
    for a particular branch.
32
    """
33
452.4.1 by Jelmer Vernooij
Support displaying multiple tips in viz.
34
    def __init__(self, branch, start_revs, maxnum, parent=None):
322 by Jelmer Vernooij
Add docstrings.
35
        """Create a new BranchWindow.
36
37
        :param branch: Branch object for branch to show.
452.4.1 by Jelmer Vernooij
Support displaying multiple tips in viz.
38
        :param start_revs: Revision ids of top revisions.
322 by Jelmer Vernooij
Add docstrings.
39
        :param maxnum: Maximum number of revisions to display, 
40
                       None for no limit.
41
        """
42
298.2.1 by Daniel Schierbeck
Refactored the GTK window code, creating a single base window class that handles keyboard events.
43
        Window.__init__(self, parent=parent)
1 by Scott James Remnant
Commit the first version of bzrk.
44
        self.set_border_width(0)
315 by Daniel Schierbeck
Removed BranchWindow.set_branch(), used constructor instead.
45
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
46
        self.branch      = branch
452.4.1 by Jelmer Vernooij
Support displaying multiple tips in viz.
47
        self.start_revs  = start_revs
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
48
        self.maxnum      = maxnum
330.2.5 by Daniel Schierbeck
Support persistence of compact view option.
49
        self.config      = GlobalConfig()
50
51
        if self.config.get_user_option('viz-compact-view') == 'yes':
52
            self.compact_view = True
53
        else:
54
            self.compact_view = False
315 by Daniel Schierbeck
Removed BranchWindow.set_branch(), used constructor instead.
55
630 by Jelmer Vernooij
Use _get_nick(local=True) rather than .nick to get at a branches' nick, since
56
        self.set_title(branch._get_nick(local=True) + " - revision history")
1 by Scott James Remnant
Commit the first version of bzrk.
57
531.7.9 by Scott Scriven
Made vis remember window and panel sizes.
58
        # user-configured window size
531.7.10 by Scott Scriven
Simplified size-loading code. No longer saves identical config every time vis runs.
59
        size = self._load_size('viz-window-size')
60
        if size:
61
            width, height = size
555.2.1 by Jasper Groenewegen
Modify DiffWidget to include a checkbutton to wrap long lines in the diff view
62
        else:
63
            # Use three-quarters of the screen by default
64
            screen = self.get_screen()
65
            monitor = screen.get_monitor_geometry(0)
66
            width = int(monitor.width * 0.75)
67
            height = int(monitor.height * 0.75)
1 by Scott James Remnant
Commit the first version of bzrk.
68
        self.set_default_size(width, height)
531.7.8 by Scott Scriven
Made viz window shrinkable.
69
        self.set_size_request(width/3, height/3)
625.1.8 by Torsten Landschoff
Save widget sizes only when closing the BranchWindow.
70
        self._save_size_on_destroy(self, 'viz-window-size')
1 by Scott James Remnant
Commit the first version of bzrk.
71
72
        # FIXME AndyFitz!
73
        icon = self.render_icon(gtk.STOCK_INDEX, gtk.ICON_SIZE_BUTTON)
74
        self.set_icon(icon)
75
384 by Daniel Schierbeck
Added accelerator for Next Revision action.
76
        gtk.accel_map_add_entry("<viz>/Go/Next Revision", gtk.keysyms.Up, gtk.gdk.MOD1_MASK)
383 by Daniel Schierbeck
Switched to using symbolic names for keyvals.
77
        gtk.accel_map_add_entry("<viz>/Go/Previous Revision", gtk.keysyms.Down, gtk.gdk.MOD1_MASK)
499.1.1 by Russ Brown
Added Refresh menu option with keyboard shortcut to viz
78
        gtk.accel_map_add_entry("<viz>/View/Refresh", gtk.keysyms.F5, 0)
382 by Daniel Schierbeck
Made accelerator for Previous Revision work.
79
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
80
        self.accel_group = gtk.AccelGroup()
81
        self.add_accel_group(self.accel_group)
82
388 by Daniel Schierbeck
Switched to using the Previous/Next Revision actions to create tool buttons.
83
        gtk.Action.set_tool_item_type(gtk.MenuToolButton)
84
385 by Daniel Schierbeck
Created a single action for Previous Revision.
85
        self.prev_rev_action = gtk.Action("prev-rev", "_Previous Revision", "Go to the previous revision", gtk.STOCK_GO_DOWN)
86
        self.prev_rev_action.set_accel_path("<viz>/Go/Previous Revision")
87
        self.prev_rev_action.set_accel_group(self.accel_group)
88
        self.prev_rev_action.connect("activate", self._back_clicked_cb)
89
        self.prev_rev_action.connect_accelerator()
90
386 by Daniel Schierbeck
Created a single action for Next Revision.
91
        self.next_rev_action = gtk.Action("next-rev", "_Next Revision", "Go to the next revision", gtk.STOCK_GO_UP)
92
        self.next_rev_action.set_accel_path("<viz>/Go/Next Revision")
93
        self.next_rev_action.set_accel_group(self.accel_group)
94
        self.next_rev_action.connect("activate", self._fwd_clicked_cb)
95
        self.next_rev_action.connect_accelerator()
96
499.1.1 by Russ Brown
Added Refresh menu option with keyboard shortcut to viz
97
        self.refresh_action = gtk.Action("refresh", "_Refresh", "Refresh view", gtk.STOCK_REFRESH)
98
        self.refresh_action.set_accel_path("<viz>/View/Refresh")
99
        self.refresh_action.set_accel_group(self.accel_group)
100
        self.refresh_action.connect("activate", self._refresh_clicked)
101
        self.refresh_action.connect_accelerator()
102
1 by Scott James Remnant
Commit the first version of bzrk.
103
        self.construct()
104
625.1.8 by Torsten Landschoff
Save widget sizes only when closing the BranchWindow.
105
    def _save_size_on_destroy(self, widget, config_name):
106
        """Creates a hook that saves the size of widget to config option 
107
           config_name when the window is destroyed/closed."""
108
        def save_size(src):
109
            width, height = widget.allocation.width, widget.allocation.height
110
            value = '%sx%s' % (width, height)
111
            self.config.set_user_option(config_name, value)
112
        self.connect("destroy", save_size)
113
369 by Daniel Schierbeck
Fixed bug with compact view toggling.
114
    def set_revision(self, revid):
115
        self.treeview.set_revision_id(revid)
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
116
1 by Scott James Remnant
Commit the first version of bzrk.
117
    def construct(self):
118
        """Construct the window contents."""
331 by Daniel Schierbeck
Added basic menu bar.
119
        vbox = gtk.VBox(spacing=0)
44 by David Allouche
reorganise branch window
120
        self.add(vbox)
121
375 by Daniel Schierbeck
Fixed crash when toggling compact view.
122
        self.paned = gtk.VPaned()
531.7.9 by Scott Scriven
Made vis remember window and panel sizes.
123
        self.paned.pack1(self.construct_top(), resize=False, shrink=True)
124
        self.paned.pack2(self.construct_bottom(), resize=True, shrink=False)
375 by Daniel Schierbeck
Fixed crash when toggling compact view.
125
        self.paned.show()
358 by Daniel Schierbeck
Generalized the hiding/showing code.
126
531.7.2 by Scott Scriven
Made 'vis' save/load visibility of its toolbar.
127
        nav = self.construct_navigation()
128
        menubar = self.construct_menubar()
129
        vbox.pack_start(menubar, expand=False, fill=True)
130
        vbox.pack_start(nav, expand=False, fill=True)
131
369 by Daniel Schierbeck
Fixed bug with compact view toggling.
132
        vbox.pack_start(self.paned, expand=True, fill=True)
133
        vbox.set_focus_child(self.paned)
44 by David Allouche
reorganise branch window
134
624 by Jelmer Vernooij
Delay registration of signals to prevent problems when signal handlers use not yet constructed widgets.
135
        self.treeview.connect('revision-selected',
136
                self._treeselection_changed_cb)
137
        self.treeview.connect('revision-activated',
138
                self._tree_revision_activated)
139
140
        self.treeview.connect('tag-added', lambda w, t, r: self._update_tags())
44 by David Allouche
reorganise branch window
141
        vbox.show()
555.2.2 by Jasper Groenewegen
Change from checkbox to menu item in bzr vis, add menu bar + item in gdiff
142
    
331 by Daniel Schierbeck
Added basic menu bar.
143
    def construct_menubar(self):
144
        menubar = gtk.MenuBar()
145
146
        file_menu = gtk.Menu()
334 by Daniel Schierbeck
Added icons to menus.
147
        file_menuitem = gtk.MenuItem("_File")
331 by Daniel Schierbeck
Added basic menu bar.
148
        file_menuitem.set_submenu(file_menu)
149
362 by Daniel Schierbeck
Added accel group to File -> Close menu item.
150
        file_menu_close = gtk.ImageMenuItem(gtk.STOCK_CLOSE, self.accel_group)
331 by Daniel Schierbeck
Added basic menu bar.
151
        file_menu_close.connect('activate', lambda x: self.destroy())
152
        
363 by Daniel Schierbeck
Added File -> Quit menu item.
153
        file_menu_quit = gtk.ImageMenuItem(gtk.STOCK_QUIT, self.accel_group)
154
        file_menu_quit.connect('activate', lambda x: gtk.main_quit())
155
        
408 by Daniel Schierbeck
Made the close menu item actually appear when the viz is opened from another window.
156
        if self._parent is not None:
406 by Daniel Schierbeck
Made the viz show the close menu item only if opened from another window.
157
            file_menu.add(file_menu_close)
363 by Daniel Schierbeck
Added File -> Quit menu item.
158
        file_menu.add(file_menu_quit)
331 by Daniel Schierbeck
Added basic menu bar.
159
338 by Daniel Schierbeck
Added Preferences menu item.
160
        edit_menu = gtk.Menu()
161
        edit_menuitem = gtk.MenuItem("_Edit")
162
        edit_menuitem.set_submenu(edit_menu)
163
361 by Daniel Schierbeck
Added branch settings menu item.
164
        edit_menu_branchopts = gtk.MenuItem("Branch Settings")
165
        edit_menu_branchopts.connect('activate', lambda x: PreferencesWindow(self.branch.get_config()).show())
166
407 by Daniel Schierbeck
Renamed Preferences menu item into Global Settings.
167
        edit_menu_globopts = gtk.MenuItem("Global Settings")
168
        edit_menu_globopts.connect('activate', lambda x: PreferencesWindow().show())
338 by Daniel Schierbeck
Added Preferences menu item.
169
361 by Daniel Schierbeck
Added branch settings menu item.
170
        edit_menu.add(edit_menu_branchopts)
407 by Daniel Schierbeck
Renamed Preferences menu item into Global Settings.
171
        edit_menu.add(edit_menu_globopts)
338 by Daniel Schierbeck
Added Preferences menu item.
172
348 by Daniel Schierbeck
Added toggle item for revision number column.
173
        view_menu = gtk.Menu()
174
        view_menuitem = gtk.MenuItem("_View")
175
        view_menuitem.set_submenu(view_menu)
176
499.1.1 by Russ Brown
Added Refresh menu option with keyboard shortcut to viz
177
        view_menu_refresh = self.refresh_action.create_menu_item()
178
        view_menu_refresh.connect('activate', self._refresh_clicked)
179
180
        view_menu.add(view_menu_refresh)
181
        view_menu.add(gtk.SeparatorMenuItem())
182
351 by Daniel Schierbeck
Added option to hide the toolbar.
183
        view_menu_toolbar = gtk.CheckMenuItem("Show Toolbar")
184
        view_menu_toolbar.set_active(True)
531.7.2 by Scott Scriven
Made 'vis' save/load visibility of its toolbar.
185
        if self.config.get_user_option('viz-toolbar-visible') == 'False':
186
            view_menu_toolbar.set_active(False)
187
            self.toolbar.hide()
351 by Daniel Schierbeck
Added option to hide the toolbar.
188
        view_menu_toolbar.connect('toggled', self._toolbar_visibility_changed)
189
370 by Daniel Schierbeck
Moved compact graph toggle to the menubar.
190
        view_menu_compact = gtk.CheckMenuItem("Show Compact Graph")
191
        view_menu_compact.set_active(self.compact_view)
192
        view_menu_compact.connect('activate', self._brokenlines_toggled_cb)
555.2.2 by Jasper Groenewegen
Change from checkbox to menu item in bzr vis, add menu bar + item in gdiff
193
        
531.7.3 by Scott Scriven
Added an option to show/hide the diff panel.
194
        view_menu_diffs = gtk.CheckMenuItem("Show Diffs")
531.7.12 by Scott Scriven
Made diff panel default to off.
195
        view_menu_diffs.set_active(False)
196
        if self.config.get_user_option('viz-show-diffs') == 'True':
197
            view_menu_diffs.set_active(True)
531.7.3 by Scott Scriven
Added an option to show/hide the diff panel.
198
        view_menu_diffs.connect('toggled', self._diff_visibility_changed)
555.2.2 by Jasper Groenewegen
Change from checkbox to menu item in bzr vis, add menu bar + item in gdiff
199
        
531.7.14 by Scott Scriven
Made diff placement configurable (bottom-right, or bottom full-width).
200
        view_menu_wide_diffs = gtk.CheckMenuItem("Wide Diffs")
201
        view_menu_wide_diffs.set_active(False)
202
        if self.config.get_user_option('viz-wide-diffs') == 'True':
203
            view_menu_wide_diffs.set_active(True)
204
        view_menu_wide_diffs.connect('toggled', self._diff_placement_changed)
555.2.2 by Jasper Groenewegen
Change from checkbox to menu item in bzr vis, add menu bar + item in gdiff
205
        
571 by Jasper Groenewegen
Merge addition of word wrap control to gdiff and visualise windows
206
        view_menu_wrap_diffs = gtk.CheckMenuItem("Wrap _Long Lines in Diffs")
555.2.2 by Jasper Groenewegen
Change from checkbox to menu item in bzr vis, add menu bar + item in gdiff
207
        view_menu_wrap_diffs.set_active(False)
208
        if self.config.get_user_option('viz-wrap-diffs') == 'True':
209
            view_menu_wrap_diffs.set_active(True)
210
        view_menu_wrap_diffs.connect('toggled', self._diff_wrap_changed)
211
                
351 by Daniel Schierbeck
Added option to hide the toolbar.
212
        view_menu.add(view_menu_toolbar)
370 by Daniel Schierbeck
Moved compact graph toggle to the menubar.
213
        view_menu.add(view_menu_compact)
555.2.2 by Jasper Groenewegen
Change from checkbox to menu item in bzr vis, add menu bar + item in gdiff
214
        view_menu.add(gtk.SeparatorMenuItem())
531.7.3 by Scott Scriven
Added an option to show/hide the diff panel.
215
        view_menu.add(view_menu_diffs)
531.7.14 by Scott Scriven
Made diff placement configurable (bottom-right, or bottom full-width).
216
        view_menu.add(view_menu_wide_diffs)
555.2.2 by Jasper Groenewegen
Change from checkbox to menu item in bzr vis, add menu bar + item in gdiff
217
        view_menu.add(view_menu_wrap_diffs)
351 by Daniel Schierbeck
Added option to hide the toolbar.
218
        view_menu.add(gtk.SeparatorMenuItem())
358 by Daniel Schierbeck
Generalized the hiding/showing code.
219
452.4.2 by Jelmer Vernooij
Hide revision number column if more than one branch was specified.
220
        self.mnu_show_revno_column = gtk.CheckMenuItem("Show Revision _Number Column")
221
        self.mnu_show_date_column = gtk.CheckMenuItem("Show _Date Column")
222
223
        # Revision numbers are pointless if there are multiple branches
224
        if len(self.start_revs) > 1:
225
            self.mnu_show_revno_column.set_sensitive(False)
226
            self.treeview.set_property('revno-column-visible', False)
227
228
        for (col, name) in [(self.mnu_show_revno_column, "revno"), 
229
                            (self.mnu_show_date_column, "date")]:
358 by Daniel Schierbeck
Generalized the hiding/showing code.
230
            col.set_active(self.treeview.get_property(name + "-column-visible"))
231
            col.connect('toggled', self._col_visibility_changed, name)
232
            view_menu.add(col)
348 by Daniel Schierbeck
Added toggle item for revision number column.
233
331 by Daniel Schierbeck
Added basic menu bar.
234
        go_menu = gtk.Menu()
382 by Daniel Schierbeck
Made accelerator for Previous Revision work.
235
        go_menu.set_accel_group(self.accel_group)
334 by Daniel Schierbeck
Added icons to menus.
236
        go_menuitem = gtk.MenuItem("_Go")
331 by Daniel Schierbeck
Added basic menu bar.
237
        go_menuitem.set_submenu(go_menu)
238
        
390 by Daniel Schierbeck
Made the Previous/Next Revision menu items local variables.
239
        go_menu_next = self.next_rev_action.create_menu_item()
240
        go_menu_prev = self.prev_rev_action.create_menu_item()
334 by Daniel Schierbeck
Added icons to menus.
241
450.4.1 by Daniel Schierbeck
Added tag icon to branch history window.
242
        tag_image = gtk.Image()
243
        tag_image.set_from_file(icon_path("tag-16.png"))
244
        self.go_menu_tags = gtk.ImageMenuItem("_Tags")
245
        self.go_menu_tags.set_image(tag_image)
587 by Jelmer Vernooij
Avoid determining tags until tags widget has been added.
246
        self.treeview.connect('refreshed', lambda w: self._update_tags())
399 by Daniel Schierbeck
Made tags menu insensitive when there are no tags to display.
247
390 by Daniel Schierbeck
Made the Previous/Next Revision menu items local variables.
248
        go_menu.add(go_menu_next)
249
        go_menu.add(go_menu_prev)
334 by Daniel Schierbeck
Added icons to menus.
250
        go_menu.add(gtk.SeparatorMenuItem())
423.7.5 by Daniel Schierbeck
Made the revision history window update the Go->Tags menu when a tag is added.
251
        go_menu.add(self.go_menu_tags)
334 by Daniel Schierbeck
Added icons to menus.
252
523.3.2 by Jelmer Vernooij
Share same menu for context menu and main menu.
253
        self.revision_menu = RevisionMenu(self.branch.repository, [], self.branch, parent=self)
335 by Daniel Schierbeck
Added Revision menu.
254
        revision_menuitem = gtk.MenuItem("_Revision")
523.3.2 by Jelmer Vernooij
Share same menu for context menu and main menu.
255
        revision_menuitem.set_submenu(self.revision_menu)
335 by Daniel Schierbeck
Added Revision menu.
256
334 by Daniel Schierbeck
Added icons to menus.
257
        branch_menu = gtk.Menu()
258
        branch_menuitem = gtk.MenuItem("_Branch")
259
        branch_menuitem.set_submenu(branch_menu)
260
336 by Daniel Schierbeck
Changed wording to comply with HIG guidelines.
261
        branch_menu.add(gtk.MenuItem("Pu_ll Revisions"))
262
        branch_menu.add(gtk.MenuItem("Pu_sh Revisions"))
371.1.1 by Daniel Schierbeck
Added About dialog to the viz.
263
511.6.1 by Jelmer Vernooij
Add Branch/Index option if bzr-search is available.
264
        try:
265
            from bzrlib.plugins import search
266
        except ImportError:
267
            mutter("Didn't find search plugin")
268
        else:
526 by Jelmer Vernooij
Switch to found revision when clicking ok in search window.
269
            branch_menu.add(gtk.SeparatorMenuItem())
270
511.6.1 by Jelmer Vernooij
Add Branch/Index option if bzr-search is available.
271
            branch_index_menuitem = gtk.MenuItem("_Index")
272
            branch_index_menuitem.connect('activate', self._branch_index_cb)
273
            branch_menu.add(branch_index_menuitem)
274
524 by Jelmer Vernooij
Add search dialog.
275
            branch_search_menuitem = gtk.MenuItem("_Search")
276
            branch_search_menuitem.connect('activate', self._branch_search_cb)
277
            branch_menu.add(branch_search_menuitem)
278
423.9.1 by Daniel Schierbeck
Added Help->About menu item to the viz.
279
        help_menu = gtk.Menu()
280
        help_menuitem = gtk.MenuItem("_Help")
281
        help_menuitem.set_submenu(help_menu)
282
283
        help_about_menuitem = gtk.ImageMenuItem(gtk.STOCK_ABOUT, self.accel_group)
284
        help_about_menuitem.connect('activate', self._about_dialog_cb)
285
286
        help_menu.add(help_about_menuitem)
287
331 by Daniel Schierbeck
Added basic menu bar.
288
        menubar.add(file_menuitem)
338 by Daniel Schierbeck
Added Preferences menu item.
289
        menubar.add(edit_menuitem)
348 by Daniel Schierbeck
Added toggle item for revision number column.
290
        menubar.add(view_menuitem)
331 by Daniel Schierbeck
Added basic menu bar.
291
        menubar.add(go_menuitem)
335 by Daniel Schierbeck
Added Revision menu.
292
        menubar.add(revision_menuitem)
331 by Daniel Schierbeck
Added basic menu bar.
293
        menubar.add(branch_menuitem)
423.9.1 by Daniel Schierbeck
Added Help->About menu item to the viz.
294
        menubar.add(help_menuitem)
331 by Daniel Schierbeck
Added basic menu bar.
295
        menubar.show_all()
296
297
        return menubar
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
298
299
    def construct_top(self):
300
        """Construct the top-half of the window."""
329 by Jelmer Vernooij
Make broken_line_length setting from higher up.
301
        # FIXME: Make broken_line_length configurable
330.2.5 by Daniel Schierbeck
Support persistence of compact view option.
302
452.4.1 by Jelmer Vernooij
Support displaying multiple tips in viz.
303
        self.treeview = TreeView(self.branch, self.start_revs, self.maxnum, self.compact_view)
315 by Daniel Schierbeck
Removed BranchWindow.set_branch(), used constructor instead.
304
373 by Daniel Schierbeck
Made column display options persisted.
305
        for col in ["revno", "date"]:
306
            option = self.config.get_user_option(col + '-column-visible')
307
            if option is not None:
308
                self.treeview.set_property(col + '-column-visible', option == 'True')
464.1.1 by Adrian Wilkins
Fixed column visibility properties not loading
309
            else:
310
                self.treeview.set_property(col + '-column-visible', False)
373 by Daniel Schierbeck
Made column display options persisted.
311
1 by Scott James Remnant
Commit the first version of bzrk.
312
        self.treeview.show()
313
375 by Daniel Schierbeck
Fixed crash when toggling compact view.
314
        align = gtk.Alignment(0.0, 0.0, 1.0, 1.0)
315
        align.set_padding(5, 0, 0, 0)
316
        align.add(self.treeview)
531.7.9 by Scott Scriven
Made vis remember window and panel sizes.
317
        # user-configured size
531.7.10 by Scott Scriven
Simplified size-loading code. No longer saves identical config every time vis runs.
318
        size = self._load_size('viz-graph-size')
319
        if size:
320
            width, height = size
531.7.9 by Scott Scriven
Made vis remember window and panel sizes.
321
            align.set_size_request(width, height)
322
        else:
323
            (width, height) = self.get_size()
324
            align.set_size_request(width, int(height / 2.5))
625.1.8 by Torsten Landschoff
Save widget sizes only when closing the BranchWindow.
325
        self._save_size_on_destroy(align, 'viz-graph-size')
375 by Daniel Schierbeck
Fixed crash when toggling compact view.
326
        align.show()
327
328
        return align
44 by David Allouche
reorganise branch window
329
330
    def construct_navigation(self):
331
        """Construct the navigation buttons."""
325 by Daniel Schierbeck
Switched to using a real toolbar for the viz navigation.
332
        self.toolbar = gtk.Toolbar()
333
        self.toolbar.set_style(gtk.TOOLBAR_BOTH_HORIZ)
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
334
388 by Daniel Schierbeck
Switched to using the Previous/Next Revision actions to create tool buttons.
335
        self.prev_button = self.prev_rev_action.create_tool_item()
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
336
        self.toolbar.insert(self.prev_button, -1)
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
337
388 by Daniel Schierbeck
Switched to using the Previous/Next Revision actions to create tool buttons.
338
        self.next_button = self.next_rev_action.create_tool_item()
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
339
        self.toolbar.insert(self.next_button, -1)
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
340
401.1.2 by Daniel Schierbeck
Allowed the treeview to be refreshed.
341
        self.toolbar.insert(gtk.SeparatorToolItem(), -1)
342
343
        refresh_button = gtk.ToolButton(gtk.STOCK_REFRESH)
404 by Daniel Schierbeck
Made the refresh use proper locking.
344
        refresh_button.connect('clicked', self._refresh_clicked)
401.1.2 by Daniel Schierbeck
Allowed the treeview to be refreshed.
345
        self.toolbar.insert(refresh_button, -1)
346
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
347
        self.toolbar.show_all()
325 by Daniel Schierbeck
Switched to using a real toolbar for the viz navigation.
348
349
        return self.toolbar
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
350
351
    def construct_bottom(self):
352
        """Construct the bottom half of the window."""
531.7.14 by Scott Scriven
Made diff placement configurable (bottom-right, or bottom full-width).
353
        if self.config.get_user_option('viz-wide-diffs') == 'True':
354
            self.diff_paned = gtk.VPaned()
355
        else:
356
            self.diff_paned = gtk.HPaned()
531.7.1 by Scott Scriven
Added a diff panel to otherwise-blank area in 'bzr vis'.
357
        (width, height) = self.get_size()
531.7.14 by Scott Scriven
Made diff placement configurable (bottom-right, or bottom full-width).
358
        self.diff_paned.set_size_request(20, 20) # shrinkable
531.7.1 by Scott Scriven
Added a diff panel to otherwise-blank area in 'bzr vis'.
359
330.3.1 by Daniel Schierbeck
Renamed logview 'revisionview'.
360
        from bzrlib.plugins.gtk.revisionview import RevisionView
412.1.2 by Daniel Schierbeck
Moved retrieval of tags into the revisionview itself.
361
        self.revisionview = RevisionView(branch=self.branch)
531.7.1 by Scott Scriven
Added a diff panel to otherwise-blank area in 'bzr vis'.
362
        self.revisionview.set_size_request(width/3, int(height / 2.5))
531.7.9 by Scott Scriven
Made vis remember window and panel sizes.
363
        # user-configured size
531.7.10 by Scott Scriven
Simplified size-loading code. No longer saves identical config every time vis runs.
364
        size = self._load_size('viz-revisionview-size')
365
        if size:
366
            width, height = size
531.7.9 by Scott Scriven
Made vis remember window and panel sizes.
367
            self.revisionview.set_size_request(width, height)
625.1.8 by Torsten Landschoff
Save widget sizes only when closing the BranchWindow.
368
        self._save_size_on_destroy(self.revisionview, 'viz-revisionview-size')
330.3.1 by Daniel Schierbeck
Renamed logview 'revisionview'.
369
        self.revisionview.show()
370
        self.revisionview.set_show_callback(self._show_clicked_cb)
412.1.9 by Daniel Schierbeck
Removed the use of RevisionView.set_go_callback().
371
        self.revisionview.connect('notify::revision', self._go_clicked_cb)
423.7.4 by Daniel Schierbeck
Made revisionview and branchview update when a tag is added.
372
        self.treeview.connect('tag-added', lambda w, t, r: self.revisionview.update_tags())
531.7.14 by Scott Scriven
Made diff placement configurable (bottom-right, or bottom full-width).
373
        self.diff_paned.pack1(self.revisionview)
531.7.1 by Scott Scriven
Added a diff panel to otherwise-blank area in 'bzr vis'.
374
375
        from bzrlib.plugins.gtk.diff import DiffWidget
376
        self.diff = DiffWidget()
531.7.14 by Scott Scriven
Made diff placement configurable (bottom-right, or bottom full-width).
377
        self.diff_paned.pack2(self.diff)
531.7.1 by Scott Scriven
Added a diff panel to otherwise-blank area in 'bzr vis'.
378
531.7.14 by Scott Scriven
Made diff placement configurable (bottom-right, or bottom full-width).
379
        self.diff_paned.show_all()
531.7.12 by Scott Scriven
Made diff panel default to off.
380
        if self.config.get_user_option('viz-show-diffs') != 'True':
531.7.3 by Scott Scriven
Added an option to show/hide the diff panel.
381
            self.diff.hide()
382
531.7.14 by Scott Scriven
Made diff placement configurable (bottom-right, or bottom full-width).
383
        return self.diff_paned
332 by Daniel Schierbeck
Made tag selection work.
384
385
    def _tag_selected_cb(self, menuitem, revid):
356 by Daniel Schierbeck
Made revision a property on TreeView.
386
        self.treeview.set_revision_id(revid)
341 by Daniel Schierbeck
Merged with trunk.
387
280.1.2 by Daniel Schierbeck
Switched to handle the 'changed' signal from the treeview's treeselection instead of the 'cursor-changed' signal from the treeview itself, allowing more flexibility (particularly the ability to handle programmatic selections)
388
    def _treeselection_changed_cb(self, selection, *args):
303 by Daniel Schierbeck
Made basic signaling work.
389
        """callback for when the treeview changes."""
390
        revision = self.treeview.get_revision()
391
        parents  = self.treeview.get_parents()
392
        children = self.treeview.get_children()
393
523.3.2 by Jelmer Vernooij
Share same menu for context menu and main menu.
394
        self.revision_menu.set_revision_ids([revision.revision_id])
395
464.2.1 by Adrian Wilkins
Detect the reserved null: revision in appropriate places.
396
        if revision and revision != NULL_REVISION:
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
397
            prev_menu = gtk.Menu()
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
398
            if len(parents) > 0:
385 by Daniel Schierbeck
Created a single action for Previous Revision.
399
                self.prev_rev_action.set_sensitive(True)
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
400
                for parent_id in parents:
464.2.1 by Adrian Wilkins
Detect the reserved null: revision in appropriate places.
401
                    if parent_id and parent_id != NULL_REVISION:
402
                        parent = self.branch.repository.get_revision(parent_id)
403
                        try:
404
                            str = ' (' + parent.properties['branch-nick'] + ')'
405
                        except KeyError:
406
                            str = ""
355 by Daniel Schierbeck
Appended branch nick to parent and child popup menus.
407
464.2.1 by Adrian Wilkins
Detect the reserved null: revision in appropriate places.
408
                        item = gtk.MenuItem(parent.message.split("\n")[0] + str)
409
                        item.connect('activate', self._set_revision_cb, parent_id)
410
                        prev_menu.add(item)
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
411
                prev_menu.show_all()
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
412
            else:
385 by Daniel Schierbeck
Created a single action for Previous Revision.
413
                self.prev_rev_action.set_sensitive(False)
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
414
                prev_menu.hide()
415
416
            self.prev_button.set_menu(prev_menu)
417
418
            next_menu = gtk.Menu()
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
419
            if len(children) > 0:
386 by Daniel Schierbeck
Created a single action for Next Revision.
420
                self.next_rev_action.set_sensitive(True)
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
421
                for child_id in children:
422
                    child = self.branch.repository.get_revision(child_id)
355 by Daniel Schierbeck
Appended branch nick to parent and child popup menus.
423
                    try:
424
                        str = ' (' + child.properties['branch-nick'] + ')'
425
                    except KeyError:
426
                        str = ""
427
428
                    item = gtk.MenuItem(child.message.split("\n")[0] + str)
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
429
                    item.connect('activate', self._set_revision_cb, child_id)
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
430
                    next_menu.add(item)
431
                next_menu.show_all()
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
432
            else:
386 by Daniel Schierbeck
Created a single action for Next Revision.
433
                self.next_rev_action.set_sensitive(False)
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
434
                next_menu.hide()
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
435
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
436
            self.next_button.set_menu(next_menu)
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
437
412.1.13 by Daniel Schierbeck
Re-added support for displaying the children of a revision.
438
            self.revisionview.set_revision(revision)
439
            self.revisionview.set_children(children)
531.7.3 by Scott Scriven
Added an option to show/hide the diff panel.
440
            self.update_diff_panel(revision, parents)
531.7.1 by Scott Scriven
Added a diff panel to otherwise-blank area in 'bzr vis'.
441
423.1.17 by Gary van der Merwe
Reuse the viz treeview in the revision browser.
442
    def _tree_revision_activated(self, widget, path, col):
443
        # TODO: more than one parent
444
        """Callback for when a treeview row gets activated."""
445
        revision = self.treeview.get_revision()
446
        parents  = self.treeview.get_parents()
447
448
        if len(parents) == 0:
627 by Jelmer Vernooij
Use NULL_REVISION rather than None.
449
            parent_id = NULL_REVISION
423.1.17 by Gary van der Merwe
Reuse the viz treeview in the revision browser.
450
        else:
451
            parent_id = parents[0]
452
453
        self.show_diff(revision.revision_id, parent_id)
454
        self.treeview.grab_focus()
463.3.1 by Javier Derderian
Fixed menu entry 'View Changes'. Bug #215350
455
        
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
456
    def _back_clicked_cb(self, *args):
457
        """Callback for when the back button is clicked."""
304 by Daniel Schierbeck
Made forward/back buttons work again.
458
        self.treeview.back()
459
        
5 by Scott James Remnant
Reverse the meaning of the Back and Forward buttons so Back actually
460
    def _fwd_clicked_cb(self, *args):
461
        """Callback for when the forward button is clicked."""
304 by Daniel Schierbeck
Made forward/back buttons work again.
462
        self.treeview.forward()
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
463
412.1.9 by Daniel Schierbeck
Removed the use of RevisionView.set_go_callback().
464
    def _go_clicked_cb(self, w, p):
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
465
        """Callback for when the go button for a parent is clicked."""
412.1.9 by Daniel Schierbeck
Removed the use of RevisionView.set_go_callback().
466
        if self.revisionview.get_revision() is not None:
467
            self.treeview.set_revision(self.revisionview.get_revision())
152 by Jelmer Vernooij
Cleanup some more code.
468
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
469
    def _show_clicked_cb(self, revid, parentid):
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
470
        """Callback for when the show button for a parent is clicked."""
423.1.17 by Gary van der Merwe
Reuse the viz treeview in the revision browser.
471
        self.show_diff(revid, parentid)
13 by Scott James Remnant
Keep the focus on the treeview
472
        self.treeview.grab_focus()
46 by Wouter van Heyst
show diff on row activation, LP# 44591
473
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
474
    def _set_revision_cb(self, w, revision_id):
356 by Daniel Schierbeck
Made revision a property on TreeView.
475
        self.treeview.set_revision_id(revision_id)
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
476
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
477
    def _brokenlines_toggled_cb(self, button):
330.2.5 by Daniel Schierbeck
Support persistence of compact view option.
478
        self.compact_view = button.get_active()
479
480
        if self.compact_view:
481
            option = 'yes'
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
482
        else:
330.2.5 by Daniel Schierbeck
Support persistence of compact view option.
483
            option = 'no'
484
485
        self.config.set_user_option('viz-compact-view', option)
401.1.3 by Daniel Schierbeck
Made the compact view toggling cleaner.
486
        self.treeview.set_property('compact', self.compact_view)
487
        self.treeview.refresh()
368 by Daniel Schierbeck
Merged with mainline.
488
511.6.1 by Jelmer Vernooij
Add Branch/Index option if bzr-search is available.
489
    def _branch_index_cb(self, w):
490
        from bzrlib.plugins.search import index as _mod_index
491
        _mod_index.index_url(self.branch.base)
492
524 by Jelmer Vernooij
Add search dialog.
493
    def _branch_search_cb(self, w):
533.11.1 by Jelmer Vernooij
Ask user whether to index if there is no index present yet.
494
        from bzrlib.plugins.search import index as _mod_index
524 by Jelmer Vernooij
Add search dialog.
495
        from bzrlib.plugins.gtk.search import SearchDialog
533.11.1 by Jelmer Vernooij
Ask user whether to index if there is no index present yet.
496
        from bzrlib.plugins.search import errors as search_errors
497
498
        try:
499
            index = _mod_index.open_index_url(self.branch.base)
500
        except search_errors.NoSearchIndex:
501
            dialog = gtk.MessageDialog(self, type=gtk.MESSAGE_QUESTION, 
502
                buttons=gtk.BUTTONS_OK_CANCEL, 
503
                message_format="This branch has not been indexed yet. "
504
                               "Index now?")
505
            if dialog.run() == gtk.RESPONSE_OK:
553 by Jelmer Vernooij
Merge asking the user whether to create an index.
506
                dialog.destroy()
533.11.1 by Jelmer Vernooij
Ask user whether to index if there is no index present yet.
507
                index = _mod_index.index_url(self.branch.base)
508
            else:
553 by Jelmer Vernooij
Merge asking the user whether to create an index.
509
                dialog.destroy()
533.11.1 by Jelmer Vernooij
Ask user whether to index if there is no index present yet.
510
                return
511
512
        dialog = SearchDialog(index)
526 by Jelmer Vernooij
Switch to found revision when clicking ok in search window.
513
        
514
        if dialog.run() == gtk.RESPONSE_OK:
515
            self.set_revision(dialog.get_revision())
516
517
        dialog.destroy()
524 by Jelmer Vernooij
Add search dialog.
518
423.9.1 by Daniel Schierbeck
Added Help->About menu item to the viz.
519
    def _about_dialog_cb(self, w):
520
        from bzrlib.plugins.gtk.about import AboutDialog
521
522
        AboutDialog().run()
523
348 by Daniel Schierbeck
Added toggle item for revision number column.
524
    def _col_visibility_changed(self, col, property):
373 by Daniel Schierbeck
Made column display options persisted.
525
        self.config.set_user_option(property + '-column-visible', col.get_active())
348 by Daniel Schierbeck
Added toggle item for revision number column.
526
        self.treeview.set_property(property + '-column-visible', col.get_active())
351 by Daniel Schierbeck
Added option to hide the toolbar.
527
528
    def _toolbar_visibility_changed(self, col):
529
        if col.get_active():
531.7.2 by Scott Scriven
Made 'vis' save/load visibility of its toolbar.
530
            self.toolbar.show()
351 by Daniel Schierbeck
Added option to hide the toolbar.
531
        else:
532
            self.toolbar.hide()
531.7.2 by Scott Scriven
Made 'vis' save/load visibility of its toolbar.
533
        self.config.set_user_option('viz-toolbar-visible', col.get_active())
371.1.1 by Daniel Schierbeck
Added About dialog to the viz.
534
531.7.14 by Scott Scriven
Made diff placement configurable (bottom-right, or bottom full-width).
535
    def _make_diff_nonzero_size(self):
536
        """make sure the diff isn't zero-width or zero-height"""
537
        alloc = self.diff.get_allocation()
538
        if (alloc.width < 10) or (alloc.height < 10):
539
            width, height = self.get_size()
540
            self.revisionview.set_size_request(width/3, int(height / 2.5))
541
531.7.3 by Scott Scriven
Added an option to show/hide the diff panel.
542
    def _diff_visibility_changed(self, col):
531.7.14 by Scott Scriven
Made diff placement configurable (bottom-right, or bottom full-width).
543
        """Hide or show the diff panel."""
531.7.3 by Scott Scriven
Added an option to show/hide the diff panel.
544
        if col.get_active():
545
            self.diff.show()
531.7.14 by Scott Scriven
Made diff placement configurable (bottom-right, or bottom full-width).
546
            self._make_diff_nonzero_size()
531.7.3 by Scott Scriven
Added an option to show/hide the diff panel.
547
        else:
548
            self.diff.hide()
549
        self.config.set_user_option('viz-show-diffs', str(col.get_active()))
550
        self.update_diff_panel()
551
531.7.14 by Scott Scriven
Made diff placement configurable (bottom-right, or bottom full-width).
552
    def _diff_placement_changed(self, col):
553
        """Toggle the diff panel's position."""
554
        self.config.set_user_option('viz-wide-diffs', str(col.get_active()))
555
556
        old = self.paned.get_child2()
557
        self.paned.remove(old)
558
        self.paned.pack2(self.construct_bottom(), resize=True, shrink=False)
559
        self._make_diff_nonzero_size()
560
561
        self.treeview.emit('revision-selected')
555.2.2 by Jasper Groenewegen
Change from checkbox to menu item in bzr vis, add menu bar + item in gdiff
562
    
563
    def _diff_wrap_changed(self, widget):
564
        """Toggle word wrap in the diff widget."""
565
        self.config.set_user_option('viz-wrap-diffs', widget.get_active())
566
        self.diff._on_wraplines_toggled(widget)
567
    
371.1.1 by Daniel Schierbeck
Added About dialog to the viz.
568
    def _show_about_cb(self, w):
569
        dialog = AboutDialog()
570
        dialog.connect('response', lambda d,r: d.destroy())
571
        dialog.run()
404 by Daniel Schierbeck
Made the refresh use proper locking.
572
573
    def _refresh_clicked(self, w):
423.1.13 by Gary van der Merwe
Move viz loading msg from branchwin to treeview.
574
        self.treeview.refresh()
423.7.5 by Daniel Schierbeck
Made the revision history window update the Go->Tags menu when a tag is added.
575
576
    def _update_tags(self):
577
        menu = gtk.Menu()
578
579
        if self.branch.supports_tags():
580
            tags = self.branch.tags.get_tag_dict().items()
576.5.1 by Jelmer Vernooij
Disable the ability to click on tags that are not available in the current view.
581
            tags.sort(reverse=True)
423.7.5 by Daniel Schierbeck
Made the revision history window update the Go->Tags menu when a tag is added.
582
            for tag, revid in tags:
450.4.1 by Daniel Schierbeck
Added tag icon to branch history window.
583
                tag_image = gtk.Image()
584
                tag_image.set_from_file(icon_path('tag-16.png'))
585
                tag_item = gtk.ImageMenuItem(tag.replace('_', '__'))
586
                tag_item.set_image(tag_image)
423.7.5 by Daniel Schierbeck
Made the revision history window update the Go->Tags menu when a tag is added.
587
                tag_item.connect('activate', self._tag_selected_cb, revid)
576.5.1 by Jelmer Vernooij
Disable the ability to click on tags that are not available in the current view.
588
                tag_item.set_sensitive(self.treeview.has_revision_id(revid))
423.7.5 by Daniel Schierbeck
Made the revision history window update the Go->Tags menu when a tag is added.
589
                menu.add(tag_item)
590
            self.go_menu_tags.set_submenu(menu)
591
592
            self.go_menu_tags.set_sensitive(len(tags) != 0)
593
        else:
594
            self.go_menu_tags.set_sensitive(False)
595
596
        self.go_menu_tags.show_all()
597
531.7.10 by Scott Scriven
Simplified size-loading code. No longer saves identical config every time vis runs.
598
    def _load_size(self, name):
599
        """Read and parse 'name' from self.config.
600
        The value is a string, formatted as WIDTHxHEIGHT
601
        Returns None, or (width, height)
602
        """
603
        size = self.config.get_user_option(name)
604
        if size:
605
            width, height = [int(num) for num in size.split('x')]
606
            # avoid writing config every time we start
607
            return width, height
608
        return None
609
627 by Jelmer Vernooij
Use NULL_REVISION rather than None.
610
    def show_diff(self, revid=None, parentid=NULL_REVISION):
423.1.17 by Gary van der Merwe
Reuse the viz treeview in the revision browser.
611
        """Open a new window to show a diff between the given revisions."""
612
        from bzrlib.plugins.gtk.diff import DiffWindow
613
        window = DiffWindow(parent=self)
614
615
        rev_tree    = self.branch.repository.revision_tree(revid)
616
        parent_tree = self.branch.repository.revision_tree(parentid)
617
630 by Jelmer Vernooij
Use _get_nick(local=True) rather than .nick to get at a branches' nick, since
618
        description = revid + " - " + self.branch._get_nick(local=True)
423.1.17 by Gary van der Merwe
Reuse the viz treeview in the revision browser.
619
        window.set_diff(description, rev_tree, parent_tree)
620
        window.show()
621
531.7.3 by Scott Scriven
Added an option to show/hide the diff panel.
622
    def update_diff_panel(self, revision=None, parents=None):
623
        """Show the current revision in the diff panel."""
531.7.12 by Scott Scriven
Made diff panel default to off.
624
        if self.config.get_user_option('viz-show-diffs') != 'True':
531.7.3 by Scott Scriven
Added an option to show/hide the diff panel.
625
            return
626
627
        if not revision: # default to selected row
628
            revision = self.treeview.get_revision()
627 by Jelmer Vernooij
Use NULL_REVISION rather than None.
629
        if revision == NULL_REVISION:
531.7.3 by Scott Scriven
Added an option to show/hide the diff panel.
630
            return
631
632
        if not parents: # default to selected row's parents
633
            parents  = self.treeview.get_parents()
634
        if len(parents) == 0:
627 by Jelmer Vernooij
Use NULL_REVISION rather than None.
635
            parent_id = NULL_REVISION
531.7.3 by Scott Scriven
Added an option to show/hide the diff panel.
636
        else:
637
            parent_id = parents[0]
638
639
        rev_tree    = self.branch.repository.revision_tree(revision.revision_id)
640
        parent_tree = self.branch.repository.revision_tree(parent_id)
531.7.5 by Scott Scriven
Fixed DiffWidget so more than one call to set_diff() will work.
641
531.7.3 by Scott Scriven
Added an option to show/hide the diff panel.
642
        self.diff.set_diff(rev_tree, parent_tree)
555.2.2 by Jasper Groenewegen
Change from checkbox to menu item in bzr vis, add menu bar + item in gdiff
643
        if self.config.get_user_option('viz-wrap-diffs') == 'True':
644
            self.diff._on_wraplines_toggled(wrap=True)
531.7.3 by Scott Scriven
Added an option to show/hide the diff panel.
645
        self.diff.show_all()