* Fixed NB#62792, the editor is closed if the account is removed
[modest] / src / maemo / easysetup / modest-easysetup-wizard.c
index 62c15e9..b86f40d 100644 (file)
@@ -70,10 +70,6 @@ G_DEFINE_TYPE (ModestEasysetupWizardDialog, modest_easysetup_wizard_dialog, MODE
 
 typedef struct _ModestEasysetupWizardDialogPrivate ModestEasysetupWizardDialogPrivate;
 
-/* global to make sure there is only one of this
- * dialog at any time
- */
-static ModestEasysetupWizardDialog *_instance = NULL;
 
 typedef enum {
        MODEST_EASYSETUP_WIZARD_DIALOG_INCOMING_CHANGED = 0x01,
@@ -145,8 +141,6 @@ modest_easysetup_wizard_dialog_finalize (GObject *object)
        g_free (self->saved_account_name);
        
        G_OBJECT_CLASS (modest_easysetup_wizard_dialog_parent_class)->finalize (object);
-
-       _instance = NULL;
 }
 
 static void
@@ -188,9 +182,9 @@ static GList* check_for_supported_auth_methods(ModestEasysetupWizardDialog* acco
        const gchar* username = gtk_entry_get_text(GTK_ENTRY(account_wizard->entry_user_username));
        const ModestConnectionProtocol protocol_security_incoming = 
                                        modest_serversecurity_combo_box_get_active_serversecurity (
-                                       MODEST_SERVERSECURITY_COMBO_BOX (
-                                       account_wizard->combo_incoming_security));
-       int port_num = get_serverport_incoming(protocol, protocol_security_incoming); 
+                                               MODEST_SERVERSECURITY_COMBO_BOX (
+                                                       account_wizard->combo_incoming_security));
+       const int port_num = get_serverport_incoming(protocol, protocol_security_incoming); 
        GList *list_auth_methods =
           modest_maemo_utils_get_supported_secure_authentication_methods (
                                                                       protocol, 
@@ -205,7 +199,9 @@ static GList* check_for_supported_auth_methods(ModestEasysetupWizardDialog* acco
                                list = g_list_append(list, GINT_TO_POINTER(auth));
                        }
                }
+
                g_list_free(list_auth_methods);
+
                if (list)
                        return list;
        }
@@ -216,10 +212,39 @@ static GList* check_for_supported_auth_methods(ModestEasysetupWizardDialog* acco
                show_error (GTK_WIDGET(account_wizard), _("Could not discover supported secure authentication methods."));
        }
 
-       if(error != NULL) g_error_free(error);
+       if(error != NULL)
+               g_error_free(error);
+
        return NULL;
 }
 
+static gboolean check_has_supported_auth_methods(ModestEasysetupWizardDialog* account_wizard)
+{
+       GList* methods = check_for_supported_auth_methods(account_wizard);
+       if (!methods)
+       {
+               return FALSE;
+       }
+
+       g_list_free(methods);
+       return TRUE;
+}
+
+static ModestAuthProtocol check_first_supported_auth_method(ModestEasysetupWizardDialog* account_wizard)
+{
+       ModestAuthProtocol result = MODEST_PROTOCOL_AUTH_PASSWORD;
+
+       GList* methods = check_for_supported_auth_methods(account_wizard);
+       if (methods)
+       {
+               /* Use the first one: */
+               result = (ModestAuthProtocol) (GPOINTER_TO_INT(methods->data));
+               g_list_free(methods);
+       }
+
+       return result;
+}
+
 static void
 invoke_enable_buttons_vfunc (ModestEasysetupWizardDialog *wizard_dialog)
 {
@@ -303,7 +328,7 @@ create_page_welcome (ModestEasysetupWizardDialog *self)
        GtkWidget *label = gtk_label_new(_("mcen_ia_emailsetup_intro"));
        gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
        /* So that it is not truncated: */
-       gtk_label_set_max_width_chars (GTK_LABEL (label), 40);
+       gtk_widget_set_size_request (label, 600, -1);
        gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);
        gtk_widget_show (label);
        gtk_widget_show (GTK_WIDGET (box));
@@ -320,10 +345,10 @@ on_combo_account_country (GtkComboBox *widget, gpointer user_data)
        priv->dirty = TRUE;
        
        /* Fill the providers combo, based on the selected country: */
-       GSList *list_mcc_ids = easysetup_country_combo_box_get_active_country_ids (
+       gint mcc = easysetup_country_combo_box_get_active_country_mcc (
                EASYSETUP_COUNTRY_COMBO_BOX (self->combo_account_country));
        easysetup_provider_combo_box_fill (
-               EASYSETUP_PROVIDER_COMBO_BOX (self->combo_account_serviceprovider), priv->presets, list_mcc_ids);
+               EASYSETUP_PROVIDER_COMBO_BOX (self->combo_account_serviceprovider), priv->presets, mcc);
 }
 
 static void
@@ -385,7 +410,7 @@ create_page_account_details (ModestEasysetupWizardDialog *self)
        GtkWidget *box = gtk_vbox_new (FALSE, MODEST_MARGIN_NONE);
        GtkWidget *label = gtk_label_new(_("mcen_ia_accountdetails"));
        gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
-       gtk_label_set_max_width_chars (GTK_LABEL (label), 40);
+       gtk_widget_set_size_request (label, 600, -1);
        gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, MODEST_MARGIN_HALF);
        gtk_widget_show (label);
        
@@ -432,10 +457,9 @@ create_page_account_details (ModestEasysetupWizardDialog *self)
         * set by the osso-operator-wizard package, suggested by Dirk-Jan Binnema.
         *
         */
-       GConfClient *client = gconf_client_get_default ();
        GError *error = NULL;
        const gchar* key = "/apps/osso/operator-wizard/last_mcc";
-       gint mcc_id = gconf_client_get_int(client, key, &error);
+       gint mcc_id = modest_conf_get_int(modest_runtime_get_conf (), key, &error);
        
        if(mcc_id < 0)
                mcc_id = 0;
@@ -448,7 +472,7 @@ create_page_account_details (ModestEasysetupWizardDialog *self)
                mcc_id = 0;
        }
     
-       /* Note that gconf_client_get_int() seems to return 0 without an error if the key is not there
+       /* Note that modest_conf_get_int() seems to return 0 without an error if the key is not there
         * This might just be a Maemo bug.
         */
        if (mcc_id == 0) 
@@ -457,7 +481,7 @@ create_page_account_details (ModestEasysetupWizardDialog *self)
                mcc_id = 244;
        }
    
-       easysetup_country_combo_box_set_active_country_id (
+       easysetup_country_combo_box_set_active_country_mcc (
                EASYSETUP_COUNTRY_COMBO_BOX (self->combo_account_country), mcc_id);
                
        
@@ -629,19 +653,17 @@ static GtkWidget* create_page_complete_easysetup (ModestEasysetupWizardDialog *s
        
        GtkWidget *label = gtk_label_new(_("mcen_ia_emailsetup_setup_complete"));
        gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
-       gtk_label_set_max_width_chars (GTK_LABEL (label), 40);
+       gtk_widget_set_size_request (label, 600, -1);
        gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+       /* The documentation for gtk_label_set_line_wrap() says that we must 
+        * call gtk_widget_set_size_request() with a hard-coded width, 
+        * though I wonder why gtk_label_set_max_width_chars() isn't enough. */
        gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);
        gtk_widget_show (label);
        
        label = gtk_label_new (_("mcen_ia_easysetup_complete"));
        gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
-       gtk_label_set_max_width_chars (GTK_LABEL (label), 40);
-       
-       /* The documentation for gtk_label_set_line_wrap() says that we must 
-        * call gtk_widget_set_size_request() with a hard-coded width, 
-        * though I wonder why gtk_label_set_max_width_chars() isn't enough. */
-       gtk_widget_set_size_request (label, 400, -1);
+       gtk_widget_set_size_request (label, 600, -1);
        
        gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
        gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);
@@ -710,11 +732,16 @@ static void on_entry_incoming_servername_changed(GtkEntry *entry, gpointer user_
 static GtkWidget* create_page_custom_incoming (ModestEasysetupWizardDialog *self)
 {
        GtkWidget *box = gtk_vbox_new (FALSE, MODEST_MARGIN_NONE);
+       GtkWidget *scrolled_window = gtk_scrolled_window_new (NULL, NULL);
+
+       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
+                                       GTK_POLICY_NEVER,
+                                       GTK_POLICY_AUTOMATIC);
 
        /* Show note that account type cannot be changed in future: */
        GtkWidget *label = gtk_label_new (_("mcen_ia_emailsetup_account_type"));
        gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
-       gtk_label_set_max_width_chars (GTK_LABEL (label), 40);
+       gtk_widget_set_size_request (label, 600, -1);
        gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);
        gtk_widget_show (label);
        
