X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-ui-actions.c;h=110a26f6533ea1b8e33d3d7842e83c808e507311;hp=e38aa0c74037ade673ab90fee1dc601613090d7b;hb=a9c347489d676ecf1cb0a4ba30059432aeccee80;hpb=3ef614a1262e88442268403651e7c3e9cf45a21c diff --git a/src/modest-ui-actions.c b/src/modest-ui-actions.c index e38aa0c..110a26f 100644 --- a/src/modest-ui-actions.c +++ b/src/modest-ui-actions.c @@ -163,6 +163,9 @@ 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 */ @@ -395,7 +398,8 @@ modest_ui_actions_refresh_message_window_after_delete (ModestMsgViewWindow* win) if (modest_msg_view_window_last_message_selected (win) && modest_msg_view_window_first_message_selected (win)) { modest_ui_actions_on_close_window (NULL, MODEST_WINDOW (win)); - } else if (!modest_msg_view_window_select_next_message (win)) { + } else if (!modest_msg_view_window_select_next_message (win) && + !modest_msg_view_window_select_previous_message (win)) { gboolean ret_value; g_signal_emit_by_name (G_OBJECT (win), "delete-event", NULL, &ret_value); } @@ -786,11 +790,6 @@ modest_ui_actions_compose_msg(ModestWindow *win, attachments = g_slist_next(attachments); } modest_window_mgr_register_window (modest_runtime_get_window_mgr(), msg_win); - - if (win) { - gtk_window_set_transient_for (GTK_WINDOW (msg_win), - GTK_WINDOW (win)); - } gtk_widget_show_all (GTK_WIDGET (msg_win)); cleanup: @@ -815,6 +814,26 @@ modest_ui_actions_on_new_msg (GtkAction *action, ModestWindow *win) modest_ui_actions_compose_msg(win, NULL, NULL, NULL, NULL, NULL, NULL); } +void +modest_ui_actions_on_new_msg_or_folder (GtkAction *action, ModestWindow *win) +{ + g_return_if_fail (MODEST_IS_WINDOW (win)); + + /* Check first if the folder view has the focus */ + if (MODEST_IS_MAIN_WINDOW (win)) { + GtkWidget *w; + w = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win), + MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW); + if (gtk_widget_is_focus (w)) { + modest_ui_actions_on_new_folder (action, MODEST_MAIN_WINDOW(win)); + return; + } + } + + modest_ui_actions_on_new_msg (action, win); +} + + gboolean modest_ui_actions_msg_retrieval_check (ModestMailOperation *mail_op, TnyHeader *header, @@ -1002,16 +1021,10 @@ modest_ui_actions_get_msgs_full_error_handler (ModestMailOperation *mail_op, { const GError *error; GObject *win = NULL; - const gchar *err_msg; + const gchar *err_msg = (const gchar *) user_data; win = modest_mail_operation_get_source (mail_op); error = modest_mail_operation_get_error (mail_op); - - /* Select error message */ - if (error->code == MODEST_MAIL_OPERATION_ERROR_MESSAGE_SIZE_LIMIT) - err_msg = _("emev_ni_ui_imap_msg_size_exceed_error"); - else - err_msg = (const gchar *) user_data; /* Show error */ modest_platform_run_information_dialog ((GtkWindow *) win, err_msg); @@ -1041,6 +1054,16 @@ get_account_from_header_list (TnyList *headers) return account; } +static void +foreach_unregister_headers (gpointer data, + gpointer user_data) +{ + ModestWindowMgr *mgr = (ModestWindowMgr *) user_data; + TnyHeader *header = TNY_HEADER (data); + + modest_window_mgr_unregister_header (mgr, header); +} + static void open_msgs_performer(gboolean canceled, GError *err, @@ -1059,7 +1082,9 @@ open_msgs_performer(gboolean canceled, status = tny_account_get_connection_status (account); if (err || canceled) { - /* TODO: Show an error ? */ + /* Unregister the already registered headers */ + tny_list_foreach (not_opened_headers, foreach_unregister_headers, + modest_runtime_get_window_mgr ()); goto clean; } @@ -1223,7 +1248,7 @@ open_msgs_from_headers (TnyList *headers, ModestWindow *win) /* Connect to the account and perform */ if (uncached_msgs > 0) { - modest_platform_connect_and_perform ((GtkWindow *) win, g_object_ref (account), + modest_platform_connect_and_perform ((GtkWindow *) win, TRUE, g_object_ref (account), open_msgs_performer, g_object_ref (not_opened_headers)); } else { /* Call directly the performer, do not need to connect */ @@ -1639,17 +1664,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 (TNY_IS_LIST(new_headers) && (tny_list_get_length (new_headers)) > 0) + modest_platform_on_new_headers_received (new_headers, + show_visual_notifications); + } gboolean @@ -1694,7 +1723,6 @@ do_send_receive_performer (gboolean canceled, info = (SendReceiveInfo *) user_data; if (err || canceled) { - goto clean; } @@ -1738,6 +1766,7 @@ do_send_receive_performer (gboolean canceled, */ void modest_ui_actions_do_send_receive (const gchar *account_name, + gboolean force_connection, ModestWindow *win) { gchar *acc_name = NULL; @@ -1769,7 +1798,8 @@ modest_ui_actions_do_send_receive (const gchar *account_name, TNY_ACCOUNT_TYPE_STORE); /* Invoke the connect and perform */ - modest_platform_connect_and_perform ((win) ? GTK_WINDOW (win) : NULL, info->account, + modest_platform_connect_and_perform ((win) ? GTK_WINDOW (win) : NULL, + force_connection, info->account, do_send_receive_performer, info); } @@ -1800,9 +1830,12 @@ modest_ui_actions_do_cancel_send (const gchar *account_name, MODEST_MAIL_OPERATION_ERROR_ITEM_NOT_FOUND, "modest: could not find send queue for account\n"); } else { - /* Keeep messages in outbox folder */ - tny_send_queue_cancel (send_queue, FALSE, &error); - } + /* Cancel the current send */ + tny_account_cancel (TNY_ACCOUNT (transport_account)); + + /* Suspend all pending messages */ + tny_send_queue_cancel (send_queue, TNY_SEND_QUEUE_CANCEL_ACTION_SUSPEND, &error); + } frees: if (transport_account != NULL) @@ -1848,7 +1881,8 @@ modest_ui_actions_cancel_send (GtkAction *action, ModestWindow *win) * updates */ void -modest_ui_actions_do_send_receive_all (ModestWindow *win) +modest_ui_actions_do_send_receive_all (ModestWindow *win, + gboolean force_connection) { GSList *account_names, *iter; @@ -1857,7 +1891,7 @@ modest_ui_actions_do_send_receive_all (ModestWindow *win) iter = account_names; while (iter) { - modest_ui_actions_do_send_receive ((const char*) iter->data, win); + modest_ui_actions_do_send_receive ((const char*) iter->data, force_connection, win); iter = g_slist_next (iter); } @@ -1898,8 +1932,8 @@ modest_ui_actions_on_send_receive (GtkAction *action, ModestWindow *win) g_object_unref (folder_store); } - /* Refresh the active account */ - modest_ui_actions_do_send_receive (NULL, win); + /* Refresh the active account. Force the connection if needed */ + modest_ui_actions_do_send_receive (NULL, TRUE, win); } @@ -2035,8 +2069,6 @@ folder_refreshed_cb (ModestMailOperation *mail_op, { ModestMainWindow *win = NULL; GtkWidget *header_view; - gboolean folder_empty = FALSE; - gboolean all_marked_as_deleted = FALSE; g_return_if_fail (TNY_IS_FOLDER (folder)); @@ -2051,14 +2083,12 @@ folder_refreshed_cb (ModestMailOperation *mail_op, if (current_folder != NULL && folder != current_folder) { g_object_unref (current_folder); return; - } - g_object_unref (current_folder); + } else if (current_folder) + g_object_unref (current_folder); } /* Check if folder is empty and set headers view contents style */ - folder_empty = (tny_folder_get_all_count (folder) == 0); - all_marked_as_deleted = modest_header_view_is_empty (MODEST_HEADER_VIEW(header_view)); - if (folder_empty || all_marked_as_deleted) + if (tny_folder_get_all_count (folder) == 0) modest_main_window_set_contents_style (win, MODEST_MAIN_WINDOW_CONTENTS_STYLE_EMPTY); } @@ -2243,11 +2273,16 @@ 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) - return; - - modest_msg_edit_window_set_draft (edit_window, saved_draft); + /* 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")); + } else { + modest_msg_edit_window_set_draft (edit_window, saved_draft); + } + g_object_unref(edit_window); } void @@ -2294,7 +2329,7 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi from = modest_account_mgr_get_from_string (account_mgr, account_name); /* Create the mail operation */ - mail_operation = modest_mail_operation_new (G_OBJECT(edit_window)); + mail_operation = modest_mail_operation_new (NULL); modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_operation); modest_mail_operation_save_to_drafts (mail_operation, @@ -2311,7 +2346,7 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi data->images, data->priority_flags, on_save_to_drafts_cb, - edit_window); + g_object_ref(edit_window)); info_text = g_strdup_printf (_("mail_va_saved_to_drafts"), _("mcen_me_folder_drafts")); modest_platform_information_banner (NULL, NULL, info_text); @@ -2382,7 +2417,7 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window) ModestAccountMgr *account_mgr = modest_runtime_get_account_mgr(); gchar *account_name = g_strdup (data->account_name); if (!account_name) - g_strdup(modest_window_get_active_account (MODEST_WINDOW(edit_window))); + account_name = g_strdup(modest_window_get_active_account (MODEST_WINDOW(edit_window))); if (!account_name) account_name = modest_account_mgr_get_default_account (account_mgr); @@ -2390,8 +2425,9 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window) if (!account_name) { modest_msg_edit_window_free_msg_data (edit_window, data); /* Run account setup wizard */ - if (!modest_ui_actions_run_account_setup_wizard (MODEST_WINDOW(edit_window))) + if (!modest_ui_actions_run_account_setup_wizard (MODEST_WINDOW(edit_window))) { return; + } } /* Get the currently-active transport account for this modest account: */ @@ -2402,6 +2438,7 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window) } if (!transport_account) { + modest_msg_edit_window_free_msg_data (edit_window, data); /* Run account setup wizard */ if (!modest_ui_actions_run_account_setup_wizard(MODEST_WINDOW(edit_window))) return; @@ -2410,7 +2447,7 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window) gchar *from = modest_account_mgr_get_from_string (account_mgr, account_name); /* Create the mail operation */ - ModestMailOperation *mail_operation = modest_mail_operation_new (G_OBJECT(edit_window)); + ModestMailOperation *mail_operation = modest_mail_operation_new (NULL); modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_operation); modest_mail_operation_send_new_mail (mail_operation, @@ -2596,22 +2633,28 @@ do_create_folder_cb (ModestMailOperation *mail_op, gpointer user_data) { gchar *suggested_name = (gchar *) user_data; - GtkWindow *main_window = (GtkWindow *) modest_mail_operation_get_source (mail_op); + 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 (main_window), NULL, + modest_platform_information_banner (GTK_WIDGET (source_win), NULL, _("mail_in_ui_folder_create_error")); /* Try again */ - do_create_folder (main_window, parent_folder, (const gchar *) suggested_name); + 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; - folder_view = - modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (main_window), - MODEST_MAIN_WINDOW_WIDGET_TYPE_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); @@ -2619,7 +2662,7 @@ do_create_folder_cb (ModestMailOperation *mail_op, } /* Free. Note that the first time it'll be NULL so noop */ g_free (suggested_name); - g_object_unref (main_window); + g_object_unref (source_win); } static void @@ -2651,6 +2694,25 @@ do_create_folder (GtkWindow *parent_window, } } +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 modest_ui_actions_create_folder(GtkWidget *parent_window, @@ -2661,11 +2723,12 @@ modest_ui_actions_create_folder(GtkWidget *parent_window, parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view)); if (parent_folder) { - - /* Run the new folder dialog */ - do_create_folder (GTK_WINDOW (parent_window), parent_folder, 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), + TRUE, + parent_folder, + create_folder_performer, + parent_folder); } } @@ -2716,8 +2779,21 @@ typedef struct { } RenameFolderInfo; static void -on_rename_folder_cb (gboolean canceled, GError *err, GtkWindow *parent_window, - TnyAccount *account, gpointer user_data) +on_rename_folder_cb (ModestMailOperation *mail_op, + TnyFolder *new_folder, + gpointer user_data) +{ + /* Select now */ + modest_folder_view_select_folder (MODEST_FOLDER_VIEW (user_data), + new_folder, FALSE); +} + +static void +on_rename_folder_performer (gboolean canceled, + GError *err, + GtkWindow *parent_window, + TnyAccount *account, + gpointer user_data) { ModestMailOperation *mail_op = NULL; GtkTreeSelection *sel = NULL; @@ -2742,20 +2818,12 @@ on_rename_folder_cb (gboolean canceled, GError *err, GtkWindow *parent_window, sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (folder_view)); gtk_tree_selection_unselect_all (sel); - /* Select *after* the changes */ - modest_folder_view_select_folder (MODEST_FOLDER_VIEW(folder_view), - TNY_FOLDER(data->folder), TRUE); - /* Actually rename the folder */ modest_mail_operation_rename_folder (mail_op, - TNY_FOLDER (data->folder), - (const gchar *) (data->new_name)); - - /* TODO folder view filter refilter */ - /* - GtkTreeModel *tree_model = gtk_tree_view_get_model (GTK_TREE_VIEW (folder_view)); - if (GTK_IS_TREE_MODEL_FILTER (tree_model)) - gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (tree_model)); */ + TNY_FOLDER (data->folder), + (const gchar *) (data->new_name), + on_rename_folder_cb, + folder_view); } g_object_unref (mail_op); @@ -2809,8 +2877,8 @@ modest_ui_actions_on_rename_folder (GtkAction *action, RenameFolderInfo *rename_folder_data = g_new0 (RenameFolderInfo, 1); rename_folder_data->folder = folder; rename_folder_data->new_name = folder_name; - modest_platform_connect_if_remote_and_perform (GTK_WINDOW(main_window), - folder, on_rename_folder_cb, rename_folder_data); + modest_platform_connect_if_remote_and_perform (GTK_WINDOW(main_window), TRUE, + folder, on_rename_folder_performer, rename_folder_data); } } g_object_unref (folder); @@ -2912,9 +2980,11 @@ delete_folder (ModestMainWindow *main_window, gboolean move_to_trash) info->folder = folder; info->move_to_trash = move_to_trash; g_object_ref (G_OBJECT (info->folder)); - TnyAccount *account = tny_folder_get_account(TNY_FOLDER(folder)); - modest_platform_connect_and_perform (GTK_WINDOW (main_window), - account, on_delete_folder_cb, info); + TnyAccount *account = tny_folder_get_account (TNY_FOLDER (folder)); + modest_platform_connect_if_remote_and_perform (GTK_WINDOW (main_window), + TRUE, + TNY_FOLDER_STORE (account), + on_delete_folder_cb, info); g_object_unref (account); } g_object_unref (G_OBJECT (folder)); @@ -3284,7 +3354,17 @@ modest_ui_actions_on_redo (GtkAction *action, static void -destroy_information_note (ModestMailOperation *mail_op, gpointer user_data) +destroy_information_note (ModestMailOperation *mail_op, + gpointer user_data) +{ + /* destroy information note */ + gtk_widget_destroy (GTK_WIDGET(user_data)); +} + +static void +destroy_folder_information_note (ModestMailOperation *mail_op, + TnyFolder *new_folder, + gpointer user_data) { /* destroy information note */ gtk_widget_destroy (GTK_WIDGET(user_data)); @@ -3429,7 +3509,7 @@ modest_ui_actions_on_paste (GtkAction *action, src_folder, folder_store, delete, - destroy_information_note, + destroy_folder_information_note, inf_note); } @@ -3771,18 +3851,27 @@ 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 (display_name == NULL) + display_name = " "; + + 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. */ - if (display_name) - gtk_window_set_title (window, display_name); - else - gtk_window_set_title (window, " "); + gtk_window_set_title (window, display_name); + } void @@ -3854,10 +3943,15 @@ on_move_to_dialog_folder_selection_changed (ModestFolderView* self, if ((gpointer) local_account != (gpointer) folder_store && (gpointer) mmc_account != (gpointer) folder_store) { + const char *proto_name = tny_account_get_proto (TNY_ACCOUNT (folder_store)); + ModestTransportStoreProtocol proto = MODEST_PROTOCOL_STORE_MAILDIR; + if (proto_name != NULL) { + proto = modest_protocol_info_get_transport_store_protocol (proto_name); + } is_local_account = FALSE; /* New button should be dimmed on remote - account root */ - new_sensitive = FALSE; + POP account root */ + new_sensitive = (proto != MODEST_PROTOCOL_STORE_POP); } g_object_unref (local_account); } @@ -3936,6 +4030,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, @@ -4024,9 +4128,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 */ @@ -4136,10 +4247,9 @@ modest_ui_actions_msgs_move_to_confirmation (ModestWindow *win, return response; } - - static void -move_to_cb (ModestMailOperation *mail_op, gpointer user_data) +move_to_cb (ModestMailOperation *mail_op, + gpointer user_data) { MoveToHelper *helper = (MoveToHelper *) user_data; @@ -4152,10 +4262,14 @@ move_to_cb (ModestMailOperation *mail_op, gpointer user_data) if (MODEST_IS_MSG_VIEW_WINDOW (object)) { ModestMsgViewWindow *self = MODEST_MSG_VIEW_WINDOW (object); - if (!modest_msg_view_window_select_next_message (self)) - if (!modest_msg_view_window_select_previous_message (self)) - /* No more messages to view, so close this window */ - modest_ui_actions_on_close_window (NULL, MODEST_WINDOW(self)); + if (modest_msg_view_window_last_message_selected (self) && + modest_msg_view_window_first_message_selected (self)) { + modest_ui_actions_on_close_window (NULL, MODEST_WINDOW (self)); + } else if (!modest_msg_view_window_select_next_message (self) && + !modest_msg_view_window_select_previous_message (self)) { + /* No more messages to view, so close this window */ + modest_ui_actions_on_close_window (NULL, MODEST_WINDOW(self)); + } } else if (MODEST_IS_MAIN_WINDOW (object) && helper->reference != NULL) { GtkWidget *header_view; GtkTreePath *path; @@ -4178,6 +4292,21 @@ move_to_cb (ModestMailOperation *mail_op, gpointer user_data) g_free (helper); } +static void +folder_move_to_cb (ModestMailOperation *mail_op, + TnyFolder *new_folder, + gpointer user_data) +{ + move_to_cb (mail_op, user_data); +} + +static void +msgs_move_to_cb (ModestMailOperation *mail_op, + gpointer user_data) +{ + move_to_cb (mail_op, user_data); +} + void modest_ui_actions_move_folder_error_handler (ModestMailOperation *mail_op, gpointer user_data) @@ -4380,8 +4509,8 @@ modest_ui_actions_on_main_window_remove_attachments (GtkAction *action, */ static void xfer_messages_from_move_to_cb (gboolean canceled, GError *err, - GtkWindow *parent_window, - TnyAccount *account, gpointer user_data) + GtkWindow *parent_window, + TnyAccount *account, gpointer user_data) { TnyFolderStore *dst_folder = TNY_FOLDER_STORE (user_data); ModestWindow *win = MODEST_WINDOW (parent_window); @@ -4394,13 +4523,6 @@ xfer_messages_from_move_to_cb (gboolean canceled, GError *err, g_object_unref (dst_folder); return; } - - if (!TNY_IS_FOLDER (dst_folder)) { - modest_platform_information_banner (GTK_WIDGET (win), - NULL, - _CS("ckdg_ib_unable_to_move_to_current_location")); - return; - } dst_account = tny_folder_get_account (TNY_FOLDER (dst_folder)); proto_str = tny_account_get_proto (dst_account); @@ -4456,7 +4578,7 @@ xfer_messages_from_move_to_cb (gboolean canceled, GError *err, headers, TNY_FOLDER (dst_folder), TRUE, - move_to_cb, + msgs_move_to_cb, helper); g_object_unref (G_OBJECT (mail_op)); @@ -4465,6 +4587,36 @@ xfer_messages_from_move_to_cb (gboolean canceled, GError *err, } typedef struct { + TnyAccount *dst_account; + ModestConnectedPerformer callback; + gpointer data; +} DoubleConnectionInfo; + +static void +src_account_connect_performer (gboolean canceled, + GError *err, + GtkWindow *parent_window, + TnyAccount *src_account, + gpointer user_data) +{ + DoubleConnectionInfo *info = (DoubleConnectionInfo *) user_data; + + if (canceled || err) { + /* If there was any error call the user callback */ + info->callback (canceled, err, parent_window, src_account, info->data); + } else { + /* Connect the destination account */ + modest_platform_connect_if_remote_and_perform (parent_window, TRUE, + TNY_FOLDER_STORE (info->dst_account), + info->callback, info->data); + } + + /* Free the info object */ + g_object_unref (info->dst_account); + g_slice_free (DoubleConnectionInfo, info); +} + +typedef struct { TnyFolder *src_folder; TnyFolderStore *dst_folder; gboolean delete_original; @@ -4522,11 +4674,13 @@ on_move_folder_cb (gboolean canceled, GError *err, GtkWindow *parent_window, TNY_FOLDER (info->src_folder), info->dst_folder, info->delete_original, - move_to_cb, + folder_move_to_cb, helper); - - modest_folder_view_select_folder (MODEST_FOLDER_VIEW(info->folder_view), - TNY_FOLDER (info->dst_folder), TRUE); + + if (modest_mail_operation_get_status (mail_op) == MODEST_MAIL_OPERATION_STATUS_SUCCESS) { + modest_folder_view_select_folder (MODEST_FOLDER_VIEW(info->folder_view), + TNY_FOLDER (info->dst_folder), TRUE); + } /* Unref mail operation */ g_object_unref (G_OBJECT (mail_op)); @@ -4563,8 +4717,8 @@ modest_ui_actions_on_main_window_move_to (GtkAction *action, /* Allow only to transfer folders to the local root folder */ if (TNY_IS_ACCOUNT (dst_folder) && - !MODEST_IS_TNY_LOCAL_FOLDERS_ACCOUNT (dst_folder)) { - do_xfer = FALSE; + !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; @@ -4584,30 +4738,53 @@ modest_ui_actions_on_main_window_move_to (GtkAction *action, info->folder_view = folder_view; g_object_ref (G_OBJECT (info->src_folder)); g_object_ref (G_OBJECT (info->dst_folder)); - modest_platform_connect_if_remote_and_perform(GTK_WINDOW (win), + modest_platform_connect_if_remote_and_perform(GTK_WINDOW (win), TRUE, TNY_FOLDER_STORE (dst_folder), on_move_folder_cb, info); } } else if (gtk_widget_is_focus (GTK_WIDGET(header_view))) { gboolean do_xfer = TRUE; + + /* Show an error when trying to move msgs to an account */ + if (!TNY_IS_FOLDER (dst_folder)) { + modest_platform_information_banner (GTK_WIDGET (win), + NULL, + _CS("ckdg_ib_unable_to_move_to_current_location")); + goto free; + } + /* Ask for confirmation if the source folder is remote and we're not connected */ if (!online && modest_tny_folder_store_is_remote(src_folder)) { TnyList *headers = modest_header_view_get_selected_headers(header_view); if (!msgs_already_deleted_from_server(headers, src_folder)) { guint num_headers = tny_list_get_length(headers); TnyAccount *account = get_account_from_header_list (headers); - if (!connect_to_get_msg(MODEST_WINDOW (win), num_headers, account)) + GtkResponseType response; + + response = modest_platform_run_confirmation_dialog (GTK_WINDOW (win), + ngettext("mcen_nc_get_msg", + "mcen_nc_get_msgs", + num_headers)); + if (response == GTK_RESPONSE_CANCEL) do_xfer = FALSE; + g_object_unref (account); } g_object_unref(headers); } if (do_xfer) /* Transfer messages */ { - g_object_ref (dst_folder); - modest_platform_connect_if_remote_and_perform(GTK_WINDOW (win), - TNY_FOLDER_STORE (dst_folder), xfer_messages_from_move_to_cb, dst_folder); + DoubleConnectionInfo *info = g_slice_new (DoubleConnectionInfo); + info->callback = xfer_messages_from_move_to_cb; + info->dst_account = tny_folder_get_account (TNY_FOLDER (dst_folder)); + info->data = g_object_ref (dst_folder); + + modest_platform_connect_if_remote_and_perform(GTK_WINDOW (win), TRUE, + TNY_FOLDER_STORE (src_folder), + src_account_connect_performer, + info); } } + free: if (src_folder) g_object_unref (src_folder); } @@ -4647,7 +4824,7 @@ modest_ui_actions_on_msg_view_window_move_to (GtkAction *action, if (do_xfer) { g_object_ref (dst_folder); - modest_platform_connect_if_remote_and_perform(GTK_WINDOW (win), + modest_platform_connect_if_remote_and_perform(GTK_WINDOW (win), TRUE, TNY_FOLDER_STORE (dst_folder), xfer_messages_from_move_to_cb, dst_folder); } g_object_unref (account); @@ -4836,7 +5013,6 @@ retrieve_msg_contents_performer (gboolean canceled, TnyList *headers = TNY_LIST (user_data); if (err || canceled) { - /* Show an error ? */ goto out; } @@ -4879,7 +5055,7 @@ modest_ui_actions_on_retrieve_msg_contents (GtkAction *action, g_object_unref (iter); /* Connect and perform the message retrieval */ - modest_platform_connect_and_perform ((GtkWindow *) window, + modest_platform_connect_and_perform ((GtkWindow *) window, TRUE, g_object_ref (account), retrieve_msg_contents_performer, g_object_ref (headers)); @@ -4890,13 +5066,31 @@ modest_ui_actions_on_retrieve_msg_contents (GtkAction *action, } void +modest_ui_actions_check_toolbar_dimming_rules (ModestWindow *window) +{ + g_return_if_fail (MODEST_IS_WINDOW (window)); + + /* Update dimmed */ + modest_window_check_dimming_rules_group (window, MODEST_DIMMING_RULES_TOOLBAR); +} + +void +modest_ui_actions_check_menu_dimming_rules (ModestWindow *window) +{ + g_return_if_fail (MODEST_IS_WINDOW (window)); + + /* Update dimmed */ + modest_window_check_dimming_rules_group (window, MODEST_DIMMING_RULES_MENU); +} + +void modest_ui_actions_on_email_menu_activated (GtkAction *action, ModestWindow *window) { g_return_if_fail (MODEST_IS_WINDOW (window)); - /* Update dimmed */ - modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules"); + /* Update dimmed */ + modest_ui_actions_check_menu_dimming_rules (window); } void @@ -4905,8 +5099,8 @@ modest_ui_actions_on_edit_menu_activated (GtkAction *action, { g_return_if_fail (MODEST_IS_WINDOW (window)); - /* Update dimmed */ - modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules"); + /* Update dimmed */ + modest_ui_actions_check_menu_dimming_rules (window); } void @@ -4915,8 +5109,8 @@ modest_ui_actions_on_view_menu_activated (GtkAction *action, { g_return_if_fail (MODEST_IS_WINDOW (window)); - /* Update dimmed */ - modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules"); + /* Update dimmed */ + modest_ui_actions_check_menu_dimming_rules (window); } void @@ -4925,8 +5119,8 @@ modest_ui_actions_on_format_menu_activated (GtkAction *action, { g_return_if_fail (MODEST_IS_WINDOW (window)); - /* Update dimmed */ - modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules"); + /* Update dimmed */ + modest_ui_actions_check_menu_dimming_rules (window); } void @@ -4935,8 +5129,8 @@ modest_ui_actions_on_tools_menu_activated (GtkAction *action, { g_return_if_fail (MODEST_IS_WINDOW (window)); - /* Update dimmed */ - modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules"); + /* Update dimmed */ + modest_ui_actions_check_menu_dimming_rules (window); } void @@ -4945,8 +5139,8 @@ modest_ui_actions_on_attachment_menu_activated (GtkAction *action, { g_return_if_fail (MODEST_IS_WINDOW (window)); - /* Update dimmed */ - modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules"); + /* Update dimmed */ + modest_ui_actions_check_menu_dimming_rules (window); } void @@ -4955,8 +5149,8 @@ modest_ui_actions_on_toolbar_csm_menu_activated (GtkAction *action, { g_return_if_fail (MODEST_IS_WINDOW (window)); - /* Update dimmed */ - modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules"); + /* Update dimmed */ + modest_ui_actions_check_menu_dimming_rules (window); } void @@ -4965,8 +5159,8 @@ modest_ui_actions_on_folder_view_csm_menu_activated (GtkAction *action, { g_return_if_fail (MODEST_IS_WINDOW (window)); - /* Update dimmed */ - modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules"); + /* Update dimmed */ + modest_ui_actions_check_menu_dimming_rules (window); } void @@ -4975,17 +5169,8 @@ modest_ui_actions_on_header_view_csm_menu_activated (GtkAction *action, { g_return_if_fail (MODEST_IS_WINDOW (window)); - /* Update dimmed */ - modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules"); -} - -void -modest_ui_actions_check_toolbar_dimming_rules (ModestWindow *window) -{ - g_return_if_fail (MODEST_IS_WINDOW (window)); - - /* Update dimmed */ - modest_window_check_dimming_rules_group (window, "ModestToolbarDimmingRules"); + /* Update dimmed */ + modest_ui_actions_check_menu_dimming_rules (window); } void @@ -5079,7 +5264,7 @@ modest_ui_actions_on_send_queue_error_happened (TnySendQueue *self, gchar *message = NULL; /* Don't show anything if the user cancelled something */ - if (err->code == TNY_TRANSPORT_ACCOUNT_ERROR_SEND_USER_CANCEL) + if (err->code == TNY_SYSTEM_ERROR_CANCEL) return; /* Get the server name: */ @@ -5096,20 +5281,20 @@ modest_ui_actions_on_send_queue_error_happened (TnySendQueue *self, /* Show the appropriate message text for the GError: */ switch (err->code) { - case TNY_TRANSPORT_ACCOUNT_ERROR_SEND_HOST_LOOKUP_FAILED: + case TNY_SERVICE_ERROR_CONNECT: message = g_strdup_printf (_("emev_ib_ui_smtp_server_invalid"), server_name); break; - case TNY_TRANSPORT_ACCOUNT_ERROR_SEND_SERVICE_UNAVAILABLE: - message = g_strdup_printf (_("emev_ib_ui_smtp_server_invalid"), server_name); - break; - case TNY_TRANSPORT_ACCOUNT_ERROR_SEND_AUTHENTICATION_NOT_SUPPORTED: + case TNY_SERVICE_ERROR_AUTHENTICATE: message = g_strdup_printf (_("emev_ni_ui_smtp_authentication_fail_error"), server_name); break; - case TNY_TRANSPORT_ACCOUNT_ERROR_SEND: + case TNY_SERVICE_ERROR_SEND: message = g_strdup (_("emev_ib_ui_smtp_send_error")); break; default: - g_return_if_reached (); + g_warning ("%s: unexpected 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 @@ -5161,6 +5346,10 @@ modest_ui_actions_on_send_queue_status_changed (ModestTnySendQueue *send_queue, #else gtk_widget_queue_draw (header_view); #endif + + /* Rerun dimming rules, because the message could become deletable for example */ + modest_window_check_dimming_rules_group (MODEST_WINDOW (main_window), + MODEST_DIMMING_RULES_TOOLBAR); /* Free */ frees: