diff options
author | Dan Vrátil <dvratil@redhat.com> | 2012-03-29 00:38:11 +0800 |
---|---|---|
committer | Dan Vrátil <dvratil@redhat.com> | 2012-03-29 00:38:25 +0800 |
commit | 6d2c382788a4042d53f49a080acd11b499aa52f6 (patch) | |
tree | 3834f0836340918ba17594a603ba61c13b9929a0 /mail/e-mail-reader.c | |
parent | 6bd1c6833a2c51898ac45865767dd01ba66a95c5 (diff) | |
download | gsoc2013-evolution-6d2c382788a4042d53f49a080acd11b499aa52f6.tar.gz gsoc2013-evolution-6d2c382788a4042d53f49a080acd11b499aa52f6.tar.zst gsoc2013-evolution-6d2c382788a4042d53f49a080acd11b499aa52f6.zip |
WebKit port - port formatter and mail module
Diffstat (limited to 'mail/e-mail-reader.c')
-rw-r--r-- | mail/e-mail-reader.c | 445 |
1 files changed, 325 insertions, 120 deletions
diff --git a/mail/e-mail-reader.c b/mail/e-mail-reader.c index 53d4c31b84..0106b6ed53 100644 --- a/mail/e-mail-reader.c +++ b/mail/e-mail-reader.c @@ -48,13 +48,13 @@ #include "mail/e-mail-backend.h" #include "mail/e-mail-browser.h" -#include "mail/e-mail-display.h" #include "mail/e-mail-reader-utils.h" #include "mail/e-mail-view.h" #include "mail/em-composer-utils.h" #include "mail/em-event.h" #include "mail/em-folder-selector.h" #include "mail/em-folder-tree.h" +#include "mail/em-format-html-display.h" #include "mail/em-utils.h" #include "mail/mail-autofilter.h" #include "mail/mail-vfolder-ui.h" @@ -70,6 +70,8 @@ ((EMailReaderPrivate *) g_object_get_qdata \ (G_OBJECT (obj), quark_private)) +#define d(x) + typedef struct _EMailReaderClosure EMailReaderClosure; typedef struct _EMailReaderPrivate EMailReaderPrivate; @@ -125,6 +127,13 @@ static guint signals[LAST_SIGNAL]; G_DEFINE_INTERFACE (EMailReader, e_mail_reader, G_TYPE_INITIALLY_UNOWNED) static void +mail_reader_set_display_formatter_for_message (EMailReader *reader, + EMailDisplay *display, + const gchar *message_uid, + CamelMimeMessage *message, + CamelFolder *folder); + +static void mail_reader_closure_free (EMailReaderClosure *closure) { if (closure->reader != NULL) @@ -201,7 +210,6 @@ action_add_to_address_book_cb (GtkAction *action, EShell *shell; EMailBackend *backend; EShellBackend *shell_backend; - EMFormatHTML *formatter; CamelInternetAddress *cia; EWebView *web_view; CamelURL *curl; @@ -211,9 +219,10 @@ action_add_to_address_book_cb (GtkAction *action, /* This action is defined in EMailDisplay. */ backend = e_mail_reader_get_backend (reader); - formatter = e_mail_reader_get_formatter (reader); - web_view = em_format_html_get_web_view (formatter); + web_view = E_WEB_VIEW (e_mail_reader_get_mail_display (reader)); + if (!web_view) + return; uri = e_web_view_get_selected_uri (web_view); g_return_if_fail (uri != NULL); @@ -247,21 +256,136 @@ exit: } static void +attachment_load_finish (EAttachment *attachment, + GAsyncResult *result, + GFile *file) +{ + EShell *shell; + GtkWindow *parent; + + e_attachment_load_finish (attachment, result, NULL); + + shell = e_shell_get_default (); + parent = e_shell_get_active_window (shell); + + e_attachment_save_async ( + attachment, file, (GAsyncReadyCallback) + e_attachment_save_handle_error, parent); + + g_object_unref (file); +} + +static void +action_mail_image_save_cb (GtkAction *action, + EMailReader *reader) +{ + EMailDisplay *display; + EWebView *web_view; + EMFormat *emf; + const gchar *image_src; + CamelMimePart *part; + EAttachment *attachment; + GFile *file; + + display = e_mail_reader_get_mail_display (reader); + web_view = E_WEB_VIEW (display); + + if (!E_IS_WEB_VIEW (web_view)) + return; + + image_src = e_web_view_get_cursor_image_src (web_view); + if (!image_src) + return; + + emf = EM_FORMAT (e_mail_display_get_formatter (display)); + g_return_if_fail (emf != NULL); + g_return_if_fail (emf->message != NULL); + + if (g_str_has_prefix (image_src, "cid:")) { + part = camel_mime_message_get_part_by_content_id ( + emf->message, image_src + 4); + g_return_if_fail (part != NULL); + + g_object_ref (part); + } else { + CamelStream *image_stream; + CamelDataWrapper *dw; + CamelDataCache *cache; + const gchar *filename; + const gchar *user_cache_dir; + + /* Open cache and find the file there */ + user_cache_dir = e_get_user_cache_dir (); + cache = camel_data_cache_new (user_cache_dir, NULL); + image_stream = camel_data_cache_get (cache, "http", image_src, NULL); + if (!image_stream) { + g_object_unref (cache); + return; + } + + filename = strrchr (image_src, '/'); + if (filename && strchr (filename, '?')) + filename = NULL; + else if (filename) + filename = filename + 1; + + part = camel_mime_part_new (); + if (filename) + camel_mime_part_set_filename (part, filename); + + dw = camel_data_wrapper_new (); + camel_data_wrapper_set_mime_type ( + dw, "application/octet-stream"); + camel_data_wrapper_construct_from_stream_sync ( + dw, image_stream, NULL, NULL); + camel_medium_set_content (CAMEL_MEDIUM (part), dw); + g_object_unref (dw); + + camel_mime_part_set_encoding ( + part, CAMEL_TRANSFER_ENCODING_BASE64); + + g_object_unref (image_stream); + g_object_unref (cache); + } + + file = e_shell_run_save_dialog ( + e_shell_get_default (), + _("Save Image"), camel_mime_part_get_filename (part), + NULL, NULL, NULL); + if (file == NULL) { + g_object_unref (part); + return; + } + + attachment = e_attachment_new (); + e_attachment_set_mime_part (attachment, part); + + e_attachment_load_async ( + attachment, (GAsyncReadyCallback) + attachment_load_finish, file); + + g_object_unref (part); +} + +static void action_mail_charset_cb (GtkRadioAction *action, GtkRadioAction *current, EMailReader *reader) { + EMailDisplay *display; EMFormatHTML *formatter; const gchar *charset; if (action != current) return; - formatter = e_mail_reader_get_formatter (reader); + display = e_mail_reader_get_mail_display (reader); + formatter = e_mail_display_get_formatter (display); charset = g_object_get_data (G_OBJECT (action), "charset"); /* Charset for "Default" action will be NULL. */ - em_format_set_charset (EM_FORMAT (formatter), charset); + if (formatter) + em_format_set_charset (EM_FORMAT (formatter), charset); } static void @@ -438,38 +562,38 @@ static void action_mail_flag_clear_cb (GtkAction *action, EMailReader *reader) { - EMFormatHTML *formatter; + EMailDisplay *display; CamelFolder *folder; GtkWindow *window; GPtrArray *uids; folder = e_mail_reader_get_folder (reader); - formatter = e_mail_reader_get_formatter (reader); + display = e_mail_reader_get_mail_display (reader); uids = e_mail_reader_get_selected_uids (reader); window = e_mail_reader_get_window (reader); em_utils_flag_for_followup_clear (window, folder, uids); - em_format_queue_redraw (EM_FORMAT (formatter)); + e_mail_display_reload (display); } static void action_mail_flag_completed_cb (GtkAction *action, EMailReader *reader) { - EMFormatHTML *formatter; + EMailDisplay *display; CamelFolder *folder; GtkWindow *window; GPtrArray *uids; folder = e_mail_reader_get_folder (reader); - formatter = e_mail_reader_get_formatter (reader); + display = e_mail_reader_get_mail_display (reader); uids = e_mail_reader_get_selected_uids (reader); window = e_mail_reader_get_window (reader); em_utils_flag_for_followup_completed (window, folder, uids); - em_format_queue_redraw (EM_FORMAT (formatter)); + e_mail_display_reload (display); } static void @@ -663,11 +787,11 @@ static void action_mail_load_images_cb (GtkAction *action, EMailReader *reader) { - EMFormatHTML *formatter; + EMailDisplay *display; - formatter = e_mail_reader_get_formatter (reader); + display = e_mail_reader_get_mail_display (reader); - em_format_html_load_images (formatter); + e_mail_display_load_images (display); } static void @@ -1576,20 +1700,14 @@ static void action_mail_show_all_headers_cb (GtkToggleAction *action, EMailReader *reader) { - EMFormatHTML *formatter; - EMFormatMode mode; + EMailDisplay *display; - formatter = e_mail_reader_get_formatter (reader); - - if (!formatter) - return; + display = e_mail_reader_get_mail_display (reader); if (gtk_toggle_action_get_active (action)) - mode = EM_FORMAT_MODE_ALLHEADERS; + e_mail_display_set_mode (display, EM_FORMAT_WRITE_MODE_ALL_HEADERS); else - mode = EM_FORMAT_MODE_NORMAL; - - em_format_set_mode (EM_FORMAT (formatter), mode); + e_mail_display_set_mode (display, EM_FORMAT_WRITE_MODE_NORMAL); } static void @@ -1597,8 +1715,9 @@ action_mail_show_source_cb (GtkAction *action, EMailReader *reader) { EMailBackend *backend; - EMFormatHTML *formatter; + EMailDisplay *display; CamelFolder *folder; + CamelMimeMessage *message; GtkWidget *browser; GPtrArray *uids; const gchar *message_uid; @@ -1610,16 +1729,16 @@ action_mail_show_source_cb (GtkAction *action, g_return_if_fail (uids != NULL && uids->len == 1); message_uid = g_ptr_array_index (uids, 0); - browser = e_mail_browser_new (backend); - reader = E_MAIL_READER (browser); - formatter = e_mail_reader_get_formatter (reader); + message = camel_folder_get_message_sync (folder, message_uid, NULL, NULL); - if (formatter != NULL) - em_format_set_mode ( - EM_FORMAT (formatter), EM_FORMAT_MODE_SOURCE); + browser = e_mail_browser_new (backend, NULL, NULL, EM_FORMAT_WRITE_MODE_SOURCE); + e_mail_reader_set_folder (E_MAIL_READER (browser), folder); + e_mail_reader_set_message (E_MAIL_READER (browser), message_uid); + + display = e_mail_reader_get_mail_display (E_MAIL_READER (browser)); + mail_reader_set_display_formatter_for_message ( + E_MAIL_READER (browser), display, message_uid, message, folder); - e_mail_reader_set_folder (reader, folder); - e_mail_reader_set_message (reader, message_uid); gtk_widget_show (browser); em_utils_uids_free (uids); @@ -1671,39 +1790,33 @@ static void action_mail_zoom_100_cb (GtkAction *action, EMailReader *reader) { - EMFormatHTML *formatter; - EWebView *web_view; + EMailDisplay *display; - formatter = e_mail_reader_get_formatter (reader); - web_view = em_format_html_get_web_view (formatter); + display = e_mail_reader_get_mail_display (reader); - e_web_view_zoom_100 (web_view); + webkit_web_view_set_zoom_level (WEBKIT_WEB_VIEW (display), 1.0); } static void action_mail_zoom_in_cb (GtkAction *action, EMailReader *reader) { - EMFormatHTML *formatter; - EWebView *web_view; + EMailDisplay *display; - formatter = e_mail_reader_get_formatter (reader); - web_view = em_format_html_get_web_view (formatter); + display = e_mail_reader_get_mail_display (reader); - e_web_view_zoom_in (web_view); + webkit_web_view_zoom_in (WEBKIT_WEB_VIEW (display)); } static void action_mail_zoom_out_cb (GtkAction *action, EMailReader *reader) { - EMFormatHTML *formatter; - EWebView *web_view; + EMailDisplay *display; - formatter = e_mail_reader_get_formatter (reader); - web_view = em_format_html_get_web_view (formatter); + display = e_mail_reader_get_mail_display (reader); - e_web_view_zoom_out (web_view); + webkit_web_view_zoom_out (WEBKIT_WEB_VIEW (display)); } static void @@ -1712,7 +1825,6 @@ action_search_folder_recipient_cb (GtkAction *action, { EMailBackend *backend; EMailSession *session; - EMFormatHTML *formatter; EWebView *web_view; CamelFolder *folder; CamelURL *curl; @@ -1721,9 +1833,7 @@ action_search_folder_recipient_cb (GtkAction *action, /* This action is defined in EMailDisplay. */ folder = e_mail_reader_get_folder (reader); - formatter = e_mail_reader_get_formatter (reader); - - web_view = em_format_html_get_web_view (formatter); + web_view = E_WEB_VIEW (e_mail_reader_get_mail_display (reader)); uri = e_web_view_get_selected_uri (web_view); g_return_if_fail (uri != NULL); @@ -1753,7 +1863,6 @@ action_search_folder_sender_cb (GtkAction *action, { EMailBackend *backend; EMailSession *session; - EMFormatHTML *formatter; EWebView *web_view; CamelFolder *folder; CamelURL *curl; @@ -1762,9 +1871,7 @@ action_search_folder_sender_cb (GtkAction *action, /* This action is defined in EMailDisplay. */ folder = e_mail_reader_get_folder (reader); - formatter = e_mail_reader_get_formatter (reader); - - web_view = em_format_html_get_web_view (formatter); + web_view = E_WEB_VIEW (e_mail_reader_get_mail_display (reader)); uri = e_web_view_get_selected_uri (web_view); g_return_if_fail (uri != NULL); @@ -2494,6 +2601,7 @@ mail_reader_message_seen_cb (EMailReaderClosure *closure) EMailReader *reader; GtkWidget *message_list; EMFormatHTML *formatter; + EMailDisplay *display; CamelMimeMessage *message; const gchar *current_uid; const gchar *message_uid; @@ -2502,19 +2610,20 @@ mail_reader_message_seen_cb (EMailReaderClosure *closure) reader = closure->reader; message_uid = closure->message_uid; - formatter = e_mail_reader_get_formatter (reader); + display = e_mail_reader_get_mail_display (reader); + formatter = e_mail_display_get_formatter (display); message_list = e_mail_reader_get_message_list (reader); if (e_tree_is_dragging (E_TREE (message_list))) return FALSE; - current_uid = EM_FORMAT (formatter)->uid; - uid_is_current &= (g_strcmp0 (current_uid, message_uid) == 0); - current_uid = MESSAGE_LIST (message_list)->cursor_uid; uid_is_current &= (g_strcmp0 (current_uid, message_uid) == 0); - message = EM_FORMAT (formatter)->message; + if (formatter) + message = EM_FORMAT (formatter)->message; + else + message = NULL; if (uid_is_current && message != NULL) g_signal_emit ( @@ -2535,7 +2644,6 @@ schedule_timeout_mark_seen (EMailReader *reader) gboolean schedule_timeout; gint timeout_interval; const gchar *message_uid; - backend = e_mail_reader_get_backend (reader); message_list = MESSAGE_LIST (e_mail_reader_get_message_list (reader)); shell_backend = E_SHELL_BACKEND (backend); @@ -2669,56 +2777,47 @@ static gboolean mail_reader_message_selected_timeout_cb (EMailReader *reader) { EMailReaderPrivate *priv; - EMFormatHTML *formatter; + EMailDisplay *display; GtkWidget *message_list; - EPreviewPane *preview_pane; CamelFolder *folder; const gchar *cursor_uid; const gchar *format_uid; + EMFormat *formatter; priv = E_MAIL_READER_GET_PRIVATE (reader); folder = e_mail_reader_get_folder (reader); - formatter = e_mail_reader_get_formatter (reader); message_list = e_mail_reader_get_message_list (reader); - preview_pane = e_mail_reader_get_preview_pane (reader); + display = e_mail_reader_get_mail_display (reader); + formatter = EM_FORMAT (e_mail_display_get_formatter (display)); cursor_uid = MESSAGE_LIST (message_list)->cursor_uid; - format_uid = EM_FORMAT (formatter)->uid; - - e_preview_pane_clear_alerts (preview_pane); + format_uid = formatter ? formatter->message_uid : NULL; if (MESSAGE_LIST (message_list)->last_sel_single) { - gboolean preview_visible; + GtkWidget *widget; + gboolean display_visible; gboolean selected_uid_changed; /* Decide whether to download the full message now. */ + widget = GTK_WIDGET (display); + display_visible = gtk_widget_get_mapped (widget); - preview_visible = - gtk_widget_get_mapped (GTK_WIDGET (preview_pane)); - selected_uid_changed = g_strcmp0 (cursor_uid, format_uid); + selected_uid_changed = (g_strcmp0 (cursor_uid, format_uid) != 0); - if (preview_visible && selected_uid_changed) { + if (display_visible && selected_uid_changed) { EMailReaderClosure *closure; GCancellable *cancellable; EActivity *activity; - EWebView *web_view; gchar *string; - web_view = e_preview_pane_get_web_view (preview_pane); - - string = g_strdup_printf ( - _("Retrieving message '%s'"), cursor_uid); -#if HAVE_CLUTTER - if (!e_shell_get_express_mode (e_shell_get_default ())) - e_web_view_load_string (web_view, string); -#else - e_web_view_load_string (web_view, string); -#endif + string = g_strdup_printf (_("Retrieving message '%s'"), cursor_uid); + e_mail_display_set_status (display, string); g_free (string); activity = e_mail_reader_new_activity (reader); + e_activity_set_text (activity, _("Retrieving message")); cancellable = e_activity_get_cancellable (activity); closure = g_slice_new0 (EMailReaderClosure); @@ -2736,9 +2835,6 @@ mail_reader_message_selected_timeout_cb (EMailReader *reader) priv->retrieving_message = g_object_ref (cancellable); } } else { - /* FIXME Need to pass a GCancellable. */ - em_format_format ( - EM_FORMAT (formatter), NULL, NULL, NULL, NULL); priv->restoring_message_selection = FALSE; } @@ -2869,7 +2965,7 @@ mail_reader_set_folder (EMailReader *reader, CamelFolder *folder) { EMailReaderPrivate *priv; - EMFormatHTML *formatter; + EMailDisplay *display; CamelFolder *previous_folder; GtkWidget *message_list; EMailBackend *backend; @@ -2879,7 +2975,7 @@ mail_reader_set_folder (EMailReader *reader, priv = E_MAIL_READER_GET_PRIVATE (reader); backend = e_mail_reader_get_backend (reader); - formatter = e_mail_reader_get_formatter (reader); + display = e_mail_reader_get_mail_display (reader); message_list = e_mail_reader_get_message_list (reader); previous_folder = e_mail_reader_get_folder (reader); @@ -2899,8 +2995,7 @@ mail_reader_set_folder (EMailReader *reader, em_utils_folder_is_outbox (folder) || em_utils_folder_is_sent (folder)); - /* FIXME Need to pass a GCancellable. */ - em_format_format (EM_FORMAT (formatter), NULL, NULL, NULL, NULL); + e_web_view_clear (E_WEB_VIEW (display)); priv->folder_was_just_selected = (folder != NULL); @@ -2931,18 +3026,128 @@ mail_reader_folder_loaded (EMailReader *reader) e_mail_reader_update_actions (reader, state); } +struct _formatter_weak_ref_closure { + GHashTable *formatters; + gchar *mail_uri; +}; + +static void +formatter_weak_ref_cb (struct _formatter_weak_ref_closure *data, + EMFormat *formatter) +{ + /* When this callback is called, the formatter is being finalized + * so we only remove it from the formatters table. */ + g_hash_table_remove (data->formatters, + data->mail_uri); + + d(printf("Destroying formatter %p (%s)\n", formatter, data->mail_uri)); + + /* Destroying the formatter will prevent this callback + * being called, so we can remove the closure data as well */ + g_hash_table_unref (data->formatters); + g_free (data->mail_uri); + g_free (data); +} + +struct format_parser_async_closure_ { + EMailDisplay *display; + EActivity *activity; +}; + +static void +format_parser_async_done_cb (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + EMFormat *emf = EM_FORMAT (source); + struct format_parser_async_closure_ *closure = user_data; + + e_mail_display_set_formatter (closure->display, EM_FORMAT_HTML (emf)); + e_mail_display_load (closure->display, emf->uri_base); + + g_object_unref (closure->activity); + g_object_unref (closure->display); + g_free (closure); + + g_object_unref (result); + + /* Remove the reference added when formatter was created, + * so that only owners are EMailDisplays */ + g_object_unref (emf); +} + +static void +mail_reader_set_display_formatter_for_message (EMailReader *reader, + EMailDisplay *display, + const gchar *message_uid, + CamelMimeMessage *message, + CamelFolder *folder) +{ + SoupSession *session; + GHashTable *formatters; + EMFormat *formatter; + gchar *mail_uri; + + mail_uri = em_format_build_mail_uri (folder, message_uid, NULL, NULL); + + session = webkit_get_default_session (); + formatters = g_object_get_data (G_OBJECT (session), "formatters"); + if (!formatters) { + formatters = g_hash_table_new_full (g_str_hash, g_str_equal, + (GDestroyNotify) g_free, NULL); + g_object_set_data (G_OBJECT (session), "formatters", formatters); + } + + if ((formatter = g_hash_table_lookup (formatters, mail_uri)) == NULL) { + struct _formatter_weak_ref_closure *formatter_data = + g_new0 (struct _formatter_weak_ref_closure, 1); + + struct format_parser_async_closure_ *closure; + + formatter_data->formatters = g_hash_table_ref (formatters); + formatter_data->mail_uri = g_strdup (mail_uri); + + formatter = EM_FORMAT (em_format_html_display_new ()); + + /* When no EMailDisplay holds reference to the formatter, then + * the formatter can be destroyed. */ + g_object_weak_ref (G_OBJECT (formatter), + (GWeakNotify) formatter_weak_ref_cb, formatter_data); + + formatter->message_uid = g_strdup (message_uid); + formatter->uri_base = g_strdup (mail_uri); + + e_mail_reader_connect_headers (reader, formatter); + + closure = g_new0 (struct format_parser_async_closure_, 1); + closure->activity = e_mail_reader_new_activity (reader); + e_activity_set_text (closure->activity, _("Parsing message")); + closure->display = g_object_ref (display); + + em_format_parse_async (formatter, message, folder, + e_activity_get_cancellable (closure->activity), + format_parser_async_done_cb, closure); + + /* Don't free the mail_uri!! */ + g_hash_table_insert (formatters, mail_uri, formatter); + } else { + e_mail_display_set_formatter (display, EM_FORMAT_HTML (formatter)); + e_mail_display_load (display, formatter->uri_base); + + g_free (mail_uri); + } +} + static void mail_reader_message_loaded (EMailReader *reader, const gchar *message_uid, CamelMimeMessage *message) { EMailReaderPrivate *priv; - EMFormatHTML *formatter; GtkWidget *message_list; EMailBackend *backend; CamelFolder *folder; - EWebView *web_view; - EPreviewPane *preview_pane; + EMailDisplay *display; EShellBackend *shell_backend; EShell *shell; EMEvent *event; @@ -2953,15 +3158,12 @@ mail_reader_message_loaded (EMailReader *reader, folder = e_mail_reader_get_folder (reader); backend = e_mail_reader_get_backend (reader); - formatter = e_mail_reader_get_formatter (reader); + display = e_mail_reader_get_mail_display (reader); message_list = e_mail_reader_get_message_list (reader); - preview_pane = e_mail_reader_get_preview_pane (reader); shell_backend = E_SHELL_BACKEND (backend); shell = e_shell_backend_get_shell (shell_backend); - web_view = e_preview_pane_get_web_view (preview_pane); - /** @Event: message.reading * @Title: Viewing a message * @Target: EMEventTargetMessage @@ -2975,10 +3177,8 @@ mail_reader_message_loaded (EMailReader *reader, (EEvent *) event, "message.reading", (EEventTarget *) target); - /* FIXME Need to pass a GCancellable. */ - em_format_format ( - EM_FORMAT (formatter), folder, - message_uid, message, NULL); + mail_reader_set_display_formatter_for_message ( + reader, display, message_uid, message, folder); /* Reset the shell view icon. */ e_shell_event (shell, "mail-icon", (gpointer) "evolution-mail"); @@ -2996,7 +3196,7 @@ mail_reader_message_loaded (EMailReader *reader, g_clear_error (&error); } else if (error != NULL) { e_alert_submit ( - E_ALERT_SINK (web_view), + E_ALERT_SINK (display), "mail:no-retrieve-message", error->message, NULL); g_error_free (error); @@ -3597,14 +3797,13 @@ e_mail_reader_init (EMailReader *reader, gboolean init_actions, gboolean connect_signals) { - EMFormatHTML *formatter; EMenuToolAction *menu_tool_action; - EWebView *web_view; GtkActionGroup *action_group; GtkWidget *message_list; GtkAction *action; gboolean sensitive; const gchar *action_name; + EMailDisplay *display; #ifndef G_OS_WIN32 GSettings *settings; @@ -3612,10 +3811,8 @@ e_mail_reader_init (EMailReader *reader, g_return_if_fail (E_IS_MAIL_READER (reader)); - formatter = e_mail_reader_get_formatter (reader); message_list = e_mail_reader_get_message_list (reader); - - web_view = em_format_html_get_web_view (formatter); + display = e_mail_reader_get_mail_display (reader); if (!init_actions) goto connect_signals; @@ -3755,30 +3952,38 @@ e_mail_reader_init (EMailReader *reader, gtk_action_set_is_important (action, TRUE); gtk_action_set_short_label (action, _("Reply")); + display = e_mail_reader_get_mail_display (reader); + action_name = "add-to-address-book"; - action = e_web_view_get_action (web_view, action_name); + action = e_mail_display_get_action (display, action_name); g_signal_connect ( action, "activate", G_CALLBACK (action_add_to_address_book_cb), reader); action_name = "send-reply"; - action = e_web_view_get_action (web_view, action_name); + action = e_mail_display_get_action (display, action_name); g_signal_connect ( action, "activate", G_CALLBACK (action_mail_reply_recipient_cb), reader); action_name = "search-folder-recipient"; - action = e_web_view_get_action (web_view, action_name); + action = e_mail_display_get_action (display, action_name); g_signal_connect ( action, "activate", G_CALLBACK (action_search_folder_recipient_cb), reader); action_name = "search-folder-sender"; - action = e_web_view_get_action (web_view, action_name); + action = e_mail_display_get_action (display, action_name); g_signal_connect ( action, "activate", G_CALLBACK (action_search_folder_sender_cb), reader); + action_name = "image-save"; + action = e_mail_display_get_action (display, action_name); + g_signal_connect ( + action, "activate", + G_CALLBACK (action_mail_image_save_cb), reader); + #ifndef G_OS_WIN32 /* Lockdown integration. */ @@ -3821,7 +4026,7 @@ e_mail_reader_init (EMailReader *reader, g_object_bind_property ( action, "active", - web_view, "caret-mode", + display, "caret-mode", G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); @@ -3832,7 +4037,7 @@ connect_signals: /* Connect signals. */ g_signal_connect_swapped ( - web_view, "key-press-event", + display, "key-press-event", G_CALLBACK (mail_reader_key_press_event_cb), reader); g_signal_connect_swapped ( @@ -4157,17 +4362,17 @@ e_mail_reader_get_backend (EMailReader *reader) return interface->get_backend (reader); } -EMFormatHTML * -e_mail_reader_get_formatter (EMailReader *reader) +EMailDisplay * +e_mail_reader_get_mail_display (EMailReader *reader) { EMailReaderInterface *interface; g_return_val_if_fail (E_IS_MAIL_READER (reader), NULL); interface = E_MAIL_READER_GET_INTERFACE (reader); - g_return_val_if_fail (interface->get_formatter != NULL, NULL); + g_return_val_if_fail (interface->get_mail_display != NULL, NULL); - return interface->get_formatter (reader); + return interface->get_mail_display (reader); } gboolean |