/b-gtk/fix-viz

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz

« back to all changes in this revision

Viewing changes to olive/__init__.py

  • Committer: Jasper Groenewegen
  • Date: 2008-07-27 12:01:40 UTC
  • mfrom: (576.3.2 improve-merge)
  • mto: This revision was merged to the branch mainline in revision 579.
  • Revision ID: colbrac@xs4all.nl-20080727120140-1agdlzkc9fumjk5f
Merge merge dialog improvements

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
 #!/usr/bin/python
2
 
 
3
1
# Copyright (C) 2006 by Szilveszter Farkas (Phanatic) <szilveszter.farkas@gmail.com>
4
2
#
5
3
# This program is free software; you can redistribute it and/or modify
19
17
import os
20
18
import sys
21
19
import time
 
20
import errno
22
21
 
23
22
# gettext support
24
23
import gettext
33
32
import gobject
34
33
import gtk
35
34
import gtk.gdk
36
 
import gtk.glade
37
35
 
38
36
from bzrlib.branch import Branch
39
37
import bzrlib.errors as bzrerrors
44
42
from bzrlib.plugins.gtk import _i18n
45
43
from bzrlib.plugins.gtk.dialog import error_dialog, info_dialog, warning_dialog
46
44
from bzrlib.plugins.gtk.errors import show_bzr_error
47
 
from guifiles import GLADEFILENAME
 
45
from bzrlib.plugins.gtk.olive.window import OliveGui
48
46
 
49
47
from bzrlib.plugins.gtk.diff import DiffWindow
50
48
lazy_import(globals(), """
60
58
 
61
59
def about():
62
60
    """ Display the AboutDialog. """
63
 
    from bzrlib.plugins.gtk import __version__
64
 
    from bzrlib.plugins.gtk.olive.guifiles import GLADEFILENAME
65
 
 
66
 
    # Load AboutDialog description
67
 
    dglade = gtk.glade.XML(GLADEFILENAME, 'aboutdialog')
68
 
    dialog = dglade.get_widget('aboutdialog')
69
 
 
70
 
    # Set version
 
61
    from bzrlib.plugins.gtk import __version__, icon_path
 
62
    
 
63
    iconpath = icon_path() + os.sep
 
64
    
 
65
    dialog = gtk.AboutDialog()
 
66
    dialog.set_name("Olive")
71
67
    dialog.set_version(__version__)
 
68
    dialog.set_copyright("Copyright (C) 2006 Szilveszter Farkas (Phanatic)")
 
69
    dialog.set_website("https://launchpad.net/products/olive")
 
70
    dialog.set_website_label("https://launchpad.net/products/olive")
 
71
    dialog.set_icon_from_file(iconpath+"oliveicon2.png")
 
72
    dialog.set_logo(gtk.gdk.pixbuf_new_from_file(iconpath+"oliveicon2.png"))
72
73
    dialog.set_authors([ _i18n("Lead Developer:"),
73
74
                         "Szilveszter Farkas <szilveszter.farkas@gmail.com>",
74
75
                         _i18n("Contributors:"),
87
88
    program. """
88
89
    
89
90
    def __init__(self):
90
 
        self.toplevel = gtk.glade.XML(GLADEFILENAME, 'window_main', 'olive-gtk')
91
 
        self.window = self.toplevel.get_widget('window_main')
 
91
        self.window = OliveGui(calling_app = self)
 
92
        
92
93
        self.pref = Preferences()
93
94
        self.path = None
94
95
 
95
96
        # Initialize the statusbar
96
 
        self.statusbar = self.toplevel.get_widget('statusbar')
97
 
        self.context_id = self.statusbar.get_context_id('olive')
98
 
        
99
 
        # Get the main window
100
 
        self.window_main = self.toplevel.get_widget('window_main')
101
 
        # Get the HPaned
102
 
        self.hpaned_main = self.toplevel.get_widget('hpaned_main')
103
 
        # Get the TreeViews
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')
 
97
        self.context_id = self.window.statusbar.get_context_id('olive')
 
98
        
 
99
                # Get the TreeViews
 
100
        self.treeview_left = self.window.treeview_left
 
101
        self.treeview_right = self.window.treeview_right
 
102
        
141
103
        # Get the drive selector
142
104
        self.combobox_drive = gtk.combo_box_new_text()
143
105
        self.combobox_drive.connect("changed", self._refresh_drives)
144
106
        
145
107
        # 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')
 
108
        self.hbox_location = self.window.locationbar
 
109
        self.button_location_up = self.window.button_location_up
 
110
        self.button_location_jump = self.window.button_location_jump
 
111
        self.entry_location = self.window.entry_location
 
112
        self.image_location_error = self.window.image_location_error
151
113
        
152
114
        # 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')
156
 
        
157
 
        self.vbox_main_right = self.toplevel.get_widget('vbox_main_right')
158
 
        
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
209
 
            }
