/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-07-31 16:50:29 UTC
  • mto: This revision was merged to the branch mainline in revision 741.
  • Revision ID: sinzui.is@verizon.net-20110731165029-9gixuqypi3lwapzm
Removed import_pygtk because gi does not impicitly call Main(). Inlined checks for gtk availablility.

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
        GObject.GObject.__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
            self.buffer = GtkSource.Buffer()
 
81
            slm = GtkSource.LanguageManager()
 
82
            guess_language = getattr(GtkSource.LanguageManager, 
80
83
                "guess_language", fallback_guess_language)
81
84
            gsl = guess_language(slm, content_type="text/x-patch")
82
85
            if have_gconf:
85
88
            self.buffer.set_language(gsl)
86
89
            self.buffer.set_highlight_syntax(True)
87
90
 
88
 
            self.sourceview = gtksourceview2.View(self.buffer)
 
91
            self.sourceview = GtkSource.View(self.buffer)
89
92
        else:
90
 
            self.buffer = gtk.TextBuffer()
91
 
            self.sourceview = gtk.TextView(self.buffer)
 
93
            self.buffer = Gtk.TextBuffer()
 
94
            self.sourceview = Gtk.TextView(self.buffer)
92
95
 
93
96
        self.sourceview.set_editable(False)
94
 
        self.sourceview.modify_font(pango.FontDescription("Monospace"))
 
97
        self.sourceview.modify_font(Pango.FontDescription("Monospace"))
95
98
        self.add(self.sourceview)
96
99
        self.sourceview.show()
97
100
 
101
104
 
102
105
        This method needs the gconf module.
103
106
 
104
 
        :param buf: a gtksourceview2.Buffer object.
 
107
        :param buf: a GtkSource.Buffer object.
105
108
        """
106
109
        GEDIT_SCHEME_PATH = '/apps/gedit-2/preferences/editor/colors/scheme'
 
110
        GEDIT_USER_STYLES_PATH = os.path.expanduser('~/.gnome2/gedit/styles')
107
111
 
108
 
        client = gconf.client_get_default()
 
112
        client = GConf.Client.get_default()
109
113
        style_scheme_name = client.get_string(GEDIT_SCHEME_PATH)
110
114
        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)
 
115
            style_scheme_mgr = GtkSource.StyleSchemeManager()
 
116
            style_scheme_mgr.append_search_path(GEDIT_USER_STYLES_PATH)
 
117
            
 
118
            style_scheme = style_scheme_mgr.get_scheme(style_scheme_name)
 
119
            
 
120
            if style_scheme is not None:
 
121
                buf.set_style_scheme(style_scheme)
114
122
 
115
123
    @classmethod
116
124
    def apply_colordiff_colors(klass, buf):
118
126
 
119
127
        Both ~/.colordiffrc and ~/.colordiffrc.bzr-gtk are read.
120
128
 
121
 
        :param buf: a "Diff" gtksourceview2.Buffer object.
 
129
        :param buf: a "Diff" GtkSource.Buffer object.
122
130
        """
123
 
        scheme_manager = gtksourceview2.StyleSchemeManager()
 
131
        scheme_manager = GtkSource.StyleSchemeManager()
124
132
        style_scheme = scheme_manager.get_scheme('colordiff')
125
133
        
126
134
        # if style scheme not found, we'll generate it from colordiffrc
274
282
        self.buffer.set_text(decoded.encode('UTF-8'))
275
283
 
276
284
 
277
 
class DiffWidget(gtk.HPaned):
 
285
class DiffWidget(Gtk.HPaned):
278
286
    """Diff widget
279
287
 
280
288
    """
282
290
        super(DiffWidget, self).__init__()
283
291
 
284
292
        # 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)
 
293
        scrollwin = Gtk.ScrolledWindow()
 
294
        scrollwin.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC)
 
295
        scrollwin.set_shadow_type(Gtk.ShadowType.IN)
288
296
        self.pack1(scrollwin)
289
297
        scrollwin.show()
290
298
        
291
 
        self.model = gtk.TreeStore(str, str)
292
 
        self.treeview = gtk.TreeView(self.model)
 
299
        self.model = Gtk.TreeStore(str, str)
 
300
        self.treeview = Gtk.TreeView(self.model)
293
301
        self.treeview.set_headers_visible(False)
294
302
        self.treeview.set_search_column(1)
295
303
        self.treeview.connect("cursor-changed", self._treeview_cursor_cb)
296
304
        scrollwin.add(self.treeview)
297
305
        self.treeview.show()
298
306
 
299
 
        cell = gtk.CellRendererText()
 
307
        cell = Gtk.CellRendererText()
300
308
        cell.set_property("width-chars", 20)
301
 
        column = gtk.TreeViewColumn()
302
 
        column.pack_start(cell, expand=True)
 
309
        column = Gtk.TreeViewColumn()
 
310
        column.pack_start(cell, True, True, 0)
303
311
        column.add_attribute(cell, "text", 0)
304
312
        self.treeview.append_column(column)
305
313
 
393
401
    def _on_wraplines_toggled(self, widget=None, wrap=False):
394
402
        """Callback for when the wrap lines checkbutton is toggled"""
395
403
        if wrap or widget.get_active():
396
 
            self.diff_view.sourceview.set_wrap_mode(gtk.WRAP_WORD)
 
404
            self.diff_view.sourceview.set_wrap_mode(Gtk.WrapMode.WORD)
397
405
        else:
398
 
            self.diff_view.sourceview.set_wrap_mode(gtk.WRAP_NONE)
 
406
            self.diff_view.sourceview.set_wrap_mode(Gtk.WrapMode.NONE)
399
407
 
400
408
class DiffWindow(Window):
401
409
    """Diff window.
419
427
 
420
428
    def construct(self, operations):
421
429
        """Construct the window contents."""
422
 
        self.vbox = gtk.VBox()
 
430
        self.vbox = Gtk.VBox()
423
431
        self.add(self.vbox)
424
432
        self.vbox.show()
425
433
        self.diff = DiffWidget()
434
442
        
435
443
    
436
444
    def _get_menu_bar(self):
437
 
        menubar = gtk.MenuBar()
 
445
        menubar = Gtk.MenuBar()
438
446
        # 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"))
 
447
        mb_view = Gtk.MenuItem(_i18n("_View"))
 
448
        mb_view_menu = Gtk.Menu()
 
449
        mb_view_wrapsource = Gtk.CheckMenuItem(_i18n("Wrap _Long Lines"))
442
450
        mb_view_wrapsource.connect('activate', self.diff._on_wraplines_toggled)
443
451
        mb_view_wrapsource.show()
444
452
        mb_view_menu.append(mb_view_wrapsource)
456
464
        """
457
465
        if operations is None:
458
466
            return None
459
 
        hbox = gtk.HButtonBox()
460
 
        hbox.set_layout(gtk.BUTTONBOX_START)
 
467
        hbox = Gtk.HButtonBox()
 
468
        hbox.set_layout(Gtk.ButtonBoxStyle.START)
461
469
        for title, method in operations:
462
 
            merge_button = gtk.Button(title)
 
470
            merge_button = Gtk.Button(title)
463
471
            merge_button.show()
464
 
            merge_button.set_relief(gtk.RELIEF_NONE)
 
472
            merge_button.set_relief(Gtk.ReliefStyle.NONE)
465
473
            merge_button.connect("clicked", method)
466
474
            hbox.pack_start(merge_button, expand=False, fill=True)
467
475
        hbox.show()
468
476
        return hbox
469
477
 
470
478
    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,))
 
479
        d = Gtk.FileChooserDialog('Merge branch', self,
 
480
                                  Gtk.FileChooserAction.SELECT_FOLDER,
 
481
                                  buttons=(Gtk.STOCK_OK, Gtk.ResponseType.OK,
 
482
                                           Gtk.STOCK_CANCEL,
 
483
                                           Gtk.ResponseType.CANCEL,))
476
484
        try:
477
485
            result = d.run()
478
 
            if result != gtk.RESPONSE_OK:
 
486
            if result != Gtk.ResponseType.OK:
479
487
                raise SelectCancelled()
480
488
            return d.get_current_folder_uri()
481
489
        finally:
495
503
        error_dialog('Error', str(e))
496
504
 
497
505
    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,))
 
506
        d = Gtk.FileChooserDialog('Save As', self,
 
507
                                  Gtk.FileChooserAction.SAVE,
 
508
                                  buttons=(Gtk.STOCK_OK, Gtk.ResponseType.OK,
 
509
                                           Gtk.STOCK_CANCEL,
 
510
                                           Gtk.ResponseType.CANCEL,))
503
511
        d.set_current_name(basename)
504
512
        try:
505
513
            result = d.run()
506
 
            if result != gtk.RESPONSE_OK:
 
514
            if result != Gtk.ResponseType.OK:
507
515
                raise SelectCancelled()
508
516
            return urlutils.local_path_from_url(d.get_uri())
509
517
        finally:
524
532
 
525
533
class DiffController(object):
526
534
 
527
 
    def __init__(self, path, patch, window=None):
 
535
    def __init__(self, path, patch, window=None, allow_dirty=False):
528
536
        self.path = path
529
537
        self.patch = patch
 
538
        self.allow_dirty = allow_dirty
530
539
        if window is None:
531
540
            window = DiffWindow(operations=self._provide_operations())
532
541
            self.initialize_window(window)
538
547
 
539
548
    def get_diff_sections(self):
540
549
        yield "Complete Diff", None, ''.join(self.patch)
541
 
        for patch in parse_patches(self.patch):
 
550
        # allow_dirty was added to parse_patches in bzrlib 2.2b1
 
551
        if 'allow_dirty' in inspect.getargspec(parse_patches).args:
 
552
            patches = parse_patches(self.patch, allow_dirty=self.allow_dirty)
 
553
        else:
 
554
            patches = parse_patches(self.patch)
 
555
        for patch in patches:
542
556
            oldname = patch.oldname.split('\t')[0]
543
557
            newname = patch.newname.split('\t')[0]
544
558
            yield oldname, newname, str(patch)