aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--e-util/e-html-editor-view.c131
1 files changed, 83 insertions, 48 deletions
diff --git a/e-util/e-html-editor-view.c b/e-util/e-html-editor-view.c
index bafa86fcc9..a9dd979dfd 100644
--- a/e-util/e-html-editor-view.c
+++ b/e-util/e-html-editor-view.c
@@ -563,36 +563,11 @@ return_pressed_in_empty_line (EHTMLEditorSelection *selection,
first_child = webkit_dom_node_get_first_child (node);
if (first_child && WEBKIT_DOM_IS_ELEMENT (first_child) &&
element_has_class (WEBKIT_DOM_ELEMENT (first_child), "-x-evo-quoted")) {
- WebKitDOMNode *next_sibling;
-
- next_sibling = webkit_dom_node_get_next_sibling (first_child);
- if (WEBKIT_DOM_IS_HTMLBR_ELEMENT (next_sibling)) {
- next_sibling = webkit_dom_node_get_next_sibling (node);
- if (webkit_dom_node_get_first_child (next_sibling)) {
- WebKitDOMElement *element;
+ WebKitDOMNode *prev_sibling;
- element = webkit_dom_document_create_element (
- document, "SPAN", NULL);
- webkit_dom_element_set_id (
- element, "-x-evo-selection-end-marker");
- webkit_dom_node_insert_before (
- next_sibling,
- WEBKIT_DOM_NODE (element),
- webkit_dom_node_get_first_child (next_sibling),
- NULL);
- element = webkit_dom_document_create_element (
- document, "SPAN", NULL);
- webkit_dom_element_set_id (
- element, "-x-evo-selection-start-marker");
- webkit_dom_node_insert_before (
- next_sibling,
- WEBKIT_DOM_NODE (element),
- webkit_dom_node_get_first_child (next_sibling),
- NULL);
- e_html_editor_selection_restore (selection);
- return TRUE;
- }
- }
+ prev_sibling = webkit_dom_node_get_previous_sibling (node);
+ if (!prev_sibling)
+ return webkit_dom_range_get_collapsed (range, NULL);
}
}
@@ -603,7 +578,7 @@ static WebKitDOMElement *
insert_new_line_into_citation (EHTMLEditorView *view,
const gchar *html_to_insert)
{
- gboolean html_mode, ret_val, fix_after_return_pressed_in_empty_line;
+ gboolean html_mode, ret_val, avoid_editor_call;
EHTMLEditorSelection *selection;
WebKitDOMDocument *document;
WebKitDOMElement *element, *paragraph = NULL;
@@ -614,33 +589,93 @@ insert_new_line_into_citation (EHTMLEditorView *view,
document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
- fix_after_return_pressed_in_empty_line =
+ avoid_editor_call =
return_pressed_in_empty_line (selection, document);
- ret_val = e_html_editor_view_exec_command (
- view, E_HTML_EDITOR_VIEW_COMMAND_INSERT_NEW_LINE_IN_QUOTED_CONTENT, NULL);
+ if (avoid_editor_call) {
+ WebKitDOMElement *selection_start_marker;
+ WebKitDOMNode *current_block, *parent, *parent_block, *block_clone;
- if (!ret_val)
- return NULL;
+ e_html_editor_selection_save (selection);
- element = webkit_dom_document_query_selector (
- document, "body>br", NULL);
+ selection_start_marker = webkit_dom_document_get_element_by_id (
+ document, "-x-evo-selection-start-marker");
- if (!element)
- return NULL;
+ current_block = webkit_dom_node_get_parent_node (
+ WEBKIT_DOM_NODE (selection_start_marker));
- if (fix_after_return_pressed_in_empty_line) {
- WebKitDOMNode *node;
+ block_clone = webkit_dom_node_clone_node (current_block, TRUE);
+ /* Find selection start marker and restore it after the new line
+ * is inserted */
+ selection_start_marker = webkit_dom_element_query_selector (
+ WEBKIT_DOM_ELEMENT (block_clone), "#-x-evo-selection-start-marker", NULL);
+
+ /* Find parent node that is immediate child of the BODY */
+ /* Build the same structure of parent nodes of the current block */
+ parent_block = current_block;
+ parent = webkit_dom_node_get_parent_node (parent_block);
+ while (parent && !WEBKIT_DOM_IS_HTML_BODY_ELEMENT (parent)) {
+ WebKitDOMNode *node;
- node = webkit_dom_node_get_previous_sibling (
- WEBKIT_DOM_NODE (element));
+ parent_block = parent;
+ node = webkit_dom_node_clone_node (parent_block, FALSE);
+ webkit_dom_node_append_child (node, block_clone, NULL);
+ block_clone = node;
+ parent = webkit_dom_node_get_parent_node (parent_block);
+ }
+
+ paragraph = e_html_editor_selection_get_paragraph_element (
+ selection, document, -1, 0);
- node = webkit_dom_node_get_last_child (node);
- while (node && is_citation_node (node))
- node = webkit_dom_node_get_last_child (node);
+ webkit_dom_html_element_set_inner_text (
+ WEBKIT_DOM_HTML_ELEMENT (paragraph),
+ UNICODE_ZERO_WIDTH_SPACE,
+ NULL);
+
+ /* Insert the selection markers to right place */
+ webkit_dom_node_insert_before (
+ WEBKIT_DOM_NODE (paragraph),
+ webkit_dom_node_get_next_sibling (WEBKIT_DOM_NODE (selection_start_marker)),
+ webkit_dom_node_get_first_child (WEBKIT_DOM_NODE (paragraph)),
+ NULL);
+ webkit_dom_node_insert_before (
+ WEBKIT_DOM_NODE (paragraph),
+ WEBKIT_DOM_NODE (selection_start_marker),
+ webkit_dom_node_get_first_child (WEBKIT_DOM_NODE (paragraph)),
+ NULL);
+
+ /* Insert the cloned nodes before the BODY parent node */
+ webkit_dom_node_insert_before (
+ webkit_dom_node_get_parent_node (parent_block),
+ block_clone,
+ parent_block,
+ NULL);
+
+ /* Insert the new empty paragraph before the BODY parent node */
+ webkit_dom_node_insert_before (
+ webkit_dom_node_get_parent_node (parent_block),
+ WEBKIT_DOM_NODE (paragraph),
+ parent_block,
+ NULL);
+
+ /* Remove the old block (its copy was moved to the right place) */
+ remove_node (current_block);
+
+ e_html_editor_selection_restore (selection);
+
+ return NULL;
+ } else {
+ ret_val = e_html_editor_view_exec_command (
+ view, E_HTML_EDITOR_VIEW_COMMAND_INSERT_NEW_LINE_IN_QUOTED_CONTENT, NULL);
+
+ if (!ret_val)
+ return NULL;
+
+ element = webkit_dom_document_query_selector (
+ document, "body>br", NULL);
- if (node)
- remove_node (webkit_dom_node_get_last_child (node));
+ if (!element)
+ return NULL;
}
if (!html_mode) {