[meld] util.sourceviewer: Move to GtkSourceView3 and remove compat shims



commit 1a4df76e966eee0253aef70ee400f88893e7febc
Author: Kai Willadsen <kai willadsen gmail com>
Date:   Mon Oct 7 14:45:48 2013 +1000

    util.sourceviewer: Move to GtkSourceView3 and remove compat shims

 meld/filediff.py          |   27 +++----
 meld/meldbuffer.py        |    8 +-
 meld/patchdialog.py       |   11 ++-
 meld/preferences.py       |   49 ++++--------
 meld/util/sourceviewer.py |  196 ++++++++-------------------------------------
 5 files changed, 70 insertions(+), 221 deletions(-)
---
diff --git a/meld/filediff.py b/meld/filediff.py
index fc4b4ea..c47712f 100644
--- a/meld/filediff.py
+++ b/meld/filediff.py
@@ -47,7 +47,7 @@ from .ui import gnomeglade
 
 from .meldapp import app
 from .util.compat import text_type
-from .util.sourceviewer import srcviewer
+from .util.sourceviewer import LanguageManager
 
 
 class CachedSequenceMatcher(object):
@@ -172,11 +172,6 @@ class FileDiff(melddoc.MeldDoc, gnomeglade.Component):
             column_sizes.add_widget(widget)
 
         self.warned_bad_comparison = False
-        # Some sourceviews bind their own undo mechanism, which we replace
-        # Gtk.binding_entry_remove(srcviewer.GtkTextView, Gdk.KEY_z,
-        #                          Gdk.ModifierType.CONTROL_MASK)
-        # Gtk.binding_entry_remove(srcviewer.GtkTextView, Gdk.KEY_z,
-        #                          Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.SHIFT_MASK)
         for v in self.textview:
             buf = meldbuffer.MeldBuffer()
             buf.connect('begin_user_action',
@@ -186,9 +181,8 @@ class FileDiff(melddoc.MeldDoc, gnomeglade.Component):
             v.set_show_line_numbers(self.prefs.show_line_numbers)
             v.set_insert_spaces_instead_of_tabs(self.prefs.spaces_instead_of_tabs)
             v.set_wrap_mode(self.prefs.edit_wrap_lines)
-            if self.prefs.show_whitespace:
-                v.set_draw_spaces(srcviewer.spaces_flag)
-            srcviewer.set_tab_width(v, self.prefs.tab_size)
+            v.set_draw_spaces(self.prefs.show_whitespace)
+            v.set_tab_width(self.prefs.tab_size)
         self._keymask = 0
         self.load_font()
         self.deleted_lines_pending = -1
@@ -804,19 +798,18 @@ class FileDiff(melddoc.MeldDoc, gnomeglade.Component):
             for i in range(3):
                 self.textview[i].set_tabs(tabs)
             for t in self.textview:
-                srcviewer.set_tab_width(t, value)
+                t.set_tab_width(value)
         elif key == "use_custom_font" or key == "custom_font":
             self.load_font()
         elif key == "show_line_numbers":
             for t in self.textview:
                 t.set_show_line_numbers( value )
         elif key == "show_whitespace":
-            spaces_flag = srcviewer.spaces_flag if value else 0
             for v in self.textview:
-                v.set_draw_spaces(spaces_flag)
+                v.set_draw_spaces(value)
         elif key == "use_syntax_highlighting":
             for i in range(self.num_panes):
-                srcviewer.set_highlight_syntax(self.textbuffer[i], value)
+                self.textbuffer[i].set_highlight_syntax(value)
         elif key == "edit_wrap_lines":
             for t in self.textview:
                 t.set_wrap_mode(self.prefs.edit_wrap_lines)
@@ -1203,7 +1196,7 @@ class FileDiff(melddoc.MeldDoc, gnomeglade.Component):
         for i in range(self.num_panes):
             filename = self.textbuffer[i].data.filename
             if filename:
-                langs.append(srcviewer.get_language_from_file(filename))
+                langs.append(LanguageManager.get_language_from_file(filename))
             else:
                 langs.append(None)
 
@@ -1214,9 +1207,9 @@ class FileDiff(melddoc.MeldDoc, gnomeglade.Component):
             langs = (real_langs[0],) * len(langs)
 
         for i in range(self.num_panes):
-            srcviewer.set_language(self.textbuffer[i], langs[i])
-            srcviewer.set_highlight_syntax(self.textbuffer[i],
-                                           self.prefs.use_syntax_highlighting)
+            self.textbuffer[i].set_language(langs[i])
+            self.textbuffer[i].set_highlight_syntax(
+                self.prefs.use_syntax_highlighting)
 
     def _set_files_internal(self, files):
         for i in self._load_files(files, self.textbuffer):
diff --git a/meld/meldbuffer.py b/meld/meldbuffer.py
index 9658a97..54966cd 100644
--- a/meld/meldbuffer.py
+++ b/meld/meldbuffer.py
@@ -21,17 +21,17 @@ from __future__ import unicode_literals
 import sys
 from gettext import gettext as _
 
-from .util import sourceviewer
+from gi.repository import GtkSource
 
-from .util.compat import text_type
+from meld.util.compat import text_type
 
 
-class MeldBuffer(sourceviewer.srcviewer.GtkTextBuffer):
+class MeldBuffer(GtkSource.Buffer):
 
     __gtype_name__ = "MeldBuffer"
 
     def __init__(self, filename=None):
-        sourceviewer.srcviewer.GtkTextBuffer.__init__(self)
+        GtkSource.Buffer.__init__(self)
         self.data = MeldBufferData(filename)
 
     def reset_buffer(self, filename):
diff --git a/meld/patchdialog.py b/meld/patchdialog.py
index 6075fe4..eb6920e 100644
--- a/meld/patchdialog.py
+++ b/meld/patchdialog.py
@@ -22,11 +22,12 @@ import os
 
 from gi.repository import Gtk
 from gi.repository import Pango
+from gi.repository import GtkSource
 
 from .ui import gnomeglade
 
 from .util.compat import text_type
-from .util.sourceviewer import srcviewer
+from .util.sourceviewer import LanguageManager
 
 
 class PatchDialog(gnomeglade.Component):
@@ -39,11 +40,11 @@ class PatchDialog(gnomeglade.Component):
         self.prefs.notify_add(self.on_preference_changed)
         self.filediff = filediff
 
-        buf = srcviewer.GtkTextBuffer()
+        buf = GtkSource.Buffer()
         self.textview.set_buffer(buf)
-        lang = srcviewer.get_language_from_mime_type("text/x-diff")
-        srcviewer.set_language(buf, lang)
-        srcviewer.set_highlight_syntax(buf, True)
+        lang = LanguageManager.get_language_from_mime_type("text/x-diff")
+        buf.set_language(lang)
+        buf.set_highlight_syntax(True)
 
         fontdesc = Pango.FontDescription(self.prefs.get_current_font())
         self.textview.modify_font(fontdesc)
diff --git a/meld/preferences.py b/meld/preferences.py
index 12e5ee9..1029961 100644
--- a/meld/preferences.py
+++ b/meld/preferences.py
@@ -31,8 +31,6 @@ from .ui import gnomeglade
 from .ui import listwidget
 from .util import prefs
 
-from .util.sourceviewer import srcviewer
-
 
 TIMESTAMP_RESOLUTION_PRESETS = [('1ns (ext4)', 1),
                                 ('100ns (NTFS)', 100),
@@ -157,20 +155,14 @@ class PreferencesDialog(gnomeglade.Component):
         self.spinbutton_tabsize.set_value( self.prefs.tab_size )
         self.checkbutton_highlight_current_line.set_active(
             self.prefs.highlight_current_line)
-        if srcviewer.gsv is not None:
-            self.checkbutton_spaces_instead_of_tabs.set_active( self.prefs.spaces_instead_of_tabs )
-            self.checkbutton_show_line_numbers.set_active( self.prefs.show_line_numbers )
-            self.checkbutton_show_whitespace.set_active(self.prefs.show_whitespace)
-            self.checkbutton_use_syntax_highlighting.set_active( self.prefs.use_syntax_highlighting )
-        else:
-            no_sourceview_text = \
-                _("Only available if you have PyGtkSourceView 2 installed")
-            for w in (self.checkbutton_spaces_instead_of_tabs,
-                      self.checkbutton_show_line_numbers,
-                      self.checkbutton_use_syntax_highlighting,
-                      self.checkbutton_show_whitespace):
-                w.set_sensitive(False)
-                w.set_tooltip_text(no_sourceview_text)
+        self.checkbutton_spaces_instead_of_tabs.set_active(
+            self.prefs.spaces_instead_of_tabs)
+        self.checkbutton_show_line_numbers.set_active(
+            self.prefs.show_line_numbers)
+        self.checkbutton_show_whitespace.set_active(
+            self.prefs.show_whitespace)
+        self.checkbutton_use_syntax_highlighting.set_active(
+            self.prefs.use_syntax_highlighting)
         # TODO: This doesn't restore the state of character wrapping when word
         # wrapping is disabled, but this is hard with our existing gconf keys
         if self.prefs.edit_wrap_lines != Gtk.WrapMode.NONE:
@@ -225,23 +217,14 @@ class PreferencesDialog(gnomeglade.Component):
         self.combo_file_order.set_active(
             1 if self.prefs.vc_left_is_local else 0)
 
-        if srcviewer.gsv is not None:
-            self.checkbutton_show_commit_margin.set_active(
-                self.prefs.vc_show_commit_margin)
-            self.spinbutton_commit_margin.set_value(
-                self.prefs.vc_commit_margin)
-            self.checkbutton_break_commit_lines.set_sensitive(
-                self.prefs.vc_show_commit_margin)
-            self.checkbutton_break_commit_lines.set_active(
-                self.prefs.vc_break_commit_message)
-        else:
-            no_sourceview_text = \
-                _("Only available if you have PyGtkSourceView 2 installed")
-            for w in (self.checkbutton_show_commit_margin,
-                      self.spinbutton_commit_margin,
-                      self.checkbutton_break_commit_lines):
-                w.set_sensitive(False)
-                w.set_tooltip_text(no_sourceview_text)
+        self.checkbutton_show_commit_margin.set_active(
+            self.prefs.vc_show_commit_margin)
+        self.spinbutton_commit_margin.set_value(
+            self.prefs.vc_commit_margin)
+        self.checkbutton_break_commit_lines.set_sensitive(
+            self.prefs.vc_show_commit_margin)
+        self.checkbutton_break_commit_lines.set_active(
+            self.prefs.vc_break_commit_message)
 
         self.widget.show()
 
diff --git a/meld/util/sourceviewer.py b/meld/util/sourceviewer.py
index 60b9861..cc25db1 100644
--- a/meld/util/sourceviewer.py
+++ b/meld/util/sourceviewer.py
@@ -20,183 +20,51 @@
 '''
 
 from gi.repository import Gio
-from gi.repository import Gtk
+from gi.repository import GLib
+from gi.repository import GtkSource
 
 
-class _srcviewer(object):
-    # Module name to be imported for the sourceviewer class
-    srcviewer_module = None
-    # instance of the imported sourceviewer module
-    gsv = None
+class LanguageManager(object):
 
-    spaces_flag = 0
+    manager = GtkSource.LanguageManager()
 
-    def __init__(self):
-        if self.srcviewer_module is not None:
-            self.gsv = __import__(self.srcviewer_module)
-        self.glm = None
-        self.version_check()
-        self.GtkTextView = None
-        self.GtkTextBuffer = None
-        self.overrides()
-
-    def version_check(self):
-        raise NotImplementedError
-
-    def overrides(self):
-        raise NotImplementedError
-
-    def GtkLanguageManager(self):
-        raise NotImplementedError
-
-    def set_highlight_syntax(self, buf, enabled):
-        raise NotImplementedError
-
-    def set_tab_width(self, tab, tab_size):
-        raise NotImplementedError
-
-    def get_language_from_file(self, filename):
-        raise NotImplementedError
-
-    def get_language_from_mime_type(self, mimetype):
-        raise NotImplementedError
-
-    def get_language_manager(self):
-        if self.glm is None:
-            self.glm = self.GtkLanguageManager()
-        return self.glm
-
-    def set_language(self, buf, lang):
-        raise NotImplementedError
-
-
-class _gtksourceview2(_srcviewer):
-    srcviewer_module = "gtksourceview2"
-
-    def version_check(self):
-        raise NotImplementedError
-
-    def overrides(self):
-        self.GtkTextView = self.GtkSource.View
-        self.GtkTextBuffer = self.GtkSource.Buffer
-        self.spaces_flag = self.GtkSource.DrawSpacesFlags.ALL
-
-    def GtkLanguageManager(self):
-        return self.GtkSource.LanguageManager()
-
-    def set_tab_width(self, tab, tab_size):
-        return tab.set_tab_width(tab_size)
-
-    def set_highlight_syntax(self, buf, enabled):
-        return buf.set_highlight_syntax(enabled)
-
-    def get_language_from_file(self, filename):
-        f = Gio.File(filename)
+    @classmethod
+    def get_language_from_file(cls, filename):
+        f = Gio.File.new_for_path(filename)
         try:
-            info = f.query_info(Gio.FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE)
-        except Gio.Error:
+            info = f.query_info(Gio.FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
+                                0, None)
+        except GLib.GError:
             return None
         content_type = info.get_content_type()
-        return self.get_language_manager().guess_language(filename,
-                                                          content_type)
+        return cls.manager.guess_language(filename, content_type)
 
-    def get_language_from_mime_type(self, mime_type):
+    @classmethod
+    def get_language_from_mime_type(cls, mime_type):
         content_type = Gio.content_type_from_mime_type(mime_type)
-        return self.get_language_manager().guess_language(None, content_type)
-
-    def set_language(self, buf, lang):
-        buf.set_language(lang)
-
-
-class gtksourceview24(_gtksourceview2):
+        return cls.manager.guess_language(None, content_type)
 
-    def version_check(self):
-        if self.GtkSource.pygtksourceview2_version[1] < 4:
-            raise ImportError
 
-    def overrides(self):
-        _GtkSource.overrides(self)
-        viewClass = self.GtkSource.View
+class MeldSourceView(GtkSource.View):
 
-        class SourceView(viewClass):
-
-            __gsignals__ = {
-                'key-press-event': 'override'
-            }
-
-            def do_key_press_event(self, event):
-                if event.keyval in (Gdk.KEY_KP_Up, Gdk.KEY_KP_Down,
-                                    Gdk.KEY_Up, Gdk.KEY_Down) and \
-                   (event.get_state() & Gdk.ModifierType.MOD1_MASK) != 0 and \
-                   (event.get_state() & Gdk.ModifierType.SHIFT_MASK) == 0:
-                    return True
-                return viewClass.do_key_press_event(self, event)
-
-        self.GtkTextView = SourceView
-
-
-class gtksourceview210(_gtksourceview2):
-
-    def version_check(self):
-        if self.GtkSource.pygtksourceview2_version[1] < 10:
-            raise ImportError
-
-    def overrides(self):
-        _GtkSource.overrides(self)
-        Gtk.binding_entry_remove(self.GtkTextView, Gdk.KEY_Up,
-                                 Gdk.ModifierType.MOD1_MASK)
-        Gtk.binding_entry_remove(self.GtkTextView, Gdk.KEY_KP_Up,
-                                 Gdk.ModifierType.MOD1_MASK)
-        Gtk.binding_entry_remove(self.GtkTextView, Gdk.KEY_Down,
-                                 Gdk.ModifierType.MOD1_MASK)
-        Gtk.binding_entry_remove(self.GtkTextView, Gdk.KEY_KP_Down,
-                                 Gdk.ModifierType.MOD1_MASK)
-
-
-class nullsourceview(_srcviewer):
-    """Implement the sourceviewer API when no real one is available
-    """
-
-    get_language_from_file = lambda *args: None
-    set_highlight_syntax = lambda *args: None
-    set_language = lambda *args: None
-    set_tab_width = lambda *args: None
-    get_language_from_mime_type = lambda *args: None
-
-    def overrides(self):
-        from gi.repository import GObject
-        from gi.repository import Gtk
-
-        class NullTextView(Gtk.TextView):
-            set_tab_width = lambda *args: None
-            set_show_line_numbers = lambda *args: None
-            set_insert_spaces_instead_of_tabs = lambda *args: None
-            set_draw_spaces = lambda *args: None
-            set_right_margin_position = lambda *args: None
-            set_show_right_margin = lambda *args: None
-        GObject.type_register(NullTextView)
-
-        self.GtkTextView = NullTextView
-        self.GtkTextBuffer = Gtk.TextBuffer
-
-    def version_check(self):
-        pass
-
-
-def _get_srcviewer():
-    # for srcv in (gtksourceview210, gtksourceview24):
-    #     try:
-    #         return srcv()
-    #     except ImportError:
-    #         pass
-    return nullsourceview()
+    __gtype_name__ = "MeldSourceView"
 
+    # TODO: Figure out what bindings we need to add and remove for 3
 
-srcviewer = _get_srcviewer()
+        # Some sourceviews bind their own undo mechanism, which we replace
+        # Gtk.binding_entry_remove(GtkSource.View, Gdk.KEY_z,
+        #                          Gdk.ModifierType.CONTROL_MASK)
+        # Gtk.binding_entry_remove(GtkSource.View, Gdk.KEY_z,
+        #                          Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.SHIFT_MASK)
 
-
-class MeldSourceView(srcviewer.GtkTextView):
-    __gtype_name__ = "MeldSourceView"
+        # Gtk.binding_entry_remove(GtkSource.View, Gdk.KEY_Up,
+        #                          Gdk.ModifierType.MOD1_MASK)
+        # Gtk.binding_entry_remove(GtkSource.View, Gdk.KEY_KP_Up,
+        #                          Gdk.ModifierType.MOD1_MASK)
+        # Gtk.binding_entry_remove(GtkSource.View, Gdk.KEY_Down,
+        #                          Gdk.ModifierType.MOD1_MASK)
+        # Gtk.binding_entry_remove(GtkSource.View, Gdk.KEY_KP_Down,
+        #                          Gdk.ModifierType.MOD1_MASK)
 
     def get_y_for_line_num(self, line):
         buf = self.get_buffer()
@@ -208,3 +76,7 @@ class MeldSourceView(srcviewer.GtkTextView):
 
     def get_line_num_for_y(self, y):
         return self.get_line_at_y(y)[0].get_line()
+
+    def set_draw_spaces(self, draw):
+        spaces_flag = GtkSource.DrawSpacesFlags.ALL if draw else 0
+        super(MeldSourceView, self).set_draw_spaces(spaces_flag)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]