This commit implements a new handling of image attachments. We follow
[modest] / src / maemo / modest-msg-view-window.c
index ce7c4c4..ca7be3e 100644 (file)
@@ -1167,6 +1167,8 @@ modest_msg_view_window_get_header (ModestMsgViewWindow *self)
         * instead of sometimes retrieving it from the header view?
         * Then we wouldn't be dependent on the message actually still being selected 
         * in the header view. murrayc. */
+       if (!gtk_tree_row_reference_valid (priv->row_reference))
+               return NULL;
        path = gtk_tree_row_reference_get_path (priv->row_reference);
        g_return_val_if_fail (path != NULL, NULL);
        gtk_tree_model_get_iter (priv->header_model, 
@@ -1278,12 +1280,16 @@ modest_msg_view_window_find_toolbar_search (GtkWidget *widget,
                        hildon_banner_show_information (NULL, NULL, dgettext("hildon-libs", "ckct_ib_find_no_matches"));
                        g_free (priv->last_search);
                        priv->last_search = NULL;
-               } 
+               } else {
+                       modest_msg_view_grab_focus (MODEST_MSG_VIEW (priv->msg_view));
+               }
        } else {
                if (!modest_msg_view_search_next (MODEST_MSG_VIEW (priv->msg_view))) {
                        hildon_banner_show_information (NULL, NULL, dgettext("hildon-libs", "ckct_ib_find_search_complete"));
                        g_free (priv->last_search);
                        priv->last_search = NULL;
+               } else {
+                       modest_msg_view_grab_focus (MODEST_MSG_VIEW (priv->msg_view));
                }
        }
        
@@ -1542,7 +1548,7 @@ static gboolean
 message_reader (ModestMsgViewWindow *window,
                ModestMsgViewWindowPrivate *priv,
                TnyHeader *header,
-               GtkTreePath *path)
+               GtkTreeRowReference *row_reference)
 {
        ModestMailOperation *mail_op = NULL;
        ModestMailOperationTypeOperation op_type;
@@ -1550,7 +1556,7 @@ message_reader (ModestMsgViewWindow *window,
        ModestWindow *msg_window = NULL;
        ModestWindowMgr *mgr;
 
-       g_return_val_if_fail (path != NULL, FALSE);
+       g_return_val_if_fail (row_reference != NULL, FALSE);
 
        mgr = modest_runtime_get_window_mgr ();
        already_showing = modest_window_mgr_find_registered_header (mgr, header, &msg_window);
@@ -1599,7 +1605,7 @@ message_reader (ModestMsgViewWindow *window,
                                                                 NULL);
                                
        modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
-       modest_mail_operation_get_msg (mail_op, header, view_msg_cb, path);
+       modest_mail_operation_get_msg (mail_op, header, view_msg_cb, row_reference);
        g_object_unref (mail_op);
 
        /* Update toolbar dimming rules */
@@ -1616,6 +1622,7 @@ modest_msg_view_window_select_next_message (ModestMsgViewWindow *window)
        GtkTreeIter tmp_iter;
        TnyHeader *header;
        gboolean retval = TRUE;
+       GtkTreeRowReference *row_reference = NULL;
 
        g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window), FALSE);
        priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
@@ -1637,18 +1644,21 @@ modest_msg_view_window_select_next_message (ModestMsgViewWindow *window)
        if (path == NULL)
                return FALSE;
 
+       row_reference = gtk_tree_row_reference_copy (priv->next_row_reference);
+
        gtk_tree_model_get_iter (priv->header_model,
                                 &tmp_iter,
                                 path);
+       gtk_tree_path_free (path);
 
        gtk_tree_model_get (priv->header_model, &tmp_iter, 
                            TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
                            &header, -1);
        
        /* Read the message & show it */
-       if (!message_reader (window, priv, header, path)) {
+       if (!message_reader (window, priv, header, row_reference)) {
                retval = FALSE;
-               gtk_tree_path_free (path);
+               gtk_tree_row_reference_free (row_reference);
        }
 
        /* Free */
@@ -1663,7 +1673,8 @@ modest_msg_view_window_select_first_message (ModestMsgViewWindow *self)
        ModestMsgViewWindowPrivate *priv = NULL;
        TnyHeader *header = NULL;
        GtkTreeIter iter;
-       GtkTreePath *path;
+       GtkTreePath *path = NULL;
+       GtkTreeRowReference *row_reference = NULL;
 
        g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (self), FALSE);
        priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self);
@@ -1684,9 +1695,11 @@ modest_msg_view_window_select_first_message (ModestMsgViewWindow *self)
        }
        
        path = gtk_tree_model_get_path (priv->header_model, &iter);
-       
+       row_reference = gtk_tree_row_reference_new (priv->header_model, path);
+       gtk_tree_path_free (path);
+
        /* Read the message & show it */
-       message_reader (self, priv, header, path);
+       message_reader (self, priv, header, row_reference);
        
        /* Free */
        g_object_unref (header);
@@ -1699,6 +1712,7 @@ modest_msg_view_window_select_previous_message (ModestMsgViewWindow *window)
 {
        ModestMsgViewWindowPrivate *priv = NULL;
        GtkTreePath *path;
+       GtkTreeRowReference *row_reference = NULL;
 
        g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window), FALSE);
        priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
@@ -1723,12 +1737,15 @@ modest_msg_view_window_select_previous_message (ModestMsgViewWindow *window)
                        continue;
                }
 
+               row_reference = gtk_tree_row_reference_new (priv->header_model, path);
                /* Read the message & show it */
-               if (!message_reader (window, priv, header, path)) {
+               if (!message_reader (window, priv, header, row_reference)) {
+                       gtk_tree_row_reference_free (row_reference);
                        g_object_unref (header);
                        break;
                }
 
+               gtk_tree_path_free (path);
                g_object_unref (header);
 
                return TRUE;
@@ -1746,12 +1763,12 @@ view_msg_cb (ModestMailOperation *mail_op,
 {
        ModestMsgViewWindow *self = NULL;
        ModestMsgViewWindowPrivate *priv = NULL;
-       GtkTreePath *path;
+       GtkTreeRowReference *row_reference = NULL;
 
        /* If there was any error */
-       path = (GtkTreePath *) user_data;
+       row_reference = (GtkTreeRowReference *) user_data;
        if (!modest_ui_actions_msg_retrieval_check (mail_op, header, msg)) {
-               gtk_tree_path_free (path);                      
+               gtk_tree_row_reference_free (row_reference);                    
                return;
        }
 
@@ -1762,10 +1779,10 @@ view_msg_cb (ModestMailOperation *mail_op,
 
        /* Update the row reference */
        gtk_tree_row_reference_free (priv->row_reference);
-       priv->row_reference = gtk_tree_row_reference_new (priv->header_model, path);
+       priv->row_reference = gtk_tree_row_reference_copy (row_reference);
        priv->next_row_reference = gtk_tree_row_reference_copy (priv->row_reference);
        select_next_valid_row (priv->header_model, &(priv->next_row_reference), TRUE);
-       gtk_tree_path_free (path);
+       gtk_tree_row_reference_free (row_reference);
 
        /* Mark header as read */
        if (!(tny_header_get_flags (header) & TNY_HEADER_FLAG_SEEN))
@@ -2346,7 +2363,11 @@ save_mime_parts_to_file_with_checks (SaveMimePartInfo *info)
        if (!is_ok) {
                save_mime_part_info_free (info, TRUE);
        } else {
+               GtkWidget *banner = hildon_banner_show_animation (NULL, NULL, 
+                                                                 _CS("sfil_ib_saving"));
+               info->banner = g_object_ref (banner);
                g_thread_create ((GThreadFunc)save_mime_part_to_file, info, FALSE, NULL);
+               g_object_unref (banner);
        }
 
 }
@@ -2452,12 +2473,8 @@ modest_msg_view_window_save_attachments (ModestMsgViewWindow *window, GList *mim
 
        if (files_to_save != NULL) {
                SaveMimePartInfo *info = g_slice_new0 (SaveMimePartInfo);
-               GtkWidget *banner = hildon_banner_show_animation (NULL, NULL, 
-                                                                 _CS("sfil_ib_saving"));
                info->pairs = files_to_save;
-               info->banner = banner;
                info->result = TRUE;
-               g_object_ref (banner);
                save_mime_parts_to_file_with_checks (info);
        }
 }