Open the next message in viewer when moving the already viewed one
[modest] / src / maemo / modest-msg-view-window.c
index 2114334..54f69fc 100644 (file)
@@ -1326,41 +1326,41 @@ modest_msg_view_window_on_row_reordered (GtkTreeModel *header_model,
                                         gpointer arg3,
                                         ModestMsgViewWindow *window)
 {
-       ModestMsgViewWindowPrivate *priv = NULL; 
+       ModestMsgViewWindowPrivate *priv = NULL;
        gboolean already_changed = FALSE;
 
        priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(window);
 
        /* If the current row was reordered select the proper next
           valid row. The same if the next row reference changes */
-       if (priv->row_reference && 
-           gtk_tree_row_reference_valid (priv->row_reference)) {
-               GtkTreePath *path;
-               path = gtk_tree_row_reference_get_path (priv->row_reference);
-               if (gtk_tree_path_compare (path, arg1) == 0) {
-                       if (priv->next_row_reference) {
-                               gtk_tree_row_reference_free (priv->next_row_reference);
-                       }
-                       priv->next_row_reference = gtk_tree_row_reference_copy (priv->row_reference);
-                       select_next_valid_row (header_model, &(priv->next_row_reference), FALSE, priv->is_outbox);
-                       already_changed = TRUE;
-               }
-               gtk_tree_path_free (path);
-       }
-       if (!already_changed &&
-           priv->next_row_reference &&
+       if (!priv->row_reference ||
+           !gtk_tree_row_reference_valid (priv->row_reference))
+               return;
+
+       if (priv->next_row_reference &&
            gtk_tree_row_reference_valid (priv->next_row_reference)) {
-               GtkTreePath *path;
-               path = gtk_tree_row_reference_get_path (priv->next_row_reference);
-               if (gtk_tree_path_compare (path, arg1) == 0) {
-                       if (priv->next_row_reference) {
-                               gtk_tree_row_reference_free (priv->next_row_reference);
-                       }
+               GtkTreePath *cur, *next;
+               /* Check that the order is still the correct one */
+               cur = gtk_tree_row_reference_get_path (priv->row_reference);
+               next = gtk_tree_row_reference_get_path (priv->next_row_reference);
+               gtk_tree_path_next (cur);
+               if (gtk_tree_path_compare (cur, next) != 0) {
+                       gtk_tree_row_reference_free (priv->next_row_reference);
                        priv->next_row_reference = gtk_tree_row_reference_copy (priv->row_reference);
                        select_next_valid_row (header_model, &(priv->next_row_reference), FALSE, priv->is_outbox);
+                       already_changed = TRUE;
                }
-               gtk_tree_path_free (path);
+               gtk_tree_path_free (cur);
+               gtk_tree_path_free (next);
+       } else {
+               if (priv->next_row_reference)
+                       gtk_tree_row_reference_free (priv->next_row_reference);
+               /* Update next row reference */
+               priv->next_row_reference = gtk_tree_row_reference_copy (priv->row_reference);
+               select_next_valid_row (header_model, &(priv->next_row_reference), FALSE, priv->is_outbox);
+               already_changed = TRUE;
        }
+
        check_dimming_rules_after_change (window);
 }
 
@@ -1916,7 +1916,8 @@ message_reader_performer (gboolean canceled,
        }
 
        /* Register the header - it'll be unregistered in the callback */
-       modest_window_mgr_register_header (modest_runtime_get_window_mgr (), info->header, NULL);
+       if (info->header)
+               modest_window_mgr_register_header (modest_runtime_get_window_mgr (), info->header, NULL);
 
        /* New mail operation */
        mail_op = modest_mail_operation_new_with_error_handling (G_OBJECT(parent_window),
@@ -1937,7 +1938,10 @@ message_reader_performer (gboolean canceled,
  frees:
        /* Frees. The row_reference will be freed by the view_msg_cb callback */
        g_free (info->uid);
-       g_object_unref (info->header);
+       if (info->header)
+               g_object_unref (info->header);
+       if (info->folder)
+               g_object_unref (info->folder);
        g_slice_free (MsgReaderInfo, info);
 }
 
@@ -1969,7 +1973,7 @@ message_reader (ModestMsgViewWindow *window,
        MsgReaderInfo *info;
 
        mgr = modest_runtime_get_window_mgr ();
-       already_showing = modest_window_mgr_find_registered_header (mgr, header, &msg_window);
+       already_showing = header && modest_window_mgr_find_registered_header (mgr, header, &msg_window);
        if (already_showing && (msg_window != MODEST_WINDOW (window))) {
                gboolean retval;
                if (msg_window)
@@ -1978,6 +1982,10 @@ message_reader (ModestMsgViewWindow *window,
                return TRUE;
        }
 
+       if (folder)
+               g_object_ref (folder);
+               
+
        /* Msg download completed */
        if (!header || !(tny_header_get_flags (header) & TNY_HEADER_FLAG_CACHED)) {
                /* Ask the user if he wants to download the message if
@@ -1990,10 +1998,10 @@ message_reader (ModestMsgViewWindow *window,
                        if (response == GTK_RESPONSE_CANCEL)
                                return FALSE;
 
-                       if (header)
+                       if (header) {
+                               if (folder) g_object_unref (folder);
                                folder = tny_header_get_folder (header);
-                       else
-                               g_object_ref (folder);
+                       }
                        info = g_slice_new (MsgReaderInfo);
                        info->msg_uid = g_strdup (msg_uid);
                        if (header)
@@ -2016,10 +2024,10 @@ message_reader (ModestMsgViewWindow *window,
                }
        }
 
-       if (header)
+       if (header) {
+               if (folder) g_object_unref (folder);
                folder = tny_header_get_folder (header);
-       else
-               g_object_ref (folder);
+       }
        account = tny_folder_get_account (folder);
        info = g_slice_new (MsgReaderInfo);
        info->msg_uid = g_strdup (msg_uid);