* re-add debugging functionality (-d)
[modest] / src / gtk2 / modest-main-window.c
index 16bc5a7..087af94 100644 (file)
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+#include <modest-widget-memory.h>
+#include <modest-icon-factory.h>
+
 #include "modest-main-window.h"
 #include "modest-account-view-window.h"
-#include "modest-msg-window.h"
+#include "modest-edit-msg-window.h"
+#include "modest-icon-names.h"
+
 
 /* 'private'/'protected' functions */
 static void modest_main_window_class_init    (ModestMainWindowClass *klass);
 static void modest_main_window_init          (ModestMainWindow *obj);
 static void modest_main_window_finalize      (GObject *obj);
 
+static void restore_sizes (ModestMainWindow *self);
+static void save_sizes (ModestMainWindow *self);
+
 /* list my signals */
 enum {
        /* MY_SIGNAL_1, */
@@ -45,15 +53,17 @@ enum {
 
 typedef struct _ModestMainWindowPrivate ModestMainWindowPrivate;
 struct _ModestMainWindowPrivate {
+
        GtkWidget *toolbar;
        GtkWidget *menubar;
-       GtkWidget *progress_bar;
-       GtkWidget *status_bar;
+
        GtkWidget *folder_paned;
        GtkWidget *msg_paned;
-
+       GtkWidget *main_paned;
+       
        ModestWidgetFactory *widget_factory;
        ModestConf *conf;
+       ModestAccountMgr *account_mgr;
        
        ModestHeaderView *header_view;
        ModestFolderView *folder_view;
@@ -85,6 +95,7 @@ modest_main_window_get_type (void)
                        sizeof(ModestMainWindow),
                        1,              /* n_preallocs */
                        (GInstanceInitFunc) modest_main_window_init,
+                       NULL
                };
                my_type = g_type_register_static (GTK_TYPE_WINDOW,
                                                  "ModestMainWindow",
@@ -120,24 +131,29 @@ modest_main_window_init (ModestMainWindow *obj)
        priv = MODEST_MAIN_WINDOW_GET_PRIVATE(obj);
 
        priv->widget_factory = NULL;
+       priv->conf           = NULL;
+       priv->account_mgr    = NULL;
 }
 
 static void
 modest_main_window_finalize (GObject *obj)
 {
-       ModestMainWindowPrivate *priv;
-       
+       ModestMainWindowPrivate *priv;  
        priv = MODEST_MAIN_WINDOW_GET_PRIVATE(obj);
-
        if (priv->widget_factory) {
                g_object_unref (G_OBJECT(priv->widget_factory));
                priv->widget_factory = NULL;
        }
-
-       if (priv->conf) {
+       if (priv->conf) {
                g_object_unref (G_OBJECT(priv->conf));
                priv->conf = NULL;
        }               
+
+       if (priv->account_mgr) {
+               g_object_unref (G_OBJECT(priv->account_mgr));
+               priv->account_mgr = NULL;
+       }               
+
        G_OBJECT_CLASS(parent_class)->finalize (obj);
 }
 
@@ -146,7 +162,10 @@ static void
 on_menu_about (GtkWidget *widget, gpointer data)
 {
        GtkWidget *about;
-
+       const gchar *authors[] = {
+               "Dirk-Jan C. Binnema <dirk-jan.binnema@nokia.com>",
+               NULL
+       };      
        about = gtk_about_dialog_new ();
        gtk_about_dialog_set_name (GTK_ABOUT_DIALOG(about), PACKAGE_NAME);
        gtk_about_dialog_set_version (GTK_ABOUT_DIALOG(about),PACKAGE_VERSION);
@@ -155,7 +174,13 @@ on_menu_about (GtkWidget *widget, gpointer data)
                _("Copyright (c) 2006, Nokia Corporation\n"
                  "All rights reserved."));
        gtk_about_dialog_set_comments ( GTK_ABOUT_DIALOG(about),
-               _("a modest e-mail client"));
+               _("a modest e-mail client\n\n"
+                 "design and implementation: Dirk-Jan C. Binnema\n"
+                 "contributions from the fine people at KernelConcepts\n\n"
+                 "uses the tinymail email framework written by Philip van Hoof"));
+       gtk_about_dialog_set_authors (GTK_ABOUT_DIALOG(about), authors);
+       gtk_about_dialog_set_website (GTK_ABOUT_DIALOG(about), "http://modest.garage.maemo.org");
+
        gtk_dialog_run (GTK_DIALOG (about));
        gtk_widget_destroy(about);
 }
@@ -171,8 +196,12 @@ on_menu_accounts (ModestMainWindow *self, guint action, GtkWidget *widget)
        g_return_if_fail (self);
        
        priv        = MODEST_MAIN_WINDOW_GET_PRIVATE(self);     
-       account_win = modest_account_view_window_new (priv->conf,
+       account_win = modest_account_view_window_new (priv->account_mgr,
                                                      priv->widget_factory);
+
+       gtk_window_set_transient_for (GTK_WINDOW(account_win),
+                                     GTK_WINDOW(self));
+                                     
        gtk_widget_show (account_win);
 }
 
@@ -181,13 +210,22 @@ static void
 on_menu_new_message (ModestMainWindow *self, guint action, GtkWidget *widget)
 {
        GtkWidget *msg_win;
+       ModestMainWindowPrivate *priv;
 
-       msg_win = modest_msg_window_new (MODEST_MSG_WINDOW_TYPE_NEW,
-                                        NULL);
+       priv  = MODEST_MAIN_WINDOW_GET_PRIVATE(self);   
 
+       msg_win = modest_edit_msg_window_new (priv->conf,
+                                             MODEST_EDIT_TYPE_NEW,
+                                             NULL);
        gtk_widget_show (msg_win);
 }
 
+static void
+on_menu_quit (ModestMainWindow *self, guint action, GtkWidget *widget)
+{
+       gtk_main_quit ();
+}
+
 
 
 /* Our menu, an array of GtkItemFactoryEntry structures that defines each menu item */
@@ -198,7 +236,7 @@ static GtkItemFactoryEntry menu_items[] = {
        { "/File/_Save",        "<control>S",           NULL,           0, "<StockItem>", GTK_STOCK_SAVE },
        { "/File/Save _As",     NULL,                   NULL,           0, "<Item>" },
        { "/File/sep1",         NULL,                   NULL,           0, "<Separator>" },
-       { "/File/_Quit",        "<CTRL>Q",              gtk_main_quit,  0, "<StockItem>", GTK_STOCK_QUIT },
+       { "/File/_Quit",        "<CTRL>Q",              on_menu_quit,  0, "<StockItem>", GTK_STOCK_QUIT },
 
        { "/_Edit",             NULL,                   NULL,           0, "<Branch>" },
        { "/Edit/_Undo",        "<CTRL>Z",              NULL,           0, "<StockItem>", GTK_STOCK_UNDO },
@@ -268,9 +306,7 @@ header_view_new (ModestMainWindow *self)
        ModestHeaderViewColumn cols[] = {
                MODEST_HEADER_VIEW_COLUMN_MSGTYPE,
                MODEST_HEADER_VIEW_COLUMN_ATTACH,
-               MODEST_HEADER_VIEW_COLUMN_FROM,
-               MODEST_HEADER_VIEW_COLUMN_SUBJECT,
-               MODEST_HEADER_VIEW_COLUMN_RECEIVED_DATE
+               MODEST_HEADER_VIEW_COLUMN_COMPACT_HEADER
        };
 
        priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self);
@@ -287,61 +323,43 @@ header_view_new (ModestMainWindow *self)
 
 
 static void
-set_sizes (ModestMainWindow *self)
+restore_sizes (ModestMainWindow *self)
 {
        ModestMainWindowPrivate *priv;
-
-       int win_x,win_y;
-       int fol_x,fol_pos;
-       int msg_x,msg_pos;
        
        priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self);
+       
+       modest_widget_memory_restore_settings (priv->conf,GTK_WIDGET(self),
+                                              "modest-main-window");
+       modest_widget_memory_restore_settings (priv->conf, GTK_WIDGET(priv->folder_paned),
+                                              "modest-folder-paned");
+       modest_widget_memory_restore_settings (priv->conf, GTK_WIDGET(priv->msg_paned),
+                                              "modest-msg-paned");
+       modest_widget_memory_restore_settings (priv->conf, GTK_WIDGET(priv->main_paned),
+                                              "modest-main-paned");
+
+}
 
