[gnome-builder/wip/cleanup-source] editor: move "auto-indenter" into GbSourceView



commit 0ed9c6c7213011707d9dc9b5d98f4464eec3351c
Author: Christian Hergert <christian hergert me>
Date:   Fri Oct 17 15:47:44 2014 -0700

    editor: move "auto-indenter" into GbSourceView
    
    This simplifies things a bit more, and prepares stuff in a way that would
    be more suitable for inclusion in GtkSourceView.
    
    GbSourceView will maintain an auto_indenter based on the selected
    language. However, if the parent auto-indent property is false, no
    indentation will be used.
    
    This also ensures the configuration is hooked up to the settings widget.

 src/editor/gb-editor-tab.c  |   21 --------
 src/editor/gb-source-view.c |  121 ++++++++++++++++++++++++-------------------
 src/editor/gb-source-view.h |   20 +++----
 3 files changed, 76 insertions(+), 86 deletions(-)
---
diff --git a/src/editor/gb-editor-tab.c b/src/editor/gb-editor-tab.c
index cf17c4a..384b065 100644
--- a/src/editor/gb-editor-tab.c
+++ b/src/editor/gb-editor-tab.c
@@ -29,9 +29,6 @@
 #include "gb-gtk.h"
 #include "gb-log.h"
 #include "gb-rgba.h"
-#include "gb-source-auto-indenter.h"
-#include "gb-source-auto-indenter-c.h"
-#include "gb-source-auto-indenter-xml.h"
 #include "gb-source-change-gutter-renderer.h"
 #include "gb-source-highlight-menu.h"
 #include "gb-source-snippet.h"
@@ -210,10 +207,8 @@ gb_editor_tab_connect_settings (GbEditorTab      *tab,
     g_object_add_weak_pointer (G_OBJECT ((loc)), (gpointer *) &(loc)); \
   } G_STMT_END
 
-#if 0
   ADD_BINDING ("auto-indent", priv->source_view, "auto-indent",
                priv->auto_indent_binding);
-#endif
   ADD_BINDING ("highlight-current-line", priv->source_view,
                "highlight-current-line",
                priv->highlight_current_line_binding);
@@ -260,9 +255,7 @@ gb_editor_tab_disconnect_settings (GbEditorTab *tab)
       (b) = NULL; \
     }
 
-#if 0
   REMOVE_BINDING (priv->auto_indent_binding);
-#endif
   REMOVE_BINDING (priv->highlight_current_line_binding);
   REMOVE_BINDING (priv->highlight_matching_brackets_binding);
   REMOVE_BINDING (priv->insert_spaces_instead_of_tabs_binding);
@@ -425,7 +418,6 @@ gb_editor_tab_language_changed (GbEditorTab      *tab,
                                 GParamSpec       *pspec,
                                 GbEditorDocument *document)
 {
-  GbSourceAutoIndenter *indenter = NULL;
   GtkSourceLanguage *language;
 
   g_return_if_fail (GB_IS_EDITOR_TAB (tab));
@@ -433,19 +425,6 @@ gb_editor_tab_language_changed (GbEditorTab      *tab,
 
   language = gtk_source_buffer_get_language (GTK_SOURCE_BUFFER (document));
 
-  if (language)
-    {
-      const gchar *lang_id = gtk_source_language_get_id (language);
-
-      if (g_str_equal (lang_id, "c") || g_str_equal (lang_id, "chdr"))
-        indenter = gb_source_auto_indenter_c_new ();
-      if (g_str_equal (lang_id, "xml") || g_str_equal (lang_id, "html"))
-        indenter = gb_source_auto_indenter_xml_new ();
-    }
-
-  gb_source_view_set_auto_indenter (tab->priv->source_view, indenter);
-  g_clear_object (&indenter);
-
   gb_editor_tab_reload_snippets (tab, language);
 
 }
diff --git a/src/editor/gb-source-view.c b/src/editor/gb-source-view.c
index 1c537ac..c0dde6e 100644
--- a/src/editor/gb-source-view.c
+++ b/src/editor/gb-source-view.c
@@ -22,6 +22,9 @@
 #include <gtksourceview/gtksource.h>
 
 #include "gb-animation.h"
+#include "gb-source-auto-indenter.h"
+#include "gb-source-auto-indenter-c.h"
+#include "gb-source-auto-indenter-xml.h"
 #include "gb-box-theatric.h"
 #include "gb-cairo.h"
 #include "gb-editor-document.h"
@@ -45,8 +48,10 @@ struct _GbSourceViewPrivate
   guint                      buffer_delete_range_handler;
   guint                      buffer_delete_range_after_handler;
   guint                      buffer_mark_set_handler;
+  guint                      buffer_notify_language_handler;
 
   guint                      show_shadow : 1;
+  guint                      auto_indent : 1;
 };
 
 typedef void (*GbSourceViewMatchFunc) (GbSourceView      *view,
@@ -58,7 +63,7 @@ G_DEFINE_TYPE_WITH_PRIVATE (GbSourceView, gb_source_view, GTK_SOURCE_TYPE_VIEW)
 
 enum {
   PROP_0,
-  PROP_AUTO_INDENTER,
+  PROP_AUTO_INDENT,
   PROP_FONT_NAME,
   PROP_SEARCH_HIGHLIGHTER,
   PROP_SHOW_SHADOW,
@@ -812,7 +817,7 @@ on_mark_set (GtkTextBuffer *buffer,
 
   if (mark == gtk_text_buffer_get_insert (buffer))
     {
-again:
+    again:
       if ((snippet = g_queue_peek_head (priv->snippets)))
         {
           if (!gb_source_snippet_insert_set (snippet, mark))
@@ -827,6 +832,36 @@ again:
 }
 
 static void
+on_language_set (GtkSourceBuffer *buffer,
+                 GParamSpec      *pspec,
+                 GbSourceView    *source_view)
+{
+  GtkSourceLanguage *language;
+  GbSourceAutoIndenter *auto_indenter = NULL;
+
+  g_return_if_fail (GTK_SOURCE_IS_BUFFER (buffer));
+  g_return_if_fail (GB_IS_SOURCE_VIEW (source_view));
+
+  g_clear_object (&source_view->priv->auto_indenter);
+
+  language = gtk_source_buffer_get_language (buffer);
+
+  if (language)
+    {
+      const gchar *lang_id;
+
+      lang_id = gtk_source_language_get_id (language);
+
+      if (g_str_equal (lang_id, "c") || g_str_equal (lang_id, "chdr"))
+        auto_indenter = gb_source_auto_indenter_c_new ();
+      else if (g_str_equal (lang_id, "xml"))
+        auto_indenter = gb_source_auto_indenter_xml_new ();
+    }
+
+  source_view->priv->auto_indenter = auto_indenter;
+}
+
+static void
 gb_source_view_notify_buffer (GObject    *object,
                               GParamSpec *pspec,
                               gpointer    user_data)
@@ -852,11 +887,14 @@ gb_source_view_notify_buffer (GObject    *object,
                                    priv->buffer_delete_range_after_handler);
       g_signal_handler_disconnect (priv->buffer,
                                    priv->buffer_mark_set_handler);
+      g_signal_handler_disconnect (priv->buffer,
+                                   priv->buffer_notify_language_handler);
       priv->buffer_insert_text_handler = 0;
       priv->buffer_insert_text_after_handler = 0;
       priv->buffer_delete_range_handler = 0;
       priv->buffer_delete_range_after_handler = 0;
       priv->buffer_mark_set_handler = 0;
+      priv->buffer_notify_language_handler = 0;
       g_object_remove_weak_pointer (G_OBJECT (priv->buffer),
                                     (gpointer *) &priv->buffer);
       priv->buffer = NULL;
@@ -899,6 +937,12 @@ gb_source_view_notify_buffer (GObject    *object,
                                  G_CALLBACK (on_mark_set),
                                  object,
                                  0);
+      priv->buffer_notify_language_handler =
+        g_signal_connect_object (buffer,
+                                 "notify::language",
+                                 G_CALLBACK (on_language_set),
+                                 object,
+                                 0);
     }
 }
 
@@ -985,7 +1029,8 @@ gb_source_view_key_press_event (GtkWidget   *widget,
    * chain up to the parent class to insert the character, and then let the
    * auto-indenter fix things up.
    */
-  if (priv->auto_indenter &&
+  if (priv->auto_indent &&
+      priv->auto_indenter &&
       gb_source_auto_indenter_is_trigger (priv->auto_indenter, event))
     {
       GtkTextMark *insert;
@@ -1300,6 +1345,17 @@ gb_source_view_set_font_name (GbSourceView *view,
     pango_font_description_free (font_desc);
 }
 
+GbSourceAutoIndenter *
+gb_source_view_get_auto_indenter (GbSourceView *view)
+{
+  g_return_val_if_fail (GB_IS_SOURCE_VIEW (view), NULL);
+
+  if (view->priv->auto_indent)
+    return view->priv->auto_indenter;
+
+  return NULL;
+}
+
 static void
 gb_source_view_finalize (GObject *object)
 {
@@ -1321,37 +1377,6 @@ gb_source_view_finalize (GObject *object)
   G_OBJECT_CLASS (gb_source_view_parent_class)->finalize (object);
 }
 
-GbSourceAutoIndenter *
-gb_source_view_get_auto_indenter (GbSourceView *view)
-{
-  g_return_val_if_fail (GB_IS_SOURCE_VIEW (view), NULL);
-
-  return view->priv->auto_indenter;
-}
-
-void
-gb_source_view_set_auto_indenter (GbSourceView         *view,
-                                  GbSourceAutoIndenter *auto_indenter)
-{
-  GbSourceViewPrivate *priv;
-
-  g_return_if_fail (GB_IS_SOURCE_VIEW (view));
-  g_return_if_fail (!auto_indenter ||
-                    GB_IS_SOURCE_AUTO_INDENTER (auto_indenter));
-
-  priv = view->priv;
-
-  if (priv->auto_indenter != auto_indenter)
-    {
-      g_clear_object (&priv->auto_indenter);
-      priv->auto_indenter = auto_indenter
-                          ? g_object_ref (auto_indenter)
-                          : NULL;
-      g_object_notify_by_pspec (G_OBJECT (view),
-                                gParamSpecs [PROP_AUTO_INDENTER]);
-    }
-}
-
 static void
 gb_source_view_get_property (GObject    *object,
                              guint       prop_id,
@@ -1362,8 +1387,8 @@ gb_source_view_get_property (GObject    *object,
 
   switch (prop_id)
     {
-    case PROP_AUTO_INDENTER:
-      g_value_set_object (value, gb_source_view_get_auto_indenter (view));
+    case PROP_AUTO_INDENT:
+      g_value_set_boolean (value, view->priv->auto_indent);
       break;
 
     case PROP_SEARCH_HIGHLIGHTER:
@@ -1389,8 +1414,8 @@ gb_source_view_set_property (GObject      *object,
 
   switch (prop_id)
     {
-    case PROP_AUTO_INDENTER:
-      gb_source_view_set_auto_indenter (view, g_value_get_object (value));
+    case PROP_AUTO_INDENT:
+      view->priv->auto_indent = g_value_get_boolean (value);
       break;
 
     case PROP_FONT_NAME:
@@ -1426,22 +1451,6 @@ gb_source_view_class_init (GbSourceViewClass *klass)
 
   text_view_class->draw_layer = gb_source_view_draw_layer;
 
-  /**
-   * GbSourceView:auto-indenter:
-   *
-   * Sets the #GbSourceAutoIndenter to use while typing in the source view.
-   *
-   * %NULL to unset the auto-indenter.
-   */
-  gParamSpecs [PROP_AUTO_INDENTER] =
-    g_param_spec_object ("auto-indenter",
-                         _("Auto Indenter"),
-                         _("The indenter to use when auto_indent is set."),
-                         GB_TYPE_SOURCE_AUTO_INDENTER,
-                         (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-  g_object_class_install_property (object_class, PROP_AUTO_INDENTER,
-                                   gParamSpecs [PROP_AUTO_INDENTER]);
-
   gParamSpecs [PROP_FONT_NAME] =
     g_param_spec_string ("font-name",
                          _("Font Name"),
@@ -1469,6 +1478,10 @@ gb_source_view_class_init (GbSourceViewClass *klass)
   g_object_class_install_property (object_class, PROP_SEARCH_HIGHLIGHTER,
                                    gParamSpecs[PROP_SEARCH_HIGHLIGHTER]);
 
+  g_object_class_override_property (object_class,
+                                    PROP_AUTO_INDENT,
+                                    "auto-indent");
+
   gSignals [PUSH_SNIPPET] =
     g_signal_new ("push-snippet",
                   GB_TYPE_SOURCE_VIEW,
diff --git a/src/editor/gb-source-view.h b/src/editor/gb-source-view.h
index 841fc9c..6c66db1 100644
--- a/src/editor/gb-source-view.h
+++ b/src/editor/gb-source-view.h
@@ -61,23 +61,21 @@ struct _GbSourceViewClass
                         const gchar            *search_text);
 };
 
-GType                 gb_source_view_get_type           (void) G_GNUC_CONST;
-void                  gb_source_view_push_snippet       (GbSourceView         *view,
-                                                         GbSourceSnippet      *snippet);
-void                  gb_source_view_clear_snippets     (GbSourceView         *view);
-gboolean              gb_source_view_get_show_shadow    (GbSourceView         *view);
-void                  gb_source_view_set_show_shadow    (GbSourceView         *view,
-                                                         gboolean              show_shadow);
-GbSourceAutoIndenter *gb_source_view_get_auto_indenter  (GbSourceView         *view);
-void                  gb_source_view_set_auto_indenter  (GbSourceView         *view,
-                                                         GbSourceAutoIndenter *auto_indenter);
 void                  gb_source_view_begin_search       (GbSourceView         *view,
                                                          GtkDirectionType      direction,
                                                          const gchar          *search_text);
+void                  gb_source_view_clear_snippets     (GbSourceView         *view);
+GbSourceAutoIndenter *gb_source_view_get_auto_indenter  (GbSourceView         *view);
+gboolean              gb_source_view_get_show_shadow    (GbSourceView         *view);
+GType                 gb_source_view_get_type           (void) G_GNUC_CONST;
 void                  gb_source_view_indent_selection   (GbSourceView         *view);
-void                  gb_source_view_unindent_selection (GbSourceView         *view);
+void                  gb_source_view_push_snippet       (GbSourceView         *view,
+                                                         GbSourceSnippet      *snippet);
 void                  gb_source_view_set_font_name      (GbSourceView         *view,
                                                          const gchar          *font_name);
+void                  gb_source_view_set_show_shadow    (GbSourceView         *view,
+                                                         gboolean              show_shadow);
+void                  gb_source_view_unindent_selection (GbSourceView         *view);
 
 G_END_DECLS
 


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