diff options
author | Xan Lopez <xlopez@igalia.com> | 2011-06-01 04:47:13 +0800 |
---|---|---|
committer | Xan Lopez <xlopez@igalia.com> | 2011-06-09 06:52:17 +0800 |
commit | a0f0e5368807f17685ec8836be24eef43541e329 (patch) | |
tree | 553fb56ace3379dcd2a67d7dd8427dacab0abf38 | |
parent | 490f0b5228d4972ba16ce375cf3a6989a20ae113 (diff) | |
download | gsoc2013-epiphany-a0f0e5368807f17685ec8836be24eef43541e329.tar gsoc2013-epiphany-a0f0e5368807f17685ec8836be24eef43541e329.tar.gz gsoc2013-epiphany-a0f0e5368807f17685ec8836be24eef43541e329.tar.bz2 gsoc2013-epiphany-a0f0e5368807f17685ec8836be24eef43541e329.tar.lz gsoc2013-epiphany-a0f0e5368807f17685ec8836be24eef43541e329.tar.xz gsoc2013-epiphany-a0f0e5368807f17685ec8836be24eef43541e329.tar.zst gsoc2013-epiphany-a0f0e5368807f17685ec8836be24eef43541e329.zip |
Add suggestions to correct misspellings to the context menu
When the user right-clicks on a misspelled word a number of possible
corrections will be offered by Epiphany. Selecting one of them will
replace the misspelled word by the suggestion.
-rw-r--r-- | data/ui/epiphany-ui.xml | 5 | ||||
-rw-r--r-- | src/ephy-window.c | 76 | ||||
-rw-r--r-- | src/popup-commands.c | 27 | ||||
-rw-r--r-- | src/popup-commands.h | 4 |
4 files changed, 109 insertions, 3 deletions
diff --git a/data/ui/epiphany-ui.xml b/data/ui/epiphany-ui.xml index 90ae3672c..b9d415f40 100644 --- a/data/ui/epiphany-ui.xml +++ b/data/ui/epiphany-ui.xml @@ -108,6 +108,11 @@ </menubar> <popup name="EphyInputPopup" action="PopupAction"> + <menuitem name="SpellingSuggestion0" action="ReplaceWithSpellingSuggestion0"/> + <menuitem name="SpellingSuggestion1" action="ReplaceWithSpellingSuggestion1"/> + <menuitem name="SpellingSuggestion2" action="ReplaceWithSpellingSuggestion2"/> + <menuitem name="SpellingSuggestion3" action="ReplaceWithSpellingSuggestion3"/> + <separator name="SpellingSeparator"/> <menuitem name="EditCutIP" action="EditCut"/> <menuitem name="EditCopyIP" action="EditCopy"/> <menuitem name="EditPasteIP" action="EditPaste"/> diff --git a/src/ephy-window.c b/src/ephy-window.c index a4c8bec32..38f1613f0 100644 --- a/src/ephy-window.c +++ b/src/ephy-window.c @@ -357,6 +357,18 @@ static const GtkActionEntry ephy_popups_entries [] = { { "StopImageAnimation", NULL, N_("St_op Animation"), NULL, NULL, NULL }, + /* Spelling */ + + { "ReplaceWithSpellingSuggestion0", NULL, NULL, NULL, + NULL, G_CALLBACK (popup_replace_spelling), }, + { "ReplaceWithSpellingSuggestion1", NULL, NULL, NULL, + NULL, G_CALLBACK (popup_replace_spelling), }, + { "ReplaceWithSpellingSuggestion2", NULL, NULL, NULL, + NULL, G_CALLBACK (popup_replace_spelling), }, + { "ReplaceWithSpellingSuggestion3", NULL, NULL, NULL, + NULL, G_CALLBACK (popup_replace_spelling), }, + + /* Inspector */ { "InspectElement", NULL, N_("Inspect _Element"), NULL, NULL, G_CALLBACK (popup_cmd_inspect_element) }, @@ -1124,13 +1136,21 @@ ephy_window_delete_event (GtkWidget *widget, return FALSE; } +#define MAX_SPELL_CHECK_GUESSES 4 + static void update_popup_actions_visibility (EphyWindow *window, - gboolean is_image, + WebKitWebView *view, + guint context, gboolean is_frame) { GtkAction *action; GtkActionGroup *action_group; + gboolean is_image = context & WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE; + gboolean is_editable = context & WEBKIT_HIT_TEST_RESULT_CONTEXT_EDITABLE; + GtkWidget *separator; + char **guesses = NULL; + int i; action_group = window->priv->popups_action_group; @@ -1145,6 +1165,56 @@ update_popup_actions_visibility (EphyWindow *window, action = gtk_action_group_get_action (action_group, "OpenFrame"); gtk_action_set_visible (action, is_frame); + + if (is_editable) + { + char *text = NULL; + WebKitWebFrame *frame; + WebKitDOMRange *range; + + frame = webkit_web_view_get_focused_frame (view); + range = webkit_web_frame_get_range_for_word_around_caret (frame); + text = webkit_dom_range_get_text (range); + + if (text) + { + int location, length; + WebKitSpellChecker *checker = webkit_get_text_checker(); + webkit_spell_checker_check_spelling_of_string (checker, text, &location, &length); + if (length) + guesses = webkit_spell_checker_get_guesses_for_word (checker, text, NULL); + + } + + g_free (text); + } + + for (i = 0; i < MAX_SPELL_CHECK_GUESSES; i++) + { + char *action_name; + + action_name = g_strdup_printf("ReplaceWithSpellingSuggestion%d", i); + action = gtk_action_group_get_action (action_group, action_name); + + if (guesses && i <= g_strv_length (guesses)) { + gtk_action_set_visible (action, TRUE); + gtk_action_set_label (action, guesses[i]); + } else + gtk_action_set_visible (action, FALSE); + + g_free (action_name); + } + + /* The separator! There must be a better way to do this? */ + separator = gtk_ui_manager_get_widget (window->priv->manager, + "/EphyInputPopup/SpellingSeparator"); + if (guesses) + gtk_widget_show (separator); + else + gtk_widget_hide (separator); + + if (guesses) + g_strfreev (guesses); } static void @@ -2199,10 +2269,10 @@ show_embed_popup (EphyWindow *window, action = gtk_action_group_get_action (action_group, "OpenLinkInNewTab"); ephy_action_change_sensitivity_flags (action, SENS_FLAG_CONTEXT, !can_open_in_new); - update_popup_actions_visibility (window, - context & WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE, + view, + context, framed); embed_event = ephy_embed_event_new (event, hit_test_result); diff --git a/src/popup-commands.c b/src/popup-commands.c index e7064f16d..14867c411 100644 --- a/src/popup-commands.c +++ b/src/popup-commands.c @@ -479,6 +479,33 @@ save_temp_source (const char *address) } void +popup_replace_spelling (GtkAction *action, + EphyWindow *window) +{ + EphyEmbed *embed; + WebKitWebView *view; + WebKitWebFrame *frame; + WebKitDOMDOMSelection *selection; + WebKitDOMDocument *document; + WebKitDOMDOMWindow *default_view; + + embed = ephy_embed_container_get_active_child + (EPHY_EMBED_CONTAINER (window)); + g_return_if_fail (embed != NULL); + + view = WEBKIT_WEB_VIEW (ephy_embed_get_web_view (embed)); + g_return_if_fail (view != NULL); + + document = webkit_web_view_get_dom_document (view); + default_view = webkit_dom_document_get_default_view (document); + selection = webkit_dom_dom_window_get_selection (default_view); + webkit_dom_dom_selection_modify (selection, "move", "backward", "word"); + webkit_dom_dom_selection_modify (selection, "extend", "forward", "word"); + frame = webkit_web_view_get_focused_frame (view); + webkit_web_frame_replace_selection (frame, gtk_action_get_label (action)); +} + +void popup_cmd_open_image (GtkAction *action, EphyWindow *window) { diff --git a/src/popup-commands.h b/src/popup-commands.h index 02d44c188..f18056479 100644 --- a/src/popup-commands.h +++ b/src/popup-commands.h @@ -68,3 +68,7 @@ void popup_cmd_save_image_as (GtkAction *action, void popup_cmd_inspect_element (GtkAction *action, EphyWindow *window); + +void popup_replace_spelling (GtkAction *action, + EphyWindow *window); + |