On pressing other bodies in attachment view, open them in msg view window
[modest] / src / hildon2 / modest-msg-view-window.c
index a8fa99e..110f09e 100644 (file)
@@ -117,6 +117,7 @@ struct _ModestMsgViewWindowPrivate {
        GtkWidget *remove_attachment_banner;
 
        gchar *msg_uid;
+       gboolean is_other_body;
 
        GSList *sighandlers;
 };
@@ -448,6 +449,7 @@ modest_msg_view_window_init (ModestMsgViewWindow *obj)
        priv->purge_timeout = 0;
        priv->remove_attachment_banner = NULL;
        priv->msg_uid = NULL;
+       priv->is_other_body = FALSE;
        
        priv->sighandlers = NULL;
        
@@ -993,6 +995,7 @@ modest_msg_view_window_new_from_header_view (ModestHeaderView *header_view,
                                    TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
                                    &header, -1);
                message_reader (window, priv, header, row_reference);
+               g_object_unref (header);
        }
        gtk_tree_path_free (path);
 
@@ -1040,10 +1043,11 @@ modest_msg_view_window_new_for_search_result (TnyMsg *msg,
 }
 
 ModestWindow *
-modest_msg_view_window_new_for_attachment (TnyMsg *msg, 
-                                          const gchar *modest_account_name,
-                                          const gchar *mailbox,
-                                          const gchar *msg_uid)
+modest_msg_view_window_new_with_other_body (TnyMsg *msg, 
+                                           TnyMimePart *other_body,
+                                           const gchar *modest_account_name,
+                                           const gchar *mailbox,
+                                           const gchar *msg_uid)
 {
        GObject *obj = NULL;
        ModestMsgViewWindowPrivate *priv;       
@@ -1056,7 +1060,12 @@ modest_msg_view_window_new_for_attachment (TnyMsg *msg,
        modest_msg_view_window_construct (MODEST_MSG_VIEW_WINDOW (obj), 
                                          modest_account_name, mailbox, msg_uid);
 
-       tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), msg);
+       if (other_body) {
+               priv->is_other_body = TRUE;
+               modest_msg_view_set_msg_with_other_body (MODEST_MSG_VIEW (priv->msg_view), msg, other_body);
+       } else {
+               tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), msg);
+       }
        update_window_title (MODEST_MSG_VIEW_WINDOW (obj));
 
        /* gtk_widget_show_all (GTK_WIDGET (obj)); */
@@ -1069,6 +1078,15 @@ modest_msg_view_window_new_for_attachment (TnyMsg *msg,
        return MODEST_WINDOW(obj);
 }
 
+ModestWindow *
+modest_msg_view_window_new_for_attachment (TnyMsg *msg, 
+                                          const gchar *modest_account_name,
+                                          const gchar *mailbox,
+                                          const gchar *msg_uid)
+{
+       return modest_msg_view_window_new_with_other_body (msg, NULL, modest_account_name, mailbox, msg_uid);
+}
+
 static void
 modest_msg_view_window_on_row_changed (GtkTreeModel *header_model,
                                       GtkTreePath *arg1,
@@ -1331,6 +1349,9 @@ modest_msg_view_window_get_header (ModestMsgViewWindow *self)
        g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (self), NULL);
        priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self);
 
+       if (priv->is_other_body)
+               return NULL;
+
        /* If the message was not obtained from a treemodel,
         * for instance if it was opened directly by the search UI:
         */
@@ -1842,14 +1863,14 @@ message_reader (ModestMsgViewWindow *window,
 
        g_return_val_if_fail (row_reference != NULL, FALSE);
 
+       /* We set the header from model while we're loading */
+       tny_header_view_set_header (TNY_HEADER_VIEW (priv->msg_view), header);
+       gtk_window_set_title (GTK_WINDOW (window), _CS("ckdg_pb_updating"));
+
        mgr = modest_runtime_get_window_mgr ();
        /* Msg download completed */
        if (!(tny_header_get_flags (header) & TNY_HEADER_FLAG_CACHED)) {
 
-               /* We set the header from model while we're loading */
-               tny_header_view_set_header (TNY_HEADER_VIEW (priv->msg_view), header);
-               gtk_window_set_title (GTK_WINDOW (window), _CS("ckdg_pb_updating"));
-
                /* Ask the user if he wants to download the message if
                   we're not online */
                if (!tny_device_is_online (modest_runtime_get_device())) {
@@ -1877,13 +1898,13 @@ message_reader (ModestMsgViewWindow *window,
                        return TRUE;
                }
        }
-       
+
        folder = tny_header_get_folder (header);
        account = tny_folder_get_account (folder);
        info = g_slice_new (MsgReaderInfo);
        info->header = g_object_ref (header);
        info->row_reference = gtk_tree_row_reference_copy (row_reference);
-       
+
        message_reader_performer (FALSE, NULL, (GtkWindow *) window, account, info);
        g_object_unref (account);
        g_object_unref (folder);
@@ -2495,7 +2516,7 @@ modest_msg_view_window_view_attachment (ModestMsgViewWindow *window,
        if (tny_mime_part_is_purged (mime_part))
                goto frees;
 
-       if (!modest_tny_mime_part_is_msg (mime_part)) {
+       if (!modest_tny_mime_part_is_msg (mime_part) && tny_mime_part_get_filename (mime_part)) {
                gchar *filepath = NULL;
                const gchar *att_filename = tny_mime_part_get_filename (mime_part);
                gboolean show_error_banner = FALSE;
@@ -2536,6 +2557,29 @@ modest_msg_view_window_view_attachment (ModestMsgViewWindow *window,
                        g_free (filepath);
                if (show_error_banner)
                        modest_platform_information_banner (NULL, NULL, _("mail_ib_file_operation_failed"));
+       } else if (!modest_tny_mime_part_is_msg (mime_part)) {
+               ModestWindowMgr *mgr;
+               mgr = modest_runtime_get_window_mgr ();
+               ModestWindow *msg_win = NULL;
+               TnyMsg *current_msg;
+
+               gchar *account = g_strdup (modest_window_get_active_account (MODEST_WINDOW (window)));
+               const gchar *mailbox = modest_window_get_active_mailbox (MODEST_WINDOW (window));
+               if (!account)
+                       account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr ());
+
+               current_msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (window));
+               msg_win = modest_msg_view_window_new_with_other_body (TNY_MSG (current_msg), TNY_MIME_PART (mime_part),
+                                                                     account, mailbox, attachment_uid);
+               g_object_unref (current_msg);
+
+               modest_window_set_zoom (MODEST_WINDOW (msg_win),
+                                       modest_window_get_zoom (MODEST_WINDOW (window)));
+               if (modest_window_mgr_register_window (mgr, msg_win, MODEST_WINDOW (window)))
+                       gtk_widget_show_all (GTK_WIDGET (msg_win));
+               else
+                       gtk_widget_destroy (GTK_WIDGET (msg_win));
+               
        } else {
                /* message attachment */
                TnyHeader *header = NULL;
@@ -2691,10 +2735,11 @@ save_mime_parts_to_file_with_checks (SaveMimePartInfo *info)
 
                if (replaced_files == 1) {
                        SaveMimePartPair *pair = files->data;
-                       const gchar *filename = tny_mime_part_get_filename (pair->part);
+                       const gchar *basename = strrchr (pair->filename, G_DIR_SEPARATOR) + 1;
+
                        gchar *message = g_strdup_printf ("%s\n%s",
                                                          _FM("docm_nc_replace_file"),
-                                                         (filename) ? filename : "");
+                                                         (basename) ? basename : "");
                        confirm_overwrite_dialog = hildon_note_new_confirmation (NULL, message);
                        g_free (message);
                } else {