[evolution/gnome-3-18] Bug 761496 - Unicode emoticon requires two backspace presses to delete



commit 6c78a1e8988a2a85527896770686dd8122b98998
Author: Tomas Popela <tpopela redhat com>
Date:   Fri Feb 12 10:52:07 2016 +0100

    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.

 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 ae08c79..5f984fb 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", "&#8203;", NULL);
+       if (!view->priv->unicode_smileys)
+               webkit_dom_html_element_insert_adjacent_html (
+                       WEBKIT_DOM_HTML_ELEMENT (inserted_node), "afterend", "&#8203;", 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", "&#8203;", 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", "&#8203;", 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 &&


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]