* update the various places where the modest-window-mgr was used to register
authorDirk-Jan C. Binnema <dirk-jan.binnema@nokia.com>
Fri, 29 Jun 2007 11:31:07 +0000 (11:31 +0000)
committerDirk-Jan C. Binnema <dirk-jan.binnema@nokia.com>
Fri, 29 Jun 2007 11:31:07 +0000 (11:31 +0000)
  the header *before* the message is opened (see previous patch).
* also update the dimming rules, so opened messages will  have the delete
  button in the main window dimmed, as well, as when selecting multiple of
  which one or more are opened already.

pmo-trunk-r2492

src/maemo/modest-msg-view-window.c
src/modest-mail-operation.c
src/modest-ui-actions.c
src/modest-ui-dimming-rules.c

index 495deca..7f24bd0 100644 (file)
@@ -698,7 +698,12 @@ modest_msg_view_window_get_message (ModestMsgViewWindow *self)
 const gchar*
 modest_msg_view_window_get_message_uid (ModestMsgViewWindow *self)
 {
-       ModestMsgViewWindowPrivate *priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self);
+       ModestMsgViewWindowPrivate *priv;
+
+       g_return_val_if_fail (self, NULL);
+       
+       priv  = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self);
+
        return (const gchar*) priv->msg_uid;
 }
 
@@ -1637,21 +1642,30 @@ modest_msg_view_window_view_attachment (ModestMsgViewWindow *window, TnyMimePart
                TnyHeader *header = NULL;
                ModestWindowMgr *mgr;
                ModestWindow *msg_win = NULL;
-
+               gboolean found;
+               
                header = tny_msg_get_header (TNY_MSG (mime_part));
-               mgr = modest_runtime_get_window_mgr ();
-               msg_win = modest_window_mgr_find_window_by_header (mgr, header);
-
-               if (!msg_win) {
+               mgr = modest_runtime_get_window_mgr ();         
+               found = modest_window_mgr_find_registered_header (mgr, header, &msg_win);
+
+               if (found) {
+                       if (msg_win)                            /* there is already a window for this uid; top it */
+                               gtk_window_present (GTK_WINDOW(msg_win));
+                       else 
+                               /* if it's found, but there is no msg_win, it's probably in the process of being created;
+                                * thus, we don't do anything */
+                               g_warning ("window for is already being created");
+               } else { 
+                       /* it's not found, so create a new window for it */
+                       modest_window_mgr_register_header (mgr, header); /* register the uid before building the window */
                        gchar *account = g_strdup (modest_window_get_active_account (MODEST_WINDOW (window)));
                        if (!account)
                                account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr ());
                        msg_win = modest_msg_view_window_new (TNY_MSG (mime_part), account, NULL);
                        modest_window_mgr_register_window (mgr, msg_win);
                        gtk_window_set_transient_for (GTK_WINDOW (msg_win), GTK_WINDOW (window));
+                       gtk_widget_show_all (GTK_WIDGET (msg_win));
                }
-
-               gtk_widget_show_all (GTK_WIDGET (msg_win));
        }
        g_object_unref (mime_part);
 }
