/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: Jelmer Vernooij
  • Date: 2011-03-23 09:49:44 UTC
  • mfrom: (723.1.1 isearch)
  • Revision ID: jelmer@samba.org-20110323094944-7n5h1vif3xpbze3p
Merge support for interactive substring search in bzr viz and annotate.

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
42
44
from bzrlib.diff import show_diff_trees
43
45
from bzrlib.patches import parse_patches
44
46
from bzrlib.trace import warning
 
47
from bzrlib.plugins.gtk import _i18n
 
48
from bzrlib.plugins.gtk.window import Window
45
49
from bzrlib.plugins.gtk.dialog import (
46
50
    error_dialog,
47
51
    info_dialog,
48
52
    warning_dialog,
49
53
    )
50
 
from bzrlib.plugins.gtk.i18n import _i18n
51
 
from bzrlib.plugins.gtk.window import Window
52
54
 
53
55
 
54
56
def fallback_guess_language(slm, content_type):
64
66
    pass
65
67
 
66
68
 
67
 
class DiffFileView(Gtk.ScrolledWindow):
 
69
class DiffFileView(gtk.ScrolledWindow):
68
70
    """Window for displaying diffs from a diff file"""
69
71
 
70
72
    def __init__(self):
71
 
        Gtk.ScrolledWindow.__init__(self)
 
73
        gtk.ScrolledWindow.__init__(self)
72
74
        self.construct()
73
75
        self._diffs = {}
74
76
 
75
77
    def construct(self):
76
 
        self.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
77
 
        self.set_shadow_type(Gtk.ShadowType.IN)
 
78
        self.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
 
79
        self.set_shadow_type(gtk.SHADOW_IN)
78
80
 
79
81
        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")
 
82
            self.buffer = gtksourceview2.Buffer()
 
83
            slm = gtksourceview2.LanguageManager()
 
84
            guess_language = getattr(gtksourceview2.LanguageManager, 
 
85
                "guess_language", fallback_guess_language)
 
86
            gsl = guess_language(slm, content_type="text/x-patch")
83
87
            if have_gconf:
84
88
                self.apply_gedit_colors(self.buffer)
85
89
            self.apply_colordiff_colors(self.buffer)
86
 
            self.buffer.set_language(language)
 
90
            self.buffer.set_language(gsl)
87
91
            self.buffer.set_highlight_syntax(True)
88
92
 
89
 
            self.sourceview = GtkSource.View(buffer=self.buffer)
 
93
            self.sourceview = gtksourceview2.View(self.buffer)
90
94
        else:
91
 
            self.buffer = Gtk.TextBuffer()
92
 
            self.sourceview = Gtk.TextView(self.buffer)
 
95
            self.buffer = gtk.TextBuffer()
 
96
            self.sourceview = gtk.TextView(self.buffer)
93
97
 
94
98
        self.sourceview.set_editable(False)
95
 
        self.sourceview.modify_font(Pango.FontDescription("Monospace"))
 
99
        self.sourceview.modify_font(pango.FontDescription("Monospace"))
96
100
        self.add(self.sourceview)
97
101
        self.sourceview.show()
98
102
 
102
106
 
103
107
        This method needs the gconf module.
104
108
 
105
 
        :param buf: a GtkSource.Buffer object.
 
109
        :param buf: a gtksourceview2.Buffer object.
106
110
        """
107
111
        GEDIT_SCHEME_PATH = '/apps/gedit-2/preferences/editor/colors/scheme'
108
112
        GEDIT_USER_STYLES_PATH = os.path.expanduser('~/.gnome2/gedit/styles')
109
113
 
110
 
        client = GConf.Client.get_default()
 
114
        client = gconf.client_get_default()
111
115
        style_scheme_name = client.get_string(GEDIT_SCHEME_PATH)
112
116
        if style_scheme_name is not None:
113
 
            style_scheme_mgr = GtkSource.StyleSchemeManager()
 
117
            style_scheme_mgr = gtksourceview2.StyleSchemeManager()
114
118
            style_scheme_mgr.append_search_path(GEDIT_USER_STYLES_PATH)
115
119
            
116
120
            style_scheme = style_scheme_mgr.get_scheme(style_scheme_name)
124
128
 
125
129
        Both ~/.colordiffrc and ~/.colordiffrc.bzr-gtk are read.
126
130
 
127
 
        :param buf: a "Diff" GtkSource.Buffer object.
 
131
        :param buf: a "Diff" gtksourceview2.Buffer object.
128
132
        """
129
 
        scheme_manager = GtkSource.StyleSchemeManager()
 
133
        scheme_manager = gtksourceview2.StyleSchemeManager()
130
134
        style_scheme = scheme_manager.get_scheme('colordiff')
131
135
        
132
136
        # if style scheme not found, we'll generate it from colordiffrc
280
284
        self.buffer.set_text(decoded.encode('UTF-8'))
281
285
 
282
286
 
283
 
class DiffWidget(Gtk.HPaned):
 
287
class DiffWidget(gtk.HPaned):
284
288
    """Diff widget
285
289
 
286
290
    """
288
292
        super(DiffWidget, self).__init__()
289
293
 
