* Modified the _get_display_size method to fit with the file management specs
[modest] / src / widgets / modest-window-mgr.c
index 64a2dcb..528fa33 100644 (file)
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+#include <string.h>
 #include "modest-window-mgr.h"
+#include "modest-runtime.h"
+#include "widgets/modest-main-window.h"
+#include "widgets/modest-msg-edit-window.h"
+#include "widgets/modest-msg-view-window.h"
 /* include other impl specific header files */
 
 /* 'private'/'protected' functions */
@@ -48,6 +53,10 @@ enum {
 typedef struct _ModestWindowMgrPrivate ModestWindowMgrPrivate;
 struct _ModestWindowMgrPrivate {
        GList *window_list;
+       ModestWindow *main_window;
+       gboolean fullscreen_mode;
+       gboolean show_toolbars;
+       gboolean show_toolbars_fullscreen;
 };
 #define MODEST_WINDOW_MGR_GET_PRIVATE(o)      (G_TYPE_INSTANCE_GET_PRIVATE((o), \
                                                MODEST_TYPE_WINDOW_MGR, \
@@ -97,9 +106,17 @@ modest_window_mgr_class_init (ModestWindowMgrClass *klass)
 static void
 modest_window_mgr_init (ModestWindowMgr *obj)
 {
-       ModestWindowMgrPrivate *priv = MODEST_WINDOW_MGR_GET_PRIVATE(obj);
+       ModestWindowMgrPrivate *priv;
 
+       priv = MODEST_WINDOW_MGR_GET_PRIVATE(obj);
        priv->window_list = NULL;
+       priv->main_window = NULL;
+       priv->fullscreen_mode = FALSE;
+
+       /* Could not initialize it from gconf, singletons are not
+          ready yet */
+       priv->show_toolbars = FALSE;
+       priv->show_toolbars_fullscreen = FALSE;
 }
 
 static void
@@ -119,6 +136,9 @@ modest_window_mgr_finalize (GObject *obj)
                priv->window_list = NULL;
        }
 
+       /* Do not unref priv->main_window because it does not hold a
+          new reference */
+
        G_OBJECT_CLASS(parent_class)->finalize (obj);
 }
 
@@ -132,7 +152,9 @@ void
 modest_window_mgr_register_window (ModestWindowMgr *self, 
                                   ModestWindow *window)
 {
+       static gboolean first_time = TRUE;
        GList *win;
+       gboolean show;
        ModestWindowMgrPrivate *priv;
 
        g_return_if_fail (MODEST_IS_WINDOW_MGR (self));
@@ -146,17 +168,79 @@ modest_window_mgr_register_window (ModestWindowMgr *self,
                return;
        }
 
+       /* Check that it's not a second main window */
+       if (MODEST_IS_MAIN_WINDOW (window)) {
+               if (priv->main_window) {
+                       g_warning ("Trying to register a second main window");
+                       return;
+               } else {
+                       priv->main_window = window;
+               }
+       }
+
        /* Add to list. Keep a reference to the window */
        g_object_ref (window);
        priv->window_list = g_list_prepend (priv->window_list, window);
 
        /* Listen to object destruction */
        g_signal_connect (window, "destroy", G_CALLBACK (on_window_destroy), self);
+
+       /* Put into fullscreen if needed */
+       if (priv->fullscreen_mode)
+               gtk_window_fullscreen (GTK_WINDOW (window));
+
+       /* Fill caches */
+       if (first_time) {
+               ModestConf *conf = modest_runtime_get_conf ();
+               priv->show_toolbars = 
+                       modest_conf_get_bool (conf, MODEST_CONF_SHOW_TOOLBAR, NULL);
+               priv->show_toolbars_fullscreen = 
+                       modest_conf_get_bool (conf, MODEST_CONF_SHOW_TOOLBAR_FULLSCREEN, NULL);
+               first_time = FALSE;
+       }
+
+       /* Show/hide toolbar */
+       if (priv->fullscreen_mode)
+               show = priv->show_toolbars_fullscreen;
+       else
+               show = priv->show_toolbars;
+       modest_window_show_toolbar (window, show);
 }
 
 static void
 on_window_destroy (ModestWindow *window, ModestWindowMgr *self)
 {
+       /* Specific stuff first */
+       if (MODEST_IS_MAIN_WINDOW (window)) {
+               ModestWindowMgrPrivate *priv;
+               priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
+
+               /* If more than one window already opened */
+               if (g_list_length (priv->window_list) > 1) {
+
+                       /* 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),
+                                                                  self);
+                                               iter = tmp;
+                                       } else {
+                                               iter = g_list_next (iter);
+                                       }
+                               } while (iter);
+                       }
+               }
+       } else {
+               if (MODEST_IS_MSG_EDIT_WINDOW (window)) {
+                       /* TODO: Save currently edited message to Drafts
+                          folder */
+               }
+       }
+
+       /* Unregister window */
        modest_window_mgr_unregister_window (self, window);
 }
 
