24
22
pygtk.require("2.0")
30
31
import bzrlib.errors as errors
31
from bzrlib.workingtree import WorkingTree
32
from dialog import error_dialog
33
from bzrlib.plugins.gtk.dialog import error_dialog, info_dialog, question_dialog, warning_dialog
34
from bzrlib.plugins.gtk.errors import show_bzr_error
35
from bzrlib.plugins.gtk.annotate.gannotate import GAnnotateWindow
36
from bzrlib.plugins.gtk.annotate.config import GAnnotateConfig
37
from bzrlib.plugins.gtk.diff import DiffWindow
38
34
from launch import launch
39
from olive import Preferences
42
37
""" This class is responsible for building the context menus. """
43
def __init__(self, path, selected, app=None):
38
def __init__(self, gladefile, comm):
45
from guifiles import UIFILENAME
47
self.uifile = UIFILENAME
50
self.pref = Preferences()
54
self.selected = selected
40
if sys.platform == 'win32':
41
self.uifile = os.path.dirname(sys.executable) + "/share/olive/cmenu.ui"
43
self.uifile = "/usr/share/olive/cmenu.ui"
45
if not os.path.exists(self.uifile):
46
# Load from current directory if not installed
47
self.uifile = "cmenu.ui"
49
if not os.path.exists(self.uifile):
51
print _('UI description file cannot be found.')
54
self.gladefile = gladefile
57
57
# Create the file list context menu
58
58
self.ui = gtk.UIManager()
138
110
self.cmenu_right = self.ui.get_widget('/context_right')
139
111
self.cmenu_left = self.ui.get_widget('/context_left')
140
112
self.toolbar_diff = self.ui.get_widget('/toolbar_diff')
141
self.cmenu_remote = self.ui.get_widget('/context_remote')
144
# TODO: do it without using deprecated comm
145
#commit_menu = self.ui.get_widget('/context_right/commit')
146
#commit_image = self.comm.menuitem_branch_commit.get_image()
147
#commit_pixbuf = commit_image.get_pixbuf()
148
#commit_icon = gtk.Image()
149
#commit_icon.set_from_pixbuf(commit_pixbuf)
150
#commit_menu.set_image(commit_icon)
151
#diff_menu = self.ui.get_widget('/context_right/diff')
152
#diff_image = self.comm.menuitem_stats_diff.get_image()
153
#diff_pixbuf = diff_image.get_pixbuf()
154
#diff_icon = gtk.Image()
155
#diff_icon.set_from_pixbuf(diff_pixbuf)
156
#diff_menu.set_image(diff_icon)
115
commit_menu = self.ui.get_widget('/context_right/commit')
116
commit_image = self.comm.menuitem_branch_commit.get_image()
117
commit_pixbuf = commit_image.get_pixbuf()
118
commit_icon = gtk.Image()
119
commit_icon.set_from_pixbuf(commit_pixbuf)
120
commit_menu.set_image(commit_icon)
121
diff_menu = self.ui.get_widget('/context_right/diff')
122
diff_image = self.comm.menuitem_stats_diff.get_image()
123
diff_pixbuf = diff_image.get_pixbuf()
124
diff_icon = gtk.Image()
125
diff_icon.set_from_pixbuf(diff_pixbuf)
126
diff_menu.set_image(diff_icon)
158
128
def right_context_menu(self):
159
129
return self.cmenu_right
161
131
def left_context_menu(self):
162
132
return self.cmenu_left
164
def remote_context_menu(self):
165
return self.cmenu_remote
168
134
def add_file(self, action):
169
135
""" Right context menu -> Add """
172
136
# Add only the selected file
173
directory = self.path
174
filename = self.selected
137
directory = self.comm.get_path()
138
filename = self.comm.get_selected_right()
176
140
if filename is None:
177
141
error_dialog(_('No file was selected'),
178
_('Please select a file from the list,\nor choose the other option.'))
181
bzrlib.add.smart_add([os.path.join(directory, filename)])
184
def annotate(self, action):
185
""" Right context menu -> Annotate """
186
directory = self.path
187
filename = self.selected
190
error_dialog(_('No file was selected'),
191
_('Please select a file from the list.'))
194
wt, path = WorkingTree.open_containing(os.path.join(directory, filename))
197
file_id = wt.path2id(wt.relpath(os.path.join(directory, filename)))
199
window = GAnnotateWindow(all=False, plain=False)
200
window.set_title(os.path.join(directory, filename) + " - Annotate")
201
config = GAnnotateConfig(window)
142
_('Please select a file from the list,\nor choose the other option.'))
205
window.annotate(wt, branch, file_id)
146
bzrlib.add.smart_add([directory + '/' + filename])
147
except errors.NotBranchError:
148
error_dialog(_('Directory is not a branch'),
149
_('You can perform this action only in a branch.'))
152
self.comm.refresh_right()
210
def remove_file(self, action,delete_on_disk=0):
154
def remove_file(self, action):
211
155
""" Right context menu -> Remove """
212
156
# Remove only the selected file
213
directory = self.path
214
filename = self.selected
157
directory = self.comm.get_path()
158
filename = self.comm.get_selected_right()
216
160
if filename is None:
217
161
error_dialog(_('No file was selected'),
218
_('Please select a file from the list,\nor choose the other option.'))
221
wt, path = WorkingTree.open_containing(os.path.join(directory, filename))
225
abs_filename = os.path.join(directory,filename)
226
if os.path.isdir(abs_filename):
227
response = question_dialog(_('Delete directory with all directories below ?'), abs_filename )
228
if response == gtk.RESPONSE_YES:
229
shutil.rmtree(abs_filename)
231
os.remove(abs_filename)
233
self.app.set_path(self.path)
234
self.app.refresh_right()
236
def remove_and_delete_file(self, action):
237
""" Right context menu -> Remove and delete"""
238
self.remove_file(action,delete_on_disk=1)
240
def rename_file(self, action):
241
""" Right context menu -> Rename """
242
from rename import OliveRename
243
wt = WorkingTree.open_containing(self.path + os.sep + self.selected)[0]
244
rename = OliveRename(wt, wt.relpath(self.path), self.selected)
162
_('Please select a file from the list,\nor choose the other option.'))
166
wt, path = WorkingTree.open_containing(directory+'/'+filename)
169
except errors.NotBranchError:
170
error_dialog(_('Directory is not a branch'),
171
_('You can perform this action only in a branch.'))
173
except errors.NotVersionedError:
174
error_dialog(_('File not versioned'),
175
_('The selected file is not versioned.'))
180
self.comm.refresh_right()
247
182
def open_file(self, action):
248
183
""" Right context menu -> Open """
249
184
# Open only the selected file
250
filename = self.selected
185
filename = self.comm.get_selected_right()
252
187
if filename is None:
253
188
error_dialog(_('No file was selected'),
254
_('Please select a file from the list,\nor choose the other option.'))
189
_('Please select a file from the list,\nor choose the other option.'))
257
192
if filename == '..':
258
# TODO: how to enter a directory?
193
self.comm.set_path(os.path.split(self.comm.get_path())[0])
261
fullpath = self.path + os.sep + filename
195
fullpath = self.comm.get_path() + os.sep + filename
262
196
if os.path.isdir(fullpath):
263
197
# selected item is an existant directory
264
# TODO: how to enter a directory?
198
self.comm.set_path(fullpath)
202
self.comm.refresh_right()
269
def revert(self, action):
270
""" Right context menu -> Revert """
271
wt, path = WorkingTree.open_containing(self.path)
272
ret = wt.revert([os.path.join(path, self.selected)])
274
warning_dialog(_('Conflicts detected'),
275
_('Please have a look at the working tree before continuing.'))
277
info_dialog(_('Revert successful'),
278
_('All files reverted to last revision.'))
279
self.app.refresh_right()
281
204
def commit(self, action):
282
205
""" Right context menu -> Commit """
283
from commit import CommitDialog
286
wt, path = WorkingTree.open_containing(self.path)
288
except NotBranchError, e:
291
commit = CommitDialog(wt, path, not branch, self.selected)
292
response = commit.run()
293
if response != gtk.RESPONSE_NONE:
296
if response == gtk.RESPONSE_OK:
297
self.app.refresh_right()
206
from commit import OliveCommit
207
wt, path = WorkingTree.open_containing(self.comm.get_path())
208
commit = OliveCommit(self.gladefile, wt, path)
302
211
def diff(self, action):
303
212
""" Right context menu -> Diff """
304
wt = WorkingTree.open_containing(self.path)[0]
305
window = DiffWindow()
306
parent_tree = wt.branch.repository.revision_tree(wt.branch.last_revision())
307
window.set_diff(wt.branch.nick, wt, parent_tree)
308
window.set_file(wt.relpath(self.path + os.sep + self.selected))
213
from diff import OliveDiff
214
diff = OliveDiff(self.gladefile, self.comm)
311
217
def bookmark(self, action):
312
218
""" Right context menu -> Bookmark """
313
if self.pref.add_bookmark(self.path):
219
if self.comm.pref.add_bookmark(self.comm.get_path()):
314
220
info_dialog(_('Bookmark successfully added'),
315
_('The current directory was bookmarked. You can reach\nit by selecting it from the left panel.'))
221
_('The current directory was bookmarked. You can reach\nit by selecting it from the left panel.'))
318
223
warning_dialog(_('Location already bookmarked'),
319
_('The current directory is already bookmarked.\nSee the left panel for reference.'))
224
_('The current directory is already bookmarked.\nSee the left panel for reference.'))
321
self.app.refresh_left()
226
self.comm.refresh_left()
323
228
def edit_bookmark(self, action):
324
229
""" Left context menu -> Edit """
325
from bookmark import BookmarkDialog
327
if self.selected != None:
328
bookmark = BookmarkDialog(self.selected, self.app.window)
329
response = bookmark.run()
331
if response != gtk.RESPONSE_NONE:
334
if response == gtk.RESPONSE_OK:
335
self.app.refresh_left()
230
from bookmark import OliveBookmark
232
if self.comm.get_selected_left() != None:
233
bookmark = OliveBookmark(self.gladefile, self.comm)
339
236
def remove_bookmark(self, action):
340
237
""" Left context menu -> Remove """
342
if self.selected != None:
343
self.pref.remove_bookmark(self.selected)
346
self.app.refresh_left()
239
if self.comm.get_selected_left() != None:
240
self.comm.pref.remove_bookmark(self.comm.get_selected_left())
241
self.comm.refresh_left()
348
243
def open_folder(self, action):
349
244
""" Left context menu -> Open Folder """
245
path = self.comm.get_selected_left()