* Sync folder after send mail from Draft folder, to actually remove it.
* Sync folder after remove message from outbox, after they were sent.
* Changes on header-view-render to get send-queus of all defined accounts
if they were not in send-queue cache.
* Define a new status for header-view to determine if all messages in
the current selected folder are marked as deleted.
* Allow to enable and disable dimming rules. This feature could
improve performance in operations which require that a lot of headers
were selected.
* Fixes: NB#64359, NB#64321, NB#61954, NB#63011
pmo-trunk-r3114
g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
MODEST_MAIL_OPERATION_ERROR_ITEM_NOT_FOUND,
"modest: could not find send queue for account\n");
+ priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
+
} else {
/* TODO: connect to the msg-sent in order to know when
the mail operation is finished */
+
tny_send_queue_add (send_queue, msg, &(priv->error));
+
/* TODO: we're setting always success, do the check in
the handler */
priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS;
}
+ if (priv->status == MODEST_MAIL_OPERATION_STATUS_SUCCESS)
+ modest_platform_information_banner (NULL, NULL, _("mcen_ib_outbox_waiting_to_be_sent"));
+
/* TODO: do this in the handler of the "msg-sent"
signal.Notify about operation end */
modest_mail_operation_notify_end (self);
TnyFolder *draft_folder = NULL;
TnyFolder *outbox_folder = NULL;
TnyHeader *header;
+ GError *err = NULL;
if (!msg) {
goto end;
* because this function requires it to have a UID. */
header = tny_msg_get_header (info->draft_msg);
tny_folder_remove_msg (src_folder, header, NULL);
- tny_header_set_flags (header, TNY_HEADER_FLAG_DELETED);
- tny_header_set_flags (header, TNY_HEADER_FLAG_SEEN);
+
+ tny_folder_sync (folder, TRUE, &err); /* FALSE --> don't expunge */
+/* tny_folder_sync_async (src_folder, TRUE, NULL, NULL, NULL); /\* expunge *\/ */
+
g_object_unref (header);
g_object_unref (folder);
}
end:
+ if (err != NULL)
+ g_error_free(err);
if (info->draft_msg)
g_object_unref (info->draft_msg);
if (draft_folder)
if ((!priv->error) && (info->draft_msg != NULL)) {
header = tny_msg_get_header (info->draft_msg);
src_folder = tny_header_get_folder (header);
+
/* Remove the old draft expunging it */
tny_folder_remove_msg (src_folder, header, NULL);
- tny_header_set_flags (header, TNY_HEADER_FLAG_DELETED);
- tny_header_set_flags (header, TNY_HEADER_FLAG_SEEN);
+/* tny_header_set_flags (header, TNY_HEADER_FLAG_DELETED); */
+/* tny_header_set_flags (header, TNY_HEADER_FLAG_SEEN); */
+
+ tny_folder_sync (folder, TRUE, &(priv->error)); /* FALSE --> don't expunge */
tny_folder_sync_async (src_folder, TRUE, NULL, NULL, NULL); /* expunge */
+
g_object_unref (header);
}
static void
-transfer_folder_cb (TnyFolder *folder, gboolean cancelled,
+transfer_folder_cb (TnyFolder *folder,
+ gboolean cancelled,
TnyFolderStore *into,
TnyFolder *new_folder,
GError *err,
tny_folder_copy_async (folder,
parent,
tny_folder_get_name (folder),
- delete_original,
+ delete_original,
transfer_folder_cb,
transfer_folder_status_cb,
- helper);
+ helper);
}
}
void
-modest_mail_operation_remove_msg (ModestMailOperation *self, TnyHeader *header,
+modest_mail_operation_remove_msg (ModestMailOperation *self,
+ TnyHeader *header,
gboolean remove_to_trash /*ignored*/)
{
TnyFolder *folder;
/* remove message from folder */
tny_folder_remove_msg (folder, header, &(priv->error));
-/* if (!priv->error) { */
-/* tny_header_set_flags (header, TNY_HEADER_FLAG_DELETED); */
-/* tny_header_set_flags (header, TNY_HEADER_FLAG_SEEN); */
+ if (!priv->error) {
+ tny_header_set_flags (header, TNY_HEADER_FLAG_DELETED);
+ tny_header_set_flags (header, TNY_HEADER_FLAG_SEEN);
-/* if (TNY_IS_CAMEL_IMAP_FOLDER (folder)) */
+ if (TNY_IS_CAMEL_IMAP_FOLDER (folder))
/* tny_folder_sync_async(folder, FALSE, NULL, NULL, NULL); /\* FALSE --> don't expunge *\/ */
-/* /\* tny_folder_sync (folder, FALSE, &(priv->error)); /\\* FALSE --> don't expunge *\\/ *\/ */
-/* else if (TNY_IS_CAMEL_POP_FOLDER (folder)) */
+ tny_folder_sync (folder, FALSE, &(priv->error)); /* FALSE --> don't expunge */
+ else if (TNY_IS_CAMEL_POP_FOLDER (folder))
/* tny_folder_sync_async(folder, FALSE, NULL, NULL, NULL); /\* TRUE --> dont expunge *\/ */
-/* /\* tny_folder_sync (folder, TRUE, &(priv->error)); /\\* TRUE --> expunge *\\/ *\/ */
-/* else */
-/* /\* local folders *\/ */
+ tny_folder_sync (folder, TRUE, &(priv->error)); /* TRUE --> expunge */
+ else
+ /* local folders */
/* tny_folder_sync_async(folder, TRUE, NULL, NULL, NULL); /\* TRUE --> expunge *\/ */
-/* /\* tny_folder_sync (folder, TRUE, &(priv->error)); /\\* TRUE --> expunge *\\/ *\/ */
-/* } */
+ tny_folder_sync (folder, TRUE, &(priv->error)); /* TRUE --> expunge */
+ }
/* Set status */
modest_mail_operation_notify_end (self);
}
+void
+modest_mail_operation_remove_msgs (ModestMailOperation *self,
+ TnyList *headers,
+ gboolean remove_to_trash /*ignored*/)
+{
+ TnyFolder *folder;
+ ModestMailOperationPrivate *priv;
+ TnyIterator *iter = NULL;
+ TnyHeader *header = NULL;
+
+ g_return_if_fail (MODEST_IS_MAIL_OPERATION (self));
+ g_return_if_fail (TNY_IS_LIST (headers));
+
+ if (remove_to_trash)
+ g_warning ("remove to trash is not implemented");
+
+ priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self);
+
+ /* Get folder from first header and sync it */
+ iter = tny_list_create_iterator (headers);
+ header = TNY_HEADER (tny_iterator_get_current (iter));
+ folder = tny_header_get_folder (header);
+
+ /* Get account and set it into mail_operation */
+ priv->account = modest_tny_folder_get_account (TNY_FOLDER(folder));
+
+ priv->status = MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS;
+
+ /* remove message from folder */
+ tny_folder_remove_msgs (folder, headers, &(priv->error));
+ if (!priv->error) {
+ if (TNY_IS_CAMEL_IMAP_FOLDER (folder))
+/* tny_folder_sync_async(folder, FALSE, NULL, NULL, NULL); /\* FALSE --> don't expunge *\/ */
+ tny_folder_sync (folder, FALSE, &(priv->error)); /* FALSE --> don't expunge */
+ else if (TNY_IS_CAMEL_POP_FOLDER (folder))
+/* tny_folder_sync_async(folder, FALSE, NULL, NULL, NULL); /\* TRUE --> dont expunge *\/ */
+ tny_folder_sync (folder, TRUE, &(priv->error)); /* TRUE --> expunge */
+ else
+ /* local folders */
+/* tny_folder_sync_async(folder, TRUE, NULL, NULL, NULL); /\* TRUE --> expunge *\/ */
+ tny_folder_sync (folder, TRUE, &(priv->error)); /* TRUE --> expunge */
+ }
+
+
+ /* Set status */
+ if (!priv->error)
+ priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS;
+ else
+ priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
+
+ /* Free */
+ g_object_unref (header);
+ g_object_unref (iter);
+ g_object_unref (G_OBJECT (folder));
+
+ /* Notify about operation end */
+ modest_mail_operation_notify_end (self);
+}
+
+
static void
transfer_msgs_status_cb (GObject *obj,
TnyStatus *status,
} else {
priv->done = 1;
priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS;
+
+ /* Update folder counts */
+ tny_folder_poke_status (folder);
+ tny_folder_poke_status (helper->dest_folder);
}
gboolean remove_to_trash);
/**
+ * modest_mail_operation_remove_msg:
+ * @self: a #ModestMailOperation
+ * @headers: the #TnyList of the messages to delete
+ * @remove_to_trash: TRUE to move it to trash or FALSE to delete it
+ * permanently
+ *
+ * Deletes a list of messages. This operation is synchronous, so the
+ * #ModestMailOperation should not be added to any
+ * #ModestMailOperationQueue
+ **/
+void modest_mail_operation_remove_msgs (ModestMailOperation *self,
+ TnyList *headers,
+ gboolean remove_to_trash);
+
+/**
* modest_mail_operation_get_msg:
* @self: a #ModestMailOperation
* @header_list: the #TnyHeader of the message to get
GtkWindow *win);
-/* static gint msgs_move_to_confirmation (GtkWindow *win, */
-/* TnyFolder *dest_folder, */
-/* gboolean delete, */
-/* TnyList *headers); */
-
/* Show the account creation wizard dialog.
* returns: TRUE if an account was created. FALSE if the user cancelled.
g_object_unref (G_OBJECT (mail_op));
}
-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_messages_delete (TnyList *headers, ModestWindow *win)
{
- modest_do_message_delete (header, win);
+ ModestMailOperation *mail_op = NULL;
+ 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_msgs (mail_op, headers, FALSE);
+ g_object_unref (G_OBJECT (mail_op));
}
+/* static void */
+/* headers_action_delete (TnyHeader *header, */
+/* ModestWindow *win, */
+/* gpointer user_data) */
+/* { */
+/* modest_do_message_delete (header, win); */
+
+/* } */
+
/** 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.
**/
GList *sel_list = NULL, *tmp = NULL;
GtkTreeRowReference *row_reference = NULL;
GtkTreePath *next_path = NULL;
- TnyFolder *folder = NULL;
GError *err = NULL;
/* Find last selected row */
}
}
+ /* Disable window dimming management */
+ 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);
+/* do_headers_action (win, headers_action_delete, header_view); */
+ modest_do_messages_delete (header_list, win);
+
- /* refresh the header view (removing marked-as-deleted)*/
- modest_header_view_refilter (MODEST_HEADER_VIEW(header_view));
+ /* 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));
gtk_tree_row_reference_free (row_reference);
}
- /* Get folder from first header and sync it */
- iter = tny_list_create_iterator (header_list);
- header = TNY_HEADER (tny_iterator_get_current (iter));
- folder = tny_header_get_folder (header);
- if (TNY_IS_CAMEL_IMAP_FOLDER (folder))
-/* tny_folder_sync_async(folder, FALSE, NULL, NULL, NULL); /\* FALSE --> don't expunge *\/ */
- tny_folder_sync (folder, FALSE, &err); /* FALSE --> don't expunge */
- else if (TNY_IS_CAMEL_POP_FOLDER (folder))
-/* tny_folder_sync_async(folder, FALSE, NULL, NULL, NULL); /\* TRUE --> dont expunge *\/ */
- tny_folder_sync (folder, TRUE, &err); /* TRUE --> expunge */
- else
- /* local folders */
-/* tny_folder_sync_async(folder, TRUE, NULL, NULL, NULL); /\* TRUE --> expunge *\/ */
- tny_folder_sync (folder, TRUE, &err); /* TRUE --> expunge */
-
if (err != NULL) {
printf ("DEBUG: %s: Error: code=%d, text=%s\n", __FUNCTION__, err->code, err->message);
g_error_free(err);
}
-
- g_object_unref (header);
- g_object_unref (iter);
- g_object_unref (folder);
/* Update toolbar dimming state */
modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (main_window));
folder_empty = folder_empty || all_marked_as_deleted ;
if (folder_empty) {
- printf ("DEBUG: %s: tny_folder_get_all_count() returned 0.\n", __FUNCTION__);
+ printf ("DEBUG: %s: tny_folder_get_all_count() returned 0.\n", __FUNCTION__);
modest_main_window_set_contents_style (win,
MODEST_MAIN_WINDOW_CONTENTS_STYLE_EMPTY);
} else {
gchar *from = modest_account_mgr_get_from_string (account_mgr, account_name);
-/* modest_platform_information_banner (NULL, NULL, _("mcen_ib_outbox_waiting_to_be_sent")); */
-
/* Create the mail operation */
ModestMailOperation *mail_operation = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_SEND, G_OBJECT(edit_window));
modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_operation);
GtkWidget *header_view = focused_widget;
GtkTreeSelection *selection = NULL;
- if (!(MODEST_IS_HEADER_VIEW (focused_widget)))
+ if (!(MODEST_IS_HEADER_VIEW (focused_widget))) {
header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (window),
MODEST_WIDGET_TYPE_HEADER_VIEW);
+ }
+ /* Disable window dimming management */
+ modest_window_disable_dimming (MODEST_WINDOW(window));
+
/* Select all messages */
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(header_view));
gtk_tree_selection_select_all (selection);
/* Set focuse on header view */
gtk_widget_grab_focus (header_view);
+
+
+ /* Enable window dimming management */
+ modest_window_enable_dimming (MODEST_WINDOW(window));
+ modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (window));
}
}
**/
void modest_do_message_delete (TnyHeader *header, ModestWindow *win);
+/** 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_messages_delete (TnyList *headers, ModestWindow *win);
+
/* Show the account creation wizard dialog.
* returns: TRUE if an account was created. FALSE if the user cancelled.
*/
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+#include <tny-simple-list.h>
#include <modest-header-view.h>
#include <modest-header-view-priv.h>
#include <modest-icon-names.h>
#include <modest-text-utils.h>
+#include <modest-tny-account-store.h>
#include <modest-tny-send-queue.h>
#include <modest-tny-folder.h>
#include <modest-tny-account.h>
static ModestTnySendQueueStatus
get_status_of_uid (TnyHeader *header)
{
- ModestCacheMgr *cache_mgr;
- GHashTable *send_queue_cache;
+ ModestCacheMgr *cache_mgr = NULL;
+ GHashTable *send_queue_cache = NULL;
+ ModestTnyAccountStore *accounts_store = NULL;
+ TnyList *accounts = NULL;
+ TnyIterator *iter = NULL;
+ TnyTransportAccount *account = NULL;
GSList *send_queues = NULL, *node;
/* get_msg_status returns suspended by default, so we want to detect changes */
ModestTnySendQueueStatus status = MODEST_TNY_SEND_QUEUE_SUSPENDED;
ModestTnySendQueueStatus queue_status = MODEST_TNY_SEND_QUEUE_SUSPENDED;
gchar *msg_uid = NULL;
+ ModestTnySendQueue *send_queue = NULL;
msg_uid = modest_tny_send_queue_get_msg_id (header);
cache_mgr = modest_runtime_get_cache_mgr ();
MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
-
- for (node = send_queues; node != NULL; node = g_slist_next (node)) {
- ModestTnySendQueue *send_queue = MODEST_TNY_SEND_QUEUE (node->data);
-
- queue_status = modest_tny_send_queue_get_msg_status (send_queue, msg_uid);
- if (queue_status != MODEST_TNY_SEND_QUEUE_UNKNONW) {
- status = queue_status;
- break;
+ if (send_queues == NULL) {
+ accounts = tny_simple_list_new ();
+ accounts_store = modest_runtime_get_account_store ();
+ tny_account_store_get_accounts (TNY_ACCOUNT_STORE(accounts_store),
+ accounts,
+ TNY_ACCOUNT_STORE_TRANSPORT_ACCOUNTS);
+
+ iter = tny_list_create_iterator (accounts);
+ while (!tny_iterator_is_done (iter)) {
+ account = TNY_TRANSPORT_ACCOUNT(tny_iterator_get_current (iter));
+ send_queue = modest_runtime_get_send_queue(TNY_TRANSPORT_ACCOUNT(account));
+ g_object_unref(account);
+
+ queue_status = modest_tny_send_queue_get_msg_status (send_queue, msg_uid);
+ if (queue_status != MODEST_TNY_SEND_QUEUE_UNKNONW) {
+ status = queue_status;
+ break;
+ }
+ tny_iterator_next (iter);
+ }
+ g_object_unref (iter);
+ g_object_unref (accounts);
+ }
+ else {
+ for (node = send_queues; node != NULL; node = g_slist_next (node)) {
+ send_queue = MODEST_TNY_SEND_QUEUE (node->data);
+
+ queue_status = modest_tny_send_queue_get_msg_status (send_queue, msg_uid);
+ if (queue_status != MODEST_TNY_SEND_QUEUE_UNKNONW) {
+ status = queue_status;
+ break;
+ }
}
}
sortable = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL(headers));
g_object_unref (G_OBJECT (headers));
+ /* Init filter_row function to examine empty status */
+ priv->status = HEADER_VIEW_INIT;
+
/* Create a tree model filter to hide and show rows for cut operations */
filter_model = gtk_tree_model_filter_new (sortable, NULL);
gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filter_model),
}
frees:
- priv->status = priv->status && !visible;
+ priv->status = ((gboolean) priv->status) && !visible;
/* Free */
if (header)
GtkWidget *toolbar;
GtkWidget *menubar;
DimmedState *dimming_state;
+ gboolean ui_dimming_enabled;
gchar *active_account;
};
priv->toolbar = NULL;
priv->menubar = NULL;
+ priv->dimming_state = NULL;
+ priv->ui_dimming_enabled = TRUE;
priv->active_account = NULL;
/* Connect signals */
g_return_if_fail (MODEST_IS_WINDOW (self));
priv = MODEST_WINDOW_GET_PRIVATE(self);
- modest_ui_dimming_manager_process_dimming_rules (priv->ui_dimming_manager);
+ if (priv->ui_dimming_enabled)
+ modest_ui_dimming_manager_process_dimming_rules (priv->ui_dimming_manager);
}
void
g_return_if_fail (MODEST_IS_WINDOW (self));
priv = MODEST_WINDOW_GET_PRIVATE(self);
- modest_ui_dimming_manager_process_dimming_rules_group (priv->ui_dimming_manager, group_name);
+ if (priv->ui_dimming_enabled)
+ modest_ui_dimming_manager_process_dimming_rules_group (priv->ui_dimming_manager, group_name);
}
void
return priv->dimming_state;
}
+void
+modest_window_disable_dimming (ModestWindow *self)
+{
+ ModestWindowPrivate *priv;
+
+ g_return_if_fail (MODEST_IS_WINDOW (self));
+ priv = MODEST_WINDOW_GET_PRIVATE(self);
+
+ priv->ui_dimming_enabled = FALSE;
+}
+
+void
+modest_window_enable_dimming (ModestWindow *self)
+{
+ ModestWindowPrivate *priv;
+
+ g_return_if_fail (MODEST_IS_WINDOW (self));
+ priv = MODEST_WINDOW_GET_PRIVATE(self);
+
+ priv->ui_dimming_enabled = TRUE;
+}
+
GtkAction *
modest_window_get_action (ModestWindow *window,
const gchar *action_path)
const gchar *group_name);
+/**
+ * modest_window_enable_dimming:
+ * @self: a #ModestWindow instance object
+ *
+ * Enables UI dimming rules checking.
+ *
+ **/
+void modest_window_enable_dimming (ModestWindow *self);
+
+
+/**
+ * modest_window_disable_dimming:
+ * @self: a #ModestWindow instance object
+ *
+ * Disables UI dimming rules checking.
+ *
+ **/
+void modest_window_disable_dimming (ModestWindow *self);
+
+
void modest_window_disconnect_signals (ModestWindow *self);