@@ -181,14 +265,157 @@ modest_window_mgr_unregister_window (ModestWindowMgr *self,
        /* Remove from list. Remove the reference to the window */
        g_object_unref (win->data);
        priv->window_list = g_list_remove_link (priv->window_list, win);
+
+       /* If there are no more windows registered then exit program */
+       if (priv->window_list == NULL) {
+               ModestConf *conf = modest_runtime_get_conf ();
+
+               /* Save show toolbar status */
+               modest_conf_set_bool (conf, MODEST_CONF_SHOW_TOOLBAR_FULLSCREEN, 
+                                     priv->show_toolbars_fullscreen, NULL);
+               modest_conf_set_bool (conf, MODEST_CONF_SHOW_TOOLBAR, 
+                                     priv->show_toolbars, NULL);
+
+               /* Quit main loop */
+               gtk_main_quit ();
+       }
+}
+
+static gint
+compare_msguids (ModestWindow *win,
+                const gchar *uid)
+{
+       const gchar *msg_uid;
+
+       if (!MODEST_IS_MSG_VIEW_WINDOW (win))
+               return 1;
+
+       /* Get message uid from msg window */
+       msg_uid = modest_msg_view_window_get_message_uid (MODEST_MSG_VIEW_WINDOW (win));
+       if (msg_uid && !strcmp (msg_uid, uid))
+               return 0;
+       else
+               return 1;
 }
 
-ModestWindow * 
-modest_window_mgr_find_window_for_msgid (ModestWindowMgr *self, 
-                                        gchar *msgid, 
-                                        GType modest_window_type)
+ModestWindow*  
+modest_window_mgr_find_window_by_msguid (ModestWindowMgr *self, 
+                                        const gchar *msguid)
 {
-       /* TODO */
+       ModestWindowMgrPrivate *priv;
+       GList *win = NULL;
+
+       g_return_val_if_fail (MODEST_IS_WINDOW_MGR (self), NULL);
+       g_return_val_if_fail (msguid != NULL, NULL);
+
+       priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
+
+       /* Look for the window */
+       if (priv->window_list)
+               win = g_list_find_custom (priv->window_list, 
+                                         msguid, 
+                                         (GCompareFunc) compare_msguids);
+
+       if (win)
+               return win->data;
+       else 
+               return NULL;
+}
+
+void
+modest_window_mgr_set_fullscreen_mode (ModestWindowMgr *self,
+                                      gboolean on)
+{
+       ModestWindowMgrPrivate *priv;
+       GList *win = NULL;
+
+       g_return_if_fail (MODEST_IS_WINDOW_MGR (self));
+
+       priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
+
+       /* If there is no change do nothing */
+       if (priv->fullscreen_mode == on)
+               return;
+
+       priv->fullscreen_mode = on;
+
+       /* Update windows */
+       win = priv->window_list;
+       while (win) {
+               if (on) {
+                       gtk_window_fullscreen (GTK_WINDOW (win->data));
+                       modest_window_show_toolbar (MODEST_WINDOW (win->data), 
+                                                   priv->show_toolbars_fullscreen);
+               } else {
+                       gtk_window_unfullscreen (GTK_WINDOW (win->data));
+                       modest_window_show_toolbar (MODEST_WINDOW (win->data), 
+                                                   priv->show_toolbars);
+               }
+               win = g_list_next (win);
+       }
+}
+
+gboolean
+modest_window_mgr_get_fullscreen_mode (ModestWindowMgr *self)
+{
+       ModestWindowMgrPrivate *priv;
+
+       g_return_val_if_fail (MODEST_IS_WINDOW_MGR (self), FALSE);
+
+       priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
+
+       return priv->fullscreen_mode;
+}
+
+void 
+modest_window_mgr_show_toolbars (ModestWindowMgr *self,
+                                gboolean show_toolbars,
+                                gboolean fullscreen)
+{
+       ModestWindowMgrPrivate *priv;
+
+       g_return_if_fail (MODEST_IS_WINDOW_MGR (self));
+
+       priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
+
+       /* If nothing changes then return. Otherwise cache it, do not
+          save to GConf for the moment, it will be done when all
+          windows become unregistered in order to avoid unnecessary
+          ModestConf calls */
+       if (fullscreen) {
+               if (priv->show_toolbars_fullscreen == show_toolbars)
+                       return;
+               else
+                       priv->show_toolbars_fullscreen = show_toolbars;
+       } else {
+               if (priv->show_toolbars == show_toolbars)
+                       return;
+               else
+                       priv->show_toolbars = show_toolbars;
+       }
+
+       /* Apply now if the view mode is the right one */
+       if ((fullscreen && priv->fullscreen_mode) ||
+           (!fullscreen && !priv->fullscreen_mode)) {
+
+               GList *win = priv->window_list;
+
+               while (win) {
+                       modest_window_show_toolbar (MODEST_WINDOW (win->data),
+                                                   show_toolbars);
+                       win = g_list_next (win);
+               }
+       }
+}
+
+ModestWindow*  
+modest_window_mgr_get_main_window (ModestWindowMgr *self)
+{
+       ModestWindowMgrPrivate *priv;
+
+       g_return_val_if_fail (MODEST_IS_WINDOW_MGR (self), NULL);
+
+       priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
 
-       return NULL;
+       return priv->main_window;
 }