1
# Copyright (C) 2006 by Szilveszter Farkas (Phanatic) <szilveszter.farkas@gmail.com>
 
 
3
# This program is free software; you can redistribute it and/or modify
 
 
4
# it under the terms of the GNU General Public License as published by
 
 
5
# the Free Software Foundation; either version 2 of the License, or
 
 
6
# (at your option) any later version.
 
 
8
# This program is distributed in the hope that it will be useful,
 
 
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
 
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
 
11
# GNU General Public License for more details.
 
 
13
# You should have received a copy of the GNU General Public License
 
 
14
# along with this program; if not, write to the Free Software
 
 
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
 
28
import bzrlib.errors as errors
 
 
29
from bzrlib.workingtree import WorkingTree
 
 
31
from bzrlib.plugins.gtk.dialog import error_dialog, info_dialog, warning_dialog
 
 
32
from bzrlib.plugins.gtk.errors import show_bzr_error
 
 
33
from bzrlib.plugins.gtk.annotate.gannotate import GAnnotateWindow
 
 
34
from bzrlib.plugins.gtk.annotate.config import GAnnotateConfig
 
 
35
from bzrlib.plugins.gtk.diff import DiffWindow
 
 
36
from launch import launch
 
 
37
from olive import Preferences
 
 
40
    """ This class is responsible for building the context menus. """
 
 
41
    def __init__(self, path, selected, app=None):
 
 
43
        from guifiles import UIFILENAME
 
 
45
        self.uifile = UIFILENAME
 
 
48
        self.pref = Preferences()
 
 
52
        self.selected = selected
 
 
55
        # Create the file list context menu
 
 
56
        self.ui = gtk.UIManager()
 
 
58
        self.actiongroup = gtk.ActionGroup('context')
 
 
