[gedit-plugins] word completion: add configure options



commit b3568715fa5e3a000bd6414032a1fe4a4a91d269
Author: Sébastien Wilmet <swilmet gnome org>
Date:   Sun Jun 9 20:29:02 2013 +0200

    word completion: add configure options
    
    - minimum word size
    - whether to enable interactive completion
    
    GtkSourceView >= 3.9.2 required.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=614103

 configure.ac                                       |    3 +-
 plugins/wordcompletion/Makefile.am                 |   20 +++-
 .../gedit-word-completion-configure.ui             |   75 +++++++++++
 .../wordcompletion/gedit-word-completion-plugin.c  |  131 ++++++++++++++++++-
 .../wordcompletion/gedit-word-completion-plugin.h  |    1 -
 .../gedit-word-completion.gresource.xml            |    6 +
 ....gedit.plugins.wordcompletion.gschema.xml.in.in |   15 +++
 po/POTFILES.in                                     |    2 +
 po/POTFILES.skip                                   |    1 +
 9 files changed, 243 insertions(+), 11 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index f01df1c..02727e0 100644
--- a/configure.ac
+++ b/configure.ac
@@ -67,7 +67,7 @@ PKG_CHECK_MODULES(GEDIT, [
        glib-2.0 >= 2.32.0
        gio-2.0 >= 2.32.0
        gtk+-3.0 >= 3.4.0
-       gtksourceview-3.0 >= 3.0.0
+       gtksourceview-3.0 >= 3.9.2
        libpeas-1.0 >= 1.7.0
        libpeas-gtk-1.0 >= 1.7.0
        gedit >= 3.7.1
@@ -386,6 +386,7 @@ plugins/textsize/Makefile
 plugins/textsize/textsize.plugin.desktop.in
 plugins/textsize/textsize/Makefile
 plugins/wordcompletion/Makefile
+plugins/wordcompletion/org.gnome.gedit.plugins.wordcompletion.gschema.xml.in
 plugins/wordcompletion/wordcompletion.plugin.desktop.in
 po/Makefile.in])
 
diff --git a/plugins/wordcompletion/Makefile.am b/plugins/wordcompletion/Makefile.am
index 5b769b5..fe70fd5 100644
--- a/plugins/wordcompletion/Makefile.am
+++ b/plugins/wordcompletion/Makefile.am
@@ -9,13 +9,20 @@ INCLUDES = \
 
 plugin_LTLIBRARIES = libwordcompletion.la
 
+BUILT_SOURCES = \
+       gedit-word-completion-resources.c
+
 libwordcompletion_la_SOURCES = \
        gedit-word-completion-plugin.h                          \
-       gedit-word-completion-plugin.c                          
+       gedit-word-completion-plugin.c                          \
+       $(BUILT_SOURCES)
 
 libwordcompletion_la_LDFLAGS = $(PLUGIN_LIBTOOL_FLAGS)
 libwordcompletion_la_LIBADD = $(GEDIT_LIBS)
 
+gedit-word-completion-resources.c: gedit-word-completion.gresource.xml $(shell $(GLIB_COMPILE_RESOURCES) 
--sourcedir=$(srcdir) --generate-dependencies $(srcdir)/gedit-word-completion.gresource.xml)
+       $(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) --target=$@ --sourcedir=$(srcdir) --generate-source 
$(srcdir)/gedit-word-completion.gresource.xml
+
 # Plugin Info
 
 plugin_in_files = wordcompletion.plugin.desktop.in
@@ -24,7 +31,16 @@ plugin_in_files = wordcompletion.plugin.desktop.in
 
 plugin_DATA = $(plugin_in_files:.plugin.desktop.in=.plugin)
 
-EXTRA_DIST = $(plugin_in_files)
+gsettings_SCHEMAS = org.gnome.gedit.plugins.wordcompletion.gschema.xml
+
+ INTLTOOL_XML_NOMERGE_RULE@
+ GSETTINGS_RULES@
+
+EXTRA_DIST = \
+       $(plugin_in_files) \
+       org.gnome.gedit.plugins.wordcompletion.gschema.xml.in.in \
+       gedit-word-completion.gresource.xml \
+       gedit-word-completion-configure.ui
 
 CLEANFILES = $(plugin_DATA)
 DISTCLEANFILES = $(plugin_DATA)
diff --git a/plugins/wordcompletion/gedit-word-completion-configure.ui 
b/plugins/wordcompletion/gedit-word-completion-configure.ui
new file mode 100644
index 0000000..dac2b57
--- /dev/null
+++ b/plugins/wordcompletion/gedit-word-completion-configure.ui
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <!-- interface-requires gtk+ 3.0 -->
+  <object class="GtkAdjustment" id="adjustment1">
+    <property name="lower">2</property>
+    <property name="upper">100</property>
+    <property name="value">2</property>
+    <property name="step_increment">1</property>
+    <property name="page_increment">10</property>
+  </object>
+  <object class="GtkGrid" id="content">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="border_width">6</property>
+    <property name="row_spacing">3</property>
+    <child>
+      <object class="GtkCheckButton" id="check_button_interactive_completion">
+        <property name="label" translatable="yes">Interactive completion</property>
+        <property name="use_action_appearance">False</property>
+        <property name="visible">True</property>
+        <property name="can_focus">True</property>
+        <property name="receives_default">False</property>
+        <property name="xalign">0</property>
+        <property name="draw_indicator">True</property>
+      </object>
+      <packing>
+        <property name="left_attach">0</property>
+        <property name="top_attach">0</property>
+        <property name="width">1</property>
+        <property name="height">1</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkGrid" id="grid2">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="column_spacing">10</property>
+        <child>
+          <object class="GtkLabel" id="label1">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="xalign">0</property>
+            <property name="label" translatable="yes">Minimum word size:</property>
+          </object>
+          <packing>
+            <property name="left_attach">0</property>
+            <property name="top_attach">0</property>
+            <property name="width">1</property>
+            <property name="height">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkSpinButton" id="spin_button_min_word_size">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="invisible_char">●</property>
+            <property name="adjustment">adjustment1</property>
+          </object>
+          <packing>
+            <property name="left_attach">1</property>
+            <property name="top_attach">0</property>
+            <property name="width">1</property>
+            <property name="height">1</property>
+          </packing>
+        </child>
+      </object>
+      <packing>
+        <property name="left_attach">0</property>
+        <property name="top_attach">1</property>
+        <property name="width">1</property>
+        <property name="height">1</property>
+      </packing>
+    </child>
+  </object>
+</interface>
diff --git a/plugins/wordcompletion/gedit-word-completion-plugin.c 
b/plugins/wordcompletion/gedit-word-completion-plugin.c
index dee7582..6466723 100644
--- a/plugins/wordcompletion/gedit-word-completion-plugin.c
+++ b/plugins/wordcompletion/gedit-word-completion-plugin.c
@@ -1,6 +1,7 @@
 /*
  * Copyright (C) 2009 Ignacio Casal Quinteiro <icq gnome org>
  *               2009 Jesse van den Kieboom <jesse gnome org>
+ *               2013 Sébastien Wilmet <swilmet gnome org>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -29,13 +30,19 @@
 #include <gedit/gedit-window-activatable.h>
 #include <gedit/gedit-view.h>
 #include <gedit/gedit-view-activatable.h>
-#include <gtksourceview/gtksourcecompletionprovider.h>
+#include <libpeas-gtk/peas-gtk-configurable.h>
+#include <gtksourceview/gtksource.h>
 #include <gtksourceview/completion-providers/words/gtksourcecompletionwords.h>
 
 #define WINDOW_PROVIDER "GeditWordCompletionPluginProvider"
 
+#define WORD_COMPLETION_SETTINGS_BASE "org.gnome.gedit.plugins.wordcompletion"
+#define SETTINGS_KEY_INTERACTIVE_COMPLETION "interactive-completion"
+#define SETTINGS_KEY_MINIMUM_WORD_SIZE "minimum-word-size"
+
 static void gedit_window_activatable_iface_init (GeditWindowActivatableInterface *iface);
 static void gedit_view_activatable_iface_init (GeditViewActivatableInterface *iface);
+static void peas_gtk_configurable_iface_init (PeasGtkConfigurableInterface *iface);
 
 G_DEFINE_DYNAMIC_TYPE_EXTENDED (GeditWordCompletionPlugin,
                                 gedit_word_completion_plugin,
@@ -44,7 +51,9 @@ G_DEFINE_DYNAMIC_TYPE_EXTENDED (GeditWordCompletionPlugin,
                                 G_IMPLEMENT_INTERFACE_DYNAMIC (GEDIT_TYPE_WINDOW_ACTIVATABLE,
                                                                gedit_window_activatable_iface_init)
                                 G_IMPLEMENT_INTERFACE_DYNAMIC (GEDIT_TYPE_VIEW_ACTIVATABLE,
-                                                               gedit_view_activatable_iface_init))
+                                                               gedit_view_activatable_iface_init)
+                                G_IMPLEMENT_INTERFACE_DYNAMIC (PEAS_GTK_TYPE_CONFIGURABLE,
+                                                               peas_gtk_configurable_iface_init))
 
 struct _GeditWordCompletionPluginPrivate
 {
@@ -141,6 +150,61 @@ gedit_word_completion_plugin_get_property (GObject    *object,
 }
 
 static void
+update_activation (GtkSourceCompletionWords *provider,
+                  GSettings                *settings)
+{
+       GtkSourceCompletionActivation activation;
+
+       g_object_get (provider, "activation", &activation, NULL);
+
+       if (g_settings_get_boolean (settings, SETTINGS_KEY_INTERACTIVE_COMPLETION))
+       {
+               activation |= GTK_SOURCE_COMPLETION_ACTIVATION_INTERACTIVE;
+       }
+       else
+       {
+               activation &= ~GTK_SOURCE_COMPLETION_ACTIVATION_INTERACTIVE;
+       }
+
+       g_object_set (provider, "activation", activation, NULL);
+}
+
+static void
+on_interactive_completion_changed_cb (GSettings                *settings,
+                                     gchar                    *key,
+                                     GtkSourceCompletionWords *provider)
+{
+       update_activation (provider, settings);
+}
+
+static GtkSourceCompletionWords *
+create_provider (void)
+{
+       GtkSourceCompletionWords *provider;
+       GSettings *settings;
+
+       provider = gtk_source_completion_words_new (_("Document Words"), NULL);
+
+       settings = g_settings_new (WORD_COMPLETION_SETTINGS_BASE);
+
+       g_settings_bind (settings, SETTINGS_KEY_MINIMUM_WORD_SIZE,
+                        provider, "minimum-word-size",
+                        G_SETTINGS_BIND_GET);
+
+       update_activation (provider, settings);
+
+       g_signal_connect_object (settings,
+                                "changed::" SETTINGS_KEY_INTERACTIVE_COMPLETION,
+                                G_CALLBACK (on_interactive_completion_changed_cb),
+                                provider,
+                                0);
+
+       g_object_unref (settings);
+
+       return provider;
+}
+
+static void
 gedit_word_completion_window_activate (GeditWindowActivatable *activatable)
 {
        GeditWordCompletionPluginPrivate *priv;
@@ -150,8 +214,7 @@ gedit_word_completion_window_activate (GeditWindowActivatable *activatable)
 
        priv = GEDIT_WORD_COMPLETION_PLUGIN (activatable)->priv;
 
-       provider = gtk_source_completion_words_new (_("Document Words"),
-                                                   NULL);
+       provider = create_provider ();
 
        g_object_set_data_full (G_OBJECT (priv->window),
                                WINDOW_PROVIDER,
@@ -196,9 +259,7 @@ gedit_word_completion_view_activate (GeditViewActivatable *activatable)
        if (provider == NULL)
        {
                /* Standalone provider */
