aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomas Popela <tpopela@redhat.com>2014-08-27 22:06:07 +0800
committerTomas Popela <tpopela@redhat.com>2014-08-27 22:12:02 +0800
commit6a0592918ac4bf109d67b619cdf3835239b700d4 (patch)
tree29eac1651b3ee2923a7a95ab3888ab67a7b1d231
parent94ac03022048a12b6a43c970ab6a95eef865e7b6 (diff)
downloadgsoc2013-evolution-6a0592918ac4bf109d67b619cdf3835239b700d4.tar
gsoc2013-evolution-6a0592918ac4bf109d67b619cdf3835239b700d4.tar.gz
gsoc2013-evolution-6a0592918ac4bf109d67b619cdf3835239b700d4.tar.bz2
gsoc2013-evolution-6a0592918ac4bf109d67b619cdf3835239b700d4.tar.lz
gsoc2013-evolution-6a0592918ac4bf109d67b619cdf3835239b700d4.tar.xz
gsoc2013-evolution-6a0592918ac4bf109d67b619cdf3835239b700d4.tar.zst
gsoc2013-evolution-6a0592918ac4bf109d67b619cdf3835239b700d4.zip
Fix handling of the selection in the composer when saving the message draft
When saving the draft don't lose the active selection in the web view. Also restore the selection when the draft is again opened. Also fix the situations when the spell check was not activated when the composer was opened.
-rw-r--r--composer/e-composer-private.c12
-rw-r--r--composer/e-msg-composer.c4
-rw-r--r--e-util/e-html-editor-selection.c70
-rw-r--r--e-util/e-html-editor-selection.h3
-rw-r--r--e-util/e-html-editor-view.c20
5 files changed, 56 insertions, 53 deletions
diff --git a/composer/e-composer-private.c b/composer/e-composer-private.c
index 79bba3dfe6..69d6db42a5 100644
--- a/composer/e-composer-private.c
+++ b/composer/e-composer-private.c
@@ -867,10 +867,8 @@ composer_move_caret (EMsgComposer *composer)
"data-edit-as-new",
"",
NULL);
- e_html_editor_selection_restore_caret_position (editor_selection);
- e_html_editor_selection_scroll_to_caret (editor_selection);
- e_html_editor_view_force_spell_check (view);
+ e_html_editor_selection_scroll_to_caret (editor_selection);
return;
}
@@ -930,7 +928,6 @@ composer_move_caret (EMsgComposer *composer)
e_html_editor_selection_restore_caret_position (editor_selection);
if (!html_mode)
e_html_editor_view_quote_plain_text (view);
- e_html_editor_view_force_spell_check (view);
input_start = webkit_dom_document_get_element_by_id (
document, "-x-evo-input-start");
@@ -979,8 +976,6 @@ composer_move_caret (EMsgComposer *composer)
}
}
- e_html_editor_view_force_spell_check (view);
-
webkit_dom_range_select_node_contents (
new_range,
WEBKIT_DOM_NODE (
@@ -995,6 +990,8 @@ composer_move_caret (EMsgComposer *composer)
g_object_unref (list);
g_object_unref (blockquotes);
+ e_html_editor_view_force_spell_check (view);
+
e_html_editor_selection_unblock_selection_changed (editor_selection);
}
@@ -1253,7 +1250,8 @@ e_composer_update_signature (EMsgComposer *composer)
g_return_if_fail (E_IS_MSG_COMPOSER (composer));
- /* Do nothing if we're redirecting a message or we disabled the signature * on purpose */
+ /* Do nothing if we're redirecting a message or we disabled
+ * the signature on purpose */
if (composer->priv->redirect || composer->priv->disable_signature)
return;
diff --git a/composer/e-msg-composer.c b/composer/e-msg-composer.c
index 8c1748c4c3..a728263524 100644
--- a/composer/e-msg-composer.c
+++ b/composer/e-msg-composer.c
@@ -1239,12 +1239,12 @@ composer_build_message (EMsgComposer *composer,
data = g_byte_array_new ();
e_html_editor_view_embed_styles (view);
- e_html_editor_selection_save_caret_position (selection);
+ e_html_editor_selection_save (selection);
text = e_html_editor_view_get_text_html_for_drafts (view);
e_html_editor_view_remove_embed_styles (view);
- e_html_editor_selection_restore_caret_position (selection);
+ e_html_editor_selection_restore (selection);
g_byte_array_append (data, (guint8 *) text, strlen (text));
diff --git a/e-util/e-html-editor-selection.c b/e-util/e-html-editor-selection.c
index e691b6f4f9..84f6fbc41c 100644
--- a/e-util/e-html-editor-selection.c
+++ b/e-util/e-html-editor-selection.c
@@ -3552,28 +3552,6 @@ e_html_editor_selection_is_monospaced (EHTMLEditorSelection *selection)
return ret_val;
}
-static void
-move_caret_into_element (WebKitDOMDocument *document,
- WebKitDOMElement *element)
-{
- WebKitDOMDOMWindow *window;
- WebKitDOMDOMSelection *window_selection;
- WebKitDOMRange *new_range;
-
- if (!element)
- return;
-
- window = webkit_dom_document_get_default_view (document);
- window_selection = webkit_dom_dom_window_get_selection (window);
- new_range = webkit_dom_document_create_range (document);
-
- webkit_dom_range_select_node_contents (
- new_range, WEBKIT_DOM_NODE (element), NULL);
- webkit_dom_range_collapse (new_range, FALSE, NULL);
- webkit_dom_dom_selection_remove_all_ranges (window_selection);
- webkit_dom_dom_selection_add_range (window_selection, new_range);
-}
-
/**
* e_html_editor_selection_set_monospaced:
* @selection: an #EHTMLEditorSelection
@@ -3666,7 +3644,8 @@ e_html_editor_selection_set_monospaced (EHTMLEditorSelection *selection,
webkit_dom_range_insert_node (
range, WEBKIT_DOM_NODE (monospace), NULL);
- move_caret_into_element (document, monospace);
+ e_html_editor_selection_move_caret_into_element (
+ document, monospace);
}
} else {
gboolean is_bold, is_italic, is_underline, is_strikethrough;
@@ -4750,6 +4729,28 @@ e_html_editor_selection_replace_image_src (EHTMLEditorSelection *selection,
image_load_and_insert_async (selection, element, image_uri);
}
+void
+e_html_editor_selection_move_caret_into_element (WebKitDOMDocument *document,
+ WebKitDOMElement *element)
+{
+ WebKitDOMDOMWindow *window;
+ WebKitDOMDOMSelection *window_selection;
+ WebKitDOMRange *new_range;
+
+ if (!element)
+ return;
+
+ window = webkit_dom_document_get_default_view (document);
+ window_selection = webkit_dom_dom_window_get_selection (window);
+ new_range = webkit_dom_document_create_range (document);
+
+ webkit_dom_range_select_node_contents (
+ new_range, WEBKIT_DOM_NODE (element), NULL);
+ webkit_dom_range_collapse (new_range, FALSE, NULL);
+ webkit_dom_dom_selection_remove_all_ranges (window_selection);
+ webkit_dom_dom_selection_add_range (window_selection, new_range);
+}
+
/**
* e_html_editor_selection_clear_caret_position_marker:
* @selection: an #EHTMLEditorSelection
@@ -4940,14 +4941,14 @@ e_html_editor_selection_restore_caret_position (EHTMLEditorSelection *selection)
if (element_has_class (WEBKIT_DOM_ELEMENT (next_sibling), "-x-evo-paragraph")) {
remove_node (WEBKIT_DOM_NODE (element));
- move_caret_into_element (
+ e_html_editor_selection_move_caret_into_element (
document, WEBKIT_DOM_ELEMENT (next_sibling));
goto out;
}
}
- move_caret_into_element (document, element);
+ e_html_editor_selection_move_caret_into_element (document, element);
if (fix_after_quoting) {
prev_sibling = webkit_dom_node_get_previous_sibling (
@@ -6221,16 +6222,19 @@ e_html_editor_selection_scroll_to_caret (EHTMLEditorSelection *selection)
EHTMLEditorView *view;
WebKitDOMDocument *document;
WebKitDOMDOMWindow *window;
- WebKitDOMElement *caret;
+ WebKitDOMElement *selection_start_marker;
- caret = e_html_editor_selection_save_caret_position (selection);
- if (!caret)
- return;
+ e_html_editor_selection_save (selection);
view = e_html_editor_selection_ref_html_editor_view (selection);
document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
g_object_unref (view);
+ selection_start_marker = webkit_dom_document_get_element_by_id (
+ document, "-x-evo-selection-start-marker");
+ if (!selection_start_marker)
+ return;
+
window = webkit_dom_document_get_default_view (document);
window_top = webkit_dom_dom_window_get_scroll_y (window);
@@ -6238,14 +6242,14 @@ e_html_editor_selection_scroll_to_caret (EHTMLEditorSelection *selection)
window_bottom = window_top + webkit_dom_dom_window_get_inner_height (window);
window_right = window_left + webkit_dom_dom_window_get_inner_width (window);
- element_left = webkit_dom_element_get_offset_left (caret);
- element_top = webkit_dom_element_get_offset_top (caret);
+ element_left = webkit_dom_element_get_offset_left (selection_start_marker);
+ element_top = webkit_dom_element_get_offset_top (selection_start_marker);
/* Check if caret is inside viewport, if not move to it */
if (!(element_top >= window_top && element_top <= window_bottom &&
element_left >= window_left && element_left <= window_right)) {
- webkit_dom_element_scroll_into_view (caret, TRUE);
+ webkit_dom_element_scroll_into_view (selection_start_marker, TRUE);
}
- e_html_editor_selection_clear_caret_position_marker (selection);
+ e_html_editor_selection_restore (selection);
}
diff --git a/e-util/e-html-editor-selection.h b/e-util/e-html-editor-selection.h
index 2bef77f052..3290dfe39b 100644
--- a/e-util/e-html-editor-selection.h
+++ b/e-util/e-html-editor-selection.h
@@ -183,6 +183,9 @@ void e_html_editor_selection_replace_image_src
void e_html_editor_selection_insert_image
(EHTMLEditorSelection *selection,
const gchar *image_uri);
+void e_html_editor_selection_move_caret_into_element
+ (WebKitDOMDocument *document,
+ WebKitDOMElement *element);
void e_html_editor_selection_clear_caret_position_marker
(EHTMLEditorSelection *selection);
WebKitDOMNode *
diff --git a/e-util/e-html-editor-view.c b/e-util/e-html-editor-view.c
index 90a75de3ff..e0028ffa15 100644
--- a/e-util/e-html-editor-view.c
+++ b/e-util/e-html-editor-view.c
@@ -1202,6 +1202,14 @@ html_editor_view_load_status_changed (EHTMLEditorView *view)
move_elements_to_body (document);
repair_gmail_blockquotes (document);
+ if (webkit_dom_element_get_attribute (WEBKIT_DOM_ELEMENT (body), "data-evo-draft")) {
+ /* Restore the selection how it was when the draft was saved */
+ e_html_editor_selection_move_caret_into_element (
+ document, WEBKIT_DOM_ELEMENT (body));
+ e_html_editor_selection_restore (
+ e_html_editor_view_get_selection (view));
+ }
+
/* Register on input event that is called when the content (body) is modified */
register_input_event_listener_on_body (view);
@@ -6185,17 +6193,11 @@ process_content_for_saving_as_draft (EHTMLEditorView *view)
{
WebKitDOMDocument *document;
WebKitDOMHTMLElement *body;
- WebKitDOMElement *element, *document_element;
+ WebKitDOMElement *document_element;
gchar *content;
document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
body = webkit_dom_document_get_body (document);
- element = webkit_dom_document_get_element_by_id (
- document, "-x-evo-caret-position");
-
- if (element)
- webkit_dom_element_set_attribute (
- element, "style", "display: none; color: red;", NULL);
webkit_dom_element_set_attribute (
WEBKIT_DOM_ELEMENT (body), "data-evo-draft", "", NULL);
@@ -6207,10 +6209,6 @@ process_content_for_saving_as_draft (EHTMLEditorView *view)
webkit_dom_element_remove_attribute (
WEBKIT_DOM_ELEMENT (body), "data-evo-draft");
- if (element)
- webkit_dom_element_set_attribute (
- element, "style", "color: red;", NULL);
-
return content;
}