1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
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
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"
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
;
48 guint selection_changed_blocked
;
49 gboolean selection_changed
;
51 gboolean force_image_load
;
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
)
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
);
93 web_page_context_menu_cb (WebKitWebPage
*web_page
,
94 WebKitContextMenu
*context_menu
,
95 WebKitWebHitTestResult
*hit_test_result
,
96 EEditorPage
*editor_page
)
99 EContentEditorNodeFlags flags
= 0;
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
;
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
);
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
);
165 web_page
, "document-loaded",
166 G_CALLBACK (web_page_document_loaded_cb
), editor_page
);
169 web_page
, "context-menu",
170 G_CALLBACK (web_page_context_menu_cb
), editor_page
);
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
);
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
);
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
;
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 ();
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
);
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
;
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
)
307 return webkit_web_page_get_id (editor_page
->priv
->web_page
);
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
)
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
;
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
++;
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
);
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
;
361 e_editor_page_set_html_mode (EEditorPage
*editor_page
,
364 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page
));
366 editor_page
->priv
->html_mode
= value
;
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
;
378 e_editor_page_set_force_image_load (EEditorPage
*editor_page
,
381 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page
));
383 editor_page
->priv
->force_image_load
= value
;
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
;
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;
404 e_editor_page_set_style_flag (EEditorPage
*editor_page
,
405 EContentEditorStyleFlags flag
,
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))
413 editor_page
->priv
->style_flags
= (editor_page
->priv
->style_flags
& ~flag
) | (value
? flag
: 0);
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
);
427 e_editor_page_set_bold (EEditorPage
*editor_page
,
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
);
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
);
447 e_editor_page_set_italic (EEditorPage
*editor_page
,
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
);
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
);
467 e_editor_page_set_underline (EEditorPage
*editor_page
,
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
);
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
);
487 e_editor_page_set_monospace (EEditorPage
*editor_page
,
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
);
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
);
507 e_editor_page_set_strikethrough (EEditorPage
*editor_page
,
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
);
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
;
527 e_editor_page_set_font_size (EEditorPage
*editor_page
,
530 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page
));
532 if (editor_page
->priv
->font_size
== value
)
535 editor_page
->priv
->font_size
= value
;
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
;
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
;
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
;
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
;
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
;
589 e_editor_page_set_return_key_pressed (EEditorPage
*editor_page
,
592 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page
));
594 editor_page
->priv
->return_key_pressed
= value
;
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
;
606 e_editor_page_set_space_key_pressed (EEditorPage
*editor_page
,
609 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page
));
611 editor_page
->priv
->space_key_pressed
= value
;
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");
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");
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");
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");
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");
655 e_editor_page_check_word_spelling (EEditorPage
*editor_page
,
657 const gchar
* const *languages
)
659 g_return_val_if_fail (E_IS_EDITOR_PAGE (editor_page
), TRUE
);
661 if (!word
|| !languages
|| !*languages
)
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);
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
;
678 e_editor_page_set_body_input_event_removed (EEditorPage
*editor_page
,
681 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page
));
683 editor_page
->priv
->body_input_event_removed
= value
;
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
;
702 e_editor_page_set_convert_in_situ (EEditorPage
*editor_page
,
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
;
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
;
723 e_editor_page_add_new_inline_image_into_list (EEditorPage
*editor_page
,
724 const gchar
*cid_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
));
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
;
741 e_editor_page_set_is_smiley_written (EEditorPage
*editor_page
,
744 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page
));
746 editor_page
->priv
->smiley_written
= value
;
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
;
758 e_editor_page_set_dont_save_history_in_body_input (EEditorPage
*editor_page
,
761 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page
));
763 editor_page
->priv
->dont_save_history_in_body_input
= value
;
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
;
775 e_editor_page_set_pasting_content_from_itself (EEditorPage
*editor_page
,
778 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page
));
780 editor_page
->priv
->pasting_content_from_itself
= value
;
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
;
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
;
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
;
809 e_editor_page_set_composition_in_progress (EEditorPage
*editor_page
,
812 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page
));
814 editor_page
->priv
->composition_in_progress
= value
;
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
;
826 e_editor_page_set_allow_top_signature (EEditorPage
*editor_page
,
829 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page
));
831 editor_page
->priv
->allow_top_signature
= value
;
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
;
843 e_editor_page_set_spell_check_on_scroll_event_source_id (EEditorPage
*editor_page
,
846 g_return_if_fail (E_IS_EDITOR_PAGE (editor_page
));
848 editor_page
->priv
->spell_check_on_scroll_event_source_id
= value
;
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
;
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
;
875 document
= e_editor_page_get_document (editor_page
);
879 connection
= e_editor_web_extension_get_connection (editor_page
->priv
->web_extension
);
883 range
= e_editor_dom_get_current_range (editor_page
);
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; \
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
);
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 (
919 E_WEBKIT_EDITOR_WEB_EXTENSION_OBJECT_PATH
,
920 E_WEBKIT_EDITOR_WEB_EXTENSION_INTERFACE
,
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
: ""),
933 g_warning ("%s: Failed to emit signal: %s", G_STRFUNC
, error
->message
);
934 g_error_free (error
);
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
)
949 connection
= e_editor_web_extension_get_connection (editor_page
->priv
->web_extension
);
953 g_dbus_connection_emit_signal (
956 E_WEBKIT_EDITOR_WEB_EXTENSION_OBJECT_PATH
,
957 E_WEBKIT_EDITOR_WEB_EXTENSION_INTERFACE
,
959 g_variant_new ("(t)", e_editor_page_get_page_id (editor_page
)),
963 g_warning ("%s: Failed to emit signal: %s", G_STRFUNC
, error
->message
);
964 g_error_free (error
);
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
)
979 connection
= e_editor_web_extension_get_connection (editor_page
->priv
->web_extension
);
983 g_dbus_connection_emit_signal (
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
)),
996 g_warning ("%s: Failed to emit signal: %s", G_STRFUNC
, error
->message
);
997 g_error_free (error
);
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
)
1013 connection
= e_editor_web_extension_get_connection (editor_page
->priv
->web_extension
);
1017 g_dbus_connection_emit_signal (
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
),
1027 g_warning ("%s: Failed to emit signal: %s", G_STRFUNC
, error
->message
);
1028 g_error_free (error
);