/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: Szilveszter Farkas (Phanatic)
  • Date: 2007-05-18 16:01:10 UTC
  • mto: This revision was merged to the branch mainline in revision 201.
  • Revision ID: szilveszter.farkas@gmail.com-20070518160110-curir2hdf024r2e2
The History feature kinda works now, but still needs some polishing.

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
41
39
from bzrlib.ui import ui_factory
42
40
from bzrlib.workingtree import WorkingTree
43
41
 
44
 
from bzrlib.plugins.gtk import _i18n
45
42
from bzrlib.plugins.gtk.dialog import error_dialog, info_dialog, warning_dialog
46
43
from bzrlib.plugins.gtk.errors import show_bzr_error
47
44
from guifiles import GLADEFILENAME
58
55
from bzrlib.plugins.gtk.push import PushDialog
59
56
from bzrlib.plugins.gtk.revbrowser import RevisionBrowser
60
57
 
61
 
def about():
62
 
    """ 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
71
 
    dialog.set_version(__version__)
72
 
    dialog.set_authors([ _i18n("Lead Developer:"),
73
 
                         "Szilveszter Farkas <szilveszter.farkas@gmail.com>",
74
 
                         _i18n("Contributors:"),
75
 
                         "Jelmer Vernooij <jelmer@samba.org>",
76
 
                         "Mateusz Korniak <mateusz.korniak@ant.gliwice.pl>",
77
 
                         "Gary van der Merwe <garyvdm@gmail.com>" ])
78
 
    dialog.set_artists([ "Simon Pascal Klein <klepas@klepas.org>",
79
 
                         "Jakub Steiner <jimmac@novell.com>" ])
80
 
 
81
 
    dialog.run()
82
 
    # Destroy the dialog
83
 
    dialog.destroy()
84
 
 
85
58
class OliveGtk:
86
59
    """ The main Olive GTK frontend class. This is called when launching the
