aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomas Popela <tpopela@redhat.com>2014-07-21 19:56:58 +0800
committerTomas Popela <tpopela@redhat.com>2014-07-21 20:17:19 +0800
commit61d338d55d9f077fe68beec38428cbf3aef24fae (patch)
tree157d333c573de1f0ba0b86f88a61995b49b528cf
parent7d5392d49b0337c8432bc96714f020aecf912a2b (diff)
downloadgsoc2013-evolution-61d338d55d9f077fe68beec38428cbf3aef24fae.tar.gz
gsoc2013-evolution-61d338d55d9f077fe68beec38428cbf3aef24fae.tar.zst
gsoc2013-evolution-61d338d55d9f077fe68beec38428cbf3aef24fae.zip
EHTMLEditorSelection - When wrapping the paragraph wrap just the text that is after the caret
The text before the caret is alredy wrapped so we don't have to rewrap it again.
-rw-r--r--e-util/e-html-editor-selection.c87
1 files changed, 63 insertions, 24 deletions
diff --git a/e-util/e-html-editor-selection.c b/e-util/e-html-editor-selection.c
index 95188e8fbe..49353933c0 100644
--- a/e-util/e-html-editor-selection.c
+++ b/e-util/e-html-editor-selection.c
@@ -1567,9 +1567,14 @@ e_html_editor_selection_get_block_format (EHTMLEditorSelection *selection)
}
static gboolean
-is_caret_position_node (WebKitDOMNode *node)
+is_selection_position_node (WebKitDOMElement *element)
{
- return element_has_id (WEBKIT_DOM_ELEMENT (node), "-x-evo-caret-position");
+ if (!element || !WEBKIT_DOM_IS_ELEMENT (element))
+ return FALSE;
+
+ return element_has_id (element, "-x-evo-caret-position") ||
+ element_has_id (element, "-x-evo-selection-start-marker") ||
+ element_has_id (element, "-x-evo-selection-end-marker");
}
static void
@@ -4997,36 +5002,49 @@ wrap_lines (EHTMLEditorSelection *selection,
fragment,
remove_all_br ? "br" : "br.-x-evo-wrap-br",
NULL);
+ br_count = webkit_dom_node_list_get_length (wrap_br);
+ /* And remove them */
+ for (ii = 0; ii < br_count; ii++)
+ remove_node (webkit_dom_node_list_item (wrap_br, ii));
} else {
- WebKitDOMElement *caret_node;
-
if (!webkit_dom_node_has_child_nodes (paragraph))
return WEBKIT_DOM_ELEMENT (paragraph);
paragraph_clone = webkit_dom_node_clone_node (paragraph, TRUE);
- caret_node = webkit_dom_element_query_selector (
+ element = webkit_dom_element_query_selector (
WEBKIT_DOM_ELEMENT (paragraph_clone),
- "span#-x-evo-caret-position", NULL);
+ "span#-x-evo-caret-position",
+ NULL);
text_content = webkit_dom_node_get_text_content (paragraph_clone);
paragraph_char_count = g_utf8_strlen (text_content, -1);
- if (caret_node)
+ if (element)
paragraph_char_count--;
g_free (text_content);
- wrap_br = webkit_dom_element_query_selector_all (
+ /* When we wrap, we are wrapping just the text after caret, text
+ * before the caret is already wrapped, so unwrap the text after
+ * the caret position */
+ element = webkit_dom_element_query_selector (
WEBKIT_DOM_ELEMENT (paragraph_clone),
- remove_all_br ? "br" : "br.-x-evo-wrap-br",
+ "span#-x-evo-selection-end-marker",
NULL);
- }
- /* And remove them */
- br_count = webkit_dom_node_list_get_length (wrap_br);
- for (ii = 0; ii < br_count; ii++)
- remove_node (webkit_dom_node_list_item (wrap_br, ii));
+ if (element) {
+ WebKitDOMNode *nd = WEBKIT_DOM_NODE (element);
+
+ while (nd) {
+ WebKitDOMNode *next_nd = webkit_dom_node_get_next_sibling (nd);
+ if (WEBKIT_DOM_IS_HTMLBR_ELEMENT (nd))
+ remove_node (nd);
+ nd = next_nd;
+ }
+ }
+ }
- if (selection)
+ if (selection) {
node = WEBKIT_DOM_NODE (fragment);
- else {
+ start_node = node;
+ } else {
webkit_dom_node_normalize (paragraph_clone);
node = webkit_dom_node_get_first_child (paragraph_clone);
if (node) {
@@ -5035,9 +5053,32 @@ wrap_lines (EHTMLEditorSelection *selection,
node = webkit_dom_node_get_next_sibling (node);
g_free (text_content);
}
+
+ /* We have to start from the end of the last wrapped line */
+ element = webkit_dom_element_query_selector (
+ WEBKIT_DOM_ELEMENT (paragraph_clone),
+ "span#-x-evo-selection-start-marker",
+ NULL);
+
+ if (element) {
+ WebKitDOMNode *nd = WEBKIT_DOM_NODE (element);
+
+ while ((nd = webkit_dom_node_get_previous_sibling (nd))) {
+ if (WEBKIT_DOM_IS_HTMLBR_ELEMENT (nd)) {
+ element = WEBKIT_DOM_ELEMENT (nd);
+ break;
+ } else
+ element = NULL;
+ }
+ }
+
+ if (element) {
+ node = webkit_dom_node_get_next_sibling (WEBKIT_DOM_NODE (element));
+ start_node = paragraph_clone;
+ } else
+ start_node = node;
}
- start_node = node;
len = 0;
while (node) {
gint offset = 0;
@@ -5068,8 +5109,6 @@ wrap_lines (EHTMLEditorSelection *selection,
next_sibling = node;
while (newline) {
- WebKitDOMElement *element;
-
next_sibling = WEBKIT_DOM_NODE (webkit_dom_text_split_text (
WEBKIT_DOM_TEXT (next_sibling),
g_utf8_pointer_to_offset (text_content, newline),
@@ -5102,6 +5141,11 @@ wrap_lines (EHTMLEditorSelection *selection,
}
g_free (text_content);
} else {
+ if (is_selection_position_node (WEBKIT_DOM_ELEMENT (node))) {
+ node = webkit_dom_node_get_next_sibling (node);
+ continue;
+ }
+
/* If element is ANCHOR we wrap it separately */
if (WEBKIT_DOM_IS_HTML_ANCHOR_ELEMENT (node)) {
glong anchor_length;
@@ -5136,11 +5180,6 @@ wrap_lines (EHTMLEditorSelection *selection,
continue;
}
- if (is_caret_position_node (node)) {
- node = webkit_dom_node_get_next_sibling (node);
- continue;
- }
-
/* When we are not removing user-entered BR elements (lines wrapped by user),
* we need to skip those elements */
if (!remove_all_br && WEBKIT_DOM_IS_HTMLBR_ELEMENT (node)) {