X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-ui-actions.c;h=9d6c94413cb195739ff895e4234ef4841991df82;hp=14a7f2875e084da948b25541607b9694bf1d891d;hb=f9300629125062bd4d908bd1211a8b8f697adecf;hpb=ddc32226d354be5269f426342dcf5cfef14e4f79 diff --git a/src/modest-ui-actions.c b/src/modest-ui-actions.c index 14a7f28..9d6c944 100644 --- a/src/modest-ui-actions.c +++ b/src/modest-ui-actions.c @@ -237,27 +237,49 @@ headers_action_mark_as_unread (TnyHeader *header, } } - -static void -headers_action_delete (TnyHeader *header, - ModestWindow *win, - gpointer user_data) +/** A convenience method, because deleting a message is + * otherwise complicated, and it's best to change it in one place + * when we change it. + */ +void modest_do_message_delete (TnyHeader *header, ModestWindow *win) { ModestMailOperation *mail_op = NULL; - - mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_DELETE, G_OBJECT(win)); + mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_DELETE, + win ? G_OBJECT(win) : NULL); modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op); /* Always delete. TODO: Move to trash still not supported */ modest_mail_operation_remove_msg (mail_op, header, FALSE); g_object_unref (G_OBJECT (mail_op)); +} - /* refilter treemodel to hide marked-as-deleted rows */ +static void +headers_action_delete (TnyHeader *header, + ModestWindow *win, + gpointer user_data) +{ + modest_do_message_delete (header, win); + +/* refilter treemodel to hide marked-as-deleted rows */ /* if (MODEST_IS_HEADER_VIEW (user_data)) */ /* modest_header_view_refilter (MODEST_HEADER_VIEW (user_data)); */ } +/** After deleing a message that is currently visible in a window, + * show the next message from the list, or close the window if there are no more messages. + **/ +void modest_ui_actions_refresh_message_window_after_delete (ModestMsgViewWindow* win) +{ + /* Close msg view window or select next */ + 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 { + modest_msg_view_window_select_next_message (win); + } +} + void modest_ui_actions_on_delete_message (GtkAction *action, ModestWindow *win) { @@ -284,7 +306,7 @@ modest_ui_actions_on_delete_message (GtkAction *action, ModestWindow *win) header_list = get_selected_headers (win); if (!header_list) return; - /* Check if any of the headers is already opened, or in the process of being opened */ + /* Check if any of the headers are already opened, or in the process of being opened */ if (MODEST_IS_MAIN_WINDOW (win)) { gboolean found; iter = tny_list_create_iterator (header_list); @@ -324,7 +346,8 @@ modest_ui_actions_on_delete_message (GtkAction *action, ModestWindow *win) message = g_strdup_printf(ngettext("emev_nc_delete_message", "emev_nc_delete_messages", tny_list_get_length(header_list)), desc); - /* Confirmation dialog */ + /* Confirmation dialog */ + printf("DEBUG: %s\n", __FUNCTION__); response = modest_platform_run_confirmation_dialog (GTK_WINDOW (win), message); @@ -357,13 +380,7 @@ modest_ui_actions_on_delete_message (GtkAction *action, ModestWindow *win) do_headers_action (win, headers_action_delete, header_view); if (MODEST_IS_MSG_VIEW_WINDOW (win)) { - /* Close msg view window or select next */ - if (modest_msg_view_window_last_message_selected (MODEST_MSG_VIEW_WINDOW (win)) && - modest_msg_view_window_first_message_selected (MODEST_MSG_VIEW_WINDOW (win))) { - modest_ui_actions_on_close_window (NULL, MODEST_WINDOW (win)); - } else { - modest_msg_view_window_select_next_message (MODEST_MSG_VIEW_WINDOW (win)); - } + modest_ui_actions_refresh_message_window_after_delete (MODEST_MSG_VIEW_WINDOW (win)); /* Get main window */ mgr = modest_runtime_get_window_mgr (); @@ -701,8 +718,6 @@ open_msg_cb (ModestMailOperation *mail_op, 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; } @@ -713,9 +728,9 @@ open_msg_cb (ModestMailOperation *mail_op, headers_action_mark_as_read (header, MODEST_WINDOW(parent_win), NULL); /* Get account */ - account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr()); + account = g_strdup (modest_window_get_active_account (MODEST_WINDOW (parent_win))); if (!account) - account = g_strdup (modest_window_get_active_account (MODEST_WINDOW (parent_win))); + account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr()); /* Gets folder type (OUTBOX headers will be opened in edit window */ if (modest_tny_folder_is_local_folder (folder)) @@ -874,7 +889,7 @@ _modest_ui_actions_open (TnyList *headers, ModestWindow *win) * 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)); + gboolean connected = modest_platform_connect_and_wait (GTK_WINDOW (win), NULL); /* Don't go further if a connection would be necessary but none is available: */ if (!connected) { @@ -1143,7 +1158,7 @@ download_uncached_messages (TnyList *header_list, GtkWindow *win, retval = FALSE; else { /* If a download will be necessary, make sure that we have a connection: */ - retval = modest_platform_connect_and_wait(win); + retval = modest_platform_connect_and_wait(win, NULL); } } return retval; @@ -1195,6 +1210,7 @@ reply_forward (ReplyForwardAction action, ModestWindow *win) rf_helper->reply_forward_type = reply_forward_type; rf_helper->action = action; rf_helper->account_name = g_strdup (modest_window_get_active_account (win)); + if ((win != NULL) && (MODEST_IS_WINDOW (win))) rf_helper->parent_window = GTK_WIDGET (win); if (!rf_helper->account_name) @@ -1328,8 +1344,11 @@ modest_ui_actions_on_sort (GtkAction *action, GtkWidget *header_view; header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(window), MODEST_WIDGET_TYPE_HEADER_VIEW); - if (!header_view) + if (!header_view) { + modest_platform_information_banner (NULL, NULL, _CS("ckdg_ib_nothing_to_sort")); + return; + } /* Show sorting dialog */ modest_platform_run_sort_dialog (GTK_WINDOW (window), MODEST_SORT_HEADERS); @@ -1655,6 +1674,7 @@ folder_refreshed_cb (ModestMailOperation *mail_op, { ModestMainWindow *win = NULL; GtkWidget *header_view; + TnyFolder *current_folder; g_return_if_fail (TNY_IS_FOLDER (folder)); @@ -1662,6 +1682,13 @@ folder_refreshed_cb (ModestMailOperation *mail_op, header_view = modest_main_window_get_child_widget(win, MODEST_WIDGET_TYPE_HEADER_VIEW); + if (header_view) { + current_folder = modest_header_view_get_folder (MODEST_HEADER_VIEW (header_view)); + if (current_folder != NULL && folder != current_folder) { + return; + } + } + /* Check if folder is empty and set headers view contents style */ if (tny_folder_get_all_count (folder) == 0) { printf ("DEBUG: %s: tny_folder_get_all_count() returned 0.\n", __FUNCTION__); @@ -1910,7 +1937,7 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window) return; /* Offer the connection dialog, if necessary: */ - if (!modest_platform_connect_and_wait (GTK_WINDOW (edit_window))) + if (!modest_platform_connect_and_wait (GTK_WINDOW (edit_window), NULL)) return; /* FIXME: Code added just for testing. The final version will @@ -2155,33 +2182,20 @@ modest_ui_actions_new_folder_error_handler (ModestMailOperation *mail_op, gpointer user_data) { ModestMainWindow *window = MODEST_MAIN_WINDOW (user_data); + const GError *error = modest_mail_operation_get_error (mail_op); - /* TODO: Note that folder creation might go wrong due to other - * failures such as when the parent folder is non-writable. We can - * query a GError* with modest_mail_operation_get_error(), but the - * the error code (from tinymail) does not give us a clue about what - * has gone wrong. We might use the error->message but it might come - * from camel and not be suitable to show to the user directly. */ - modest_platform_information_banner (GTK_WIDGET (window), NULL, - _CS("ckdg_ib_folder_already_exists")); - -/* modest_platform_information_banner (GTK_WIDGET (window), NULL, - modest_mail_operation_get_error (mail_op)->message);*/ + if(error) + { + modest_platform_information_banner (GTK_WIDGET (window), NULL, + modest_mail_operation_get_error (mail_op)->message); + } } - -void -modest_ui_actions_on_new_folder (GtkAction *action, ModestMainWindow *main_window) +static void +modest_ui_actions_create_folder(GtkWidget *parent_window, + GtkWidget *folder_view) { TnyFolderStore *parent_folder; - GtkWidget *folder_view; - - g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window)); - - folder_view = modest_main_window_get_child_widget (main_window, - MODEST_WIDGET_TYPE_FOLDER_VIEW); - if (!folder_view) - return; parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view)); @@ -2192,7 +2206,7 @@ modest_ui_actions_on_new_folder (GtkAction *action, ModestMainWindow *main_windo /* Run the new folder dialog */ while (!finished) { - result = modest_platform_run_new_folder_dialog (GTK_WINDOW (main_window), + result = modest_platform_run_new_folder_dialog (GTK_WINDOW (parent_window), parent_folder, suggested_name, &folder_name); @@ -2207,9 +2221,9 @@ modest_ui_actions_on_new_folder (GtkAction *action, ModestMainWindow *main_windo TnyFolder *new_folder = NULL; mail_op = modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_INFO, - G_OBJECT(main_window), + G_OBJECT(parent_window), modest_ui_actions_new_folder_error_handler, - main_window); + parent_window); modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op); @@ -2217,13 +2231,8 @@ modest_ui_actions_on_new_folder (GtkAction *action, ModestMainWindow *main_windo parent_folder, (const gchar *) folder_name); if (new_folder) { - if (main_window) { - folder_view = modest_main_window_get_child_widget (main_window, - MODEST_WIDGET_TYPE_FOLDER_VIEW); - if (folder_view) - modest_folder_view_select_folder (MODEST_FOLDER_VIEW(folder_view), - new_folder, TRUE); - } + modest_folder_view_select_folder (MODEST_FOLDER_VIEW(folder_view), + new_folder, TRUE); g_object_unref (new_folder); finished = TRUE; @@ -2239,6 +2248,21 @@ modest_ui_actions_on_new_folder (GtkAction *action, ModestMainWindow *main_windo } } +void +modest_ui_actions_on_new_folder (GtkAction *action, ModestMainWindow *main_window) +{ + GtkWidget *folder_view; + + g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window)); + + folder_view = modest_main_window_get_child_widget (main_window, + MODEST_WIDGET_TYPE_FOLDER_VIEW); + if (!folder_view) + return; + + modest_ui_actions_create_folder (GTK_WIDGET (main_window), folder_view); +} + static void modest_ui_actions_rename_folder_error_handler (ModestMailOperation *mail_op, gpointer user_data) @@ -2282,6 +2306,8 @@ 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)) { @@ -2290,7 +2316,7 @@ modest_ui_actions_on_rename_folder (GtkAction *action, } - if (folder && TNY_IS_FOLDER (folder)) { + if (TNY_IS_FOLDER (folder)) { gchar *folder_name; gint response; const gchar *current_name; @@ -2317,6 +2343,9 @@ modest_ui_actions_on_rename_folder (GtkAction *action, modest_folder_view_select_folder (MODEST_FOLDER_VIEW(folder_view), TNY_FOLDER(folder), TRUE); + + modest_header_view_clear ((ModestHeaderView *) header_view); + modest_mail_operation_rename_folder (mail_op, TNY_FOLDER (folder), (const gchar *) folder_name); @@ -2324,8 +2353,8 @@ modest_ui_actions_on_rename_folder (GtkAction *action, g_object_unref (mail_op); g_free (folder_name); } - g_object_unref (folder); } + g_object_unref (folder); } static void @@ -3127,6 +3156,12 @@ modest_ui_actions_on_check_names (GtkAction *action, ModestMsgEditWindow *window modest_msg_edit_window_check_names (window); } +static void +create_move_to_dialog_on_new_folder(GtkWidget *button, gpointer user_data) +{ + modest_ui_actions_create_folder (gtk_widget_get_toplevel (button), + GTK_WIDGET (user_data)); +} static GtkWidget* create_move_to_dialog (GtkWindow *win, @@ -3134,15 +3169,19 @@ create_move_to_dialog (GtkWindow *win, GtkWidget **tree_view) { GtkWidget *dialog, *scroll; + GtkWidget *new_button; dialog = gtk_dialog_new_with_buttons (_("mcen_ti_moveto_folders_title"), GTK_WINDOW (win), GTK_DIALOG_MODAL | GTK_DIALOG_NO_SEPARATOR | GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_STOCK_OK, - GTK_RESPONSE_ACCEPT, - GTK_STOCK_CANCEL, - GTK_RESPONSE_REJECT, - NULL); + NULL); + + gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_OK, GTK_RESPONSE_ACCEPT); + /* We do this manually so GTK+ does not associate a response ID for + * the button. */ + new_button = gtk_button_new_from_stock (GTK_STOCK_NEW); + gtk_box_pack_end (GTK_BOX (GTK_DIALOG (dialog)->action_area), new_button, FALSE, FALSE, 0); + gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT); /* Create scrolled window */ scroll = gtk_scrolled_window_new (NULL, NULL); @@ -3153,6 +3192,8 @@ create_move_to_dialog (GtkWindow *win, /* Create folder view */ *tree_view = modest_platform_create_folder_view (NULL); + g_signal_connect (G_OBJECT (new_button), "clicked", G_CALLBACK(create_move_to_dialog_on_new_folder), *tree_view); + /* It could happen that we're trying to move a message from a window (msg window for example) after the main window was closed, so we can not just get the model of the folder @@ -3170,9 +3211,10 @@ create_move_to_dialog (GtkWindow *win, /* Add scroll to dialog */ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), - scroll, FALSE, FALSE, 0); + scroll, TRUE, TRUE, 0); gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox)); + gtk_window_set_default_size (GTK_WINDOW (dialog), 300, 300); return dialog; } @@ -3325,10 +3367,13 @@ open_msg_for_purge_cb (ModestMailOperation *mail_op, gint pending_purges = 0; gboolean some_purged = FALSE; ModestWindow *win = MODEST_WINDOW (user_data); + ModestWindowMgr *mgr = modest_runtime_get_window_mgr (); /* If there was any error */ - if (!modest_ui_actions_msg_retrieval_check (mail_op, header, msg)) + if (!modest_ui_actions_msg_retrieval_check (mail_op, header, msg)) { + modest_window_mgr_unregister_header (mgr, header); return; + } /* Once the message has been retrieved for purging, we check if * it's all ok for purging */ @@ -3380,6 +3425,7 @@ open_msg_for_purge_cb (ModestMailOperation *mail_op, g_object_unref (part); tny_iterator_next (iter); } + modest_window_mgr_unregister_header (mgr, header); g_object_unref (iter); g_object_unref (parts); @@ -3611,7 +3657,6 @@ modest_ui_actions_on_move_to (GtkAction *action, /* Create and run the dialog */ dialog = create_move_to_dialog (GTK_WINDOW (win), folder_view, &tree_view); - modest_folder_view_show_non_move_folders (MODEST_FOLDER_VIEW (tree_view), TRUE); modest_folder_view_select_first_inbox_or_local (MODEST_FOLDER_VIEW (tree_view)); result = gtk_dialog_run (GTK_DIALOG(dialog)); g_object_ref (tree_view);