* this is dirk's version of sergio's patch to only create
[modest] / src / widgets / modest-window-mgr.c
index 33ec152..0451e9f 100644 (file)
@@ -261,7 +261,7 @@ append_uid (GSList *list, const gchar *uid)
 
 
 void 
-modest_window_mgr_register_header (ModestWindowMgr *self,  TnyHeader *header)
+modest_window_mgr_register_header (ModestWindowMgr *self,  TnyHeader *header, const gchar *alt_uid)
 {
        ModestWindowMgrPrivate *priv;
        gchar* uid;
@@ -272,13 +272,15 @@ modest_window_mgr_register_header (ModestWindowMgr *self,  TnyHeader *header)
        priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
        uid = modest_tny_folder_get_header_unique_id (header);
 
-
+       if (uid == NULL)
+               uid = g_strdup (alt_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);
 }
 
@@ -293,13 +295,13 @@ modest_window_mgr_unregister_header (ModestWindowMgr *self,  TnyHeader *header)
                
        priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
        uid = modest_tny_folder_get_header_unique_id (header);
-       
+
        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))
@@ -307,7 +309,7 @@ modest_window_mgr_unregister_header (ModestWindowMgr *self,  TnyHeader *header)
                else
                        g_debug ("uid %s removed", uid);
        }
-
+               
        g_free (uid);
 }
 
@@ -335,14 +337,13 @@ compare_msguids (ModestWindow *win,
                return 1;
 }
 
-
 void
 modest_window_mgr_close_all_windows (ModestWindowMgr *self)
 {
        ModestWindowMgrPrivate *priv = NULL;
        GList *wins = NULL;
        gboolean ret_value = FALSE;
-
+       
        g_return_if_fail (MODEST_IS_WINDOW_MGR (self));
        priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
        
@@ -375,9 +376,9 @@ modest_window_mgr_find_registered_header (ModestWindowMgr *self, TnyHeader *head
        
        if (win)
                *win = NULL;
-       
+
        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;
@@ -391,8 +392,8 @@ modest_window_mgr_find_registered_header (ModestWindowMgr *self, TnyHeader *head
                        }
                }
        }
-
        g_free (uid);
+       
        return has_header || has_window;
 }
 
@@ -456,17 +457,16 @@ modest_window_mgr_register_window (ModestWindowMgr *self,
        if (MODEST_IS_MSG_VIEW_WINDOW(window)) {
                const gchar *uid = modest_msg_view_window_get_message_uid
                        (MODEST_MSG_VIEW_WINDOW (window));
-               
+
                if (!has_uid (priv->preregistered_uids, uid)) 
                        g_debug ("weird: no uid for window (%s)", uid);
                
                g_debug ("registering window for %s", uid ? uid : "<none>");
-
+               
                priv->preregistered_uids = 
                        remove_uid (priv->preregistered_uids,
                                    modest_msg_view_window_get_message_uid
                                    (MODEST_MSG_VIEW_WINDOW (window)));
-
        } else if (MODEST_IS_MSG_EDIT_WINDOW(window)) {
                const gchar *uid = modest_msg_edit_window_get_message_uid
                        (MODEST_MSG_EDIT_WINDOW (window));
@@ -512,6 +512,8 @@ on_window_destroy (ModestWindow *window,
                   GdkEvent *event,
                   ModestWindowMgr *self)
 {
+       gint dialog_response = GTK_RESPONSE_NONE;
+
        /* Specific stuff first */
        if (MODEST_IS_MAIN_WINDOW (window)) {
                ModestWindowMgrPrivate *priv;
@@ -520,21 +522,32 @@ on_window_destroy (ModestWindow *window,
                /* If more than one window already opened */
                if (g_list_length (priv->window_list) > 1) {
 
+                       /* Create the confirmation dialog MSG-NOT308 */
+                       dialog_response = modest_platform_run_confirmation_dialog (
+                                       GTK_WINDOW (window), _("emev_nc_close_windows"));
+
                        /* If the user wants to close all the windows */
-                       if (modest_main_window_close_all (MODEST_MAIN_WINDOW (window))) {
-                               GList *iter = priv->window_list;
-                               do {
-                                       if (iter->data != window) {
-                                               GList *tmp = iter->next;
-                                               on_window_destroy (MODEST_WINDOW (iter->data),
-                                                                  event,
-                                                                  self);
-                                               iter = tmp;
-                                       } else {
-                                               iter = g_list_next (iter);
-                                       }
-                               } while (iter);
-                       }
+                       if ((dialog_response == GTK_RESPONSE_OK) 
+                                       || (dialog_response == GTK_RESPONSE_ACCEPT) 
+                                       || (dialog_response == GTK_RESPONSE_YES))
+                               {
+                                       GList *iter = priv->window_list;
+                                       do {
+                                               if (iter->data != window) {
+                                                       GList *tmp = iter->next;
+                                                       on_window_destroy (MODEST_WINDOW (iter->data),
+                                                                       event,
+                                                                       self);
+                                                       iter = tmp;
+                                               } else {
+                                                       iter = g_list_next (iter);
+                                               }
+                                       } while (iter);
+                               }
+                       else
+                               {
+                                       return TRUE;
+                               }
                }
        }
        else {
@@ -671,8 +684,13 @@ modest_window_mgr_unregister_window (ModestWindowMgr *self,
           when there were other windows remaining */
        if (MODEST_IS_MSG_VIEW_WINDOW (window) && priv->viewer_handlers) {
                tmp = (gulong *) g_hash_table_lookup (priv->viewer_handlers, window);
-               g_signal_handler_disconnect (window, *tmp);
-               g_hash_table_remove (priv->viewer_handlers, window);
+               /* If the viewer was created without a main window
+                  (for example when opening a message through D-Bus
+                  the viewer handlers was not registered */
+               if (tmp) {
+                       g_signal_handler_disconnect (window, *tmp);
+                       g_hash_table_remove (priv->viewer_handlers, window);
+               }
        }
 
        /* Save state */
@@ -797,7 +815,7 @@ modest_window_mgr_show_toolbars (ModestWindowMgr *self,
 }
 
 ModestWindow*  
-modest_window_mgr_get_main_window (ModestWindowMgr *self)
+modest_window_mgr_get_main_window (ModestWindowMgr *self, gboolean create)
 {
        ModestWindowMgrPrivate *priv;
        
@@ -805,7 +823,7 @@ modest_window_mgr_get_main_window (ModestWindowMgr *self)
        priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
        
        /* create the main window, if it hasn't been created yet */
-       if (!priv->main_window) {
+       if (!priv->main_window && create) {
                /* modest_window_mgr_register_window will set priv->main_window */
                modest_window_mgr_register_window (self, modest_main_window_new ());
                g_debug ("%s: created main window: %p\n", __FUNCTION__, priv->main_window);
@@ -815,6 +833,18 @@ modest_window_mgr_get_main_window (ModestWindowMgr *self)
 }
 
 
+gboolean
+modest_window_mgr_main_window_exists  (ModestWindowMgr *self)
+{
+       ModestWindowMgrPrivate *priv;
+       
+       g_return_val_if_fail (MODEST_IS_WINDOW_MGR (self), FALSE);
+       priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
+
+       return priv->main_window != NULL;
+}
+
+
 GtkWindow *
 modest_window_mgr_get_modal (ModestWindowMgr *self)
 {