82
81
# Destroy the dialog
86
86
""" The main Olive GTK frontend class. This is called when launching the
89
89
def __init__(self):
90
self.toplevel = gtk.glade.XML(GLADEFILENAME, 'window_main', 'olive-gtk')
91
self.window = self.toplevel.get_widget('window_main')
90
self.window = OliveGui(calling_app = self)
92
92
self.pref = Preferences()
95
95
# Initialize the statusbar
96
self.statusbar = self.toplevel.get_widget('statusbar')
97
self.context_id = self.statusbar.get_context_id('olive')
96
self.context_id = self.window.statusbar.get_context_id('olive')
100
self.window_main = self.toplevel.get_widget('window_main')
102
self.hpaned_main = self.toplevel.get_widget('hpaned_main')
104
self.treeview_left = self.toplevel.get_widget('treeview_left')
105
self.treeview_right = self.toplevel.get_widget('treeview_right')
106
# Get some important menu items
107
self.menuitem_add_files = self.toplevel.get_widget('menuitem_add_files')
108
self.menuitem_remove_files = self.toplevel.get_widget('menuitem_remove_file')
109
self.menuitem_file_bookmark = self.toplevel.get_widget('menuitem_file_bookmark')
110
self.menuitem_file_make_directory = self.toplevel.get_widget('menuitem_file_make_directory')
111
self.menuitem_file_rename = self.toplevel.get_widget('menuitem_file_rename')
112
self.menuitem_file_move = self.toplevel.get_widget('menuitem_file_move')
113
self.menuitem_file_annotate = self.toplevel.get_widget('menuitem_file_annotate')
114
self.menuitem_view_show_hidden_files = self.toplevel.get_widget('menuitem_view_show_hidden_files')
115
self.menuitem_view_show_ignored_files = self.toplevel.get_widget('menuitem_view_show_ignored_files')
116
self.menuitem_branch = self.toplevel.get_widget('menuitem_branch')
117
self.menuitem_branch_init = self.toplevel.get_widget('menuitem_branch_initialize')
118
self.menuitem_branch_get = self.toplevel.get_widget('menuitem_branch_get')
119
self.menuitem_branch_checkout = self.toplevel.get_widget('menuitem_branch_checkout')
120
self.menuitem_branch_pull = self.toplevel.get_widget('menuitem_branch_pull')
121
self.menuitem_branch_push = self.toplevel.get_widget('menuitem_branch_push')
122
self.menuitem_branch_update = self.toplevel.get_widget('menuitem_branch_update')
123
self.menuitem_branch_revert = self.toplevel.get_widget('menuitem_branch_revert')
124
self.menuitem_branch_merge = self.toplevel.get_widget('menuitem_branch_merge')
125
self.menuitem_branch_commit = self.toplevel.get_widget('menuitem_branch_commit')
126
self.menuitem_branch_tags = self.toplevel.get_widget('menuitem_branch_tags')
127
self.menuitem_branch_status = self.toplevel.get_widget('menuitem_branch_status')
128
self.menuitem_branch_missing = self.toplevel.get_widget('menuitem_branch_missing_revisions')
129
self.menuitem_branch_conflicts = self.toplevel.get_widget('menuitem_branch_conflicts')
130
self.menuitem_stats = self.toplevel.get_widget('menuitem_stats')
131
self.menuitem_stats_diff = self.toplevel.get_widget('menuitem_stats_diff')
132
self.menuitem_stats_log = self.toplevel.get_widget('menuitem_stats_log')
133
# Get some toolbuttons
134
#self.menutoolbutton_diff = self.toplevel.get_widget('menutoolbutton_diff')
135
self.toolbutton_diff = self.toplevel.get_widget('toolbutton_diff')
136
self.toolbutton_log = self.toplevel.get_widget('toolbutton_log')
137
self.toolbutton_commit = self.toplevel.get_widget('toolbutton_commit')
138
self.toolbutton_pull = self.toplevel.get_widget('toolbutton_pull')
139
self.toolbutton_push = self.toplevel.get_widget('toolbutton_push')
140
self.toolbutton_update = self.toplevel.get_widget('toolbutton_update')
141
98
# Get the drive selector
142
99
self.combobox_drive = gtk.combo_box_new_text()
143
100
self.combobox_drive.connect("changed", self._refresh_drives)
145
102
# Get the navigation widgets
146
self.hbox_location = self.toplevel.get_widget('hbox_location')
147
self.button_location_up = self.toplevel.get_widget('button_location_up')
148
self.button_location_jump = self.toplevel.get_widget('button_location_jump')
149
self.entry_location = self.toplevel.get_widget('entry_location')
150
self.image_location_error = self.toplevel.get_widget('image_location_error')
103
self.hbox_location = self.window.locationbar
104
self.button_location_up = self.window.button_location_up
105
self.button_location_jump = self.window.button_location_jump
106
self.entry_location = self.window.entry_location
152
108
# Get the History widgets
153
self.check_history = self.toplevel.get_widget('checkbutton_history')
154
self.entry_history = self.toplevel.get_widget('entry_history_revno')
155
self.button_history = self.toplevel.get_widget('button_history_browse')
157
self.vbox_main_right = self.toplevel.get_widget('vbox_main_right')
159
# Dictionary for signal_autoconnect
160
dic = { "on_window_main_destroy": gtk.main_quit,
161
"on_window_main_delete_event": self.on_window_main_delete_event,
162
"on_quit_activate": self.on_window_main_delete_event,
163
"on_about_activate": self.on_about_activate,
164
"on_menuitem_add_files_activate": self.on_menuitem_add_files_activate,
165
"on_menuitem_remove_file_activate": self.on_menuitem_remove_file_activate,
166
"on_menuitem_file_bookmark_activate": self.on_menuitem_file_bookmark_activate,
167
"on_menuitem_file_make_directory_activate": self.on_menuitem_file_make_directory_activate,
168
"on_menuitem_file_move_activate": self.on_menuitem_file_move_activate,
169
"on_menuitem_file_rename_activate": self.on_menuitem_file_rename_activate,
170
"on_menuitem_file_annotate_activate": self.on_menuitem_file_annotate_activate,
171
"on_menuitem_view_show_hidden_files_activate": self.on_menuitem_view_show_hidden_files_activate,
172
"on_menuitem_view_show_ignored_files_activate": self.on_menuitem_view_show_ignored_files_activate,
173
"on_menuitem_view_refresh_activate": self.on_menuitem_view_refresh_activate,
174
"on_menuitem_branch_initialize_activate": self.on_menuitem_branch_initialize_activate,
175
"on_menuitem_branch_get_activate": self.on_menuitem_branch_get_activate,
176
"on_menuitem_branch_checkout_activate": self.on_menuitem_branch_checkout_activate,
177
"on_menuitem_branch_revert_activate": self.on_menuitem_branch_revert_activate,
178
"on_menuitem_branch_merge_activate": self.on_menuitem_branch_merge_activate,
179
"on_menuitem_branch_commit_activate": self.on_menuitem_branch_commit_activate,
180
"on_menuitem_branch_push_activate": self.on_menuitem_branch_push_activate,
181
"on_menuitem_branch_pull_activate": self.on_menuitem_branch_pull_activate,
182
"on_menuitem_branch_update_activate": self.on_menuitem_branch_update_activate,
183
"on_menuitem_branch_tags_activate": self.on_menuitem_branch_tags_activate,
184
"on_menuitem_branch_status_activate": self.on_menuitem_branch_status_activate,
185
"on_menuitem_branch_missing_revisions_activate": self.on_menuitem_branch_missing_revisions_activate,
186
"on_menuitem_branch_conflicts_activate": self.on_menuitem_branch_conflicts_activate,
187
"on_menuitem_stats_diff_activate": self.on_menuitem_stats_diff_activate,
188
"on_menuitem_stats_log_activate": self.on_menuitem_stats_log_activate,
189
"on_menuitem_stats_infos_activate": self.on_menuitem_stats_infos_activate,
190
"on_toolbutton_refresh_clicked": self.on_menuitem_view_refresh_activate,
191
"on_toolbutton_log_clicked": self.on_menuitem_stats_log_activate,
192
#"on_menutoolbutton_diff_clicked": self.on_menuitem_stats_diff_activate,
193
"on_toolbutton_diff_clicked": self.on_menuitem_stats_diff_activate,
194
"on_toolbutton_commit_clicked": self.on_menuitem_branch_commit_activate,
195
"on_toolbutton_pull_clicked": self.on_menuitem_branch_pull_activate,
196
"on_toolbutton_push_clicked": self.on_menuitem_branch_push_activate,
197
"on_toolbutton_update_clicked": self.on_menuitem_branch_update_activate,
198
"on_treeview_right_button_press_event": self.on_treeview_right_button_press_event,
199
"on_treeview_right_row_activated": self.on_treeview_right_row_activated,
200
"on_treeview_left_button_press_event": self.on_treeview_left_button_press_event,
201
"on_treeview_left_button_release_event": self.on_treeview_left_button_release_event,
202
"on_treeview_left_row_activated": self.on_treeview_left_row_activated,
203
"on_button_location_up_clicked": self.on_button_location_up_clicked,
204
"on_button_location_jump_clicked": self.on_button_location_jump_clicked,
205
"on_entry_location_key_press_event": self.on_entry_location_key_press_event,
206
"on_checkbutton_history_toggled": self.on_checkbutton_history_toggled,
207
"on_entry_history_revno_key_press_event": self.on_entry_history_revno_key_press_event,
208
"on_button_history_browse_clicked": self.on_button_history_browse_clicked
211
# Connect the signals to the handlers
212
self.toplevel.signal_autoconnect(dic)
109
self.check_history = self.window.checkbutton_history
110
self.entry_history = self.window.entry_history_revno
111
self.button_history = self.window.button_history_browse
214
113
self._just_started = True
438
340
# History Mode activated
439
341
self.entry_history.set_sensitive(True)
440
342
self.button_history.set_sensitive(True)
343
if self.entry_history.get_text() != "":
344
self.on_entry_history_revno_activate()
442
346
# History Mode deactivated
443
347
self.entry_history.set_sensitive(False)
444
348
self.button_history.set_sensitive(False)
350
# Return right window to normal view by acting like we jump to it
351
self.on_button_location_jump_clicked(widget)
447
def on_entry_history_revno_key_press_event(self, widget, event):
354
def on_entry_history_revno_activate(self, widget=None):
448
355
""" Key pressed handler for the history entry. """
449
if event.keyval == gtk.gdk.keyval_from_name('Return') or event.keyval == gtk.gdk.keyval_from_name('KP_Enter'):
450
# Return was hit, so we have to load that specific revision
451
# Emulate being remote, so inventory should be used
452
path = self.get_path()
455
self.remote_branch = self.wt.branch
457
revno = int(self.entry_history.get_text())
458
self.remote_revision = self.remote_branch.get_rev_id(revno)
459
if self.set_path(path, True):
462
def on_entry_location_key_press_event(self, widget, event):
463
""" Key pressed handler for the location entry. """
464
if event.keyval == gtk.gdk.keyval_from_name('Return') or event.keyval == gtk.gdk.keyval_from_name('KP_Enter'):
465
# Return was hit, so we have to jump
466
self.on_button_location_jump_clicked(widget)
356
path = self.get_path()
359
self.remote_branch = self.wt.branch
361
revno = int(self.entry_history.get_text())
362
self.remote_revision = self.remote_branch.get_rev_id(revno)
363
if self.set_path(path, True):
468
366
def on_menuitem_add_files_activate(self, widget):
469
367
""" Add file(s)... menu handler. """
470
from add import OliveAdd
471
add = OliveAdd(self.wt, self.wtpath, self.get_selected_right())
368
from bzrlib.plugins.gtk.olive.add import AddDialog
369
add = AddDialog(self.wt, self.wtpath, self.get_selected_right(), self.window)
372
if response == gtk.RESPONSE_OK:
474
375
def on_menuitem_branch_get_activate(self, widget):
475
376
""" Branch/Get... menu handler. """
476
377
from bzrlib.plugins.gtk.branch import BranchDialog
717
619
def on_menuitem_file_make_directory_activate(self, widget):
718
620
""" File/Make directory... menu handler. """
719
from mkdir import OliveMkdir
720
mkdir = OliveMkdir(self.wt, self.wtpath)
621
from bzrlib.plugins.gtk.olive.mkdir import MkdirDialog
622
mkdir = MkdirDialog(self.wt, self.wtpath, self.window)
623
response = mkdir.run()
625
if response == gtk.RESPONSE_OK:
723
628
def on_menuitem_file_move_activate(self, widget):
724
629
""" File/Move... menu handler. """
725
from move import OliveMove
726
move = OliveMove(self.wt, self.wtpath, self.get_selected_right())
630
from bzrlib.plugins.gtk.olive.move import MoveDialog
631
move = MoveDialog(self.wt, self.wtpath, self.get_selected_right(), self.window)
632
response = move.run()
634
if response == gtk.RESPONSE_OK:
729
637
def on_menuitem_file_rename_activate(self, widget):
730
638
""" File/Rename... menu handler. """
731
from rename import OliveRename
732
rename = OliveRename(self.wt, self.wtpath, self.get_selected_right())
639
from bzrlib.plugins.gtk.olive.rename import RenameDialog
640
rename = RenameDialog(self.wt, self.wtpath, self.get_selected_right(), self.window)
641
response = rename.run()
643
if response == gtk.RESPONSE_OK:
735
646
def on_menuitem_remove_file_activate(self, widget):
736
647
""" Remove (unversion) selected file. """
737
from remove import OliveRemoveDialog
738
remove = OliveRemoveDialog(self.wt, self.wtpath,
648
from bzrlib.plugins.gtk.olive.remove import RemoveDialog
649
remove = RemoveDialog(self.wt, self.wtpath,
739
650
selected=self.get_selected_right(),
740
651
parent=self.window)
741
652
response = remove.run()
786
698
def on_menuitem_view_show_hidden_files_activate(self, widget):
787
699
""" View/Show hidden files menu handler. """
788
700
self.pref.set_preference('dotted_files', widget.get_active())
789
702
if self.path is not None:
790
703
self.refresh_right()
792
705
def on_menuitem_view_show_ignored_files_activate(self, widget):
793
706
""" Hide/Show ignored files menu handler. """
794
707
self.pref.set_preference('ignored_files', widget.get_active())
795
709
if self.path is not None:
796
710
self.refresh_right()
798
712
def on_treeview_left_button_press_event(self, widget, event):
799
""" Occurs when somebody right-clicks in the bookmark list. """
800
if event.button == 3:
801
# Don't show context with nothing selected
802
if self.get_selected_left() == None:
806
from menu import OliveMenu
807
menu = OliveMenu(path=self.get_path(),
808
selected=self.get_selected_left(),
811
menu.left_context_menu().popup(None, None, None, 0,
814
def on_treeview_left_button_release_event(self, widget, event):
815
""" Occurs when somebody just clicks a bookmark. """
816
if event.button != 3:
817
# Allow one-click bookmark opening
818
if self.get_selected_left() == None:
821
newdir = self.get_selected_left()
825
if self.set_path(newdir):
713
""" Occurs when somebody clicks in the bookmark list. """
714
treepathpos = widget.get_path_at_pos(int(event.x), int(event.y))
715
treeselection = widget.get_selection()
716
if treepathpos is not None:
717
treeselection.select_path(treepathpos[0])
718
if event.button == 1:
719
newdir = self.get_selected_left()
723
if self.set_path(newdir):
725
elif event.button == 3:
726
# Don't show context with nothing selected
727
if self.get_selected_left() == None:
731
from menu import OliveMenu
732
menu = OliveMenu(path=self.get_path(),
733
selected=self.get_selected_left(),
736
menu.left_context_menu().popup(None, None, None, 0,
739
if treeselection is not None:
740
treeselection.unselect_all()
828
742
def on_treeview_left_row_activated(self, treeview, path, view_column):
829
743
""" Occurs when somebody double-clicks or enters an item in the
861
787
m_open.set_sensitive(False)
862
788
m_add.set_sensitive(False)
863
789
m_remove.set_sensitive(False)
790
m_remove_and_delete.set_sensitive(False)
864
791
m_rename.set_sensitive(False)
865
792
m_revert.set_sensitive(False)
866
793
m_commit.set_sensitive(False)
867
794
m_annotate.set_sensitive(False)
868
795
m_diff.set_sensitive(False)
797
if treepathpos is None:
798
m_open.set_sensitive(False)
799
m_add.set_sensitive(False)
800
m_remove.set_sensitive(False)
801
m_remove_and_delete.set_sensitive(False)
802
m_rename.set_sensitive(False)
803
m_annotate.set_sensitive(False)
804
m_diff.set_sensitive(False)
805
m_revert.set_sensitive(False)
807
m_open.set_sensitive(True)
808
m_add.set_sensitive(True)
809
m_remove.set_sensitive(True)
810
m_remove_and_delete.set_sensitive(True)
811
m_rename.set_sensitive(True)
812
m_annotate.set_sensitive(True)
813
m_diff.set_sensitive(True)
814
m_revert.set_sensitive(True)
815
m_commit.set_sensitive(True)
816
except bzrerrors.NotBranchError:
817
if treepathpos is None:
818
m_open.set_sensitive(False)
870
820
m_open.set_sensitive(True)
871
m_add.set_sensitive(True)
872
m_remove.set_sensitive(True)
873
m_rename.set_sensitive(True)
874
m_revert.set_sensitive(True)
875
m_commit.set_sensitive(True)
876
m_annotate.set_sensitive(True)
877
m_diff.set_sensitive(True)
878
except bzrerrors.NotBranchError:
879
m_open.set_sensitive(True)
880
821
m_add.set_sensitive(False)
881
822
m_remove.set_sensitive(False)
823
m_remove_and_delete.set_sensitive(False)
882
824
m_rename.set_sensitive(False)
883
825
m_revert.set_sensitive(False)
884
826
m_commit.set_sensitive(False)
920
862
def on_window_main_delete_event(self, widget, event=None):
921
863
""" Do some stuff before exiting. """
922
width, height = self.window_main.get_size()
864
width, height = self.window.get_size()
923
865
self.pref.set_preference('window_width', width)
924
866
self.pref.set_preference('window_height', height)
925
x, y = self.window_main.get_position()
867
x, y = self.window.get_position()
926
868
self.pref.set_preference('window_x', x)
927
869
self.pref.set_preference('window_y', y)
928
870
self.pref.set_preference('paned_position',
929
self.hpaned_main.get_position())
871
self.window.hpaned_main.get_position())
931
873
self.pref.write()
932
self.window_main.destroy()
934
def _load_left(self):
935
""" Load data into the left panel. (Bookmarks) """
937
treestore = gtk.TreeStore(str, str)
940
bookmarks = self.pref.get_bookmarks()
942
# Add them to the TreeStore
943
titer = treestore.append(None, [_i18n('Bookmarks'), None])
944
for item in bookmarks:
945
title = self.pref.get_bookmark_title(item)
946
treestore.append(titer, [title, item])
948
# Create the column and add it to the TreeView
949
self.treeview_left.set_model(treestore)
950
tvcolumn_bookmark = gtk.TreeViewColumn(_i18n('Bookmark'))
951
self.treeview_left.append_column(tvcolumn_bookmark)
954
cell = gtk.CellRendererText()
955
tvcolumn_bookmark.pack_start(cell, True)
956
tvcolumn_bookmark.add_attribute(cell, 'text', 0)
959
self.treeview_left.expand_all()
874
self.window.destroy()
961
def _load_right(self):
962
""" Load data into the right panel. (Filelist) """
964
# Model: [ icon, dir, name, status text, status, size (int), size (human), mtime (int), mtime (local), fileid ]
965
liststore = gtk.ListStore(gobject.TYPE_STRING,
966
gobject.TYPE_BOOLEAN,
979
# Fill the appropriate lists
980
dotted_files = self.pref.get_preference('dotted_files', 'bool')
981
for item in os.listdir(self.path):
982
if not dotted_files and item[0] == '.':
984
if os.path.isdir(self.path + os.sep + item):
989
if not self.notbranch:
990
branch = self.wt.branch
991
tree2 = self.wt.branch.repository.revision_tree(branch.last_revision())
993
delta = self.wt.changes_from(tree2, want_unchanged=True)
995
# Add'em to the ListStore
998
statinfo = os.stat(self.path + os.sep + item)
1004
liststore.append([ gtk.STOCK_DIRECTORY,
1012
self._format_date(statinfo.st_mtime),
1017
if not self.notbranch:
1018
filename = self.wt.relpath(self.path + os.sep + item)
1023
for rpath, rpathnew, id, kind, text_modified, meta_modified in delta.renamed:
1024
if rpathnew == filename:
1027
for rpath, id, kind in delta.added:
1028
if rpath == filename:
1031
for rpath, id, kind in delta.removed:
1032
if rpath == filename:
1035
for rpath, id, kind, text_modified, meta_modified in delta.modified:
1036
if rpath == filename:
1039
for rpath, id, kind in delta.unchanged:
1040
if rpath == filename:
1041
status = 'unchanged'
1043
for rpath, file_class, kind, id, entry in self.wt.list_files():
1044
if rpath == filename and file_class == 'I':
1049
if status == 'renamed':
1050
st = _i18n('renamed')
1051
elif status == 'removed':
1052
st = _i18n('removed')
1053
elif status == 'added':
1055
elif status == 'modified':
1056
st = _i18n('modified')
1057
elif status == 'unchanged':
1058
st = _i18n('unchanged')
1059
elif status == 'ignored':
1060
st = _i18n('ignored')
1062
st = _i18n('unknown')
1065
statinfo = os.stat(self.path + os.sep + item)
1071
liststore.append([gtk.STOCK_FILE,
1076
str(statinfo.st_size), # NOTE: if int used there it will fail for large files (size expressed as long int)
1077
self._format_size(statinfo.st_size),
1079
self._format_date(statinfo.st_mtime),
1082
# Create the columns and add them to the TreeView
1083
self.treeview_right.set_model(liststore)
1084
self._tvcolumn_filename = gtk.TreeViewColumn(_i18n('Filename'))
1085
self._tvcolumn_status = gtk.TreeViewColumn(_i18n('Status'))
1086
self._tvcolumn_size = gtk.TreeViewColumn(_i18n('Size'))
1087
self._tvcolumn_mtime = gtk.TreeViewColumn(_i18n('Last modified'))
1088
self.treeview_right.append_column(self._tvcolumn_filename)
1089
self.treeview_right.append_column(self._tvcolumn_status)
1090
self.treeview_right.append_column(self._tvcolumn_size)
1091
self.treeview_right.append_column(self._tvcolumn_mtime)
1094
cellpb = gtk.CellRendererPixbuf()
1095
cell = gtk.CellRendererText()
1096
self._tvcolumn_filename.pack_start(cellpb, False)
1097
self._tvcolumn_filename.pack_start(cell, True)
1098
self._tvcolumn_filename.set_attributes(cellpb, stock_id=0)
1099
self._tvcolumn_filename.add_attribute(cell, 'text', 2)
1100
self._tvcolumn_status.pack_start(cell, True)
1101
self._tvcolumn_status.add_attribute(cell, 'text', 3)
1102
self._tvcolumn_size.pack_start(cell, True)
1103
self._tvcolumn_size.add_attribute(cell, 'text', 6)
1104
self._tvcolumn_mtime.pack_start(cell, True)
1105
self._tvcolumn_mtime.add_attribute(cell, 'text', 8)
1107
# Set up the properties of the TreeView
1108
self.treeview_right.set_headers_visible(True)
1109
self.treeview_right.set_headers_clickable(True)
1110
self.treeview_right.set_search_column(1)
1111
self._tvcolumn_filename.set_resizable(True)
1112
self._tvcolumn_status.set_resizable(True)
1113
self._tvcolumn_size.set_resizable(True)
1114
self._tvcolumn_mtime.set_resizable(True)
1116
liststore.set_sort_func(13, self._sort_filelist_callback, None)
1117
liststore.set_sort_column_id(13, gtk.SORT_ASCENDING)
1118
self._tvcolumn_filename.set_sort_column_id(13)
1119
self._tvcolumn_status.set_sort_column_id(3)
1120
self._tvcolumn_size.set_sort_column_id(5)
1121
self._tvcolumn_mtime.set_sort_column_id(7)
1124
self.set_sensitivity()
1126
876
def get_selected_fileid(self):
1127
877
""" Get the file_id of the selected file. """
1128
treeselection = self.treeview_right.get_selection()
878
treeselection = self.window.treeview_right.get_selection()
1129
879
(model, iter) = treeselection.get_selected()
1131
881
if iter is None:
1156
906
def set_statusbar(self, message):
1157
907
""" Set the statusbar message. """
1158
self.statusbar.push(self.context_id, message)
908
self.window.statusbar.push(self.context_id, message)
1160
910
def clear_statusbar(self):
1161
911
""" Clean the last message from the statusbar. """
1162
self.statusbar.pop(self.context_id)
912
self.window.statusbar.pop(self.context_id)
1164
914
def set_sensitivity(self):
1165
915
""" Set menu and toolbar sensitivity. """
1166
916
if not self.remote:
1168
self.menuitem_branch_init.set_sensitive(self.notbranch)
1169
self.menuitem_branch_get.set_sensitive(self.notbranch)
1170
self.menuitem_branch_checkout.set_sensitive(self.notbranch)
1171
self.menuitem_branch_pull.set_sensitive(not self.notbranch)
1172
self.menuitem_branch_push.set_sensitive(not self.notbranch)
1173
self.menuitem_branch_update.set_sensitive(not self.notbranch)
1174
self.menuitem_branch_revert.set_sensitive(not self.notbranch)
1175
self.menuitem_branch_merge.set_sensitive(not self.notbranch)
1176
self.menuitem_branch_commit.set_sensitive(not self.notbranch)
1177
self.menuitem_branch_tags.set_sensitive(not self.notbranch)
1178
self.menuitem_branch_status.set_sensitive(not self.notbranch)
1179
self.menuitem_branch_missing.set_sensitive(not self.notbranch)
1180
self.menuitem_branch_conflicts.set_sensitive(not self.notbranch)
1181
self.menuitem_stats.set_sensitive(not self.notbranch)
1182
self.menuitem_stats_diff.set_sensitive(not self.notbranch)
1183
self.menuitem_add_files.set_sensitive(not self.notbranch)
1184
self.menuitem_remove_files.set_sensitive(not self.notbranch)
1185
self.menuitem_file_make_directory.set_sensitive(not self.notbranch)
1186
self.menuitem_file_rename.set_sensitive(not self.notbranch)
1187
self.menuitem_file_move.set_sensitive(not self.notbranch)
1188
self.menuitem_file_annotate.set_sensitive(not self.notbranch)
1189
#self.menutoolbutton_diff.set_sensitive(True)
1190
self.toolbutton_diff.set_sensitive(not self.notbranch)
1191
self.toolbutton_log.set_sensitive(not self.notbranch)
1192
self.toolbutton_commit.set_sensitive(not self.notbranch)
1193
self.toolbutton_pull.set_sensitive(not self.notbranch)
1194
self.toolbutton_push.set_sensitive(not self.notbranch)
1195
self.toolbutton_update.set_sensitive(not self.notbranch)
917
self.window.set_view_to_localbranch(self.notbranch)
1198
self.menuitem_branch_init.set_sensitive(False)
1199
self.menuitem_branch_get.set_sensitive(True)
1200
self.menuitem_branch_checkout.set_sensitive(True)
1201
self.menuitem_branch_pull.set_sensitive(False)
1202
self.menuitem_branch_push.set_sensitive(False)
1203
self.menuitem_branch_update.set_sensitive(False)
1204
self.menuitem_branch_revert.set_sensitive(False)
1205
self.menuitem_branch_merge.set_sensitive(False)
1206
self.menuitem_branch_commit.set_sensitive(False)
1207
self.menuitem_branch_tags.set_sensitive(True)
1208
self.menuitem_branch_status.set_sensitive(False)
1209
self.menuitem_branch_missing.set_sensitive(False)
1210
self.menuitem_branch_conflicts.set_sensitive(False)
1211
self.menuitem_stats.set_sensitive(True)
1212
self.menuitem_stats_diff.set_sensitive(False)
1213
self.menuitem_add_files.set_sensitive(False)
1214
self.menuitem_remove_files.set_sensitive(False)
1215
self.menuitem_file_make_directory.set_sensitive(False)
1216
self.menuitem_file_rename.set_sensitive(False)
1217
self.menuitem_file_move.set_sensitive(False)
1218
self.menuitem_file_annotate.set_sensitive(False)
1219
#self.menutoolbutton_diff.set_sensitive(True)
1220
self.toolbutton_diff.set_sensitive(False)
1221
self.toolbutton_log.set_sensitive(True)
1222
self.toolbutton_commit.set_sensitive(False)
1223
self.toolbutton_pull.set_sensitive(False)
1224
self.toolbutton_push.set_sensitive(False)
1225
self.toolbutton_update.set_sensitive(False)
919
self.window.set_view_to_remotebranch()
1227
921
def refresh_left(self):
1228
922
""" Refresh the bookmark list. """
1230
# Get TreeStore and clear it
1231
treestore = self.treeview_left.get_model()
924
# Get ListStore and clear it
925
liststore = self.window.bookmarklist
1234
928
# Re-read preferences
1235
929
self.pref.read()
1238
932
bookmarks = self.pref.get_bookmarks()
1240
# Add them to the TreeStore
1241
titer = treestore.append(None, [_i18n('Bookmarks'), None])
1242
for item in bookmarks:
1243
title = self.pref.get_bookmark_title(item)
1244
treestore.append(titer, [title, item])
1246
# Add the TreeStore to the TreeView
1247
self.treeview_left.set_model(treestore)
1250
self.treeview_left.expand_all()
1252
def refresh_right(self, path=None):
934
# Get titles and sort by title
935
bookmarks = [[self.pref.get_bookmark_title(item), item, gtk.STOCK_DIRECTORY] for item in bookmarks]
937
for title_item in bookmarks:
938
liststore.append(title_item)
940
# Add the ListStore to the TreeView and refresh column width
941
self.window.treeview_left.set_model(liststore)
942
self.window.treeview_left.columns_autosize()
944
def refresh_right(self):
1253
945
""" Refresh the file list. """
1254
946
if not self.remote:
1256
948
from bzrlib.workingtree import WorkingTree
1259
path = self.get_path()
1261
# A workaround for double-clicking Bookmarks
1262
if not os.path.exists(path):
950
path = self.get_path()
1265
952
# Get ListStore and clear it
1266
liststore = self.treeview_right.get_model()
953
liststore = self.window.filelist
1267
954
liststore.clear()
1269
# Show Status column
1270
self._tvcolumn_status.set_visible(True)
1275
959
# Fill the appropriate lists
1276
960
dotted_files = self.pref.get_preference('dotted_files', 'bool')
1277
961
ignored_files = self.pref.get_preference('ignored_files', 'bool')
1279
963
for item in os.listdir(path):
1280
964
if not dotted_files and item[0] == '.':
1282
if os.path.isdir(path + os.sep + item):
966
if os.path.isdir(os.path.join(path, item)):
1283
967
dirs.append(item)
1285
969
files.append(item)
1287
# Try to open the working tree
1290
tree1 = WorkingTree.open_containing(path)[0]
1291
except (bzrerrors.NotBranchError, bzrerrors.NoWorkingTree):
1295
branch = tree1.branch
1296
tree2 = tree1.branch.repository.revision_tree(branch.last_revision())
1298
delta = tree1.changes_from(tree2, want_unchanged=True)
971
self.window.col_status.set_visible(False)
972
if not self.notbranch:
974
tree1 = WorkingTree.open_containing(os.path.realpath(path))[0]
975
branch = tree1.branch
976
tree2 = tree1.branch.repository.revision_tree(branch.last_revision())
978
delta = tree1.changes_from(tree2, want_unchanged=True)
981
self.window.col_status.set_visible(True)
982
except bzrerrors.LockContention:
983
self.window.set_location_status(gtk.STOCK_DIALOG_ERROR, allowPopup=True)
984
self.window.location_status.connect_object('clicked', error_dialog,
985
*(_i18n('Branch is locked'),
986
_i18n('The branch in the current folder is locked by another Bazaar program')))
987
self.notbranch = True
988
self.window.set_view_to_localbranch(False)
1300
990
# Add'em to the ListStore
1301
991
for item in dirs:
1303
statinfo = os.stat(self.path + os.sep + item)
995
if not self.notbranch:
996
filename = tree1.relpath(os.path.join(os.path.realpath(path), item))
998
st, status = self.statusmapper(filename, delta)
999
if not ignored_files and status == 'ignored':
1309
liststore.append([gtk.STOCK_DIRECTORY,
1317
self._format_date(statinfo.st_mtime),
1002
statinfo = os.lstat(os.path.join(self.path, item))
1003
liststore.append([ gtk.STOCK_DIRECTORY,
1011
self._format_date(statinfo.st_mtime),
1319
1013
for item in files:
1323
filename = tree1.relpath(path + os.sep + item)
1017
if not self.notbranch:
1018
filename = tree1.relpath(os.path.join(os.path.realpath(path), item))
1328
for rpath, rpathnew, id, kind, text_modified, meta_modified in delta.renamed:
1329
if rpathnew == filename:
1332
for rpath, id, kind in delta.added:
1333
if rpath == filename:
1336
for rpath, id, kind in delta.removed:
1337
if rpath == filename:
1340
for rpath, id, kind, text_modified, meta_modified in delta.modified:
1341
if rpath == filename:
1344
for rpath, id, kind in delta.unchanged:
1345
if rpath == filename:
1346
status = 'unchanged'
1348
for rpath, file_class, kind, id, entry in self.wt.list_files():
1349
if rpath == filename and file_class == 'I':
1354
if status == 'renamed':
1355
st = _i18n('renamed')
1356
elif status == 'removed':
1357
st = _i18n('removed')
1358
elif status == 'added':
1360
elif status == 'modified':
1361
st = _i18n('modified')
1362
elif status == 'unchanged':
1363
st = _i18n('unchanged')
1364
elif status == 'ignored':
1365
st = _i18n('ignored')
1366
if not ignored_files:
1369
st = _i18n('unknown')
1372
statinfo = os.stat(self.path + os.sep + item)
1020
st, status = self.statusmapper(filename, delta)
1021
if not ignored_files and status == 'ignored':
1024
statinfo = os.lstat(os.path.join(self.path, item))
1378
1025
liststore.append([gtk.STOCK_FILE,