[gnome-builder/wip/cleanup-source] editor: move "auto-indenter" into GbSourceView
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder/wip/cleanup-source] editor: move "auto-indenter" into GbSourceView
- Date: Fri, 17 Oct 2014 22:48:05 +0000 (UTC)
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]