-       /* size of the whole window */
-       win_x = modest_conf_get_int_or_default (priv->conf,
-                                                     MODEST_MAIN_WINDOW_WIDTH,
-                                                     MODEST_MAIN_WINDOW_WIDTH_DEFAULT);
-       win_y = modest_conf_get_int_or_default (priv->conf,
-                                                     MODEST_MAIN_WINDOW_HEIGHT,
-                                                     MODEST_MAIN_WINDOW_HEIGHT_DEFAULT);
-       gtk_window_set_default_size (GTK_WINDOW(self), win_x, win_y);
+
+static void
+save_sizes (ModestMainWindow *self)
+{
+       ModestMainWindowPrivate *priv;
        
-       /* size of the folder pane */
-       fol_x = modest_conf_get_int_or_default (priv->conf,
-                                                     MODEST_FOLDER_PANED_WIDTH,
-                                                     MODEST_FOLDER_PANED_WIDTH_DEFAULT);
-       fol_pos = modest_conf_get_int_or_default (priv->conf,
-                                                       MODEST_FOLDER_PANED_DIVIDER_POS,
-                                                       MODEST_FOLDER_PANED_DIVIDER_POS_DEFAULT);
-       if (1 > fol_x || fol_x > win_x || 1 > fol_pos || fol_pos > win_y) {
-               g_printerr ("modest: folder paned <x,pos> out of range: <%d,%d>\n",
-                           fol_x, fol_pos);
-       } else {
-               /* slightly off... */
-               gtk_widget_set_size_request (priv->folder_paned, fol_x, win_y);
-               gtk_paned_set_position (GTK_PANED(priv->folder_paned),
-                                       fol_pos);
-       }
+       priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self);
+       
+       modest_widget_memory_save_settings (priv->conf,GTK_WIDGET(self),
+                                           "modest-main-window");
+       modest_widget_memory_save_settings (priv->conf, GTK_WIDGET(priv->folder_paned),
+                                           "modest-folder-paned");
+       modest_widget_memory_save_settings (priv->conf, GTK_WIDGET(priv->msg_paned),
+                                           "modest-msg-paned");
+       modest_widget_memory_save_settings (priv->conf, GTK_WIDGET(priv->main_paned),
+                                           "modest-main-paned");
+
        
-       /* size of the folder pane */
-       msg_x = modest_conf_get_int_or_default (priv->conf,
-                                                     MODEST_MSG_PANED_WIDTH,
-                                                     MODEST_MSG_PANED_WIDTH_DEFAULT);
-       msg_pos = modest_conf_get_int_or_default (priv->conf,
-                                                       MODEST_MSG_PANED_DIVIDER_POS,
-                                                       MODEST_MSG_PANED_DIVIDER_POS_DEFAULT);
-       if (1 > msg_x || msg_x > win_x || 1 > msg_pos || msg_pos > win_y) {
-               g_printerr ("modest: msg paned <x,pos> out of range: <%d,%d>\n",
-                           msg_x, msg_pos);
-       } else {
-               /* slightly off... */
-               gtk_widget_set_size_request (priv->msg_paned,
-                                            fol_x, win_y);
-               gtk_paned_set_position (GTK_PANED(priv->msg_paned),
-                                       msg_pos);
-       }
-}
 
+}
 
 
 static GtkWidget*
@@ -364,14 +382,27 @@ wrapped_in_scrolled_window (GtkWidget *widget, gboolean needs_viewport)
        return win;
 }
 
+
+static gboolean
+on_delete_event (GtkWidget *widget, GdkEvent  *event, ModestMainWindow *self)
+{
+       save_sizes (self);
+       gtk_widget_destroy (GTK_WIDGET(self));
+
+       return TRUE;
+}
+
+
+
+
 GtkWidget*
-modest_main_window_new (ModestWidgetFactory *factory, ModestConf *conf)
+modest_main_window_new (ModestConf *conf, ModestAccountMgr *account_mgr,
+                       ModestWidgetFactory *factory)
 {
        GObject *obj;
        ModestMainWindowPrivate *priv;
        
        GtkWidget *main_vbox;
-       GtkWidget *main_paned;
        GtkWidget *status_hbox;
        GtkWidget *header_win, *folder_win; 
        
@@ -386,6 +417,10 @@ modest_main_window_new (ModestWidgetFactory *factory, ModestConf *conf)
 
        g_object_ref (conf);
        priv->conf = conf;
+       
+       g_object_ref (account_mgr);
+       priv->account_mgr = account_mgr;
+
 
        /* widgets from factory */
        priv->folder_view = modest_widget_factory_get_folder_view (factory);
@@ -403,36 +438,49 @@ modest_main_window_new (ModestWidgetFactory *factory, ModestConf *conf)
        /* paned */
        priv->folder_paned = gtk_vpaned_new ();
        priv->msg_paned = gtk_vpaned_new ();
-       main_paned = gtk_hpaned_new ();
-       gtk_paned_add1 (GTK_PANED(main_paned), priv->folder_paned);
-       gtk_paned_add2 (GTK_PANED(main_paned), priv->msg_paned);
-       gtk_paned_add1 (GTK_PANED(priv->folder_paned),
-                       gtk_label_new (_("Favorites")));
+       priv->main_paned = gtk_hpaned_new ();
+       gtk_paned_add1 (GTK_PANED(priv->main_paned), priv->folder_paned);
+       gtk_paned_add2 (GTK_PANED(priv->main_paned), priv->msg_paned);
+//     gtk_paned_add1 (GTK_PANED(priv->folder_paned),
+//                     gtk_label_new (_("Favorites")));
        gtk_paned_add2 (GTK_PANED(priv->folder_paned), folder_win);
        gtk_paned_add1 (GTK_PANED(priv->msg_paned), header_win);
        gtk_paned_add2 (GTK_PANED(priv->msg_paned), GTK_WIDGET(priv->msg_preview));
 
        gtk_widget_show (GTK_WIDGET(priv->header_view));
-               
-       /* status bar / progress */
-       priv->status_bar   = gtk_statusbar_new ();
-       priv->progress_bar = gtk_progress_bar_new ();
-       status_hbox = gtk_hbox_new (TRUE, 5);
-       gtk_box_pack_start (GTK_BOX(status_hbox), priv->progress_bar, FALSE, TRUE, 5);
-       gtk_box_pack_start (GTK_BOX(status_hbox), priv->status_bar, FALSE, TRUE, 5);
+       gtk_tree_view_columns_autosize (GTK_TREE_VIEW(priv->header_view));
+
        
+       /* status bar / progress */
+       status_hbox = gtk_hbox_new (FALSE, 0);
+       gtk_box_pack_start (GTK_BOX(status_hbox),
+                           modest_widget_factory_get_status_bar(factory),
+                           TRUE, TRUE, 0);
+       gtk_box_pack_start (GTK_BOX(status_hbox),
+                           modest_widget_factory_get_progress_bar(factory),
+                           FALSE, FALSE, 0);
+       gtk_box_pack_start (GTK_BOX(status_hbox),
+                         modest_widget_factory_get_online_toggle(factory),
+                         FALSE, FALSE, 0);
+
        /* putting it all together... */
-       main_vbox = gtk_vbox_new (FALSE, 2);
-       gtk_box_pack_start (GTK_BOX(main_vbox), priv->menubar, FALSE, FALSE, 2);
-       gtk_box_pack_start (GTK_BOX(main_vbox), priv->toolbar, FALSE, TRUE, 5);
-       gtk_box_pack_start (GTK_BOX(main_vbox), main_paned, TRUE, TRUE, 2);
-       gtk_box_pack_start (GTK_BOX(main_vbox), status_hbox, FALSE, FALSE, 5);
+       main_vbox = gtk_vbox_new (FALSE, 6);
+       gtk_box_pack_start (GTK_BOX(main_vbox), priv->menubar, FALSE, FALSE, 0);
+       gtk_box_pack_start (GTK_BOX(main_vbox), priv->toolbar, FALSE, FALSE, 0);
+       gtk_box_pack_start (GTK_BOX(main_vbox), priv->main_paned, TRUE, TRUE,0);
+       gtk_box_pack_start (GTK_BOX(main_vbox), status_hbox, FALSE, FALSE, 0);
        
        gtk_container_add (GTK_CONTAINER(obj), main_vbox);
+       restore_sizes (MODEST_MAIN_WINDOW(obj));        
+
+       gtk_window_set_title (GTK_WINDOW(obj), "Modest");
+       gtk_window_set_icon  (GTK_WINDOW(obj),
+                             modest_icon_factory_get_icon (MODEST_APP_ICON));
+       
        gtk_widget_show_all (main_vbox);
        
-       gtk_window_set_title (GTK_WINDOW(obj), "Modest");
-
-       set_sizes (MODEST_MAIN_WINDOW(obj));    
+       g_signal_connect (G_OBJECT(obj), "delete-event",
+                         G_CALLBACK(on_delete_event), obj);
+       
        return GTK_WIDGET(obj);
 }