* handle 'other' TNY_TRANSPORT_ACCOUNT_ERRORs as well, instead
[modest] / src / modest-ui-actions.c
index 7aac814..ad8f48d 100644 (file)
@@ -159,6 +159,12 @@ static gboolean remote_folder_is_pop (const TnyFolderStore *folder);
 static gboolean msgs_already_deleted_from_server ( TnyList *headers,
                                                    const TnyFolderStore *src_folder);
 
+static void     do_create_folder (GtkWindow *window, 
+                                 TnyFolderStore *parent_folder, 
+                                 const gchar *suggested_name);
+
+static GtkWidget* get_folder_view_from_move_to_dialog (GtkWidget *move_to_dialog);
+
 
 /*
  * This function checks whether a TnyFolderStore is a pop account
@@ -740,8 +746,7 @@ modest_ui_actions_compose_msg(ModestWindow *win,
        ModestAccountMgr *mgr = modest_runtime_get_account_mgr();
        ModestTnyAccountStore *store = modest_runtime_get_account_store();
 
-       if (win) account_name = g_strdup (modest_window_get_active_account (win));
-       if (!account_name) account_name = modest_account_mgr_get_default_account(mgr);
+       account_name = modest_account_mgr_get_default_account(mgr);
        if (!account_name) {
                g_printerr ("modest: no account found\n");
                goto cleanup;
@@ -1057,7 +1062,6 @@ open_msgs_performer(gboolean canceled,
 
        status = tny_account_get_connection_status (account);
        if (err || canceled) {
-               /* TODO: Show an error ? */
                goto clean;
        }
 
@@ -1637,17 +1641,21 @@ new_messages_arrived (ModestMailOperation *self,
                      gpointer user_data)
 {
        GObject *source;
+       gboolean show_visual_notifications;
 
        source = modest_mail_operation_get_source (self);
-
-       /* Notify new messages have been downloaded. Do not notify if
-          the send&receive was invoked by the user, i.e, if the mail
-          operation has a source (the main window) */
-       if ((new_headers != NULL) && (tny_list_get_length (new_headers) > 0) && !source)
-               modest_platform_on_new_headers_received (new_headers);
-
+       show_visual_notifications = (source) ? FALSE : TRUE;
        if (source)
                g_object_unref (source);
+
+       /* Notify new messages have been downloaded. If the
+          send&receive was invoked by the user then do not show any
+          visual notification, only play a sound and activate the LED
+          (for the Maemo version) */
+       if ((new_headers != NULL) && (tny_list_get_length (new_headers) > 0))
+               modest_platform_on_new_headers_received (new_headers, 
+                                                        show_visual_notifications);
+
 }
 
 gboolean