59
        self.actiongroup.add_actions([('add', gtk.STOCK_ADD,
 
 
61
                                       _('Add the selected file'),
 
 
63
                                      ('remove', gtk.STOCK_REMOVE,
 
 
65
                                       _('Remove the selected file'),
 
 
69
                                       _('Rename the selected file'),
 
 
71
                                      ('open', gtk.STOCK_OPEN,
 
 
73
                                       _('Open the selected file'),
 
 
77
                                       _('Revert the changes'),
 
 
81
                                       _('Commit the changes'),
 
 
85
                                       _('Annotate the selected file'),
 
 
89
                                       _('Show the diff of the file'),
 
 
93
                                       _('Bookmark current location'),
 
 
95
                                      ('edit_bookmark', gtk.STOCK_EDIT,
 
 
97
                                       _('Edit the selected bookmark'),
 
 
99
                                      ('remove_bookmark', gtk.STOCK_REMOVE,
 
 
101
                                       _('Remove the selected bookmark'),
 
 
102
                                       self.remove_bookmark),
 
 
103
                                      ('open_folder', gtk.STOCK_OPEN,
 
 
104
                                       _('Open Folder'), None,
 
 
105
                                       _('Open bookmark folder in Nautilus'),
 
 
107
                                      ('diff_selected', None,
 
 
108
                                       _('Selected...'), None,
 
 
109
                                       _('Show the differences of the selected file'),
 
 
113
                                       _('Show the differences of all files'),
 
 
115
                                      ('view_remote', None,
 
 
116
                                       _('View contents'), None,
 
 
117
                                       _('View the contents of the file in a builtin viewer'),
 
 
119
                                      ('diff_remote', None,
 
 
120
                                       _('Show differences'), None,
 
 
121
                                       _('Show the differences between two revisions of the file'),
 
 
123
                                      ('revert_remote', None,
 
 
124
                                       _('Revert to this revision'), None,
 
 
125
                                       _('Revert the selected file to the selected revision'),
 
 
129
        self.ui.insert_action_group(self.actiongroup, 0)
 
 
130
        self.ui.add_ui_from_file(self.uifile)
 
 
132
        self.cmenu_right = self.ui.get_widget('/context_right')
 
 
133
        self.cmenu_left = self.ui.get_widget('/context_left')
 
 
134
        self.toolbar_diff = self.ui.get_widget('/toolbar_diff')
 
 
135
        self.cmenu_remote = self.ui.get_widget('/context_remote')
 
 
138
        # TODO: do it without using deprecated comm
 
 
139
        #commit_menu = self.ui.get_widget('/context_right/commit')
 
 
140
        #commit_image = self.comm.menuitem_branch_commit.get_image()
 
 
141
        #commit_pixbuf = commit_image.get_pixbuf()
 
 
142
        #commit_icon = gtk.Image()
 
 
143
        #commit_icon.set_from_pixbuf(commit_pixbuf)
 
 
144
        #commit_menu.set_image(commit_icon)
 
 
145
        #diff_menu = self.ui.get_widget('/context_right/diff')
 
 
146
        #diff_image = self.comm.menuitem_stats_diff.get_image()
 
 
147
        #diff_pixbuf = diff_image.get_pixbuf()
 
 
148
        #diff_icon = gtk.Image()
 
 
149
        #diff_icon.set_from_pixbuf(diff_pixbuf)
 
 
150
        #diff_menu.set_image(diff_icon)
 
 
152
    def right_context_menu(self):
 
 
153
        return self.cmenu_right
 
 
155
    def left_context_menu(self):
 
 
156
        return self.cmenu_left
 
 
158
    def remote_context_menu(self):
 
 
159
        return self.cmenu_remote
 
 
162
    def add_file(self, action):
 
 
163
        """ Right context menu -> Add """
 
 
166
        # Add only the selected file
 
 
167
        directory = self.path
 
 
168
        filename = self.selected
 
 
171
            error_dialog(_('No file was selected'),
 
 
172
                         _('Please select a file from the list,\nor choose the other option.'))
 
 
175
        bzrlib.add.smart_add([os.path.join(directory, filename)])
 
 
178
    def annotate(self, action):
 
 
179
        """ Right context menu -> Annotate """
 
 
180
        directory = self.path
 
 
181
        filename = self.selected
 
 
184
            error_dialog(_('No file was selected'),
 
 
185
                         _('Please select a file from the list.'))
 
 
188
        wt, path = WorkingTree.open_containing(os.path.join(directory, filename))
 
 
191
        file_id = wt.path2id(wt.relpath(os.path.join(directory, filename)))
 
 
193
        window = GAnnotateWindow(all=False, plain=False)
 
 
194
        window.set_title(os.path.join(directory, filename) + " - Annotate")
 
 
195
        config = GAnnotateConfig(window)
 
 
199
            window.annotate(wt, branch, file_id)
 
 
204
    def remove_file(self, action):
 
 
205
        """ Right context menu -> Remove """
 
 
206
        # Remove only the selected file
 
 
207
        directory = self.path
 
 
208
        filename = self.selected
 
 
211
            error_dialog(_('No file was selected'),
 
 
212
                         _('Please select a file from the list,\nor choose the other option.'))
 
 
215
        wt, path = WorkingTree.open_containing(os.path.join(directory, filename))
 
 
217
        self.app.set_path(self.path)
 
 
218
        self.app.refresh_right()
 
 
220
    def rename_file(self, action):
 
 
221
        """ Right context menu -> Rename """
 
 
222
        from rename import OliveRename
 
 
223
        wt = WorkingTree.open_containing(self.path + os.sep + self.selected)[0]
 
 
224
        rename = OliveRename(wt, wt.relpath(self.path), self.selected)
 
 
227
    def open_file(self, action):
 
 
228
        """ Right context menu -> Open """
 
 
229
        # Open only the selected file
 
 
230
        filename = self.selected
 
 
233
            error_dialog(_('No file was selected'),
 
 
234
                         _('Please select a file from the list,\nor choose the other option.'))
 
 
238
            # TODO: how to enter a directory?
 
 
241
            fullpath = self.path + os.sep + filename
 
 
242
            if os.path.isdir(fullpath):
 
 
243
                # selected item is an existant directory
 
 
244
                # TODO: how to enter a directory?
 
 
249
    def revert(self, action):
 
 
250
        """ Right context menu -> Revert """
 
 
251
        wt, path = WorkingTree.open_containing(self.path)
 
 
252
        ret = wt.revert([os.path.join(path, self.selected)])
 
 
254
            warning_dialog(_('Conflicts detected'),
 
 
255
                           _('Please have a look at the working tree before continuing.'))
 
 
257
            info_dialog(_('Revert successful'),
 
 
258
                        _('All files reverted to last revision.'))
 
 
259
        self.app.refresh_right()       
 
 
261
    def commit(self, action):
 
 
262
        """ Right context menu -> Commit """
 
 
263
        from commit import CommitDialog
 
 
266
            wt, path = WorkingTree.open_containing(self.path)
 
 
268
        except NotBranchError, e:
 
 
271
        commit = CommitDialog(wt, path, not branch, self.selected)
 
 
272
        response = commit.run()
 
 
273
        if response != gtk.RESPONSE_NONE:
 
 
276
            if response == gtk.RESPONSE_OK:
 
 
277
                self.app.refresh_right()
 
 
282
    def diff(self, action):
 
 
283
        """ Right context menu -> Diff """
 
 
284
        wt = WorkingTree.open_containing(self.path)[0]
 
 
285
        window = DiffWindow()
 
 
286
        parent_tree = wt.branch.repository.revision_tree(wt.branch.last_revision())
 
 
287
        window.set_diff(wt.branch.nick, wt, parent_tree)
 
 
288
        window.set_file(wt.relpath(self.path + os.sep + self.selected))
 
 
291
    def bookmark(self, action):
 
 
292
        """ Right context menu -> Bookmark """
 
 
293
        if self.pref.add_bookmark(self.path):
 
 
294
            info_dialog(_('Bookmark successfully added'),
 
 
295
                        _('The current directory was bookmarked. You can reach\nit by selecting it from the left panel.'))
 
 
298
            warning_dialog(_('Location already bookmarked'),
 
 
299
                           _('The current directory is already bookmarked.\nSee the left panel for reference.'))
 
 
301
        self.app.refresh_left()
 
 
303
    def edit_bookmark(self, action):
 
 
304
        """ Left context menu -> Edit """
 
 
305
        from bookmark import BookmarkDialog
 
 
307
        if self.selected != None:
 
 
308
            bookmark = BookmarkDialog(self.selected, self.app.window)
 
 
309
            response = bookmark.run()
 
 
311
            if response != gtk.RESPONSE_NONE:
 
 
314
                if response == gtk.RESPONSE_OK:
 
 
315
                    self.app.refresh_left()
 
 
319
    def remove_bookmark(self, action):
 
 
320
        """ Left context menu -> Remove """
 
 
322
        if self.selected != None:
 
 
323
            self.pref.remove_bookmark(self.selected)
 
 
326
        self.app.refresh_left()
 
 
328
    def open_folder(self, action):
 
 
329
        """ Left context menu -> Open Folder """
 
 
335
    def diff_selected(self, action):
 
 
336
        """ Diff toolbutton -> Selected... """
 
 
337
        print "DEBUG: not implemented."
 
 
339
    def diff_all(self, action):
 
 
340
        """ Diff toolbutton -> All... """
 
 
341
        from diff import OliveDiff
 
 
342
        diff = OliveDiff(self.comm)
 
 
345
    def view_remote(self, action):
 
 
346
        """ Remote context menu -> View contents """
 
 
347
        print "DEBUG: view contents."
 
 
349
    def diff_remote(self, action):
 
 
350
        """ Remote context menu -> Show differences """
 
 
351
        print "DEBUG: show differences."
 
 
353
    def revert_remote(self, action):
 
 
354
        """ Remote context menu -> Revert to this revision """
 
 
355
        print "DEBUG: revert to this revision."