-               provider = GTK_SOURCE_COMPLETION_PROVIDER (
-                       gtk_source_completion_words_new (_("Document Words"),
-                                                        NULL));
+               provider = GTK_SOURCE_COMPLETION_PROVIDER (create_provider ());
        }
 
        priv->provider = g_object_ref (provider);
@@ -231,6 +292,52 @@ gedit_word_completion_view_deactivate (GeditViewActivatable *activatable)
                                                buf);
 }
 
+static GtkWidget *
+gedit_word_completion_create_configure_widget (PeasGtkConfigurable *configurable)
+{
+       GtkBuilder *builder;
+       GtkWidget *content;
+       GtkWidget *interactive_completion;
+       GtkWidget *min_word_size;
+       GSettings *settings;
+       GError *error = NULL;
+
+       builder = gtk_builder_new ();
+       gtk_builder_set_translation_domain (builder, GETTEXT_PACKAGE);
+       gtk_builder_add_from_resource (builder,
+                                      
"/org/gnome/gedit/plugins/wordcompletion/ui/gedit-word-completion-configure.ui",
+                                      &error);
+
+       if (error != NULL)
+       {
+               g_warning ("Word Completion configuration widget: %s", error->message);
+               g_error_free (error);
+               error = NULL;
+       }
+
+       content = GTK_WIDGET (gtk_builder_get_object (builder, "content"));
+       g_object_ref (content);
+
+       interactive_completion = GTK_WIDGET (gtk_builder_get_object (builder, 
"check_button_interactive_completion"));
+       min_word_size = GTK_WIDGET (gtk_builder_get_object (builder, "spin_button_min_word_size"));
+
+       g_object_unref (builder);
+
+       settings = g_settings_new (WORD_COMPLETION_SETTINGS_BASE);
+
+       g_settings_bind (settings, SETTINGS_KEY_INTERACTIVE_COMPLETION,
+                        interactive_completion, "active",
+                        G_SETTINGS_BIND_DEFAULT | G_SETTINGS_BIND_GET_NO_CHANGES);
+
+       g_settings_bind (settings, SETTINGS_KEY_MINIMUM_WORD_SIZE,
+                        min_word_size, "value",
+                        G_SETTINGS_BIND_DEFAULT | G_SETTINGS_BIND_GET_NO_CHANGES);
+
+       g_object_unref (settings);
+
+       return content;
+}
+
 static void
 gedit_word_completion_plugin_class_init (GeditWordCompletionPluginClass *klass)
 {
@@ -265,6 +372,12 @@ gedit_view_activatable_iface_init (GeditViewActivatableInterface *iface)
        iface->deactivate = gedit_word_completion_view_deactivate;
 }
 
+static void
+peas_gtk_configurable_iface_init (PeasGtkConfigurableInterface *iface)
+{
+       iface->create_configure_widget = gedit_word_completion_create_configure_widget;
+}
+
 G_MODULE_EXPORT void
 peas_register_types (PeasObjectModule *module)
 {
@@ -277,4 +390,8 @@ peas_register_types (PeasObjectModule *module)
        peas_object_module_register_extension_type (module,
                                                    GEDIT_TYPE_VIEW_ACTIVATABLE,
                                                    GEDIT_TYPE_WORD_COMPLETION_PLUGIN);
+
+       peas_object_module_register_extension_type (module,
+                                                   PEAS_GTK_TYPE_CONFIGURABLE,
+                                                   GEDIT_TYPE_WORD_COMPLETION_PLUGIN);
 }
diff --git a/plugins/wordcompletion/gedit-word-completion-plugin.h 
b/plugins/wordcompletion/gedit-word-completion-plugin.h
index 674c044..428046d 100644
--- a/plugins/wordcompletion/gedit-word-completion-plugin.h
+++ b/plugins/wordcompletion/gedit-word-completion-plugin.h
@@ -42,7 +42,6 @@ struct _GeditWordCompletionPlugin
 {
        PeasExtensionBase parent_instance;
 
-       
        GeditWordCompletionPluginPrivate *priv;
 };
 
diff --git a/plugins/wordcompletion/gedit-word-completion.gresource.xml 
b/plugins/wordcompletion/gedit-word-completion.gresource.xml
new file mode 100644
index 0000000..6d438bc
--- /dev/null
+++ b/plugins/wordcompletion/gedit-word-completion.gresource.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gresources>
+  <gresource prefix="/org/gnome/gedit/plugins/wordcompletion/ui">
+    <file preprocess="xml-stripblanks">gedit-word-completion-configure.ui</file>
+  </gresource>
+</gresources>
diff --git a/plugins/wordcompletion/org.gnome.gedit.plugins.wordcompletion.gschema.xml.in.in 
b/plugins/wordcompletion/org.gnome.gedit.plugins.wordcompletion.gschema.xml.in.in
new file mode 100644
index 0000000..c0cdae9
--- /dev/null
+++ b/plugins/wordcompletion/org.gnome.gedit.plugins.wordcompletion.gschema.xml.in.in
@@ -0,0 +1,15 @@
+<schemalist>
+  <schema gettext-domain="@GETTEXT_PACKAGE@" id="org.gnome.gedit.plugins.wordcompletion" 
path="/org/gnome/gedit/plugins/wordcompletion/">
+    <key name="interactive-completion" type="b">
+      <default>true</default>
+      <_summary>Interactive Completion</_summary>
+      <_description>Whether to enable interactive completion.</_description>
+    </key>
+    <key name="minimum-word-size" type="u">
+      <range min="2" max="100" />
+      <default>2</default>
+      <_summary>Minimum Word Size</_summary>
+      <_description>The minimum word size to complete.</_description>
+    </key>
+  </schema>
+</schemalist>
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 509b7be..df5f9b6 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -30,5 +30,7 @@ plugins/terminal/terminal.plugin.desktop.in.in
 plugins/terminal/terminal.py
 plugins/textsize/textsize/__init__.py
 plugins/textsize/textsize.plugin.desktop.in.in
+[type: gettext/glade]plugins/wordcompletion/gedit-word-completion-configure.ui
 plugins/wordcompletion/gedit-word-completion-plugin.c
+plugins/wordcompletion/org.gnome.gedit.plugins.wordcompletion.gschema.xml.in.in
 plugins/wordcompletion/wordcompletion.plugin.desktop.in.in
diff --git a/po/POTFILES.skip b/po/POTFILES.skip
index abe38c3..1ce4192 100644
--- a/po/POTFILES.skip
+++ b/po/POTFILES.skip
@@ -15,4 +15,5 @@ plugins/synctex/synctex.plugin.desktop.in
 plugins/terminal/org.gnome.gedit.plugins.terminal.gschema.xml.in
 plugins/terminal/terminal.plugin.desktop.in
 plugins/textsize/textsize.plugin.desktop.in
+plugins/wordcompletion/org.gnome.gedit.plugins.wordcompletion.gschema.xml.in
 plugins/wordcompletion/wordcompletion.plugin.desktop.in


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