290
294
        # 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)
 
295
        scrollwin = gtk.ScrolledWindow()
 
296
        scrollwin.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
 
297
        scrollwin.set_shadow_type(gtk.SHADOW_IN)
294
298
        self.pack1(scrollwin)
295
299
        scrollwin.show()
296
300
        
297
 
        self.model = Gtk.TreeStore(str, str)
298
 
        self.treeview = Gtk.TreeView(model=self.model)
 
301
        self.model = gtk.TreeStore(str, str)
 
302
        self.treeview = gtk.TreeView(self.model)
299
303
        self.treeview.set_headers_visible(False)
300
304
        self.treeview.set_search_column(1)
301
305
        self.treeview.connect("cursor-changed", self._treeview_cursor_cb)
302
306
        scrollwin.add(self.treeview)
303
307
        self.treeview.show()
304
308
 
305
 
        cell = Gtk.CellRendererText()
 
309
        cell = gtk.CellRendererText()
306
310
        cell.set_property("width-chars", 20)
307
 
        column = Gtk.TreeViewColumn()
308
 
        column.pack_start(cell, True)
 
311
        column = gtk.TreeViewColumn()
 
312
        column.pack_start(cell, expand=True)
309
313
        column.add_attribute(cell, "text", 0)
310
314
        self.treeview.append_column(column)
311
315
 
399
403
    def _on_wraplines_toggled(self, widget=None, wrap=False):
400
404
        """Callback for when the wrap lines checkbutton is toggled"""
401
405
        if wrap or widget.get_active():
402
 
            self.diff_view.sourceview.set_wrap_mode(Gtk.WrapMode.WORD)
 
406
            self.diff_view.sourceview.set_wrap_mode(gtk.WRAP_WORD)
403
407
        else:
404
 
            self.diff_view.sourceview.set_wrap_mode(Gtk.WrapMode.NONE)
 
408
            self.diff_view.sourceview.set_wrap_mode(gtk.WRAP_NONE)
405
409
 
406
410
class DiffWindow(Window):
407
411
    """Diff window.
425
429
 
426
430
    def construct(self, operations):
427
431
        """Construct the window contents."""
428
 
        self.vbox = Gtk.VBox()
 
432
        self.vbox = gtk.VBox()
429
433
        self.add(self.vbox)
430
434
        self.vbox.show()
431
435
        self.diff = DiffWidget()
440
444
        
441
445
    
442
446
    def _get_menu_bar(self):
443
 
        menubar = Gtk.MenuBar()
 
447
        menubar = gtk.MenuBar()
444
448
        # 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"))
 
449
        mb_view = gtk.MenuItem(_i18n("_View"))
 
450
        mb_view_menu = gtk.Menu()
 
451
        mb_view_wrapsource = gtk.CheckMenuItem(_i18n("Wrap _Long Lines"))
449
452
        mb_view_wrapsource.connect('activate', self.diff._on_wraplines_toggled)
450
453
        mb_view_wrapsource.show()
451
454
        mb_view_menu.append(mb_view_wrapsource)
463
466
        """
464
467
        if operations is None:
465
468
            return None
466
 
        hbox = Gtk.HButtonBox()
467
 
        hbox.set_layout(Gtk.ButtonBoxStyle.START)
 
469
        hbox = gtk.HButtonBox()
 
470
        hbox.set_layout(gtk.BUTTONBOX_START)
468
471
        for title, method in operations:
469
 
            merge_button = Gtk.Button(title)
 
472
            merge_button = gtk.Button(title)
470
473
            merge_button.show()
471
 
            merge_button.set_relief(Gtk.ReliefStyle.NONE)
 
474
            merge_button.set_relief(gtk.RELIEF_NONE)
472
475
            merge_button.connect("clicked", method)
473
476
            hbox.pack_start(merge_button, expand=False, fill=True)
474
477
        hbox.show()
475
478
        return hbox
476
479
 
477
480
    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,))
 
481
        d = gtk.FileChooserDialog('Merge branch', self,
 
482
                                  gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER,
 
483
                                  buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK,
 
484
                                           gtk.STOCK_CANCEL,
 
485
                                           gtk.RESPONSE_CANCEL,))
483
486
        try:
484
487
            result = d.run()
485
 
            if result != Gtk.ResponseType.OK:
 
488
            if result != gtk.RESPONSE_OK:
486
489
                raise SelectCancelled()
487
490
            return d.get_current_folder_uri()
488
491
        finally:
502
505
        error_dialog('Error', str(e))
503
506
 
504
507
    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,))
 
508
        d = gtk.FileChooserDialog('Save As', self,
 
509
                                  gtk.FILE_CHOOSER_ACTION_SAVE,
 
510
                                  buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK,
 
511
                                           gtk.STOCK_CANCEL,
 
512
                                           gtk.RESPONSE_CANCEL,))
510
513
        d.set_current_name(basename)
511
514
        try:
512
515
            result = d.run()
513
 
            if result != Gtk.ResponseType.OK:
 
516
            if result != gtk.RESPONSE_OK:
514
517
                raise SelectCancelled()
515
518
            return urlutils.local_path_from_url(d.get_uri())
516
519
        finally: