/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 diff.py

  • Committer: David Planella
  • Date: 2011-03-06 08:24:07 UTC
  • mfrom: (718 trunk)
  • mto: This revision was merged to the branch mainline in revision 719.
  • Revision ID: david.planella@ubuntu.com-20110306082407-y9zwkjje5oue9egw
Added preliminary internationalization support. Merged from trunk.

Show diffs side-by-side

added added

removed removed

Lines of Context:
10
10
 
11
11
from cStringIO import StringIO
12
12
 
13
 
from gi.repository import Gtk
14
 
from gi.repository import Pango
 
13
import pygtk
 
14
pygtk.require("2.0")
 
15
import gtk
 
16
import pango
15
17
import os
16
18
import re
17
19
import sys
22
24
    from elementtree.ElementTree import Element, SubElement, tostring
23
25
 
24
26
try:
25
 
    from gi.repository import GtkSource
 
27
    import gtksourceview2
26
28
    have_gtksourceview = True
27
29
except ImportError:
28
30
    have_gtksourceview = False
29
31
try:
30
 
    from gi.repository import GConf
 
32
    import gconf
31
33
    have_gconf = True
32
34
except ImportError:
33
35
    have_gconf = False
39
41
    urlutils,
40
42
    workingtree,
41
43
)
42
 
from bzrlib.diff import show_diff_trees
 
44
from bzrlib.diff import show_diff_trees, internal_diff
43
45
from bzrlib.patches import parse_patches
44
46
from bzrlib.trace import warning
45
 
from bzrlib.plugins.gtk.dialog import (
46
 
    error_dialog,
47
 
    info_dialog,
48
 
    warning_dialog,
49
 
    )
50
 
from bzrlib.plugins.gtk.i18n import _i18n
 
47
from bzrlib.plugins.gtk import _i18n
51
48
from bzrlib.plugins.gtk.window import Window
 
49
from dialog import error_dialog, info_dialog, warning_dialog
52
50
 
53
51
 
54
52
def fallback_guess_language(slm, content_type):
64
62
    pass
65
63
 
66
64
 
67
 
class DiffFileView(Gtk.ScrolledWindow):
 
65
class DiffFileView(gtk.ScrolledWindow):
68
66
    """Window for displaying diffs from a diff file"""
69
67
 
70
68
    def __init__(self):
71
 
        Gtk.ScrolledWindow.__init__(self)
 
69
        gtk.ScrolledWindow.__init__(self)
72
70
        self.construct()
73
71
        self._diffs = {}
74
72
 
75
73
    def construct(self):
76
 
        self.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
77
 
        self.set_shadow_type(Gtk.ShadowType.IN)
 
74
        self.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
 
75
        self.set_shadow_type(gtk.SHADOW_IN)
78
76
 
79
77
        if have_gtksourceview:
80
 
            self.buffer = GtkSource.Buffer()
81
 
            lang_manager = GtkSource.LanguageManager.get_default()
82
 
            language = lang_manager.guess_language(None, "text/x-patch")
 
78
            self.buffer = gtksourceview2.Buffer()
 
79
            slm = gtksourceview2.LanguageManager()
 
80
            guess_language = getattr(gtksourceview2.LanguageManager, 
 
81
                "guess_language", fallback_guess_language)
 
82
            gsl = guess_language(slm, content_type="text/x-patch")
83
83
            if have_gconf:
84
84
                self.apply_gedit_colors(self.buffer)
85
85
            self.apply_colordiff_colors(self.buffer)
86
 
            self.buffer.set_language(language)
 
86
            self.buffer.set_language(gsl)
87
87
            self.buffer.set_highlight_syntax(True)
88
88
 
89
 
            self.sourceview = GtkSource.View(buffer=self.buffer)
 
89
            self.sourceview = gtksourceview2.View(self.buffer)
90
90
        else:
91
 
            self.buffer = Gtk.TextBuffer()
92
 
            self.sourceview = Gtk.TextView(self.buffer)
 
91
            self.buffer = gtk.TextBuffer()
 
92
            self.sourceview = gtk.TextView(self.buffer)
93
93
 
94
94
        self.sourceview.set_editable(False)
95
 
        self.sourceview.modify_font(Pango.FontDescription("Monospace"))
 
95
        self.sourceview.modify_font(pango.FontDescription("Monospace"))
96
96
        self.add(self.sourceview)
97
97
        self.sourceview.show()
98
98
 
102
102
 
