52
52
            self.compact_view = False
 
54
 
        self.set_title(branch._get_nick(local=True) + " - revision history")
 
 
54
        self.set_title(branch.nick + " - revision history")
 
56
 
        # user-configured window size
 
57
 
        size = self._load_size('viz-window-size')
 
61
 
            # Use three-quarters of the screen by default
 
62
 
            screen = self.get_screen()
 
63
 
            monitor = screen.get_monitor_geometry(0)
 
64
 
            width = int(monitor.width * 0.75)
 
65
 
            height = int(monitor.height * 0.75)
 
 
56
        # Use three-quarters of the screen by default
 
 
57
        screen = self.get_screen()
 
 
58
        monitor = screen.get_monitor_geometry(0)
 
 
59
        width = int(monitor.width * 0.75)
 
 
60
        height = int(monitor.height * 0.75)
 
66
61
        self.set_default_size(width, height)
 
67
 
        self.set_size_request(width/3, height/3)
 
68
 
        self._save_size_on_destroy(self, 'viz-window-size')
 
71
 
        icon = self.render_icon_pixbuf(Gtk.STOCK_INDEX, Gtk.IconSize.BUTTON)
 
 
64
        icon = self.render_icon(gtk.STOCK_INDEX, gtk.ICON_SIZE_BUTTON)
 
72
65
        self.set_icon(icon)
 
74
 
        Gtk.AccelMap.add_entry("<viz>/Go/Next Revision", Gdk.KEY_Up, Gdk.ModifierType.MOD1_MASK)
 
75
 
        Gtk.AccelMap.add_entry("<viz>/Go/Previous Revision", Gdk.KEY_Down, Gdk.ModifierType.MOD1_MASK)
 
76
 
        Gtk.AccelMap.add_entry("<viz>/View/Refresh", Gdk.KEY_F5, 0)
 
 
67
        gtk.accel_map_add_entry("<viz>/Go/Next Revision", gtk.keysyms.Up, gtk.gdk.MOD1_MASK)
 
 
68
        gtk.accel_map_add_entry("<viz>/Go/Previous Revision", gtk.keysyms.Down, gtk.gdk.MOD1_MASK)
 
 
69
        gtk.accel_map_add_entry("<viz>/View/Refresh", gtk.keysyms.F5, 0)
 
78
 
        self.accel_group = Gtk.AccelGroup()
 
 
71
        self.accel_group = gtk.AccelGroup()
 
79
72
        self.add_accel_group(self.accel_group)
 
81
 
        self.prev_rev_action = Gtk.Action("prev-rev", "_Previous Revision", "Go to the previous revision", Gtk.STOCK_GO_DOWN)
 
 
74
        gtk.Action.set_tool_item_type(gtk.MenuToolButton)
 
 
76
        self.prev_rev_action = gtk.Action("prev-rev", "_Previous Revision", "Go to the previous revision", gtk.STOCK_GO_DOWN)
 
82
77
        self.prev_rev_action.set_accel_path("<viz>/Go/Previous Revision")
 
83
78
        self.prev_rev_action.set_accel_group(self.accel_group)
 
84
79
        self.prev_rev_action.connect("activate", self._back_clicked_cb)
 
85
80
        self.prev_rev_action.connect_accelerator()
 
87
 
        self.next_rev_action = Gtk.Action("next-rev", "_Next Revision", "Go to the next revision", Gtk.STOCK_GO_UP)
 
 
82
        self.next_rev_action = gtk.Action("next-rev", "_Next Revision", "Go to the next revision", gtk.STOCK_GO_UP)
 
88
83
        self.next_rev_action.set_accel_path("<viz>/Go/Next Revision")
 
89
84
        self.next_rev_action.set_accel_group(self.accel_group)
 
90
85
        self.next_rev_action.connect("activate", self._fwd_clicked_cb)
 
91
86
        self.next_rev_action.connect_accelerator()
 
93
 
        self.refresh_action = Gtk.Action("refresh", "_Refresh", "Refresh view", Gtk.STOCK_REFRESH)
 
 
88
        self.refresh_action = gtk.Action("refresh", "_Refresh", "Refresh view", gtk.STOCK_REFRESH)
 
94
89
        self.refresh_action.set_accel_path("<viz>/View/Refresh")
 