@@ -1692,7 +1700,6 @@ do_send_receive_performer (gboolean canceled,
        info = (SendReceiveInfo *) user_data;
 
        if (err || canceled) {
-
                goto clean;
        }
 
@@ -1976,7 +1983,7 @@ modest_ui_actions_on_header_activated (ModestHeaderView *header_view,
        TnyList *headers;
 
        g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
-       
+
        if (!header)
                return;
 
@@ -2241,9 +2248,14 @@ on_save_to_drafts_cb (ModestMailOperation *mail_op,
 
        edit_window = MODEST_MSG_EDIT_WINDOW (user_data);
 
-       /* If there was any error do nothing */
-       if (modest_mail_operation_get_error (mail_op) != NULL)
+       /* It might not be a good idea to do nothing if there was an error,
+        * so let's at least show a generic error banner. */
+       /* TODO error while saving attachment, show "Saving draft failed" banner */
+       if (modest_mail_operation_get_error (mail_op) != NULL) {
+               g_warning ("%s failed: %s\n", __FUNCTION__, (modest_mail_operation_get_error (mail_op))->message);
+               modest_platform_information_banner (NULL, NULL, _("mail_ib_file_operation_failed"));
                return;
+       }
 
        modest_msg_edit_window_set_draft (edit_window, saved_draft);
 }
@@ -2588,16 +2600,91 @@ modest_ui_actions_on_remove_attachments (GtkAction *action,
 }
 
 static void
-modest_ui_actions_new_folder_error_handler (ModestMailOperation *mail_op,
-                                            gpointer user_data)
+do_create_folder_cb (ModestMailOperation *mail_op,
+                    TnyFolderStore *parent_folder, 
+                    TnyFolder *new_folder,
+                    gpointer user_data)
 {
-       ModestMainWindow *window = MODEST_MAIN_WINDOW (user_data);
-       const GError *error = modest_mail_operation_get_error (mail_op);
-
-       if(error) {
-               modest_platform_information_banner (GTK_WIDGET (window), NULL,
+       gchar *suggested_name = (gchar *) user_data;
+       GtkWindow *source_win = (GtkWindow *) modest_mail_operation_get_source (mail_op);
+               
+       if (modest_mail_operation_get_error (mail_op)) {
+               /* Show an error */
+               modest_platform_information_banner (GTK_WIDGET (source_win), NULL,
                                                    _("mail_in_ui_folder_create_error"));
+
+               /* Try again */
+               do_create_folder (source_win, parent_folder, (const gchar *) suggested_name);
+       } else {
+               /* the 'source_win' is either the ModestMainWindow, or the 'Move to folder'-dialog
+                * FIXME: any other? */         
+               GtkWidget *folder_view;
+
+               if (MODEST_IS_MAIN_WINDOW(source_win)) 
+                       folder_view = 
+                               modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (source_win),
+                                                                    MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
+               else
+                       folder_view =
+                               get_folder_view_from_move_to_dialog (GTK_WIDGET(source_win));
+               
+               /* Select the newly created folder */
+               modest_folder_view_select_folder (MODEST_FOLDER_VIEW (folder_view),
+                                                 new_folder, FALSE);
+               g_object_unref (new_folder);
        }
+       /* Free. Note that the first time it'll be NULL so noop */
+       g_free (suggested_name);
+       g_object_unref (source_win);
+}
+
+static void
+do_create_folder (GtkWindow *parent_window, 
+                 TnyFolderStore *parent_folder, 
+                 const gchar *suggested_name)
+{
+       gint result;
+       gchar *folder_name = NULL;
+
+       result = modest_platform_run_new_folder_dialog (GTK_WINDOW (parent_window),
+                                                       parent_folder,
+                                                       (gchar *) suggested_name,
+                                                       &folder_name);
+       
+       if (result == GTK_RESPONSE_ACCEPT) {
+               ModestMailOperation *mail_op;
+               
+               mail_op  = modest_mail_operation_new (G_OBJECT(parent_window));
+                       
+               modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), 
+                                                mail_op);
+               modest_mail_operation_create_folder (mail_op,
+                                                    parent_folder,
+                                                    (const gchar *) folder_name,
+                                                    do_create_folder_cb,
+                                                    folder_name);
+               g_object_unref (mail_op);
+       }
+}
+
+static void
+create_folder_performer (gboolean canceled, 
+                        GError *err,
+                        GtkWindow *parent_window, 
+                        TnyAccount *account, 
+                        gpointer user_data)
+{
+       TnyFolderStore *parent_folder = TNY_FOLDER_STORE (user_data);
+
+       if (canceled || err) {
+               goto frees;
+       }
+
+       /* Run the new folder dialog */
+       do_create_folder (GTK_WINDOW (parent_window), parent_folder, NULL);
+
+ frees:
+       g_object_unref (parent_folder);
 }
 
 static void
@@ -2609,65 +2696,11 @@ modest_ui_actions_create_folder(GtkWidget *parent_window,
        parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
        
        if (parent_folder) {
-               gboolean finished = FALSE;
-               gint result;
-               gchar *folder_name = NULL, *suggested_name = NULL;
-               const gchar *proto_str = NULL;
-               TnyAccount *account;
-
-               if (TNY_IS_ACCOUNT (parent_folder))
-                       account = g_object_ref (parent_folder);
-               else
-                       account = tny_folder_get_account (TNY_FOLDER (parent_folder));
-               proto_str = tny_account_get_proto (TNY_ACCOUNT (account));
-
-               if (proto_str && modest_protocol_info_get_transport_store_protocol (proto_str) ==
-                   MODEST_PROTOCOL_STORE_POP) {
-                       finished = TRUE;
-                       modest_platform_information_banner (NULL, NULL, _("mail_in_ui_folder_create_error"));
-               }
-               g_object_unref (account);
-
-               /* Run the new folder dialog */
-               while (!finished) {
-                       result = modest_platform_run_new_folder_dialog (GTK_WINDOW (parent_window),
-                                                                       parent_folder,
-                                                                       suggested_name,
-                                                                       &folder_name);
-
-                       g_free (suggested_name);
-                       suggested_name = NULL;
-
-                       if (result == GTK_RESPONSE_ACCEPT) {
-                               ModestMailOperation *mail_op;
-                               TnyFolder *new_folder = NULL;
-
-                               mail_op  = modest_mail_operation_new_with_error_handling (G_OBJECT(parent_window),
-                                                                                         modest_ui_actions_new_folder_error_handler,
-                                                                                         parent_window, NULL);
-
-                               modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), 
-                                                                mail_op);
-                               new_folder = modest_mail_operation_create_folder (mail_op,
-                                                                                 parent_folder,
-                                                                                 (const gchar *) folder_name);
-                               if (new_folder) {
-                                       modest_folder_view_select_folder (MODEST_FOLDER_VIEW(folder_view), 
-                                                                         new_folder, TRUE);
-
-                                       g_object_unref (new_folder);
-                                       finished = TRUE;
-                               }
-                               g_object_unref (mail_op);
-                       } else {
-                               finished = TRUE;
-                       }
-
-                       suggested_name = folder_name;
-                       folder_name = NULL;
-               }
-
-               g_object_unref (parent_folder);
+               /* The parent folder will be freed in the callback */
+               modest_platform_connect_if_remote_and_perform (GTK_WINDOW (parent_window), 
+                                                              parent_folder,
+                                                              create_folder_performer, 
+                                                              parent_folder);
        }
 }
 
