* src/modest-ui-actions.c
[modest] / src / modest-ui-actions.c
index 90df4ab..3780e5b 100644 (file)
@@ -1235,12 +1235,11 @@ header_list_count_uncached_msgs (
  * messages. Returns TRUE if the user allowed the download.
  */
 static gboolean
-connect_to_get_msg (
-                       GtkWindow *win,
-                       gint num_of_uncached_msgs)
+connect_to_get_msg (GtkWindow *win,
+                   gint num_of_uncached_msgs)
 {
        /* Allways download if we are online. */
-       if (tny_device_is_online (modest_runtime_get_device()))
+       if (tny_device_is_online (modest_runtime_get_device ()))
                return TRUE;
 
        /* If offline, then ask for user permission to download the messages */
@@ -2461,21 +2460,16 @@ modest_ui_actions_on_rename_folder (GtkAction *action,
                return;
 
        folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
-       if (!folder)
-               return;
 
-       /* Offer the connection dialog if necessary: */
-       if (!modest_platform_connect_and_wait_if_network_folderstore (NULL, folder)) {
-               g_object_unref (G_OBJECT (folder));
+       if (!folder)
                return;
-       }
 
-       
        if (TNY_IS_FOLDER (folder)) {
                gchar *folder_name;
                gint response;
                const gchar *current_name;
                TnyFolderStore *parent;
+                gboolean do_rename = TRUE;
 
                current_name = tny_folder_get_name (TNY_FOLDER (folder));
                parent = tny_folder_get_folder_store (TNY_FOLDER (folder));
@@ -2484,7 +2478,16 @@ modest_ui_actions_on_rename_folder (GtkAction *action,
                                                                     &folder_name);
                g_object_unref (parent);
 
-               if (response == GTK_RESPONSE_ACCEPT && strlen (folder_name) > 0) {
+                if (response != GTK_RESPONSE_ACCEPT || strlen (folder_name) == 0) {
+                        do_rename = FALSE;
+                } else if (modest_platform_is_network_folderstore(folder) &&
+                           !tny_device_is_online (modest_runtime_get_device())) {
+                        TnyAccount *account = tny_folder_get_account(TNY_FOLDER(folder));
+                        do_rename = modest_platform_connect_and_wait(GTK_WINDOW(main_window), account);
+                        g_object_unref(account);
+                }
+
+               if (do_rename) {
                        ModestMailOperation *mail_op;
                        GtkTreeSelection *sel = NULL;
 
@@ -2493,7 +2496,6 @@ modest_ui_actions_on_rename_folder (GtkAction *action,
                                                                               G_OBJECT(main_window),
                                                                               modest_ui_actions_rename_folder_error_handler,
                                                                               main_window);
-                       
 
                        modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
                                                         mail_op);
@@ -2535,7 +2537,8 @@ delete_folder (ModestMainWindow *main_window, gboolean move_to_trash)
        GtkWidget *folder_view;
        gint response;
        gchar *message;
-       
+        gboolean do_delete = TRUE;
+
        g_return_if_fail (MODEST_IS_MAIN_WINDOW (main_window));
 
        folder_view = modest_main_window_get_child_widget (main_window,
@@ -2553,12 +2556,6 @@ delete_folder (ModestMainWindow *main_window, gboolean move_to_trash)
                return ;
        }
 
-       /* Offer the connection dialog if necessary: */
-       if (!modest_platform_connect_and_wait_if_network_folderstore (NULL, folder)) {
-               g_object_unref (G_OBJECT (folder));
-               return;
-       }
-
        /* Ask the user */      
        message =  g_strdup_printf (_("mcen_nc_delete_folder_text"), 
                                    tny_folder_get_name (TNY_FOLDER (folder)));
@@ -2566,7 +2563,16 @@ delete_folder (ModestMainWindow *main_window, gboolean move_to_trash)
                                                            (const gchar *) message);
        g_free (message);
 
-       if (response == GTK_RESPONSE_OK) {
+        if (response != GTK_RESPONSE_OK) {
+                do_delete = FALSE;
+        } else if (modest_platform_is_network_folderstore(folder) &&
+                   !tny_device_is_online (modest_runtime_get_device())) {
+                TnyAccount *account = tny_folder_get_account(TNY_FOLDER(folder));
+                do_delete = modest_platform_connect_and_wait(GTK_WINDOW(main_window), account);
+                g_object_unref(account);
+        }
+
+       if (do_delete) {
                ModestMailOperation *mail_op;
                GtkTreeSelection *sel;
 
@@ -3486,8 +3492,10 @@ create_move_to_dialog_on_new_folder(GtkWidget *button, gpointer user_data)
 /*
  * This function is used to track changes in the selection of the
  * folder view that is inside the "move to" dialog to enable/disable
- * the OK button because we do not want the user to select a
- * disallowed destination for a folder
+ * the OK button because we do not want the user to select a disallowed
+ * destination for a folder.
+ * The user also not desired to be able to use NEW button on items where
+ * folder creation is not possibel.
  */
 static void
 on_move_to_dialog_folder_selection_changed (ModestFolderView* self,
@@ -3495,9 +3503,12 @@ on_move_to_dialog_folder_selection_changed (ModestFolderView* self,
                                            gboolean selected,
                                            gpointer user_data)
 {
-       GtkWidget *dialog = NULL, *ok_button = NULL;
+       GtkWidget *dialog = NULL;
+       GtkWidget *ok_button = NULL, *new_button = NULL;
        GList *children = NULL;
-       gboolean sensitive = TRUE, moving_folder = FALSE;
+       gboolean ok_sensitive = TRUE, new_sensitive = TRUE;
+       gboolean moving_folder = FALSE;
+       gboolean is_remote_account = FALSE;
        GtkWidget *folder_view = NULL;
 
        if (!selected)
@@ -3510,8 +3521,33 @@ on_move_to_dialog_folder_selection_changed (ModestFolderView* self,
 
        children = gtk_container_get_children (GTK_CONTAINER (GTK_DIALOG (dialog)->action_area));
        ok_button = GTK_WIDGET (children->next->next->data);
+       new_button = GTK_WIDGET (children->next->data);
        g_list_free (children);
 
+       /* check if folder_store is an remote account */
+       if (TNY_IS_ACCOUNT (folder_store)) {
+               TnyAccount *local_account = NULL;
+               ModestTnyAccountStore *account_store = NULL;
+
+               account_store = modest_runtime_get_account_store ();
+               local_account = modest_tny_account_store_get_local_folders_account (account_store);
+
+               if ((gpointer) local_account != (gpointer) folder_store)
+                       is_remote_account = TRUE;
+               g_object_unref (local_account);
+       }
+
+       /* New button should be dimmed on remote account root folder
+        * and on inbox folder. */
+       if (is_remote_account)
+               new_sensitive = FALSE;
+
+       /* check if folder_store is an rmeote inbox folder */
+       if (TNY_IS_FOLDER (folder_store))
+               if (tny_folder_get_folder_type(TNY_FOLDER(folder_store))
+                               == TNY_FOLDER_TYPE_INBOX)
+                       new_sensitive = FALSE;
+
        /* If it */
        if (MODEST_IS_MAIN_WINDOW (user_data)) {
                /* Get the widgets */
@@ -3531,27 +3567,20 @@ on_move_to_dialog_folder_selection_changed (ModestFolderView* self,
                if (TNY_IS_FOLDER (moved_folder)) {
                        parent = tny_folder_get_folder_store (TNY_FOLDER (moved_folder));
                        if (parent == folder_store)
-                               sensitive = FALSE;
+                               ok_sensitive = FALSE;
                        g_object_unref (parent);
                } 
 
-               if (sensitive && TNY_IS_ACCOUNT (folder_store)) {
-                       TnyAccount *local_account = NULL;
-                       ModestTnyAccountStore *account_store;
-
-                       account_store = modest_runtime_get_account_store ();
-                       local_account = modest_tny_account_store_get_local_folders_account (account_store);
-
+               if (ok_sensitive && TNY_IS_ACCOUNT (folder_store)) {
                        /* Do not allow to move to an account unless it's the
                           local folders account */
-                       if ((gpointer) local_account != (gpointer) folder_store)
-                               sensitive = FALSE;
-                       g_object_unref (local_account);
+                       if (is_remote_account)
+                               ok_sensitive = FALSE;
                } 
 
-               if (sensitive && (moved_folder == folder_store)) {
+               if (ok_sensitive && (moved_folder == folder_store)) {
                        /* Do not allow to move to itself */
-                       sensitive = FALSE;
+                       ok_sensitive = FALSE;
                }
                g_object_unref (moved_folder);
        } else {
@@ -3572,12 +3601,14 @@ on_move_to_dialog_folder_selection_changed (ModestFolderView* self,
                /* Do not allow to move the msg to an account */
                if ((gpointer) src_folder == (gpointer) folder_store ||
                    TNY_IS_ACCOUNT (folder_store))
-                       sensitive = FALSE;
+                       ok_sensitive = FALSE;
                g_object_unref (src_folder);
        }
 
        /* Set sensitivity of the OK button */
-       gtk_widget_set_sensitive (ok_button, sensitive);
+       gtk_widget_set_sensitive (ok_button, ok_sensitive);
+       /* Set sensitivity of the NEW button */
+       gtk_widget_set_sensitive (new_button, new_sensitive);
 }
 
 static GtkWidget*
@@ -3609,8 +3640,9 @@ create_move_to_dialog (GtkWindow *win,
        /* Create folder view */
        *tree_view = modest_platform_create_folder_view (NULL);
 
-       /* Track changes in the selection to disable the OK button
-          whenever "Move to" is not possible */
+       /* Track changes in the selection to
+        * disable the OK button whenever "Move to" is not possible
+        * disbale NEW button whenever New is not possible */
        g_signal_connect (*tree_view,
                          "folder_selection_changed",
                          G_CALLBACK (on_move_to_dialog_folder_selection_changed),
@@ -4055,61 +4087,71 @@ modest_ui_actions_on_main_window_move_to (GtkAction *action,
                                          TnyFolderStore *dst_folder,
                                          ModestMainWindow *win)
 {
-       GtkWidget *header_view = NULL;
+       ModestHeaderView *header_view = NULL;
        ModestMailOperation *mail_op = NULL;
        TnyFolderStore *src_folder;
+        gboolean online = (tny_device_is_online (modest_runtime_get_device()));
 
        g_return_if_fail (MODEST_IS_MAIN_WINDOW (win));
 
        /* Get the source folder */
        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))
-               goto end;
 
        /* Get header view */
-       header_view = 
-               modest_main_window_get_child_widget (win, MODEST_WIDGET_TYPE_HEADER_VIEW);
+       header_view = MODEST_HEADER_VIEW(modest_main_window_get_child_widget (win, MODEST_WIDGET_TYPE_HEADER_VIEW));
 
        /* Get folder or messages to transfer */
        if (gtk_widget_is_focus (folder_view)) {
                GtkTreeSelection *sel;
+                gboolean do_xfer = TRUE;
 
                /* Allow only to transfer folders to the local root folder */
                if (TNY_IS_ACCOUNT (dst_folder) && 
-                   !MODEST_IS_TNY_LOCAL_FOLDERS_ACCOUNT (dst_folder))
-                       goto end;
-               
-               /* Clean folder on header view before moving it */
-               sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (folder_view));
-               gtk_tree_selection_unselect_all (sel);
-
-               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);
-
-                       modest_mail_operation_xfer_folder (mail_op, 
-                                                          TNY_FOLDER (src_folder),
-                                                          dst_folder,
-                                                          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)) {
-               /* Transfer messages */
-               modest_ui_actions_xfer_messages_from_move_to (dst_folder, MODEST_WINDOW (win));
+                   !MODEST_IS_TNY_LOCAL_FOLDERS_ACCOUNT (dst_folder)) {
+                       do_xfer = FALSE;
+                } else if (!TNY_IS_FOLDER (src_folder)) {
+                       g_warning ("%s: src_folder is not a TnyFolder.\n", __FUNCTION__);
+                        do_xfer = FALSE;
+                } else if (!online && modest_platform_is_network_folderstore(src_folder)) {
+                        guint num_headers = tny_folder_get_all_count(TNY_FOLDER(src_folder));
+                        if (!connect_to_get_msg(GTK_WINDOW(win), num_headers)) {
+                                do_xfer = FALSE;
+                        }
+                }
+
+                if (do_xfer) {
+                        /* Clean folder on header view before moving it */
+                        sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (folder_view));
+                        gtk_tree_selection_unselect_all (sel);
+
+                        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);
+
+                        modest_mail_operation_xfer_folder (mail_op,
+                                                           TNY_FOLDER (src_folder),
+                                                           dst_folder,
+                                                           TRUE, NULL, NULL);
+                        /* Unref mail operation */
+                        g_object_unref (G_OBJECT (mail_op));
+                }
+       } else if (gtk_widget_is_focus (GTK_WIDGET(header_view))) {
+                gboolean do_xfer = TRUE;
+                /* Ask for confirmation if the source folder is remote and we're not connected */
+                if (!online && modest_platform_is_network_folderstore(src_folder)) {
+                        guint num_headers = modest_header_view_count_selected_headers(header_view);
+                        if (!connect_to_get_msg(GTK_WINDOW(win), num_headers)) {
+                                do_xfer = FALSE;
+                        }
+                }
+                if (do_xfer) /* Transfer messages */
+                        modest_ui_actions_xfer_messages_from_move_to (dst_folder, MODEST_WINDOW (win));
        }
-       
- end:
+
     if (src_folder)
        g_object_unref (src_folder);
 }
@@ -4125,16 +4167,18 @@ modest_ui_actions_on_msg_view_window_move_to (GtkAction *action,
                                              ModestMsgViewWindow *win)
 {
        TnyHeader *header = NULL;
-       TnyFolder *src_folder;
+       TnyFolderStore *src_folder;
 
        /* Create header list */
        header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));              
-       src_folder = tny_header_get_folder(header);
+       src_folder = TNY_FOLDER_STORE(tny_header_get_folder(header));
        g_object_unref (header);
 
-       /* Transfer the message */
-       if (modest_platform_connect_and_wait_if_network_folderstore (NULL, TNY_FOLDER_STORE (src_folder)))
+       /* Transfer the message if online or confirmed by the user */
+        if (tny_device_is_online (modest_runtime_get_device()) ||
+            (modest_platform_is_network_folderstore(src_folder) && connect_to_get_msg(GTK_WINDOW(win), 1))) {
                modest_ui_actions_xfer_messages_from_move_to (dst_folder, MODEST_WINDOW (win));
+        }
 
        g_object_unref (src_folder);
 }
@@ -4177,21 +4221,18 @@ modest_ui_actions_on_move_to (GtkAction *action,
                return;
 
        dst_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (tree_view));
-       /* Offer the connection dialog if necessary: */
-       if (modest_platform_connect_and_wait_if_network_folderstore (GTK_WINDOW (win), 
-                                                                     dst_folder)) {
-
-               /* Do window specific stuff */
-               if (MODEST_IS_MAIN_WINDOW (win))
-                       modest_ui_actions_on_main_window_move_to (action,
-                                                                 folder_view,
-                                                                 dst_folder,
-                                                                 MODEST_MAIN_WINDOW (win));
-               else
-                       modest_ui_actions_on_msg_view_window_move_to (action,
-                                                                     dst_folder,
-                                                                     MODEST_MSG_VIEW_WINDOW (win));
-       }
+        /* Do window specific stuff */
+        if (MODEST_IS_MAIN_WINDOW (win)) {
+                modest_ui_actions_on_main_window_move_to (action,
+                                                          folder_view,
+                                                          dst_folder,
+                                                          MODEST_MAIN_WINDOW (win));
+        } else {
+                modest_ui_actions_on_msg_view_window_move_to (action,
+                                                              dst_folder,
+                                                              MODEST_MSG_VIEW_WINDOW (win));
+        }
+
        if (dst_folder)
                g_object_unref (dst_folder);
 }