95
90
        self.refresh_action.set_accel_group(self.accel_group)
 
96
91
        self.refresh_action.connect("activate", self._refresh_clicked)
 
97
92
        self.refresh_action.connect_accelerator()
 
99
 
        self.vbox = self.construct()
 
101
 
    def _save_size_on_destroy(self, widget, config_name):
 
102
 
        """Creates a hook that saves the size of widget to config option 
 
103
 
           config_name when the window is destroyed/closed."""
 
105
 
            allocation = widget.get_allocation()
 
106
 
            width, height = allocation.width, allocation.height
 
107
 
            value = '%sx%s' % (width, height)
 
108
 
            self.config.set_user_option(config_name, value)
 
109
 
        self.connect("destroy", save_size)
 
111
96
    def set_revision(self, revid):
 
112
97
        self.treeview.set_revision_id(revid)
 
114
99
    def construct(self):
 
115
100
        """Construct the window contents."""
 
116
 
        vbox = Gtk.VBox(spacing=0)
 
 
101
        vbox = gtk.VBox(spacing=0)
 
119
 
        # order is important here
 
120
 
        paned = self.construct_paned()
 
121
 
        nav = self.construct_navigation()
 
122
 
        menubar = self.construct_menubar()
 
124
 
        vbox.pack_start(menubar, False, True, 0)
 
125
 
        vbox.pack_start(nav, False, True, 0)
 
126
 
        vbox.pack_start(paned, True, True, 0)
 
127
 
        vbox.set_focus_child(paned)
 
 
104
        self.paned = gtk.VPaned()
 
 
105
        self.paned.pack1(self.construct_top(), resize=True, shrink=False)
 
 
106
        self.paned.pack2(self.construct_bottom(), resize=False, shrink=True)
 
 
109
        vbox.pack_start(self.construct_menubar(), expand=False, fill=True)
 
 
110
        vbox.pack_start(self.construct_navigation(), expand=False, fill=True)
 
 
112
        vbox.pack_start(self.paned, expand=True, fill=True)
 
 
113
        vbox.set_focus_child(self.paned)
 
134
 
    def construct_paned(self):
 
135
 
        """Construct the main HPaned/VPaned contents."""
 
136
 
        if self.config.get_user_option('viz-vertical') == 'True':
 
137
 
            self.paned = Gtk.HPaned()
 
139
 
            self.paned = Gtk.VPaned()
 
141
 
        self.paned.pack1(self.construct_top(), resize=False, shrink=True)
 
142
 
        self.paned.pack2(self.construct_bottom(), resize=True, shrink=False)
 
147
117
    def construct_menubar(self):
 
148
 
        menubar = Gtk.MenuBar()
 
 
118
        menubar = gtk.MenuBar()
 
150
 
        file_menu = Gtk.Menu()
 
151
 
        file_menuitem = Gtk.MenuItem.new_with_mnemonic("_File")
 
 
120
        file_menu = gtk.Menu()
 
 
121
        file_menuitem = gtk.MenuItem("_File")
 
152
122
        file_menuitem.set_submenu(file_menu)
 
154
 
        file_menu_close = Gtk.ImageMenuItem.new_from_stock(
 
155
 
            Gtk.STOCK_CLOSE, self.accel_group)
 
 
124
        file_menu_close = gtk.ImageMenuItem(gtk.STOCK_CLOSE, self.accel_group)
 
156
125
        file_menu_close.connect('activate', lambda x: self.destroy())
 
158
 
        file_menu_quit = Gtk.ImageMenuItem.new_from_stock(
 
159
 
            Gtk.STOCK_QUIT, self.accel_group)
 
160
 
        file_menu_quit.connect('activate', lambda x: Gtk.main_quit())
 
 
127
        file_menu_quit = gtk.ImageMenuItem(gtk.STOCK_QUIT, self.accel_group)
 
 
128
        file_menu_quit.connect('activate', lambda x: gtk.main_quit())
 
162
130
        if self._parent is not None:
 
163
131
            file_menu.add(file_menu_close)
 
164
132
        file_menu.add(file_menu_quit)
 
166
 
        edit_menu = Gtk.Menu()
 
167
 
        edit_menuitem = Gtk.MenuItem.new_with_mnemonic("_Edit")
 
 
134
        edit_menu = gtk.Menu()
 
 
135
        edit_menuitem = gtk.MenuItem("_Edit")
 
168
136
        edit_menuitem.set_submenu(edit_menu)
 
170
 
        edit_menu_branchopts = Gtk.MenuItem(label="Branch Settings")
 
 
138
        edit_menu_find = gtk.ImageMenuItem(gtk.STOCK_FIND)
 
 
140
        edit_menu_branchopts = gtk.MenuItem("Branch Settings")
 
171
141
        edit_menu_branchopts.connect('activate', lambda x: PreferencesWindow(self.branch.get_config()).show())
 
173
 
        edit_menu_globopts = Gtk.MenuItem(label="Global Settings")
 
 
143
        edit_menu_globopts = gtk.MenuItem("Global Settings")
 
174
144
        edit_menu_globopts.connect('activate', lambda x: PreferencesWindow().show())
 
 
146
        edit_menu.add(edit_menu_find)
 
176
147
        edit_menu.add(edit_menu_branchopts)
 
177
148
        edit_menu.add(edit_menu_globopts)
 
179
 
        view_menu = Gtk.Menu()
 
180
 
        view_menuitem = Gtk.MenuItem.new_with_mnemonic("_View")
 
 
150
        view_menu = gtk.Menu()
 
 
151
        view_menuitem = gtk.MenuItem("_View")
 
181
152
        view_menuitem.set_submenu(view_menu)
 
183
154
        view_menu_refresh = self.refresh_action.create_menu_item()
 
184
155
        view_menu_refresh.connect('activate', self._refresh_clicked)
 
186
157
        view_menu.add(view_menu_refresh)
 
187
 
        view_menu.add(Gtk.SeparatorMenuItem())
 
 
158
        view_menu.add(gtk.SeparatorMenuItem())
 
189
 
        view_menu_toolbar = Gtk.CheckMenuItem(label="Show Toolbar")
 
 
160
        view_menu_toolbar = gtk.CheckMenuItem("Show Toolbar")
 
190
161
        view_menu_toolbar.set_active(True)
 
191
 
        if self.config.get_user_option('viz-toolbar-visible') == 'False':
 
192
 
            view_menu_toolbar.set_active(False)
 
194
162
        view_menu_toolbar.connect('toggled', self._toolbar_visibility_changed)
 
196
 
        view_menu_compact = Gtk.CheckMenuItem(label="Show Compact Graph")
 
 
164
        view_menu_compact = gtk.CheckMenuItem("Show Compact Graph")
 
197
165
        view_menu_compact.set_active(self.compact_view)
 
198
166
        view_menu_compact.connect('activate', self._brokenlines_toggled_cb)
 
200
 
        view_menu_vertical = Gtk.CheckMenuItem(label="Side-by-side Layout")
 
201
 
        view_menu_vertical.set_active(False)
 
202
 
        if self.config.get_user_option('viz-vertical') == 'True':
 
203
 
            view_menu_vertical.set_active(True)
 
204
 
        view_menu_vertical.connect('toggled', self._vertical_layout)
 
206
 
        view_menu_diffs = Gtk.CheckMenuItem(label="Show Diffs")
 
207
 
        view_menu_diffs.set_active(False)
 
208
 
        if self.config.get_user_option('viz-show-diffs') == 'True':
 
209
 
            view_menu_diffs.set_active(True)
 
210
 
        view_menu_diffs.connect('toggled', self._diff_visibility_changed)
 
212
 
        view_menu_wide_diffs = Gtk.CheckMenuItem(label="Wide Diffs")
 
213
 
        view_menu_wide_diffs.set_active(False)
 
214
 
        if self.config.get_user_option('viz-wide-diffs') == 'True':
 
215
 
            view_menu_wide_diffs.set_active(True)
 
216
 
        view_menu_wide_diffs.connect('toggled', self._diff_placement_changed)
 
218
 
        view_menu_wrap_diffs = Gtk.CheckMenuItem.new_with_mnemonic(
 
219
 
            "Wrap _Long Lines in Diffs")
 
220
 
        view_menu_wrap_diffs.set_active(False)
 
221
 
        if self.config.get_user_option('viz-wrap-diffs') == 'True':
 
222
 
            view_menu_wrap_diffs.set_active(True)
 
223
 
        view_menu_wrap_diffs.connect('toggled', self._diff_wrap_changed)
 
225
168
        view_menu.add(view_menu_toolbar)
 
226
169
        view_menu.add(view_menu_compact)
 
227
 
        view_menu.add(view_menu_vertical)
 
228
 
        view_menu.add(Gtk.SeparatorMenuItem())
 
229
 
        view_menu.add(view_menu_diffs)
 
230
 
        view_menu.add(view_menu_wide_diffs)
 
231
 
        view_menu.add(view_menu_wrap_diffs)
 
232
 
        view_menu.add(Gtk.SeparatorMenuItem())
 
 
170
        view_menu.add(gtk.SeparatorMenuItem())
 
234
 
        self.mnu_show_revno_column = Gtk.CheckMenuItem.new_with_mnemonic(
 
235
 
            "Show Revision _Number Column")
 
236
 
        self.mnu_show_date_column = Gtk.CheckMenuItem.new_with_mnemonic(
 
 
172
        self.mnu_show_revno_column = gtk.CheckMenuItem("Show Revision _Number Column")
 
 
173
        self.mnu_show_date_column = gtk.CheckMenuItem("Show _Date Column")
 
239
175
        # Revision numbers are pointless if there are multiple branches
 
240
176
        if len(self.start_revs) > 1:
 
 
247
183
            col.connect('toggled', self._col_visibility_changed, name)
 
248
184
            view_menu.add(col)
 
251
187
        go_menu.set_accel_group(self.accel_group)
 
252
 
        go_menuitem = Gtk.MenuItem.new_with_mnemonic("_Go")
 
 
188
        go_menuitem = gtk.MenuItem("_Go")
 
253
189
        go_menuitem.set_submenu(go_menu)
 
255
191
        go_menu_next = self.next_rev_action.create_menu_item()
 
256
192
        go_menu_prev = self.prev_rev_action.create_menu_item()
 
258
 
        tag_image = Gtk.Image()
 
 
194
        tag_image = gtk.Image()
 
259
195
        tag_image.set_from_file(icon_path("tag-16.png"))
 
260
 
        self.go_menu_tags = Gtk.ImageMenuItem.new_with_mnemonic("_Tags")
 
 
196
        self.go_menu_tags = gtk.ImageMenuItem("_Tags")
 
261
197
        self.go_menu_tags.set_image(tag_image)
 
262
 
        self.treeview.connect('refreshed', lambda w: self._update_tags())
 
264
200
        go_menu.add(go_menu_next)
 
265
201
        go_menu.add(go_menu_prev)
 
266
 
        go_menu.add(Gtk.SeparatorMenuItem())
 
 
202
        go_menu.add(gtk.SeparatorMenuItem())
 
267
203
        go_menu.add(self.go_menu_tags)
 
269
 
        self.revision_menu = RevisionMenu(self.branch.repository, [],
 
270
 
            self.branch, parent=self)
 
271
 
        revision_menuitem = Gtk.MenuItem.new_with_mnemonic("_Revision")
 
272
 
        revision_menuitem.set_submenu(self.revision_menu)
 
274
 
        branch_menu = Gtk.Menu()
 
275
 
        branch_menuitem = Gtk.MenuItem.new_with_mnemonic("_Branch")
 
 
205
        revision_menu = gtk.Menu()
 
 
206
        revision_menuitem = gtk.MenuItem("_Revision")
 
 
207
        revision_menuitem.set_submenu(revision_menu)
 
 
209
        revision_menu_diff = gtk.MenuItem("View Changes")
 
 
210
        revision_menu_diff.connect('activate', 
 
 
213
        revision_menu_compare = gtk.MenuItem("Compare with...")
 
 
214
        revision_menu_compare.connect('activate',
 
 
215
                self._compare_with_cb)
 
 
217
        revision_menu_tag = gtk.MenuItem("Tag Revision")
 
 
218
        revision_menu_tag.connect('activate', self._tag_revision_cb)
 
 
220
        revision_menu.add(revision_menu_tag)
 
 
221
        revision_menu.add(revision_menu_diff)
 
 
222
        revision_menu.add(revision_menu_compare)
 
 
224
        branch_menu = gtk.Menu()
 
 
225
        branch_menuitem = gtk.MenuItem("_Branch")
 
276
226
        branch_menuitem.set_submenu(branch_menu)
 
278
 
        branch_menu.add(Gtk.MenuItem.new_with_mnemonic("Pu_ll Revisions"))
 
279
 
        branch_menu.add(Gtk.MenuItem.new_with_mnemonic("Pu_sh Revisions"))
 
282
 
            from bzrlib.plugins import search
 
284
 
            mutter("Didn't find search plugin")
 
286
 
            branch_menu.add(Gtk.SeparatorMenuItem())
 
288
 
            branch_index_menuitem = Gtk.MenuItem.new_with_mnemonic("_Index")
 
289
 
            branch_index_menuitem.connect('activate', self._branch_index_cb)
 
290
 
            branch_menu.add(branch_index_menuitem)
 
292
 
            branch_search_menuitem = Gtk.MenuItem.new_with_mnemonic("_Search")
 
293
 
            branch_search_menuitem.connect('activate', self._branch_search_cb)
 
294
 
            branch_menu.add(branch_search_menuitem)
 
296
 
        help_menu = Gtk.Menu()
 
297
 
        help_menuitem = Gtk.MenuItem.new_with_mnemonic("_Help")
 
 
228
        branch_menu.add(gtk.MenuItem("Pu_ll Revisions"))
 
 
229
        branch_menu.add(gtk.MenuItem("Pu_sh Revisions"))
 
 
231
        help_menu = gtk.Menu()
 
 
232
        help_menuitem = gtk.MenuItem("_Help")
 
298
233
        help_menuitem.set_submenu(help_menu)
 
300
 
        help_about_menuitem = Gtk.ImageMenuItem.new_from_stock(
 
301
 
            Gtk.STOCK_ABOUT, self.accel_group)
 
 
235
        help_about_menuitem = gtk.ImageMenuItem(gtk.STOCK_ABOUT, self.accel_group)
 
302
236
        help_about_menuitem.connect('activate', self._about_dialog_cb)
 
304
238
        help_menu.add(help_about_menuitem)
 
 
318
252
        """Construct the top-half of the window."""
 
319
253
        # FIXME: Make broken_line_length configurable
 
321
 
        self.treeview = TreeView(self.branch, self.start_revs, self.maxnum,
 
 
255
        self.treeview = TreeView(self.branch, self.start_revs, self.maxnum, self.compact_view)
 
 
257
        self.treeview.connect('revision-selected',
 
 
258
                self._treeselection_changed_cb)
 
 
259
        self.treeview.connect('revision-activated',
 
 
260
                self._tree_revision_activated)
 
 
262
        self.treeview.connect('tag-added', lambda w, t, r: self._update_tags())
 
324
264
        for col in ["revno", "date"]:
 
325
265
            option = self.config.get_user_option(col + '-column-visible')
 
326
266
            if option is not None:
 
327
 
                self.treeview.set_property(col + '-column-visible',
 
 
267
                self.treeview.set_property(col + '-column-visible', option == 'True')
 
330
269
                self.treeview.set_property(col + '-column-visible', False)
 
332
271
        self.treeview.show()
 
334
 
        align = Gtk.Alignment.new(0.0, 0.0, 1.0, 1.0)
 
 
273
        align = gtk.Alignment(0.0, 0.0, 1.0, 1.0)
 
335
274
        align.set_padding(5, 0, 0, 0)
 
336
275
        align.add(self.treeview)
 
337
 
        # user-configured size
 
338
 
        size = self._load_size('viz-graph-size')
 
341
 
            align.set_size_request(width, height)
 
343
 
            (width, height) = self.get_size()
 
344
 
            align.set_size_request(width, int(height / 2.5))
 
345
 
        self._save_size_on_destroy(align, 'viz-graph-size')
 
350
280
    def construct_navigation(self):
 
351
281
        """Construct the navigation buttons."""
 
352
 
        self.toolbar = Gtk.Toolbar()
 
353
 
        self.toolbar.set_style(Gtk.ToolbarStyle.BOTH_HORIZ)
 
 
282
        self.toolbar = gtk.Toolbar()
 
 
283
        self.toolbar.set_style(gtk.TOOLBAR_BOTH_HORIZ)
 
355
285
        self.prev_button = self.prev_rev_action.create_tool_item()
 
356
286
        self.toolbar.insert(self.prev_button, -1)
 
 
371
301
    def construct_bottom(self):
 
372
302
        """Construct the bottom half of the window."""
 
373
 
        if self.config.get_user_option('viz-wide-diffs') == 'True':
 
374
 
            self.diff_paned = Gtk.VPaned()
 
376
 
            self.diff_paned = Gtk.HPaned()
 
377
 
        (width, height) = self.get_size()
 
378
 
        self.diff_paned.set_size_request(20, 20) # shrinkable
 
380
303
        from bzrlib.plugins.gtk.revisionview import RevisionView
 
381
304
        self.revisionview = RevisionView(branch=self.branch)
 
382
 
        self.revisionview.set_size_request(width/3, int(height / 2.5))
 
383
 
        # user-configured size
 
384
 
        size = self._load_size('viz-revisionview-size')
 
387
 
            self.revisionview.set_size_request(width, height)
 
388
 
        self._save_size_on_destroy(self.revisionview, 'viz-revisionview-size')
 
 
305
        (width, height) = self.get_size()
 
 
306
        self.revisionview.set_size_request(width, int(height / 2.5))
 
389
307
        self.revisionview.show()
 
390
308
        self.revisionview.set_show_callback(self._show_clicked_cb)
 
391
309
        self.revisionview.connect('notify::revision', self._go_clicked_cb)
 
392
 
        self.treeview.connect('tag-added',
 
393
 
            lambda w, t, r: self.revisionview.update_tags())
 
394
 
        self.treeview.connect('revision-selected',
 
395
 
                self._treeselection_changed_cb)
 
396
 
        self.treeview.connect('revision-activated',
 
397
 
                self._tree_revision_activated)
 
398
 
        self.diff_paned.pack1(self.revisionview)
 
400
 
        from bzrlib.plugins.gtk.diff import DiffWidget
 
401
 
        self.diff = DiffWidget()
 
402
 
        self.diff_paned.pack2(self.diff)
 
404
 
        self.diff_paned.show_all()
 
405
 
        if self.config.get_user_option('viz-show-diffs') != 'True':
 
408
 
        return self.diff_paned
 
 
310
        self.treeview.connect('tag-added', lambda w, t, r: self.revisionview.update_tags())
 
 
311
        return self.revisionview
 
410
313
    def _tag_selected_cb(self, menuitem, revid):
 
411
314
        self.treeview.set_revision_id(revid)
 
 
557
468
    def _toolbar_visibility_changed(self, col):
 
558
469
        if col.get_active():
 
561
472
            self.toolbar.hide()
 
562
 
        self.config.set_user_option('viz-toolbar-visible', col.get_active())
 
564
 
    def _vertical_layout(self, col):
 
565
 
        """Toggle the layout vertical/horizontal"""
 
566
 
        self.config.set_user_option('viz-vertical', str(col.get_active()))
 
569
 
        self.vbox.remove(old)
 
570
 
        self.vbox.pack_start(
 
571
 
            self.construct_paned(), True, True, 0)
 
572
 
        self._make_diff_paned_nonzero_size()
 
573
 
        self._make_diff_nonzero_size()
 
575
 
        self.treeview.emit('revision-selected')
 
577
 
    def _make_diff_paned_nonzero_size(self):
 
578
 
        """make sure the diff/revision pane isn't zero-width or zero-height"""
 
579
 
        alloc = self.diff_paned.get_allocation()
 
580
 
        if (alloc.width < 10) or (alloc.height < 10):
 
581
 
            width, height = self.get_size()
 
582
 
            self.diff_paned.set_size_request(width/3, int(height / 2.5))
 
584
 
    def _make_diff_nonzero_size(self):
 
585
 
        """make sure the diff isn't zero-width or zero-height"""
 
586
 
        alloc = self.diff.get_allocation()
 
587
 
        if (alloc.width < 10) or (alloc.height < 10):
 
588
 
            width, height = self.get_size()
 
589
 
            self.revisionview.set_size_request(width/3, int(height / 2.5))
 
591
 
    def _diff_visibility_changed(self, col):
 
592
 
        """Hide or show the diff panel."""
 
595
 
            self._make_diff_nonzero_size()
 
598
 
        self.config.set_user_option('viz-show-diffs', str(col.get_active()))
 
599
 
        self.update_diff_panel()
 
601
 
    def _diff_placement_changed(self, col):
 
602
 
        """Toggle the diff panel's position."""
 
603
 
        self.config.set_user_option('viz-wide-diffs', str(col.get_active()))
 
605
 
        old = self.paned.get_child2()
 
606
 
        self.paned.remove(old)
 
607
 
        self.paned.pack2(self.construct_bottom(), resize=True, shrink=False)
 
608
 
        self._make_diff_nonzero_size()
 
610
 
        self.treeview.emit('revision-selected')
 
612
 
    def _diff_wrap_changed(self, widget):
 
613
 
        """Toggle word wrap in the diff widget."""
 
614
 
        self.config.set_user_option('viz-wrap-diffs', widget.get_active())
 
615
 
        self.diff._on_wraplines_toggled(widget)
 
 
474
    def _show_about_cb(self, w):
 
 
475
        dialog = AboutDialog()
 
 
476
        dialog.connect('response', lambda d,r: d.destroy())
 
617
479
    def _refresh_clicked(self, w):
 
618
480
        self.treeview.refresh()
 
620
482
    def _update_tags(self):
 
623
485
        if self.branch.supports_tags():
 
624
486
            tags = self.branch.tags.get_tag_dict().items()
 
625
 
            tags.sort(reverse=True)
 
626
489
            for tag, revid in tags:
 
627
 
                tag_image = Gtk.Image()
 
 
490
                tag_image = gtk.Image()
 
628
491
                tag_image.set_from_file(icon_path('tag-16.png'))
 
629
 
                tag_item = Gtk.ImageMenuItem.new_with_mnemonic(
 
630
 
                    tag.replace('_', '__'))
 
 
492
                tag_item = gtk.ImageMenuItem(tag.replace('_', '__'))
 
631
493
                tag_item.set_image(tag_image)
 
632
494
                tag_item.connect('activate', self._tag_selected_cb, revid)
 
633
 
                tag_item.set_sensitive(self.treeview.has_revision_id(revid))
 
634
495
                menu.add(tag_item)
 
635
496
            self.go_menu_tags.set_submenu(menu)
 
 
641
502
        self.go_menu_tags.show_all()
 
643
 
    def _load_size(self, name):
 
644
 
        """Read and parse 'name' from self.config.
 
645
 
        The value is a string, formatted as WIDTHxHEIGHT
 
646
 
        Returns None, or (width, height)
 
648
 
        size = self.config.get_user_option(name)
 
650
 
            width, height = [int(num) for num in size.split('x')]
 
651
 
            # avoid writing config every time we start
 
655
 
    def show_diff(self, revid=None, parentid=NULL_REVISION):
 
 
504
    def show_diff(self, revid=None, parentid=None):
 
656
505
        """Open a new window to show a diff between the given revisions."""
 
657
506
        from bzrlib.plugins.gtk.diff import DiffWindow
 
658
507
        window = DiffWindow(parent=self)
 
 
510
            parentid = NULL_REVISION
 
660
512
        rev_tree    = self.branch.repository.revision_tree(revid)
 
661
513
        parent_tree = self.branch.repository.revision_tree(parentid)
 
663
 
        description = revid + " - " + self.branch._get_nick(local=True)
 
 
515
        description = revid + " - " + self.branch.nick
 
664
516
        window.set_diff(description, rev_tree, parent_tree)
 
667
 
    def update_diff_panel(self, revision=None, parents=None):
 
668
 
        """Show the current revision in the diff panel."""
 
669
 
        if self.config.get_user_option('viz-show-diffs') != 'True':
 
672
 
        if not revision: # default to selected row
 
673
 
            revision = self.treeview.get_revision()
 
674
 
        if revision == NULL_REVISION:
 
677
 
        if not parents: # default to selected row's parents
 
678
 
            parents  = self.treeview.get_parents()
 
679
 
        if len(parents) == 0:
 
680
 
            parent_id = NULL_REVISION
 
682
 
            parent_id = parents[0]
 
684
 
        rev_tree    = self.branch.repository.revision_tree(revision.revision_id)
 
685
 
        parent_tree = self.branch.repository.revision_tree(parent_id)
 
687
 
        self.diff.set_diff(rev_tree, parent_tree)
 
688
 
        if self.config.get_user_option('viz-wrap-diffs') == 'True':
 
689
 
            self.diff._on_wraplines_toggled(wrap=True)