X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-ui-actions.c;h=de64ab19614a4b12368253cbff6b69a7db97bf43;hp=58b285967911747b89d488df2ada81e0c4c0e4ce;hb=12a672c559d983c4e49a7e4054ee14c0177ecb1c;hpb=596a74d8798410d738adef0ad9357aa6c6ade185 diff --git a/src/modest-ui-actions.c b/src/modest-ui-actions.c index 58b2859..de64ab1 100644 --- a/src/modest-ui-actions.c +++ b/src/modest-ui-actions.c @@ -66,8 +66,8 @@ #include "maemo/modest-hildon-includes.h" #include "maemo/modest-connection-specific-smtp-window.h" #endif /* !MODEST_TOOLKIT_GTK */ -#include +#include #include "widgets/modest-ui-constants.h" #include #include @@ -85,7 +85,10 @@ #include #include #include +#include +#include +#include #include #define MODEST_MOVE_TO_DIALOG_FOLDER_VIEW "move-to-dialog-folder-view" @@ -112,6 +115,7 @@ typedef struct _ReplyForwardHelper { gchar *mailbox; GtkWidget *parent_window; TnyHeader *header; + TnyList *parts; } ReplyForwardHelper; typedef struct _MoveToHelper { @@ -639,7 +643,7 @@ modest_ui_actions_on_quit (GtkAction *action, ModestWindow *win) ModestWindowMgr *mgr = NULL; #ifdef MODEST_PLATFORM_MAEMO - modest_osso_save_state(); + modest_window_mgr_save_state_for_all_windows (modest_runtime_get_window_mgr ()); #endif /* MODEST_PLATFORM_MAEMO */ g_debug ("closing down, clearing %d item(s) from operation queue", @@ -686,9 +690,10 @@ modest_ui_actions_on_close_window (GtkAction *action, ModestWindow *win) void modest_ui_actions_add_to_contacts (GtkAction *action, ModestWindow *win) { - g_return_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win)); - - modest_msg_view_window_add_to_contacts (MODEST_MSG_VIEW_WINDOW (win)); + if (MODEST_IS_MSG_VIEW_WINDOW (win)) + modest_msg_view_window_add_to_contacts (MODEST_MSG_VIEW_WINDOW (win)); + else if (MODEST_IS_MSG_EDIT_WINDOW (win)) + modest_msg_edit_window_add_to_contacts (MODEST_MSG_EDIT_WINDOW (win)); } void @@ -898,11 +903,29 @@ modest_ui_actions_compose_msg(ModestWindow *win, MODEST_TEXT_UTILS_SIGNATURE_MARKER, "\n", signature, NULL) : g_strdup(body_str); } else { - body = use_signature ? g_strconcat("\n", MODEST_TEXT_UTILS_SIGNATURE_MARKER, - "\n", signature, NULL) : g_strdup(""); + + gchar *gray_color_markup = NULL, *color_begin = NULL, *color_end = NULL; + GdkColor color; + + if (win && gtk_style_lookup_color (gtk_widget_get_style ((GtkWidget *) win), + "SecondaryTextColor", &color)) + gray_color_markup = modest_text_utils_get_color_string (&color); + if (!gray_color_markup) + gray_color_markup = g_strdup ("#babababababa"); + + color_begin = g_strdup_printf ("", gray_color_markup); + color_end = ""; + + body = use_signature ? g_strconcat("
\n", color_begin, + MODEST_TEXT_UTILS_SIGNATURE_MARKER, "
\n", + signature, color_end, NULL) : g_strdup(""); + + g_free (gray_color_markup); + g_free (color_begin); } - msg = modest_tny_msg_new (to_str, from_str, cc_str, bcc_str, subject_str, NULL, NULL, body, NULL, NULL, NULL); + msg = modest_tny_msg_new_html_plain (to_str, from_str, cc_str, bcc_str, subject_str, + NULL, NULL, body, NULL, NULL, NULL, NULL, NULL); if (!msg) { g_printerr ("modest: failed to create new msg\n"); goto cleanup; @@ -1003,9 +1026,14 @@ modest_ui_actions_msg_retrieval_check (ModestMailOperation *mail_op, if (protocol) { if (tny_account_get_connection_status (account) == TNY_CONNECTION_STATUS_CONNECTED) { - format = modest_protocol_get_translation (protocol, - MODEST_PROTOCOL_TRANSLATION_MSG_NOT_AVAILABLE, - subject); + if (header) { + format = modest_protocol_get_translation (protocol, + MODEST_PROTOCOL_TRANSLATION_MSG_NOT_AVAILABLE, + subject); + } else { + format = modest_protocol_get_translation (protocol, + MODEST_PROTOCOL_TRANSLATION_MSG_NOT_AVAILABLE_LOST_HEADER); + } } else { format = g_strdup_printf (_("mail_ib_backend_server_invalid"), tny_account_get_hostname (account)); @@ -1014,8 +1042,13 @@ modest_ui_actions_msg_retrieval_check (ModestMailOperation *mail_op, g_object_unref (account); } - if (!format) - format = g_strdup (_("emev_ni_ui_imap_message_not_available_in_server")); + if (!format) { + if (header) { + format = g_strdup (_("emev_ni_ui_imap_message_not_available_in_server")); + } else { + format = g_strdup (_("emev_ni_ui_pop3_msg_recv_error")); + } + } msg = g_strdup_printf (format, subject); modest_platform_run_information_dialog (NULL, msg, FALSE); @@ -1679,7 +1712,8 @@ static ReplyForwardHelper* create_reply_forward_helper (ReplyForwardAction action, ModestWindow *win, guint reply_forward_type, - TnyHeader *header) + TnyHeader *header, + TnyList *parts) { ReplyForwardHelper *rf_helper = NULL; const gchar *active_acc = modest_window_get_active_account (win); @@ -1694,6 +1728,10 @@ create_reply_forward_helper (ReplyForwardAction action, g_strdup (active_acc) : modest_account_mgr_get_default_account (modest_runtime_get_account_mgr()); rf_helper->mailbox = g_strdup (active_mailbox); + if (parts) + rf_helper->parts = g_object_ref (parts); + else + rf_helper->parts = NULL; /* Note that window could be destroyed just AFTER calling register_window so we must ensure that this pointer does @@ -1715,6 +1753,8 @@ free_reply_forward_helper (gpointer data) g_free (helper->mailbox); if (helper->header) g_object_unref (helper->header); + if (helper->parts) + g_object_unref (helper->parts); if (helper->parent_window) g_object_weak_unref (G_OBJECT (helper->parent_window), rf_helper_window_closed, helper); @@ -1913,12 +1953,80 @@ reply_forward_performer (gboolean canceled, modest_ui_actions_disk_operations_error_handler, NULL, NULL); modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op); - modest_mail_operation_get_msg (mail_op, rf_helper->header, TRUE, reply_forward_cb, rf_helper); + modest_mail_operation_get_msg_and_parts (mail_op, rf_helper->header, rf_helper->parts, TRUE, reply_forward_cb, rf_helper); /* Frees */ g_object_unref(mail_op); } +static gboolean +all_parts_retrieved (TnyMimePart *part) +{ + if (!TNY_IS_CAMEL_BS_MIME_PART (part)) { + return TRUE; + } else { + TnyList *pending_parts; + TnyIterator *iterator; + gboolean all_retrieved = TRUE; + + pending_parts = TNY_LIST (tny_simple_list_new ()); + tny_mime_part_get_parts (part, pending_parts); + iterator = tny_list_create_iterator (pending_parts); + while (all_retrieved && !tny_iterator_is_done (iterator)) { + TnyMimePart *child; + + child = TNY_MIME_PART (tny_iterator_get_current (iterator)); + + if (tny_camel_bs_mime_part_is_fetched (TNY_CAMEL_BS_MIME_PART (child))) { + all_retrieved = all_parts_retrieved (TNY_MIME_PART (child)); + } else { + all_retrieved = FALSE; + } + + g_object_unref (child); + tny_iterator_next (iterator); + } + g_object_unref (iterator); + g_object_unref (pending_parts); + return all_retrieved; + } +} + +static void +forward_pending_parts_helper (TnyMimePart *part, TnyList *list) +{ + TnyList *parts; + TnyIterator *iterator; + + if (!tny_camel_bs_mime_part_is_fetched (TNY_CAMEL_BS_MIME_PART (part))) { + tny_list_append (list, G_OBJECT (part)); + } + parts = TNY_LIST (tny_simple_list_new ()); + tny_mime_part_get_parts (part, parts); + for (iterator = tny_list_create_iterator (parts); + !tny_iterator_is_done (iterator); + tny_iterator_next (iterator)) { + TnyMimePart *child; + + child = TNY_MIME_PART (tny_iterator_get_current (iterator)); + forward_pending_parts_helper (child, list); + g_object_unref (child); + } + g_object_unref (iterator); + g_object_unref (parts); +} + +static TnyList * +forward_pending_parts (TnyMsg *msg) +{ + TnyList *result = TNY_LIST (tny_simple_list_new ()); + if (TNY_IS_CAMEL_BS_MIME_PART (msg)) { + forward_pending_parts_helper (TNY_MIME_PART (msg), result); + } + + return result; +} + /* * Common code for the reply and forward actions */ @@ -1957,13 +2065,55 @@ reply_forward (ReplyForwardAction action, ModestWindow *win) msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW(win)); header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win)); - if (msg && header) { + if (msg && header && (action != ACTION_FORWARD || all_parts_retrieved (TNY_MIME_PART (msg)))) { /* Create helper */ rf_helper = create_reply_forward_helper (action, win, - reply_forward_type, header); + reply_forward_type, header, NULL); reply_forward_cb (NULL, header, FALSE, msg, NULL, rf_helper); } else { - g_warning("%s: no message or header found in viewer\n", __FUNCTION__); + gboolean do_download = TRUE; + + if (msg && header && action == ACTION_FORWARD) { + /* Not all parts retrieved. Then we have to retrieve them all before + * creating the forward message */ + if (!tny_device_is_online (modest_runtime_get_device ())) { + gint response; + + /* If ask for user permission to download the messages */ + response = modest_platform_run_confirmation_dialog (GTK_WINDOW (win), + ngettext("mcen_nc_get_msg", + "mcen_nc_get_msgs", + 1)); + + /* End if the user does not want to continue */ + if (response == GTK_RESPONSE_CANCEL) + do_download = FALSE; + } + + if (do_download) { + TnyList *pending_parts; + TnyFolder *folder; + TnyAccount *account; + + /* Create helper */ + pending_parts = forward_pending_parts (msg); + rf_helper = create_reply_forward_helper (action, win, + reply_forward_type, header, pending_parts); + g_object_unref (pending_parts); + + folder = tny_header_get_folder (header); + account = tny_folder_get_account (folder); + modest_platform_connect_and_perform (GTK_WINDOW (win), + TRUE, account, + reply_forward_performer, + rf_helper); + g_object_unref (folder); + g_object_unref (account); + } + + } else { + g_warning("%s: no message or header found in viewer\n", __FUNCTION__); + } } if (msg) @@ -2031,7 +2181,7 @@ reply_forward (ReplyForwardAction action, ModestWindow *win) if (download) { /* Create helper */ rf_helper = create_reply_forward_helper (action, win, - reply_forward_type, header); + reply_forward_type, header, NULL); if (uncached_msgs > 0) { modest_platform_connect_and_perform (GTK_WINDOW (win), TRUE, account, @@ -2188,8 +2338,8 @@ idle_refresh_folder (gpointer source) header_view = modest_header_window_get_header_view ((ModestHeaderWindow *) source); #else if (MODEST_IS_MAIN_WINDOW (source)) - header_view = modest_main_window_get_child_widget ((ModestMainWindow *) source, - MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW); + header_view = MODEST_HEADER_VIEW (modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (source), + MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW)); #endif if (header_view) { TnyFolder *folder = modest_header_view_get_folder (header_view); @@ -3151,7 +3301,7 @@ gboolean modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window) { TnyTransportAccount *transport_account = NULL; - gboolean had_error = FALSE; + gboolean had_error = FALSE, add_to_contacts; MsgData *data; ModestAccountMgr *account_mgr; gchar *account_name; @@ -3160,7 +3310,10 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window) g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window), TRUE); - if (!modest_msg_edit_window_check_names (edit_window, TRUE)) + /* Check whether to automatically add new contacts to addressbook or not */ + add_to_contacts = modest_conf_get_bool (modest_runtime_get_conf (), + MODEST_CONF_AUTO_ADD_TO_CONTACTS, NULL); + if (!modest_msg_edit_window_check_names (edit_window, add_to_contacts)) return TRUE; data = modest_msg_edit_window_get_msg_data (edit_window); @@ -4782,6 +4935,7 @@ headers_action_show_details (TnyHeader *header, if (MODEST_IS_MSG_VIEW_WINDOW (window)) { async_retrieval = TRUE; msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (window)); + async_retrieval = !TNY_IS_CAMEL_BS_MSG (msg); } else { async_retrieval = FALSE; } @@ -6918,6 +7072,9 @@ modest_ui_actions_on_delete_account (GtkWindow *parent_window, removed = modest_account_mgr_remove_account (account_mgr, account_name); if (removed) { +#ifdef MODEST_TOOLKIT_HILDON2 + hildon_gtk_window_take_screenshot (parent_window, FALSE); +#endif /* Close all email notifications, we cannot distinguish if the notification belongs to this account or not, so for safety reasons