From a8045c4764cc654d97c286614a13b0c4d30e3d60 Mon Sep 17 00:00:00 2001 From: Javier Fernandez Garcia-Boente Date: Wed, 4 Jul 2007 09:12:05 +0000 Subject: [PATCH] * Changes on xfer_folder async mail operation to add two new parameters (user callback function). * Add a new user callback funciton to destroy ifnromation banner about progress of paste operation. * Fixes: NB#62302 pmo-trunk-r2559 --- src/maemo/modest-msg-view-window.c | 5 +++ src/maemo/modest-platform.c | 18 +++++++++-- src/modest-mail-operation.c | 63 ++++++++++++++++++++++++++++++------ src/modest-mail-operation.h | 7 +++- src/modest-platform.h | 5 +++ src/modest-ui-actions.c | 43 ++++++++++++++++++------ src/widgets/modest-folder-view.c | 11 +++++-- 7 files changed, 128 insertions(+), 24 deletions(-) diff --git a/src/maemo/modest-msg-view-window.c b/src/maemo/modest-msg-view-window.c index bb09bb7..57da7cc 100644 --- a/src/maemo/modest-msg-view-window.c +++ b/src/maemo/modest-msg-view-window.c @@ -672,6 +672,7 @@ modest_msg_view_window_get_header (ModestMsgViewWindow *self) TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN, &header, -1); + gtk_tree_path_free (path); return header; } @@ -1012,6 +1013,7 @@ modest_msg_view_window_first_message_selected (ModestMsgViewWindow *window) } g_free (path_string); } + gtk_tree_path_free (path); return result; } else { return TRUE; @@ -1076,6 +1078,7 @@ modest_msg_view_window_select_next_message (ModestMsgViewWindow *window) return TRUE; } + gtk_tree_path_free (path); } return FALSE; } @@ -1198,6 +1201,7 @@ modest_msg_view_window_select_previous_message (ModestMsgViewWindow *window) return TRUE; } + gtk_tree_path_free (path); return FALSE; } @@ -1284,6 +1288,7 @@ modest_msg_view_window_update_priority (ModestMsgViewWindow *window) gtk_tree_model_get (priv->header_model, &iter, TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN, &header, -1); flags = tny_header_get_flags (header); + gtk_tree_path_free (path); } modest_msg_view_set_priority (MODEST_MSG_VIEW(priv->msg_view), flags); diff --git a/src/maemo/modest-platform.c b/src/maemo/modest-platform.c index 4146bf6..08a3de5 100644 --- a/src/maemo/modest-platform.c +++ b/src/maemo/modest-platform.c @@ -1105,9 +1105,23 @@ modest_platform_create_folder_view (TnyFolderStoreQuery *query) } void -modest_platform_information_banner (GtkWidget *widget, +modest_platform_information_banner (GtkWidget *parent, const gchar *icon_name, const gchar *text) { - hildon_banner_show_information (widget, icon_name, text); + hildon_banner_show_information (parent, icon_name, text); +} + +GtkWidget * +modest_platform_animation_banner (GtkWidget *parent, + const gchar *animation_name, + const gchar *text) +{ + GtkWidget *inf_note = NULL; + + g_return_val_if_fail (text != NULL, NULL); + + inf_note = hildon_banner_show_animation (parent, animation_name, text); + + return inf_note; } diff --git a/src/modest-mail-operation.c b/src/modest-mail-operation.c index 3758802..c8af203 100644 --- a/src/modest-mail-operation.c +++ b/src/modest-mail-operation.c @@ -572,6 +572,7 @@ modest_mail_operation_send_new_mail (ModestMailOperation *self, header = tny_msg_get_header (new_msg); if (priority_flags != 0) tny_header_set_flags (header, priority_flags); + g_object_unref (G_OBJECT(header)); /* Call mail operation */ modest_mail_operation_send_mail (self, transport_account, new_msg); @@ -583,6 +584,7 @@ modest_mail_operation_send_new_mail (ModestMailOperation *self, /* Note: This can fail (with a warning) if the message is not really already in a folder, * because this function requires it to have a UID. */ tny_folder_remove_msg (folder, header, NULL); + tny_header_set_flags (header, TNY_HEADER_FLAG_DELETED); g_object_unref (header); } } @@ -631,6 +633,7 @@ modest_mail_operation_save_to_drafts (ModestMailOperation *self, /* add priority flags */ header = tny_msg_get_header (msg); tny_header_set_flags (header, priority_flags); + g_object_unref (G_OBJECT(header)); folder = modest_tny_account_get_special_folder (TNY_ACCOUNT (transport_account), TNY_FOLDER_TYPE_DRAFTS); if (!folder) { @@ -645,6 +648,7 @@ modest_mail_operation_save_to_drafts (ModestMailOperation *self, header = tny_msg_get_header (draft_msg); /* Remove the old draft expunging it */ tny_folder_remove_msg (folder, header, NULL); + tny_header_set_flags (header, TNY_HEADER_FLAG_DELETED); tny_folder_sync (folder, FALSE, &(priv->error)); /* FALSE --> don't expunge */ g_object_unref (header); } @@ -1332,7 +1336,8 @@ modest_mail_operation_remove_folder (ModestMailOperation *self, TNY_FOLDER_TYPE_TRASH); /* TODO: error_handling */ modest_mail_operation_xfer_folder (self, folder, - TNY_FOLDER_STORE (trash_folder), TRUE); + TNY_FOLDER_STORE (trash_folder), + TRUE, NULL, NULL); } else { TnyFolderStore *parent = tny_folder_get_folder_store (folder); @@ -1357,11 +1362,15 @@ transfer_folder_status_cb (GObject *obj, ModestMailOperation *self; ModestMailOperationPrivate *priv; ModestMailOperationState *state; + XFerMsgAsyncHelper *helper; g_return_if_fail (status != NULL); g_return_if_fail (status->code == TNY_FOLDER_STATUS_CODE_COPY_FOLDER); - self = MODEST_MAIL_OPERATION (user_data); + helper = (XFerMsgAsyncHelper *) user_data; + g_return_if_fail (helper != NULL); + + self = helper->mail_op; priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self); priv->done = status->position; @@ -1381,12 +1390,15 @@ transfer_folder_cb (TnyFolder *folder, GError **err, gpointer user_data) { + XFerMsgAsyncHelper *helper; ModestMailOperation *self = NULL; ModestMailOperationPrivate *priv = NULL; - self = MODEST_MAIL_OPERATION (user_data); + helper = (XFerMsgAsyncHelper *) user_data; + g_return_if_fail (helper != NULL); - priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self); + self = helper->mail_op; + priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self); if (*err) { priv->error = g_error_copy (*err); @@ -1403,22 +1415,34 @@ transfer_folder_cb (TnyFolder *folder, priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS; } + /* Notify about operation end */ + modest_mail_operation_notify_end (self); + + /* If user defined callback function was defined, call it */ + if (helper->user_callback) { + gdk_threads_enter (); + helper->user_callback (priv->source, helper->user_data); + gdk_threads_leave (); + } + /* Free */ + g_object_unref (helper->mail_op); + g_slice_free (XFerMsgAsyncHelper, helper); g_object_unref (folder); g_object_unref (into); - - /* Notify about operation end */ - modest_mail_operation_notify_end (self); } void modest_mail_operation_xfer_folder (ModestMailOperation *self, TnyFolder *folder, TnyFolderStore *parent, - gboolean delete_original) + gboolean delete_original, + XferMsgsAsynUserCallback user_callback, + gpointer user_data) { ModestMailOperationPrivate *priv = NULL; ModestTnyFolderRules parent_rules = 0, rules; + XFerMsgAsyncHelper *helper = NULL; g_return_if_fail (MODEST_IS_MAIL_OPERATION (self)); g_return_if_fail (TNY_IS_FOLDER (folder)); @@ -1460,6 +1484,14 @@ modest_mail_operation_xfer_folder (ModestMailOperation *self, g_object_ref (folder); g_object_ref (parent); + /* Create the helper */ + helper = g_slice_new0 (XFerMsgAsyncHelper); + helper->mail_op = g_object_ref(self); + helper->dest_folder = NULL; + helper->headers = NULL; + helper->user_callback = user_callback; + helper->user_data = user_data; + /* Move/Copy folder */ tny_folder_copy_async (folder, parent, @@ -1467,7 +1499,8 @@ modest_mail_operation_xfer_folder (ModestMailOperation *self, delete_original, transfer_folder_cb, transfer_folder_status_cb, - self); + helper); +/* self); */ } } @@ -1478,6 +1511,7 @@ modest_mail_operation_rename_folder (ModestMailOperation *self, { ModestMailOperationPrivate *priv; ModestTnyFolderRules rules; + XFerMsgAsyncHelper *helper; g_return_if_fail (MODEST_IS_MAIL_OPERATION (self)); g_return_if_fail (TNY_IS_FOLDER_STORE (folder)); @@ -1509,12 +1543,21 @@ modest_mail_operation_rename_folder (ModestMailOperation *self, } else { TnyFolderStore *into; + /* Create the helper */ + helper = g_slice_new0 (XFerMsgAsyncHelper); + helper->mail_op = g_object_ref(self); + helper->dest_folder = NULL; + helper->headers = NULL; + helper->user_callback = NULL; + helper->user_data = NULL; + /* Rename. Camel handles folder subscription/unsubscription */ into = tny_folder_get_folder_store (folder); tny_folder_copy_async (folder, into, name, TRUE, transfer_folder_cb, transfer_folder_status_cb, - self); + helper); +/* self); */ if (into) g_object_unref (into); } diff --git a/src/modest-mail-operation.h b/src/modest-mail-operation.h index 495a545..d389dd6 100644 --- a/src/modest-mail-operation.h +++ b/src/modest-mail-operation.h @@ -414,6 +414,8 @@ void modest_mail_operation_rename_folder (ModestMailOperation *self, * @folder: a #TnyFolder * @parent: the new parent of the folder as #TnyFolderStore * @delete_original: wheter or not delete the original folder + * @user_callback: a #XferMsgsAsynUserCallback function to call after tinymail callback execution. + * @user_data: generic user data which will be passed to @user_callback function. * * Sets the given @folder as child of a provided #TnyFolderStore. This * operation also transfers all the messages contained in the folder @@ -428,7 +430,10 @@ void modest_mail_operation_rename_folder (ModestMailOperation *self, void modest_mail_operation_xfer_folder (ModestMailOperation *self, TnyFolder *folder, TnyFolderStore *parent, - gboolean delete_original); + gboolean delete_original, + XferMsgsAsynUserCallback user_callback, + gpointer user_data); + /* Functions that performs msg operations */ diff --git a/src/modest-platform.h b/src/modest-platform.h index 21781c2..6f2a54b 100644 --- a/src/modest-platform.h +++ b/src/modest-platform.h @@ -266,6 +266,11 @@ void modest_platform_information_banner (GtkWidget *widget, const gchar *icon_name, const gchar *text); +GtkWidget * +modest_platform_animation_banner (GtkWidget *parent, + const gchar *annimation_name, + const gchar *text); + G_END_DECLS #endif /* __MODEST_PLATFORM_UTILS_H__ */ diff --git a/src/modest-ui-actions.c b/src/modest-ui-actions.c index e8a43f3..dbbbf28 100644 --- a/src/modest-ui-actions.c +++ b/src/modest-ui-actions.c @@ -2385,11 +2385,23 @@ modest_ui_actions_on_undo (GtkAction *action, } } + +static void +paste_msgs_cb (const GObject *object, gpointer user_data) +{ + g_return_if_fail (MODEST_IS_MAIN_WINDOW (object)); + g_return_if_fail (GTK_IS_WIDGET (user_data)); + + /* destroy information note */ + gtk_widget_destroy (GTK_WIDGET(user_data)); +} + void modest_ui_actions_on_paste (GtkAction *action, ModestWindow *window) { - GtkWidget *focused_widget; + GtkWidget *focused_widget = NULL; + GtkWidget *inf_note = NULL; ModestMailOperation *mail_op = NULL; focused_widget = gtk_window_get_focus (GTK_WINDOW (window)); @@ -2425,20 +2437,30 @@ modest_ui_actions_on_paste (GtkAction *action, /* Get destination folder */ folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (focused_widget)); + /* Launch notification */ + inf_note = modest_platform_animation_banner (GTK_WIDGET (window), 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)); + } + /* transfer messages */ if (data != NULL) { modest_mail_operation_xfer_msgs (mail_op, data, TNY_FOLDER (folder_store), delete, - NULL, - NULL); + paste_msgs_cb, + inf_note); } else if (src_folder != NULL) { modest_mail_operation_xfer_folder (mail_op, src_folder, folder_store, - delete); + delete, + paste_msgs_cb, + inf_note); } /* Free */ @@ -2451,6 +2473,7 @@ modest_ui_actions_on_paste (GtkAction *action, } } + void modest_ui_actions_on_select_all (GtkAction *action, ModestWindow *window) @@ -2927,6 +2950,7 @@ msgs_move_to_confirmation (GtkWindow *win, } + static void transfer_msgs_from_viewer_cb (const GObject *object, gpointer user_data) { @@ -3178,7 +3202,9 @@ modest_ui_actions_on_main_window_move_to (GtkAction *action, modest_mail_operation_xfer_folder (mail_op, TNY_FOLDER (src_folder), folder_store, - TRUE); + TRUE, + NULL, + NULL); /* Unref mail operation */ g_object_unref (G_OBJECT (mail_op)); } @@ -3251,22 +3277,21 @@ modest_ui_actions_on_msg_view_window_move_to (GtkAction *action, /* Create and run the dialog */ dialog = create_move_to_dialog (MODEST_WINDOW (win), folder_view, &tree_view); result = gtk_dialog_run (GTK_DIALOG(dialog)); - g_object_ref (tree_view); if (result == GTK_RESPONSE_ACCEPT) { TnyFolderStore *folder_store; gint response; - folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (tree_view)); - /* Create header list */ header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win)); - + g_return_if_fail (header != NULL); + headers = tny_simple_list_new (); tny_list_prepend (headers, G_OBJECT (header)); g_object_unref (header); /* Ask user for confirmation. MSG-NOT404 */ + folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (g_object_ref (tree_view))); response = msgs_move_to_confirmation (GTK_WINDOW (win), TNY_FOLDER (folder_store), headers); diff --git a/src/widgets/modest-folder-view.c b/src/widgets/modest-folder-view.c index fe09923..961be2a 100644 --- a/src/widgets/modest-folder-view.c +++ b/src/widgets/modest-folder-view.c @@ -770,10 +770,13 @@ on_account_update (TnyAccountStore *account_store, const gchar *account, gpointer user_data) { - ModestFolderView *self = MODEST_FOLDER_VIEW (user_data); + ModestFolderView *self = NULL; ModestFolderViewPrivate *priv; + g_return_if_fail (MODEST_IS_FOLDER_VIEW (user_data)); + self = MODEST_FOLDER_VIEW (user_data); priv = MODEST_FOLDER_VIEW_GET_PRIVATE (self); + if (!priv->visible_account_id) modest_widget_memory_restore (modest_runtime_get_conf(), G_OBJECT(self), MODEST_CONF_FOLDER_VIEW_KEY); @@ -787,6 +790,7 @@ static void on_accounts_reloaded (TnyAccountStore *account_store, gpointer user_data) { + g_return_if_fail (MODEST_IS_FOLDER_VIEW (user_data)); modest_folder_view_update_model (MODEST_FOLDER_VIEW (user_data), account_store); } @@ -954,6 +958,7 @@ modest_folder_view_update_model (ModestFolderView *self, /* TnyAccount *local_account; */ TnyList *model_as_list; + g_return_val_if_fail (MODEST_IS_FOLDER_VIEW (self), FALSE); g_return_val_if_fail (account_store, FALSE); priv = MODEST_FOLDER_VIEW_GET_PRIVATE(self); @@ -1450,7 +1455,9 @@ drag_and_drop_from_folder_view (GtkTreeModel *source_model, modest_mail_operation_xfer_folder (mail_op, folder, parent_folder, - helper->delete_source); + helper->delete_source, + NULL, + NULL); /* Frees */ g_object_unref (G_OBJECT (parent_folder)); -- 1.7.9.5