aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Barnes <mbarnes@redhat.com>2011-05-03 09:01:48 +0800
committerMatthew Barnes <mbarnes@redhat.com>2011-05-03 09:01:48 +0800
commitae28ea4621c9ced08524548ca67a5297c284ce01 (patch)
treecfdedc1510c91df7f11712007fb257e9c5c26791
parent52844f40f158be11749f5d8dcdf52454e776c9bd (diff)
downloadgsoc2013-evolution-ae28ea4621c9ced08524548ca67a5297c284ce01.tar
gsoc2013-evolution-ae28ea4621c9ced08524548ca67a5297c284ce01.tar.gz
gsoc2013-evolution-ae28ea4621c9ced08524548ca67a5297c284ce01.tar.bz2
gsoc2013-evolution-ae28ea4621c9ced08524548ca67a5297c284ce01.tar.lz
gsoc2013-evolution-ae28ea4621c9ced08524548ca67a5297c284ce01.tar.xz
gsoc2013-evolution-ae28ea4621c9ced08524548ca67a5297c284ce01.tar.zst
gsoc2013-evolution-ae28ea4621c9ced08524548ca67a5297c284ce01.zip
EMailShellView: Open the selected folder ourselves.
This one's a little involved: - EMailShellView now obtains a CamelFolder itself in response to EMFolderTree::folder-selected signals. Uses EActivity to do so. - Revise EMFolderTree::folder-selected signal arguments to be more useful: emit a CamelStore object instead of a folder URI. - Also revise EMFolderTree::folder-activiated signal arguments the same way while we're at it. - Remove the "folder_uri" argument from e_mail_reader_set_folder(). If you have a CamelFolder object you can obtain the URI string by calling camel_folder_get_uri().
-rw-r--r--e-util/e-marshal.list2
-rw-r--r--mail/e-mail-notebook-view.c14
-rw-r--r--mail/e-mail-paned-view.c7
-rw-r--r--mail/e-mail-reader-utils.c2
-rw-r--r--mail/e-mail-reader.c22
-rw-r--r--mail/e-mail-reader.h6
-rw-r--r--mail/em-folder-selector.c14
-rw-r--r--mail/em-folder-tree.c49
-rw-r--r--mail/em-folder-tree.h10
-rw-r--r--mail/mail.error.xml6
-rw-r--r--modules/mail/e-mail-shell-backend.c2
-rw-r--r--modules/mail/e-mail-shell-content.c5
-rw-r--r--modules/mail/e-mail-shell-view-private.c119
-rw-r--r--modules/mail/e-mail-shell-view-private.h3
-rw-r--r--modules/mail/e-mail-shell-view.c22
15 files changed, 194 insertions, 89 deletions
diff --git a/e-util/e-marshal.list b/e-util/e-marshal.list
index d4e6f43f15..7cdfc091ca 100644
--- a/e-util/e-marshal.list
+++ b/e-util/e-marshal.list
@@ -43,6 +43,7 @@ NONE:OBJECT,STRING
NONE:OBJECT,STRING,INT
NONE:OBJECT,STRING,STRING
NONE:OBJECT,STRING,STRING,INT,STRING,STRING,STRING
+NONE:OBJECT,STRING,UINT
NONE:POINTER,INT
NONE:POINTER,INT,INT,INT,INT
NONE:POINTER,INT,OBJECT
@@ -53,6 +54,5 @@ NONE:STRING,DOUBLE
NONE:STRING,INT,INT
NONE:STRING,POINTER,POINTER
NONE:STRING,STRING
-NONE:STRING,STRING,UINT
NONE:UINT,STRING
STRING:NONE
diff --git a/mail/e-mail-notebook-view.c b/mail/e-mail-notebook-view.c
index bd92b52d14..d5a7965bab 100644
--- a/mail/e-mail-notebook-view.c
+++ b/mail/e-mail-notebook-view.c
@@ -981,7 +981,7 @@ mail_netbook_view_open_mail (EMailView *view,
E_MAIL_READER (pane), "folder-loaded",
G_CALLBACK (reconnect_folder_loaded_event), nview);
e_mail_reader_set_folder (
- E_MAIL_READER (pane), folder, folder_uri);
+ E_MAIL_READER (pane), folder);
e_mail_reader_set_group_by_threads (
E_MAIL_READER (pane),
e_mail_reader_get_group_by_threads (E_MAIL_READER (view)));
@@ -1078,22 +1078,23 @@ build_histogram (GtkWidget *widget, CamelFolder *folder)
static void
mail_notebook_view_set_folder (EMailReader *reader,
- CamelFolder *folder,
- const gchar *folder_uri)
+ CamelFolder *folder)
{
EMailNotebookViewPrivate *priv;
GtkWidget *new_view;
+ const gchar *folder_uri;
#if HAVE_CLUTTER
EMailTab *tab;
ClutterActor *clone;
ClutterTimeline *timeline;
#endif
- if (!folder_uri)
+ if (folder == NULL)
return;
priv = E_MAIL_NOTEBOOK_VIEW (reader)->priv;
+ folder_uri = camel_folder_get_uri (folder);
new_view = g_hash_table_lookup (priv->views, folder_uri);
if (new_view) {
gint curr = emnv_get_page_num (E_MAIL_NOTEBOOK_VIEW (reader), new_view);
@@ -1123,7 +1124,8 @@ mail_notebook_view_set_folder (EMailReader *reader,
return;
}
- if (folder || folder_uri) {
+ /* FIXME Redundant NULL check. */
+ if (folder != NULL) {
gint page;
#if HAVE_CLUTTER
GtkWidget *list;
@@ -1221,7 +1223,7 @@ mail_notebook_view_set_folder (EMailReader *reader,
g_object_set_data ((GObject *)list, "actor", priv->actor);
#endif
- e_mail_reader_set_folder (E_MAIL_READER (priv->current_view), folder, folder_uri);
+ e_mail_reader_set_folder (E_MAIL_READER (priv->current_view), folder);
g_hash_table_insert (priv->views, g_strdup (folder_uri), priv->current_view);
g_signal_connect (
priv->current_view, "changed",
diff --git a/mail/e-mail-paned-view.c b/mail/e-mail-paned-view.c
index c1e4cc415a..62d3e67c8e 100644
--- a/mail/e-mail-paned-view.c
+++ b/mail/e-mail-paned-view.c
@@ -456,8 +456,7 @@ mail_paned_view_get_window (EMailReader *reader)
static void
mail_paned_view_set_folder (EMailReader *reader,
- CamelFolder *folder,
- const gchar *folder_uri)
+ CamelFolder *folder)
{
EMailPanedViewPrivate *priv;
EMailView *view;
@@ -469,6 +468,7 @@ mail_paned_view_set_folder (EMailReader *reader,
GtkWidget *message_list;
GKeyFile *key_file;
gchar *group_name;
+ const gchar *folder_uri;
const gchar *key;
gboolean value;
GError *error = NULL;
@@ -488,7 +488,7 @@ mail_paned_view_set_folder (EMailReader *reader,
/* Chain up to interface's default set_folder() method. */
default_interface = g_type_default_interface_peek (E_TYPE_MAIL_READER);
- default_interface->set_folder (reader, folder, folder_uri);
+ default_interface->set_folder (reader, folder);
if (folder == NULL)
goto exit;
@@ -507,6 +507,7 @@ mail_paned_view_set_folder (EMailReader *reader,
/* Restore the folder's preview and threaded state. */
+ folder_uri = camel_folder_get_uri (folder);
key_file = e_shell_view_get_state_key_file (shell_view);
group_name = g_strdup_printf ("Folder %s", folder_uri);
diff --git a/mail/e-mail-reader-utils.c b/mail/e-mail-reader-utils.c
index c74caadc34..7f7d57d438 100644
--- a/mail/e-mail-reader-utils.c
+++ b/mail/e-mail-reader-utils.c
@@ -294,7 +294,7 @@ e_mail_reader_open_selected (EMailReader *reader)
browser = e_mail_browser_new (backend);
e_mail_reader_set_folder (
- E_MAIL_READER (browser), folder, folder_uri);
+ E_MAIL_READER (browser), folder);
e_mail_reader_set_message (E_MAIL_READER (browser), uid);
copy_tree_state (reader, E_MAIL_READER (browser));
e_mail_reader_set_group_by_threads (
diff --git a/mail/e-mail-reader.c b/mail/e-mail-reader.c
index f26921c328..c9a43869fb 100644
--- a/mail/e-mail-reader.c
+++ b/mail/e-mail-reader.c
@@ -1697,11 +1697,9 @@ action_mail_show_source_cb (GtkAction *action,
CamelFolder *folder;
GtkWidget *browser;
GPtrArray *uids;
- const gchar *folder_uri;
backend = e_mail_reader_get_backend (reader);
folder = e_mail_reader_get_folder (reader);
- folder_uri = e_mail_reader_get_folder_uri (reader);
uids = e_mail_reader_get_selected_uids (reader);
g_return_if_fail (uids->len > 0);
@@ -1714,7 +1712,7 @@ action_mail_show_source_cb (GtkAction *action,
em_format_set_mode (
EM_FORMAT (formatter), EM_FORMAT_MODE_SOURCE);
- e_mail_reader_set_folder (reader, folder, folder_uri);
+ e_mail_reader_set_folder (reader, folder);
e_mail_reader_set_message (reader, uids->pdata[0]);
gtk_widget_show (browser);
@@ -2899,8 +2897,7 @@ mail_reader_get_enable_show_folder (EMailReader *reader)
static void
mail_reader_set_folder (EMailReader *reader,
- CamelFolder *folder,
- const gchar *folder_uri)
+ CamelFolder *folder)
{
EMailReaderPrivate *priv;
EMFormatHTML *formatter;
@@ -2908,7 +2905,7 @@ mail_reader_set_folder (EMailReader *reader,
GtkWidget *message_list;
EMailBackend *backend;
EShell *shell;
- const gchar *previous_folder_uri;
+ const gchar *folder_uri = NULL;
gboolean outgoing;
priv = E_MAIL_READER_GET_PRIVATE (reader);
@@ -2918,7 +2915,6 @@ mail_reader_set_folder (EMailReader *reader,
message_list = e_mail_reader_get_message_list (reader);
previous_folder = e_mail_reader_get_folder (reader);
- previous_folder_uri = e_mail_reader_get_folder_uri (reader);
shell = e_shell_backend_get_shell (E_SHELL_BACKEND (backend));
@@ -2927,9 +2923,12 @@ mail_reader_set_folder (EMailReader *reader,
mail_sync_folder (previous_folder, NULL, NULL);
/* Skip the rest if we're already viewing the folder. */
- if (g_strcmp0 (folder_uri, previous_folder_uri) == 0)
+ if (folder == previous_folder)
return;
+ if (folder != NULL)
+ folder_uri = camel_folder_get_uri (folder);
+
outgoing = folder != NULL && folder_uri != NULL && (
em_utils_folder_is_drafts (folder, folder_uri) ||
em_utils_folder_is_outbox (folder, folder_uri) ||
@@ -4109,8 +4108,7 @@ e_mail_reader_get_folder_uri (EMailReader *reader)
void
e_mail_reader_set_folder (EMailReader *reader,
- CamelFolder *folder,
- const gchar *folder_uri)
+ CamelFolder *folder)
{
EMailReaderInterface *interface;
@@ -4119,7 +4117,7 @@ e_mail_reader_set_folder (EMailReader *reader,
interface = E_MAIL_READER_GET_INTERFACE (reader);
g_return_if_fail (interface->set_folder != NULL);
- interface->set_folder (reader, folder, folder_uri);
+ interface->set_folder (reader, folder);
}
/* Helper for e_mail_reader_set_folder_uri () */
@@ -4130,7 +4128,7 @@ mail_reader_got_folder_cb (gchar *folder_uri,
{
EMailReader *reader = user_data;
- e_mail_reader_set_folder (reader, folder, folder_uri);
+ e_mail_reader_set_folder (reader, folder);
}
void
diff --git a/mail/e-mail-reader.h b/mail/e-mail-reader.h
index d9a78f2cc9..8076b08061 100644
--- a/mail/e-mail-reader.h
+++ b/mail/e-mail-reader.h
@@ -98,8 +98,7 @@ struct _EMailReaderInterface {
CamelFolder * (*get_folder) (EMailReader *reader);
const gchar * (*get_folder_uri) (EMailReader *reader);
void (*set_folder) (EMailReader *reader,
- CamelFolder *folder,
- const gchar *folder_uri);
+ CamelFolder *folder);
void (*set_message) (EMailReader *reader,
const gchar *uid);
guint (*open_selected_mail) (EMailReader *reader);
@@ -136,8 +135,7 @@ GtkWindow * e_mail_reader_get_window (EMailReader *reader);
CamelFolder * e_mail_reader_get_folder (EMailReader *reader);
const gchar * e_mail_reader_get_folder_uri (EMailReader *reader);
void e_mail_reader_set_folder (EMailReader *reader,
- CamelFolder *folder,
- const gchar *folder_uri);
+ CamelFolder *folder);
void e_mail_reader_set_folder_uri (EMailReader *reader,
const gchar *folder_uri);
void e_mail_reader_set_message (EMailReader *reader,
diff --git a/mail/em-folder-selector.c b/mail/em-folder-selector.c
index 514493664e..ae3092d4df 100644
--- a/mail/em-folder-selector.c
+++ b/mail/em-folder-selector.c
@@ -139,16 +139,24 @@ emfs_create_name_changed (GtkEntry *entry, EMFolderSelector *emfs)
}
static void
-folder_selected_cb (EMFolderTree *emft, const gchar *path, const gchar *uri, guint32 flags, EMFolderSelector *emfs)
+folder_selected_cb (EMFolderTree *emft,
+ CamelStore *store,
+ const gchar *folder_name,
+ CamelFolderInfoFlags flags,
+ EMFolderSelector *emfs)
{
if (emfs->name_entry)
emfs_create_name_changed (emfs->name_entry, emfs);
else
- gtk_dialog_set_response_sensitive (GTK_DIALOG (emfs), GTK_RESPONSE_OK, TRUE);
+ gtk_dialog_set_response_sensitive (
+ GTK_DIALOG (emfs), GTK_RESPONSE_OK, TRUE);
}
static void
-folder_activated_cb (EMFolderTree *emft, const gchar *path, const gchar *uri, EMFolderSelector *emfs)
+folder_activated_cb (EMFolderTree *emft,
+ CamelStore *store,
+ const gchar *folder_name,
+ EMFolderSelector *emfs)
{
gtk_dialog_response ((GtkDialog *) emfs, GTK_RESPONSE_OK);
}
diff --git a/mail/em-folder-tree.c b/mail/em-folder-tree.c
index e0ce87b89c..849fb87c82 100644
--- a/mail/em-folder-tree.c
+++ b/mail/em-folder-tree.c
@@ -672,11 +672,11 @@ folder_tree_selection_changed_cb (EMFolderTree *folder_tree,
GtkTreeModel *model;
GtkTreeIter iter;
GList *list;
- guint32 flags = 0;
+ CamelStore *store = NULL;
+ CamelFolderInfoFlags flags = 0;
guint unread = 0;
guint old_unread = 0;
- gchar *full_name = NULL;
- gchar *uri = NULL;
+ gchar *folder_name = NULL;
list = gtk_tree_selection_get_selected_rows (selection, &model);
@@ -687,10 +687,11 @@ folder_tree_selection_changed_cb (EMFolderTree *folder_tree,
gtk_tree_model_get (
model, &iter,
- COL_STRING_FULL_NAME, &full_name,
- COL_STRING_URI, &uri, COL_UINT_FLAGS, &flags,
- COL_UINT_UNREAD, &unread, COL_UINT_UNREAD_LAST_SEL,
- &old_unread, -1);
+ COL_POINTER_CAMEL_STORE, &store,
+ COL_STRING_FULL_NAME, &folder_name,
+ COL_UINT_FLAGS, &flags,
+ COL_UINT_UNREAD, &unread,
+ COL_UINT_UNREAD_LAST_SEL, &old_unread, -1);
/* Sync unread counts to distinguish new incoming mail. */
if (unread != old_unread)
@@ -700,10 +701,10 @@ folder_tree_selection_changed_cb (EMFolderTree *folder_tree,
exit:
g_signal_emit (
- folder_tree, signals[FOLDER_SELECTED], 0, full_name, uri, flags);
+ folder_tree, signals[FOLDER_SELECTED], 0,
+ store, folder_name, flags);
- g_free (full_name);
- g_free (uri);
+ g_free (folder_name);
g_list_foreach (list, (GFunc) gtk_tree_path_free, NULL);
g_list_free (list);
@@ -972,9 +973,10 @@ folder_tree_row_activated (GtkTreeView *tree_view,
{
EMFolderTreePrivate *priv;
GtkTreeModel *model;
- gchar *full_name, *uri;
+ gchar *folder_name;
GtkTreeIter iter;
- guint32 flags;
+ CamelStore *store;
+ CamelFolderInfoFlags flags;
priv = EM_FOLDER_TREE (tree_view)->priv;
@@ -987,19 +989,22 @@ folder_tree_row_activated (GtkTreeView *tree_view,
return;
gtk_tree_model_get (
- model, &iter, COL_STRING_FULL_NAME, &full_name,
- COL_STRING_URI, &uri, COL_UINT_FLAGS, &flags, -1);
+ model, &iter,
+ COL_POINTER_CAMEL_STORE, &store,
+ COL_STRING_FULL_NAME, &folder_name,
+ COL_UINT_FLAGS, &flags, -1);
folder_tree_clear_selected_list (EM_FOLDER_TREE (tree_view));
g_signal_emit (
- tree_view, signals[FOLDER_SELECTED], 0, full_name, uri, flags);
+ tree_view, signals[FOLDER_SELECTED], 0,
+ store, folder_name, flags);
g_signal_emit (
- tree_view, signals[FOLDER_ACTIVATED], 0, full_name, uri);
+ tree_view, signals[FOLDER_ACTIVATED], 0,
+ store, folder_name);
- g_free (full_name);
- g_free (uri);
+ g_free (folder_name);
}
static gboolean
@@ -1132,9 +1137,9 @@ folder_tree_class_init (EMFolderTreeClass *class)
G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (EMFolderTreeClass, folder_selected),
NULL, NULL,
- e_marshal_VOID__STRING_STRING_UINT,
+ e_marshal_VOID__OBJECT_STRING_UINT,
G_TYPE_NONE, 3,
- G_TYPE_STRING,
+ CAMEL_TYPE_STORE,
G_TYPE_STRING,
G_TYPE_UINT);
@@ -1144,9 +1149,9 @@ folder_tree_class_init (EMFolderTreeClass *class)
G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (EMFolderTreeClass, folder_activated),
NULL, NULL,
- e_marshal_VOID__STRING_STRING,
+ e_marshal_VOID__OBJECT_STRING,
G_TYPE_NONE, 2,
- G_TYPE_STRING,
+ CAMEL_TYPE_STORE,
G_TYPE_STRING);
signals[POPUP_EVENT] = g_signal_new (
diff --git a/mail/em-folder-tree.h b/mail/em-folder-tree.h
index c824e86ed2..4cb032b6b3 100644
--- a/mail/em-folder-tree.h
+++ b/mail/em-folder-tree.h
@@ -78,12 +78,12 @@ struct _EMFolderTreeClass {
/* signals */
void (*folder_activated) (EMFolderTree *folder_tree,
- const gchar *full_name,
- const gchar *uri);
+ CamelStore *store,
+ const gchar *folder_name);
void (*folder_selected) (EMFolderTree *folder_tree,
- const gchar *full_name,
- const gchar *uri,
- guint32 flags);
+ CamelStore *store,
+ const gchar *folder_name,
+ CamelFolderInfoFlags flags);
void (*popup_event) (EMFolderTree *folder_tree);
void (*hidden_key_event) (EMFolderTree *emft, GdkEvent *event);
};
diff --git a/mail/mail.error.xml b/mail/mail.error.xml
index 4b9b98699e..67b7e09961 100644
--- a/mail/mail.error.xml
+++ b/mail/mail.error.xml
@@ -504,5 +504,11 @@ An mbox account will be created to preserve the old mbox folders. You can delete
<_primary>Unable to retrieve message.</_primary>
<_secondary xml:space="preserve">{0}</_secondary>
</error>
+
+ <error id="folder-open" type="error">
+ <_primary>Failed to open folder.</_primary>
+ <_secondary>The reported error was &quot;{0}&quot;.</_secondary>
+ </error>
+
</error-list>
diff --git a/modules/mail/e-mail-shell-backend.c b/modules/mail/e-mail-shell-backend.c
index 1de34a97ed..609e483083 100644
--- a/modules/mail/e-mail-shell-backend.c
+++ b/modules/mail/e-mail-shell-backend.c
@@ -315,7 +315,7 @@ mail_shell_backend_handle_email_uri_cb (gchar *folder_uri,
/* FIXME Should pass in the shell module. */
browser = e_mail_browser_new (backend);
e_mail_reader_set_folder (
- E_MAIL_READER (browser), folder, folder_uri);
+ E_MAIL_READER (browser), folder);
e_mail_reader_set_message (E_MAIL_READER (browser), uid);
gtk_widget_show (browser);
}
diff --git a/modules/mail/e-mail-shell-content.c b/modules/mail/e-mail-shell-content.c
index c3b6cf978b..57d1663434 100644
--- a/modules/mail/e-mail-shell-content.c
+++ b/modules/mail/e-mail-shell-content.c
@@ -361,8 +361,7 @@ mail_shell_content_get_window (EMailReader *reader)
static void
mail_shell_content_set_folder (EMailReader *reader,
- CamelFolder *folder,
- const gchar *folder_uri)
+ CamelFolder *folder)
{
EMailShellContentPrivate *priv;
@@ -372,7 +371,7 @@ mail_shell_content_set_folder (EMailReader *reader,
* also implements the EMailReader interface. */
reader = E_MAIL_READER (priv->mail_view);
- return e_mail_reader_set_folder (reader, folder, folder_uri);
+ return e_mail_reader_set_folder (reader, folder);
}
static void
diff --git a/modules/mail/e-mail-shell-view-private.c b/modules/mail/e-mail-shell-view-private.c
index ac13439eb6..c67dc76773 100644
--- a/modules/mail/e-mail-shell-view-private.c
+++ b/modules/mail/e-mail-shell-view-private.c
@@ -26,36 +26,125 @@
#include "e-util/e-util-private.h"
+typedef struct _AsyncContext AsyncContext;
+
+struct _AsyncContext {
+ EActivity *activity;
+ EMailReader *reader;
+ EShellView *shell_view;
+};
+
+static void
+async_context_free (AsyncContext *context)
+{
+ if (context->activity != NULL)
+ g_object_unref (context->activity);
+
+ if (context->reader != NULL)
+ g_object_unref (context->reader);
+
+ if (context->shell_view != NULL)
+ g_object_unref (context->shell_view);
+
+ g_slice_free (AsyncContext, context);
+}
+
+static void
+mail_shell_view_got_folder_cb (CamelStore *store,
+ GAsyncResult *result,
+ AsyncContext *context)
+{
+ EAlertSink *alert_sink;
+ CamelFolder *folder;
+ GError *error = NULL;
+
+ alert_sink = e_activity_get_alert_sink (context->activity);
+
+ folder = camel_store_get_folder_finish (store, result, &error);
+
+ /* Ignore cancellations. */
+ if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+ g_warn_if_fail (folder == NULL);
+ async_context_free (context);
+ g_error_free (error);
+ return;
+
+ } else if (error != NULL) {
+ g_warn_if_fail (folder == NULL);
+ e_alert_submit (
+ alert_sink, "folder-open",
+ error->message, NULL);
+ async_context_free (context);
+ g_error_free (error);
+ return;
+ }
+
+ e_mail_reader_set_folder (context->reader, folder);
+ e_shell_view_update_actions (context->shell_view);
+
+ g_object_unref (folder);
+
+ async_context_free (context);
+}
+
static void
mail_shell_view_folder_tree_selected_cb (EMailShellView *mail_shell_view,
- const gchar *full_name,
- const gchar *uri,
- guint32 flags,
+ CamelStore *store,
+ const gchar *folder_name,
+ CamelFolderInfoFlags flags,
EMFolderTree *folder_tree)
{
EMailShellContent *mail_shell_content;
+ EShellBackend *shell_backend;
EShellView *shell_view;
EMailReader *reader;
EMailView *mail_view;
- gboolean folder_selected;
+ GCancellable *cancellable;
+ EAlertSink *alert_sink;
+ AsyncContext *context;
shell_view = E_SHELL_VIEW (mail_shell_view);
+ shell_backend = e_shell_view_get_shell_backend (shell_view);
mail_shell_content = mail_shell_view->priv->mail_shell_content;
mail_view = e_mail_shell_content_get_mail_view (mail_shell_content);
reader = E_MAIL_READER (mail_view);
- folder_selected =
- !(flags & CAMEL_FOLDER_NOSELECT) &&
- full_name != NULL;
+ /* Cancel any unfinished open folder operations. */
+ if (mail_shell_view->priv->opening_folder != NULL) {
+ g_cancellable_cancel (mail_shell_view->priv->opening_folder);
+ mail_shell_view->priv->opening_folder = NULL;
+ }
- if (folder_selected)
- e_mail_reader_set_folder_uri (reader, uri);
- else
- e_mail_reader_set_folder (reader, NULL, NULL);
+ /* If we are to clear the message list, do so immediately. */
+ if ((flags & CAMEL_FOLDER_NOSELECT) || folder_name == NULL) {
+ e_mail_reader_set_folder (reader, NULL);
+ e_shell_view_update_actions (shell_view);
+ return;
+ }
- e_shell_view_update_actions (shell_view);
+ g_warn_if_fail (CAMEL_IS_STORE (store));
+
+ /* Open the selected folder asynchronously. */
+
+ context = g_slice_new0 (AsyncContext);
+ context->activity = e_activity_new ();
+ context->reader = g_object_ref (reader);
+ context->shell_view = g_object_ref (shell_view);
+
+ alert_sink = E_ALERT_SINK (mail_shell_content);
+ e_activity_set_alert_sink (context->activity, alert_sink);
+
+ cancellable = camel_operation_new ();
+ e_activity_set_cancellable (context->activity, cancellable);
+ mail_shell_view->priv->opening_folder = cancellable;
+
+ e_shell_backend_add_activity (shell_backend, context->activity);
+
+ camel_store_get_folder (
+ store, folder_name, 0, G_PRIORITY_DEFAULT, cancellable,
+ (GAsyncReadyCallback) mail_shell_view_got_folder_cb, context);
}
static gboolean
@@ -748,6 +837,12 @@ e_mail_shell_view_private_dispose (EMailShellView *mail_shell_view)
for (ii = 0; ii < MAIL_NUM_SEARCH_RULES; ii++)
DISPOSE (priv->search_rules[ii]);
+ if (priv->opening_folder != NULL) {
+ g_cancellable_cancel (priv->opening_folder);
+ g_object_unref (priv->opening_folder);
+ priv->opening_folder = NULL;
+ }
+
if (priv->search_account_all != NULL) {
g_object_unref (priv->search_account_all);
priv->search_account_all = NULL;
diff --git a/modules/mail/e-mail-shell-view-private.h b/modules/mail/e-mail-shell-view-private.h
index ac460a7b40..01097056b0 100644
--- a/modules/mail/e-mail-shell-view-private.h
+++ b/modules/mail/e-mail-shell-view-private.h
@@ -149,6 +149,9 @@ struct _EMailShellViewPrivate {
/* EShell::prepare-for-quit */
gulong prepare_for_quit_handler_id;
+ /* For opening the selected folder. */
+ GCancellable *opening_folder;
+
/* Search folders for interactive search. */
CamelVeeFolder *search_account_all;
CamelVeeFolder *search_account_current;
diff --git a/modules/mail/e-mail-shell-view.c b/modules/mail/e-mail-shell-view.c
index 4af7de5a1b..0b0f13e5d3 100644
--- a/modules/mail/e-mail-shell-view.c
+++ b/modules/mail/e-mail-shell-view.c
@@ -116,8 +116,7 @@ mail_shell_view_setup_search_results_folder (CamelFolder *folder,
static void
mail_shell_view_show_search_results_folder (EMailShellView *mail_shell_view,
- CamelFolder *folder,
- const gchar *folder_uri)
+ CamelFolder *folder)
{
EMailShellContent *mail_shell_content;
GtkWidget *message_list;
@@ -132,7 +131,7 @@ mail_shell_view_show_search_results_folder (EMailShellView *mail_shell_view,
message_list_freeze (MESSAGE_LIST (message_list));
- e_mail_reader_set_folder (reader, folder, folder_uri);
+ e_mail_reader_set_folder (reader, folder);
e_tree_set_state (E_TREE (message_list), SEARCH_RESULTS_STATE);
message_list_thaw (MESSAGE_LIST (message_list));
@@ -240,7 +239,6 @@ mail_shell_view_execute_search (EShellView *shell_view)
gchar *query;
gchar *temp;
gchar *tag;
- gchar *uri;
const gchar *use_tag;
gint value;
@@ -519,9 +517,7 @@ all_accounts:
* folder URI and let the asynchronous callbacks run
* after we've already kicked off the search. */
folder = em_folder_tree_get_selected_folder (folder_tree);
- uri = em_folder_tree_get_selected_uri (folder_tree);
- e_mail_reader_set_folder (reader, folder, uri);
- g_free (uri);
+ e_mail_reader_set_folder (reader, folder);
gtk_widget_set_sensitive (GTK_WIDGET (combo_box), TRUE);
@@ -606,11 +602,9 @@ all_accounts:
CAMEL_FOLDER (search_folder), list,
priv->search_account_cancel);
- folder_uri = camel_folder_get_uri (CAMEL_FOLDER (search_folder));
-
mail_shell_view_show_search_results_folder (
E_MAIL_SHELL_VIEW (shell_view),
- CAMEL_FOLDER (search_folder), folder_uri);
+ CAMEL_FOLDER (search_folder));
goto execute;
@@ -639,9 +633,7 @@ current_account:
* folder URI and let the asynchronous callbacks run
* after we've already kicked off the search. */
folder = em_folder_tree_get_selected_folder (folder_tree);
- uri = em_folder_tree_get_selected_uri (folder_tree);
- e_mail_reader_set_folder (reader, folder, uri);
- g_free (uri);
+ e_mail_reader_set_folder (reader, folder);
gtk_widget_set_sensitive (GTK_WIDGET (combo_box), TRUE);
@@ -758,11 +750,9 @@ current_account:
CAMEL_FOLDER (search_folder), list,
priv->search_account_cancel);
- folder_uri = camel_folder_get_uri (CAMEL_FOLDER (search_folder));
-
mail_shell_view_show_search_results_folder (
E_MAIL_SHELL_VIEW (shell_view),
- CAMEL_FOLDER (search_folder), folder_uri);
+ CAMEL_FOLDER (search_folder));
execute: