X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-ui-actions.c;h=bcef523208a2817d4b8583219f85ba8714bcfb80;hp=af25fa3912e53bd03d8d642572c805407f9a11bc;hb=3ddc19113ea89a4ec61a855f4856bde2143c4694;hpb=82b4090294813fb8a74184082e57caf67718a6d3 diff --git a/src/modest-ui-actions.c b/src/modest-ui-actions.c index af25fa3..bcef523 100644 --- a/src/modest-ui-actions.c +++ b/src/modest-ui-actions.c @@ -144,14 +144,58 @@ static void _on_send_receive_progress_changed (ModestMailOperation *mail_op ModestMailOperationState *state, gpointer user_data); -static gint header_list_count_uncached_msgs ( - TnyList *header_list, - GtkWindow *win); +static gint header_list_count_uncached_msgs (TnyList *header_list); static gboolean connect_to_get_msg ( GtkWindow *win, gint num_of_uncached_msgs); +static gboolean remote_folder_is_pop (const TnyFolderStore *folder); +static gboolean msgs_already_deleted_from_server ( TnyList *headers, + const TnyFolderStore *src_folder); + + +/* + * This function checks whether a TnyFolderStore is a pop account + */ +static gboolean +remote_folder_is_pop (const TnyFolderStore *folder) +{ + const gchar *proto = NULL; + TnyAccount *account = NULL; + + g_return_val_if_fail (TNY_IS_FOLDER_STORE(folder), FALSE); + + if (TNY_IS_ACCOUNT (folder)) { + account = TNY_ACCOUNT(folder); + g_object_ref(account); + } else if (TNY_IS_FOLDER (folder)) { + account = tny_folder_get_account(TNY_FOLDER(folder)); + } + + proto = tny_account_get_proto(account); + g_object_unref (account); + + return proto && + (modest_protocol_info_get_transport_store_protocol (proto) == MODEST_PROTOCOL_STORE_POP); +} + +/* + * This functions checks whether if a list of messages are already + * deleted from the server: that is, if the server is a POP account + * and all messages are already cached. + */ +static gboolean +msgs_already_deleted_from_server (TnyList *headers, const TnyFolderStore *src_folder) +{ + g_return_val_if_fail (TNY_IS_FOLDER_STORE(src_folder), FALSE); + g_return_val_if_fail (TNY_IS_LIST(headers), FALSE); + + gboolean src_is_pop = remote_folder_is_pop (src_folder); + gint uncached_msgs = header_list_count_uncached_msgs (headers); + + return (src_is_pop && !uncached_msgs); +} /* Show the account creation wizard dialog. * returns: TRUE if an account was created. FALSE if the user cancelled. @@ -452,8 +496,10 @@ modest_ui_actions_on_delete_message (GtkAction *action, ModestWindow *win) GtkTreeModel *model = NULL; GtkTreeSelection *sel = NULL; GList *sel_list = NULL, *tmp = NULL; - GtkTreeRowReference *row_reference = NULL; + GtkTreeRowReference *next_row_reference = NULL; + GtkTreeRowReference *prev_row_reference = NULL; GtkTreePath *next_path = NULL; + GtkTreePath *prev_path = NULL; GError *err = NULL; /* Find last selected row */ @@ -463,10 +509,14 @@ modest_ui_actions_on_delete_message (GtkAction *action, ModestWindow *win) sel_list = gtk_tree_selection_get_selected_rows (sel, &model); for (tmp=sel_list; tmp; tmp=tmp->next) { if (tmp->next == NULL) { + prev_path = gtk_tree_path_copy((GtkTreePath *) tmp->data); next_path = gtk_tree_path_copy((GtkTreePath *) tmp->data); + + gtk_tree_path_prev (prev_path); gtk_tree_path_next (next_path); - row_reference = gtk_tree_row_reference_new (model, next_path); - gtk_tree_path_free (next_path); + + prev_row_reference = gtk_tree_row_reference_new (model, prev_path); + next_row_reference = gtk_tree_row_reference_new (model, next_path); } } } @@ -475,17 +525,11 @@ modest_ui_actions_on_delete_message (GtkAction *action, ModestWindow *win) modest_window_disable_dimming (MODEST_WINDOW(win)); /* Remove each header. If it's a view window header_view == NULL */ -/* do_headers_action (win, headers_action_delete, header_view); */ modest_do_messages_delete (header_list, win); - /* Enable window dimming management */ gtk_tree_selection_unselect_all (sel); modest_window_enable_dimming (MODEST_WINDOW(win)); - - /* FIXME: May be folder_monitor will also refilter treemode on EXPUNGE changes ? */ - /* refresh the header view (removing marked-as-deleted) */ -/* modest_header_view_refilter (MODEST_HEADER_VIEW(header_view)); */ if (MODEST_IS_MSG_VIEW_WINDOW (win)) { modest_ui_actions_refresh_message_window_after_delete (MODEST_MSG_VIEW_WINDOW (win)); @@ -498,14 +542,24 @@ modest_ui_actions_on_delete_message (GtkAction *action, ModestWindow *win) /* Move cursor to next row */ main_window = win; - /* Select next row */ - if (gtk_tree_row_reference_valid (row_reference)) { - next_path = gtk_tree_row_reference_get_path (row_reference); + /* Select next or previous row */ + if (gtk_tree_row_reference_valid (next_row_reference)) { +/* next_path = gtk_tree_row_reference_get_path (row_reference); */ gtk_tree_selection_select_path (sel, next_path); - gtk_tree_path_free (next_path); } - if (row_reference != NULL) - gtk_tree_row_reference_free (row_reference); + else if (gtk_tree_row_reference_valid (prev_row_reference)) { + gtk_tree_selection_select_path (sel, prev_path); + } + + /* Free */ + if (next_row_reference != NULL) + gtk_tree_row_reference_free (next_row_reference); + if (next_path != NULL) + gtk_tree_path_free (next_path); + if (prev_row_reference != NULL) + gtk_tree_row_reference_free (prev_row_reference); + if (prev_path != NULL) + gtk_tree_path_free (prev_path); } if (err != NULL) { @@ -553,7 +607,9 @@ modest_ui_actions_on_delete_message_or_folder (GtkAction *action, ModestWindow * void modest_ui_actions_on_quit (GtkAction *action, ModestWindow *win) -{ +{ + ModestWindowMgr *mgr = NULL; + #ifdef MODEST_PLATFORM_MAEMO modest_osso_save_state(); #endif /* MODEST_PLATFORM_MAEMO */ @@ -568,11 +624,16 @@ modest_ui_actions_on_quit (GtkAction *action, ModestWindow *win) g_debug ("queue has been cleared"); + + /* Check if there are opened editing windows */ + mgr = modest_runtime_get_window_mgr (); + modest_window_mgr_close_all_windows (mgr); + /* note: when modest-tny-account-store is finalized, it will automatically set all network connections to offline */ - gtk_main_quit (); +/* gtk_main_quit (); */ } void @@ -769,7 +830,7 @@ modest_ui_actions_on_new_msg (GtkAction *action, ModestWindow *win) if (win) gtk_window_set_transient_for (GTK_WINDOW (msg_win), - GTK_WINDOW (win)); + GTK_WINDOW (win)); gtk_widget_show_all (GTK_WIDGET (msg_win)); cleanup: @@ -849,7 +910,11 @@ open_msg_cb (ModestMailOperation *mail_op, TnyHeader *header, TnyMsg *msg, gpoi goto cleanup; } win = modest_msg_edit_window_new (msg, account, TRUE); - + + + /* Show banner */ + modest_platform_information_banner (NULL, NULL, _("mail_ib_opening_draft_message")); + } else { gchar *uid = modest_tny_folder_get_header_unique_id (header); @@ -1190,9 +1255,7 @@ cleanup: * downloaded (CACHED) then returns TRUE else returns FALSE. */ static gint -header_list_count_uncached_msgs ( - TnyList *header_list, - GtkWindow *win) +header_list_count_uncached_msgs (TnyList *header_list) { TnyIterator *iter; gint uncached_messages = 0; @@ -1276,9 +1339,7 @@ reply_forward (ReplyForwardAction action, ModestWindow *win) if (do_retrieve){ gint num_of_unc_msgs; /* check that the messages have been previously downloaded */ - num_of_unc_msgs = header_list_count_uncached_msgs( - header_list, - GTK_WINDOW (win)); + num_of_unc_msgs = header_list_count_uncached_msgs(header_list); /* If there are any uncached message ask the user * whether he/she wants to download them. */ if (num_of_unc_msgs) @@ -2839,8 +2900,7 @@ modest_ui_actions_on_cut (GtkAction *action, gboolean continue_download = FALSE; gint num_of_unc_msgs; - num_of_unc_msgs = header_list_count_uncached_msgs( - header_list, GTK_WINDOW (window)); + num_of_unc_msgs = header_list_count_uncached_msgs(header_list); if (num_of_unc_msgs) continue_download = connect_to_get_msg( @@ -2895,9 +2955,7 @@ modest_ui_actions_on_copy (GtkAction *action, gboolean continue_download = FALSE; gint num_of_unc_msgs; - num_of_unc_msgs = header_list_count_uncached_msgs( - header_list, - GTK_WINDOW (window)); + num_of_unc_msgs = header_list_count_uncached_msgs(header_list); if (num_of_unc_msgs) continue_download = connect_to_get_msg( @@ -3202,9 +3260,10 @@ modest_ui_actions_on_change_zoom (GtkRadioAction *action, } } -void modest_ui_actions_msg_edit_on_change_priority (GtkRadioAction *action, - GtkRadioAction *selected, - ModestWindow *window) +void +modest_ui_actions_msg_edit_on_change_priority (GtkRadioAction *action, + GtkRadioAction *selected, + ModestWindow *window) { TnyHeaderFlags flags; g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window)); @@ -3213,9 +3272,10 @@ void modest_ui_actions_msg_edit_on_change_priority (GtkRadioAction *action, modest_msg_edit_window_set_priority_flags (MODEST_MSG_EDIT_WINDOW (window), flags); } -void modest_ui_actions_msg_edit_on_change_file_format (GtkRadioAction *action, - GtkRadioAction *selected, - ModestWindow *window) +void +modest_ui_actions_msg_edit_on_change_file_format (GtkRadioAction *action, + GtkRadioAction *selected, + ModestWindow *window) { gint file_format; @@ -3434,7 +3494,7 @@ modest_ui_actions_on_toggle_toolbar (GtkToggleAction *toggle, /* Toggle toolbar */ mgr = modest_runtime_get_window_mgr (); - modest_window_mgr_show_toolbars (mgr, active, fullscreen); + modest_window_mgr_show_toolbars (mgr, G_TYPE_FROM_INSTANCE (window), active, fullscreen); } void @@ -3746,7 +3806,6 @@ has_retrieved_msgs (TnyList *list) * GTK_RESPONSE_OK * * This one is used by the next functions: - * modest_ui_actions_xfer_messages_from_move_to * modest_ui_actions_on_paste - commented out * drag_and_drop_from_header_view (for d&d in modest_folder_view.c) */ @@ -4026,7 +4085,6 @@ modest_ui_actions_xfer_messages_from_move_to (TnyFolderStore *dst_folder, ModestWindow *win) { TnyList *headers = NULL; - gint response = 0; TnyAccount *dst_account = NULL; const gchar *proto_str = NULL; gboolean dst_is_pop = FALSE; @@ -4061,39 +4119,30 @@ modest_ui_actions_xfer_messages_from_move_to (TnyFolderStore *dst_folder, return; } - /* Ask for user confirmation */ - response = msgs_move_to_confirmation (GTK_WINDOW (win), - TNY_FOLDER (dst_folder), - TRUE, - headers); - - /* Transfer messages */ - if (response == GTK_RESPONSE_OK) { - GtkWidget *inf_note; - inf_note = modest_platform_animation_banner (GTK_WIDGET (win), NULL, - _CS("ckct_nw_pasting")); - if (inf_note != NULL) { - gtk_window_set_modal (GTK_WINDOW(inf_note), FALSE); - gtk_widget_show (GTK_WIDGET(inf_note)); - } + GtkWidget *inf_note; + inf_note = modest_platform_animation_banner (GTK_WIDGET (win), NULL, + _CS("ckct_nw_pasting")); + if (inf_note != NULL) { + gtk_window_set_modal (GTK_WINDOW(inf_note), FALSE); + gtk_widget_show (GTK_WIDGET(inf_note)); + } - ModestMailOperation *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); + ModestMailOperation *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_msgs (mail_op, - headers, - TNY_FOLDER (dst_folder), - TRUE, - move_to_cb, - inf_note); + modest_mail_operation_xfer_msgs (mail_op, + headers, + TNY_FOLDER (dst_folder), + TRUE, + move_to_cb, + inf_note); - g_object_unref (G_OBJECT (mail_op)); - } + g_object_unref (G_OBJECT (mail_op)); g_object_unref (headers); } @@ -4175,10 +4224,14 @@ modest_ui_actions_on_main_window_move_to (GtkAction *action, 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; + 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); + if (!connect_to_get_msg(GTK_WINDOW(win), num_headers)) { + do_xfer = FALSE; + } } + g_object_unref(headers); } if (do_xfer) /* Transfer messages */ modest_ui_actions_xfer_messages_from_move_to (dst_folder, MODEST_WINDOW (win)); @@ -4207,7 +4260,7 @@ modest_ui_actions_on_msg_view_window_move_to (GtkAction *action, g_object_unref (header); /* Transfer the message if online or confirmed by the user */ - if (tny_device_is_online (modest_runtime_get_device()) || + if (tny_device_is_online (modest_runtime_get_device()) || remote_folder_is_pop(src_folder) || (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)); }