/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
298.2.1 by Daniel Schierbeck
Refactored the GTK window code, creating a single base window class that handles keyboard events.
16
from bzrlib.plugins.gtk.window import Window
450.4.1 by Daniel Schierbeck
Added tag icon to branch history window.
17
from bzrlib.plugins.gtk import icon_path
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
423.1.17 by Gary van der Merwe
Reuse the viz treeview in the revision browser.
20
from bzrlib.plugins.gtk.branchview import TreeView, treemodel
511.6.1 by Jelmer Vernooij
Add Branch/Index option if bzr-search is available.
21
22
from bzrlib.config import BranchConfig, GlobalConfig
443 by Szilveszter Farkas (Phanatic)
Trivial fix for #149061 (be able to show the diff for revision 1).
23
from bzrlib.revision import Revision, NULL_REVISION
511.6.1 by Jelmer Vernooij
Add Branch/Index option if bzr-search is available.
24
from bzrlib.trace import mutter
1 by Scott James Remnant
Commit the first version of bzrk.
25
298.2.1 by Daniel Schierbeck
Refactored the GTK window code, creating a single base window class that handles keyboard events.
26
class BranchWindow(Window):
1 by Scott James Remnant
Commit the first version of bzrk.
27
    """Branch window.
28
29
    This object represents and manages a single window containing information
30
    for a particular branch.
31
    """
32
452.4.1 by Jelmer Vernooij
Support displaying multiple tips in viz.
33
    def __init__(self, branch, start_revs, maxnum, parent=None):
322 by Jelmer Vernooij
Add docstrings.
34
        """Create a new BranchWindow.
35
36
        :param branch: Branch object for branch to show.
452.4.1 by Jelmer Vernooij
Support displaying multiple tips in viz.
37
        :param start_revs: Revision ids of top revisions.
322 by Jelmer Vernooij
Add docstrings.
38
        :param maxnum: Maximum number of revisions to display, 
39
                       None for no limit.
40
        """
41
298.2.1 by Daniel Schierbeck
Refactored the GTK window code, creating a single base window class that handles keyboard events.
42
        Window.__init__(self, parent=parent)
1 by Scott James Remnant
Commit the first version of bzrk.
43
        self.set_border_width(0)
315 by Daniel Schierbeck
Removed BranchWindow.set_branch(), used constructor instead.
44
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
45
        self.branch      = branch
452.4.1 by Jelmer Vernooij
Support displaying multiple tips in viz.
46
        self.start_revs  = start_revs
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
47
        self.maxnum      = maxnum
330.2.5 by Daniel Schierbeck
Support persistence of compact view option.
48
        self.config      = GlobalConfig()
49
50
        if self.config.get_user_option('viz-compact-view') == 'yes':
51
            self.compact_view = True
52
        else:
53
            self.compact_view = False
315 by Daniel Schierbeck
Removed BranchWindow.set_branch(), used constructor instead.
54
55
        self.set_title(branch.nick + " - revision history")
1 by Scott James Remnant
Commit the first version of bzrk.
56
57
        # Use three-quarters of the screen by default
58
        screen = self.get_screen()
4 by Scott James Remnant
Use the size of the first monitor rather than the entire screen
59
        monitor = screen.get_monitor_geometry(0)
60
        width = int(monitor.width * 0.75)
61
        height = int(monitor.height * 0.75)
1 by Scott James Remnant
Commit the first version of bzrk.
62
        self.set_default_size(width, height)
63
64
        # FIXME AndyFitz!
65
        icon = self.render_icon(gtk.STOCK_INDEX, gtk.ICON_SIZE_BUTTON)
66
        self.set_icon(icon)
67
384 by Daniel Schierbeck
Added accelerator for Next Revision action.
68
        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.
69
        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
70
        gtk.accel_map_add_entry("<viz>/View/Refresh", gtk.keysyms.F5, 0)
382 by Daniel Schierbeck
Made accelerator for Previous Revision work.
71
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
72
        self.accel_group = gtk.AccelGroup()
73
        self.add_accel_group(self.accel_group)
74
388 by Daniel Schierbeck
Switched to using the Previous/Next Revision actions to create tool buttons.
75
        gtk.Action.set_tool_item_type(gtk.MenuToolButton)
76
385 by Daniel Schierbeck
Created a single action for Previous Revision.
77
        self.prev_rev_action = gtk.Action("prev-rev", "_Previous Revision", "Go to the previous revision", gtk.STOCK_GO_DOWN)
78
        self.prev_rev_action.set_accel_path("<viz>/Go/Previous Revision")
79
        self.prev_rev_action.set_accel_group(self.accel_group)
80
        self.prev_rev_action.connect("activate", self._back_clicked_cb)
81
        self.prev_rev_action.connect_accelerator()
82
386 by Daniel Schierbeck
Created a single action for Next Revision.
83
        self.next_rev_action = gtk.Action("next-rev", "_Next Revision", "Go to the next revision", gtk.STOCK_GO_UP)
84
        self.next_rev_action.set_accel_path("<viz>/Go/Next Revision")
85
        self.next_rev_action.set_accel_group(self.accel_group)
86
        self.next_rev_action.connect("activate", self._fwd_clicked_cb)
87
        self.next_rev_action.connect_accelerator()
88
499.1.1 by Russ Brown
Added Refresh menu option with keyboard shortcut to viz
89
        self.refresh_action = gtk.Action("refresh", "_Refresh", "Refresh view", gtk.STOCK_REFRESH)
90
        self.refresh_action.set_accel_path("<viz>/View/Refresh")
91
        self.refresh_action.set_accel_group(self.accel_group)
92
        self.refresh_action.connect("activate", self._refresh_clicked)
93
        self.refresh_action.connect_accelerator()
94
1 by Scott James Remnant
Commit the first version of bzrk.
95
        self.construct()
96
369 by Daniel Schierbeck
Fixed bug with compact view toggling.
97
    def set_revision(self, revid):
98
        self.treeview.set_revision_id(revid)
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
99
1 by Scott James Remnant
Commit the first version of bzrk.
100
    def construct(self):
101
        """Construct the window contents."""
331 by Daniel Schierbeck
Added basic menu bar.
102
        vbox = gtk.VBox(spacing=0)
44 by David Allouche
reorganise branch window
103
        self.add(vbox)
104
375 by Daniel Schierbeck
Fixed crash when toggling compact view.
105
        self.paned = gtk.VPaned()
106
        self.paned.pack1(self.construct_top(), resize=True, shrink=False)
107
        self.paned.pack2(self.construct_bottom(), resize=False, shrink=True)
108
        self.paned.show()
358 by Daniel Schierbeck
Generalized the hiding/showing code.
109
331 by Daniel Schierbeck
Added basic menu bar.
110
        vbox.pack_start(self.construct_menubar(), expand=False, fill=True)
44 by David Allouche
reorganise branch window
111
        vbox.pack_start(self.construct_navigation(), expand=False, fill=True)
280.2.1 by Gary van der Merwe
Add a message to the viz window to indicate that graph is still loading.
112
        
369 by Daniel Schierbeck
Fixed bug with compact view toggling.
113
        vbox.pack_start(self.paned, expand=True, fill=True)
114
        vbox.set_focus_child(self.paned)
44 by David Allouche
reorganise branch window
115
116
        vbox.show()
331 by Daniel Schierbeck
Added basic menu bar.
117
118
    def construct_menubar(self):
119
        menubar = gtk.MenuBar()
120
121
        file_menu = gtk.Menu()
334 by Daniel Schierbeck
Added icons to menus.
122
        file_menuitem = gtk.MenuItem("_File")
331 by Daniel Schierbeck
Added basic menu bar.
123
        file_menuitem.set_submenu(file_menu)
124
362 by Daniel Schierbeck
Added accel group to File -> Close menu item.
125
        file_menu_close = gtk.ImageMenuItem(gtk.STOCK_CLOSE, self.accel_group)
331 by Daniel Schierbeck
Added basic menu bar.
126
        file_menu_close.connect('activate', lambda x: self.destroy())
127
        
363 by Daniel Schierbeck
Added File -> Quit menu item.
128
        file_menu_quit = gtk.ImageMenuItem(gtk.STOCK_QUIT, self.accel_group)
129
        file_menu_quit.connect('activate', lambda x: gtk.main_quit())
130
        
408 by Daniel Schierbeck
Made the close menu item actually appear when the viz is opened from another window.
131
        if self._parent is not None:
406 by Daniel Schierbeck
Made the viz show the close menu item only if opened from another window.
132
            file_menu.add(file_menu_close)
363 by Daniel Schierbeck
Added File -> Quit menu item.
133
        file_menu.add(file_menu_quit)
331 by Daniel Schierbeck
Added basic menu bar.
134
338 by Daniel Schierbeck
Added Preferences menu item.
135
        edit_menu = gtk.Menu()
136
        edit_menuitem = gtk.MenuItem("_Edit")
137
        edit_menuitem.set_submenu(edit_menu)
