static GeditSpellChecker * get_spell_checker_from_document (GeditDocument *doc) { GeditSpellChecker *spell; gpointer data; gedit_debug (DEBUG_PLUGINS); g_return_val_if_fail (doc != NULL, NULL); data = g_object_get_qdata (G_OBJECT (doc), spell_checker_id); if (data == NULL) { const GeditSpellCheckerLanguage *lang = NULL; gchar *value = NULL; spell = gedit_spell_checker_new (); value = gedit_document_get_metadata (doc, GEDIT_METADATA_ATTRIBUTE_SPELL_LANGUAGE); if (value != NULL) { lang = gedit_spell_checker_language_from_key (value); g_free (value); } if (lang != NULL) { gedit_spell_checker_set_language (spell, lang); } g_object_set_qdata_full (G_OBJECT (doc), spell_checker_id, spell, (GDestroyNotify) g_object_unref); g_signal_connect (spell, "set_language", G_CALLBACK (set_spell_language_cb), doc); } else { g_return_val_if_fail (GEDIT_IS_SPELL_CHECKER (data), NULL); spell = GEDIT_SPELL_CHECKER (data); } return spell; }
static GeditSpellChecker * get_spell_checker_from_document (GeditDocument *doc) { GeditSpellChecker *spell; gpointer data; gedit_debug (DEBUG_PLUGINS); g_return_val_if_fail (doc != NULL, NULL); data = g_object_get_qdata (G_OBJECT (doc), spell_checker_id); if (data == NULL) { spell = gedit_spell_checker_new (); set_language_from_metadata (spell, doc); g_object_set_qdata_full (G_OBJECT (doc), spell_checker_id, spell, (GDestroyNotify) g_object_unref); g_signal_connect (spell, "set_language", G_CALLBACK (set_spell_language_cb), doc); } else { g_return_val_if_fail (GEDIT_IS_SPELL_CHECKER (data), NULL); spell = GEDIT_SPELL_CHECKER (data); } return spell; }
GeditAutomaticSpellChecker * gedit_automatic_spell_checker_new (GeditDocument *doc, GeditSpellChecker *checker) { GeditAutomaticSpellChecker *spell; GtkTextTagTable *tag_table; GtkTextIter start, end; g_return_val_if_fail (GEDIT_IS_DOCUMENT (doc), NULL); g_return_val_if_fail (GEDIT_IS_SPELL_CHECKER (checker), NULL); g_return_val_if_fail ((spell = gedit_automatic_spell_checker_get_from_document (doc)) == NULL, spell); /* attach to the widget */ spell = g_new0 (GeditAutomaticSpellChecker, 1); spell->doc = doc; spell->spell_checker = g_object_ref (checker); if (automatic_spell_checker_id == 0) { automatic_spell_checker_id = g_quark_from_string ("GeditAutomaticSpellCheckerID"); } if (suggestion_id == 0) { suggestion_id = g_quark_from_string ("GeditAutoSuggestionID"); } g_object_set_qdata_full (G_OBJECT (doc), automatic_spell_checker_id, spell, (GDestroyNotify)gedit_automatic_spell_checker_free_internal); g_signal_connect (doc, "insert-text", G_CALLBACK (insert_text_before), spell); g_signal_connect_after (doc, "insert-text", G_CALLBACK (insert_text_after), spell); g_signal_connect_after (doc, "delete-range", G_CALLBACK (delete_range_after), spell); g_signal_connect (doc, "mark-set", G_CALLBACK (mark_set), spell); g_signal_connect (doc, "highlight-updated", G_CALLBACK (highlight_updated), spell); g_signal_connect (spell->spell_checker, "add_word_to_session", G_CALLBACK (add_word_signal_cb), spell); g_signal_connect (spell->spell_checker, "add_word_to_personal", G_CALLBACK (add_word_signal_cb), spell); g_signal_connect (spell->spell_checker, "clear_session", G_CALLBACK (clear_session_cb), spell); g_signal_connect (spell->spell_checker, "set_language", G_CALLBACK (set_language_cb), spell); spell->tag_highlight = gtk_text_buffer_create_tag ( GTK_TEXT_BUFFER (doc), "gtkspell-misspelled", "underline", PANGO_UNDERLINE_ERROR, NULL); g_object_weak_ref (G_OBJECT (spell->tag_highlight), (GWeakNotify)spell_tag_destroyed, spell); tag_table = gtk_text_buffer_get_tag_table (GTK_TEXT_BUFFER (doc)); gtk_text_tag_set_priority (spell->tag_highlight, gtk_text_tag_table_get_size (tag_table) - 1); g_signal_connect (tag_table, "tag-added", G_CALLBACK (tag_added_or_removed), spell); g_signal_connect (tag_table, "tag-removed", G_CALLBACK (tag_added_or_removed), spell); g_signal_connect (tag_table, "tag-changed", G_CALLBACK (tag_changed), spell); /* we create the mark here, but we don't use it until text is * inserted, so we don't really care where iter points. */ gtk_text_buffer_get_bounds (GTK_TEXT_BUFFER (doc), &start, &end); spell->mark_insert_start = gtk_text_buffer_get_mark (GTK_TEXT_BUFFER (doc), "gedit-automatic-spell-checker-insert-start"); if (spell->mark_insert_start == NULL) { spell->mark_insert_start = gtk_text_buffer_create_mark (GTK_TEXT_BUFFER (doc), "gedit-automatic-spell-checker-insert-start", &start, TRUE); } else { gtk_text_buffer_move_mark (GTK_TEXT_BUFFER (doc), spell->mark_insert_start, &start); } spell->mark_insert_end = gtk_text_buffer_get_mark (GTK_TEXT_BUFFER (doc), "gedit-automatic-spell-checker-insert-end"); if (spell->mark_insert_end == NULL) { spell->mark_insert_end = gtk_text_buffer_create_mark (GTK_TEXT_BUFFER (doc), "gedit-automatic-spell-checker-insert-end", &start, TRUE); } else { gtk_text_buffer_move_mark (GTK_TEXT_BUFFER (doc), spell->mark_insert_end, &start); } spell->mark_click = gtk_text_buffer_get_mark (GTK_TEXT_BUFFER (doc), "gedit-automatic-spell-checker-click"); if (spell->mark_click == NULL) { spell->mark_click = gtk_text_buffer_create_mark (GTK_TEXT_BUFFER (doc), "gedit-automatic-spell-checker-click", &start, TRUE); } else { gtk_text_buffer_move_mark (GTK_TEXT_BUFFER (doc), spell->mark_click, &start); } spell->deferred_check = FALSE; return spell; }