@@ -2726,7 +2759,7 @@ on_rename_folder_cb (gboolean canceled, GError *err, GtkWindow *parent_window,
        GtkWidget *folder_view = NULL;
        RenameFolderInfo *data = (RenameFolderInfo*)user_data;
 
-       if (MODEST_IS_MAIN_WINDOW(parent_window)) {
+       if (!canceled && (err == NULL) && MODEST_IS_MAIN_WINDOW(parent_window)) {
 
                folder_view = modest_main_window_get_child_widget (
                                MODEST_MAIN_WINDOW (parent_window),
@@ -2846,7 +2879,11 @@ on_delete_folder_cb (gboolean canceled,
        ModestMailOperation *mail_op;
        GtkTreeSelection *sel;
        
-       g_return_if_fail (MODEST_IS_MAIN_WINDOW(parent_window));
+       if (!MODEST_IS_MAIN_WINDOW(parent_window) || canceled || (err!=NULL)) {
+               g_object_unref (G_OBJECT (info->folder));
+               g_free (info);
+       }
+       
        folder_view = modest_main_window_get_child_widget (
                        MODEST_MAIN_WINDOW (parent_window),
                        MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
@@ -3769,11 +3806,19 @@ modest_ui_actions_msg_edit_on_select_font (GtkAction *action,
        modest_msg_edit_window_select_font (window);
 }
 
+
 void
 modest_ui_actions_on_folder_display_name_changed (ModestFolderView *folder_view,
                                                  const gchar *display_name,
                                                  GtkWindow *window)
 {
+       /* don't update the display name if it was already set;
+        * updating the display name apparently is expensive */
+       const gchar* old_name = gtk_window_get_title (window);
+
+       if (old_name && display_name && strcmp (old_name, display_name) == 0)
+               return; /* don't do anything */
+
        /* This is usually used to change the title of the main window, which
         * is the one that holds the folder view. Note that this change can
         * happen even when the widget doesn't have the focus. */
@@ -3781,6 +3826,7 @@ modest_ui_actions_on_folder_display_name_changed (ModestFolderView *folder_view,
                gtk_window_set_title (window, display_name);
        else
                gtk_window_set_title (window, " ");
+
 }
 
 void
@@ -3934,6 +3980,16 @@ on_move_to_dialog_folder_selection_changed (ModestFolderView* self,
        gtk_widget_set_sensitive (new_button, new_sensitive);
 }
 
+
+#define MODEST_MOVE_TO_DIALOG_FOLDER_VIEW "move-to-dialog-folder-view"
+
+static GtkWidget*
+get_folder_view_from_move_to_dialog (GtkWidget *move_to_dialog)
+{
+       return GTK_WIDGET(g_object_get_data (G_OBJECT(move_to_dialog),
+                                            MODEST_MOVE_TO_DIALOG_FOLDER_VIEW));
+}
+
 static GtkWidget*
 create_move_to_dialog (GtkWindow *win,
                       GtkWidget *folder_view,
@@ -4022,9 +4078,16 @@ create_move_to_dialog (GtkWindow *win,
                }
        }
 
+       /* we keep a pointer to the embedded folder view, so we can retrieve it with
+        *   get_folder_view_from_move_to_dialog 
+        * (see above) later (needed for focus handling) 
+        */
+       g_object_set_data (G_OBJECT(dialog), MODEST_MOVE_TO_DIALOG_FOLDER_VIEW, *tree_view);
+
+       
        /* Hide special folders */
        modest_folder_view_show_non_move_folders (MODEST_FOLDER_VIEW (*tree_view), FALSE);
-       
+
        gtk_container_add (GTK_CONTAINER (scroll), *tree_view);
 
        /* Add scroll to dialog */
@@ -4388,6 +4451,11 @@ xfer_messages_from_move_to_cb  (gboolean canceled, GError *err,
        const gchar *proto_str = NULL;
        gboolean dst_is_pop = FALSE;
 
+       if (canceled || err) {
+               g_object_unref (dst_folder);
+               return;
+       }
+       
        if (!TNY_IS_FOLDER (dst_folder)) {
                modest_platform_information_banner (GTK_WIDGET (win),
                                                    NULL,
@@ -4468,11 +4536,17 @@ static void
 on_move_folder_cb (gboolean canceled, GError *err, GtkWindow *parent_window, 
                TnyAccount *account, gpointer user_data)
 {
-       g_return_if_fail (MODEST_IS_MAIN_WINDOW (parent_window));
-       
        MoveFolderInfo *info = (MoveFolderInfo*)user_data;
        GtkTreeSelection *sel;
        ModestMailOperation *mail_op = NULL;
+       
+       if (canceled || err || !MODEST_IS_MAIN_WINDOW (parent_window)) {
+               g_object_unref (G_OBJECT (info->src_folder));
+               g_object_unref (G_OBJECT (info->dst_folder));
+               g_free (info);
+               return;
+       }
+       
        MoveToHelper *helper = g_new0 (MoveToHelper, 1);
        helper->banner = modest_platform_animation_banner (GTK_WIDGET (parent_window), NULL,
                        _CS("ckct_nw_pasting"));
@@ -4823,7 +4897,6 @@ retrieve_msg_contents_performer (gboolean canceled,
        TnyList *headers = TNY_LIST (user_data);
 
        if (err || canceled) {
-               /* Show an error ? */
                goto out;
        }
 
@@ -5096,7 +5169,10 @@ modest_ui_actions_on_send_queue_error_happened (TnySendQueue *self,
                message = g_strdup (_("emev_ib_ui_smtp_send_error"));
                break;
        default:
-               g_return_if_reached ();
+               g_warning ("%s: unexpected TNY_TRANSPORT_ACCOUNT_ERROR %d",
+                          __FUNCTION__, err->code);
+               message = g_strdup (_("emev_ib_ui_smtp_send_error"));
+               break;  
        }
        
        /* TODO if the username or the password where not defined we