* Change save_settings call of main and viewer windows to
[modest] / src / modest-ui-actions.c
index 617dca5..7799461 100644 (file)
@@ -105,11 +105,9 @@ typedef struct _ReplyForwardHelper {
  */
 typedef void (*HeadersFunc) (TnyHeader *header, ModestWindow *win, gpointer user_data);
 
-static void
-do_headers_action (ModestWindow *win, 
-                  HeadersFunc func,
-                  gpointer user_data);
-
+static void     do_headers_action     (ModestWindow *win, 
+                                      HeadersFunc func,
+                                      gpointer user_data);
 
 static void     open_msg_cb            (ModestMailOperation *mail_op, 
                                        TnyHeader *header, 
@@ -353,10 +351,10 @@ modest_ui_actions_on_delete (GtkAction *action, ModestWindow *win)
                        widget = modest_main_window_get_child_widget (main_window,
                                                                      MODEST_WIDGET_TYPE_HEADER_VIEW);
                        modest_header_view_refilter (MODEST_HEADER_VIEW (widget));
-               }
 
-               /* Update toolbar dimming state */
-               modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (win));
+                       /* Update toolbar dimming state */
+                       modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (main_window));
+               }
        }
 
        /* free */
@@ -610,6 +608,27 @@ cleanup:
                g_object_unref (G_OBJECT(folder));
 }
 
+gboolean 
+modest_ui_actions_msg_retrieval_check (ModestMailOperation *mail_op,
+                                      TnyHeader *header,
+                                      TnyMsg *msg)
+{
+       ModestMailOperationStatus status;
+
+       /* If there is no message or the operation was not successful */
+       status = modest_mail_operation_get_status (mail_op);
+       if (!msg || status != MODEST_MAIL_OPERATION_STATUS_SUCCESS) {
+
+               /* Remove the header from the preregistered uids */
+               modest_window_mgr_unregister_header (modest_runtime_get_window_mgr (),  
+                                                    header);
+
+               return FALSE;
+       }
+
+       return TRUE;
+}
+
 static void
 open_msg_cb (ModestMailOperation *mail_op, 
             TnyHeader *header, 
@@ -623,9 +642,14 @@ open_msg_cb (ModestMailOperation *mail_op,
        gchar *account = NULL;
        TnyFolder *folder;
        
-       /* TODO: Show an error? (review the specs) */
-       if (!msg)
+       /* Do nothing if there was any problem with the mail
+          operation. The error will be shown by the error_handler of
+          the mail operation */
+       if (!modest_ui_actions_msg_retrieval_check (mail_op, header, msg)) {
+               printf ("DEBUG: %s: modest_ui_actions_msg_retrieval_check() failed.\n", 
+                       __FUNCTION__);
                return;
+       }
 
        parent_win = (ModestWindow *) modest_mail_operation_get_source (mail_op);
        folder = tny_header_get_folder (header);
@@ -710,24 +734,27 @@ cleanup:
        g_object_unref (folder);
 }
 
-/*
- * This function is the error handler of the
- * modest_mail_operation_get_msgs_full operation
- */
-static void
+void
 modest_ui_actions_get_msgs_full_error_handler (ModestMailOperation *mail_op,
                                               gpointer user_data)
 {
        const GError *error;
+       GObject *win = modest_mail_operation_get_source (mail_op);
 
        error = modest_mail_operation_get_error (mail_op);
+       printf ("DEBUG: %s: Error: code=%d, text=%s\n", __FUNCTION__, error->code, error->message);
        if (error->code == MODEST_MAIL_OPERATION_ERROR_MESSAGE_SIZE_LIMIT) {
-               GObject *win = modest_mail_operation_get_source (mail_op);
 
                modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL,
                                                        error->message);
-               g_object_unref (win);
+       } else {
+               modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL,
+                                                       _("mail_ni_ui_folder_get_msg_folder_error"));
        }