103
103
        This method needs the gconf module.
104
104
 
105
 
        :param buf: a GtkSource.Buffer object.
 
105
        :param buf: a gtksourceview2.Buffer object.
106
106
        """
107
107
        GEDIT_SCHEME_PATH = '/apps/gedit-2/preferences/editor/colors/scheme'
108
108
        GEDIT_USER_STYLES_PATH = os.path.expanduser('~/.gnome2/gedit/styles')
109
109
 
110
 
        client = GConf.Client.get_default()
 
110
        client = gconf.client_get_default()
111
111
        style_scheme_name = client.get_string(GEDIT_SCHEME_PATH)
112
112
        if style_scheme_name is not None:
113
 
            style_scheme_mgr = GtkSource.StyleSchemeManager()
 
113
            style_scheme_mgr = gtksourceview2.StyleSchemeManager()
114
114
            style_scheme_mgr.append_search_path(GEDIT_USER_STYLES_PATH)
115
115
            
116
116
            style_scheme = style_scheme_mgr.get_scheme(style_scheme_name)
124
124
 
125
125
        Both ~/.colordiffrc and ~/.colordiffrc.bzr-gtk are read.
126
126
 
127
 
        :param buf: a "Diff" GtkSource.Buffer object.
 
127
        :param buf: a "Diff" gtksourceview2.Buffer object.
128
128
        """
129
 
        scheme_manager = GtkSource.StyleSchemeManager()
 
129
        scheme_manager = gtksourceview2.StyleSchemeManager()
130
130
        style_scheme = scheme_manager.get_scheme('colordiff')
131
131
        
132
132
        # if style scheme not found, we'll generate it from colordiffrc
280
280
        self.buffer.set_text(decoded.encode('UTF-8'))
281
281
 
282
282
 
283
 
class DiffWidget(Gtk.HPaned):
 
283
class DiffWidget(gtk.HPaned):
284
284
    """Diff widget
285
285
 
286
286
    """
288
288
        super(DiffWidget, self).__init__()
289
289
 
290
290
        # The file hierarchy: a scrollable treeview
291
 
        scrollwin = Gtk.ScrolledWindow()
292
 
        scrollwin.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC)
293
 
        scrollwin.set_shadow_type(Gtk.ShadowType.IN)
 
291
        scrollwin = gtk.ScrolledWindow()
 
292
        scrollwin.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
 
293
        scrollwin.set_shadow_type(gtk.SHADOW_IN)
294
294
        self.pack1(scrollwin)
295
295
        scrollwin.show()
296
296
        
297
 
        self.model = Gtk.TreeStore(str, str)
298
 
        self.treeview = Gtk.TreeView(model=self.model)
 
297
        self.model = gtk.TreeStore(str, str)
 
298
        self.treeview = gtk.TreeView(self.model)
299
299
        self.treeview.set_headers_visible(False)
300
300
        self.treeview.set_search_column(1)
301
301
        self.treeview.connect("cursor-changed", self._treeview_cursor_cb)
302
302
        scrollwin.add(self.treeview)
303
303
        self.treeview.show()
304
304
 
305
 
        cell = Gtk.CellRendererText()
 
305
        cell = gtk.CellRendererText()
306
306
        cell.set_property("width-chars", 20)
307
 
        column = Gtk.TreeViewColumn()
308
 
        column.pack_start(cell, True)
 
307
        column = gtk.TreeViewColumn()
 
308
        column.pack_start(cell, expand=True)
309
309
        column.add_attribute(cell, "text", 0)
310
310
        self.treeview.append_column(column)
311
311
 
382
382
                    break
383
383
        if tv_path is None:
384
384
            raise errors.NoSuchFile(file_path)
385
 
        self.treeview.set_cursor(tv_path, None, False)
 
385
        self.treeview.set_cursor(tv_path)
386
386
        self.treeview.scroll_to_cell(tv_path)
387
387
 
388
388
    def _treeview_cursor_cb(self, *args):
399
399
    def _on_wraplines_toggled(self, widget=None, wrap=False):
400
400
        """Callback for when the wrap lines checkbutton is toggled"""
401
401
        if wrap or widget.get_active():
402
 
            self.diff_view.sourceview.set_wrap_mode(Gtk.WrapMode.WORD)
 
402
            self.diff_view.sourceview.set_wrap_mode(gtk.WRAP_WORD)
403
403
        else:
404
 
            self.diff_view.sourceview.set_wrap_mode(Gtk.WrapMode.NONE)
 
404
            self.diff_view.sourceview.set_wrap_mode(gtk.WRAP_NONE)
405
405
 
406
406
class DiffWindow(Window):
407
407
    """Diff window.
425
425
 
426
426
    def construct(self, operations):
427
427
        """Construct the window contents."""
428
 
        self.vbox = Gtk.VBox()
 
428
        self.vbox = gtk.VBox()
429
429
        self.add(self.vbox)
430
430
        self.vbox.show()
431
431
        self.diff = DiffWidget()
440
440
        
441
441
    
442
442
    def _get_menu_bar(self):
443
 
        menubar = Gtk.MenuBar()
 
443
        menubar = gtk.MenuBar()
444
444
        # View menu
445
 
        mb_view = Gtk.MenuItem(label=_i18n("_View"))
446
 
        mb_view_menu = Gtk.Menu()
447
 
        mb_view_wrapsource = Gtk.CheckMenuItem(
448
 
            label=_i18n("Wrap _Long Lines"))
 
445
        mb_view = gtk.MenuItem(_i18n("_View"))
 
446
        mb_view_menu = gtk.Menu()
 
447
        mb_view_wrapsource = gtk.CheckMenuItem(_i18n("Wrap _Long Lines"))
449
448
        mb_view_wrapsource.connect('activate', self.diff._on_wraplines_toggled)
450
449
        mb_view_wrapsource.show()
451
450
        mb_view_menu.append(mb_view_wrapsource)
463
462
        """
464
463
        if operations is None:
465
464
            return None
466
 
        hbox = Gtk.HButtonBox()
467
 
        hbox.set_layout(Gtk.ButtonBoxStyle.START)
 
465
        hbox = gtk.HButtonBox()
 
466
        hbox.set_layout(gtk.BUTTONBOX_START)
468
467
        for title, method in operations:
469
 
            merge_button = Gtk.Button(title)
 
468
            merge_button = gtk.Button(title)
470
469
            merge_button.show()
471
 
            merge_button.set_relief(Gtk.ReliefStyle.NONE)
 
470
            merge_button.set_relief(gtk.RELIEF_NONE)
472
471
            merge_button.connect("clicked", method)
473
472
            hbox.pack_start(merge_button, expand=False, fill=True)
474
473
        hbox.show()
475
474
        return hbox
476
475
 
477
476
    def _get_merge_target(self):
478
 
        d = Gtk.FileChooserDialog('Merge branch', self,
479
 
                                  Gtk.FileChooserAction.SELECT_FOLDER,
480
 
                                  buttons=(Gtk.STOCK_OK, Gtk.ResponseType.OK,
481
 
                                           Gtk.STOCK_CANCEL,
482
 
                                           Gtk.ResponseType.CANCEL,))
 
477
        d = gtk.FileChooserDialog('Merge branch', self,
 
478
                                  gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER,
 
479
                                  buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK,
 
480
                                           gtk.STOCK_CANCEL,
 
481
                                           gtk.RESPONSE_CANCEL,))
483
482
        try:
484
483
            result = d.run()
485
 
            if result != Gtk.ResponseType.OK:
 
484
            if result != gtk.RESPONSE_OK:
486
485
                raise SelectCancelled()
487
486
            return d.get_current_folder_uri()
488
487
        finally:
502
501
        error_dialog('Error', str(e))
503
502
 
504
503
    def _get_save_path(self, basename):
505
 
        d = Gtk.FileChooserDialog('Save As', self,
506
 
                                  Gtk.FileChooserAction.SAVE,
507
 
                                  buttons=(Gtk.STOCK_OK, Gtk.ResponseType.OK,
508
 
                                           Gtk.STOCK_CANCEL,
509
 
                                           Gtk.ResponseType.CANCEL,))
 
504
        d = gtk.FileChooserDialog('Save As', self,
 
505
                                  gtk.FILE_CHOOSER_ACTION_SAVE,
 
506
                                  buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK,
 
507
                                           gtk.STOCK_CANCEL,
 
508
                                           gtk.RESPONSE_CANCEL,))
510
509
        d.set_current_name(basename)
511
510
        try:
512
511
            result = d.run()
513
 
            if result != Gtk.ResponseType.OK:
 
512
            if result != gtk.RESPONSE_OK:
514
513
                raise SelectCancelled()
515
514
            return urlutils.local_path_from_url(d.get_uri())
516
515
        finally: