[gedit] spell-navigator: return the SpellChecker alongside the word



commit a0adbfcbb2e29eaf697d413c93929e3d8d84649f
Author: Sébastien Wilmet <swilmet gnome org>
Date:   Thu Aug 6 16:51:19 2015 +0200

    spell-navigator: return the SpellChecker alongside the word
    
    It is more constrained, the spell checker can change only when going to
    another word. Which is more logical, it doesn't make sense to update the
    spell-checker property at another time. So the property is removed.

 plugins/spell/gedit-spell-checker-dialog.c |  118 +++++++--------------------
 plugins/spell/gedit-spell-navigator-gtv.c  |   54 +++++++++----
 plugins/spell/gedit-spell-navigator.c      |   47 +++++++----
 plugins/spell/gedit-spell-navigator.h      |    9 ++-
 4 files changed, 106 insertions(+), 122 deletions(-)
---
diff --git a/plugins/spell/gedit-spell-checker-dialog.c b/plugins/spell/gedit-spell-checker-dialog.c
index c69d70e..bcbf8d6 100644
--- a/plugins/spell/gedit-spell-checker-dialog.c
+++ b/plugins/spell/gedit-spell-checker-dialog.c
@@ -28,6 +28,7 @@ typedef struct _GeditSpellCheckerDialogPrivate GeditSpellCheckerDialogPrivate;
 struct _GeditSpellCheckerDialogPrivate
 {
        GeditSpellNavigator *navigator;
+       GeditSpellChecker *checker;
 
        gchar *misspelled_word;
 
@@ -57,37 +58,25 @@ enum
 G_DEFINE_TYPE_WITH_PRIVATE (GeditSpellCheckerDialog, gedit_spell_checker_dialog, GTK_TYPE_DIALOG)
 
 static void
-update_spell_checker (GeditSpellCheckerDialog *dialog)
+set_spell_checker (GeditSpellCheckerDialog *dialog,
+                  GeditSpellChecker       *checker)
 {
        GeditSpellCheckerDialogPrivate *priv;
-       GeditSpellChecker *checker;
-       GtkHeaderBar *header_bar;
-       const GeditSpellCheckerLanguage *lang;
 
        priv = gedit_spell_checker_dialog_get_instance_private (dialog);
 
-       g_object_get (priv->navigator,
-                     "spell-checker", &checker,
-                     NULL);
-
-       g_return_if_fail (GEDIT_IS_SPELL_CHECKER (checker));
-
-       header_bar = GTK_HEADER_BAR (gtk_dialog_get_header_bar (GTK_DIALOG (dialog)));
-
-       lang = gedit_spell_checker_get_language (checker);
+       if (g_set_object (&priv->checker, checker))
+       {
+               GtkHeaderBar *header_bar;
+               const GeditSpellCheckerLanguage *lang;
 
-       gtk_header_bar_set_subtitle (header_bar,
-                                    gedit_spell_checker_language_to_string (lang));
+               header_bar = GTK_HEADER_BAR (gtk_dialog_get_header_bar (GTK_DIALOG (dialog)));
 
-       g_object_unref (checker);
-}
+               lang = gedit_spell_checker_get_language (checker);
 
-static void
-spell_checker_notify_cb (GeditSpellNavigator     *navigator,
-                        GParamSpec              *pspec,
-                        GeditSpellCheckerDialog *dialog)
-{
-       update_spell_checker (dialog);
+               gtk_header_bar_set_subtitle (header_bar,
+                                            gedit_spell_checker_language_to_string (lang));
+       }
 }
 
 static void
@@ -101,14 +90,6 @@ set_navigator (GeditSpellCheckerDialog *dialog,
        g_return_if_fail (priv->navigator == NULL);
        priv->navigator = g_object_ref (navigator);
 
-       update_spell_checker (dialog);
-
-       g_signal_connect_object (priv->navigator,
-                                "notify::spell-checker",
-                                G_CALLBACK (spell_checker_notify_cb),
-                                dialog,
-                                0);
-
        g_object_notify (G_OBJECT (dialog), "spell-navigator");
 }
 
@@ -184,7 +165,6 @@ set_misspelled_word (GeditSpellCheckerDialog *dialog,
                     const gchar             *word)
 {
        GeditSpellCheckerDialogPrivate *priv;
-       GeditSpellChecker *checker;
        gchar *label;
        GSList *suggestions;
 
@@ -192,11 +172,7 @@ set_misspelled_word (GeditSpellCheckerDialog *dialog,
 
        priv = gedit_spell_checker_dialog_get_instance_private (dialog);
 
-       g_object_get (priv->navigator,
-                     "spell-checker", &checker,
-                     NULL);
-
-       g_return_if_fail (!gedit_spell_checker_check_word (checker, word, NULL));
+       g_return_if_fail (!gedit_spell_checker_check_word (priv->checker, word, NULL));
 
        g_free (priv->misspelled_word);
        priv->misspelled_word = g_strdup (word);
@@ -205,11 +181,10 @@ set_misspelled_word (GeditSpellCheckerDialog *dialog,
        gtk_label_set_label (priv->misspelled_word_label, label);
        g_free (label);
 
-       suggestions = gedit_spell_checker_get_suggestions (checker, priv->misspelled_word);
+       suggestions = gedit_spell_checker_get_suggestions (priv->checker, priv->misspelled_word);
 
        set_suggestions (dialog, suggestions);
 
-       g_object_unref (checker);
        g_slist_free_full (suggestions, g_free);
 }
 
@@ -242,12 +217,14 @@ static void
 goto_next (GeditSpellCheckerDialog *dialog)
 {
        GeditSpellCheckerDialogPrivate *priv;
-       gchar *word;
+       gchar *word = NULL;
+       GeditSpellChecker *checker = NULL;
        GError *error = NULL;
+       gboolean found;
 
        priv = gedit_spell_checker_dialog_get_instance_private (dialog);
 
-       word = gedit_spell_navigator_goto_next (priv->navigator, &error);
+       found = gedit_spell_navigator_goto_next (priv->navigator, &word, &checker, &error);
 
        if (error != NULL)
        {
@@ -255,15 +232,18 @@ goto_next (GeditSpellCheckerDialog *dialog)
                g_error_free (error);
        }
 
-       if (word != NULL)
+       if (found)
        {
+               set_spell_checker (dialog, checker);
                set_misspelled_word (dialog, word);
-               g_free (word);
        }
        else
        {
                set_completed (dialog);
        }
+
+       g_free (word);
+       g_clear_object (&checker);
 }
 
 static void
@@ -316,6 +296,7 @@ gedit_spell_checker_dialog_dispose (GObject *object)
        priv = gedit_spell_checker_dialog_get_instance_private (GEDIT_SPELL_CHECKER_DIALOG (object));
 
        g_clear_object (&priv->navigator);
+       g_clear_object (&priv->checker);
 
        G_OBJECT_CLASS (gedit_spell_checker_dialog_parent_class)->dispose (object);
 }
@@ -441,7 +422,6 @@ check_word_button_clicked_handler (GtkButton               *button,
                                   GeditSpellCheckerDialog *dialog)
 {
        GeditSpellCheckerDialogPrivate *priv;
-       GeditSpellChecker *checker;
        const gchar *word;
        gboolean correctly_spelled;
        GError *error = NULL;
@@ -450,20 +430,15 @@ check_word_button_clicked_handler (GtkButton               *button,
 
        g_return_if_fail (gtk_entry_get_text_length (priv->word_entry) > 0);
 
-       g_object_get (priv->navigator,
-                     "spell-checker", &checker,
-                     NULL);
-
        word = gtk_entry_get_text (priv->word_entry);
 
-       correctly_spelled = gedit_spell_checker_check_word (checker, word, &error);
+       correctly_spelled = gedit_spell_checker_check_word (priv->checker, word, &error);
 
        if (error != NULL)
        {
                g_warning ("Spell checker dialog: %s", error->message);
                g_error_free (error);
-               error = NULL;
-               goto out;
+               return;
        }
 
        if (correctly_spelled)
@@ -490,15 +465,12 @@ check_word_button_clicked_handler (GtkButton               *button,
        {
                GSList *suggestions;
 
-               suggestions = gedit_spell_checker_get_suggestions (checker, word);
+               suggestions = gedit_spell_checker_get_suggestions (priv->checker, word);
 
                set_suggestions (dialog, suggestions);
 
                g_slist_free_full (suggestions, g_free);
        }
-
-out:
-       g_object_unref (checker);
 }
 
 static void
@@ -506,21 +478,14 @@ add_word_button_clicked_handler (GtkButton               *button,
                                 GeditSpellCheckerDialog *dialog)
 {
        GeditSpellCheckerDialogPrivate *priv;
-       GeditSpellChecker *checker;
 
        priv = gedit_spell_checker_dialog_get_instance_private (dialog);
 
        g_return_if_fail (priv->misspelled_word != NULL);
 
-       g_object_get (priv->navigator,
-                     "spell-checker", &checker,
-                     NULL);
-
-       gedit_spell_checker_add_word_to_personal (checker, priv->misspelled_word);
+       gedit_spell_checker_add_word_to_personal (priv->checker, priv->misspelled_word);
 
        goto_next (dialog);
-
-       g_object_unref (checker);
 }
 
 static void
@@ -535,21 +500,14 @@ ignore_all_button_clicked_handler (GtkButton               *button,
                                   GeditSpellCheckerDialog *dialog)
 {
        GeditSpellCheckerDialogPrivate *priv;
-       GeditSpellChecker *checker;
 
        priv = gedit_spell_checker_dialog_get_instance_private (dialog);
 
        g_return_if_fail (priv->misspelled_word != NULL);
 
-       g_object_get (priv->navigator,
-                     "spell-checker", &checker,
-                     NULL);
-
-       gedit_spell_checker_add_word_to_session (checker, priv->misspelled_word);
+       gedit_spell_checker_add_word_to_session (priv->checker, priv->misspelled_word);
 
        goto_next (dialog);
-
-       g_object_unref (checker);
 }
 
 static void
@@ -557,22 +515,17 @@ change_button_clicked_handler (GtkButton               *button,
                               GeditSpellCheckerDialog *dialog)
 {
        GeditSpellCheckerDialogPrivate *priv;
-       GeditSpellChecker *checker;
        gchar *change_to;
 
        priv = gedit_spell_checker_dialog_get_instance_private (dialog);
 
        g_return_if_fail (priv->misspelled_word != NULL);
 
-       g_object_get (priv->navigator,
-                     "spell-checker", &checker,
-                     NULL);
-
        change_to = g_strdup (gtk_entry_get_text (priv->word_entry));
        g_return_if_fail (change_to != NULL);
        g_return_if_fail (change_to[0] != '\0');
 
-       gedit_spell_checker_set_correction (checker,
+       gedit_spell_checker_set_correction (priv->checker,
                                            priv->misspelled_word,
                                            change_to);
 
@@ -580,8 +533,6 @@ change_button_clicked_handler (GtkButton               *button,
        g_free (change_to);
 
        goto_next (dialog);
-
-       g_object_unref (checker);
 }
 
 /* double click on one of the suggestions is like clicking on "change" */
@@ -603,22 +554,17 @@ change_all_button_clicked_handler (GtkButton               *button,
                                   GeditSpellCheckerDialog *dialog)
 {
        GeditSpellCheckerDialogPrivate *priv;
-       GeditSpellChecker *checker;
        gchar *change_to;
 
        priv = gedit_spell_checker_dialog_get_instance_private (dialog);
 
        g_return_if_fail (priv->misspelled_word != NULL);
 
-       g_object_get (priv->navigator,
-                     "spell-checker", &checker,
-                     NULL);
-
        change_to = g_strdup (gtk_entry_get_text (priv->word_entry));
        g_return_if_fail (change_to != NULL);
        g_return_if_fail (change_to[0] != '\0');
 
-       gedit_spell_checker_set_correction (checker,
+       gedit_spell_checker_set_correction (priv->checker,
                                            priv->misspelled_word,
                                            change_to);
 
@@ -626,8 +572,6 @@ change_all_button_clicked_handler (GtkButton               *button,
        g_free (change_to);
 
        goto_next (dialog);
-
-       g_object_unref (checker);
 }
 
 static void
diff --git a/plugins/spell/gedit-spell-navigator-gtv.c b/plugins/spell/gedit-spell-navigator-gtv.c
index 5c94506..8e0f171 100644
--- a/plugins/spell/gedit-spell-navigator-gtv.c
+++ b/plugins/spell/gedit-spell-navigator-gtv.c
@@ -232,7 +232,15 @@ gedit_spell_navigator_gtv_class_init (GeditSpellNavigatorGtvClass *klass)
                                                              G_PARAM_CONSTRUCT_ONLY |
                                                              G_PARAM_STATIC_STRINGS));
 
-       g_object_class_override_property (object_class, PROP_SPELL_CHECKER, "spell-checker");
+       g_object_class_install_property (object_class,
+                                        PROP_SPELL_CHECKER,
+                                        g_param_spec_object ("spell-checker",
+                                                             "Spell Checker",
+                                                             "",
+                                                             GEDIT_TYPE_SPELL_CHECKER,
+                                                             G_PARAM_READWRITE |
+                                                             G_PARAM_CONSTRUCT |
+                                                             G_PARAM_STATIC_STRINGS));
 }
 
 static void
@@ -264,9 +272,11 @@ select_misspelled_word (GeditSpellNavigatorGtv *navigator)
                                      0.0);
 }
 
-static gchar *
+static gboolean
 gedit_spell_navigator_gtv_goto_next (GeditSpellNavigator  *navigator,
-                                    GError              **error)
+                                    gchar               **word_p,
+                                    GeditSpellChecker   **spell_checker_p,
+                                    GError              **error_p)
 {
        GeditSpellNavigatorGtvPrivate *priv;
        GtkTextIter word_start;
@@ -298,7 +308,7 @@ gedit_spell_navigator_gtv_goto_next (GeditSpellNavigator  *navigator,
 
                if (gtk_text_iter_compare (&end, &word_end) <= 0)
                {
-                       return NULL;
+                       return FALSE;
                }
 
                word_start = word_end;
@@ -309,7 +319,7 @@ gedit_spell_navigator_gtv_goto_next (GeditSpellNavigator  *navigator,
                GtkTextIter word_end;
                gchar *word;
                gboolean correctly_spelled;
-               GError *my_error = NULL;
+               GError *error = NULL;
 
                if (!gtk_text_iter_starts_word (&word_start))
                {
@@ -321,7 +331,7 @@ gedit_spell_navigator_gtv_goto_next (GeditSpellNavigator  *navigator,
                        if (gtk_text_iter_equal (&iter, &word_start))
                        {
                                /* Didn't move, we are at the end. */
-                               return NULL;
+                               return FALSE;
                        }
 
                        gtk_text_iter_backward_word_start (&word_start);
@@ -329,28 +339,28 @@ gedit_spell_navigator_gtv_goto_next (GeditSpellNavigator  *navigator,
 
                if (!gedit_spell_utils_skip_no_spell_check (&word_start, &end))
                {
-                       return NULL;
+                       return FALSE;
                }
 
-               g_return_val_if_fail (gtk_text_iter_starts_word (&word_start), NULL);
+               g_return_val_if_fail (gtk_text_iter_starts_word (&word_start), FALSE);
 
                word_end = word_start;
                gtk_text_iter_forward_word_end (&word_end);
 
                if (gtk_text_iter_compare (&end, &word_end) < 0)
                {
-                       return NULL;
+                       return FALSE;
                }
 
                word = gtk_text_buffer_get_text (priv->buffer, &word_start, &word_end, FALSE);
 
-               correctly_spelled = gedit_spell_checker_check_word (priv->spell_checker, word, &my_error);
+               correctly_spelled = gedit_spell_checker_check_word (priv->spell_checker, word, &error);
 
-               if (my_error != NULL)
+               if (error != NULL)
                {
-                       g_propagate_error (error, my_error);
+                       g_propagate_error (error_p, error);
                        g_free (word);
-                       return NULL;
+                       return FALSE;
                }
 
                if (!correctly_spelled)
@@ -361,14 +371,28 @@ gedit_spell_navigator_gtv_goto_next (GeditSpellNavigator  *navigator,
 
                        select_misspelled_word (GEDIT_SPELL_NAVIGATOR_GTV (navigator));
 
-                       return word;
+                       if (spell_checker_p != NULL)
+                       {
+                               *spell_checker_p = g_object_ref (priv->spell_checker);
+                       }
+
+                       if (word_p != NULL)
+                       {
+                               *word_p = word;
+                       }
+                       else
+                       {
+                               g_free (word);
+                       }
+
+                       return TRUE;
                }
 
                word_start = word_end;
                g_free (word);
        }
 
-       return NULL;
+       return FALSE;
 }
 
 static void
diff --git a/plugins/spell/gedit-spell-navigator.c b/plugins/spell/gedit-spell-navigator.c
index 56fcbb7..5d7a712 100644
--- a/plugins/spell/gedit-spell-navigator.c
+++ b/plugins/spell/gedit-spell-navigator.c
@@ -19,15 +19,16 @@
  */
 
 #include "gedit-spell-navigator.h"
-#include "gedit-spell-checker.h"
 
 G_DEFINE_INTERFACE (GeditSpellNavigator, gedit_spell_navigator, G_TYPE_OBJECT)
 
-static gchar *
+static gboolean
 gedit_spell_navigator_goto_next_default (GeditSpellNavigator  *navigator,
+                                        gchar               **word,
+                                        GeditSpellChecker   **spell_checker,
                                         GError              **error)
 {
-       return NULL;
+       return FALSE;
 }
 
 static void
@@ -50,36 +51,46 @@ gedit_spell_navigator_default_init (GeditSpellNavigatorInterface *iface)
        iface->goto_next = gedit_spell_navigator_goto_next_default;
        iface->change = gedit_spell_navigator_change_default;
        iface->change_all = gedit_spell_navigator_change_all_default;
-
-       g_object_interface_install_property (iface,
-                                            g_param_spec_object ("spell-checker",
-                                                                 "Spell Checker",
-                                                                 "",
-                                                                 GEDIT_TYPE_SPELL_CHECKER,
-                                                                 G_PARAM_READWRITE |
-                                                                 G_PARAM_CONSTRUCT |
-                                                                 G_PARAM_STATIC_STRINGS));
 }
 
 /**
  * gedit_spell_navigator_goto_next:
  * @navigator: a #GeditSpellNavigator.
+ * @word: (out) (optional): a location to store an allocated string, or %NULL.
+ *   Use g_free() to free the returned string.
+ * @spell_checker: (out) (optional) (transfer full): a location to store the
+ *   #GeditSpellChecker used, or %NULL.
  * @error: (out) (optional): a location to a %NULL #GError, or %NULL.
  *
  * Goes to the next misspelled word. When called the first time, goes to the
  * first misspelled word.
  *
- * Returns: the next misspelled word, or %NULL if finished or if an error
- * occurred.
+ * Returns: %TRUE if a next misspelled word has been found, %FALSE if the spell
+ * checking is finished or if an error occurred.
  */
-gchar *
+gboolean
 gedit_spell_navigator_goto_next (GeditSpellNavigator  *navigator,
+                                gchar               **word,
+                                GeditSpellChecker   **spell_checker,
                                 GError              **error)
 {
-       g_return_val_if_fail (GEDIT_IS_SPELL_NAVIGATOR (navigator), NULL);
-       g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+       g_return_val_if_fail (GEDIT_IS_SPELL_NAVIGATOR (navigator), FALSE);
+       g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+
+       if (word != NULL)
+       {
+               *word = NULL;
+       }
+
+       if (spell_checker != NULL)
+       {
+               *spell_checker = NULL;
+       }
 
-       return GEDIT_SPELL_NAVIGATOR_GET_IFACE (navigator)->goto_next (navigator, error);
+       return GEDIT_SPELL_NAVIGATOR_GET_IFACE (navigator)->goto_next (navigator,
+                                                                      word,
+                                                                      spell_checker,
+                                                                      error);
 }
 
 void
diff --git a/plugins/spell/gedit-spell-navigator.h b/plugins/spell/gedit-spell-navigator.h
index 52d409d..622e008 100644
--- a/plugins/spell/gedit-spell-navigator.h
+++ b/plugins/spell/gedit-spell-navigator.h
@@ -22,6 +22,7 @@
 #define __GEDIT_SPELL_NAVIGATOR_H__
 
 #include <glib-object.h>
+#include "gedit-spell-checker.h"
 
 G_BEGIN_DECLS
 
@@ -34,7 +35,9 @@ struct _GeditSpellNavigatorInterface
 {
        GTypeInterface parent_interface;
 
-       gchar *         (* goto_next)           (GeditSpellNavigator  *navigator,
+       gboolean        (* goto_next)           (GeditSpellNavigator  *navigator,
+                                                gchar               **word,
+                                                GeditSpellChecker   **spell_checker,
                                                 GError              **error);
 
        void            (* change)              (GeditSpellNavigator *navigator,
@@ -46,7 +49,9 @@ struct _GeditSpellNavigatorInterface
                                                 const gchar         *change_to);
 };
 
-gchar *                gedit_spell_navigator_goto_next         (GeditSpellNavigator  *navigator,
+gboolean       gedit_spell_navigator_goto_next         (GeditSpellNavigator  *navigator,
+                                                        gchar               **word,
+                                                        GeditSpellChecker   **spell_checker,
                                                         GError              **error);
 
 void           gedit_spell_navigator_change            (GeditSpellNavigator *navigator,


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