#include "modest-account-mgr.h"
#include "modest-account-mgr-helpers.h"
#include "modest-tny-account.h"
+#include "modest-tny-folder.h"
#include "modest-ui-actions.h"
#include "modest-search.h"
static TnyMsg *
-find_message_by_url (const char *uri, TnyAccount **ac_out)
+find_message_by_url (const char *uri, TnyFolder **folder_out, TnyAccount **ac_out)
{
ModestTnyAccountStore *astore;
TnyAccount *account;
}
g_debug ("%s: Account is store account.\n", __FUNCTION__);
-
*ac_out = account;
folder = tny_store_account_find_folder (TNY_STORE_ACCOUNT (account),
tny_account_get_id (TNY_ACCOUNT(account)), uri);
goto out;
}
+ *folder = folder;
+
g_debug ("%s: Found folder. (%s)\n", __FUNCTION__, uri);
*ac_out = NULL;
}
- if (folder) {
+ if (folder && !msg) {
g_object_unref (folder);
+ *folder_out = NULL;
}
return msg;
static gboolean
on_idle_open_message (gpointer user_data)
{
- ModestWindow *msg_view;
+ ModestWindow *msg_view = NULL;
TnyMsg *msg;
- TnyAccount *account;
+ TnyAccount *account = NULL;
TnyHeader *header;
const char *msg_uid;
const char *account_name;
char *uri;
-
+ ModestWindowMgr *win_mgr;
+ TnyFolder *folder = NULL;
+
uri = (char *) user_data;
- g_debug ("%s: Trying to find msg by url: %s", __FUNCTION__, uri);
- msg = find_message_by_url (uri, &account);
+ g_debug ("%s: Trying to find msg by url: %s", __FUNCTION__, uri);
+ msg = find_message_by_url (uri, &folder, &account);
g_free (uri);
if (msg == NULL) {
}
g_debug (" %s: Found message.", __FUNCTION__);
+ if (modest_tny_folder_get_local_folder_type (folder) == TNY_FOLDER_TYPE_DRAFTS) {
+ g_debug ("draft messages should be opened in edit mode... ");
+ }
+
header = tny_msg_get_header (msg);
account_name = tny_account_get_name (account);
- msg_uid = tny_header_get_uid (header);
-
+ msg_uid = modest_tny_folder_get_header_unique_id(header);
+/* FIXME: modest_tny_folder_get_header_unique_id warns against this */
+ win_mgr = modest_runtime_get_window_mgr ();
+
gdk_threads_enter ();
-
- msg_view = modest_msg_view_window_new (msg,
- account_name,
- msg_uid);
- modest_window_mgr_register_window (modest_runtime_get_window_mgr (), msg_view);
- gtk_widget_show_all (GTK_WIDGET (msg_view));
+ if (modest_window_mgr_find_registered_header (win_mgr, header, &msg_view)) {
+ g_debug ("window for this msg is open already");
+ if (!MODEST_IS_MSG_VIEW_WINDOW(msg_view))
+ g_debug ("not a msg view");
+ else {
+ gtk_window_present (GTK_WINDOW(msg_view));
+ }
+ } else {
+ g_debug ("creating new window for this msg");
+ modest_window_mgr_register_header (win_mgr, header);
+ msg_view = modest_msg_view_window_new (msg,account_name,
+ msg_uid);
+ modest_window_mgr_register_window (win_mgr, msg_view);
+ gtk_widget_show_all (GTK_WIDGET (msg_view));
+ }
gdk_threads_leave ();
g_object_unref (header);
g_object_unref (account);
- g_object_unref (msg_view);
-
+ g_object_unref (folder);
+
return FALSE; /* Do not call this callback again. */
}
priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
uid = modest_tny_folder_get_header_unique_id (header);
-
- if (!has_uid (priv->preregistered_uids, uid))
+
+
+ if (!has_uid (priv->preregistered_uids, uid)) {
+ g_debug ("registering new uid %s", uid);
priv->preregistered_uids = append_uid (priv->preregistered_uids, uid);
+ } else
+ g_debug ("already had uid %s", uid);
g_free (uid);
}
priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
uid = modest_tny_folder_get_header_unique_id (header);
- if (has_uid (priv->preregistered_uids, uid))
+ if (!has_uid (priv->preregistered_uids, uid)) {
+ g_debug ("trying to unregister non-existing uid %s", uid);
+ priv->preregistered_uids = append_uid (priv->preregistered_uids, uid);
+ } else
+ g_debug ("unregistering uid %s", uid);
+
+ if (has_uid (priv->preregistered_uids, uid)) {
priv->preregistered_uids = remove_uid (priv->preregistered_uids, uid);
+ if (has_uid (priv->preregistered_uids, uid))
+ g_debug ("BUG: uid %s NOT removed", uid);
+ else
+ g_debug ("uid %s removed", uid);
+ }
g_free (uid);
}
{
ModestWindowMgrPrivate *priv;
gchar* uid;
- gboolean retval = FALSE;
+ gboolean has_header, has_window = FALSE;
GList *item = NULL;
g_return_val_if_fail (MODEST_IS_WINDOW_MGR (self), FALSE);
uid = modest_tny_folder_get_header_unique_id (header);
- /* first, look for the window */
- /* note, the UID cannot be in both the window list and the preregistered uid list */
- if (priv->window_list) {
- item = g_list_find_custom (priv->window_list,
- uid, (GCompareFunc) compare_msguids);
- if (item)
- retval = TRUE;
- if (win)
- *win = item ? MODEST_WINDOW(item->data) : NULL;
- }
+ if (win)
+ *win = NULL;
+ g_debug ("windows in list: %d", g_list_length (priv->window_list));
+ g_debug ("headers in list: %d", g_slist_length (priv->preregistered_uids));
- /* IF It's not in the window list. maybe it's in our uid list... */
- retval = retval || has_uid (priv->preregistered_uids, uid);
+ has_header = has_uid (priv->preregistered_uids, uid);
+
+ item = g_list_find_custom (priv->window_list, uid, (GCompareFunc) compare_msguids);
+ if (item) {
+ has_window = TRUE;
+ if (win) {
+ if (!MODEST_IS_MSG_VIEW_WINDOW(item->data))
+ g_debug ("not a valid window!");
+ else {
+ g_debug ("found a window");
+ *win = MODEST_WINDOW (item->data);
+ }
+ }
+ }
g_free (uid);
-
- return retval;
+ return has_header || has_window;
}
g_warning ("Trying to register an already registered window");
return;
}
-
+
/* Check that it's not a second main window */
if (MODEST_IS_MAIN_WINDOW (window)) {
if (priv->main_window) {
/* remove from the list of pre-registered uids */
if (MODEST_IS_MSG_VIEW_WINDOW(window)) {
+ const gchar *uid = modest_msg_view_window_get_message_uid
+ (MODEST_MSG_VIEW_WINDOW (window));
+
+ g_debug ("registering window for %s", uid);
+
+ if (!has_uid (priv->preregistered_uids, uid))
+ g_debug ("weird: no uid for window (%s)", uid);
+
priv->preregistered_uids =
remove_uid (priv->preregistered_uids,
modest_msg_view_window_get_message_uid