210
 
        
211
 
        # Connect the signals to the handlers
212
 
        self.toplevel.signal_autoconnect(dic)
 
115
        self.check_history = self.window.checkbutton_history
 
116
        self.entry_history = self.window.entry_history_revno
 
117
        self.button_history = self.window.button_history_browse
213
118
        
214
119
        self._just_started = True
215
120
        
222
127
        self.window.move(x, y)
223
128
        # Apply paned position
224
129
        pos = self.pref.get_preference('paned_position', 'int')
225
 
        self.hpaned_main.set_position(pos)
226
 
        
227
 
        # Apply menu to the toolbutton
228
 
        #menubutton = self.toplevel.get_widget('menutoolbutton_diff')
229
 
        #menubutton.set_menu(handler.menu.toolbar_diff)
 
130
        self.window.hpaned_main.set_position(pos)
230
131
        
231
132
        # Now we can show the window
232
133
        self.window.show()
238
139
            self.combobox_drive.show()
239
140
            self.gen_hard_selector()
240
141
        
 
142
        # Acceptable errors when loading files/folders in the treeviews
 
143
        self.acceptable_errors = (errno.ENOENT, errno.ELOOP)
 
144
        
241
145
        self._load_left()
242
146
 
243
147
        # Apply menu state
244
 
        self.menuitem_view_show_hidden_files.set_active(self.pref.get_preference('dotted_files', 'bool'))
245
 
        self.menuitem_view_show_ignored_files.set_active(self.pref.get_preference('ignored_files', 'bool'))
 
148
        self.window.mb_view_showhidden.set_active(self.pref.get_preference('dotted_files', 'bool'))
 
149
        self.window.mb_view_showignored.set_active(self.pref.get_preference('ignored_files', 'bool'))
246
150
 
247
151
        # We're starting local
248
152
        self.remote = False
375
279
        else:
376
280
            self.check_history.set_sensitive(True)
377
281
        
378
 
        self.statusbar.push(self.context_id, path)
 
282
        self.window.statusbar.push(self.context_id, path)
379
283
        self.entry_location.set_text(path)
380
284
        self.path = path
381
285
        return True
408
312
            if response == gtk.RESPONSE_OK:
409
313
                if revb.selected_revno is not None:
410
314
                    self.entry_history.set_text(revb.selected_revno)
 
315
                    self.on_entry_history_revno_activate()
411
316
            
412
317
            revb.destroy()
413
318
    
438
343
            # History Mode activated
439
344
            self.entry_history.set_sensitive(True)
440
345
            self.button_history.set_sensitive(True)
 
346
            if self.entry_history.get_text() != "":
 
347
                self.on_entry_history_revno_activate()
441
348
        else:
442
349
            # History Mode deactivated
443
350
            self.entry_history.set_sensitive(False)
444
351
            self.button_history.set_sensitive(False)
 
352
            
 
353
            # Return right window to normal view by acting like we jump to it
 
354
            self.on_button_location_jump_clicked(widget)
445
355
    
446
356
    @show_bzr_error
447
 
    def on_entry_history_revno_key_press_event(self, widget, event):
 
357
    def on_entry_history_revno_activate(self, widget=None):
448
358
        """ 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()
453
 
            if not self.remote:
454
 
                self.remote = True
455
 
                self.remote_branch = self.wt.branch
456
 
            
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):
460
 
                self.refresh_right()
461
 
    
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)
467
 
    
 
359
        path = self.get_path()
 
360
        if not self.remote:
 
361
            self.remote = True
 
362
            self.remote_branch = self.wt.branch
 
363
        
 
364
        revno = int(self.entry_history.get_text())
 
365
        self.remote_revision = self.remote_branch.get_rev_id(revno)
 
366
        if self.set_path(path, True):
 
367
            self.refresh_right()
 
368
 
468
369
    def on_menuitem_add_files_activate(self, widget):
469
370
        """ Add file(s)... menu handler. """
470
 
        from add import OliveAdd
471
 
        add = OliveAdd(self.wt, self.wtpath, self.get_selected_right())
472
 
        add.display()
473
 
    
 
371
        from bzrlib.plugins.gtk.olive.add import AddDialog
 
372
        add = AddDialog(self.wt, self.wtpath, self.get_selected_right(), self.window)
 
373
        response = add.run()
 
374
        add.destroy()
 
375
        if response == gtk.RESPONSE_OK:
 
376
            self.refresh_right()
 
377
 
474
378
    def on_menuitem_branch_get_activate(self, widget):
475
379
        """ Branch/Get... menu handler. """
476
380
        from bzrlib.plugins.gtk.branch import BranchDialog
508
412
    @show_bzr_error
509
413
    def on_menuitem_branch_commit_activate(self, widget):
510
414
        """ Branch/Commit... menu handler. """
511
 
#     def __init__(self, wt, wtpath, notbranch, selected=None, parent=None):
512
415
        selected = self.get_selected_right()
513
416
        if selected:
514
417
            selected = os.path.join(self.wtpath, selected)
541
444
                         _i18n('Please commit or revert the changes before merging.'))
542
445
        else:
543
446
            parent_branch_path = self.wt.branch.get_parent()
544
 
            merge = MergeDialog(self.wt, self.wtpath,default_branch_path=parent_branch_path )
545
 
            merge.display()
 
447
            merge = MergeDialog(self.wt, self.wtpath, parent_branch_path, self.window)
 
448
            response = merge.run()
 
449
            merge.destroy()
 
450
            if response == gtk.RESPONSE_OK:
 
451
                self.refresh_right()
546
452
 
547
453
    @show_bzr_error
548
454
    def on_menuitem_branch_missing_revisions_activate(self, widget):
644
550
    @show_bzr_error
645
551
    def on_menuitem_branch_revert_activate(self, widget):
646
552
        """ Branch/Revert all changes menu handler. """
647
 
        ret = self.wt.revert([])
 
553
        ret = self.wt.revert(None)
648
554
        if ret:
649
555
            warning_dialog(_i18n('Conflicts detected'),
650
556
                           _i18n('Please have a look at the working tree before continuing.'))
716
622
    
717
623
    def on_menuitem_file_make_directory_activate(self, widget):
718
624
        """ File/Make directory... menu handler. """
719
 
        from mkdir import OliveMkdir
720
 
        mkdir = OliveMkdir(self.wt, self.wtpath)
721
 
        mkdir.display()
 
625
        from bzrlib.plugins.gtk.olive.mkdir import MkdirDialog
 
626
        mkdir = MkdirDialog(self.wt, self.wtpath, self.window)
 
627
        response = mkdir.run()
 
628
        mkdir.destroy()
 
629
        if response == gtk.RESPONSE_OK:
 
630
            self.refresh_right()
722
631
    
723
632
    def on_menuitem_file_move_activate(self, widget):
724
633
        """ File/Move... menu handler. """
725
 
        from move import OliveMove
726
 
        move = OliveMove(self.wt, self.wtpath, self.get_selected_right())
727
 
        move.display()
 
634
        from bzrlib.plugins.gtk.olive.move import MoveDialog
 
635
        move = MoveDialog(self.wt, self.wtpath, self.get_selected_right(), self.window)
 
636
        response = move.run()
 
637
        move.destroy()
 
638
        if response == gtk.RESPONSE_OK:
 
639
            self.refresh_right()
728
640
    
729
641
    def on_menuitem_file_rename_activate(self, widget):
730
642
        """ File/Rename... menu handler. """
731
 
        from rename import OliveRename
732
 
        rename = OliveRename(self.wt, self.wtpath, self.get_selected_right())
733
 
        rename.display()
 
643
        from bzrlib.plugins.gtk.olive.rename import RenameDialog
 
644
        rename = RenameDialog(self.wt, self.wtpath, self.get_selected_right(), self.window)
 
645
        response = rename.run()
 
646
        rename.destroy()
 
647
        if response == gtk.RESPONSE_OK:
 
648
            self.refresh_right()
734
649
 
735
650
    def on_menuitem_remove_file_activate(self, widget):
736
651
        """ Remove (unversion) selected file. """
737
 
        from remove import OliveRemoveDialog
738
 
        remove = OliveRemoveDialog(self.wt, self.wtpath,
 
652
        from bzrlib.plugins.gtk.olive.remove import RemoveDialog
 
653
        remove = RemoveDialog(self.wt, self.wtpath,
739
654
                                   selected=self.get_selected_right(),
740
655
                                   parent=self.window)
741
656
        response = remove.run()
758
673
    
759
674
    def on_menuitem_stats_infos_activate(self, widget):
760
675
        """ Statistics/Informations... menu handler. """
761
 
        from info import OliveInfo
 
676
        from bzrlib.plugins.gtk.olive.info import InfoDialog
762
677
        if self.remote:
763
 
            info = OliveInfo(self.remote_branch)
 
678
            info = InfoDialog(self.remote_branch)
764
679
        else:
765
 
            info = OliveInfo(self.wt.branch)
 
680
            info = InfoDialog(self.wt.branch)
766
681
        info.display()
767
682
    
768
683
    def on_menuitem_stats_log_activate(self, widget):
773
688
        else:
774
689
            branch = self.remote_branch
775
690
 
776
 
        window = branchwin.BranchWindow(branch, branch.last_revision(), None, parent=self.window)
 
691
        window = branchwin.BranchWindow(branch, [branch.last_revision()], None, 
 
692
                                        parent=self.window)
777
693
        window.show()
778
694
    
779
695
    def on_menuitem_view_refresh_activate(self, widget):
796
712
            self.refresh_right()
797
713
            
798
714
    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:
803
 
                return
804
 
 
805
 
            # Create a menu
806
 
            from menu import OliveMenu
807
 
            menu = OliveMenu(path=self.get_path(),
808
 
                             selected=self.get_selected_left(),
809
 
                             app=self)
810
 
            
811
 
            menu.left_context_menu().popup(None, None, None, 0,
812
 
                                           event.time)
813
 
 
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:
819
 
                return
820
 
            
821
 
            newdir = self.get_selected_left()
822
 
            if newdir == None:
823
 
                return
824
 
 
825
 
            if self.set_path(newdir):
826
 
                self.refresh_right()
 
715
        """ Occurs when somebody clicks in the bookmark list. """
 
716
        treepathpos = widget.get_path_at_pos(int(event.x), int(event.y))
 
717
        treeselection = widget.get_selection()
 
718
        if treepathpos is not None:
 
719
            treeselection.select_path(treepathpos[0])
 
720
            if event.button == 1:
 
721
                newdir = self.get_selected_left()
 
722
                if newdir == None:
 
723
                    return
 
724
 
 
725
                if self.set_path(newdir):
 
726
                    self.refresh_right()
 
727
            elif event.button == 3:
 
728
                # Don't show context with nothing selected
 
729
                if self.get_selected_left() == None:
 
730
                    return
 
731
 
 
732
                # Create a menu
 
733
                from menu import OliveMenu
 
734
                menu = OliveMenu(path=self.get_path(),
 
735
                                 selected=self.get_selected_left(),
 
736
                                 app=self)
 
737
                
 
738
                menu.left_context_menu().popup(None, None, None, 0,
 
739
                                               event.time)
 
740
        else:
 
741
            if treeselection is not None:
 
742
                treeselection.unselect_all()
827
743
 
828
744
    def on_treeview_left_row_activated(self, treeview, path, view_column):
829
745
        """ Occurs when somebody double-clicks or enters an item in the
837
753
            self.refresh_right()
838
754
 
839
755
    def on_treeview_right_button_press_event(self, widget, event):
840
 
        """ Occurs when somebody right-clicks in the file list. """
841
 
        if event.button == 3:
 
756
        """ Occurs when somebody clicks in the file list. """
 
757
        treepathpos = widget.get_path_at_pos(int(event.x), int(event.y))
 
758
        if event.button == 1:
 
759
            if treepathpos is None and widget.get_selection is not None:
 
760
                treeselection = widget.get_selection()
 
761
                treeselection.unselect_all()
 
762
        elif event.button == 3:
 
763
            treeselection = widget.get_selection()
 
764
            if treepathpos is not None:
 
765
                treeselection.select_path(treepathpos[0])
 
766
            else:
 
767
                if treeselection is not None:
 
768
                    treeselection.unselect_all()
842
769
            # Create a menu
843
770
            from menu import OliveMenu
844
771
            menu = OliveMenu(path=self.get_path(),
848
775
            m_open = menu.ui.get_widget('/context_right/open')
849
776
            m_add = menu.ui.get_widget('/context_right/add')
850
777
            m_remove = menu.ui.get_widget('/context_right/remove')
 
778
            m_remove_and_delete = menu.ui.get_widget('/context_right/remove_and_delete')
851
779
            m_rename = menu.ui.get_widget('/context_right/rename')
852
780
            m_revert = menu.ui.get_widget('/context_right/revert')
853
781
            m_commit = menu.ui.get_widget('/context_right/commit')
861
789
                    m_open.set_sensitive(False)
862
790
                    m_add.set_sensitive(False)
863
791
                    m_remove.set_sensitive(False)
 
792
                    m_remove_and_delete.set_sensitive(False)
864
793
                    m_rename.set_sensitive(False)
865
794
                    m_revert.set_sensitive(False)
866
795
                    m_commit.set_sensitive(False)
867
796
                    m_annotate.set_sensitive(False)
868
797
                    m_diff.set_sensitive(False)
869
798
                else:
 
799
                    if treepathpos is None:
 
800
                        m_open.set_sensitive(False)
 
801
                        m_add.set_sensitive(False)
 
802
                        m_remove.set_sensitive(False)
 
803
                        m_remove_and_delete.set_sensitive(False)
 
804
                        m_rename.set_sensitive(False)
 
805
                        m_annotate.set_sensitive(False)
 
806
                        m_diff.set_sensitive(False)
 
807
                        m_revert.set_sensitive(False)
 
808
                    else:
 
809
                        m_open.set_sensitive(True)
 
810
                        m_add.set_sensitive(True)
 
811
                        m_remove.set_sensitive(True)
 
812
                        m_remove_and_delete.set_sensitive(True)
 
813
                        m_rename.set_sensitive(True)
 
814
                        m_annotate.set_sensitive(True)
 
815
                        m_diff.set_sensitive(True)
 
816
                        m_revert.set_sensitive(True)
 
817
                    m_commit.set_sensitive(True)
 
818
            except bzrerrors.NotBranchError:
 
819
                if treepathpos is None:
 
820
                    m_open.set_sensitive(False)
 
821
                else:
870
822
                    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
823
                m_add.set_sensitive(False)
881
824
                m_remove.set_sensitive(False)
 
825
                m_remove_and_delete.set_sensitive(False)
882
826
                m_rename.set_sensitive(False)
883
827
                m_revert.set_sensitive(False)
884
828
                m_commit.set_sensitive(False)
919
863
    
920
864
    def on_window_main_delete_event(self, widget, event=None):
921
865
        """ Do some stuff before exiting. """
922
 
        width, height = self.window_main.get_size()
 
866
        width, height = self.window.get_size()
923
867
        self.pref.set_preference('window_width', width)
924
868
        self.pref.set_preference('window_height', height)
925
 
        x, y = self.window_main.get_position()
 
869
        x, y = self.window.get_position()
926
870
        self.pref.set_preference('window_x', x)
927
871
        self.pref.set_preference('window_y', y)
928
872
        self.pref.set_preference('paned_position',
929
 
                                 self.hpaned_main.get_position())
 
873
                                 self.window.hpaned_main.get_position())
930
874
        
931
875
        self.pref.write()
932
 
        self.window_main.destroy()
 
876
        self.window.destroy()
933
877
        
934
878
    def _load_left(self):
935
879
        """ Load data into the left panel. (Bookmarks) """
941
885
        
942
886
        # Add them to the TreeStore
943
887
        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])
 
888
 
 
889
        # Get titles and sort by title
 
890
        bookmarks = [[self.pref.get_bookmark_title(item), item] for item in bookmarks]
 
891
        bookmarks.sort()
 
892
        for title_item in bookmarks:
 
893
            treestore.append(titer, title_item)
947
894
        
948
895
        # Create the column and add it to the TreeView
949
896
        self.treeview_left.set_model(treestore)
997
944
            try:
998
945
                statinfo = os.stat(self.path + os.sep + item)
999
946
            except OSError, e:
1000
 
                if e.errno == 40:
 
947
                if e.errno in self.acceptable_errors:
1001
948
                    continue
1002
949
                else:
1003
950
                    raise
1064
1011
            try:
1065
1012
                statinfo = os.stat(self.path + os.sep + item)
1066
1013
            except OSError, e:
1067
 
                if e.errno == 40:
 
1014
                if e.errno in self.acceptable_errors:
1068
1015
                    continue
1069
1016
                else:
1070
1017
                    raise
1155
1102
 
1156
1103
    def set_statusbar(self, message):
1157
1104
        """ Set the statusbar message. """
1158
 
        self.statusbar.push(self.context_id, message)
 
1105
        self.window.statusbar.push(self.context_id, message)
1159
1106
    
1160
1107
    def clear_statusbar(self):
1161
1108
        """ Clean the last message from the statusbar. """
1162
 
        self.statusbar.pop(self.context_id)
 
1109
        self.window.statusbar.pop(self.context_id)
1163
1110
    
1164
1111
    def set_sensitivity(self):
1165
1112
        """ Set menu and toolbar sensitivity. """
1166
1113
        if not self.remote:
1167
 
            # We're local
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)
 
1114
            self.window.set_view_to_localbranch(self.notbranch)
1196
1115
        else:
1197
 
            # We're remote
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)
 
1116
            self.window.set_view_to_remotebranch()
1226
1117
    
1227
1118
    def refresh_left(self):
1228
1119
        """ Refresh the bookmark list. """
1239
1130
 
1240
1131
        # Add them to the TreeStore
1241
1132
        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])
1245
1133
 
 
1134
        # Get titles and sort by title
 
1135
        bookmarks = [[self.pref.get_bookmark_title(item), item] for item in bookmarks]
 
1136
        bookmarks.sort()
 
1137
        for title_item in bookmarks:
 
1138
            treestore.append(titer, title_item)
 
1139
        
1246
1140
        # Add the TreeStore to the TreeView
1247
1141
        self.treeview_left.set_model(treestore)
1248
1142
 
1302
1196
                try:
1303
1197
                    statinfo = os.stat(self.path + os.sep + item)
1304
1198
                except OSError, e:
1305
 
                    if e.errno == 40:
 
1199
                    if e.errno in self.acceptable_errors:
1306
1200
                        continue
1307
1201
                    else:
1308
1202
                        raise
1371
1265
                try:
1372
1266
                    statinfo = os.stat(self.path + os.sep + item)
1373
1267
                except OSError, e:
1374
 
                    if e.errno == 40:
 
1268
                    if e.errno in self.acceptable_errors:
1375
1269
                        continue
1376
1270
                    else:
1377
1271
                        raise
1480
1374
            if sys.platform == 'win32':
1481
1375
                print "pyWin32 modules needed to run Olive on Win32."
1482
1376
                sys.exit(1)
1483
 
            else:
1484
 
                pass
1485
1377
        
1486
1378
        driveletters = []
1487
1379
        for drive in string.ascii_uppercase:
1488
 
            if win32file.GetDriveType(drive+':') == win32file.DRIVE_FIXED:
 
1380
            if win32file.GetDriveType(drive+':') == win32file.DRIVE_FIXED or\
 
1381
                win32file.GetDriveType(drive+':') == win32file.DRIVE_REMOTE:
1489
1382
                driveletters.append(drive+':')
1490
1383
        return driveletters
1491
1384
    
1724
1617
                return self._get_default(option)
1725
1618
            except KeyError:
1726
1619
                return None
1727