87
60
    program. """
106
79
        # Get some important menu items
107
80
        self.menuitem_add_files = self.toplevel.get_widget('menuitem_add_files')
108
81
        self.menuitem_remove_files = self.toplevel.get_widget('menuitem_remove_file')
109
 
        self.menuitem_file_bookmark = self.toplevel.get_widget('menuitem_file_bookmark')
110
82
        self.menuitem_file_make_directory = self.toplevel.get_widget('menuitem_file_make_directory')
111
83
        self.menuitem_file_rename = self.toplevel.get_widget('menuitem_file_rename')
112
84
        self.menuitem_file_move = self.toplevel.get_widget('menuitem_file_move')
113
85
        self.menuitem_file_annotate = self.toplevel.get_widget('menuitem_file_annotate')
114
86
        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
87
        self.menuitem_branch = self.toplevel.get_widget('menuitem_branch')
117
88
        self.menuitem_branch_init = self.toplevel.get_widget('menuitem_branch_initialize')
118
89
        self.menuitem_branch_get = self.toplevel.get_widget('menuitem_branch_get')
119
90
        self.menuitem_branch_checkout = self.toplevel.get_widget('menuitem_branch_checkout')
120
91
        self.menuitem_branch_pull = self.toplevel.get_widget('menuitem_branch_pull')
121
92
        self.menuitem_branch_push = self.toplevel.get_widget('menuitem_branch_push')
122
 
        self.menuitem_branch_update = self.toplevel.get_widget('menuitem_branch_update')
123
93
        self.menuitem_branch_revert = self.toplevel.get_widget('menuitem_branch_revert')
124
94
        self.menuitem_branch_merge = self.toplevel.get_widget('menuitem_branch_merge')
125
95
        self.menuitem_branch_commit = self.toplevel.get_widget('menuitem_branch_commit')
137
107
        self.toolbutton_commit = self.toplevel.get_widget('toolbutton_commit')
138
108
        self.toolbutton_pull = self.toplevel.get_widget('toolbutton_pull')
139
109
        self.toolbutton_push = self.toplevel.get_widget('toolbutton_push')
140
 
        self.toolbutton_update = self.toplevel.get_widget('toolbutton_update')
141
110
        # Get the drive selector
142
111
        self.combobox_drive = gtk.combo_box_new_text()
143
112
        self.combobox_drive.connect("changed", self._refresh_drives)
163
132
                "on_about_activate": self.on_about_activate,
164
133
                "on_menuitem_add_files_activate": self.on_menuitem_add_files_activate,
165
134
                "on_menuitem_remove_file_activate": self.on_menuitem_remove_file_activate,
166
 
                "on_menuitem_file_bookmark_activate": self.on_menuitem_file_bookmark_activate,
167
135
                "on_menuitem_file_make_directory_activate": self.on_menuitem_file_make_directory_activate,
168
136
                "on_menuitem_file_move_activate": self.on_menuitem_file_move_activate,
169
137
                "on_menuitem_file_rename_activate": self.on_menuitem_file_rename_activate,
170
138
                "on_menuitem_file_annotate_activate": self.on_menuitem_file_annotate_activate,
171
139
                "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
140
                "on_menuitem_view_refresh_activate": self.on_menuitem_view_refresh_activate,
174
141
                "on_menuitem_branch_initialize_activate": self.on_menuitem_branch_initialize_activate,
175
142
                "on_menuitem_branch_get_activate": self.on_menuitem_branch_get_activate,
179
146
                "on_menuitem_branch_commit_activate": self.on_menuitem_branch_commit_activate,
180
147
                "on_menuitem_branch_push_activate": self.on_menuitem_branch_push_activate,
181
148
                "on_menuitem_branch_pull_activate": self.on_menuitem_branch_pull_activate,
182
 
                "on_menuitem_branch_update_activate": self.on_menuitem_branch_update_activate,                
183
149
                "on_menuitem_branch_tags_activate": self.on_menuitem_branch_tags_activate,
184
150
                "on_menuitem_branch_status_activate": self.on_menuitem_branch_status_activate,
185
151
                "on_menuitem_branch_missing_revisions_activate": self.on_menuitem_branch_missing_revisions_activate,
194
160
                "on_toolbutton_commit_clicked": self.on_menuitem_branch_commit_activate,
195
161
                "on_toolbutton_pull_clicked": self.on_menuitem_branch_pull_activate,
196
162
                "on_toolbutton_push_clicked": self.on_menuitem_branch_push_activate,
197
 
                "on_toolbutton_update_clicked": self.on_menuitem_branch_update_activate,
198
163
                "on_treeview_right_button_press_event": self.on_treeview_right_button_press_event,
199
164
                "on_treeview_right_row_activated": self.on_treeview_right_row_activated,
200
165
                "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
166
                "on_treeview_left_row_activated": self.on_treeview_left_row_activated,
203
167
                "on_button_location_up_clicked": self.on_button_location_up_clicked,
204
168
                "on_button_location_jump_clicked": self.on_button_location_jump_clicked,
242
206
 
243
207
        # Apply menu state
244
208
        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'))
246
209
 
247
210
        # We're starting local
248
211
        self.remote = False
282
245
            self.remote_branch, self.remote_path = Branch.open_containing(path)
283
246
            
284
247
            if self.remote_revision is None:
285
 
                self.remote_revision = self.remote_branch.last_revision()
286
 
            
287
 
            self.remote_entries = self.remote_branch.repository.get_inventory(self.remote_revision).entries()
 
248
                self.remote_entries = self.remote_branch.repository.get_inventory(self.remote_branch.last_revision()).entries()
 
249
            else:
 
250
                self.remote_entries = self.remote_branch.repository.get_inventory(self.remote_revision).entries()
288
251
            
289
252
            if len(self.remote_path) == 0:
290
253
                self.remote_parent = self.remote_branch.repository.get_inventory(self.remote_branch.last_revision()).iter_entries_by_dir().next()[1].file_id
349
312
                self.remote_branch, self.remote_path = Branch.open_containing(path)
350
313
                
351
314
                if self.remote_revision is None:
352
 
                    self.remote_revision = self.remote_branch.last_revision()
353
 
                
354
 
                self.remote_entries = self.remote_branch.repository.get_inventory(self.remote_revision).entries()
 
315
                    self.remote_entries = self.remote_branch.repository.get_inventory(self.remote_branch.last_revision()).entries()
 
316
                else:
 
317
                    self.remote_entries = self.remote_branch.repository.get_inventory(self.remote_revision).entries()
355
318
                
356
319
                if len(self.remote_path) == 0:
357
320
                    self.remote_parent = self.remote_branch.repository.get_inventory(self.remote_branch.last_revision()).iter_entries_by_dir().next()[1].file_id
391
354
                return self.remote_branch.base
392
355
   
393
356
    def on_about_activate(self, widget):
 
357
        from bzrlib.plugins.gtk.dialog import about
394
358
        about()
 
359
        
395
360
    
396
361
    def on_button_history_browse_clicked(self, widget):
397
362
        """ Browse for revision button handler. """
443
408
            self.entry_history.set_sensitive(False)
444
409
            self.button_history.set_sensitive(False)
445
410
    
446
 
    @show_bzr_error
447
411
    def on_entry_history_revno_key_press_event(self, widget, event):
448
412
        """ 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'):
 
413
        if event.keyval == 65293:
450
414
            # Return was hit, so we have to load that specific revision
451
415
            # Emulate being remote, so inventory should be used
452
416
            path = self.get_path()
461
425
    
462
426
    def on_entry_location_key_press_event(self, widget, event):
463
427
        """ 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'):
 
428
        if event.keyval == 65293:
465
429
            # Return was hit, so we have to jump
466
430
            self.on_button_location_jump_clicked(widget)
467
431
    
508
472
    @show_bzr_error
509
473
    def on_menuitem_branch_commit_activate(self, widget):
510
474
        """ Branch/Commit... menu handler. """
511
 
#     def __init__(self, wt, wtpath, notbranch, selected=None, parent=None):
512
 
        selected = self.get_selected_right()
513
 
        if selected:
514
 
            selected = os.path.join(self.wtpath, selected)
515
 
        commit = CommitDialog(wt=self.wt,
516
 
                              parent=self.window,
517
 
                              selected=selected,
518
 
                             )
 
475
        commit = CommitDialog(self.wt, self.wtpath, self.notbranch, self.get_selected_right(), self.window)
519
476
        response = commit.run()
520
477
        if response != gtk.RESPONSE_NONE:
521
478
            commit.hide()
537
494
        from bzrlib.plugins.gtk.merge import MergeDialog
538
495
        
539
496
        if self.check_for_changes():
540
 
            error_dialog(_i18n('There are local changes in the branch'),
541
 
                         _i18n('Please commit or revert the changes before merging.'))
 
497
            error_dialog(_('There are local changes in the branch'),
 
498
                         _('Please commit or revert the changes before merging.'))
542
499
        else:
543
 
            parent_branch_path = self.wt.branch.get_parent()
544
 
            merge = MergeDialog(self.wt, self.wtpath,default_branch_path=parent_branch_path )
 
500
            merge = MergeDialog(self.wt, self.wtpath)
545
501
            merge.display()
546
502
 
547
503
    @show_bzr_error
548
504
    def on_menuitem_branch_missing_revisions_activate(self, widget):
549
505
        """ Branch/Missing revisions menu handler. """
550
 
        
551
 
        from bzrlib.missing import find_unmerged, iter_log_revisions
552
 
        
553
506
        local_branch = self.wt.branch
554
 
        parent_branch_path = local_branch.get_parent()
555
 
        if parent_branch_path is None:
556
 
            error_dialog(_i18n('Parent location is unknown'),
557
 
                         _i18n('Cannot determine missing revisions if no parent location is known.'))
 
507
        
 
508
        other_branch = local_branch.get_parent()
 
509
        if other_branch is None:
 
510
            error_dialog(_('Parent location is unknown'),
 
511
                         _('Cannot determine missing revisions if no parent location is known.'))
558
512
            return
559
513
        
560
 
        parent_branch = Branch.open(parent_branch_path)
561
 
        
562
 
        if parent_branch.base == local_branch.base:
563
 
            parent_branch = local_branch
564
 
        
565
 
        local_extra, remote_extra = find_unmerged(local_branch,parent_branch)
566
 
 
567
 
        if local_extra or remote_extra:
568
 
            
569
 
            ## def log_revision_one_line_text(log_revision):
570
 
            ##    """ Generates one line description of log_revison ended with end of line."""
571
 
            ##    revision = log_revision.rev
572
 
            ##    txt =  "- %s (%s)\n" % (revision.get_summary(), revision.committer, )
573
 
            ##    txt = txt.replace("<"," ") # Seems < > chars are expected to be xml tags ...
574
 
            ##    txt = txt.replace(">"," ")
575
 
            ##    return txt
576
 
            
577
 
            dlg_txt = ""
578
 
            if local_extra:
579
 
                dlg_txt += _i18n('%d local extra revision(s). \n') % (len(local_extra),) 
580
 
                ## NOTE: We do not want such ugly info about missing revisions
581
 
                ##       Revision Browser should be used there
582
 
                ## max_revisions = 10
583
 
                ## for log_revision in iter_log_revisions(local_extra, local_branch.repository, verbose=1):
584
 
                ##    dlg_txt += log_revision_one_line_text(log_revision)
585
 
                ##    if max_revisions <= 0:
586
 
                ##        dlg_txt += _i18n("more ... \n")
587
 
                ##        break
588
 
                ## max_revisions -= 1
589
 
            ## dlg_txt += "\n"
590
 
            if remote_extra:
591
 
                dlg_txt += _i18n('%d local missing revision(s).\n') % (len(remote_extra),) 
592
 
                ## max_revisions = 10
593
 
                ## for log_revision in iter_log_revisions(remote_extra, parent_branch.repository, verbose=1):
594
 
                ##    dlg_txt += log_revision_one_line_text(log_revision)
595
 
                ##    if max_revisions <= 0:
596
 
                ##        dlg_txt += _i18n("more ... \n")
597
 
                ##        break
598
 
                ##    max_revisions -= 1
599
 
                
600
 
            info_dialog(_i18n('There are missing revisions'),
601
 
                        dlg_txt)
 
514
        remote_branch = Branch.open(other_branch)
 
515
        
 
516
        if remote_branch.base == local_branch.base:
 
517
            remote_branch = local_branch
 
518
 
 
519
        ret = len(local_branch.missing_revisions(remote_branch))
 
520
 
 
521
        if ret > 0:
 
522
            info_dialog(_('There are missing revisions'),
 
523
                        _('%d revision(s) missing.') % ret)
602
524
        else:
603
 
            info_dialog(_i18n('Local branch up to date'),
604
 
                        _i18n('There are no missing revisions.'))
 
525
            info_dialog(_('Local branch up to date'),
 
526
                        _('There are no missing revisions.'))
605
527
 
606
528
    @show_bzr_error
607
529
    def on_menuitem_branch_pull_activate(self, widget):
610
532
 
611
533
        location = branch_to.get_parent()
612
534
        if location is None:
613
 
            error_dialog(_i18n('Parent location is unknown'),
614
 
                                     _i18n('Pulling is not possible until there is a parent location.'))
 
535
            error_dialog(_('Parent location is unknown'),
 
536
                                     _('Pulling is not possible until there is a parent location.'))
615
537
            return
616
538
 
617
539
        branch_from = Branch.open(location)
621
543
 
622
544
        ret = branch_to.pull(branch_from)
623
545
        
624
 
        info_dialog(_i18n('Pull successful'), _i18n('%d revision(s) pulled.') % ret)
625
 
        
626
 
    @show_bzr_error
627
 
    def on_menuitem_branch_update_activate(self, widget):
628
 
        """ Brranch/checkout update menu handler. """
629
 
        
630
 
        ret = self.wt.update()
631
 
        conflicts = self.wt.conflicts()
632
 
        if conflicts:
633
 
            info_dialog(_i18n('Update successful but conflicts generated'), _i18n('Number of conflicts generated: %d.') % (len(conflicts),) )
634
 
        else:
635
 
            info_dialog(_i18n('Update successful'), _i18n('No conflicts generated.') )
 
546
        info_dialog(_('Pull successful'), _('%d revision(s) pulled.') % ret)
636
547
    
637
548
    def on_menuitem_branch_push_activate(self, widget):
638
549
        """ Branch/Push... menu handler. """
639
 
        push = PushDialog(repository=None,revid=None,branch=self.wt.branch, parent=self.window)
 
550
        push = PushDialog(self.wt.branch, self.window)
640
551
        response = push.run()
641
552
        if response != gtk.RESPONSE_NONE:
642
553
            push.destroy()
646
557
        """ Branch/Revert all changes menu handler. """
647
558
        ret = self.wt.revert([])
648
559
        if ret:
649
 
            warning_dialog(_i18n('Conflicts detected'),
650
 
                           _i18n('Please have a look at the working tree before continuing.'))
 
560
            warning_dialog(_('Conflicts detected'),
 
561
                           _('Please have a look at the working tree before continuing.'))
651
562
        else:
652
 
            info_dialog(_i18n('Revert successful'),
653
 
                        _i18n('All files reverted to last revision.'))
 
563
            info_dialog(_('Revert successful'),
 
564
                        _('All files reverted to last revision.'))
654
565
        self.refresh_right()
655
566
    
656
567
    def on_menuitem_branch_status_activate(self, widget):
685
596
    def on_menuitem_file_annotate_activate(self, widget):
686
597
        """ File/Annotate... menu handler. """
687
598
        if self.get_selected_right() is None:
688
 
            error_dialog(_i18n('No file was selected'),
689
 
                         _i18n('Please select a file from the list.'))
 
599
            error_dialog(_('No file was selected'),
 
600
                         _('Please select a file from the list.'))
690
601
            return
691
602
        
692
603
        branch = self.wt.branch
693
604
        file_id = self.wt.path2id(self.wt.relpath(os.path.join(self.path, self.get_selected_right())))
694
605
        
695
 
        window = GAnnotateWindow(all=False, plain=False, parent=self.window)
 
606
        window = GAnnotateWindow(all=False, plain=False)
696
607
        window.set_title(os.path.join(self.path, self.get_selected_right()) + " - Annotate")
697
608
        config = GAnnotateConfig(window)
698
609
        window.show()
702
613
        finally:
703
614
            branch.unlock()
704
615
    
705
 
    def on_menuitem_file_bookmark_activate(self, widget):
706
 
        """ File/Bookmark current directory menu handler. """
707
 
        if self.pref.add_bookmark(self.path):
708
 
            info_dialog(_i18n('Bookmark successfully added'),
709
 
                        _i18n('The current directory was bookmarked. You can reach\nit by selecting it from the left panel.'))
710
 
            self.pref.write()
711
 
        else:
712
 
            warning_dialog(_i18n('Location already bookmarked'),
713
 
                           _i18n('The current directory is already bookmarked.\nSee the left panel for reference.'))
714
 
        
715
 
        self.refresh_left()
716
 
    
717
616
    def on_menuitem_file_make_directory_activate(self, widget):
718
617
        """ File/Make directory... menu handler. """
719
618
        from mkdir import OliveMkdir
751
650
    
752
651
    def on_menuitem_stats_diff_activate(self, widget):
753
652
        """ Statistics/Differences... menu handler. """
754
 
        window = DiffWindow(parent=self.window)
 
653
        window = DiffWindow()
755
654
        parent_tree = self.wt.branch.repository.revision_tree(self.wt.branch.last_revision())
756
655
        window.set_diff(self.wt.branch.nick, self.wt, parent_tree)
757
656
        window.show()
767
666
    
768
667
    def on_menuitem_stats_log_activate(self, widget):
769
668
        """ Statistics/Log... menu handler. """
770
 
 
 
669
        window = branchwin.BranchWindow()
771
670
        if not self.remote:
772
 
            branch = self.wt.branch
 
671
            window.set_branch(self.wt.branch, self.wt.branch.last_revision(), None)
773
672
        else:
774
 
            branch = self.remote_branch
775
 
 
776
 
        window = branchwin.BranchWindow(branch, branch.last_revision(), None, parent=self.window)
 
673
            window.set_branch(self.remote_branch, self.remote_branch.last_revision(), None)
777
674
        window.show()
778
675
    
779
676
    def on_menuitem_view_refresh_activate(self, widget):
789
686
        if self.path is not None:
790
687
            self.refresh_right()
791
688
 
792
 
    def on_menuitem_view_show_ignored_files_activate(self, widget):
793
 
        """ Hide/Show ignored files menu handler. """
794
 
        self.pref.set_preference('ignored_files', widget.get_active())
795
 
        if self.path is not None:
796
 
            self.refresh_right()
797
 
            
798
689
    def on_treeview_left_button_press_event(self, widget, event):
799
690
        """ Occurs when somebody right-clicks in the bookmark list. """
800
691
        if event.button == 3:
811
702
            menu.left_context_menu().popup(None, None, None, 0,
812
703
                                           event.time)
813
704
 
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()
827
 
 
828
705
    def on_treeview_left_row_activated(self, treeview, path, view_column):
829
706
        """ Occurs when somebody double-clicks or enters an item in the
830
707
        bookmark list. """
940
817
        bookmarks = self.pref.get_bookmarks()
941
818
        
942
819
        # Add them to the TreeStore
943
 
        titer = treestore.append(None, [_i18n('Bookmarks'), None])
 
820
        titer = treestore.append(None, [_('Bookmarks'), None])
944
821
        for item in bookmarks:
945
822
            title = self.pref.get_bookmark_title(item)
946
823
            treestore.append(titer, [title, item])
947
824
        
948
825
        # Create the column and add it to the TreeView
949
826
        self.treeview_left.set_model(treestore)
950
 
        tvcolumn_bookmark = gtk.TreeViewColumn(_i18n('Bookmark'))
 
827
        tvcolumn_bookmark = gtk.TreeViewColumn(_('Bookmark'))
951
828
        self.treeview_left.append_column(tvcolumn_bookmark)
952
829
        
953
830
        # Set up the cells
961
838
    def _load_right(self):
962
839
        """ Load data into the right panel. (Filelist) """
963
840
        # Create ListStore
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,
967
 
                                  gobject.TYPE_STRING,
968
 
                                  gobject.TYPE_STRING,
969
 
                                  gobject.TYPE_STRING,
970
 
                                  gobject.TYPE_STRING,
971
 
                                  gobject.TYPE_STRING,
972
 
                                  gobject.TYPE_INT,
973
 
                                  gobject.TYPE_STRING,
974
 
                                  gobject.TYPE_STRING)
 
841
        # Model: [icon, dir, name, status text, status, size (int), size (human), mtime (int), mtime (local)]
 
842
        liststore = gtk.ListStore(str, gobject.TYPE_BOOLEAN, str, str, str, gobject.TYPE_INT, gobject.TYPE_STRING, gobject.TYPE_INT, gobject.TYPE_STRING)
975
843
        
976
844
        dirs = []
977
845
        files = []
994
862
        
995
863
        # Add'em to the ListStore
996
864
        for item in dirs:
997
 
            try:
998
 
                statinfo = os.stat(self.path + os.sep + item)
999
 
            except OSError, e:
1000
 
                if e.errno == 40:
1001
 
                    continue
1002
 
                else:
1003
 
                    raise
1004
 
            liststore.append([ gtk.STOCK_DIRECTORY,
1005
 
                               True,
1006
 
                               item,
1007
 
                               '',
1008
 
                               '',
1009
 
                               "<DIR>",
1010
 
                               "<DIR>",
1011
 
                               statinfo.st_mtime,
1012
 
                               self._format_date(statinfo.st_mtime),
1013
 
                               ''])
 
865
            statinfo = os.stat(self.path + os.sep + item)
 
866
            liststore.append([gtk.STOCK_DIRECTORY, True, item, '', '', statinfo.st_size, self._format_size(statinfo.st_size), statinfo.st_mtime, self._format_date(statinfo.st_mtime)])
1014
867
        for item in files:
1015
868
            status = 'unknown'
1016
 
            fileid = ''
1017
869
            if not self.notbranch:
1018
870
                filename = self.wt.relpath(self.path + os.sep + item)
1019
871
                
1023
875
                    for rpath, rpathnew, id, kind, text_modified, meta_modified in delta.renamed:
1024
876
                        if rpathnew == filename:
1025
877
                            status = 'renamed'
1026
 
                            fileid = id
1027
878
                    for rpath, id, kind in delta.added:
1028
879
                        if rpath == filename:
1029
880
                            status = 'added'
1030
 
                            fileid = id
1031
881
                    for rpath, id, kind in delta.removed:
1032
882
                        if rpath == filename:
1033
883
                            status = 'removed'
1034
 
                            fileid = id
1035
884
                    for rpath, id, kind, text_modified, meta_modified in delta.modified:
1036
885
                        if rpath == filename:
1037
886
                            status = 'modified'
1038
 
                            fileid = id
1039
887
                    for rpath, id, kind in delta.unchanged:
1040
888
                        if rpath == filename:
1041
889
                            status = 'unchanged'
1042
 
                            fileid = id
1043
890
                    for rpath, file_class, kind, id, entry in self.wt.list_files():
1044
891
                        if rpath == filename and file_class == 'I':
1045
892
                            status = 'ignored'
1046
893
                finally:
1047
894
                    self.wt.unlock()
1048
895
            
 
896
            #try:
 
897
            #    status = fileops.status(path + os.sep + item)
 
898
            #except errors.PermissionDenied:
 
899
            #    continue
 
900
            
1049
901
            if status == 'renamed':
1050
 
                st = _i18n('renamed')
 
902
                st = _('renamed')
1051
903
            elif status == 'removed':
1052
 
                st = _i18n('removed')
 
904
                st = _('removed')
1053
905
            elif status == 'added':
1054
 
                st = _i18n('added')
 
906
                st = _('added')
1055
907
            elif status == 'modified':
1056
 
                st = _i18n('modified')
 
908
                st = _('modified')
1057
909
            elif status == 'unchanged':
1058
 
                st = _i18n('unchanged')
 
910
                st = _('unchanged')
1059
911
            elif status == 'ignored':
1060
 
                st = _i18n('ignored')
 
912
                st = _('ignored')
1061
913
            else:
1062
 
                st = _i18n('unknown')
 
914
                st = _('unknown')
1063
915
            
1064
 
            try:
1065
 
                statinfo = os.stat(self.path + os.sep + item)
1066
 
            except OSError, e:
1067
 
                if e.errno == 40:
1068
 
                    continue
1069
 
                else:
1070
 
                    raise
1071
 
            liststore.append([gtk.STOCK_FILE,
1072
 
                              False,
1073
 
                              item,
1074
 
                              st,
1075
 
                              status,
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),
1078
 
                              statinfo.st_mtime,
1079
 
                              self._format_date(statinfo.st_mtime),
1080
 
                              fileid])
 
916
            statinfo = os.stat(self.path + os.sep + item)
 
917
            liststore.append([gtk.STOCK_FILE, False, item, st, status, statinfo.st_size, self._format_size(statinfo.st_size), statinfo.st_mtime, self._format_date(statinfo.st_mtime)])
1081
918
        
1082
919
        # Create the columns and add them to the TreeView
1083
920
        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'))
 
921
        self._tvcolumn_filename = gtk.TreeViewColumn(_('Filename'))
 
922
        self._tvcolumn_status = gtk.TreeViewColumn(_('Status'))
 
923
        self._tvcolumn_size = gtk.TreeViewColumn(_('Size'))
 
924
        self._tvcolumn_mtime = gtk.TreeViewColumn(_('Last modified'))
1088
925
        self.treeview_right.append_column(self._tvcolumn_filename)
1089
926
        self.treeview_right.append_column(self._tvcolumn_status)
1090
927
        self.treeview_right.append_column(self._tvcolumn_size)
1123
960
        # Set sensitivity
1124
961
        self.set_sensitivity()
1125
962
        
1126
 
    def get_selected_fileid(self):
1127
 
        """ Get the file_id of the selected file. """
1128
 
        treeselection = self.treeview_right.get_selection()
1129
 
        (model, iter) = treeselection.get_selected()
1130
 
        
1131
 
        if iter is None:
1132
 
            return None
1133
 
        else:
1134
 
            return model.get_value(iter, 9)
1135
 
    
1136
963
    def get_selected_right(self):
1137
964
        """ Get the selected filename. """
1138
965
        treeselection = self.treeview_right.get_selection()
1170
997
            self.menuitem_branch_checkout.set_sensitive(self.notbranch)
1171
998
            self.menuitem_branch_pull.set_sensitive(not self.notbranch)
1172
999
            self.menuitem_branch_push.set_sensitive(not self.notbranch)
1173
 
            self.menuitem_branch_update.set_sensitive(not self.notbranch)
1174
1000
            self.menuitem_branch_revert.set_sensitive(not self.notbranch)
1175
1001
            self.menuitem_branch_merge.set_sensitive(not self.notbranch)
1176
1002
            self.menuitem_branch_commit.set_sensitive(not self.notbranch)
1192
1018
            self.toolbutton_commit.set_sensitive(not self.notbranch)
1193
1019
            self.toolbutton_pull.set_sensitive(not self.notbranch)
1194
1020
            self.toolbutton_push.set_sensitive(not self.notbranch)
1195
 
            self.toolbutton_update.set_sensitive(not self.notbranch)
1196
1021
        else:
1197
1022
            # We're remote
1198
1023
            self.menuitem_branch_init.set_sensitive(False)
1200
1025
            self.menuitem_branch_checkout.set_sensitive(True)
1201
1026
            self.menuitem_branch_pull.set_sensitive(False)
1202
1027
            self.menuitem_branch_push.set_sensitive(False)
1203
 
            self.menuitem_branch_update.set_sensitive(False)
1204
1028
            self.menuitem_branch_revert.set_sensitive(False)
1205
1029
            self.menuitem_branch_merge.set_sensitive(False)
1206
1030
            self.menuitem_branch_commit.set_sensitive(False)
1222
1046
            self.toolbutton_commit.set_sensitive(False)
1223
1047
            self.toolbutton_pull.set_sensitive(False)
1224
1048
            self.toolbutton_push.set_sensitive(False)
1225
 
            self.toolbutton_update.set_sensitive(False)
1226
1049
    
1227
1050
    def refresh_left(self):
1228
1051
        """ Refresh the bookmark list. """
1238
1061
        bookmarks = self.pref.get_bookmarks()
1239
1062
 
1240
1063
        # Add them to the TreeStore
1241
 
        titer = treestore.append(None, [_i18n('Bookmarks'), None])
 
1064
        titer = treestore.append(None, [_('Bookmarks'), None])
1242
1065
        for item in bookmarks:
1243
1066
            title = self.pref.get_bookmark_title(item)
1244
1067
            treestore.append(titer, [title, item])
1274
1097
    
1275
1098
            # Fill the appropriate lists
1276
1099
            dotted_files = self.pref.get_preference('dotted_files', 'bool')
1277
 
            ignored_files = self.pref.get_preference('ignored_files', 'bool')
1278
 
 
1279
1100
            for item in os.listdir(path):
1280
1101
                if not dotted_files and item[0] == '.':
1281
1102
                    continue
1299
1120
                
1300
1121
            # Add'em to the ListStore
1301
1122
            for item in dirs:
1302
 
                try:
1303
 
                    statinfo = os.stat(self.path + os.sep + item)
1304
 
                except OSError, e:
1305
 
                    if e.errno == 40:
1306
 
                        continue
1307
 
                    else:
1308
 
                        raise
1309
 
                liststore.append([gtk.STOCK_DIRECTORY,
1310
 
                                  True,
1311
 
                                  item,
1312
 
                                  '',
1313
 
                                  '',
1314
 
                                  "<DIR>",
1315
 
                                  "<DIR>",
1316
 
                                  statinfo.st_mtime,
1317
 
                                  self._format_date(statinfo.st_mtime),
1318
 
                                  ''])
 
1123
                statinfo = os.stat(self.path + os.sep + item)
 
1124
                liststore.append([gtk.STOCK_DIRECTORY, True, item, '', '', statinfo.st_size, self._format_size(statinfo.st_size), statinfo.st_mtime, self._format_date(statinfo.st_mtime)])
1319
1125
            for item in files:
1320
1126
                status = 'unknown'
1321
 
                fileid = ''
1322
1127
                if not notbranch:
1323
1128
                    filename = tree1.relpath(path + os.sep + item)
1324
1129
                    
1328
1133
                        for rpath, rpathnew, id, kind, text_modified, meta_modified in delta.renamed:
1329
1134
                            if rpathnew == filename:
1330
1135
                                status = 'renamed'
1331
 
                                fileid = id
1332
1136
                        for rpath, id, kind in delta.added:
1333
1137
                            if rpath == filename:
1334
 
                                status = 'added'
1335
 
                                fileid = id
 
1138
                                status = 'added'                
1336
1139
                        for rpath, id, kind in delta.removed:
1337
1140
                            if rpath == filename:
1338
1141
                                status = 'removed'
1339
 
                                fileid = id
1340
1142
                        for rpath, id, kind, text_modified, meta_modified in delta.modified:
1341
1143
                            if rpath == filename:
1342
1144
                                status = 'modified'
1343
 
                                fileid = id
1344
1145
                        for rpath, id, kind in delta.unchanged:
1345
1146
                            if rpath == filename:
1346
1147
                                status = 'unchanged'
1347
 
                                fileid = id
1348
1148
                        for rpath, file_class, kind, id, entry in self.wt.list_files():
1349
1149
                            if rpath == filename and file_class == 'I':
1350
1150
                                status = 'ignored'
1352
1152
                        self.wt.unlock()
1353
1153
                
1354
1154
                if status == 'renamed':
1355
 
                    st = _i18n('renamed')
 
1155
                    st = _('renamed')
1356
1156
                elif status == 'removed':
1357
 
                    st = _i18n('removed')
 
1157
                    st = _('removed')
1358
1158
                elif status == 'added':
1359
 
                    st = _i18n('added')
 
1159
                    st = _('added')
1360
1160
                elif status == 'modified':
1361
 
                    st = _i18n('modified')
 
1161
                    st = _('modified')
1362
1162
                elif status == 'unchanged':
1363
 
                    st = _i18n('unchanged')
 
1163
                    st = _('unchanged')
1364
1164
                elif status == 'ignored':
1365
 
                    st = _i18n('ignored')
1366
 
                    if not ignored_files:
1367
 
                        continue
 
1165
                    st = _('ignored')
1368
1166
                else:
1369
 
                    st = _i18n('unknown')
 
1167
                    st = _('unknown')
1370
1168
                
1371
 
                try:
1372
 
                    statinfo = os.stat(self.path + os.sep + item)
1373
 
                except OSError, e:
1374
 
                    if e.errno == 40:
1375
 
                        continue
1376
 
                    else:
1377
 
                        raise
1378
 
                liststore.append([gtk.STOCK_FILE,
1379
 
                                  False,
1380
 
                                  item,
1381
 
                                  st,
1382
 
                                  status,
1383
 
                                  str(statinfo.st_size),
1384
 
                                  self._format_size(statinfo.st_size),
1385
 
                                  statinfo.st_mtime,
1386
 
                                  self._format_date(statinfo.st_mtime),
1387
 
                                  fileid])
 
1169
                statinfo = os.stat(self.path + os.sep + item)
 
1170
                liststore.append([gtk.STOCK_FILE, False, item, st, status, statinfo.st_size, self._format_size(statinfo.st_size), statinfo.st_mtime, self._format_date(statinfo.st_mtime)])
1388
1171
        else:
1389
1172
            # We're remote
1390
1173
            
1437
1220
                                       item.name,
1438
1221
                                       '',
1439
1222
                                       '',
1440
 
                                       "<DIR>",
1441
 
                                       "<DIR>",
 
1223
                                       0,
 
1224
                                       self._format_size(0),
1442
1225
                                       rev.timestamp,
1443
 
                                       self._format_date(rev.timestamp),
1444
 
                                       ''
 
1226
                                       self._format_date(rev.timestamp)
1445
1227
                                   ])
1446
1228
                while gtk.events_pending():
1447
1229
                    gtk.main_iteration()
1454
1236
                                       item.name,
1455
1237
                                       '',
1456
1238
                                       '',
1457
 
                                       str(item.text_size),
 
1239
                                       item.text_size,
1458
1240
                                       self._format_size(item.text_size),
1459
1241
                                       rev.timestamp,
1460
 
                                       self._format_date(rev.timestamp),
1461
 
                                       item.file_id
 
1242
                                       self._format_date(rev.timestamp)
1462
1243
                                   ])
1463
1244
                while gtk.events_pending():
1464
1245
                    gtk.main_iteration()
1556
1337
    
1557
1338
    def _format_size(self, size):
1558
1339
        """ Format size to a human readable format. """
1559
 
        if size < 1000:
1560
 
            return "%d[B]" % (size,)
1561
 
        size = size / 1000.0
1562
 
        
1563
 
        for metric in ["kB","MB","GB","TB"]:
1564
 
            if size < 1000:
1565
 
                break
1566
 
            size = size / 1000.0
1567
 
        return "%.1f[%s]" % (size,metric) 
 
1340
        return size
1568
1341
    
1569
1342
    def _format_date(self, timestamp):
1570
1343
        """ Format the time (given in secs) to a human readable format. """
1606
1379
        # Some default options
1607
1380
        self.defaults = { 'strict_commit' : False,
1608
1381
                          'dotted_files'  : False,
1609
 
                          'ignored_files' : True,
1610
1382
                          'window_width'  : 700,
1611
1383
                          'window_height' : 400,
1612
1384
                          'window_x'      : 40,