/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: 2010-08-21 09:38:06 UTC
  • mto: This revision was merged to the branch mainline in revision 719.
  • Revision ID: david.planella@ubuntu.com-20100821093806-9u7cq5gcaml6k2ln
Added the rest of files necessary for i18n support in the build system

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
 
        super(DiffFileView, self).__init__()
 
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
 
        GEDIT_USER_STYLES_PATH = os.path.expanduser('~/.gnome2/gedit/styles')
109
108
 
110
 
        client = GConf.Client.get_default()
 
109
        client = gconf.client_get_default()
111
110
        style_scheme_name = client.get_string(GEDIT_SCHEME_PATH)
112
111
        if style_scheme_name is not None:
113
 
            style_scheme_mgr = GtkSource.StyleSchemeManager()
114
 
            style_scheme_mgr.append_search_path(GEDIT_USER_STYLES_PATH)
115
 
            
116
 
            style_scheme = style_scheme_mgr.get_scheme(style_scheme_name)
117
 
            
118
 
            if style_scheme is not None:
119
 
                buf.set_style_scheme(style_scheme)
 
112
            style_scheme = gtksourceview2.StyleSchemeManager().get_scheme(style_scheme_name)
 
113
            
 
114
            buf.set_style_scheme(style_scheme)
120
115
 
121
116
    @classmethod
122
117
    def apply_colordiff_colors(klass, buf):
124
119
 
125
120
        Both ~/.colordiffrc and ~/.colordiffrc.bzr-gtk are read.
126
121
 
127
 
        :param buf: a "Diff" GtkSource.Buffer object.
 
122
        :param buf: a "Diff" gtksourceview2.Buffer object.
128
123
        """
129
 
        scheme_manager = GtkSource.StyleSchemeManager()
 
124
        scheme_manager = gtksourceview2.StyleSchemeManager()
130
125
        style_scheme = scheme_manager.get_scheme('colordiff')
131
126
        
132
127
        # if style scheme not found, we'll generate it from colordiffrc
250
245
    """This is the soft and chewy filling for a DiffWindow."""
251
246
 
252
247
    def __init__(self):
253
 
        super(DiffView, self).__init__()
 
248
        DiffFileView.__init__(self)
254
249
        self.rev_tree = None
255
250
        self.parent_tree = None
256
251
 
280
275
        self.buffer.set_text(decoded.encode('UTF-8'))
281
276
 
282
277
 
283
 
class DiffWidget(Gtk.HPaned):
 
278
class DiffWidget(gtk.HPaned):
284
279
    """Diff widget
285
280
 
286
281
    """
288
283
        super(DiffWidget, self).__init__()
289
284
 
290
285
        # 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)
 
286
        scrollwin = gtk.ScrolledWindow()
 
287
        scrollwin.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
 
288
        scrollwin.set_shadow_type(gtk.SHADOW_IN)
294
289
        self.pack1(scrollwin)
295
290
        scrollwin.show()
296
291
        
297
 
        self.model = Gtk.TreeStore(str, str)
298
 
        self.treeview = Gtk.TreeView(model=self.model)
 
292
        self.model = gtk.TreeStore(str, str)
 
293
        self.treeview = gtk.TreeView(self.model)
299
294
        self.treeview.set_headers_visible(False)
300
295
        self.treeview.set_search_column(1)
301
296
        self.treeview.connect("cursor-changed", self._treeview_cursor_cb)
302
297
        scrollwin.add(self.treeview)
303
298
        self.treeview.show()
304
299
 
305
 
        cell = Gtk.CellRendererText()
 
300
        cell = gtk.CellRendererText()
306
301
        cell.set_property("width-chars", 20)
307
 
        column = Gtk.TreeViewColumn()
308
 
        column.pack_start(cell, True)
 
302
        column = gtk.TreeViewColumn()
 
303
        column.pack_start(cell, expand=True)
309
304
        column.add_attribute(cell, "text", 0)
310
305
        self.treeview.append_column(column)
311
306
 
382
377
                    break
383
378
        if tv_path is None:
384
379
            raise errors.NoSuchFile(file_path)
385
 
        self.treeview.set_cursor(tv_path, None, False)
 
380
        self.treeview.set_cursor(tv_path)
386
381
        self.treeview.scroll_to_cell(tv_path)
387
382
 
388
383
    def _treeview_cursor_cb(self, *args):
399
394
    def _on_wraplines_toggled(self, widget=None, wrap=False):
400
395
        """Callback for when the wrap lines checkbutton is toggled"""
401
396
        if wrap or widget.get_active():
402
 
            self.diff_view.sourceview.set_wrap_mode(Gtk.WrapMode.WORD)
 
397
            self.diff_view.sourceview.set_wrap_mode(gtk.WRAP_WORD)
403
398
        else:
404
 
            self.diff_view.sourceview.set_wrap_mode(Gtk.WrapMode.NONE)
 
399
            self.diff_view.sourceview.set_wrap_mode(gtk.WRAP_NONE)
405
400
 
406
401
class DiffWindow(Window):
407
402
    """Diff window.
411
406
    """
412
407
 
413
408
    def __init__(self, parent=None, operations=None):
414
 
        super(DiffWindow, self).__init__(parent=parent)
 
409
        Window.__init__(self, parent)
415
410
        self.set_border_width(0)
416
411
        self.set_title("bzrk diff")
417
412
 
425
420
 
426
421
    def construct(self, operations):
427
422
        """Construct the window contents."""
428
 
        self.vbox = Gtk.VBox()
 
423
        self.vbox = gtk.VBox()
429
424
        self.add(self.vbox)
430
425
        self.vbox.show()
431
426
        self.diff = DiffWidget()
440
435
        
441
436
    
442
437
    def _get_menu_bar(self):
443
 
        menubar = Gtk.MenuBar()
 
438
        menubar = gtk.MenuBar()
444
439
        # View menu
445
 
        mb_view = Gtk.MenuItem.new_with_mnemonic(_i18n("_View"))
446
 
        mb_view_menu = Gtk.Menu()
447
 
        mb_view_wrapsource = Gtk.CheckMenuItem.new_with_mnemonic(
448
 
            _i18n("Wrap _Long Lines"))
 
440
        mb_view = gtk.MenuItem(_i18n("_View"))
 
441
        mb_view_menu = gtk.Menu()
 
442
        mb_view_wrapsource = gtk.CheckMenuItem(_i18n("Wrap _Long Lines"))
449
443
        mb_view_wrapsource.connect('activate', self.diff._on_wraplines_toggled)
450
444
        mb_view_wrapsource.show()
451
445
        mb_view_menu.append(mb_view_wrapsource)
463
457
        """
464
458
        if operations is None:
465
459
            return None
466
 
        hbox = Gtk.HButtonBox()
467
 
        hbox.set_layout(Gtk.ButtonBoxStyle.START)
 
460
        hbox = gtk.HButtonBox()
 
461
        hbox.set_layout(gtk.BUTTONBOX_START)
468
462
        for title, method in operations:
469
 
            merge_button = Gtk.Button(title)
 
463
            merge_button = gtk.Button(title)
470
464
            merge_button.show()
471
 
            merge_button.set_relief(Gtk.ReliefStyle.NONE)
 
465
            merge_button.set_relief(gtk.RELIEF_NONE)
472
466
            merge_button.connect("clicked", method)
473
467
            hbox.pack_start(merge_button, expand=False, fill=True)
474
468
        hbox.show()
475
469
        return hbox
476
470
 
477
471
    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,))
 
472
        d = gtk.FileChooserDialog('Merge branch', self,
 
473
                                  gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER,
 
474
                                  buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK,
 
475
                                           gtk.STOCK_CANCEL,
 
476
                                           gtk.RESPONSE_CANCEL,))
483
477
        try:
484
478
            result = d.run()
485
 
            if result != Gtk.ResponseType.OK:
 
479
            if result != gtk.RESPONSE_OK:
486
480
                raise SelectCancelled()
487
481
            return d.get_current_folder_uri()
488
482
        finally:
502
496
        error_dialog('Error', str(e))
503
497
 
504
498
    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,))
 
499
        d = gtk.FileChooserDialog('Save As', self,
 
500
                                  gtk.FILE_CHOOSER_ACTION_SAVE,
 
501
                                  buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK,
 
502
                                           gtk.STOCK_CANCEL,
 
503
                                           gtk.RESPONSE_CANCEL,))
510
504
        d.set_current_name(basename)
511
505
        try:
512
506
            result = d.run()
513
 
            if result != Gtk.ResponseType.OK:
 
507
            if result != gtk.RESPONSE_OK:
514
508
                raise SelectCancelled()
515
509
            return urlutils.local_path_from_url(d.get_uri())
516
510
        finally:
578
572
class MergeDirectiveController(DiffController):
579
573
 
580
574
    def __init__(self, path, directive, window=None):
581
 
        super(MergeDirectiveController, self).__init__(
582
 
            path, directive.patch.splitlines(True), window)
 
575
        DiffController.__init__(self, path, directive.patch.splitlines(True),
 
576
                                window)
583
577
        self.directive = directive
584
578
        self.merge_target = None
585
579