* Added a new account key called type for server accounts
[modest] / src / gtk / modest-account-assistant.c
index 9f01ecb..cc4265a 100644 (file)
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+#include <glib/gi18n.h>
 #include "modest-account-assistant.h"
 #include "modest-store-widget.h"
 #include "modest-transport-widget.h"
+#include "modest-proto.h"
 
 #include <string.h>
 
@@ -227,6 +229,29 @@ add_identity_page (ModestAccountAssistant *self)
 
 
 static void
+receiving_page_update_completeness (GtkEditable *editable,
+                                   ModestAccountAssistant *self)
+{
+       ModestAccountAssistantPrivate *priv;
+       const gchar *txt;
+
+       priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
+
+       txt = modest_store_widget_get_username (priv->store_widget);
+       if (!txt || strlen(txt) == 0) {
+               set_current_page_complete (self, FALSE);
+               return;
+       }
+
+       txt = modest_store_widget_get_servername (priv->store_widget);
+       if (!txt || strlen(txt) == 0) {
+               set_current_page_complete (self, FALSE);
+               return;
+       }
+       set_current_page_complete (self, TRUE);
+}
+
+static void
 on_receiving_combo_box_changed (GtkComboBox *combo, ModestAccountAssistant *self)
 {
        ModestAccountAssistantPrivate *priv;
@@ -239,7 +264,17 @@ on_receiving_combo_box_changed (GtkComboBox *combo, ModestAccountAssistant *self
                gtk_container_remove (GTK_CONTAINER(priv->store_holder),
                                      priv->store_widget);
        
+       /* FIXME: we could have these widgets cached instead of
+          creating them every time */
        priv->store_widget = modest_store_widget_new (priv->factory, chosen);
+       if (!strcmp (chosen, MODEST_PROTO_POP) || !strcmp (chosen, MODEST_PROTO_IMAP)) {
+               g_signal_connect (priv->store_widget, 
+                                 "data_changed", 
+                                 receiving_page_update_completeness, 
+                                 self);
+               set_current_page_complete (self, FALSE);
+       } else
+               set_current_page_complete (self, TRUE);
 
        gtk_container_add (GTK_CONTAINER(priv->store_holder),
                           priv->store_widget);
@@ -274,12 +309,15 @@ add_receiving_page (ModestAccountAssistant *self)
 
        gtk_box_pack_start (GTK_BOX(box), combo, FALSE,FALSE,6);
        gtk_box_pack_start (GTK_BOX(page), box, FALSE,FALSE, 6);
-       
+
        gtk_box_pack_start (GTK_BOX(page), gtk_hseparator_new(), FALSE, FALSE, 0);
 
        priv->store_holder = gtk_hbox_new (FALSE, 0);
        gtk_box_pack_start (GTK_BOX(page), priv->store_holder,
                            TRUE, TRUE, 0);
+
+       /* Force the selection */
+       on_receiving_combo_box_changed (combo, self);
        
        gtk_assistant_append_page (GTK_ASSISTANT(self), page);
                
@@ -288,7 +326,7 @@ add_receiving_page (ModestAccountAssistant *self)
        gtk_assistant_set_page_type (GTK_ASSISTANT(self), page,
                                     GTK_ASSISTANT_PAGE_INTRO);
        gtk_assistant_set_page_complete (GTK_ASSISTANT(self),
-                                        page, TRUE);
+                                        page, FALSE);
        gtk_widget_show_all (page);
 }
 
@@ -346,13 +384,16 @@ add_sending_page (ModestAccountAssistant *self)
 
        gtk_box_pack_start (GTK_BOX(box), combo, FALSE,FALSE,0);
        gtk_box_pack_start (GTK_BOX(page), box, FALSE,FALSE, 0);
-       
+
        gtk_box_pack_start (GTK_BOX(page), gtk_hseparator_new(), FALSE, FALSE, 0);
 
        priv->transport_holder = gtk_hbox_new (FALSE, 0);
        gtk_box_pack_start (GTK_BOX(page), priv->transport_holder,
                            FALSE, FALSE, 0);
