[evolution/webkit-composer: 64/111] Various fixes in the spell-checking classes
- From: Matthew Barnes <mbarnes src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution/webkit-composer: 64/111] Various fixes in the spell-checking classes
- Date: Thu, 10 Jan 2013 16:26:50 +0000 (UTC)
commit afb8043813c63e5628f3787957d9bd4292a32bcb
Author: Dan VrÃtil <dvratil redhat com>
Date: Mon Aug 27 13:52:34 2012 +0200
Various fixes in the spell-checking classes
e-util/e-spell-checker.c | 9 ++-
e-util/e-spell-dictionary.c | 6 +-
e-util/e-spell-entry.c | 208 ++++++++++++++++++++++---------------------
3 files changed, 117 insertions(+), 106 deletions(-)
---
diff --git a/e-util/e-spell-checker.c b/e-util/e-spell-checker.c
index 4fd6849..f55a8ca 100644
--- a/e-util/e-spell-checker.c
+++ b/e-util/e-spell-checker.c
@@ -45,6 +45,7 @@ struct _ESpellCheckerPrivate {
};
enum {
+ PROP_0,
PROP_ACTIVE_DICTIONARIES
};
@@ -341,6 +342,8 @@ e_spell_checker_init (ESpellChecker *checker)
{
checker->priv = G_TYPE_INSTANCE_GET_PRIVATE (
checker, E_TYPE_SPELL_CHECKER, ESpellCheckerPrivate);
+
+ checker->priv->broker = enchant_broker_init ();
}
typedef struct {
@@ -383,7 +386,9 @@ GList *
e_spell_checker_list_available_dicts (ESpellChecker *checker)
{
ESpellChecker *e_checker;
- ListAvailDictsData data;
+ ListAvailDictsData data = { 0 };
+
+ g_return_val_if_fail (E_IS_SPELL_CHECKER (checker), NULL);
e_checker = E_SPELL_CHECKER (checker);
@@ -411,6 +416,8 @@ e_spell_checker_lookup_dictionary (ESpellChecker *checker,
ESpellChecker *e_checker;
ESpellDictionary *e_dict;
+ g_return_val_if_fail (E_IS_SPELL_CHECKER (checker), NULL);
+
e_checker = E_SPELL_CHECKER (checker);
e_dict = NULL;
diff --git a/e-util/e-spell-dictionary.c b/e-util/e-spell-dictionary.c
index aed60ce..e5ed02a 100644
--- a/e-util/e-spell-dictionary.c
+++ b/e-util/e-spell-dictionary.c
@@ -39,6 +39,7 @@ G_DEFINE_TYPE (
enum {
+ PROP_0,
PROP_SPELLCHECKER
};
@@ -317,6 +318,7 @@ spell_dictionary_set_enchant_dict (ESpellDictionary *dictionary,
enchant_dict_describe (enchant_dict, describe_dictionary, &data);
+ dictionary->priv->dict = enchant_dict;
dictionary->priv->code = data.language_tag;
dictionary->priv->name = data.dict_name;
dictionary->priv->collate_key = g_utf8_collate_key (data.dict_name, -1);
@@ -364,9 +366,7 @@ spell_dictionary_dispose (GObject *object)
{
ESpellDictionaryPrivate *priv = E_SPELL_DICTIONARY (object)->priv;
- e_spell_checker_free_dict (
- e_spell_dictionary_get_parent_checker (E_SPELL_DICTIONARY (object)),
- priv->dict);
+ e_spell_checker_free_dict (priv->spell_checker, priv->dict);
priv->dict = NULL;
g_free (priv->name);
diff --git a/e-util/e-spell-entry.c b/e-util/e-spell-entry.c
index 56f7c14..2330fc1 100644
--- a/e-util/e-spell-entry.c
+++ b/e-util/e-spell-entry.c
@@ -25,8 +25,7 @@
#include <glib/gi18n-lib.h>
#include <gtk/gtk.h>
-#include <editor/gtkhtml-spell-language.h>
-#include <editor/gtkhtml-spell-checker.h>
+#include <e-util/e-spell-checker.h>
#include "e-spell-entry.h"
@@ -43,10 +42,12 @@ struct _ESpellEntryPrivate
GSettings *settings;
gboolean custom_checkers;
gboolean checking_enabled;
- GSList *checkers;
+ GSList *dictionaries;
gchar **words;
gint *word_starts;
gint *word_ends;
+
+ ESpellChecker *spell_checker;
};
#define E_SPELL_ENTRY_GET_PRIVATE(obj) \
@@ -76,9 +77,9 @@ word_misspelled (ESpellEntry *entry,
GSList *li;
gssize wlen = strlen (word);
- for (li = entry->priv->checkers; li; li = g_slist_next (li)) {
- GtkhtmlSpellChecker *checker = li->data;
- if (gtkhtml_spell_checker_check_word (checker, word, wlen)) {
+ for (li = entry->priv->dictionaries; li; li = g_slist_next (li)) {
+ EnchantDict *dict = li->data;
+ if (enchant_dict_check (dict, word, wlen)) {
result = FALSE;
break;
}
@@ -149,7 +150,7 @@ spell_entry_recheck_all (ESpellEntry *entry)
pango_attr_list_unref (entry->priv->attr_list);
entry->priv->attr_list = pango_attr_list_new ();
- if (entry->priv->checkers && entry->priv->checking_enabled) {
+ if (entry->priv->dictionaries && entry->priv->checking_enabled) {
/* Loop through words */
for (i = 0; entry->priv->words[i]; i++) {
length = strlen (entry->priv->words[i]);
@@ -252,14 +253,15 @@ add_to_dictionary (GtkWidget *menuitem,
{
gchar *word;
gint start, end;
- GtkhtmlSpellChecker *checker;
+ EnchantDict *dict;
get_word_extents_from_position (entry, &start, &end, entry->priv->mark_character);
word = gtk_editable_get_chars (GTK_EDITABLE (entry), start, end);
- checker = g_object_get_data (G_OBJECT (menuitem), "spell-entry-checker");
- if (checker)
- gtkhtml_spell_checker_add_word (checker, word, -1);
+ dict = g_object_get_data (G_OBJECT (menuitem), "spell-entry-checker");
+ if (dict) {
+ enchant_dict_add_to_personal (dict, word, -1);
+ }
g_free (word);
@@ -284,9 +286,9 @@ ignore_all (GtkWidget *menuitem,
get_word_extents_from_position (entry, &start, &end, entry->priv->mark_character);
word = gtk_editable_get_chars (GTK_EDITABLE (entry), start, end);
- for (li = entry->priv->checkers; li; li = g_slist_next (li)) {
- GtkhtmlSpellChecker *checker = li->data;
- gtkhtml_spell_checker_add_word_to_session (checker, word, -1);
+ for (li = entry->priv->dictionaries; li; li = g_slist_next (li)) {
+ EnchantDict *dict = li->data;
+ enchant_dict_add_to_session (dict, word, -1);
}
g_free (word);
@@ -308,7 +310,7 @@ replace_word (GtkWidget *menuitem,
const gchar *newword;
gint start, end;
gint cursor;
- GtkhtmlSpellChecker *checker;
+ EnchantDict *dict;
get_word_extents_from_position (entry, &start, &end, entry->priv->mark_character);
oldword = gtk_editable_get_chars (GTK_EDITABLE (entry), start, end);
@@ -323,15 +325,15 @@ replace_word (GtkWidget *menuitem,
gtk_editable_delete_text (GTK_EDITABLE (entry), start, end);
gtk_editable_set_position (GTK_EDITABLE (entry), start);
- gtk_editable_insert_text (
- GTK_EDITABLE (entry), newword, strlen (newword),
- &start);
+ gtk_editable_insert_text (GTK_EDITABLE (entry), newword, strlen (newword),
+ &start);
gtk_editable_set_position (GTK_EDITABLE (entry), cursor);
- checker = g_object_get_data (G_OBJECT (menuitem), "spell-entry-checker");
+ dict = g_object_get_data (G_OBJECT (menuitem), "spell-entry-checker");
- if (checker)
- gtkhtml_spell_checker_store_replacement (checker, oldword, -1, newword, -1);
+ if (dict) {
+ enchant_dict_store_replacement (dict, oldword, -1, newword, -1);
+ }
g_free (oldword);
}
@@ -339,13 +341,13 @@ replace_word (GtkWidget *menuitem,
static void
build_suggestion_menu (ESpellEntry *entry,
GtkWidget *menu,
- GtkhtmlSpellChecker *checker,
+ ESpellDictionary *dict,
const gchar *word)
{
GtkWidget *mi;
- GList *suggestions, *iter;
+ GList *suggestions;
- suggestions = gtkhtml_spell_checker_get_suggestions (checker, word, -1);
+ suggestions = e_spell_dictionary_get_suggestions (dict, word, -1);
if (!suggestions) {
/* no suggestions. Put something in the menu anyway... */
@@ -364,10 +366,13 @@ build_suggestion_menu (ESpellEntry *entry,
gtk_widget_show_all (mi);
gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), mi);
} else {
- gint ii = 0;
+ GList *iter;
+ gint ii;
/* build a set of menus with suggestions */
- for (iter = suggestions; iter; iter = g_list_next (iter), ii++) {
+ for (iter = suggestions, ii = 0; iter; iter = iter->next, ii++) {
+ gchar *suggestion = iter->data;
+
if ((ii != 0) && (ii % 10 == 0)) {
mi = gtk_separator_menu_item_new ();
gtk_widget_show (mi);
@@ -381,50 +386,45 @@ build_suggestion_menu (ESpellEntry *entry,
gtk_menu_item_set_submenu (GTK_MENU_ITEM (mi), menu);
}
- mi = gtk_menu_item_new_with_label (iter->data);
- g_object_set_data (G_OBJECT (mi), "spell-entry-checker", checker);
- g_signal_connect (mi, "activate", G_CALLBACK (replace_word), entry);
+ mi = gtk_menu_item_new_with_label (suggestion);
+ g_object_set_data (G_OBJECT (mi), "spell-entry-checker", dict);
+ g_signal_connect (G_OBJECT (mi), "activate", G_CALLBACK (replace_word), entry);
gtk_widget_show (mi);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
}
}
- g_list_free_full (suggestions, g_free);
+ e_spell_dictionary_free_suggestions (suggestions);
}
static GtkWidget *
build_spelling_menu (ESpellEntry *entry,
const gchar *word)
{
- GtkhtmlSpellChecker *checker;
+ ESpellDictionary *dict;
GtkWidget *topmenu, *mi;
gchar *label;
topmenu = gtk_menu_new ();
- if (!entry->priv->checkers)
+ if (!entry->priv->dictionaries)
return topmenu;
/* Suggestions */
- if (!entry->priv->checkers->next) {
- checker = entry->priv->checkers->data;
- build_suggestion_menu (entry, topmenu, checker, word);
+ if (!entry->priv->dictionaries->next) {
+ dict = entry->priv->dictionaries->data;
+ build_suggestion_menu (entry, topmenu, dict, word);
} else {
GSList *li;
GtkWidget *menu;
const gchar *lang_name;
- for (li = entry->priv->checkers; li; li = g_slist_next (li)) {
- const GtkhtmlSpellLanguage *language;
+ for (li = entry->priv->dictionaries; li; li = g_slist_next (li)) {
+ dict = li->data;
- checker = li->data;
- language = gtkhtml_spell_checker_get_language (checker);
- if (!language)
- continue;
-
- lang_name = gtkhtml_spell_language_get_name (language);
+ lang_name = e_spell_dictionary_get_name (dict);
if (!lang_name)
- lang_name = gtkhtml_spell_language_get_code (language);
+ lang_name = e_spell_dictionary_get_code (dict);
mi = gtk_menu_item_new_with_label (lang_name ? lang_name : "???");
@@ -432,7 +432,7 @@ build_spelling_menu (ESpellEntry *entry,
gtk_menu_shell_append (GTK_MENU_SHELL (topmenu), mi);
menu = gtk_menu_new ();
gtk_menu_item_set_submenu (GTK_MENU_ITEM (mi), menu);
- build_suggestion_menu (entry, menu, checker, word);
+ build_suggestion_menu (entry, menu, dict, word);
}
}
@@ -448,10 +448,10 @@ build_spelling_menu (ESpellEntry *entry,
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mi), gtk_image_new_from_stock (GTK_STOCK_ADD, GTK_ICON_SIZE_MENU));
- if (!entry->priv->checkers->next) {
- checker = entry->priv->checkers->data;
- g_object_set_data (G_OBJECT (mi), "spell-entry-checker", checker);
- g_signal_connect (mi, "activate", G_CALLBACK (add_to_dictionary), entry);
+ if (!entry->priv->dictionaries->next) {
+ dict = entry->priv->dictionaries->data;
+ g_object_set_data (G_OBJECT (mi), "spell-entry-checker", dict);
+ g_signal_connect (G_OBJECT (mi), "activate", G_CALLBACK (add_to_dictionary), entry);
} else {
GSList *li;
GtkWidget *menu, *submi;
@@ -460,21 +460,16 @@ build_spelling_menu (ESpellEntry *entry,
menu = gtk_menu_new ();
gtk_menu_item_set_submenu (GTK_MENU_ITEM (mi), menu);
- for (li = entry->priv->checkers; li; li = g_slist_next (li)) {
- const GtkhtmlSpellLanguage *language;
-
- checker = li->data;
- language = gtkhtml_spell_checker_get_language (checker);
- if (!language)
- continue;
+ for (li = entry->priv->dictionaries; li; li = g_slist_next (li)) {
+ dict = li->data;
- lang_name = gtkhtml_spell_language_get_name (language);
+ lang_name = e_spell_dictionary_get_name (dict);
if (!lang_name)
- lang_name = gtkhtml_spell_language_get_code (language);
+ lang_name = e_spell_dictionary_get_code (dict);
submi = gtk_menu_item_new_with_label (lang_name ? lang_name : "???");
- g_object_set_data (G_OBJECT (submi), "spell-entry-checker", checker);
- g_signal_connect (submi, "activate", G_CALLBACK (add_to_dictionary), entry);
+ g_object_set_data (G_OBJECT (submi), "spell-entry-checker", dict);
+ g_signal_connect (G_OBJECT (submi), "activate", G_CALLBACK (add_to_dictionary), entry);
gtk_widget_show (submi);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), submi);
@@ -487,7 +482,7 @@ build_spelling_menu (ESpellEntry *entry,
/* - Ignore All */
mi = gtk_image_menu_item_new_with_label (_("Ignore All"));
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mi), gtk_image_new_from_stock (GTK_STOCK_REMOVE, GTK_ICON_SIZE_MENU));
- g_signal_connect (mi, "activate", G_CALLBACK (ignore_all), entry);
+ g_signal_connect (G_OBJECT (mi), "activate", G_CALLBACK (ignore_all), entry);
gtk_widget_show_all (mi);
gtk_menu_shell_append (GTK_MENU_SHELL (topmenu), mi);
@@ -538,7 +533,7 @@ spell_entry_populate_popup (ESpellEntry *entry,
gint start, end;
gchar *word;
- if (!entry->priv->checkers)
+ if (!entry->priv->dictionaries)
return;
get_word_extents_from_position (entry, &start, &end, entry->priv->mark_character);
@@ -561,7 +556,7 @@ spell_entry_changed (GtkEditable *editable)
{
ESpellEntry *entry = E_SPELL_ENTRY (editable);
- if (!entry->priv->checkers)
+ if (!entry->priv->dictionaries)
return;
if (entry->priv->words) {
@@ -582,10 +577,11 @@ spell_entry_notify_scroll_offset (ESpellEntry *spell_entry)
}
static GList *
-spell_entry_load_spell_languages (void)
+spell_entry_load_spell_languages (ESpellEntry *entry)
{
+ ESpellChecker *spell_checker;
GSettings *settings;
- GList *spell_languages = NULL;
+ GList *dicts = NULL;
gchar **strv;
gint ii;
@@ -594,34 +590,36 @@ spell_entry_load_spell_languages (void)
strv = g_settings_get_strv (settings, "composer-spell-languages");
g_object_unref (settings);
+ spell_checker = entry->priv->spell_checker;
+
/* Convert the codes to spell language structs. */
for (ii = 0; strv[ii] != NULL; ii++) {
gchar *language_code = strv[ii];
- const GtkhtmlSpellLanguage *language;
+ ESpellDictionary *dict;
- language = gtkhtml_spell_language_lookup (language_code);
- if (language != NULL)
- spell_languages = g_list_prepend (
- spell_languages, (gpointer) language);
+ dict = e_spell_checker_lookup_dictionary (spell_checker, language_code);
+ if (dict != NULL)
+ dicts = g_list_prepend (
+ dicts, (gpointer) dict);
}
g_strfreev (strv);
- spell_languages = g_list_reverse (spell_languages);
+ dicts = g_list_reverse (dicts);
/* Pick a default spell language if it came back empty. */
- if (spell_languages == NULL) {
- const GtkhtmlSpellLanguage *language;
+ if (dicts == NULL) {
+ ESpellDictionary *dict;
- language = gtkhtml_spell_language_lookup (NULL);
+ dict = e_spell_checker_lookup_dictionary (spell_checker, NULL);
- if (language) {
- spell_languages = g_list_prepend (
- spell_languages, (gpointer) language);
+ if (dict) {
+ dicts = g_list_prepend (
+ dicts, (gpointer) dict);
}
}
- return spell_languages;
+ return dicts;
}
static void
@@ -638,7 +636,7 @@ spell_entry_settings_changed (ESpellEntry *spell_entry,
if (key && !g_str_equal (key, "composer-spell-languages"))
return;
- languages = spell_entry_load_spell_languages ();
+ languages = spell_entry_load_spell_languages (spell_entry);
e_spell_entry_set_languages (spell_entry, languages);
g_list_free (languages);
@@ -735,8 +733,9 @@ e_spell_entry_init (ESpellEntry *spell_entry)
{
spell_entry->priv = E_SPELL_ENTRY_GET_PRIVATE (spell_entry);
spell_entry->priv->attr_list = pango_attr_list_new ();
- spell_entry->priv->checkers = NULL;
+ spell_entry->priv->dictionaries = NULL;
spell_entry->priv->checking_enabled = TRUE;
+ spell_entry->priv->spell_checker = g_object_new (E_TYPE_SPELL_CHECKER, NULL);
g_signal_connect (spell_entry, "popup-menu", G_CALLBACK (spell_entry_popup_menu), NULL);
g_signal_connect (spell_entry, "populate-popup", G_CALLBACK (spell_entry_populate_popup), NULL);
@@ -761,18 +760,25 @@ e_spell_entry_finalize (GObject *object)
entry = E_SPELL_ENTRY (object);
- if (entry->priv->settings)
- g_object_unref (entry->priv->settings);
- if (entry->priv->checkers)
- g_slist_free_full (entry->priv->checkers, g_object_unref);
- if (entry->priv->attr_list)
+ g_clear_object (&entry->priv->settings);
+ g_clear_object (&entry->priv->spell_checker);
+
+ if (entry->priv->dictionaries) {
+ g_slist_free_full (entry->priv->dictionaries, g_object_unref);
+ entry->priv->dictionaries = NULL;
+ }
+
+ if (entry->priv->attr_list) {
pango_attr_list_unref (entry->priv->attr_list);
- if (entry->priv->words)
- g_strfreev (entry->priv->words);
- if (entry->priv->word_starts)
- g_free (entry->priv->word_starts);
- if (entry->priv->word_ends)
- g_free (entry->priv->word_ends);
+ entry->priv->attr_list = NULL;
+ }
+
+ g_strfreev (entry->priv->words);
+ entry->priv->words = NULL;
+ g_free (entry->priv->word_starts);
+ entry->priv->word_starts = NULL;
+ g_free (entry->priv->word_ends);
+ entry->priv->word_ends = NULL;
G_OBJECT_CLASS (e_spell_entry_parent_class)->finalize (object);
}
@@ -811,7 +817,6 @@ e_spell_entry_new (void)
return g_object_new (E_TYPE_SPELL_ENTRY, NULL);
}
-/* 'languages' consists of 'const GtkhtmlSpellLanguage *' */
void
e_spell_entry_set_languages (ESpellEntry *spell_entry,
GList *languages)
@@ -822,20 +827,19 @@ e_spell_entry_set_languages (ESpellEntry *spell_entry,
spell_entry->priv->custom_checkers = TRUE;
- if (spell_entry->priv->checkers)
- g_slist_free_full (spell_entry->priv->checkers, g_object_unref);
- spell_entry->priv->checkers = NULL;
+ if (spell_entry->priv->dictionaries)
+ g_slist_free_full (spell_entry->priv->dictionaries, g_object_unref);
+ spell_entry->priv->dictionaries = NULL;
for (iter = languages; iter; iter = g_list_next (iter)) {
- const GtkhtmlSpellLanguage *language = iter->data;
+ ESpellDictionary *dict = iter->data;
- if (language)
- spell_entry->priv->checkers = g_slist_prepend (
- spell_entry->priv->checkers,
- gtkhtml_spell_checker_new (language));
+ if (dict)
+ spell_entry->priv->dictionaries =
+ g_slist_prepend (spell_entry->priv->dictionaries, dict);
}
- spell_entry->priv->checkers = g_slist_reverse (spell_entry->priv->checkers);
+ spell_entry->priv->dictionaries = g_slist_reverse (spell_entry->priv->dictionaries);
if (gtk_widget_get_realized (GTK_WIDGET (spell_entry)))
spell_entry_recheck_all (spell_entry);
@@ -855,7 +859,7 @@ e_spell_entry_set_checking_enabled (ESpellEntry *spell_entry,
{
g_return_if_fail (spell_entry != NULL);
- if (spell_entry->priv->checking_enabled == enable_checking)
+ if ((enable_checking ? 1 : 0) == (spell_entry->priv->checking_enabled ? 1 : 0))
return;
spell_entry->priv->checking_enabled = enable_checking;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]