138
340 by Daniel Schierbeck
Added edit->find menu item stub.
139
        edit_menu_find = gtk.ImageMenuItem(gtk.STOCK_FIND)
140
361 by Daniel Schierbeck
Added branch settings menu item.
141
        edit_menu_branchopts = gtk.MenuItem("Branch Settings")
142
        edit_menu_branchopts.connect('activate', lambda x: PreferencesWindow(self.branch.get_config()).show())
143
407 by Daniel Schierbeck
Renamed Preferences menu item into Global Settings.
144
        edit_menu_globopts = gtk.MenuItem("Global Settings")
145
        edit_menu_globopts.connect('activate', lambda x: PreferencesWindow().show())
338 by Daniel Schierbeck
Added Preferences menu item.
146
340 by Daniel Schierbeck
Added edit->find menu item stub.
147
        edit_menu.add(edit_menu_find)
361 by Daniel Schierbeck
Added branch settings menu item.
148
        edit_menu.add(edit_menu_branchopts)
407 by Daniel Schierbeck
Renamed Preferences menu item into Global Settings.
149
        edit_menu.add(edit_menu_globopts)
338 by Daniel Schierbeck
Added Preferences menu item.
150
348 by Daniel Schierbeck
Added toggle item for revision number column.
151
        view_menu = gtk.Menu()
152
        view_menuitem = gtk.MenuItem("_View")
153
        view_menuitem.set_submenu(view_menu)
154
499.1.1 by Russ Brown
Added Refresh menu option with keyboard shortcut to viz
155
        view_menu_refresh = self.refresh_action.create_menu_item()
156
        view_menu_refresh.connect('activate', self._refresh_clicked)
157
158
        view_menu.add(view_menu_refresh)
159
        view_menu.add(gtk.SeparatorMenuItem())
160
351 by Daniel Schierbeck
Added option to hide the toolbar.
161
        view_menu_toolbar = gtk.CheckMenuItem("Show Toolbar")
162
        view_menu_toolbar.set_active(True)
163
        view_menu_toolbar.connect('toggled', self._toolbar_visibility_changed)
164
370 by Daniel Schierbeck
Moved compact graph toggle to the menubar.
165
        view_menu_compact = gtk.CheckMenuItem("Show Compact Graph")
166
        view_menu_compact.set_active(self.compact_view)
167
        view_menu_compact.connect('activate', self._brokenlines_toggled_cb)
168
351 by Daniel Schierbeck
Added option to hide the toolbar.
169
        view_menu.add(view_menu_toolbar)
370 by Daniel Schierbeck
Moved compact graph toggle to the menubar.
170
        view_menu.add(view_menu_compact)
351 by Daniel Schierbeck
Added option to hide the toolbar.
171
        view_menu.add(gtk.SeparatorMenuItem())
358 by Daniel Schierbeck
Generalized the hiding/showing code.
172
452.4.2 by Jelmer Vernooij
Hide revision number column if more than one branch was specified.
173
        self.mnu_show_revno_column = gtk.CheckMenuItem("Show Revision _Number Column")
174
        self.mnu_show_date_column = gtk.CheckMenuItem("Show _Date Column")
175
176
        # Revision numbers are pointless if there are multiple branches
177
        if len(self.start_revs) > 1:
178
            self.mnu_show_revno_column.set_sensitive(False)
179
            self.treeview.set_property('revno-column-visible', False)
180
181
        for (col, name) in [(self.mnu_show_revno_column, "revno"), 
182
                            (self.mnu_show_date_column, "date")]:
358 by Daniel Schierbeck
Generalized the hiding/showing code.
183
            col.set_active(self.treeview.get_property(name + "-column-visible"))
184
            col.connect('toggled', self._col_visibility_changed, name)
185
            view_menu.add(col)
348 by Daniel Schierbeck
Added toggle item for revision number column.
186
331 by Daniel Schierbeck
Added basic menu bar.
187
        go_menu = gtk.Menu()
382 by Daniel Schierbeck
Made accelerator for Previous Revision work.
188
        go_menu.set_accel_group(self.accel_group)
334 by Daniel Schierbeck
Added icons to menus.
189
        go_menuitem = gtk.MenuItem("_Go")
331 by Daniel Schierbeck
Added basic menu bar.
190
        go_menuitem.set_submenu(go_menu)
191
        
390 by Daniel Schierbeck
Made the Previous/Next Revision menu items local variables.
192
        go_menu_next = self.next_rev_action.create_menu_item()
193
        go_menu_prev = self.prev_rev_action.create_menu_item()
334 by Daniel Schierbeck
Added icons to menus.
194
450.4.1 by Daniel Schierbeck
Added tag icon to branch history window.
195
        tag_image = gtk.Image()
196
        tag_image.set_from_file(icon_path("tag-16.png"))
197
        self.go_menu_tags = gtk.ImageMenuItem("_Tags")
198
        self.go_menu_tags.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.
199
        self._update_tags()
399 by Daniel Schierbeck
Made tags menu insensitive when there are no tags to display.
200
390 by Daniel Schierbeck
Made the Previous/Next Revision menu items local variables.
201
        go_menu.add(go_menu_next)
202
        go_menu.add(go_menu_prev)
334 by Daniel Schierbeck
Added icons to menus.
203
        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.
204
        go_menu.add(self.go_menu_tags)
334 by Daniel Schierbeck
Added icons to menus.
205
335 by Daniel Schierbeck
Added Revision menu.
206
        revision_menu = gtk.Menu()
207
        revision_menuitem = gtk.MenuItem("_Revision")
208
        revision_menuitem.set_submenu(revision_menu)
209
364 by Daniel Schierbeck
Simplified TreeView.show_diff() and made the Revision -> View Changes menu item work.
210
        revision_menu_diff = gtk.MenuItem("View Changes")
211
        revision_menu_diff.connect('activate', 
463.3.1 by Javier Derderian
Fixed menu entry 'View Changes'. Bug #215350
212
                self._menu_diff_cb)
461.1.3 by Javier Derderian
Added "compare with" option to revisions menu.
213
        
214
        revision_menu_compare = gtk.MenuItem("Compare with...")
215
        revision_menu_compare.connect('activate',
216
                self._compare_with_cb)
364 by Daniel Schierbeck
Simplified TreeView.show_diff() and made the Revision -> View Changes menu item work.
217
365 by Daniel Schierbeck
Fixed locks and made tagging work.
218
        revision_menu_tag = gtk.MenuItem("Tag Revision")
219
        revision_menu_tag.connect('activate', self._tag_revision_cb)
220
221
        revision_menu.add(revision_menu_tag)
364 by Daniel Schierbeck
Simplified TreeView.show_diff() and made the Revision -> View Changes menu item work.
222
        revision_menu.add(revision_menu_diff)
461.1.3 by Javier Derderian
Added "compare with" option to revisions menu.
223
        revision_menu.add(revision_menu_compare)
335 by Daniel Schierbeck
Added Revision menu.
224
334 by Daniel Schierbeck
Added icons to menus.
225
        branch_menu = gtk.Menu()
226
        branch_menuitem = gtk.MenuItem("_Branch")
227
        branch_menuitem.set_submenu(branch_menu)
228
336 by Daniel Schierbeck
Changed wording to comply with HIG guidelines.
229
        branch_menu.add(gtk.MenuItem("Pu_ll Revisions"))
230
        branch_menu.add(gtk.MenuItem("Pu_sh Revisions"))
371.1.1 by Daniel Schierbeck
Added About dialog to the viz.
231
511.6.1 by Jelmer Vernooij
Add Branch/Index option if bzr-search is available.
232
        try:
233
            from bzrlib.plugins import search
234
        except ImportError:
235
            mutter("Didn't find search plugin")
236
        else:
526 by Jelmer Vernooij
Switch to found revision when clicking ok in search window.
237
            branch_menu.add(gtk.SeparatorMenuItem())
238
511.6.1 by Jelmer Vernooij
Add Branch/Index option if bzr-search is available.
239
            branch_index_menuitem = gtk.MenuItem("_Index")
240
            branch_index_menuitem.connect('activate', self._branch_index_cb)
241
            branch_menu.add(branch_index_menuitem)
242
524 by Jelmer Vernooij
Add search dialog.
243
            branch_search_menuitem = gtk.MenuItem("_Search")
244
            branch_search_menuitem.connect('activate', self._branch_search_cb)
245
            branch_menu.add(branch_search_menuitem)
246
423.9.1 by Daniel Schierbeck
Added Help->About menu item to the viz.
247
        help_menu = gtk.Menu()
248
        help_menuitem = gtk.MenuItem("_Help")
249
        help_menuitem.set_submenu(help_menu)
250
251
        help_about_menuitem = gtk.ImageMenuItem(gtk.STOCK_ABOUT, self.accel_group)
252
        help_about_menuitem.connect('activate', self._about_dialog_cb)
253
254
        help_menu.add(help_about_menuitem)
255
331 by Daniel Schierbeck
Added basic menu bar.
256
        menubar.add(file_menuitem)
338 by Daniel Schierbeck
Added Preferences menu item.
257
        menubar.add(edit_menuitem)
348 by Daniel Schierbeck
Added toggle item for revision number column.
258
        menubar.add(view_menuitem)
331 by Daniel Schierbeck
Added basic menu bar.
259
        menubar.add(go_menuitem)
335 by Daniel Schierbeck
Added Revision menu.
260
        menubar.add(revision_menuitem)
331 by Daniel Schierbeck
Added basic menu bar.
261
        menubar.add(branch_menuitem)
423.9.1 by Daniel Schierbeck
Added Help->About menu item to the viz.
262
        menubar.add(help_menuitem)
331 by Daniel Schierbeck
Added basic menu bar.
263
        menubar.show_all()
264
265
        return menubar
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
266
267
    def construct_top(self):
268
        """Construct the top-half of the window."""
329 by Jelmer Vernooij
Make broken_line_length setting from higher up.
269
        # FIXME: Make broken_line_length configurable
330.2.5 by Daniel Schierbeck
Support persistence of compact view option.
270
452.4.1 by Jelmer Vernooij
Support displaying multiple tips in viz.
271
        self.treeview = TreeView(self.branch, self.start_revs, self.maxnum, self.compact_view)
315 by Daniel Schierbeck
Removed BranchWindow.set_branch(), used constructor instead.
272
373 by Daniel Schierbeck
Made column display options persisted.
273
        self.treeview.connect('revision-selected',
303 by Daniel Schierbeck
Made basic signaling work.
274
                self._treeselection_changed_cb)
423.1.17 by Gary van der Merwe
Reuse the viz treeview in the revision browser.
275
        self.treeview.connect('revision-activated',
276
                self._tree_revision_activated)
303 by Daniel Schierbeck
Made basic signaling work.
277
423.7.5 by Daniel Schierbeck
Made the revision history window update the Go->Tags menu when a tag is added.
278
        self.treeview.connect('tag-added', lambda w, t, r: self._update_tags())
279
373 by Daniel Schierbeck
Made column display options persisted.
280
        for col in ["revno", "date"]:
281
            option = self.config.get_user_option(col + '-column-visible')
282
            if option is not None:
283
                self.treeview.set_property(col + '-column-visible', option == 'True')
464.1.1 by Adrian Wilkins
Fixed column visibility properties not loading
284
            else:
285
                self.treeview.set_property(col + '-column-visible', False)
373 by Daniel Schierbeck
Made column display options persisted.
286
1 by Scott James Remnant
Commit the first version of bzrk.
287
        self.treeview.show()
288
375 by Daniel Schierbeck
Fixed crash when toggling compact view.
289
        align = gtk.Alignment(0.0, 0.0, 1.0, 1.0)
290
        align.set_padding(5, 0, 0, 0)
291
        align.add(self.treeview)
292
        align.show()
293
294
        return align
44 by David Allouche
reorganise branch window
295
296
    def construct_navigation(self):
297
        """Construct the navigation buttons."""
325 by Daniel Schierbeck
Switched to using a real toolbar for the viz navigation.
298
        self.toolbar = gtk.Toolbar()
299
        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
300
388 by Daniel Schierbeck
Switched to using the Previous/Next Revision actions to create tool buttons.
301
        self.prev_button = self.prev_rev_action.create_tool_item()
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
302
        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
303
388 by Daniel Schierbeck
Switched to using the Previous/Next Revision actions to create tool buttons.
304
        self.next_button = self.next_rev_action.create_tool_item()
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
305
        self.toolbar.insert(self.next_button, -1)
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
306
401.1.2 by Daniel Schierbeck
Allowed the treeview to be refreshed.
307
        self.toolbar.insert(gtk.SeparatorToolItem(), -1)
308
309
        refresh_button = gtk.ToolButton(gtk.STOCK_REFRESH)
404 by Daniel Schierbeck
Made the refresh use proper locking.
310
        refresh_button.connect('clicked', self._refresh_clicked)
401.1.2 by Daniel Schierbeck
Allowed the treeview to be refreshed.
311
        self.toolbar.insert(refresh_button, -1)
312
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
313
        self.toolbar.show_all()
325 by Daniel Schierbeck
Switched to using a real toolbar for the viz navigation.
314
315
        return self.toolbar
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
316
317
    def construct_bottom(self):
318
        """Construct the bottom half of the window."""
330.3.1 by Daniel Schierbeck
Renamed logview 'revisionview'.
319
        from bzrlib.plugins.gtk.revisionview import RevisionView
412.1.2 by Daniel Schierbeck
Moved retrieval of tags into the revisionview itself.
320
        self.revisionview = RevisionView(branch=self.branch)
44 by David Allouche
reorganise branch window
321
        (width, height) = self.get_size()
330.3.1 by Daniel Schierbeck
Renamed logview 'revisionview'.
322
        self.revisionview.set_size_request(width, int(height / 2.5))
323
        self.revisionview.show()
324
        self.revisionview.set_show_callback(self._show_clicked_cb)
412.1.9 by Daniel Schierbeck
Removed the use of RevisionView.set_go_callback().
325
        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.
326
        self.treeview.connect('tag-added', lambda w, t, r: self.revisionview.update_tags())
330.3.1 by Daniel Schierbeck
Renamed logview 'revisionview'.
327
        return self.revisionview
332 by Daniel Schierbeck
Made tag selection work.
328
329
    def _tag_selected_cb(self, menuitem, revid):
356 by Daniel Schierbeck
Made revision a property on TreeView.
330
        self.treeview.set_revision_id(revid)
341 by Daniel Schierbeck
Merged with trunk.
331
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)
332
    def _treeselection_changed_cb(self, selection, *args):
303 by Daniel Schierbeck
Made basic signaling work.
333
        """callback for when the treeview changes."""
334
        revision = self.treeview.get_revision()
335
        parents  = self.treeview.get_parents()
336
        children = self.treeview.get_children()
337
464.2.1 by Adrian Wilkins
Detect the reserved null: revision in appropriate places.
338
        if revision and revision != NULL_REVISION:
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
339
            prev_menu = gtk.Menu()
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
340
            if len(parents) > 0:
385 by Daniel Schierbeck
Created a single action for Previous Revision.
341
                self.prev_rev_action.set_sensitive(True)
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
342
                for parent_id in parents:
464.2.1 by Adrian Wilkins
Detect the reserved null: revision in appropriate places.
343
                    if parent_id and parent_id != NULL_REVISION:
344
                        parent = self.branch.repository.get_revision(parent_id)
345
                        try:
346
                            str = ' (' + parent.properties['branch-nick'] + ')'
347
                        except KeyError:
348
                            str = ""
355 by Daniel Schierbeck
Appended branch nick to parent and child popup menus.
349
464.2.1 by Adrian Wilkins
Detect the reserved null: revision in appropriate places.
350
                        item = gtk.MenuItem(parent.message.split("\n")[0] + str)
351
                        item.connect('activate', self._set_revision_cb, parent_id)
352
                        prev_menu.add(item)
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
353
                prev_menu.show_all()
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
354
            else:
385 by Daniel Schierbeck
Created a single action for Previous Revision.
355
                self.prev_rev_action.set_sensitive(False)
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
356
                prev_menu.hide()
357
358
            self.prev_button.set_menu(prev_menu)
359
360
            next_menu = gtk.Menu()
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
361
            if len(children) > 0:
386 by Daniel Schierbeck
Created a single action for Next Revision.
362
                self.next_rev_action.set_sensitive(True)
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
363
                for child_id in children:
364
                    child = self.branch.repository.get_revision(child_id)
355 by Daniel Schierbeck
Appended branch nick to parent and child popup menus.
365
                    try:
366
                        str = ' (' + child.properties['branch-nick'] + ')'
367
                    except KeyError:
368
                        str = ""
369
370
                    item = gtk.MenuItem(child.message.split("\n")[0] + str)
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
371
                    item.connect('activate', self._set_revision_cb, child_id)
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
372
                    next_menu.add(item)
373
                next_menu.show_all()
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
374
            else:
386 by Daniel Schierbeck
Created a single action for Next Revision.
375
                self.next_rev_action.set_sensitive(False)
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
376
                next_menu.hide()
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
377
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
378
            self.next_button.set_menu(next_menu)
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
379
412.1.13 by Daniel Schierbeck
Re-added support for displaying the children of a revision.
380
            self.revisionview.set_revision(revision)
381
            self.revisionview.set_children(children)
423.1.17 by Gary van der Merwe
Reuse the viz treeview in the revision browser.
382
    
383
    def _tree_revision_activated(self, widget, path, col):
384
        # TODO: more than one parent
385
        """Callback for when a treeview row gets activated."""
386
        revision = self.treeview.get_revision()
387
        parents  = self.treeview.get_parents()
388
389
        if len(parents) == 0:
390
            parent_id = None
