* src/maemo/modest-main-window-ui.h:
[modest] / src / maemo / modest-main-window.c
index 65b175d..614fe61 100644 (file)
@@ -53,6 +53,7 @@
 #include "modest-tny-account.h"
 #include "modest-tny-folder.h"
 #include "modest-conf.h"
+#include <modest-utils.h>
 #include <modest-maemo-utils.h>
 #include "modest-tny-platform-factory.h"
 #include "modest-tny-msg.h"
 #include "modest-text-utils.h"
 #include "modest-signal-mgr.h"
 
-#ifdef MODEST_HAVE_HILDON0_WIDGETS
-#include <hildon-widgets/hildon-program.h>
-#else
-#include <hildon/hildon-program.h>
-#endif /*MODEST_HAVE_HILDON0_WIDGETS*/
-
 #define MODEST_MAIN_WINDOW_ACTION_GROUP_ADDITIONS "ModestMainWindowActionAdditions"
 
 #define XALIGN 0.5
@@ -111,15 +106,17 @@ static void on_queue_changed   (ModestMailOperationQueue *queue,
 
 static gboolean on_zoom_minus_plus_not_implemented (ModestWindow *window);
 
-static void
-on_account_inserted (TnyAccountStore *accoust_store,
-                     TnyAccount *account,
-                     gpointer user_data);
+static void on_account_inserted (TnyAccountStore *accoust_store,
+                                TnyAccount *account,
+                                gpointer user_data);
 
-static void
-on_account_removed (TnyAccountStore *accoust_store,
-                    TnyAccount *account,
-                    gpointer user_data);
+static void on_account_removed  (TnyAccountStore *accoust_store,
+                                TnyAccount *account,
+                                gpointer user_data);
+
+static void on_account_changed  (TnyAccountStore *account_store,
+                                TnyAccount *account,
+                                gpointer user_data);
 
 static void on_default_account_changed (ModestAccountMgr* mgr,
                                        gpointer user_data);
@@ -369,10 +366,9 @@ modest_main_window_finalize (GObject *obj)
 
        /* Sanity check: shouldn't be needed, the window mgr should
           call this function before */
-       modest_main_window_disconnect_signals (MODEST_WINDOW (obj));
-
+       modest_main_window_disconnect_signals (MODEST_WINDOW (obj));    
        modest_main_window_cleanup_queue_error_signals ((ModestMainWindow *) obj);
-
+       
        g_slist_free (priv->progress_widgets);
 
        g_byte_array_free (priv->merge_ids, TRUE);
@@ -396,7 +392,7 @@ modest_main_window_finalize (GObject *obj)
                g_source_remove (priv->restore_paned_timeout);
                priv->restore_paned_timeout = 0;
        }
-
+       
        G_OBJECT_CLASS(parent_class)->finalize (obj);
 }
 
@@ -497,10 +493,11 @@ save_state (ModestWindow *window)
 }
 
 static gint
-compare_display_names (ModestAccountData *a,
-                      ModestAccountData *b)
+compare_display_names (ModestAccountSettings *a,
+                      ModestAccountSettings *b)
 {
-       return strcmp (a->display_name, b->display_name);
+       return strcmp (modest_account_settings_get_display_name (a),
+                      modest_account_settings_get_display_name (b));
 }
 
 static void
@@ -528,9 +525,9 @@ update_menus (ModestMainWindow* self)
        accounts = NULL;
 
        while (iter) {
-               ModestAccountData *account_data = 
-                       modest_account_mgr_get_account_data (mgr, (gchar*) iter->data);
-               accounts = g_slist_prepend (accounts, account_data);
+               ModestAccountSettings *settings = 
+                       modest_account_mgr_load_account_settings (mgr, (gchar*) iter->data);
+               accounts = g_slist_prepend (accounts, settings);
 
                iter = iter->next;
        }
@@ -605,40 +602,42 @@ update_menus (ModestMainWindow* self)
        radio_group = NULL;
        for (i = 0; i < num_accounts; i++) {
                gchar *display_name = NULL;     
-               ModestAccountData *account_data = (ModestAccountData *) g_slist_nth_data (accounts, i);
+               const gchar *account_name;
+               ModestAccountSettings *settings = (ModestAccountSettings *) g_slist_nth_data (accounts, i);
 
-               if (!account_data) {
+               if (!settings) {
                        g_warning ("%s: BUG: account_data == NULL", __FUNCTION__);
                        continue;
                }
+               account_name = modest_account_settings_get_account_name (settings);
        
-               if (default_account && account_data->account_name && 
-                   !(strcmp (default_account, account_data->account_name) == 0)) {
+               if (default_account && account_name && 
+                   !(strcmp (default_account, account_name) == 0)) {
                        display_name = g_strdup_printf (_("mcen_me_toolbar_sendreceive_default"), 
-                                                       account_data->display_name);
+                                                       modest_account_settings_get_display_name (settings));
                } else {
                        display_name = g_strdup_printf (_("mcen_me_toolbar_sendreceive_mailbox_n"), 
-                                                       account_data->display_name);
+                                                       modest_account_settings_get_display_name (settings));
                }
                
                /* Create action and add it to the action group. The
                   action name must be the account name, this way we
                   could know in the handlers the account to show */
-               if (account_data && account_data->account_name) {
+               if (settings && account_name) {
                        gchar* item_name, *refresh_action_name;
                        guint8 merge_id = 0;
                        GtkAction *view_account_action, *refresh_account_action;
 
-                       view_account_action = GTK_ACTION (gtk_radio_action_new (account_data->account_name,
+                       view_account_action = GTK_ACTION (gtk_radio_action_new (account_name,
                                                                                display_name, NULL, NULL, 0));
                        gtk_action_group_add_action (priv->view_additions_group, view_account_action);
                        gtk_radio_action_set_group (GTK_RADIO_ACTION (view_account_action), radio_group);
                        radio_group = gtk_radio_action_get_group (GTK_RADIO_ACTION (view_account_action));
 
                        if (active_account_name) {
-                               if (active_account_name && account_data->account_name && 
-                                               (strcmp (active_account_name, account_data->account_name) == 0)) {
-                                                       gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (view_account_action), TRUE);
+                               if (active_account_name && account_name && 
+                                   (strcmp (active_account_name, account_name) == 0)) {
+                                       gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (view_account_action), TRUE);
                                }
                        }
 
@@ -646,14 +645,14 @@ update_menus (ModestMainWindow* self)
                           changes in a single execution because we're
                           downcasting the guint to a guint8 in order to use a
                           GByteArray. It should be enough. */
-                       item_name = g_strconcat (account_data->account_name, "Menu", NULL);
+                       item_name = g_strconcat (account_name, "Menu", NULL);
                        merge_id = (guint8) gtk_ui_manager_new_merge_id (parent_priv->ui_manager);
                        priv->merge_ids = g_byte_array_append (priv->merge_ids, &merge_id, 1);
                        gtk_ui_manager_add_ui (parent_priv->ui_manager,
                                               merge_id,
                                               "/MenuBar/ViewMenu/ViewMenuAdditions",
                                               item_name,
-                                              account_data->account_name,
+                                              account_name,
                                               GTK_UI_MANAGER_MENUITEM,
                                               FALSE);
 
@@ -664,7 +663,7 @@ update_menus (ModestMainWindow* self)
                                                self);
 
                        /* Create the items for the Tools->Send&Receive submenu */
-                       refresh_action_name = g_strconcat ("SendReceive", account_data->account_name, NULL);
+                       refresh_action_name = g_strconcat ("SendReceive", account_name, NULL);
                        refresh_account_action = gtk_action_new ((const gchar*) refresh_action_name, 
                                                                 display_name, NULL, NULL);
                        gtk_action_group_add_action (priv->view_additions_group, refresh_account_action);
@@ -683,7 +682,7 @@ update_menus (ModestMainWindow* self)
                        g_signal_connect_data (G_OBJECT (refresh_account_action), 
                                               "activate", 
                                               G_CALLBACK (on_refresh_account_action_activated), 
-                                              g_strdup (account_data->account_name),
+                                              g_strdup (account_name),
                                               (GClosureNotify) g_free,
                                               0);
 
@@ -693,7 +692,7 @@ update_menus (ModestMainWindow* self)
                        if (priv->accounts_popup) {
                                GtkWidget *label = gtk_label_new(NULL);
                                gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
-                               if (default_account && (strcmp(account_data->account_name, default_account) == 0))
+                               if (default_account && (strcmp(account_name, default_account) == 0))
                                {
                                        gchar *escaped = g_markup_printf_escaped ("<b>%s</b>", display_name);
                                        gtk_label_set_markup (GTK_LABEL (label), escaped);
@@ -711,7 +710,7 @@ update_menus (ModestMainWindow* self)
                                g_signal_connect_data (G_OBJECT (item), 
                                                       "activate", 
                                                       G_CALLBACK (on_send_receive_csm_activated),
-                                                      g_strdup (account_data->account_name),
+                                                      g_strdup (account_name),
                                                       (GClosureNotify) g_free,
                                                       0);
                        }
@@ -728,11 +727,14 @@ update_menus (ModestMainWindow* self)
         * group being inserted. This makes the default account appear in bold.
         * I agree it is a rather ugly way, but I don't see another possibility. armin. */
        for (i = 0; i < num_accounts; i++) {
-               ModestAccountData *account_data = (ModestAccountData *) g_slist_nth_data (accounts, i);
+               ModestAccountSettings *settings = (ModestAccountSettings *) g_slist_nth_data (accounts, i);
+               const gchar *account_name;
 
-               if(account_data->account_name && default_account &&
-                  strcmp (account_data->account_name, default_account) == 0) {
-                       gchar *item_name = g_strconcat (account_data->account_name, "Menu", NULL);
+               account_name = modest_account_settings_get_account_name (settings);
+
+               if(account_name && default_account &&
+                  strcmp (account_name, default_account) == 0) {
+                       gchar *item_name = g_strconcat (account_name, "Menu", NULL);
 
                        gchar *path = g_strconcat ("/MenuBar/ViewMenu/ViewMenuAdditions/", item_name, NULL);
                        GtkWidget *item = gtk_ui_manager_get_widget (parent_priv->ui_manager, path);
@@ -747,7 +749,7 @@ update_menus (ModestMainWindow* self)
                                        g_free (bold_name);
                                }
                        }
-
+                       
                        path = g_strconcat("/MenuBar/ToolsMenu/ToolsSendReceiveMainMenu/ToolsMenuAdditions/", item_name, NULL);
                        item = gtk_ui_manager_get_widget (parent_priv->ui_manager, path);
                        g_free (path);
@@ -765,7 +767,7 @@ update_menus (ModestMainWindow* self)
                        g_free(item_name);
                }
 
-               modest_account_mgr_free_account_data (mgr, account_data);
+               g_object_unref (settings);
        }
 
        if (priv->accounts_popup) {
@@ -970,6 +972,13 @@ connect_signals (ModestMainWindow *self)
        /* Account store */
        priv->sighandlers = 
                modest_signal_mgr_connect (priv->sighandlers,
+                                          G_OBJECT (modest_runtime_get_account_store ()),
+                                          "account_changed", 
+                                          G_CALLBACK (on_account_changed),
+                                          self);
+
+       priv->sighandlers = 
+               modest_signal_mgr_connect (priv->sighandlers,
                                           G_OBJECT (modest_runtime_get_account_store()), 
                                           "password_requested",
                                           G_CALLBACK (modest_ui_actions_on_password_requested), 
@@ -1083,6 +1092,7 @@ modest_main_window_new (void)
        ModestDimmingRulesGroup *toolbar_rules_group = NULL;
        GtkActionGroup *action_group = NULL;
        GError *error = NULL;
+       HildonProgram *app;
        ModestConf *conf = NULL;
        GtkAction *action = NULL;
        GdkPixbuf *window_icon;
@@ -1159,7 +1169,7 @@ modest_main_window_new (void)
                                    gtk_ui_manager_get_accel_group (parent_priv->ui_manager));
 
        /* Menubar. Update the state of some toggles */
-       parent_priv->menubar = modest_maemo_utils_menubar_to_menu (parent_priv->ui_manager);
+       parent_priv->menubar = modest_maemo_utils_get_manager_menubar_as_menu (parent_priv->ui_manager, "/MenuBar");
        conf = modest_runtime_get_conf ();
        action = gtk_ui_manager_get_action (parent_priv->ui_manager, 
                                            "/MenuBar/ViewMenu/ViewShowToolbarMainMenu/ViewShowToolbarNormalScreenMenu");
@@ -1218,7 +1228,7 @@ modest_main_window_new (void)
        
        gtk_container_add (GTK_CONTAINER(self), priv->main_vbox);
        
-       HildonProgram *app = hildon_program_get_instance ();
+       app = hildon_program_get_instance ();
        hildon_program_add_window (app, HILDON_WINDOW (self));
        
        g_signal_connect (G_OBJECT(app), "notify::is-topmost",
@@ -1228,7 +1238,7 @@ modest_main_window_new (void)
                          G_CALLBACK (modest_main_window_on_show), folder_win);
                
        /* Set window icon */
-       window_icon = modest_platform_get_icon (MODEST_APP_ICON);
+       window_icon = modest_platform_get_icon (MODEST_APP_ICON, MODEST_ICON_SIZE_BIG);
        if (window_icon) {
                gtk_window_set_icon (GTK_WINDOW (self), window_icon);
                g_object_unref (window_icon);
@@ -1451,7 +1461,7 @@ modest_main_window_show_toolbar (ModestWindow *self,
                action_name = "/MenuBar/ViewMenu/ViewShowToolbarMainMenu/ViewShowToolbarNormalScreenMenu";
 
        action = gtk_ui_manager_get_action (parent_priv->ui_manager, action_name);
-       modest_maemo_toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action),
+       modest_utils_toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action),
                                                            show_toolbar);
 }
 
@@ -1478,6 +1488,22 @@ on_account_removed (TnyAccountStore *accoust_store,
        update_menus (MODEST_MAIN_WINDOW (user_data));
 }
 
+static void
+on_account_changed (TnyAccountStore *account_store,
+                    TnyAccount *account,
+                    gpointer user_data)
+{
+       ModestMainWindow *win = MODEST_MAIN_WINDOW (user_data);
+       
+       /* We need to refresh the details widget because it could have changed */
+       if (modest_main_window_get_contents_style(win) == MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS) {
+               modest_main_window_set_contents_style (win, MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS);
+       }
+
+       /* Update the menus as well, the account name could be changed */
+       update_menus (MODEST_MAIN_WINDOW (user_data));
+}
+
 /* 
  * This function manages the key events used to navigate between
  * header and folder views (when the window is in split view)
@@ -1615,6 +1641,7 @@ create_details_widget (GtkWidget *styled_widget, TnyAccount *account)
                                                          (const gchar *) gray_color_markup);
                label_w = gtk_label_new (NULL);
                gtk_label_set_markup (GTK_LABEL (label_w), label);
+               gtk_label_set_ellipsize (GTK_LABEL (label_w),  PANGO_ELLIPSIZE_END);
                gtk_box_pack_start (GTK_BOX (vbox), label_w, FALSE, FALSE, 0);
                g_free (device_name);
                g_free (label);
@@ -1642,6 +1669,7 @@ create_details_widget (GtkWidget *styled_widget, TnyAccount *account)
 
                        label_w = gtk_label_new (NULL);
                        gtk_label_set_markup (GTK_LABEL (label_w), label);
+                       gtk_label_set_ellipsize (GTK_LABEL (label_w),  PANGO_ELLIPSIZE_END);
                        gtk_box_pack_start (GTK_BOX (vbox), label_w, FALSE, FALSE, 0);
                        g_string_free (proto, TRUE);
                        g_free (label);
@@ -1655,6 +1683,7 @@ create_details_widget (GtkWidget *styled_widget, TnyAccount *account)
                                         modest_tny_folder_store_get_message_count (folder_store));
        label_w = gtk_label_new (NULL);
        gtk_label_set_markup (GTK_LABEL (label_w), label);
+       gtk_label_set_ellipsize (GTK_LABEL (label_w),  PANGO_ELLIPSIZE_END);
        gtk_box_pack_start (GTK_BOX (vbox), label_w, FALSE, FALSE, 0);
        g_free (label);
 
@@ -1665,6 +1694,7 @@ create_details_widget (GtkWidget *styled_widget, TnyAccount *account)
                                         modest_tny_folder_store_get_folder_count (folder_store));
        label_w = gtk_label_new (NULL);
        gtk_label_set_markup (GTK_LABEL (label_w), label);
+       gtk_label_set_ellipsize (GTK_LABEL (label_w),  PANGO_ELLIPSIZE_END);
        gtk_box_pack_start (GTK_BOX (vbox), label_w, FALSE, FALSE, 0);
        g_free (label);
 
@@ -1682,6 +1712,7 @@ create_details_widget (GtkWidget *styled_widget, TnyAccount *account)
                
                label_w = gtk_label_new (NULL);
                gtk_label_set_markup (GTK_LABEL (label_w), label);
+               gtk_label_set_ellipsize (GTK_LABEL (label_w),  PANGO_ELLIPSIZE_END);
                gtk_box_pack_start (GTK_BOX (vbox), label_w, FALSE, FALSE, 0);
                g_free (label);
        } else if (TNY_IS_ACCOUNT(folder_store)) {
@@ -1702,6 +1733,7 @@ create_details_widget (GtkWidget *styled_widget, TnyAccount *account)
                                                 gray_color_markup, _("mcen_ti_lastupdated"), last_updated_string);
                label_w = gtk_label_new (NULL);
                gtk_label_set_markup (GTK_LABEL (label_w), label);
+               gtk_label_set_ellipsize (GTK_LABEL (label_w),  PANGO_ELLIPSIZE_END);
                gtk_box_pack_start (GTK_BOX (vbox), label_w, FALSE, FALSE, 0);
                g_free (label);
        }
@@ -2245,20 +2277,30 @@ set_account_visible(ModestMainWindow *self, const gchar *acc_name)
 {
        ModestMainWindowPrivate *priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self);
        GtkAction *action;
+       ModestAccountMgr *mgr;
+       ModestAccountSettings *settings;
+       ModestServerAccountSettings *store_settings = NULL;
 
        /* Get account data */
-       ModestAccountMgr *mgr = modest_runtime_get_account_mgr ();
-       ModestAccountData *acc_data = modest_account_mgr_get_account_data (mgr, acc_name);
+       mgr = modest_runtime_get_account_mgr ();
+       settings = modest_account_mgr_load_account_settings (mgr, acc_name);
+       if (settings)
+               store_settings = modest_account_settings_get_store_settings (settings);
 
        /* Set the new visible & active account */
-       if (acc_data && acc_data->store_account) { 
-               modest_folder_view_set_account_id_of_visible_server_account (priv->folder_view,
-                                                                            acc_data->store_account->account_name);
-               modest_window_set_active_account (MODEST_WINDOW (self), acc_data->account_name);
-               action = gtk_action_group_get_action (priv->view_additions_group, acc_data->account_name);
+       if (settings && (modest_server_account_settings_get_account_name (store_settings)!= NULL)) { 
+               const gchar *account_name;
+
+               account_name = modest_account_settings_get_account_name (settings);
+
+               modest_folder_view_set_account_id_of_visible_server_account 
+                       (priv->folder_view,
+                        modest_server_account_settings_get_account_name (store_settings));
+               modest_window_set_active_account (MODEST_WINDOW (self), account_name);
+               action = gtk_action_group_get_action (priv->view_additions_group, account_name);
                if (action != NULL) {
                        if (!gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
-                               modest_maemo_toggle_action_set_active_block_notify (
+                               modest_utils_toggle_action_set_active_block_notify (
                                        GTK_TOGGLE_ACTION (action),
                                        TRUE);
                        }
@@ -2269,8 +2311,10 @@ set_account_visible(ModestMainWindow *self, const gchar *acc_name)
 
 
        /* Free */
-       if (acc_data)
-               modest_account_mgr_free_account_data (mgr, acc_data);
+       if (settings) {
+               g_object_unref (store_settings);
+               g_object_unref (settings);
+       }
 }
 
 /* Make sure that at least one account is "viewed": */