* Changes on xfer_folder async mail operation to add two new
authorJavier Fernandez Garcia-Boente <jfernandez@igalia.com>
Wed, 4 Jul 2007 09:12:05 +0000 (09:12 +0000)
committerJavier Fernandez Garcia-Boente <jfernandez@igalia.com>
Wed, 4 Jul 2007 09:12:05 +0000 (09:12 +0000)
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
src/maemo/modest-platform.c
src/modest-mail-operation.c
src/modest-mail-operation.h
src/modest-platform.h
src/modest-ui-actions.c
src/widgets/modest-folder-view.c

index bb09bb7..57da7cc 100644 (file)
@@ -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);
index 4146bf6..08a3de5 100644 (file)
@@ -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;
 }
index 3758802..c8af203 100644 (file)
@@ -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);          
        }
index 495a545..d389dd6 100644 (file)
@@ -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 */
 
index 21781c2..6f2a54b 100644 (file)
@@ -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__ */
index e8a43f3..dbbbf28 100644 (file)
@@ -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);
index fe09923..961be2a 100644 (file)
@@ -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));