391
        else:
392
            parent_id = parents[0]
393
394
        self.show_diff(revision.revision_id, parent_id)
395
        self.treeview.grab_focus()
463.3.1 by Javier Derderian
Fixed menu entry 'View Changes'. Bug #215350
396
        
397
    def _menu_diff_cb(self,w):
398
        (path, focus) = self.treeview.treeview.get_cursor()
399
        revid = self.treeview.model[path][treemodel.REVID]
400
        
401
        parentids = self.branch.repository.revision_parents(revid)
402
403
        if len(parentids) == 0:
404
            parentid = NULL_REVISION
405
        else:
406
            parentid = parentids[0]
407
        
408
        self.show_diff(revid,parentid)    
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
409
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
410
    def _back_clicked_cb(self, *args):
411
        """Callback for when the back button is clicked."""
304 by Daniel Schierbeck
Made forward/back buttons work again.
412
        self.treeview.back()
413
        
5 by Scott James Remnant
Reverse the meaning of the Back and Forward buttons so Back actually
414
    def _fwd_clicked_cb(self, *args):
415
        """Callback for when the forward button is clicked."""
304 by Daniel Schierbeck
Made forward/back buttons work again.
416
        self.treeview.forward()
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
417
412.1.9 by Daniel Schierbeck
Removed the use of RevisionView.set_go_callback().
418
    def _go_clicked_cb(self, w, p):
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
419
        """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().
420
        if self.revisionview.get_revision() is not None:
421
            self.treeview.set_revision(self.revisionview.get_revision())
152 by Jelmer Vernooij
Cleanup some more code.
422
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
423
    def _show_clicked_cb(self, revid, parentid):
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
424
        """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.
425
        self.show_diff(revid, parentid)
13 by Scott James Remnant
Keep the focus on the treeview
426
        self.treeview.grab_focus()
46 by Wouter van Heyst
show diff on row activation, LP# 44591
427
461.1.3 by Javier Derderian
Added "compare with" option to revisions menu.
428
    def _compare_with_cb(self,w):
429
        """Callback for revision 'compare with' menu. Will show a small
430
            dialog with branch revisions to compare with selected revision in TreeView"""
431
        