index 6b26cfa..69509ab 100644 (file)
@@ -1402,7 +1402,7 @@ modest_mail_operation_xfer_folder (ModestMailOperation *self,
                                   gboolean delete_original)
 {
        ModestMailOperationPrivate *priv = NULL;
-       ModestTnyFolderRules parent_rules = 0, rules = 0;
+       ModestTnyFolderRules parent_rules = 0, rules; 
 
        g_return_if_fail (MODEST_IS_MAIL_OPERATION (self));
        g_return_if_fail (TNY_IS_FOLDER (folder));
index 5d08f7f..ec7c41d 100644 (file)
@@ -277,14 +277,13 @@ modest_ui_actions_on_delete (GtkAction *action, ModestWindow *win)
        header_list = get_selected_headers (win);
        if (!header_list) return;
 
-       /* Check if any of the headers is already opened */
+       /* Check if any of the headers is already opened, or in the process of being opened */
        iter = tny_list_create_iterator (header_list);
        found = FALSE;
        mgr = modest_runtime_get_window_mgr ();
        while (!tny_iterator_is_done (iter) && !found) {
                header = TNY_HEADER (tny_iterator_get_current (iter));
-               if (modest_window_mgr_find_window_by_header (mgr, header))
-                       found = TRUE;
+               found =  modest_window_mgr_find_registered_header (mgr, header, NULL);
                g_object_unref (header);
                tny_iterator_next (iter);
        }
@@ -618,13 +617,13 @@ open_msg_cb (ModestMailOperation *mail_op,
                win = modest_msg_edit_window_new (msg, account);
        } else {
                gchar *uid = modest_tny_folder_get_header_unique_id (header);
-
+               
                if (MODEST_IS_MAIN_WINDOW (parent_win)) {
                        GtkWidget *header_view;
                        GtkTreeSelection *sel;
                        GList *sel_list = NULL;
                        GtkTreeModel *model;
-               
+                       
                        header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(parent_win),
                                                                           MODEST_WIDGET_TYPE_HEADER_VIEW);
 
@@ -719,23 +718,37 @@ _modest_ui_actions_open (TnyList *headers, ModestWindow *win)
        not_opened_headers = tny_simple_list_new ();
        not_opened_cached_headers = tny_simple_list_new ();
        while (!tny_iterator_is_done (iter)) {
+
                ModestWindow *window;
                TnyHeader *header;
+               gboolean found;
                
                header = TNY_HEADER (tny_iterator_get_current (iter));
                flags = tny_header_get_flags (header);
-               window = modest_window_mgr_find_window_by_header (mgr, header);
 
+               window = NULL;
+               found = modest_window_mgr_find_registered_header (mgr, header, &window);
+               
                /* Do not open again the message and present the
                   window to the user */
-               if (window)
-                       gtk_window_present (GTK_WINDOW (window));
-               else if (!(flags & TNY_HEADER_FLAG_CACHED))
-                       tny_list_append (not_opened_headers, G_OBJECT (header));
-               /* Check if msg has already been retreived */
-               else
-                       tny_list_append (not_opened_cached_headers, G_OBJECT (header));
-               
+               if (found) {
+                       if (window)
+                               gtk_window_present (GTK_WINDOW (window));
+                       else
+                               /* the header has been registered already, we don't do
+                                * anything but wait for the window to come up*/
+                               g_warning ("debug: header %p already registered, waiting for window",
+                                          header);
+               } else {
+                       /* register the header before actually creating the window */
+                       modest_window_mgr_register_header (mgr, header);
+                               
+                       if (!(flags & TNY_HEADER_FLAG_CACHED))
+                               tny_list_append (not_opened_headers, G_OBJECT (header));
+                       /* Check if msg has already been retreived */
+                       else
+                               tny_list_append (not_opened_cached_headers, G_OBJECT (header));
+               }
                g_object_unref (header);
                tny_iterator_next (iter);
        }
@@ -2960,7 +2973,9 @@ modest_ui_actions_on_main_window_remove_attachments (GtkAction *action,
        TnyIterator *iter;
        TnyHeader *header;
        TnyHeaderFlags flags;
-       GtkWidget *msg_view_window;
+       ModestWindow *msg_view_window =  NULL;
+       gboolean found;
+
        g_return_if_fail (MODEST_IS_MAIN_WINDOW (win));
 
        header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
@@ -2976,22 +2991,28 @@ modest_ui_actions_on_main_window_remove_attachments (GtkAction *action,
                return;
        }
 
-       msg_view_window = GTK_WIDGET (modest_window_mgr_find_window_by_header (modest_runtime_get_window_mgr (), header));
+       found = modest_window_mgr_find_registered_header (modest_runtime_get_window_mgr (),
+                                                         header, &msg_view_window);
        flags = tny_header_get_flags (header);
        if (!(flags & TNY_HEADER_FLAG_CACHED))
                return;
-
-       if (msg_view_window != NULL) {
-               modest_msg_view_window_remove_attachments (MODEST_MSG_VIEW_WINDOW (msg_view_window), TRUE);
+       if (found) {
+               if (msg_view_window != NULL) 
+                       modest_msg_view_window_remove_attachments (MODEST_MSG_VIEW_WINDOW (msg_view_window), TRUE);
+               else {
+                       /* do nothing; uid was registered before, so window is probably on it's way */
+                       g_warning ("debug: header %p has already been registered", header);
+               }
        } else {
                ModestMailOperation *mail_op = NULL;
+               modest_window_mgr_register_header (modest_runtime_get_window_mgr (), header);
                mail_op = modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_OPEN,
                                                                         G_OBJECT (win),
                                                                         modest_ui_actions_get_msgs_full_error_handler,
                                                                         NULL);
                modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
                modest_mail_operation_get_msg (mail_op, header, open_msg_for_purge_cb, win);
-
+               
                g_object_unref (mail_op);
        }
        if (header)
index d003126..4a6c322 100644 (file)
@@ -1460,7 +1460,7 @@ _invalid_attach_selected (ModestWindow *win,
 static gboolean
 _purged_attach_selected (ModestWindow *win, gboolean all, ModestDimmingRule *rule) 
 {
-       GList *attachments = NULL, *node = NULL;
+       GList *attachments = NULL, *node;
        gint purged = 0;
        gint n_attachments = 0;
        gboolean result = FALSE;
@@ -1546,13 +1546,13 @@ static gboolean
 _already_opened_msg (ModestWindow *win,
                     guint *n_messages)
 {
-       ModestWindow *window = NULL;
+       //ModestWindow *window = NULL;
        ModestWindowMgr *mgr = NULL;
        GtkWidget *header_view = NULL;          
        TnyList *selected_headers = NULL;
        TnyIterator *iter = NULL;
        TnyHeader *header = NULL;
-       gboolean result = TRUE;
+       gboolean found;
 
        g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
                
@@ -1575,22 +1575,25 @@ _already_opened_msg (ModestWindow *win,
        /* Check dimmed rule (TODO: check focus on widgets */   
        mgr = modest_runtime_get_window_mgr ();
        iter = tny_list_create_iterator (selected_headers);
-       while (!tny_iterator_is_done (iter) && result) {
+       found = FALSE;
+       while (!tny_iterator_is_done (iter)) {
                header = TNY_HEADER (tny_iterator_get_current (iter));
-               window = modest_window_mgr_find_window_by_header (mgr, header);
-               result = result && (window != NULL);
-                       
+               found = modest_window_mgr_find_registered_header (mgr,header, NULL);
+               
                g_object_unref (header);
                tny_iterator_next (iter);
+
+               if (found)
+                       break;
        }
-       
+               
        /* free */
        if (selected_headers != NULL) 
                g_object_unref (selected_headers);
        if (iter != NULL)
                g_object_unref (iter);
                
-       return result;
+       return found;
 }
 
 static gboolean