summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomas Popela <tpopela@redhat.com>2016-02-12 10:52:07 +0100
committerTomas Popela <tpopela@redhat.com>2016-02-12 11:00:34 +0100
commit6c78a1e8988a2a85527896770686dd8122b98998 (patch)
tree2d19679c9b15289e9611d8701b5f9747bf04edbe
parentaa11344b4f684fa9288a11e78d55310932e084b4 (diff)
downloadevolution-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.c142
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", "&#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 &&