/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-11-02 11:11:06 UTC
  • mfrom: (734.1.55 gtk3)
  • Revision ID: jelmer@samba.org-20111102111106-7l0vso8eg24dpf87
Merge gtk3 support from Curtis.

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
24
22
    from elementtree.ElementTree import Element, SubElement, tostring
25
23
 
26
24
try:
27
 
    import gtksourceview2
 
25
    from gi.repository import GtkSource
28
26
    have_gtksourceview = True
29
27
except ImportError:
30
28
    have_gtksourceview = False
31
29
try:
32
 
    import gconf
 
30
    from gi.repository import GConf
33
31
    have_gconf = True
34
32
except ImportError:
35
33
    have_gconf = False
66
64
    pass
67
65
 
68
66
 
69
 
class DiffFileView(gtk.ScrolledWindow):
 
67
class DiffFileView(Gtk.ScrolledWindow):
70
68
    """Window for displaying diffs from a diff file"""
71
69
 
72
70
    def __init__(self):
73
 
        gtk.ScrolledWindow.__init__(self)
 
71
        super(DiffFileView, self).__init__()
74
72
        self.construct()
75
73
        self._diffs = {}
76
74
 
77
75
    def construct(self):
78
 
        self.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
79
 
        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)
80
78
 
81
79
        if have_gtksourceview:
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")
 
80
            self.buffer = GtkSource.Buffer()
 
81
            lang_manager = GtkSource.LanguageManager.get_default()
 
82
            language = lang_manager.guess_language(None, "text/x-patch")
87
83
            if have_gconf:
88
84
                self.apply_gedit_colors(self.buffer)
89
85
            self.apply_colordiff_colors(self.buffer)
90
 
            self.buffer.set_language(gsl)
 
86
            self.buffer.set_language(language)
91
87
            self.buffer.set_highlight_syntax(True)
92
88
 
93
 
            self.sourceview = gtksourceview2.View(self.buffer)
 
89
            self.sourceview = GtkSource.View(buffer=self.buffer)
94
90
        else:
95
 
            self.buffer = gtk.TextBuffer()
96
 
            self.sourceview = gtk.TextView(self.buffer)
 
91
            self.buffer = Gtk.TextBuffer()
 
92
            self.sourceview = Gtk.TextView(self.buffer)
97
93
 
98
94
        self.sourceview.set_editable(False)
99
 
        self.sourceview.modify_font(pango.FontDescription("Monospace"))
 
95
        self.sourceview.modify_font(Pango.FontDescription("Monospace"))
100
96
        self.add(self.sourceview)
101
97
        self.sourceview.show()
102
98
 
106
102
 
107
103
        This method needs the gconf module.
108
104
 
109
 
        :param buf: a gtksourceview2.Buffer object.
 
105
        :param buf: a GtkSource.Buffer object.
110
106
        """
111
107
        GEDIT_SCHEME_PATH = '/apps/gedit-2/preferences/editor/colors/scheme'
112
108
        GEDIT_USER_STYLES_PATH = os.path.expanduser('~/.gnome2/gedit/styles')
113
109
 
114
 
        client = gconf.client_get_default()
 
110
        client = GConf.Client.get_default()
115
111
        style_scheme_name = client.get_string(GEDIT_SCHEME_PATH)
116
112
        if style_scheme_name is not None:
117
 
            style_scheme_mgr = gtksourceview2.StyleSchemeManager()
 
113
            style_scheme_mgr = GtkSource.StyleSchemeManager()
118
114
            style_scheme_mgr.append_search_path(GEDIT_USER_STYLES_PATH)
119
115
            
120
116
            style_scheme = style_scheme_mgr.get_scheme(style_scheme_name)
128
124
 
129
125
        Both ~/.colordiffrc and ~/.colordiffrc.bzr-gtk are read.
130
126
 
131
 
        :param buf: a "Diff" gtksourceview2.Buffer object.
 
127
        :param buf: a "Diff" GtkSource.Buffer object.
132
128
        """
133
 
        scheme_manager = gtksourceview2.StyleSchemeManager()
 
129
        scheme_manager = GtkSource.StyleSchemeManager()
134
130
        style_scheme = scheme_manager.get_scheme('colordiff')
135
131
        
136
132
        # if style scheme not found, we'll generate it from colordiffrc
254
250
    """This is the soft and chewy filling for a DiffWindow."""
255
251
 
256
252
    def __init__(self):
257
 
        DiffFileView.__init__(self)
 
253
        super(DiffView, self).__init__()
258
254
        self.rev_tree = None
259
255
        self.parent_tree = None
260
256
 
284
280
        self.buffer.set_text(decoded.encode('UTF-8'))
285
281
 
286
282
 
287
 
class DiffWidget(gtk.HPaned):
 
283
class DiffWidget(Gtk.HPaned):
288
284
    """Diff widget
289
285
 
290
286
    """
292
288
        super(DiffWidget, self).__init__()
293
289
 
294
290
        # The file hierarchy: a scrollable treeview
295
 
        scrollwin = gtk.ScrolledWindow()
296
 
        scrollwin.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
297
 
        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)
298
294
        self.pack1(scrollwin)
299
295
        scrollwin.show()
300
296
        
301
 
        self.model = gtk.TreeStore(str, str)
302
 
        self.treeview = gtk.TreeView(self.model)
 
297
        self.model = Gtk.TreeStore(str, str)
 
298
        self.treeview = Gtk.TreeView(model=self.model)
303
299
        self.treeview.set_headers_visible(False)
304
300
        self.treeview.set_search_column(1)
305
301
        self.treeview.connect("cursor-changed", self._treeview_cursor_cb)
306
302
        scrollwin.add(self.treeview)
307
303
        self.treeview.show()
308
304
 
309
 
        cell = gtk.CellRendererText()
 
305
        cell = Gtk.CellRendererText()
310
306
        cell.set_property("width-chars", 20)
311
 
        column = gtk.TreeViewColumn()
312
 
        column.pack_start(cell, expand=True)
 
307
        column = Gtk.TreeViewColumn()
 
308
        column.pack_start(cell, True)
313
309
        column.add_attribute(cell, "text", 0)
314
310
        self.treeview.append_column(column)
315
311
 
386
382
                    break
387
383
        if tv_path is None:
388
384
            raise errors.NoSuchFile(file_path)
389
 
        self.treeview.set_cursor(tv_path)
 
385
        self.treeview.set_cursor(tv_path, None, False)
390
386
        self.treeview.scroll_to_cell(tv_path)
391
387
 
392
388
    def _treeview_cursor_cb(self, *args):
403
399
    def _on_wraplines_toggled(self, widget=None, wrap=False):
404
400
        """Callback for when the wrap lines checkbutton is toggled"""
405
401
        if wrap or widget.get_active():
406
 
            self.diff_view.sourceview.set_wrap_mode(gtk.WRAP_WORD)
 
402
            self.diff_view.sourceview.set_wrap_mode(Gtk.WrapMode.WORD)
407
403
        else:
408
 
            self.diff_view.sourceview.set_wrap_mode(gtk.WRAP_NONE)
 
404
            self.diff_view.sourceview.set_wrap_mode(Gtk.WrapMode.NONE)
409
405
 
410
406
class DiffWindow(Window):
411
407
    """Diff window.
415
411
    """
416
412
 
417
413
    def __init__(self, parent=None, operations=None):
418
 
        Window.__init__(self, parent)
 
414
        super(DiffWindow, self).__init__(parent=parent)
419
415
        self.set_border_width(0)
420
416
        self.set_title("bzrk diff")
421
417
 
429
425
 
430
426
    def construct(self, operations):
431
427
        """Construct the window contents."""
432
 
        self.vbox = gtk.VBox()
 
428
        self.vbox = Gtk.VBox()
433
429
        self.add(self.vbox)
434
430
        self.vbox.show()
435
431
        self.diff = DiffWidget()
444
440
        
445
441
    
446
442
    def _get_menu_bar(self):
447
 
        menubar = gtk.MenuBar()
 
443
        menubar = Gtk.MenuBar()
448
444
        # View menu
449
 
        mb_view = gtk.MenuItem(_i18n("_View"))
450
 
        mb_view_menu = gtk.Menu()
451
 
        mb_view_wrapsource = gtk.CheckMenuItem(_i18n("Wrap _Long Lines"))
 
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"))
452
449
        mb_view_wrapsource.connect('activate', self.diff._on_wraplines_toggled)
453
450
        mb_view_wrapsource.show()
454
451
        mb_view_menu.append(mb_view_wrapsource)
466
463
        """
467
464
        if operations is None:
468
465
            return None
469
 
        hbox = gtk.HButtonBox()
470
 
        hbox.set_layout(gtk.BUTTONBOX_START)
 
466
        hbox = Gtk.HButtonBox()
 
467
        hbox.set_layout(Gtk.ButtonBoxStyle.START)
471
468
        for title, method in operations:
472
 
            merge_button = gtk.Button(title)
 
469
            merge_button = Gtk.Button(title)
473
470
            merge_button.show()
474
 
            merge_button.set_relief(gtk.RELIEF_NONE)
 
471
            merge_button.set_relief(Gtk.ReliefStyle.NONE)
475
472
            merge_button.connect("clicked", method)
476
473
            hbox.pack_start(merge_button, expand=False, fill=True)
477
474
        hbox.show()
478
475
        return hbox
479
476
 
480
477
    def _get_merge_target(self):
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,))
 
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,))
486
483
        try:
487
484
            result = d.run()
488
 
            if result != gtk.RESPONSE_OK:
 
485
            if result != Gtk.ResponseType.OK:
489
486
                raise SelectCancelled()
490
487
            return d.get_current_folder_uri()
491
488
        finally:
505
502
        error_dialog('Error', str(e))
506
503
 
507
504
    def _get_save_path(self, basename):
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,))
 
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,))
513
510
        d.set_current_name(basename)
514
511
        try:
515
512
            result = d.run()
516
 
            if result != gtk.RESPONSE_OK:
 
513
            if result != Gtk.ResponseType.OK:
517
514
                raise SelectCancelled()
518
515
            return urlutils.local_path_from_url(d.get_uri())
519
516
        finally:
581
578
class MergeDirectiveController(DiffController):
582
579
 
583
580
    def __init__(self, path, directive, window=None):
584
 
        DiffController.__init__(self, path, directive.patch.splitlines(True),
585
 
                                window)
 
581
        super(MergeDirectiveController, self).__init__(
 
582
            path, directive.patch.splitlines(True), window)
586
583
        self.directive = directive
587
584
        self.merge_target = None
588
585