gpointer userdata);
static void modest_main_window_on_folder_selection_changed (ModestFolderView *folder_view,
- TnyFolderStore *folder_store,
- gboolean selected,
- ModestMainWindow *main_window);
+ TnyFolderStore *folder_store,
+ gboolean selected,
+ ModestMainWindow *main_window);
static void set_at_least_one_account_visible(ModestMainWindow *self);
priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers,
G_OBJECT(priv->folder_view), "key-press-event",
G_CALLBACK(on_inner_widgets_key_pressed), self);
- priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers,G_OBJECT(priv->folder_view), "folder_selection_changed",
- G_CALLBACK(modest_main_window_on_folder_selection_changed), self);
+ priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers, G_OBJECT(priv->folder_view), "folder_selection_changed",
+ G_CALLBACK (modest_main_window_on_folder_selection_changed), self);
priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers,G_OBJECT(priv->folder_view), "folder-display-name-changed",
- G_CALLBACK(modest_ui_actions_on_folder_display_name_changed), self);
+ G_CALLBACK (modest_ui_actions_on_folder_display_name_changed), self);
priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers,G_OBJECT (priv->folder_view), "focus-in-event",
G_CALLBACK (on_folder_view_focus_in), self);
gtk_action_set_visible (action, show_forward);
action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/HeaderViewCSM/HeaderViewCSMCancelSending");
gtk_action_set_visible (action, show_cancel_send);
-/* action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/HeaderViewCSM/HeaderViewCSMCut"); */
-/* gtk_action_set_visible (action, show_clipboard); */
-/* action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/HeaderViewCSM/HeaderViewCSMCopy"); */
-/* gtk_action_set_visible (action, show_clipboard); */
-/* action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/HeaderViewCSM/HeaderViewCSMPaste"); */
-/* gtk_action_set_visible (action, show_clipboard); */
action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/HeaderViewCSM/HeaderViewCSMDelete");
gtk_action_set_visible (action, show_delete);
/* We finally call to the ui actions handler, after updating properly
* the header view CSM */
modest_ui_actions_on_folder_selection_changed (folder_view, folder_store, selected, main_window);
-
}
gboolean
ModestMailOperation *mail_op;
TnyList *headers;
TnyFolder *dest_folder;
- XferMsgsAsynUserCallback user_callback;
+ XferAsyncUserCallback user_callback;
gboolean delete;
gpointer user_data;
} XFerMsgAsyncHelper;
return NULL;
}
- return g_object_ref (priv->source);
+ return (priv->source) ? g_object_ref (priv->source) : NULL;
}
ModestMailOperationStatus
* which is already GDK locked by Tinymail */
/* no gdk_threads_enter (), CHECKED */
- helper->user_callback (priv->source, helper->user_data);
+ helper->user_callback (self, helper->user_data);
/* no gdk_threads_leave () , CHECKED */
}
return TRUE;
}
-/**
- * This function checks if @ancestor is an acestor of @folder and
- * returns TRUE in that case
- */
-static gboolean
-folder_is_ancestor (TnyFolder *folder,
- TnyFolderStore *ancestor)
-{
- TnyFolder *tmp = NULL;
- gboolean found = FALSE;
-
- tmp = folder;
- while (!found && tmp && !TNY_IS_ACCOUNT (tmp)) {
- TnyFolderStore *folder_store;
-
- folder_store = tny_folder_get_folder_store (tmp);
- if (ancestor == folder_store)
- found = TRUE;
- else
- tmp = g_object_ref (folder_store);
- g_object_unref (folder_store);
- }
- return found;
-}
-
void
modest_mail_operation_xfer_folder (ModestMailOperation *self,
TnyFolder *folder,
TnyFolderStore *parent,
gboolean delete_original,
- XferMsgsAsynUserCallback user_callback,
+ XferAsyncUserCallback user_callback,
gpointer user_data)
{
ModestMailOperationPrivate *priv = NULL;
if (TNY_IS_FOLDER (parent))
parent_rules = modest_tny_folder_get_rules (TNY_FOLDER (parent));
- /* The moveable restriction is applied also to copy operation */
+ /* Apply operation constraints */
if ((gpointer) parent == (gpointer) folder ||
(!TNY_IS_FOLDER_STORE (parent)) ||
(rules & MODEST_FOLDER_RULES_FOLDER_NON_MOVEABLE)) {
-
- /* Set status failed and set an error */
- priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
- g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
- MODEST_MAIL_OPERATION_ERROR_FOLDER_RULES,
- error_msg);
-
- /* Notify the queue */
- modest_mail_operation_notify_end (self);
-
+ /* Folder rules */
+ goto error;
} else if (TNY_IS_FOLDER (parent) &&
(parent_rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE)) {
-
- /* Set status failed and set an error */
- priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
- g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
- MODEST_MAIL_OPERATION_ERROR_FOLDER_RULES,
- error_msg);
-
- /* Notify the queue */
- modest_mail_operation_notify_end (self);
+ /* Folder rules */
+ goto error;
} else if (TNY_IS_FOLDER (parent) &&
TNY_IS_FOLDER_STORE (folder) &&
- folder_is_ancestor (TNY_FOLDER (parent), TNY_FOLDER_STORE (folder))) {
- /* Set status failed and set an error */
- priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
- g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
- MODEST_MAIL_OPERATION_ERROR_FOLDER_RULES,
- error_msg);
-
- /* Notify the queue */
- modest_mail_operation_notify_end (self);
-
+ modest_tny_folder_is_ancestor (TNY_FOLDER (parent),
+ TNY_FOLDER_STORE (folder))) {
+ /* Do not move a parent into a child */
+ goto error;
} else if (TNY_IS_FOLDER_STORE (parent) &&
modest_tny_folder_has_subfolder_with_name (parent, folder_name)) {
/* Check that the new folder name is not used by any
- parent subfolder */
-
- /* Set status failed and set an error */
- priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
- g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
- MODEST_MAIL_OPERATION_ERROR_FOLDER_RULES,
- error_msg);
-
- /* Notify the queue */
- modest_mail_operation_notify_end (self);
-
+ parent subfolder */
+ goto error;
} else if (!(new_name_valid_if_local_account (priv, parent, folder_name))) {
/* Check that the new folder name is not used by any
special local folder */
-
- /* Set status failed and set an error */
- priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
- g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
- MODEST_MAIL_OPERATION_ERROR_FOLDER_RULES,
- error_msg);
-
- /* Notify the queue */
- modest_mail_operation_notify_end (self);
+ goto error;
} else {
/* Create the helper */
helper = g_slice_new0 (XFerMsgAsyncHelper);
- helper->mail_op = g_object_ref(self);
+ 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 */
+ /* Move/Copy folder */
tny_folder_copy_async (folder,
parent,
tny_folder_get_name (folder),
delete_original,
transfer_folder_cb,
transfer_folder_status_cb,
- helper);
- }
-
+ helper);
+ return;
+ }
+
+ error:
+ /* Set status failed and set an error */
+ priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
+ g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
+ MODEST_MAIL_OPERATION_ERROR_FOLDER_RULES,
+ error_msg);
+
+ /* Call the user callback if exists */
+ if (user_callback)
+ user_callback (self, user_data);
+
+ /* Notify the queue */
+ modest_mail_operation_notify_end (self);
}
void
* Tinymail already acquires the Gdk lock */
/* no gdk_threads_enter (), CHECKED */
- helper->user_callback (priv->source, helper->user_data);
+ helper->user_callback (self, helper->user_data);
/* no gdk_threads_leave (), CHECKED */
}
g_object_unref (folder);
if (iter)
g_object_unref (iter);
- g_slice_free (XFerMsgAsyncHelper, helper);
-
+ g_slice_free (XFerMsgAsyncHelper, helper);
}
void
TnyList *headers,
TnyFolder *folder,
gboolean delete_original,
- XferMsgsAsynUserCallback user_callback,
+ XferAsyncUserCallback user_callback,
gpointer user_data)
{
ModestMailOperationPrivate *priv = NULL;
XFerMsgAsyncHelper *helper = NULL;
TnyHeader *header = NULL;
ModestTnyFolderRules rules = 0;
- const gchar *id1 = NULL;
- const gchar *id2 = NULL;
- gboolean same_folder = FALSE;
g_return_if_fail (MODEST_IS_MAIL_OPERATION (self));
g_return_if_fail (TNY_IS_LIST (headers));
g_object_unref (iter);
/* Check folder source and destination */
- id1 = tny_folder_get_id (src_folder);
- id2 = tny_folder_get_id (TNY_FOLDER(folder));
- same_folder = !g_ascii_strcasecmp (id1, id2);
- if (same_folder) {
+ if (src_folder == folder) {
/* Set status failed and set an error */
priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
gpointer user_data);
/**
- * XferMsgAsynUserCallback:
+ * XferAsyncUserCallback:
*
* @obj: a #GObject generic object which has created current mail operation.
* @user_data: generic data passed to user defined function.
* used as tinymail operation callback. The private function fills private
* fields of mail operation and calls user defined callback if it exists.
*/
-typedef void (*XferMsgsAsynUserCallback) (const GObject *obj, gpointer user_data);
+typedef void (*XferAsyncUserCallback) (ModestMailOperation *mail_op, gpointer user_data);
/**
* @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_callback: a #XferAsyncUserCallback 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
TnyFolder *folder,
TnyFolderStore *parent,
gboolean delete_original,
- XferMsgsAsynUserCallback user_callback,
+ XferAsyncUserCallback user_callback,
gpointer user_data);
* @header_list: a #TnyList of #TnyHeader to transfer
* @folder: the #TnyFolder where the messages will be transferred
* @delete_original: whether or not delete the source messages
- * @user_callback: a #XferMsgsAsynUserCallback function to call after tinymail callback execution.
+ * @user_callback: a #XferAsyncUserCallback function to call after tinymail callback execution.
* @user_data: generic user data which will be passed to @user_callback function.
*
* Asynchronously transfers messages from their current folder to
TnyList *header_list,
TnyFolder *folder,
gboolean delete_original,
- XferMsgsAsynUserCallback user_callback,
+ XferAsyncUserCallback user_callback,
gpointer user_data);
/**
return same_subfolder;
}
+
+gboolean
+modest_tny_folder_is_ancestor (TnyFolder *folder,
+ TnyFolderStore *ancestor)
+{
+ TnyFolderStore *tmp = NULL;
+ gboolean found = FALSE;
+
+ tmp = TNY_FOLDER_STORE (folder);
+ while (!found && tmp && !TNY_IS_ACCOUNT (tmp)) {
+ TnyFolderStore *folder_store;
+
+ folder_store = tny_folder_get_folder_store (TNY_FOLDER (tmp));
+ if (ancestor == folder_store)
+ found = TRUE;
+ else
+ tmp = folder_store;
+ g_object_unref (folder_store);
+ }
+ return found;
+}
gboolean modest_tny_folder_has_subfolder_with_name (TnyFolderStore *folder,
const gchar *name);
+/**
+ * modest_tny_folder_is_ancestor:
+ * @folder: a #TnyFolder
+ * @ancestor: a #TnyFolderStore
+ *
+ * This function checks if @ancestor is an ancestor of @folder
+ *
+ * Returns: TRUE if @ancestor is an ancestor of @folder, FALSE
+ * otherwise
+ **/
+gboolean modest_tny_folder_is_ancestor (TnyFolder *folder,
+ TnyFolderStore *ancestor);
G_END_DECLS
static void
-paste_msgs_cb (const GObject *object, gpointer user_data)
+destroy_information_note (ModestMailOperation *mail_op, 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));
}
data,
TNY_FOLDER (folder_store),
delete,
- paste_msgs_cb,
+ destroy_information_note,
inf_note);
} else {
g_object_unref (mail_op);
src_folder,
folder_store,
delete,
- paste_msgs_cb,
+ destroy_information_note,
inf_note);
}
static void
-move_to_cb (const GObject *object, gpointer user_data)
+move_to_cb (ModestMailOperation *mail_op, gpointer user_data)
{
- ModestMsgViewWindow *self = NULL;
- g_return_if_fail (GTK_IS_WIDGET (user_data));
- g_return_if_fail (MODEST_IS_WINDOW (object));
+ /* Note that the operation could have failed, in that case do
+ nothing */
+ if (modest_mail_operation_get_status (mail_op) ==
+ MODEST_MAIL_OPERATION_STATUS_SUCCESS) {
- if (MODEST_IS_MSG_VIEW_WINDOW (object)) {
- self = MODEST_MSG_VIEW_WINDOW (object);
+ GObject *object = modest_mail_operation_get_source (mail_op);
+ 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_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));
+ }
+ g_object_unref (object);
}
+
+ /* Close the "Pasting" information banner */
gtk_widget_destroy (GTK_WIDGET(user_data));
}
modest_ui_actions_move_folder_error_handler (ModestMailOperation *mail_op,
gpointer user_data)
{
- ModestMainWindow *main_window = NULL;
+ ModestWindow *main_window = NULL;
GtkWidget *folder_view = NULL;
GObject *win = modest_mail_operation_get_source (mail_op);
const GError *error = NULL;
}
/* Disable next automatic folder selection */
- if (MODEST_IS_MAIN_WINDOW (user_data)) {
- main_window = MODEST_MAIN_WINDOW(user_data);
- folder_view = modest_main_window_get_child_widget (main_window,
+ main_window = modest_window_mgr_get_main_window (modest_runtime_get_window_mgr ());
+ folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (main_window),
MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
- modest_folder_view_disable_next_folder_selection (MODEST_FOLDER_VIEW(folder_view));
+ modest_folder_view_disable_next_folder_selection (MODEST_FOLDER_VIEW(folder_view));
+
+ if (user_data && TNY_IS_FOLDER (user_data)) {
+ modest_folder_view_select_folder (MODEST_FOLDER_VIEW (folder_view),
+ TNY_FOLDER (user_data), FALSE);
}
/* Show notification dialog */
modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE,
G_OBJECT(win),
modest_ui_actions_move_folder_error_handler,
- win);
+ src_folder);
modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
mail_op);
modest_mail_operation_xfer_folder (mail_op,
TNY_FOLDER (src_folder),
dst_folder,
- TRUE, move_to_cb, inf_note);
+ TRUE,
+ move_to_cb,
+ inf_note);
/* Unref mail operation */
g_object_unref (G_OBJECT (mail_op));
}
-1);
/* If the folder is the same do not notify */
- if (priv->cur_folder_store == folder && folder) {
+ if (folder && priv->cur_folder_store == folder) {
g_object_unref (folder);
return;
}
* and drop action
*/
static void
-on_progress_changed (ModestMailOperation *mail_op,
- ModestMailOperationState *state,
- gpointer user_data)
+xfer_cb (ModestMailOperation *mail_op,
+ gpointer user_data)
{
gboolean success;
DndHelper *helper;
helper = (DndHelper *) user_data;
- if (!state->finished)
- return;
-
- if (state->status == MODEST_MAIL_OPERATION_STATUS_SUCCESS) {
+ if (modest_mail_operation_get_status (mail_op) ==
+ MODEST_MAIL_OPERATION_STATUS_SUCCESS) {
success = TRUE;
} else {
success = FALSE;
g_slice_free (DndHelper, helper);
}
-
/* get the folder for the row the treepath refers to. */
/* folder must be unref'd */
static TnyFolder*
NULL);
modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
mail_op);
- g_signal_connect (G_OBJECT (mail_op), "progress-changed",
- G_CALLBACK (on_progress_changed), helper);
modest_mail_operation_xfer_msgs (mail_op,
headers,
folder,
helper->delete_source,
- NULL, NULL);
+ xfer_cb, helper);
/* Frees */
cleanup:
ModestTnyFolderRules rules =
modest_tny_folder_get_rules (folder);
forbidden = rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE;
-
- if (forbidden)
- g_debug ("folder rules: cannot write to that folder");
- } else if (TNY_IS_FOLDER_STORE(folder)){
+ } else if (TNY_IS_FOLDER_STORE(folder)) {
/* enable local root as destination for folders */
if (!MODEST_IS_TNY_LOCAL_FOLDERS_ACCOUNT (folder)
&& TNY_IS_ACCOUNT (folder))
ModestTnyFolderRules rules =
modest_tny_folder_get_rules (folder);
forbidden = rules & MODEST_FOLDER_RULES_FOLDER_NON_MOVEABLE;
- if (forbidden)
- g_debug ("folder rules: cannot move that folder");
} else
forbidden = TRUE;
g_object_unref (folder);
&folder, -1);
/* Offer the connection dialog if necessary, for the destination parent folder and source folder: */
- if (modest_platform_connect_and_wait_if_network_folderstore (
- NULL, dest_folder) &&
- modest_platform_connect_and_wait_if_network_folderstore (
- NULL, TNY_FOLDER_STORE (folder))) {
+ if (modest_platform_connect_and_wait_if_network_folderstore (NULL, dest_folder) &&
+ modest_platform_connect_and_wait_if_network_folderstore (NULL, TNY_FOLDER_STORE (folder))) {
+ ModestWindowMgr *mgr = modest_runtime_get_window_mgr ();
+
/* Do the mail operation */
- mail_op = modest_mail_operation_new_with_error_handling (
- MODEST_MAIL_OPERATION_TYPE_RECEIVE,
- NULL,
- modest_ui_actions_move_folder_error_handler,
- NULL);
- modest_mail_operation_queue_add (
- modest_runtime_get_mail_operation_queue (),
- mail_op);
- g_signal_connect (
- G_OBJECT (mail_op),
- "progress-changed",
- G_CALLBACK (on_progress_changed),
- helper);
+ mail_op =
+ modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE,
+ G_OBJECT (modest_window_mgr_get_main_window (mgr)),
+ modest_ui_actions_move_folder_error_handler,
+ folder);
+
+ modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
+ mail_op);
modest_mail_operation_xfer_folder (mail_op,
- folder,
- dest_folder,
- helper->delete_source,
- NULL,
- NULL);
+ folder,
+ dest_folder,
+ helper->delete_source,
+ xfer_cb,
+ helper);
- g_object_unref (G_OBJECT (mail_op));
+ g_object_unref (G_OBJECT (mail_op));
}
/* Frees */
the operation, because the operation won't start if
the folder is in use */
if (source_widget == widget) {
- ModestFolderViewPrivate *priv;
-
- priv = MODEST_FOLDER_VIEW_GET_PRIVATE (widget);
- if (priv->cur_folder_store) {
- g_object_unref (priv->cur_folder_store);
- priv->cur_folder_store = NULL;
- }
-
- g_signal_emit (G_OBJECT (widget),
- signals[FOLDER_SELECTION_CHANGED_SIGNAL], 0, NULL, FALSE);
+ GtkTreeSelection *sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget));
+ gtk_tree_selection_unselect_all (sel);
}
}