[gspell] Entry: recheck all when GspellChecker:language changes



commit 08b27334d62aca97bcd9e1cb054ef178dac23bb1
Author: Sébastien Wilmet <swilmet gnome org>
Date:   Sun Oct 30 17:53:42 2016 +0100

    Entry: recheck all when GspellChecker:language changes
    
    One level deeper.

 gspell/gspell-entry.c  |   56 ++++++++++++++++++++++++++++++++++++++++++++---
 testsuite/test-entry.c |   44 +++++++++++++++++++++++++++++++++++++
 2 files changed, 96 insertions(+), 4 deletions(-)
---
diff --git a/gspell/gspell-entry.c b/gspell/gspell-entry.c
index 91b2a2e..13d1a43 100644
--- a/gspell/gspell-entry.c
+++ b/gspell/gspell-entry.c
@@ -41,6 +41,7 @@ struct _GspellEntry
 
        GtkEntry *entry;
        GtkEntryBuffer *buffer;
+       GspellChecker *checker;
 
        /* List elements: GspellEntryWord*.
         * Used for unit tests.
@@ -67,16 +68,14 @@ G_DEFINE_TYPE (GspellEntry, gspell_entry, G_TYPE_OBJECT)
 static GspellChecker *
 get_checker (GspellEntry *gspell_entry)
 {
-       GtkEntryBuffer *gtk_buffer;
        GspellEntryBuffer *gspell_buffer;
 
-       gtk_buffer = gtk_entry_get_buffer (gspell_entry->entry);
-       if (gtk_buffer == NULL)
+       if (gspell_entry->buffer == NULL)
        {
                return NULL;
        }
 
-       gspell_buffer = gspell_entry_buffer_get_from_gtk_entry_buffer (gtk_buffer);
+       gspell_buffer = gspell_entry_buffer_get_from_gtk_entry_buffer (gspell_entry->buffer);
 
        return gspell_entry_buffer_get_spell_checker (gspell_buffer);
 }
@@ -310,10 +309,56 @@ notify_attributes_cb (GtkEntry    *gtk_entry,
 }
 
 static void
+notify_language_cb (GspellChecker *checker,
+                   GParamSpec    *pspec,
+                   GspellEntry   *gspell_entry)
+{
+       emit_changed_signal (gspell_entry);
+}
+
+static void
+set_checker (GspellEntry   *gspell_entry,
+            GspellChecker *checker)
+{
+       if (gspell_entry->checker == checker)
+       {
+               return;
+       }
+
+       if (gspell_entry->checker != NULL)
+       {
+               g_signal_handlers_disconnect_by_func (gspell_entry->checker,
+                                                     notify_language_cb,
+                                                     gspell_entry);
+
+               g_object_unref (gspell_entry->checker);
+       }
+
+       gspell_entry->checker = checker;
+
+       if (gspell_entry->checker != NULL)
+       {
+               g_signal_connect (gspell_entry->checker,
+                                 "notify::language",
+                                 G_CALLBACK (notify_language_cb),
+                                 gspell_entry);
+
+               g_object_ref (gspell_entry->checker);
+       }
+}
+
+static void
+update_checker (GspellEntry *gspell_entry)
+{
+       set_checker (gspell_entry, get_checker (gspell_entry));
+}
+
+static void
 notify_spell_checker_cb (GspellEntryBuffer *gspell_buffer,
                         GParamSpec        *pspec,
                         GspellEntry       *gspell_entry)
 {
+       update_checker (gspell_entry);
        emit_changed_signal (gspell_entry);
 }
 
@@ -352,6 +397,8 @@ set_buffer (GspellEntry    *gspell_entry,
 
                g_object_ref (gspell_entry->buffer);
        }
+
+       update_checker (gspell_entry);
 }
 
 static void
@@ -460,6 +507,7 @@ gspell_entry_dispose (GObject *object)
 
        gspell_entry->entry = NULL;
        set_buffer (gspell_entry, NULL);
+       set_checker (gspell_entry, NULL);
 
        if (gspell_entry->notify_attributes_idle_id != 0)
        {
diff --git a/testsuite/test-entry.c b/testsuite/test-entry.c
index 9a3f200..42d1cd3 100644
--- a/testsuite/test-entry.c
+++ b/testsuite/test-entry.c
@@ -20,6 +20,7 @@
 #include <gspell/gspell.h>
 #include "gspell/gspell-entry-utils.h"
 #include "gspell/gspell-entry-private.h"
+#include "gspell/gspell-checker-private.h"
 
 /* Returns: (transfer full) */
 static GtkEntry *
@@ -297,6 +298,48 @@ test_spell_checker_change (void)
        g_object_unref (gtk_entry);
 }
 
+static void
+test_language_change (void)
+{
+       GtkEntry *gtk_entry;
+       GspellEntry *gspell_entry;
+       GtkEntryBuffer *gtk_buffer;
+       GspellEntryBuffer *gspell_buffer;
+       const GspellLanguage *lang;
+       GspellChecker *checker;
+       GSList *expected_list;
+       const GSList *received_list;
+
+       gtk_entry = GTK_ENTRY (gtk_entry_new ());
+       g_object_ref_sink (gtk_entry);
+
+       gspell_entry = gspell_entry_get_from_gtk_entry (gtk_entry);
+       gspell_entry_set_inline_spell_checking (gspell_entry, TRUE);
+
+       gtk_buffer = gtk_entry_get_buffer (gtk_entry);
+       gspell_buffer = gspell_entry_buffer_get_from_gtk_entry_buffer (gtk_buffer);
+
+       lang = gspell_language_lookup ("en_US");
+       g_assert (lang != NULL);
+
+       checker = gspell_checker_new (lang);
+       gspell_entry_buffer_set_spell_checker (gspell_buffer, checker);
+
+       gtk_entry_set_text (gtk_entry, "auienrst");
+       expected_list = add_word (NULL, "auienrst", 0, 8);
+       received_list = _gspell_entry_get_misspelled_words (gspell_entry);
+       check_entry_word_list_equal (expected_list, received_list);
+       free_word_list (expected_list);
+
+       _gspell_checker_force_set_language (checker, NULL);
+       expected_list = NULL;
+       received_list = _gspell_entry_get_misspelled_words (gspell_entry);
+       check_entry_word_list_equal (expected_list, received_list);
+
+       g_object_unref (gtk_entry);
+       g_object_unref (checker);
+}
+
 gint
 main (gint    argc,
       gchar **argv)
@@ -307,6 +350,7 @@ main (gint    argc,
        g_test_add_func ("/entry/inline-spell-checking-property", test_inline_spell_checking_property);
        g_test_add_func ("/entry/buffer-change", test_buffer_change);
        g_test_add_func ("/entry/spell-checker-change", test_spell_checker_change);
+       g_test_add_func ("/entry/language-change", test_language_change);
 
        return g_test_run ();
 }


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