diff options
author | Tomas Popela <tpopela@redhat.com> | 2016-02-12 10:52:07 +0100 |
---|---|---|
committer | Tomas Popela <tpopela@redhat.com> | 2016-02-12 11:00:34 +0100 |
commit | 6c78a1e8988a2a85527896770686dd8122b98998 (patch) | |
tree | 2d19679c9b15289e9611d8701b5f9747bf04edbe | |
parent | aa11344b4f684fa9288a11e78d55310932e084b4 (diff) | |
download | evolution-6c78a1e8988a2a85527896770686dd8122b98998.tar.gz |
Bug 761496 - Unicode emoticon requires two backspace presses to delete
This does not apply just on the Unicode emoticons, but for the image ones as well.
While working on this I reworked hot the Unicode smileys are inserted to the
composer. Before they were inserted inside a SPAN element and this caused some
problems, after this change they are inserted as text.
-rw-r--r-- | e-util/e-html-editor-view.c | 142 |
1 files changed, 92 insertions, 50 deletions
diff --git a/e-util/e-html-editor-view.c b/e-util/e-html-editor-view.c index ae08c79ff1..5f984fb15f 100644 --- a/e-util/e-html-editor-view.c +++ b/e-util/e-html-editor-view.c @@ -1882,7 +1882,7 @@ emoticon_insert_span (EHTMLEditorView *view, WebKitDOMDocument *document; WebKitDOMElement *selection_start_marker, *selection_end_marker; WebKitDOMNode *node, *insert_before, *prev_sibling, *next_sibling; - WebKitDOMNode *selection_end_marker_parent; + WebKitDOMNode *selection_end_marker_parent, *inserted_node; WebKitDOMRange *range; selection = e_html_editor_view_get_selection (view); @@ -1898,14 +1898,18 @@ emoticon_insert_span (EHTMLEditorView *view, if (!view->priv->smiley_written) { if (!e_html_editor_view_is_undo_redo_in_progress (view)) { ev = g_new0 (EHTMLEditorViewHistoryEvent, 1); - ev->type = HISTORY_SMILEY; - - e_html_editor_selection_get_selection_coordinates ( - selection, - &ev->before.start.x, - &ev->before.start.y, - &ev->before.end.x, - &ev->before.end.y); + if (view->priv->unicode_smileys) + ev->type = HISTORY_INPUT; + else { + ev->type = HISTORY_SMILEY; + + e_html_editor_selection_get_selection_coordinates ( + selection, + &ev->before.start.x, + &ev->before.start.y, + &ev->before.end.x, + &ev->before.end.y); + } } } } else { @@ -1921,14 +1925,18 @@ emoticon_insert_span (EHTMLEditorView *view, if (!view->priv->smiley_written) { if (!e_html_editor_view_is_undo_redo_in_progress (view)) { ev = g_new0 (EHTMLEditorViewHistoryEvent, 1); - ev->type = HISTORY_SMILEY; - - e_html_editor_selection_get_selection_coordinates ( - selection, - &ev->before.start.x, - &ev->before.start.y, - &ev->before.end.x, - &ev->before.end.y); + if (view->priv->unicode_smileys) + ev->type = HISTORY_INPUT; + else { + ev->type = HISTORY_SMILEY; + + e_html_editor_selection_get_selection_coordinates ( + selection, + &ev->before.start.x, + &ev->before.start.y, + &ev->before.end.x, + &ev->before.end.y); + } } } @@ -1954,12 +1962,13 @@ emoticon_insert_span (EHTMLEditorView *view, &selection_start_marker, &selection_end_marker); - e_html_editor_selection_get_selection_coordinates ( - selection, - &ev->before.start.x, - &ev->before.start.y, - &ev->before.end.x, - &ev->before.end.y); + if (ev && !view->priv->unicode_smileys) + e_html_editor_selection_get_selection_coordinates ( + selection, + &ev->before.start.x, + &ev->before.start.y, + &ev->before.end.x, + &ev->before.end.y); } /* Sometimes selection end marker is in body. Move it into next sibling */ @@ -1972,12 +1981,13 @@ emoticon_insert_span (EHTMLEditorView *view, WEBKIT_DOM_NODE (selection_end_marker), WEBKIT_DOM_NODE (selection_start_marker), NULL); - e_html_editor_selection_get_selection_coordinates ( - selection, - &ev->before.start.x, - &ev->before.start.y, - &ev->before.end.x, - &ev->before.end.y); + if (ev && !view->priv->unicode_smileys) + e_html_editor_selection_get_selection_coordinates ( + selection, + &ev->before.start.x, + &ev->before.start.y, + &ev->before.end.x, + &ev->before.end.y); } selection_end_marker_parent = webkit_dom_node_get_parent_node ( WEBKIT_DOM_NODE (selection_end_marker)); @@ -2027,23 +2037,36 @@ emoticon_insert_span (EHTMLEditorView *view, WEBKIT_DOM_NODE (selection_end_marker), webkit_dom_node_get_next_sibling (next_sibling), NULL); - span = WEBKIT_DOM_ELEMENT ( - webkit_dom_node_insert_before ( + if (view->priv->unicode_smileys) + inserted_node = webkit_dom_node_insert_before ( + webkit_dom_node_get_parent_node (insert_before), + webkit_dom_node_get_first_child (WEBKIT_DOM_NODE (span)), + webkit_dom_node_get_next_sibling (next_sibling), + NULL); + else + inserted_node = webkit_dom_node_insert_before ( webkit_dom_node_get_parent_node (insert_before), WEBKIT_DOM_NODE (span), webkit_dom_node_get_next_sibling (next_sibling), - NULL)); + NULL); } else { - span = WEBKIT_DOM_ELEMENT ( - webkit_dom_node_insert_before ( + if (view->priv->unicode_smileys) + inserted_node = webkit_dom_node_insert_before ( + webkit_dom_node_get_parent_node (insert_before), + webkit_dom_node_get_first_child (WEBKIT_DOM_NODE (span)), + insert_before, + NULL); + else + inserted_node = webkit_dom_node_insert_before ( webkit_dom_node_get_parent_node (insert_before), WEBKIT_DOM_NODE (span), insert_before, - NULL)); + NULL); } - webkit_dom_html_element_insert_adjacent_html ( - WEBKIT_DOM_HTML_ELEMENT (span), "afterend", "​", NULL); + if (!view->priv->unicode_smileys) + webkit_dom_html_element_insert_adjacent_html ( + WEBKIT_DOM_HTML_ELEMENT (inserted_node), "afterend", "​", NULL); if (ev) { WebKitDOMDocumentFragment *fragment; @@ -2052,10 +2075,22 @@ emoticon_insert_span (EHTMLEditorView *view, fragment = webkit_dom_document_create_document_fragment (document); node = webkit_dom_node_append_child ( WEBKIT_DOM_NODE (fragment), - webkit_dom_node_clone_node (WEBKIT_DOM_NODE (span), TRUE), + webkit_dom_node_clone_node (WEBKIT_DOM_NODE (inserted_node), TRUE), NULL); - webkit_dom_html_element_insert_adjacent_html ( - WEBKIT_DOM_HTML_ELEMENT (node), "afterend", "​", NULL); + if (view->priv->unicode_smileys) { + webkit_dom_node_append_child ( + WEBKIT_DOM_NODE (fragment), + WEBKIT_DOM_NODE ( + create_selection_marker (document, TRUE)), + NULL); + webkit_dom_node_append_child ( + WEBKIT_DOM_NODE (fragment), + WEBKIT_DOM_NODE ( + create_selection_marker (document, FALSE)), + NULL); + } else + webkit_dom_html_element_insert_adjacent_html ( + WEBKIT_DOM_HTML_ELEMENT (node), "afterend", "​", NULL); ev->data.fragment = fragment; } @@ -4437,6 +4472,7 @@ save_history_for_delete_or_backspace (EHTMLEditorView *view, } else { glong offset; + /* FIXME This code is wrong for unicode smileys. */ offset = webkit_dom_range_get_start_offset (range_clone, NULL); if (delete_key) @@ -5528,7 +5564,7 @@ return_pressed_in_empty_list_item (EHTMLEditorView *view) } static void -change_smiley_to_plain_text (EHTMLEditorView *view) +process_smiley_on_delete_or_backspace (EHTMLEditorView *view) { WebKitDOMDocument *document; WebKitDOMElement *element; @@ -5579,16 +5615,22 @@ change_smiley_to_plain_text (EHTMLEditorView *view) } if (in_smiley) { - WebKitDOMNode *wrapper, *child; + WebKitDOMNode *wrapper; wrapper = webkit_dom_node_get_parent_node (parent); - while ((child = webkit_dom_node_get_first_child (parent))) - webkit_dom_node_insert_before ( - webkit_dom_node_get_parent_node (wrapper), - child, - wrapper, - NULL); + if (!view->priv->html_mode) { + WebKitDOMNode *child; + + while ((child = webkit_dom_node_get_first_child (parent))) + webkit_dom_node_insert_before ( + webkit_dom_node_get_parent_node (wrapper), + child, + wrapper, + NULL); + } + /* In the HTML mode the whole smiley will be removed. */ remove_node (wrapper); + /* FIXME history will be probably broken here */ } e_html_editor_selection_restore (view->priv->selection); @@ -5816,7 +5858,7 @@ key_press_event_process_delete_or_backspace_key (EHTMLEditorView *view, local_delete = (event && event->keyval == GDK_KEY_Delete) || delete; - if (!view->priv->html_mode && view->priv->magic_smileys) { + if (view->priv->magic_smileys) { /* If deleting something in a smiley it won't be a smiley * anymore (at least from Evolution' POV), so remove all * the elements that are hidden in the wrapper and leave @@ -5824,7 +5866,7 @@ key_press_event_process_delete_or_backspace_key (EHTMLEditorView *view, * recognized and we press the BackSpace key we won't delete * the UNICODE_HIDDEN_SPACE, but we will correctly delete * the last character of smiley. */ - change_smiley_to_plain_text (view); + process_smiley_on_delete_or_backspace (view); } if (!local_delete && !view->priv->html_mode && |