diff options
author | Tomas Popela <tpopela@redhat.com> | 2014-07-21 19:51:13 +0800 |
---|---|---|
committer | Tomas Popela <tpopela@redhat.com> | 2014-07-21 20:17:19 +0800 |
commit | 7d5392d49b0337c8432bc96714f020aecf912a2b (patch) | |
tree | 15647a487109f821233b83a44ac513cfd9defb3b | |
parent | 9de43b4e739bd84576c1fe98cbe392a0265c24b1 (diff) | |
download | gsoc2013-evolution-7d5392d49b0337c8432bc96714f020aecf912a2b.tar gsoc2013-evolution-7d5392d49b0337c8432bc96714f020aecf912a2b.tar.gz gsoc2013-evolution-7d5392d49b0337c8432bc96714f020aecf912a2b.tar.bz2 gsoc2013-evolution-7d5392d49b0337c8432bc96714f020aecf912a2b.tar.lz gsoc2013-evolution-7d5392d49b0337c8432bc96714f020aecf912a2b.tar.xz gsoc2013-evolution-7d5392d49b0337c8432bc96714f020aecf912a2b.tar.zst gsoc2013-evolution-7d5392d49b0337c8432bc96714f020aecf912a2b.zip |
EHTMLEditor - Fix e_html_editor_view_force_spell_check_for_current_paragraph and use it where possible
Save the end node that we are using to mark the end of the paragraph
into the right place to avoid the busy loop.
Use e_html_editor_selection_save/restore to avoid lose of selection.
-rw-r--r-- | e-util/e-html-editor-selection.c | 7 | ||||
-rw-r--r-- | e-util/e-html-editor-view.c | 40 |
2 files changed, 32 insertions, 15 deletions
diff --git a/e-util/e-html-editor-selection.c b/e-util/e-html-editor-selection.c index 56d7d8b1d7..95188e8fbe 100644 --- a/e-util/e-html-editor-selection.c +++ b/e-util/e-html-editor-selection.c @@ -1984,7 +1984,6 @@ format_change_block_to_list (EHTMLEditorSelection *selection, merge_lists_if_possible (WEBKIT_DOM_NODE (list)); e_html_editor_selection_restore (selection); - e_html_editor_view_force_spell_check (view); } static void @@ -2253,7 +2252,7 @@ e_html_editor_selection_set_block_format (EHTMLEditorSelection *selection, if (!from_list && to_list) format_change_block_to_list (selection, format, view, document); - e_html_editor_view_force_spell_check (view); + e_html_editor_view_force_spell_check_for_current_paragraph (view); g_object_unref (view); @@ -2836,7 +2835,7 @@ e_html_editor_selection_indent (EHTMLEditorSelection *selection) } out: e_html_editor_selection_restore (selection); - e_html_editor_view_force_spell_check (view); + e_html_editor_view_force_spell_check_for_current_paragraph (view); g_object_unref (view); @@ -3156,7 +3155,7 @@ e_html_editor_selection_unindent (EHTMLEditorSelection *selection) } out: e_html_editor_selection_restore (selection); - e_html_editor_view_force_spell_check (view); + e_html_editor_view_force_spell_check_for_current_paragraph (view); g_object_unref (view); diff --git a/e-util/e-html-editor-view.c b/e-util/e-html-editor-view.c index 4bea1abdaf..53ca833d1c 100644 --- a/e-util/e-html-editor-view.c +++ b/e-util/e-html-editor-view.c @@ -216,7 +216,8 @@ e_html_editor_view_force_spell_check_for_current_paragraph (EHTMLEditorView *vie WebKitDOMDocument *document; WebKitDOMDOMSelection *dom_selection; WebKitDOMDOMWindow *window; - WebKitDOMElement *caret, *parent, *element; + WebKitDOMElement *selection_start_marker, *selection_end_marker; + WebKitDOMElement *parent, *element; WebKitDOMRange *end_range, *actual; WebKitDOMText *text; @@ -231,7 +232,15 @@ e_html_editor_view_force_spell_check_for_current_paragraph (EHTMLEditorView *vie return; selection = e_html_editor_view_get_selection (view); - caret = e_html_editor_selection_save_caret_position (selection); + e_html_editor_selection_save (selection); + + selection_start_marker = webkit_dom_document_query_selector ( + document, "span#-x-evo-selection-start-marker", NULL); + selection_end_marker = webkit_dom_document_query_selector ( + document, "span#-x-evo-selection-end-marker", NULL); + + if (!selection_start_marker || !selection_end_marker) + return; /* Block callbacks of selection-changed signal as we don't want to * recount all the block format things in EHTMLEditorSelection and here as well @@ -240,11 +249,15 @@ e_html_editor_view_force_spell_check_for_current_paragraph (EHTMLEditorView *vie view, html_editor_view_selection_changed_cb, NULL); e_html_editor_selection_block_selection_changed (selection); - parent = webkit_dom_node_get_parent_element (WEBKIT_DOM_NODE (caret)); - element = caret; + parent = webkit_dom_node_get_parent_element ( + WEBKIT_DOM_NODE (selection_start_marker)); - while (parent && !WEBKIT_DOM_IS_HTML_BODY_ELEMENT (parent)) { - element = parent; + while (parent && + !WEBKIT_DOM_IS_HTML_DIV_ELEMENT (parent) && + !WEBKIT_DOM_IS_HTML_QUOTE_ELEMENT (parent) && + !WEBKIT_DOM_IS_HTMLU_LIST_ELEMENT (parent) && + !WEBKIT_DOM_IS_HTMLO_LIST_ELEMENT (parent) && + !WEBKIT_DOM_IS_HTML_PRE_ELEMENT (parent)) { parent = webkit_dom_node_get_parent_element ( WEBKIT_DOM_NODE (parent)); } @@ -252,7 +265,10 @@ e_html_editor_view_force_spell_check_for_current_paragraph (EHTMLEditorView *vie /* Append some text on the end of the element */ text = webkit_dom_document_create_text_node (document, "-x-evo-end"); webkit_dom_node_append_child ( - WEBKIT_DOM_NODE (element), WEBKIT_DOM_NODE (text), NULL); + webkit_dom_node_get_parent_node ( + WEBKIT_DOM_NODE (selection_end_marker)), + WEBKIT_DOM_NODE (text), + NULL); /* Create range that's pointing on the end of this text */ end_range = webkit_dom_document_create_range (document); @@ -263,7 +279,7 @@ e_html_editor_view_force_spell_check_for_current_paragraph (EHTMLEditorView *vie /* Move on the beginning of the paragraph */ actual = webkit_dom_document_create_range (document); webkit_dom_range_select_node_contents ( - actual, WEBKIT_DOM_NODE (element), NULL); + actual, WEBKIT_DOM_NODE (parent), NULL); webkit_dom_range_collapse (actual, TRUE, NULL); webkit_dom_dom_selection_remove_all_ranges (dom_selection); webkit_dom_dom_selection_add_range (dom_selection, actual); @@ -288,7 +304,7 @@ e_html_editor_view_force_spell_check_for_current_paragraph (EHTMLEditorView *vie view, html_editor_view_selection_changed_cb, NULL); e_html_editor_selection_unblock_selection_changed (selection); - e_html_editor_selection_restore_caret_position (selection); + e_html_editor_selection_restore (selection); } static void @@ -720,10 +736,12 @@ body_input_event_cb (WebKitDOMElement *element, WEBKIT_DOM_NODE (marker), NULL); } + e_html_editor_selection_restore (selection); + e_html_editor_view_force_spell_check_for_current_paragraph (view); + return; } } e_html_editor_selection_restore (selection); - e_html_editor_view_force_spell_check (view); } } @@ -2107,7 +2125,7 @@ change_quoted_block_to_normal (EHTMLEditorView *view) remove_node_if_empty ( webkit_dom_node_get_next_sibling ( WEBKIT_DOM_NODE (paragraph))); - e_html_editor_view_force_spell_check (view); + e_html_editor_view_force_spell_check_for_current_paragraph (view); } } |