[evolution/wip/webkit2] EHTMLEditorSelection - Non collapsed selection is collapsed after saving its start and end points
- From: Tomas Popela <tpopela src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution/wip/webkit2] EHTMLEditorSelection - Non collapsed selection is collapsed after saving its start and end points
- Date: Wed, 22 Apr 2015 12:55:40 +0000 (UTC)
commit b0fa2508ad4870a3f9ea616c00356b0783af1b70
Author: Tomas Popela <tpopela redhat com>
Date: Tue Mar 24 12:41:03 2015 +0100
EHTMLEditorSelection - Non collapsed selection is collapsed after saving its start and end points
During some operations the selection can be removed. Try to restore it on the end of saving.
.../e-html-editor-selection-dom-functions.c | 94 +++++++++++---------
1 files changed, 53 insertions(+), 41 deletions(-)
---
diff --git a/web-extensions/e-html-editor-selection-dom-functions.c
b/web-extensions/e-html-editor-selection-dom-functions.c
index 6ec84b2..fc14571 100644
--- a/web-extensions/e-html-editor-selection-dom-functions.c
+++ b/web-extensions/e-html-editor-selection-dom-functions.c
@@ -1456,11 +1456,12 @@ in_empty_block_in_quoted_content (WebKitDOMNode *element)
void
dom_selection_save (WebKitDOMDocument *document)
{
+ gboolean collapsed = FALSE;
glong offset;
WebKitDOMRange *range;
WebKitDOMNode *container, *next_sibling, *marker_node;
WebKitDOMNode *split_node, *parent_node;
- WebKitDOMElement *marker;
+ WebKitDOMElement *start_marker, *end_marker;
/* First remove all markers (if present) */
remove_selection_markers (document);
@@ -1470,8 +1471,9 @@ dom_selection_save (WebKitDOMDocument *document)
if (!range)
return;
- marker = webkit_dom_document_create_element (document, "SPAN", NULL);
- webkit_dom_element_set_id (marker, "-x-evo-selection-start-marker");
+ collapsed = webkit_dom_range_get_collapsed (range, NULL);
+ start_marker = webkit_dom_document_create_element (document, "SPAN", NULL);
+ webkit_dom_element_set_id (start_marker, "-x-evo-selection-start-marker");
container = webkit_dom_range_get_start_container (range, NULL);
offset = webkit_dom_range_get_start_offset (range, NULL);
@@ -1486,10 +1488,10 @@ dom_selection_save (WebKitDOMDocument *document)
if ((next_sibling = in_empty_block_in_quoted_content (node))) {
webkit_dom_node_insert_before (
webkit_dom_node_get_parent_node (next_sibling),
- WEBKIT_DOM_NODE (marker),
+ WEBKIT_DOM_NODE (start_marker),
next_sibling,
NULL);
- goto end_marker;
+ goto insert_end_marker;
}
}
@@ -1503,57 +1505,57 @@ dom_selection_save (WebKitDOMDocument *document)
} else {
marker_node = webkit_dom_node_insert_before (
parent_node,
- WEBKIT_DOM_NODE (marker),
+ WEBKIT_DOM_NODE (start_marker),
container,
NULL);
- goto end_marker;
+ goto insert_end_marker;
}
} else if (WEBKIT_DOM_IS_HTML_LI_ELEMENT (container)) {
marker_node = webkit_dom_node_insert_before (
container,
- WEBKIT_DOM_NODE (marker),
+ WEBKIT_DOM_NODE (start_marker),
webkit_dom_node_get_first_child (container),
NULL);
- goto end_marker;
+ goto insert_end_marker;
} else if (element_has_class (WEBKIT_DOM_ELEMENT (container), "-x-evo-resizable-wrapper")) {
marker_node = webkit_dom_node_insert_before (
parent_node,
- WEBKIT_DOM_NODE (marker),
+ WEBKIT_DOM_NODE (start_marker),
webkit_dom_node_get_next_sibling (container),
NULL);
- goto end_marker;
+ goto insert_end_marker;
} else {
/* Insert the selection marker on the right position in
* an empty paragraph in the quoted content */
if ((next_sibling = in_empty_block_in_quoted_content (container))) {
marker_node = webkit_dom_node_insert_before (
container,
- WEBKIT_DOM_NODE (marker),
+ WEBKIT_DOM_NODE (start_marker),
next_sibling,
NULL);
- goto end_marker;
+ goto insert_end_marker;
}
if (!webkit_dom_node_get_previous_sibling (container)) {
marker_node = webkit_dom_node_insert_before (
container,
- WEBKIT_DOM_NODE (marker),
+ WEBKIT_DOM_NODE (start+marker),
webkit_dom_node_get_first_child (container),
NULL);
- goto end_marker;
+ goto insert_end_marker;
} else if (!webkit_dom_node_get_next_sibling (container)) {
marker_node = webkit_dom_node_append_child (
container,
- WEBKIT_DOM_NODE (marker),
+ WEBKIT_DOM_NODE (start_marker),
NULL);
- goto end_marker;
+ goto insert_end_marker;
} else {
if (webkit_dom_node_get_first_child (container)) {
marker_node = webkit_dom_node_insert_before (
container,
- WEBKIT_DOM_NODE (marker),
+ WEBKIT_DOM_NODE (start_marker),
webkit_dom_node_get_first_child (container),
NULL);
- goto end_marker;
+ goto insert_end_marker;
}
split_node = container;
}
@@ -1580,18 +1582,17 @@ dom_selection_save (WebKitDOMDocument *document)
webkit_dom_node_normalize (parent_node);
- end_marker:
- marker = webkit_dom_document_create_element (document, "SPAN", NULL);
- webkit_dom_element_set_id (marker, "-x-evo-selection-end-marker");
+ insert_end_marker:
+ end_marker = webkit_dom_document_create_element (document, "SPAN", NULL);
+ webkit_dom_element_set_id (end_marker, "-x-evo-selection-end-marker");
if (webkit_dom_range_get_collapsed (range, NULL)) {
webkit_dom_node_insert_before (
- /* Selection start marker */
- webkit_dom_node_get_parent_node (marker_node),
- WEBKIT_DOM_NODE (marker),
- webkit_dom_node_get_next_sibling (marker_node),
+ webkit_dom_node_get_parent_node (WEBKIT_DOM_NODE (start_marker)),
+ WEBKIT_DOM_NODE (end_marker),
+ webkit_dom_node_get_next_sibling (WEBKIT_DOM_NODE (start_marker)),
NULL);
- return;
+ goto out;
}
container = webkit_dom_range_get_end_container (range, NULL);
@@ -1607,18 +1608,18 @@ dom_selection_save (WebKitDOMDocument *document)
if ((next_sibling = in_empty_block_in_quoted_content (node))) {
webkit_dom_node_insert_before (
webkit_dom_node_get_parent_node (next_sibling),
- WEBKIT_DOM_NODE (marker),
+ WEBKIT_DOM_NODE (end_marker),
next_sibling,
NULL);
} else {
webkit_dom_node_insert_before (
node,
- WEBKIT_DOM_NODE (marker),
+ WEBKIT_DOM_NODE (end_marker),
webkit_dom_node_get_next_sibling (
webkit_dom_node_get_parent_node (parent_node)),
NULL);
}
- return;
+ goto out;
}
if (WEBKIT_DOM_IS_TEXT (container)) {
@@ -1630,24 +1631,24 @@ dom_selection_save (WebKitDOMDocument *document)
split_node = WEBKIT_DOM_NODE (split_text);
} else {
marker_node = webkit_dom_node_insert_before (
- parent_node, WEBKIT_DOM_NODE (marker), container, NULL);
+ parent_node, WEBKIT_DOM_NODE (end_marker), container, NULL);
goto check;
}
} else if (WEBKIT_DOM_IS_HTML_LI_ELEMENT (container)) {
webkit_dom_node_append_child (
- container, WEBKIT_DOM_NODE (marker), NULL);
- return;
+ container, WEBKIT_DOM_NODE (end_marker), NULL);
+ goto out;
} else {
/* Insert the selection marker on the right position in
* an empty paragraph in the quoted content */
if ((next_sibling = in_empty_block_in_quoted_content (container))) {
webkit_dom_node_insert_before (
container,
- WEBKIT_DOM_NODE (marker),
+ WEBKIT_DOM_NODE (end_marker),
next_sibling,
NULL);
- return;
+ goto out;
}
if (!webkit_dom_node_get_previous_sibling (container)) {
split_node = parent_node;
@@ -1660,13 +1661,11 @@ dom_selection_save (WebKitDOMDocument *document)
/* Don't save selection straight into body */
if (WEBKIT_DOM_IS_HTML_BODY_ELEMENT (split_node)) {
- marker = webkit_dom_document_get_element_by_id (
- document, "-x-evo-selection-start-marker");
- remove_node (WEBKIT_DOM_NODE (marker));
+ remove_node (WEBKIT_DOM_NODE (start_marker));
return;
}
- marker_node = WEBKIT_DOM_NODE (marker);
+ marker_node = WEBKIT_DOM_NODE (end_marker);
if (split_node) {
parent_node = webkit_dom_node_get_parent_node (split_node);
@@ -1699,8 +1698,7 @@ dom_selection_save (WebKitDOMDocument *document)
next_sibling = webkit_dom_node_get_next_sibling (next_sibling);
/* If the selection is collapsed ensure that the selection start marker
* is before the end marker */
- if (next_sibling && WEBKIT_DOM_IS_ELEMENT (next_sibling) &&
- element_has_id (WEBKIT_DOM_ELEMENT (next_sibling), "-x-evo-selection-start-marker")) {
+ if (next_sibling && webkit_dom_node_is_same_node (next_sibling, WEBKIT_DOM_NODE
(start_marker))) {
webkit_dom_node_insert_before (
webkit_dom_node_get_parent_node (marker_node),
next_sibling,
@@ -1708,6 +1706,20 @@ dom_selection_save (WebKitDOMDocument *document)
NULL);
}
}
+ out:
+ if (!collapsed) {
+ WebKitDOMDOMSelection *dom_selection;
+ WebKitDOMDOMWindow *window;
+
+ webkit_dom_range_set_start_after (range, WEBKIT_DOM_NODE (start_marker), NULL);
+ webkit_dom_range_set_end_before (range, WEBKIT_DOM_NODE (end_marker), NULL);
+
+ window = webkit_dom_document_get_default_view (document);
+ dom_selection = webkit_dom_dom_window_get_selection (window);
+
+ webkit_dom_dom_selection_remove_all_ranges (dom_selection);
+ webkit_dom_dom_selection_add_range (dom_selection, range);
+ }
}
static gboolean
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]