463.2.2 by Javier Derderian
Updated "Compare with..." (#78765) to use revbrowser.RevisionBrowser.
432
        from bzrlib.plugins.gtk.revbrowser import RevisionBrowser
433
        
434
        rb = RevisionBrowser(self.branch,self)
435
        ret = rb.run()
436
        
437
        if ret == gtk.RESPONSE_OK:          
461.1.3 by Javier Derderian
Added "compare with" option to revisions menu.
438
            (path, focus) = self.treeview.treeview.get_cursor()
439
            revid = self.treeview.model[path][treemodel.REVID]
463.2.2 by Javier Derderian
Updated "Compare with..." (#78765) to use revbrowser.RevisionBrowser.
440
            self.show_diff(revid, rb.selected_revid)
441
            
442
        rb.destroy()
461.1.3 by Javier Derderian
Added "compare with" option to revisions menu.
443
            
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
444
    def _set_revision_cb(self, w, revision_id):
356 by Daniel Schierbeck
Made revision a property on TreeView.
445
        self.treeview.set_revision_id(revision_id)
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
446
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
447
    def _brokenlines_toggled_cb(self, button):
330.2.5 by Daniel Schierbeck
Support persistence of compact view option.
448
        self.compact_view = button.get_active()
449
450
        if self.compact_view:
451
            option = 'yes'
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
452
        else:
330.2.5 by Daniel Schierbeck
Support persistence of compact view option.
453
            option = 'no'
454
455
        self.config.set_user_option('viz-compact-view', option)
401.1.3 by Daniel Schierbeck
Made the compact view toggling cleaner.
456
        self.treeview.set_property('compact', self.compact_view)
457
        self.treeview.refresh()
368 by Daniel Schierbeck
Merged with mainline.
458
365 by Daniel Schierbeck
Fixed locks and made tagging work.
459
    def _tag_revision_cb(self, w):
392.1.1 by Daniel Schierbeck
Made it possible to tag revisions again.
460
        try:
461
            self.treeview.set_sensitive(False)
462
            dialog = AddTagDialog(self.branch.repository, self.treeview.get_revision().revision_id, self.branch)
463
            response = dialog.run()
464
            if response != gtk.RESPONSE_NONE:
465
                dialog.hide()
365 by Daniel Schierbeck
Fixed locks and made tagging work.
466
            
392.1.1 by Daniel Schierbeck
Made it possible to tag revisions again.
467
                if response == gtk.RESPONSE_OK:
423.7.7 by Daniel Schierbeck
Simplified Go->Tag Revision menu item in the viz.
468
                    self.treeview.add_tag(dialog.tagname, dialog._revid)
392.1.1 by Daniel Schierbeck
Made it possible to tag revisions again.
469
                
470
                dialog.destroy()
471
472
        finally:
473
            self.treeview.set_sensitive(True)
365 by Daniel Schierbeck
Fixed locks and made tagging work.
474
511.6.1 by Jelmer Vernooij
Add Branch/Index option if bzr-search is available.
475
    def _branch_index_cb(self, w):
476
        from bzrlib.plugins.search import index as _mod_index
477
        _mod_index.index_url(self.branch.base)
478
524 by Jelmer Vernooij
Add search dialog.
479
    def _branch_search_cb(self, w):
480
        from bzrlib.plugins.gtk.search import SearchDialog
526 by Jelmer Vernooij
Switch to found revision when clicking ok in search window.
481
        dialog = SearchDialog(self.branch)
482
        
483
        if dialog.run() == gtk.RESPONSE_OK:
484
            self.set_revision(dialog.get_revision())
485
486
        dialog.destroy()
524 by Jelmer Vernooij
Add search dialog.
487
423.9.1 by Daniel Schierbeck
Added Help->About menu item to the viz.
488
    def _about_dialog_cb(self, w):
489
        from bzrlib.plugins.gtk.about import AboutDialog
490
491
        AboutDialog().run()
492
348 by Daniel Schierbeck
Added toggle item for revision number column.
493
    def _col_visibility_changed(self, col, property):
373 by Daniel Schierbeck
Made column display options persisted.
494
        self.config.set_user_option(property + '-column-visible', col.get_active())
348 by Daniel Schierbeck
Added toggle item for revision number column.
495
        self.treeview.set_property(property + '-column-visible', col.get_active())
351 by Daniel Schierbeck
Added option to hide the toolbar.
496
497
    def _toolbar_visibility_changed(self, col):
498
        if col.get_active():
499
            self.toolbar.show() 
500
        else:
501
            self.toolbar.hide()
371.1.1 by Daniel Schierbeck
Added About dialog to the viz.
502
503
    def _show_about_cb(self, w):
504
        dialog = AboutDialog()
505
        dialog.connect('response', lambda d,r: d.destroy())
506
        dialog.run()
404 by Daniel Schierbeck
Made the refresh use proper locking.
507
508
    def _refresh_clicked(self, w):
423.1.13 by Gary van der Merwe
Move viz loading msg from branchwin to treeview.
509
        self.treeview.refresh()
423.7.5 by Daniel Schierbeck
Made the revision history window update the Go->Tags menu when a tag is added.
510
511
    def _update_tags(self):
512
        menu = gtk.Menu()
513
514
        if self.branch.supports_tags():
515
            tags = self.branch.tags.get_tag_dict().items()
516
            tags.sort()
517
            tags.reverse()
518
            for tag, revid in tags:
450.4.1 by Daniel Schierbeck
Added tag icon to branch history window.
519
                tag_image = gtk.Image()
520
                tag_image.set_from_file(icon_path('tag-16.png'))
521
                tag_item = gtk.ImageMenuItem(tag.replace('_', '__'))
522
                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.
523
                tag_item.connect('activate', self._tag_selected_cb, revid)
524
                menu.add(tag_item)
525
            self.go_menu_tags.set_submenu(menu)
526
527
            self.go_menu_tags.set_sensitive(len(tags) != 0)
528
        else:
529
            self.go_menu_tags.set_sensitive(False)
530
531
        self.go_menu_tags.show_all()
532
423.1.17 by Gary van der Merwe
Reuse the viz treeview in the revision browser.
533
    def show_diff(self, revid=None, parentid=None):
534
        """Open a new window to show a diff between the given revisions."""
535
        from bzrlib.plugins.gtk.diff import DiffWindow
536
        window = DiffWindow(parent=self)
537
538
        if parentid is None:
539
            parentid = NULL_REVISION
540
541
        rev_tree    = self.branch.repository.revision_tree(revid)
542
        parent_tree = self.branch.repository.revision_tree(parentid)
543
544
        description = revid + " - " + self.branch.nick
545
        window.set_diff(description, rev_tree, parent_tree)
546
        window.show()
547
423.7.5 by Daniel Schierbeck
Made the revision history window update the Go->Tags menu when a tag is added.
548