@@ -794,8 +821,13 @@ static GtkWidget* create_page_custom_incoming (ModestEasysetupWizardDialog *self
        gtk_widget_show (caption);
        
        gtk_widget_show (GTK_WIDGET (box));
+
+       gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), box);
+       gtk_container_set_focus_vadjustment (GTK_CONTAINER (box),
+                                            gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
+       gtk_widget_show (scrolled_window);
        
-       return GTK_WIDGET (box);
+       return GTK_WIDGET (scrolled_window);
 }
 
 static void
@@ -834,8 +866,7 @@ on_button_outgoing_smtp_servers (GtkButton *button, gpointer user_data)
        if (!(self->specific_window)) {
                self->specific_window = GTK_WIDGET (modest_connection_specific_smtp_window_new ());
                modest_connection_specific_smtp_window_fill_with_connections (
-                       MODEST_CONNECTION_SPECIFIC_SMTP_WINDOW (self->specific_window), self->account_manager, 
-                       NULL /* account_name, not known yet. */);
+                       MODEST_CONNECTION_SPECIFIC_SMTP_WINDOW (self->specific_window), self->account_manager);
        }
 
        /* Show the window: */
@@ -999,11 +1030,15 @@ static GtkWidget* create_page_complete_custom (ModestEasysetupWizardDialog *self
        GtkWidget *box = gtk_vbox_new (FALSE, MODEST_MARGIN_NONE);
        GtkWidget *label = gtk_label_new(_("mcen_ia_emailsetup_setup_complete"));
        gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+       gtk_widget_set_size_request (label, 600, -1);
+       gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
        gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);
        gtk_widget_show (label);
        
        label = gtk_label_new (_("mcen_ia_customsetup_complete"));
        gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+       gtk_widget_set_size_request (label, 600, -1);
+       gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
        gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);
        gtk_widget_show (label);
        
@@ -1053,8 +1088,7 @@ on_response_before (ModestWizardDialog *wizard_dialog,
        if (response_id == GTK_RESPONSE_CANCEL) {
                /* This is mostly copied from
                 * src/maemo/modest-account-settings-dialog.c */
-               if (priv->dirty)
-               {
+               if (priv->dirty) {
                        GtkDialog *dialog = GTK_DIALOG (hildon_note_new_confirmation (GTK_WINDOW (self), 
                                _("imum_nc_wizard_confirm_lose_changes")));
                        /* TODO: These button names will be ambiguous, and not specified in the UI specification. */
@@ -1062,9 +1096,7 @@ on_response_before (ModestWizardDialog *wizard_dialog,
                        const gint dialog_response = gtk_dialog_run (dialog);
                        gtk_widget_destroy (GTK_WIDGET (dialog));
 
-                       if (dialog_response != GTK_RESPONSE_OK)
-                       {
-                               /* This is a nasty hack. murrayc. */
+                       if (dialog_response != GTK_RESPONSE_OK) {
                                /* Don't let the dialog close */
                                g_signal_stop_emission_by_name (wizard_dialog, "response");
                        }
@@ -1118,10 +1150,27 @@ modest_easysetup_wizard_dialog_init (ModestEasysetupWizardDialog *self)
        /* Add the common pages: */
        gtk_notebook_append_page (notebook, self->page_welcome, 
                                  gtk_label_new (_("mcen_ti_emailsetup_welcome")));
+       gtk_container_child_set (GTK_CONTAINER (notebook), 
+                                self->page_welcome,
+                                "tab-expand", TRUE,
+                                "tab-fill", TRUE,
+                                NULL);
+
        gtk_notebook_append_page (notebook, self->page_account_details, 
                                  gtk_label_new (_("mcen_ti_accountdetails")));
+       gtk_container_child_set (GTK_CONTAINER (notebook), 
+                                self->page_account_details,
+                                "tab-expand", TRUE,
+                                "tab-fill", TRUE,
+                                NULL);
+
        gtk_notebook_append_page (notebook, self->page_user_details, 
                                  gtk_label_new (_("mcen_ti_emailsetup_userdetails")));
+       gtk_container_child_set (GTK_CONTAINER (notebook), 
+                                self->page_user_details,
+                                "tab-expand", TRUE,
+                                "tab-fill", TRUE,
+                                NULL);
                
        /* Create and add the easysetup-specific pages,
         * because we need _some_ final page to enable the Next and Finish buttons: */
@@ -1159,16 +1208,10 @@ modest_easysetup_wizard_dialog_init (ModestEasysetupWizardDialog *self)
 }
 
 ModestEasysetupWizardDialog*
-modest_easysetup_wizard_dialog_new_or_present (void)
+modest_easysetup_wizard_dialog_new (void)
 {      
-       if (_instance) {
-               g_message ("%s: already instantiated; presenting\n",
-                          __FUNCTION__);
-               gtk_window_present (GTK_WINDOW(_instance));
-               return NULL;
-       }
        
-       return _instance = g_object_new (MODEST_TYPE_EASYSETUP_WIZARD_DIALOG, NULL);
+       return g_object_new (MODEST_TYPE_EASYSETUP_WIZARD_DIALOG, NULL);
 }
 
 static void create_subsequent_customsetup_pages (ModestEasysetupWizardDialog *self)
@@ -1198,9 +1241,15 @@ static void create_subsequent_customsetup_pages (ModestEasysetupWizardDialog *se
                gtk_notebook_append_page (notebook, self->page_custom_outgoing,
                                          gtk_label_new (_("mcen_ti_emailsetup_outgoingdetails")));
                
-       if (!gtk_widget_get_parent (GTK_WIDGET (self->page_complete_customsetup)))
+       if (!gtk_widget_get_parent (GTK_WIDGET (self->page_complete_customsetup))) {
                gtk_notebook_append_page (notebook, self->page_complete_customsetup,
                                          gtk_label_new (_("mcen_ti_emailsetup_complete")));
+               gtk_container_child_set (GTK_CONTAINER (notebook), 
+                                        self->page_complete_customsetup,
+                                        "tab-expand", TRUE,
+                                        "tab-fill", TRUE,
+                                        NULL);
+       }
                        
        /* This is unnecessary with GTK+ 2.10: */
        modest_wizard_dialog_force_title_update (MODEST_WIZARD_DIALOG(self));
@@ -1216,9 +1265,15 @@ static void create_subsequent_easysetup_pages (ModestEasysetupWizardDialog *self
        if(!self->page_complete_easysetup)
                self->page_complete_easysetup = create_page_complete_easysetup (self);
 
-       if (!gtk_widget_get_parent (GTK_WIDGET (self->page_complete_easysetup)))
+       if (!gtk_widget_get_parent (GTK_WIDGET (self->page_complete_easysetup))) {
                gtk_notebook_append_page (notebook, self->page_complete_easysetup, 
                                          gtk_label_new (_("mcen_ti_emailsetup_complete")));
+               gtk_container_child_set (GTK_CONTAINER (notebook),
+                                        self->page_complete_easysetup,
+                                        "tab-expand", TRUE,
+                                        "tab-fill", TRUE,
+                                        NULL);
+       }
                        
        /* This is unnecessary with GTK+ 2.10: */
        modest_wizard_dialog_force_title_update (MODEST_WIZARD_DIALOG(self));
@@ -1423,7 +1478,8 @@ on_before_next (ModestWizardDialog *dialog, GtkWidget *current_page, GtkWidget *
        }
        else if (next_page == account_wizard->page_custom_outgoing) {
                set_default_custom_servernames (account_wizard);
-    /* Check if the server supports secure authentication */
+
+               /* Check if the server supports secure authentication */
                const ModestConnectionProtocol security_incoming = 
                        modest_serversecurity_combo_box_get_active_serversecurity (
                                                                                                                                                                                                                                                                 MODEST_SERVERSECURITY_COMBO_BOX (
@@ -1432,13 +1488,8 @@ on_before_next (ModestWizardDialog *dialog, GtkWidget *current_page, GtkWidget *
                        GTK_TOGGLE_BUTTON (account_wizard->checkbox_incoming_auth))
                                && !modest_protocol_info_is_secure(security_incoming))
                {
-                               GList* methods = check_for_supported_auth_methods(account_wizard);
-                               if (!methods)
-                               {
-                                       g_list_free(methods);
+                               if (!check_has_supported_auth_methods (account_wizard))
                                        return FALSE;
-                               }
-                               g_list_free(methods);
                }
        }
        
@@ -1585,7 +1636,7 @@ show_error (GtkWidget *parent_widget, const gchar* text)
 /** Attempt to create the account from the information that the user has entered.
  * @result: TRUE if the account was successfully created.
  */
-gboolean
+static gboolean
 create_account (ModestEasysetupWizardDialog *self, gboolean enabled)
 {
        ModestEasysetupWizardDialogPrivate *priv = WIZARD_DIALOG_GET_PRIVATE (self);
@@ -1671,18 +1722,12 @@ create_account (ModestEasysetupWizardDialog *self, gboolean enabled)
                 */
                
                if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->checkbox_incoming_auth)) &&
-                               !modest_protocol_info_is_secure(protocol_security_incoming))
-               {
-                               GList* methods = check_for_supported_auth_methods(self);
-                               if (!methods) {
-                                       g_free (display_name);
-                                       return FALSE;
-                               }
-                               else
-                                 protocol_authentication_incoming = (ModestAuthProtocol) (GPOINTER_TO_INT(methods->data));
+                               !modest_protocol_info_is_secure(protocol_security_incoming)) {
+                       protocol_authentication_incoming = check_first_supported_auth_method (self);
                }
-               else
+               else {
                        protocol_authentication_incoming = MODEST_PROTOCOL_AUTH_PASSWORD;
+               }
        }
        
        /* First we add the 2 server accounts, and then we add the account that uses them.
@@ -1812,29 +1857,26 @@ create_account (ModestEasysetupWizardDialog *self, gboolean enabled)
                
        /* The user name and email address must be set additionally: */
        const gchar* user_name = gtk_entry_get_text (GTK_ENTRY (self->entry_user_name));
-       modest_account_mgr_set_string (self->account_manager, account_name,
-                                      MODEST_ACCOUNT_FULLNAME, user_name, FALSE /* not server account */);
+       modest_account_mgr_set_server_account_user_fullname (self->account_manager, account_name, user_name);
 
        const gchar* emailaddress = gtk_entry_get_text (GTK_ENTRY (self->entry_user_email));
-       modest_account_mgr_set_string (self->account_manager, account_name,
-                                      MODEST_ACCOUNT_EMAIL, emailaddress, FALSE /* not server account */);
+       modest_account_mgr_set_server_account_user_email (self->account_manager, account_name, emailaddress); 
 
        /* Set the display name: */
-       modest_account_mgr_set_string (self->account_manager, account_name,
-                                      MODEST_ACCOUNT_DISPLAY_NAME, display_name, FALSE /* not server account */);
+       modest_account_mgr_set_display_name (self->account_manager, account_name, display_name);
 
        /* Set retrieve type */ 
        const gchar *retrieve = MODEST_ACCOUNT_RETRIEVE_VALUE_HEADERS_ONLY;
-       modest_account_mgr_set_string (self->account_manager, account_name,
-               MODEST_ACCOUNT_RETRIEVE, retrieve, FALSE /* not server account */);
+       modest_account_mgr_set_retrieve_type (self->account_manager, account_name, retrieve);
 
        /* Save the connection-specific SMTP server accounts. */
-        modest_account_mgr_set_use_connection_specific_smtp(self->account_manager, account_name,
+        modest_account_mgr_set_use_connection_specific_smtp(self->account_manager, account_name, 
                 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(self->checkbox_outgoing_smtp_specific)));
        gboolean result = TRUE;
        if (self->specific_window)
                result = modest_connection_specific_smtp_window_save_server_accounts (
-                       MODEST_CONNECTION_SPECIFIC_SMTP_WINDOW (self->specific_window), account_name);
+                       MODEST_CONNECTION_SPECIFIC_SMTP_WINDOW (self->specific_window));
+
                        
        g_free (self->saved_account_name);
        self->saved_account_name = g_strdup (account_name);