Update Romanian translation
[evolution.git] / src / modules / webkit-editor / web-extension / e-editor-page.c
blob09b02359bcaf8a3b57880f43c66ea062a06376e3
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2 /*
3 * Copyright (C) 2016 Red Hat, Inc. (www.redhat.com)
5 * This library is free software: you can redistribute it and/or modify it
6 * under the terms of the GNU Lesser General Public License as published by
7 * the Free Software Foundation.
9 * This library is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
11 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
12 * for more details.
14 * You should have received a copy of the GNU Lesser General Public License
15 * along with this library. If not, see <http://www.gnu.org/licenses/>.
18 #include "evolution-config.h"
20 #include <glib.h>
21 #include <webkit2/webkit-web-extension.h>
23 #include "web-extensions/e-dom-utils.h"
25 #include "e-editor-dom-functions.h"
26 #include "e-editor-web-extension.h"
27 #include "e-editor-undo-redo-manager.h"
29 #include "e-editor-page.h"
31 struct _EEditorPagePrivate {
32 WebKitWebPage *web_page; /* not referenced */
33 EEditorWebExtension *web_extension; /* not referenced */
35 EEditorUndoRedoManager *undo_redo_manager;
36 ESpellChecker *spell_checker;
38 guint spell_check_on_scroll_event_source_id;
40 EContentEditorAlignment alignment;
41 EContentEditorBlockFormat block_format;
42 guint32 style_flags; /* bit-OR of EContentEditorStyleFlags */
43 gchar *background_color;
44 gchar *font_color;
45 gchar *font_name;
46 gint font_size;
48 guint selection_changed_blocked;
49 gboolean selection_changed;
51 gboolean force_image_load;
52 gboolean html_mode;
53 gboolean return_key_pressed;
54 gboolean space_key_pressed;
55 gboolean smiley_written;
56 gint word_wrap_length;
58 gint16 convert_in_situ_start_at_bottom;
59 gint16 convert_in_situ_top_signature;
60 gboolean convert_in_situ;
61 gboolean body_input_event_removed;
62 gboolean dont_save_history_in_body_input;
63 gboolean composition_in_progress;
64 gboolean pasting_content_from_itself;
65 gboolean renew_history_after_coordinates;
66 gboolean allow_top_signature;
67 gboolean processing_keypress_event;
69 GHashTable *inline_images;
71 WebKitDOMNode *node_under_mouse_click;
73 GSettings *mail_settings;
76 G_DEFINE_TYPE (EEditorPage, e_editor_page, G_TYPE_OBJECT)
79 static void
80 web_page_document_loaded_cb (WebKitWebPage *web_page,
81 EEditorPage *editor_page)
83 g_return_if_fail (WEBKIT_IS_WEB_PAGE (web_page));
84 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page));
86 editor_page->priv->body_input_event_removed = TRUE;
88 e_editor_undo_redo_manager_clean_history (editor_page->priv->undo_redo_manager);
89 e_editor_dom_process_content_after_load (editor_page);
92 static gboolean
93 web_page_context_menu_cb (WebKitWebPage *web_page,
94 WebKitContextMenu *context_menu,
95 WebKitWebHitTestResult *hit_test_result,
96 EEditorPage *editor_page)
98 WebKitDOMNode *node;
99 EContentEditorNodeFlags flags = 0;
100 GVariant *variant;
102 g_return_val_if_fail (E_IS_EDITOR_PAGE (editor_page), FALSE);
104 node = webkit_web_hit_test_result_get_node (hit_test_result);
105 editor_page->priv->node_under_mouse_click = node;
107 if (WEBKIT_DOM_IS_HTML_HR_ELEMENT (node))
108 flags |= E_CONTENT_EDITOR_NODE_IS_H_RULE;
110 if (WEBKIT_DOM_IS_HTML_ANCHOR_ELEMENT (node) ||
111 (dom_node_find_parent_element (node, "A") != NULL))
112 flags |= E_CONTENT_EDITOR_NODE_IS_ANCHOR;
114 if (WEBKIT_DOM_IS_HTML_IMAGE_ELEMENT (node) ||
115 (dom_node_find_parent_element (node, "IMG") != NULL))
116 flags |= E_CONTENT_EDITOR_NODE_IS_IMAGE;
118 if (WEBKIT_DOM_IS_HTML_TABLE_CELL_ELEMENT (node) ||
119 (dom_node_find_parent_element (node, "TD") != NULL) ||
120 (dom_node_find_parent_element (node, "TH") != NULL))
121 flags |= E_CONTENT_EDITOR_NODE_IS_TABLE_CELL;
123 if (flags & E_CONTENT_EDITOR_NODE_IS_TABLE_CELL &&
124 (WEBKIT_DOM_IS_HTML_TABLE_ELEMENT (node) ||
125 dom_node_find_parent_element (node, "TABLE") != NULL))
126 flags |= E_CONTENT_EDITOR_NODE_IS_TABLE;
128 if (flags == 0)
129 flags |= E_CONTENT_EDITOR_NODE_IS_TEXT;
131 variant = g_variant_new_int32 (flags);
132 webkit_context_menu_set_user_data (context_menu, variant);
134 return FALSE;
137 static void
138 e_editor_page_setup (EEditorPage *editor_page,
139 WebKitWebPage *web_page,
140 struct _EEditorWebExtension *web_extension)
142 WebKitWebEditor *web_editor;
144 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page));
146 editor_page->priv->web_page = web_page;
147 editor_page->priv->web_extension = web_extension;
148 editor_page->priv->undo_redo_manager = e_editor_undo_redo_manager_new (editor_page);
150 g_signal_connect_swapped (
151 editor_page->priv->undo_redo_manager, "notify::can-undo",
152 G_CALLBACK (e_editor_page_emit_undo_redo_state_changed), editor_page);
154 g_signal_connect_swapped (
155 editor_page->priv->undo_redo_manager, "notify::can-redo",
156 G_CALLBACK (e_editor_page_emit_undo_redo_state_changed), editor_page);
158 web_editor = webkit_web_page_get_editor (web_page);
160 g_signal_connect_swapped (
161 web_editor, "selection-changed",
162 G_CALLBACK (e_editor_page_emit_selection_changed), editor_page);
164 g_signal_connect (
165 web_page, "document-loaded",
166 G_CALLBACK (web_page_document_loaded_cb), editor_page);
168 g_signal_connect (
169 web_page, "context-menu",
170 G_CALLBACK (web_page_context_menu_cb), editor_page);
173 static void
174 e_editor_page_dispose (GObject *object)
176 EEditorPage *editor_page = E_EDITOR_PAGE (object);
178 if (editor_page->priv->spell_check_on_scroll_event_source_id > 0) {
179 g_source_remove (editor_page->priv->spell_check_on_scroll_event_source_id);
180 editor_page->priv->spell_check_on_scroll_event_source_id = 0;
183 if (editor_page->priv->background_color != NULL) {
184 g_free (editor_page->priv->background_color);
185 editor_page->priv->background_color = NULL;
188 if (editor_page->priv->font_color != NULL) {
189 g_free (editor_page->priv->font_color);
190 editor_page->priv->font_color = NULL;
193 if (editor_page->priv->font_name != NULL) {
194 g_free (editor_page->priv->font_name);
195 editor_page->priv->font_name = NULL;
198 if (editor_page->priv->mail_settings != NULL) {
199 g_signal_handlers_disconnect_by_data (editor_page->priv->mail_settings, object);
200 g_object_unref (editor_page->priv->mail_settings);
201 editor_page->priv->mail_settings = NULL;
204 g_clear_object (&editor_page->priv->undo_redo_manager);
205 g_clear_object (&editor_page->priv->spell_checker);
207 g_hash_table_remove_all (editor_page->priv->inline_images);
209 /* Chain up to parent's method. */
210 G_OBJECT_CLASS (e_editor_page_parent_class)->dispose (object);
213 static void
214 e_editor_page_finalize (GObject *object)
216 EEditorPage *editor_page = E_EDITOR_PAGE (object);
218 g_hash_table_destroy (editor_page->priv->inline_images);
220 /* Chain up to parent's method. */
221 G_OBJECT_CLASS (e_editor_page_parent_class)->finalize (object);
224 static void
225 e_editor_page_class_init (EEditorPageClass *class)
227 GObjectClass *object_class;
229 g_type_class_add_private (class, sizeof (EEditorPagePrivate));
231 object_class = G_OBJECT_CLASS (class);
232 object_class->dispose = e_editor_page_dispose;
233 object_class->finalize = e_editor_page_finalize;
236 static void
237 e_editor_page_init (EEditorPage *editor_page)
239 editor_page->priv = G_TYPE_INSTANCE_GET_PRIVATE (editor_page, E_TYPE_EDITOR_PAGE, EEditorPagePrivate);
240 editor_page->priv->style_flags = 0;
241 editor_page->priv->selection_changed_blocked = 0;
242 editor_page->priv->background_color = g_strdup ("");
243 editor_page->priv->font_color = g_strdup ("");
244 editor_page->priv->font_name = g_strdup ("");
245 editor_page->priv->font_size = E_CONTENT_EDITOR_FONT_SIZE_NORMAL;
246 editor_page->priv->alignment = E_CONTENT_EDITOR_ALIGNMENT_LEFT;
247 editor_page->priv->block_format = E_CONTENT_EDITOR_BLOCK_FORMAT_PARAGRAPH;
248 editor_page->priv->force_image_load = FALSE;
249 editor_page->priv->html_mode = TRUE;
250 editor_page->priv->processing_keypress_event = FALSE;
251 editor_page->priv->return_key_pressed = FALSE;
252 editor_page->priv->space_key_pressed = FALSE;
253 editor_page->priv->smiley_written = FALSE;
254 editor_page->priv->convert_in_situ = FALSE;
255 editor_page->priv->body_input_event_removed = TRUE;
256 editor_page->priv->dont_save_history_in_body_input = FALSE;
257 editor_page->priv->pasting_content_from_itself = FALSE;
258 editor_page->priv->composition_in_progress = FALSE;
259 editor_page->priv->renew_history_after_coordinates = TRUE;
260 editor_page->priv->allow_top_signature = FALSE;
261 editor_page->priv->spell_check_on_scroll_event_source_id = 0;
262 editor_page->priv->mail_settings = e_util_ref_settings ("org.gnome.evolution.mail");
263 editor_page->priv->word_wrap_length = g_settings_get_int (editor_page->priv->mail_settings, "composer-word-wrap-length");
264 editor_page->priv->inline_images = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
265 editor_page->priv->spell_checker = e_spell_checker_new ();
268 EEditorPage *
269 e_editor_page_new (WebKitWebPage *web_page,
270 struct _EEditorWebExtension *web_extension)
272 EEditorPage *editor_page;
274 g_return_val_if_fail (WEBKIT_IS_WEB_PAGE (web_page), NULL);
275 g_return_val_if_fail (E_IS_EDITOR_WEB_EXTENSION (web_extension), NULL);
277 editor_page = g_object_new (E_TYPE_EDITOR_PAGE, NULL);
278 e_editor_page_setup (editor_page, web_page, web_extension);
280 return editor_page;
283 WebKitWebPage *
284 e_editor_page_get_web_page (EEditorPage *editor_page)
286 g_return_val_if_fail (E_IS_EDITOR_PAGE (editor_page), NULL);
288 return editor_page->priv->web_page;
291 struct _EEditorWebExtension *
292 e_editor_page_get_web_extension (EEditorPage *editor_page)
294 g_return_val_if_fail (E_IS_EDITOR_PAGE (editor_page), NULL);
296 return editor_page->priv->web_extension;
299 guint64
300 e_editor_page_get_page_id (EEditorPage *editor_page)
302 g_return_val_if_fail (E_IS_EDITOR_PAGE (editor_page), 0);
304 if (!editor_page->priv->web_page)
305 return 0;
307 return webkit_web_page_get_id (editor_page->priv->web_page);
310 WebKitDOMDocument *
311 e_editor_page_get_document (EEditorPage *editor_page)
313 g_return_val_if_fail (E_IS_EDITOR_PAGE (editor_page), NULL);
315 if (!editor_page->priv->web_page)
316 return NULL;
318 return webkit_web_page_get_dom_document (editor_page->priv->web_page);
321 struct _EEditorUndoRedoManager *
322 e_editor_page_get_undo_redo_manager (EEditorPage *editor_page)
324 g_return_val_if_fail (E_IS_EDITOR_PAGE (editor_page), NULL);
326 return editor_page->priv->undo_redo_manager;
329 void
330 e_editor_page_block_selection_changed (EEditorPage *editor_page)
332 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page));
334 editor_page->priv->selection_changed_blocked++;
337 void
338 e_editor_page_unblock_selection_changed (EEditorPage *editor_page)
340 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page));
341 g_return_if_fail (editor_page->priv->selection_changed_blocked > 0);
343 editor_page->priv->selection_changed_blocked--;
345 if (!editor_page->priv->selection_changed_blocked &&
346 editor_page->priv->selection_changed) {
347 editor_page->priv->selection_changed = FALSE;
348 e_editor_page_emit_selection_changed (editor_page);
352 gboolean
353 e_editor_page_get_html_mode (EEditorPage *editor_page)
355 g_return_val_if_fail (E_IS_EDITOR_PAGE (editor_page), FALSE);
357 return editor_page->priv->html_mode;
360 void
361 e_editor_page_set_html_mode (EEditorPage *editor_page,
362 gboolean value)
364 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page));
366 editor_page->priv->html_mode = value;
369 gboolean
370 e_editor_page_get_force_image_load (EEditorPage *editor_page)
372 g_return_val_if_fail (E_IS_EDITOR_PAGE (editor_page), FALSE);
374 return editor_page->priv->force_image_load;
377 void
378 e_editor_page_set_force_image_load (EEditorPage *editor_page,
379 gboolean value)
381 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page));
383 editor_page->priv->force_image_load = value;
386 gint
387 e_editor_page_get_word_wrap_length (EEditorPage *editor_page)
389 g_return_val_if_fail (E_IS_EDITOR_PAGE (editor_page), 0);
391 return editor_page->priv->word_wrap_length;
394 static gboolean
395 e_editor_page_check_style_flag (EEditorPage *editor_page,
396 EContentEditorStyleFlags flag)
398 g_return_val_if_fail (E_IS_EDITOR_PAGE (editor_page), FALSE);
400 return (editor_page->priv->style_flags & flag) != 0;
403 static gboolean
404 e_editor_page_set_style_flag (EEditorPage *editor_page,
405 EContentEditorStyleFlags flag,
406 gboolean value)
408 g_return_val_if_fail (E_IS_EDITOR_PAGE (editor_page), FALSE);
410 if ((((editor_page->priv->style_flags & flag) != 0) ? 1 : 0) == (value ? 1 : 0))
411 return FALSE;
413 editor_page->priv->style_flags = (editor_page->priv->style_flags & ~flag) | (value ? flag : 0);
415 return TRUE;
418 gboolean
419 e_editor_page_get_bold (EEditorPage *editor_page)
421 g_return_val_if_fail (E_IS_EDITOR_PAGE (editor_page), FALSE);
423 return e_editor_page_check_style_flag (editor_page, E_CONTENT_EDITOR_STYLE_IS_BOLD);
426 void
427 e_editor_page_set_bold (EEditorPage *editor_page,
428 gboolean value)
430 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page));
432 if (e_editor_page_get_bold (editor_page) != value) {
433 e_editor_dom_selection_set_bold (editor_page, value);
434 e_editor_page_set_style_flag (editor_page, E_CONTENT_EDITOR_STYLE_IS_BOLD, value);
438 gboolean
439 e_editor_page_get_italic (EEditorPage *editor_page)
441 g_return_val_if_fail (E_IS_EDITOR_PAGE (editor_page), FALSE);
443 return e_editor_page_check_style_flag (editor_page, E_CONTENT_EDITOR_STYLE_IS_ITALIC);
446 void
447 e_editor_page_set_italic (EEditorPage *editor_page,
448 gboolean value)
450 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page));
452 if (e_editor_page_get_italic (editor_page) != value) {
453 e_editor_dom_selection_set_italic (editor_page, value);
454 e_editor_page_set_style_flag (editor_page, E_CONTENT_EDITOR_STYLE_IS_ITALIC, value);
458 gboolean
459 e_editor_page_get_underline (EEditorPage *editor_page)
461 g_return_val_if_fail (E_IS_EDITOR_PAGE (editor_page), FALSE);
463 return e_editor_page_check_style_flag (editor_page, E_CONTENT_EDITOR_STYLE_IS_UNDERLINE);
466 void
467 e_editor_page_set_underline (EEditorPage *editor_page,
468 gboolean value)
470 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page));
472 if (e_editor_page_get_underline (editor_page) != value) {
473 e_editor_dom_selection_set_underline (editor_page, value);
474 e_editor_page_set_style_flag (editor_page, E_CONTENT_EDITOR_STYLE_IS_UNDERLINE, value);
478 gboolean
479 e_editor_page_get_monospace (EEditorPage *editor_page)
481 g_return_val_if_fail (E_IS_EDITOR_PAGE (editor_page), FALSE);
483 return e_editor_page_check_style_flag (editor_page, E_CONTENT_EDITOR_STYLE_IS_MONOSPACE);
486 void
487 e_editor_page_set_monospace (EEditorPage *editor_page,
488 gboolean value)
490 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page));
492 if (e_editor_page_get_monospace (editor_page) != value) {
493 e_editor_dom_selection_set_monospace (editor_page, value);
494 e_editor_page_set_style_flag (editor_page, E_CONTENT_EDITOR_STYLE_IS_MONOSPACE, value);
498 gboolean
499 e_editor_page_get_strikethrough (EEditorPage *editor_page)
501 g_return_val_if_fail (E_IS_EDITOR_PAGE (editor_page), FALSE);
503 return e_editor_page_check_style_flag (editor_page, E_CONTENT_EDITOR_STYLE_IS_STRIKETHROUGH);
506 void
507 e_editor_page_set_strikethrough (EEditorPage *editor_page,
508 gboolean value)
510 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page));
512 if (e_editor_page_get_strikethrough (editor_page) != value) {
513 e_editor_dom_selection_set_strikethrough (editor_page, value);
514 e_editor_page_set_style_flag (editor_page, E_CONTENT_EDITOR_STYLE_IS_STRIKETHROUGH, value);
518 guint
519 e_editor_page_get_font_size (EEditorPage *editor_page)
521 g_return_val_if_fail (E_IS_EDITOR_PAGE (editor_page), 0);
523 return editor_page->priv->font_size;
526 void
527 e_editor_page_set_font_size (EEditorPage *editor_page,
528 guint value)
530 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page));
532 if (editor_page->priv->font_size == value)
533 return;
535 editor_page->priv->font_size = value;
538 const gchar *
539 e_editor_page_get_font_color (EEditorPage *editor_page)
541 g_return_val_if_fail (E_IS_EDITOR_PAGE (editor_page), NULL);
543 return editor_page->priv->font_color;
546 EContentEditorAlignment
547 e_editor_page_get_alignment (EEditorPage *editor_page)
549 g_return_val_if_fail (E_IS_EDITOR_PAGE (editor_page), E_CONTENT_EDITOR_ALIGNMENT_LEFT);
551 return editor_page->priv->alignment;
554 void
555 e_editor_page_set_alignment (EEditorPage *editor_page,
556 EContentEditorAlignment value)
558 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page));
560 editor_page->priv->alignment = value;
563 gboolean
564 e_editor_page_is_processing_keypress_event (EEditorPage *editor_page)
566 g_return_val_if_fail (E_IS_EDITOR_PAGE (editor_page), FALSE);
568 return editor_page->priv->processing_keypress_event;
571 void
572 e_editor_page_set_is_processing_keypress_event (EEditorPage *editor_page,
573 gboolean processing_keypress_event)
575 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page));
577 editor_page->priv->processing_keypress_event = processing_keypress_event;
580 gboolean
581 e_editor_page_get_return_key_pressed (EEditorPage *editor_page)
583 g_return_val_if_fail (E_IS_EDITOR_PAGE (editor_page), FALSE);
585 return editor_page->priv->return_key_pressed;
588 void
589 e_editor_page_set_return_key_pressed (EEditorPage *editor_page,
590 gboolean value)
592 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page));
594 editor_page->priv->return_key_pressed = value;
597 gboolean
598 e_editor_page_get_space_key_pressed (EEditorPage *editor_page)
600 g_return_val_if_fail (E_IS_EDITOR_PAGE (editor_page), FALSE);
602 return editor_page->priv->space_key_pressed;
605 void
606 e_editor_page_set_space_key_pressed (EEditorPage *editor_page,
607 gboolean value)
609 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page));
611 editor_page->priv->space_key_pressed = value;
614 gboolean
615 e_editor_page_get_magic_links_enabled (EEditorPage *editor_page)
617 g_return_val_if_fail (E_IS_EDITOR_PAGE (editor_page), FALSE);
619 return g_settings_get_boolean (editor_page->priv->mail_settings, "composer-magic-links");
622 gboolean
623 e_editor_page_get_magic_smileys_enabled (EEditorPage *editor_page)
625 g_return_val_if_fail (E_IS_EDITOR_PAGE (editor_page), FALSE);
627 return g_settings_get_boolean (editor_page->priv->mail_settings, "composer-magic-smileys");
630 gboolean
631 e_editor_page_get_unicode_smileys_enabled (EEditorPage *editor_page)
633 g_return_val_if_fail (E_IS_EDITOR_PAGE (editor_page), FALSE);
635 return g_settings_get_boolean (editor_page->priv->mail_settings, "composer-unicode-smileys");
638 EImageLoadingPolicy
639 e_editor_page_get_image_loading_policy (EEditorPage *editor_page)
641 g_return_val_if_fail (E_IS_EDITOR_PAGE (editor_page), E_IMAGE_LOADING_POLICY_NEVER);
643 return g_settings_get_enum (editor_page->priv->mail_settings, "image-loading-policy");
646 gboolean
647 e_editor_page_get_inline_spelling_enabled (EEditorPage *editor_page)
649 g_return_val_if_fail (E_IS_EDITOR_PAGE (editor_page), FALSE);
651 return g_settings_get_boolean (editor_page->priv->mail_settings, "composer-inline-spelling");
654 gboolean
655 e_editor_page_check_word_spelling (EEditorPage *editor_page,
656 const gchar *word,
657 const gchar * const *languages)
659 g_return_val_if_fail (E_IS_EDITOR_PAGE (editor_page), TRUE);
661 if (!word || !languages || !*languages)
662 return TRUE;
664 e_spell_checker_set_active_languages (editor_page->priv->spell_checker, languages);
666 return e_spell_checker_check_word (editor_page->priv->spell_checker, word, -1);
669 gboolean
670 e_editor_page_get_body_input_event_removed (EEditorPage *editor_page)
672 g_return_val_if_fail (E_IS_EDITOR_PAGE (editor_page), FALSE);
674 return editor_page->priv->body_input_event_removed;
677 void
678 e_editor_page_set_body_input_event_removed (EEditorPage *editor_page,
679 gboolean value)
681 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page));
683 editor_page->priv->body_input_event_removed = value;
686 gboolean
687 e_editor_page_get_convert_in_situ (EEditorPage *editor_page,
688 gint16 *out_start_at_bottom,
689 gint16 *out_top_signature)
691 g_return_val_if_fail (E_IS_EDITOR_PAGE (editor_page), FALSE);
693 if (out_start_at_bottom)
694 *out_start_at_bottom = editor_page->priv->convert_in_situ_start_at_bottom;
695 if (out_top_signature)
696 *out_top_signature = editor_page->priv->convert_in_situ_top_signature;
698 return editor_page->priv->convert_in_situ;
701 void
702 e_editor_page_set_convert_in_situ (EEditorPage *editor_page,
703 gboolean value,
704 gint16 start_at_bottom,
705 gint16 top_signature)
707 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page));
709 editor_page->priv->convert_in_situ = value;
710 editor_page->priv->convert_in_situ_start_at_bottom = start_at_bottom;
711 editor_page->priv->convert_in_situ_top_signature = top_signature;
714 GHashTable *
715 e_editor_page_get_inline_images (EEditorPage *editor_page)
717 g_return_val_if_fail (E_IS_EDITOR_PAGE (editor_page), NULL);
719 return editor_page->priv->inline_images;
722 void
723 e_editor_page_add_new_inline_image_into_list (EEditorPage *editor_page,
724 const gchar *cid_src,
725 const gchar *src)
727 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page));
729 g_hash_table_insert (editor_page->priv->inline_images, g_strdup (cid_src), g_strdup (src));
732 gboolean
733 e_editor_page_get_is_smiley_written (EEditorPage *editor_page)
735 g_return_val_if_fail (E_IS_EDITOR_PAGE (editor_page), FALSE);
737 return editor_page->priv->smiley_written;
740 void
741 e_editor_page_set_is_smiley_written (EEditorPage *editor_page,
742 gboolean value)
744 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page));
746 editor_page->priv->smiley_written = value;
749 gboolean
750 e_editor_page_get_dont_save_history_in_body_input (EEditorPage *editor_page)
752 g_return_val_if_fail (E_IS_EDITOR_PAGE (editor_page), FALSE);
754 return editor_page->priv->dont_save_history_in_body_input;
757 void
758 e_editor_page_set_dont_save_history_in_body_input (EEditorPage *editor_page,
759 gboolean value)
761 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page));
763 editor_page->priv->dont_save_history_in_body_input = value;
766 gboolean
767 e_editor_page_is_pasting_content_from_itself (EEditorPage *editor_page)
769 g_return_val_if_fail (E_IS_EDITOR_PAGE (editor_page), FALSE);
771 return editor_page->priv->pasting_content_from_itself;
774 void
775 e_editor_page_set_pasting_content_from_itself (EEditorPage *editor_page,
776 gboolean value)
778 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page));
780 editor_page->priv->pasting_content_from_itself = value;
783 gboolean
784 e_editor_page_get_renew_history_after_coordinates (EEditorPage *editor_page)
786 g_return_val_if_fail (E_IS_EDITOR_PAGE (editor_page), FALSE);
788 return editor_page->priv->renew_history_after_coordinates;
791 void
792 e_editor_page_set_renew_history_after_coordinates (EEditorPage *editor_page,
793 gboolean renew_history_after_coordinates)
795 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page));
797 editor_page->priv->renew_history_after_coordinates = renew_history_after_coordinates;
800 gboolean
801 e_editor_page_is_composition_in_progress (EEditorPage *editor_page)
803 g_return_val_if_fail (E_IS_EDITOR_PAGE (editor_page), FALSE);
805 return editor_page->priv->composition_in_progress;
808 void
809 e_editor_page_set_composition_in_progress (EEditorPage *editor_page,
810 gboolean value)
812 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page));
814 editor_page->priv->composition_in_progress = value;
817 gboolean
818 e_editor_page_get_allow_top_signature (EEditorPage *editor_page)
820 g_return_val_if_fail (E_IS_EDITOR_PAGE (editor_page), FALSE);
822 return editor_page->priv->allow_top_signature;
825 void
826 e_editor_page_set_allow_top_signature (EEditorPage *editor_page,
827 gboolean value)
829 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page));
831 editor_page->priv->allow_top_signature = value;
834 guint
835 e_editor_page_get_spell_check_on_scroll_event_source_id (EEditorPage *editor_page)
837 g_return_val_if_fail (E_IS_EDITOR_PAGE (editor_page), 0);
839 return editor_page->priv->spell_check_on_scroll_event_source_id;
842 void
843 e_editor_page_set_spell_check_on_scroll_event_source_id (EEditorPage *editor_page,
844 guint value)
846 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page));
848 editor_page->priv->spell_check_on_scroll_event_source_id = value;
851 WebKitDOMNode *
852 e_editor_page_get_node_under_mouse_click (EEditorPage *editor_page)
854 g_return_val_if_fail (E_IS_EDITOR_PAGE (editor_page), NULL);
856 return editor_page->priv->node_under_mouse_click;
859 void
860 e_editor_page_emit_selection_changed (EEditorPage *editor_page)
862 WebKitDOMDocument *document;
863 WebKitDOMRange *range = NULL;
864 GDBusConnection *connection;
865 GError *error = NULL;
867 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page));
869 if (!editor_page->priv->web_extension ||
870 editor_page->priv->selection_changed_blocked) {
871 editor_page->priv->selection_changed = TRUE;
872 return;
875 document = e_editor_page_get_document (editor_page);
876 if (!document)
877 return;
879 connection = e_editor_web_extension_get_connection (editor_page->priv->web_extension);
880 if (!connection)
881 return;
883 range = e_editor_dom_get_current_range (editor_page);
884 if (!range)
885 return;
887 g_clear_object (&range);
889 editor_page->priv->alignment = e_editor_dom_selection_get_alignment (editor_page);
890 editor_page->priv->block_format = e_editor_dom_selection_get_block_format (editor_page);
892 if (editor_page->priv->html_mode) {
893 guint32 style_flags = E_CONTENT_EDITOR_STYLE_NONE;
895 #define set_flag_if(tst, flg) G_STMT_START { \
896 if (tst (editor_page)) \
897 style_flags |= flg; \
898 } G_STMT_END
900 set_flag_if (e_editor_dom_selection_is_bold, E_CONTENT_EDITOR_STYLE_IS_BOLD);
901 set_flag_if (e_editor_dom_selection_is_italic, E_CONTENT_EDITOR_STYLE_IS_ITALIC);
902 set_flag_if (e_editor_dom_selection_is_underline, E_CONTENT_EDITOR_STYLE_IS_UNDERLINE);
903 set_flag_if (e_editor_dom_selection_is_strikethrough, E_CONTENT_EDITOR_STYLE_IS_STRIKETHROUGH);
904 set_flag_if (e_editor_dom_selection_is_monospace, E_CONTENT_EDITOR_STYLE_IS_MONOSPACE);
905 set_flag_if (e_editor_dom_selection_is_subscript, E_CONTENT_EDITOR_STYLE_IS_SUBSCRIPT);
906 set_flag_if (e_editor_dom_selection_is_superscript, E_CONTENT_EDITOR_STYLE_IS_SUPERSCRIPT);
908 #undef set_flag_if
910 editor_page->priv->style_flags = style_flags;
911 editor_page->priv->font_size = e_editor_dom_selection_get_font_size (editor_page);
912 g_free (editor_page->priv->font_color);
913 editor_page->priv->font_color = e_editor_dom_selection_get_font_color (editor_page);
916 g_dbus_connection_emit_signal (
917 connection,
918 NULL,
919 E_WEBKIT_EDITOR_WEB_EXTENSION_OBJECT_PATH,
920 E_WEBKIT_EDITOR_WEB_EXTENSION_INTERFACE,
921 "SelectionChanged",
922 g_variant_new ("(tiibiis)",
923 e_editor_page_get_page_id (editor_page),
924 (gint32) editor_page->priv->alignment,
925 (gint32) editor_page->priv->block_format,
926 e_editor_dom_selection_is_indented (editor_page),
927 editor_page->priv->style_flags,
928 (gint32) editor_page->priv->font_size,
929 editor_page->priv->font_color ? editor_page->priv->font_color : ""),
930 &error);
932 if (error) {
933 g_warning ("%s: Failed to emit signal: %s", G_STRFUNC, error->message);
934 g_error_free (error);
938 void
939 e_editor_page_emit_content_changed (EEditorPage *editor_page)
941 GDBusConnection *connection;
942 GError *error = NULL;
944 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page));
946 if (!editor_page->priv->web_extension)
947 return;
949 connection = e_editor_web_extension_get_connection (editor_page->priv->web_extension);
950 if (!connection)
951 return;
953 g_dbus_connection_emit_signal (
954 connection,
955 NULL,
956 E_WEBKIT_EDITOR_WEB_EXTENSION_OBJECT_PATH,
957 E_WEBKIT_EDITOR_WEB_EXTENSION_INTERFACE,
958 "ContentChanged",
959 g_variant_new ("(t)", e_editor_page_get_page_id (editor_page)),
960 &error);
962 if (error) {
963 g_warning ("%s: Failed to emit signal: %s", G_STRFUNC, error->message);
964 g_error_free (error);
968 void
969 e_editor_page_emit_undo_redo_state_changed (EEditorPage *editor_page)
971 GDBusConnection *connection;
972 GError *error = NULL;
974 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page));
976 if (!editor_page->priv->web_extension)
977 return;
979 connection = e_editor_web_extension_get_connection (editor_page->priv->web_extension);
980 if (!connection)
981 return;
983 g_dbus_connection_emit_signal (
984 connection,
985 NULL,
986 E_WEBKIT_EDITOR_WEB_EXTENSION_OBJECT_PATH,
987 E_WEBKIT_EDITOR_WEB_EXTENSION_INTERFACE,
988 "UndoRedoStateChanged",
989 g_variant_new ("(tbb)",
990 e_editor_page_get_page_id (editor_page),
991 e_editor_undo_redo_manager_can_undo (editor_page->priv->undo_redo_manager),
992 e_editor_undo_redo_manager_can_redo (editor_page->priv->undo_redo_manager)),
993 &error);
995 if (error) {
996 g_warning ("%s: Failed to emit signal: %s", G_STRFUNC, error->message);
997 g_error_free (error);
1001 void
1002 e_editor_page_emit_user_changed_default_colors (EEditorPage *editor_page,
1003 gboolean suppress_color_changes)
1005 GDBusConnection *connection;
1006 GError *error = NULL;
1008 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page));
1010 if (!editor_page->priv->web_extension)
1011 return;
1013 connection = e_editor_web_extension_get_connection (editor_page->priv->web_extension);
1014 if (!connection)
1015 return;
1017 g_dbus_connection_emit_signal (
1018 connection,
1019 NULL,
1020 E_WEBKIT_EDITOR_WEB_EXTENSION_OBJECT_PATH,
1021 E_WEBKIT_EDITOR_WEB_EXTENSION_INTERFACE,
1022 "UserChangedDefaultColors",
1023 g_variant_new ("(b)", suppress_color_changes),
1024 &error);
1026 if (error) {
1027 g_warning ("%s: Failed to emit signal: %s", G_STRFUNC, error->message);
1028 g_error_free (error);