* Fixes NB#74764, NB#74260, NB#74639
[modest] / src / widgets / modest-window-mgr.c
index 33ec152..bce17ba 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,10 +309,63 @@ modest_window_mgr_unregister_header (ModestWindowMgr *self,  TnyHeader *header)
                else
                        g_debug ("uid %s removed", uid);
        }
-
+               
        g_free (uid);
 }
 
+
+#define MODEST_WINDOW_HELP_ID_PARAM "help-id"
+
+void
+modest_window_mgr_register_help_id (ModestWindowMgr *self, GtkWindow *win, const gchar* help_id)
+{
+       /* we don't need 'self', but for API consistency... */
+       g_return_if_fail (self && MODEST_IS_WINDOW_MGR(self));
+
+       g_return_if_fail (win && GTK_IS_WINDOW(win));
+       g_return_if_fail (help_id);
+       
+       g_object_set_data_full (G_OBJECT(win), MODEST_WINDOW_HELP_ID_PARAM,
+                               g_strdup(help_id), g_free);
+}
+
+
+const gchar*
+modest_window_mgr_get_help_id (ModestWindowMgr *self, GtkWindow *win)
+{
+       const gchar* help_id = NULL;
+
+       /* we don't need 'self', but for API consistency... */
+       g_return_val_if_fail (self && MODEST_IS_WINDOW_MGR(self), NULL);
+       
+       g_return_val_if_fail (win, NULL);
+       g_return_val_if_fail (GTK_IS_WINDOW(win), NULL);
+       
+       if (MODEST_IS_MAIN_WINDOW (win)) {
+               GtkWidget *folder_view;
+               TnyFolderStore *folder_store;
+               
+               /* Get selected folder */
+               folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
+                                                                  MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
+               folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
+
+               /* Switch help_id */
+               if (folder_store && TNY_IS_FOLDER (folder_store)) {
+                       help_id = modest_tny_folder_get_help_id (TNY_FOLDER (folder_store));
+                       if (!help_id)
+                               g_warning ("%s: BUG: did not get a valid help_id", __FUNCTION__);
+               }
+               if (folder_store)
+                       g_object_unref (folder_store);
+       }
+
+       if (!help_id)
+               help_id = g_object_get_data (G_OBJECT(win), MODEST_WINDOW_HELP_ID_PARAM);
+               
+       return help_id;
+}
+
 static gint
 compare_msguids (ModestWindow *win,
                 const gchar *uid)
@@ -335,14 +390,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 +429,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 +445,8 @@ modest_window_mgr_find_registered_header (ModestWindowMgr *self, TnyHeader *head
                        }
                }
        }
-
        g_free (uid);
+       
        return has_header || has_window;
 }
 
@@ -456,17 +510,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 +565,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 +575,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 +737,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 +868,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 +876,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 +886,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)
 {