+
+       if (win)
+               g_object_unref (win);
 }
 
 /*
@@ -776,9 +803,6 @@ _modest_ui_actions_open (TnyList *headers, ModestWindow *win)
                                g_warning ("debug: header %p already registered, waiting for window",
                                           header);
                } else {
-                       /* register the header before actually creating the window */
-                       modest_window_mgr_register_header (mgr, header);
-                               
                        if (!(flags & TNY_HEADER_FLAG_CACHED))
                                tny_list_append (not_opened_headers, G_OBJECT (header));
                        /* Check if msg has already been retreived */
@@ -788,6 +812,47 @@ _modest_ui_actions_open (TnyList *headers, ModestWindow *win)
                g_object_unref (header);
                tny_iterator_next (iter);
        }
+       g_object_unref (iter);
+       iter = NULL;
+       
+       /* If some messages would have to be downloaded, ask the user to 
+        * make a connection. It's generally easier to do this here (in the mainloop) 
+        * than later in a thread:
+        */
+       if (tny_list_get_length (not_opened_cached_headers) > 0) {
+               gboolean connected = modest_platform_connect_and_wait (GTK_WINDOW (win));
+               
+               /* Don't go further if a connection would be necessary but none is available: */
+               if (!connected) {
+                       g_object_unref (not_opened_headers);
+                       g_object_unref (not_opened_cached_headers);
+                       return;
+               }
+       }
+       
+       /* Register the headers before actually creating the windows: */
+       TnyIterator *iter_not_opened = tny_list_create_iterator (not_opened_headers);
+       while (!tny_iterator_is_done (iter_not_opened)) {
+               TnyHeader *header = TNY_HEADER (tny_iterator_get_current (iter_not_opened));
+               modest_window_mgr_register_header (mgr, header);
+               g_object_unref (header);
+               
+               tny_iterator_next (iter_not_opened);
+       }
+       g_object_unref (iter_not_opened);
+       iter_not_opened = NULL;
+       
+       TnyIterator *iter_cached = tny_list_create_iterator (not_opened_cached_headers);
+       while (!tny_iterator_is_done (iter_cached)) {
+               TnyHeader *header = TNY_HEADER (tny_iterator_get_current (iter_cached));
+               modest_window_mgr_register_header (mgr, header);
+               g_object_unref (header);
+               
+               tny_iterator_next (iter_cached);
+       }
+       g_object_unref (iter_cached);
+       iter_cached = NULL;
+       
        
        /* Open each uncached message */
        if (tny_list_get_length (not_opened_headers) > 0) {
@@ -887,6 +952,10 @@ reply_forward_cb (ModestMailOperation *mail_op,
        TnyAccount *account = NULL;
        ModestWindowMgr *mgr = NULL;
        gchar *signature = NULL;
+
+       /* If there was any error */
+       if (!modest_ui_actions_msg_retrieval_check (mail_op, header, msg))
+               return;
                        
        g_return_if_fail (user_data != NULL);
        rf_helper = (ReplyForwardHelper *) user_data;
@@ -1674,6 +1743,10 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
        if (!modest_msg_edit_window_check_names (edit_window))
                return;
        
+       /* Offer the connection dialog, if necessary: */        
+       if (!modest_platform_connect_and_wait (GTK_WINDOW (edit_window)))
+               return;
+       
        /* FIXME: Code added just for testing. The final version will
           use the send queue provided by tinymail and some
           classifier */
@@ -2403,6 +2476,18 @@ modest_ui_actions_on_undo (GtkAction *action,
        }
 }
 
+void
+modest_ui_actions_on_redo (GtkAction *action,
+                          ModestWindow *window)
+{
+       if (MODEST_IS_MSG_EDIT_WINDOW (window)) {
+               modest_msg_edit_window_redo (MODEST_MSG_EDIT_WINDOW (window));
+       }
+       else {
+               g_return_if_reached ();
+       }
+}
+
 
 static void
 paste_msgs_cb (const GObject *object, gpointer user_data)
@@ -3046,7 +3131,9 @@ open_msg_for_purge_cb (ModestMailOperation *mail_op,
        gint pending_purges = 0;
        gboolean some_purged = FALSE;
        ModestWindow *win = MODEST_WINDOW (user_data);
-       if (!msg)
+
+       /* If there was any error */
+       if (!modest_ui_actions_msg_retrieval_check (mail_op, header, msg))
                return;
 
        /* Once the message has been retrieved for purging, we check if
@@ -3180,6 +3267,17 @@ modest_ui_actions_on_main_window_move_to (GtkAction *action,
        /* Get the folder view */
        folder_view = modest_main_window_get_child_widget (win,
                                                           MODEST_WIDGET_TYPE_FOLDER_VIEW);
+                                                          
+       TnyFolderStore *src_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
+       
+       /* Offer the connection dialog if necessary, if the source folder is in a networked account: */
+       if (!modest_platform_connect_and_wait_if_network_folderstore (GTK_WINDOW (win), src_folder)) {
+               if (src_folder) {
+                       g_object_unref (src_folder);
+               }
+               
+               return;
+       }
 
        /* Get header view */
        header_view = modest_main_window_get_child_widget (win,
@@ -3202,39 +3300,32 @@ modest_ui_actions_on_main_window_move_to (GtkAction *action,
                goto end;
 
        /* Offer the connection dialog if necessary: */
-       if (modest_platform_connect_and_wait_if_network_folderstore (GTK_WINDOW (win), folder_store)) {
+       if (!modest_platform_connect_and_wait_if_network_folderstore (GTK_WINDOW (win), folder_store)) {
                        goto end;
        }
 
        /* Get folder or messages to transfer */
        if (gtk_widget_is_focus (folder_view)) {
-               TnyFolderStore *src_folder;
-               src_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
-
-               /* Offer the connection dialog if necessary: */
-               if (modest_platform_connect_and_wait_if_network_folderstore (GTK_WINDOW (win), src_folder)) {
-
-                       /* Clean folder on header view before moving it */
-                       modest_header_view_clear (MODEST_HEADER_VIEW (header_view)); 
-
-                       if (TNY_IS_FOLDER (src_folder)) {
-                               mail_op = 
-                                       modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE, 
-                                                                              G_OBJECT(win),
-                                                                              modest_ui_actions_move_folder_error_handler,
-                                                                              NULL);
-                               modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
+               
+               /* Clean folder on header view before moving it */
+               modest_header_view_clear (MODEST_HEADER_VIEW (header_view)); 
 
-                               modest_mail_operation_xfer_folder (mail_op, 
-                                                                  TNY_FOLDER (src_folder),
-                                                                  folder_store,
-                                                                  TRUE, NULL, NULL);
-                               /* Unref mail operation */
-                               g_object_unref (G_OBJECT (mail_op));
-                       }
+               if (TNY_IS_FOLDER (src_folder)) {
+                       mail_op = 
+                               modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE, 
+                                                                      G_OBJECT(win),
+                                                                      modest_ui_actions_move_folder_error_handler,
+                                                                      NULL);
+                       modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
 
-                       /* Frees */
-                       g_object_unref (G_OBJECT (src_folder));
+                       modest_mail_operation_xfer_folder (mail_op, 
+                                                          TNY_FOLDER (src_folder),
+                                                          folder_store,
+                                                          TRUE, NULL, NULL);
+                       /* Unref mail operation */
+                       g_object_unref (G_OBJECT (mail_op));
+               } else {
+                       g_warning ("%s: src_folder is not a TnyFolder.\n", __FUNCTION__);       
                }
        } else {
                if (gtk_widget_is_focus (header_view)) {
@@ -3273,7 +3364,10 @@ modest_ui_actions_on_main_window_move_to (GtkAction *action,
        }
        
  end:
-       if (folder_store != NULL)
+    if (src_folder)
+       g_object_unref (src_folder);
+                       
+       if (folder_store)
                g_object_unref (folder_store);
 
        gtk_widget_destroy (dialog);