/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: Curtis Hovey
  • Date: 2011-08-12 20:25:28 UTC
  • mto: This revision was merged to the branch mainline in revision 741.
  • Revision ID: sinzui.is@verizon.net-20110812202528-4xf4a2t23urx50d2
Updated gst to gtk3.

Show diffs side-by-side

added added

removed removed

Lines of Context:
10
10
 
11
11
from cStringIO import StringIO
12
12
 
13
 
import pygtk
14
 
pygtk.require("2.0")
15
 
import gtk
16
 
import pango
 
13
from gi.repository import Gtk
 
14
from gi.repository import Pango
17
15
import os
18
16
import re
19
17
import sys
 
18
import inspect
20
19
try:
21
20
    from xml.etree.ElementTree import Element, SubElement, tostring
22
21
except ImportError:
23
22
    from elementtree.ElementTree import Element, SubElement, tostring
24
23
 
25
24
try:
26
 
    import gtksourceview2
 
25
    from gi.repository import GtkSource
27
26
    have_gtksourceview = True
28
27
except ImportError:
29
28
    have_gtksourceview = False
30
29
try:
31
 
    import gconf
 
30
    from gi.repository import GConf
32
31
    have_gconf = True
33
32
except ImportError:
34
33
    have_gconf = False
40
39
    urlutils,
41
40
    workingtree,
42
41
)
43
 
from bzrlib.diff import show_diff_trees, internal_diff
 
42
from bzrlib.diff import show_diff_trees
44
43
from bzrlib.patches import parse_patches
45
44
from bzrlib.trace import warning
46
 
from bzrlib.plugins.gtk import _i18n
 
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
51
from bzrlib.plugins.gtk.window import Window
48
 
from dialog import error_dialog, info_dialog, warning_dialog
49
52
 
50
53
 
51
54
def fallback_guess_language(slm, content_type):
61
64
    pass
62
65
 
63
66
 
64
 
class DiffFileView(gtk.ScrolledWindow):
 
67
class DiffFileView(Gtk.ScrolledWindow):
65
68
    """Window for displaying diffs from a diff file"""
66
69
 
67
70
    def __init__(self):
68
 
        gtk.ScrolledWindow.__init__(self)
 
71
        Gtk.ScrolledWindow.__init__(self)
69
72
        self.construct()
70
73
        self._diffs = {}
71
74
 
72
75
    def construct(self):
73
 
        self.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
74
 
        self.set_shadow_type(gtk.SHADOW_IN)
 
76
        self.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
 
77
        self.set_shadow_type(Gtk.ShadowType.IN)
75
78
 
76
79
        if have_gtksourceview:
77
 
            self.buffer = gtksourceview2.Buffer()
78
 
            slm = gtksourceview2.LanguageManager()
79
 
            guess_language = getattr(gtksourceview2.LanguageManager, 
80
 
                "guess_language", fallback_guess_language)
81
 
            gsl = guess_language(slm, content_type="text/x-patch")
 
80
            self.buffer = GtkSource.Buffer()
 
81
            lang_manager = GtkSource.LanguageManager.get_default()
 
82
            language = lang_manager.guess_language(None, "text/x-patch")
82
83
            if have_gconf:
83
84
                self.apply_gedit_colors(self.buffer)
84
85
            self.apply_colordiff_colors(self.buffer)
85
 
            self.buffer.set_language(gsl)
 
86
            self.buffer.set_language(language)
86
87
            self.buffer.set_highlight_syntax(True)
87
88
 
88
 
            self.sourceview = gtksourceview2.View(self.buffer)
 
89
            self.sourceview = GtkSource.View(buffer=self.buffer)
89
90
        else:
90
 
            self.buffer = gtk.TextBuffer()
91
 
            self.sourceview = gtk.TextView(self.buffer)
 
91
            self.buffer = Gtk.TextBuffer()
 
92
            self.sourceview = Gtk.TextView(self.buffer)
92
93
 
93
94
        self.sourceview.set_editable(False)
94
 
        self.sourceview.modify_font(pango.FontDescription("Monospace"))
 
95
        self.sourceview.modify_font(Pango.FontDescription("Monospace"))
95
96
        self.add(self.sourceview)
96
97
        self.sourceview.show()
97
98
 
101
102
 
102
103
        This method needs the gconf module.
103
104
 
104
 
        :param buf: a gtksourceview2.Buffer object.
 
105
        :param buf: a GtkSource.Buffer object.
105
106
        """
106
107
        GEDIT_SCHEME_PATH = '/apps/gedit-2/preferences/editor/colors/scheme'
 
108
        GEDIT_USER_STYLES_PATH = os.path.expanduser('~/.gnome2/gedit/styles')
107
109
 
108
 
        client = gconf.client_get_default()
 
110
        client = GConf.Client.get_default()
109
111
        style_scheme_name = client.get_string(GEDIT_SCHEME_PATH)
110
112
        if style_scheme_name is not None:
111
 
            style_scheme = gtksourceview2.StyleSchemeManager().get_scheme(style_scheme_name)
112
 
            
113
 
            buf.set_style_scheme(style_scheme)
 
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)
114
120
 
115
121
    @classmethod
116
122
    def apply_colordiff_colors(klass, buf):
118
124
 
119
125
        Both ~/.colordiffrc and ~/.colordiffrc.bzr-gtk are read.
120
126
 
121
 
        :param buf: a "Diff" gtksourceview2.Buffer object.
 
127
        :param buf: a "Diff" GtkSource.Buffer object.
122
128
        """
123
 
        scheme_manager = gtksourceview2.StyleSchemeManager()
 
129
        scheme_manager = GtkSource.StyleSchemeManager()
124
130
        style_scheme = scheme_manager.get_scheme('colordiff')
125
131
        
126
132
        # if style scheme not found, we'll generate it from colordiffrc
274
280
        self.buffer.set_text(decoded.encode('UTF-8'))
275
281
 
276
282
 
277
 
class DiffWidget(gtk.HPaned):
 
283
class DiffWidget(Gtk.HPaned):
278
284
    """Diff widget
279
285
 
280
286
    """
282
288
        super(DiffWidget, self).__init__()
283
289
 
284
290
        # The file hierarchy: a scrollable treeview
285
 
        scrollwin = gtk.ScrolledWindow()
286
 
        scrollwin.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
287
 
        scrollwin.set_shadow_type(gtk.SHADOW_IN)
 
291
        scrollwin = Gtk.ScrolledWindow()
 
292
        scrollwin.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC)
 
293
        scrollwin.set_shadow_type(Gtk.ShadowType.IN)
288
294
        self.pack1(scrollwin)
289
295
        scrollwin.show()
290
296
        
291
 
        self.model = gtk.TreeStore(str, str)
292
 
        self.treeview = gtk.TreeView(self.model)
 
297
        self.model = Gtk.TreeStore(str, str)
 
298
        self.treeview = Gtk.TreeView(model=self.model)
293
299
        self.treeview.set_headers_visible(False)
294
300
        self.treeview.set_search_column(1)
295
301
        self.treeview.connect("cursor-changed", self._treeview_cursor_cb)
296
302
        scrollwin.add(self.treeview)
297
303
        self.treeview.show()
298
304
 
299
 
        cell = gtk.CellRendererText()
 
305
        cell = Gtk.CellRendererText()
300
306
        cell.set_property("width-chars", 20)
301
 
        column = gtk.TreeViewColumn()
302
 
        column.pack_start(cell, expand=True)
 
307
        column = Gtk.TreeViewColumn()
 
308
        column.pack_start(cell, True)
303
309
        column.add_attribute(cell, "text", 0)
304
310
        self.treeview.append_column(column)
305
311
 
393
399
    def _on_wraplines_toggled(self, widget=None, wrap=False):
394
400
        """Callback for when the wrap lines checkbutton is toggled"""
395
401
        if wrap or widget.get_active():
396
 
            self.diff_view.sourceview.set_wrap_mode(gtk.WRAP_WORD)
 
402
            self.diff_view.sourceview.set_wrap_mode(Gtk.WrapMode.WORD)
397
403
        else:
398
 
            self.diff_view.sourceview.set_wrap_mode(gtk.WRAP_NONE)
 
404
            self.diff_view.sourceview.set_wrap_mode(Gtk.WrapMode.NONE)
399
405
 
400
406
class DiffWindow(Window):
401
407
    """Diff window.
419
425
 
420
426
    def construct(self, operations):
421
427
        """Construct the window contents."""
422
 
        self.vbox = gtk.VBox()
 
428
        self.vbox = Gtk.VBox()
423
429
        self.add(self.vbox)
424
430
        self.vbox.show()
425
431
        self.diff = DiffWidget()
434
440
        
435
441
    
436
442
    def _get_menu_bar(self):
437
 
        menubar = gtk.MenuBar()
 
443
        menubar = Gtk.MenuBar()
438
444
        # View menu
439
 
        mb_view = gtk.MenuItem(_i18n("_View"))
440
 
        mb_view_menu = gtk.Menu()
441
 
        mb_view_wrapsource = gtk.CheckMenuItem(_i18n("Wrap _Long Lines"))
 
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"))
442
449
        mb_view_wrapsource.connect('activate', self.diff._on_wraplines_toggled)
443
450
        mb_view_wrapsource.show()
444
451
        mb_view_menu.append(mb_view_wrapsource)
456
463
        """
457
464
        if operations is None:
458
465
            return None
459
 
        hbox = gtk.HButtonBox()
460
 
        hbox.set_layout(gtk.BUTTONBOX_START)
 
466
        hbox = Gtk.HButtonBox()
 
467
        hbox.set_layout(Gtk.ButtonBoxStyle.START)
461
468
        for title, method in operations:
462
 
            merge_button = gtk.Button(title)
 
469
            merge_button = Gtk.Button(title)
463
470
            merge_button.show()
464
 
            merge_button.set_relief(gtk.RELIEF_NONE)
 
471
            merge_button.set_relief(Gtk.ReliefStyle.NONE)
465
472
            merge_button.connect("clicked", method)
466
473
            hbox.pack_start(merge_button, expand=False, fill=True)
467
474
        hbox.show()
468
475
        return hbox
469
476
 
470
477
    def _get_merge_target(self):
471
 
        d = gtk.FileChooserDialog('Merge branch', self,
472
 
                                  gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER,
473
 
                                  buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK,
474
 
                                           gtk.STOCK_CANCEL,
475
 
                                           gtk.RESPONSE_CANCEL,))
 
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,))
476
483
        try:
477
484
            result = d.run()
478
 
            if result != gtk.RESPONSE_OK:
 
485
            if result != Gtk.ResponseType.OK:
479
486
                raise SelectCancelled()
480
487
            return d.get_current_folder_uri()
481
488
        finally:
495
502
        error_dialog('Error', str(e))
496
503
 
497
504
    def _get_save_path(self, basename):
498
 
        d = gtk.FileChooserDialog('Save As', self,
499
 
                                  gtk.FILE_CHOOSER_ACTION_SAVE,
500
 
                                  buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK,
501
 
                                           gtk.STOCK_CANCEL,
502
 
                                           gtk.RESPONSE_CANCEL,))
 
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,))
503
510
        d.set_current_name(basename)
504
511
        try:
505
512
            result = d.run()
506
 
            if result != gtk.RESPONSE_OK:
 
513
            if result != Gtk.ResponseType.OK:
507
514
                raise SelectCancelled()
508
515
            return urlutils.local_path_from_url(d.get_uri())
509
516
        finally:
524
531
 
525
532
class DiffController(object):
526
533
 
527
 
    def __init__(self, path, patch, window=None):
 
534
    def __init__(self, path, patch, window=None, allow_dirty=False):
528
535
        self.path = path
529
536
        self.patch = patch
 
537
        self.allow_dirty = allow_dirty
530
538
        if window is None:
531
539
            window = DiffWindow(operations=self._provide_operations())
532
540
            self.initialize_window(window)
538
546
 
539
547
    def get_diff_sections(self):
540
548
        yield "Complete Diff", None, ''.join(self.patch)
541
 
        for patch in parse_patches(self.patch):
 
549
        # allow_dirty was added to parse_patches in bzrlib 2.2b1
 
550
        if 'allow_dirty' in inspect.getargspec(parse_patches).args:
 
551
            patches = parse_patches(self.patch, allow_dirty=self.allow_dirty)
 
552
        else:
 
553
            patches = parse_patches(self.patch)
 
554
        for patch in patches:
542
555
            oldname = patch.oldname.split('\t')[0]
543
556
            newname = patch.newname.split('\t')[0]
544
557
            yield oldname, newname, str(patch)