-       
+
+       /* Force the selection */
+       on_sending_combo_box_changed (combo, self);
+
        gtk_assistant_append_page (GTK_ASSISTANT(self), page);
                
        gtk_assistant_set_page_title (GTK_ASSISTANT(self), page,
@@ -401,8 +442,6 @@ add_final_page (ModestAccountAssistant *self)
                                         page, TRUE);
        gtk_widget_show_all (page);
 }
-       
-
 
 
 static void
@@ -470,7 +509,7 @@ on_cancel (ModestAccountAssistant *self, gpointer user_data)
        switch (response) {
        case GTK_RESPONSE_ACCEPT:
                /* close the assistant */
-               gtk_widget_destroy (GTK_WIDGET(self));
+               gtk_widget_hide (GTK_WIDGET(self));
                break;
        case GTK_RESPONSE_CANCEL:
                /* don't do anything */
@@ -510,34 +549,58 @@ get_email (ModestAccountAssistant *self)
 }
 
 
+static void
+on_close (ModestAccountAssistant *self, gpointer user_data)
+{
+       gtk_widget_hide (GTK_WIDGET (self));
+}
 
 static void
 on_apply (ModestAccountAssistant *self, gpointer user_data)
 {
        ModestAccountAssistantPrivate *priv;
-       gchar *store_name;
-       const gchar *account_name;
+       gchar *store_name, *transport_name;
+       const gchar *account_name, *username, *servername, *proto;
        ModestStoreWidget *store;
+       ModestTransportWidget *transport;
 
        priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
 
-       /* create account */
-
        /* create server account -> store */
        store = MODEST_STORE_WIDGET(priv->store_widget);
-       store_name = g_strdup_printf ("%s:%s@%s",
-                                     modest_store_widget_get_proto (store),
-                                     modest_store_widget_get_username (store),
-                                     modest_store_widget_get_servername (store));
+       proto = modest_store_widget_get_proto (store);
+       username = modest_store_widget_get_username (store);
+       servername = modest_store_widget_get_servername (store);
+       store_name = g_strdup_printf ("%s:%s@%s", proto, username, servername);
+       
+       modest_account_mgr_add_server_account (priv->account_mgr, store_name, servername,
+                                               username, NULL, proto);
+
+       /* create server account -> transport */
+       transport = MODEST_TRANSPORT_WIDGET(priv->transport_widget);
+       proto = modest_transport_widget_get_proto (transport);
+
+       if (!strcmp (proto, MODEST_PROTO_SMTP)) {
+               servername = modest_transport_widget_get_servername (transport);
+               if (modest_transport_widget_get_requires_auth (transport))
+                       username = modest_transport_widget_get_username (transport);
+               else
+                       username = g_get_user_name ();
+       } else {
+               username = g_get_user_name ();
+               servername = "localhost";
+
+       }
+       transport_name = g_strdup_printf ("%s:%s@%s", proto, username, servername);
        
        modest_account_mgr_add_server_account (priv->account_mgr,
-                                               store_name,
-                                               modest_store_widget_get_servername (store),
-                                               modest_store_widget_get_username (store),
+                                               transport_name,
+                                               servername,
+                                               username,
                                                NULL,
-                                               modest_store_widget_get_proto (store));
+                                               proto);
 
-       /* create server account -> transport */
+       /* create account */
        account_name = get_account_name (self);
        modest_account_mgr_add_account (priv->account_mgr,
                                        account_name,
@@ -551,8 +614,10 @@ on_apply (ModestAccountAssistant *self, gpointer user_data)
                                       account_name,
                                       MODEST_ACCOUNT_EMAIL,
                                       get_email(self), FALSE, NULL);
-       
+
+       /* Frees */     
        g_free (store_name);
+       g_free (transport_name);
 }
 
 
@@ -596,6 +661,8 @@ modest_account_assistant_new (ModestAccountMgr *account_mgr, ModestWidgetFactory
                          G_CALLBACK(on_apply), NULL);
        g_signal_connect (G_OBJECT(self), "cancel",
                          G_CALLBACK(on_cancel), NULL);
+       g_signal_connect (G_OBJECT(self), "close",
+                         G_CALLBACK(on_close), NULL);
 
        return GTK_WIDGET(self);
 }