* check for a valid foldername
[modest] / src / maemo / modest-store-widget.c
index 33989db..f77a087 100644 (file)
@@ -28,6 +28,8 @@
  */
 
 #include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include <widgets/modest-combo-box.h>
 #include "modest-store-widget.h"
 #include <string.h>
 
@@ -37,24 +39,26 @@ static void modest_store_widget_init       (ModestStoreWidget *obj);
 static void modest_store_widget_finalize   (GObject *obj);
 /* list my signals  */
 enum {
-       /* MY_SIGNAL_1, */
-       /* MY_SIGNAL_2, */
+       DATA_CHANGED_SIGNAL,
        LAST_SIGNAL
 };
 
 typedef struct _ModestStoreWidgetPrivate ModestStoreWidgetPrivate;
 struct _ModestStoreWidgetPrivate {
        
-       gchar* proto;
-       
        GtkWidget *servername;
        GtkWidget *username;
+       
+       ModestPairList *security_protos;
        GtkWidget *security;
+       
+       ModestPairList *transport_store_protos;
+       
        GtkWidget *auth;
        GtkWidget *chooser;
        GtkWidget *remember_pwd;
-       
-       ModestWidgetFactory *factory;
+
+       ModestTransportStoreProtocol proto;
 };
 #define MODEST_STORE_WIDGET_GET_PRIVATE(o)      (G_TYPE_INSTANCE_GET_PRIVATE((o), \
                                                  MODEST_TYPE_STORE_WIDGET, \
@@ -63,7 +67,7 @@ struct _ModestStoreWidgetPrivate {
 static GtkContainerClass *parent_class = NULL;
 
 /* uncomment the following if you have defined any signals */
-/* static guint signals[LAST_SIGNAL] = {0}; */
+static guint signals[LAST_SIGNAL] = {0};
 
 GType
 modest_store_widget_get_type (void)
@@ -101,11 +105,14 @@ modest_store_widget_class_init (ModestStoreWidgetClass *klass)
        g_type_class_add_private (gobject_class, sizeof(ModestStoreWidgetPrivate));
 
        /* signal definitions go here, e.g.: */
-/*     signals[MY_SIGNAL_1] = */
-/*             g_signal_new ("my_signal_1",....); */
-/*     signals[MY_SIGNAL_2] = */
-/*             g_signal_new ("my_signal_2",....); */
-/*     etc. */
+       signals[DATA_CHANGED_SIGNAL] =
+               g_signal_new ("data_changed",
+                             G_TYPE_FROM_CLASS (klass),
+                             G_SIGNAL_RUN_FIRST,
+                             G_STRUCT_OFFSET(ModestStoreWidgetClass, data_changed),
+                             NULL, NULL,
+                             g_cclosure_marshal_VOID__VOID,
+                             G_TYPE_NONE, 0);
 }
 
 static void
@@ -114,8 +121,7 @@ modest_store_widget_init (ModestStoreWidget *obj)
        ModestStoreWidgetPrivate *priv;
        
        priv = MODEST_STORE_WIDGET_GET_PRIVATE(obj); 
-
-       priv->proto = NULL;
+       priv->proto = MODEST_PROTOCOL_TRANSPORT_STORE_UNKNOWN;
 }
 
 
@@ -186,13 +192,19 @@ mbox_configuration (ModestStoreWidget *self)
        return box;
 }
 
+static void
+on_entry_changed (GtkEntry *entry, gpointer user_data)
+{
+       g_signal_emit (MODEST_STORE_WIDGET (user_data), signals[DATA_CHANGED_SIGNAL], 0);
+}
 
 static GtkWidget*
 imap_pop_configuration (ModestStoreWidget *self)
 {
        ModestStoreWidgetPrivate *priv;
        GtkWidget *label, *box, *hbox;
-
+       GtkWidget *combo;
+       
        priv = MODEST_STORE_WIDGET_GET_PRIVATE(self);
        box = gtk_vbox_new (FALSE, 6);
        
@@ -220,13 +232,17 @@ imap_pop_configuration (ModestStoreWidget *self)
        gtk_label_set_markup (GTK_LABEL(label),_("<b>Security</b>"));
        gtk_box_pack_start (GTK_BOX(box), label, FALSE, FALSE, 0);
 
+       /* Note: This ModestPairList* must exist for as long as the combo
+        * that uses it, because the ModestComboBox uses the ID opaquely, 
+        * so it can't know how to manage its memory. */
+       priv->security_protos = modest_protocol_info_get_connection_protocol_pair_list ();
+       priv->security = modest_combo_box_new (priv->security_protos, g_str_equal);
+       
        hbox = gtk_hbox_new (FALSE, 6);
        label = gtk_label_new(NULL);
        gtk_label_set_text (GTK_LABEL(label),_("Connection type:"));
        gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0);
-       gtk_box_pack_start (GTK_BOX(hbox),  modest_widget_factory_get_combo_box
-                           (priv->factory, MODEST_COMBO_BOX_TYPE_SECURITY_PROTOS),
-                           FALSE, FALSE,0);
+       gtk_box_pack_start (GTK_BOX(hbox),  priv->security, FALSE, FALSE,0);
        gtk_box_pack_start (GTK_BOX(box), hbox, FALSE, FALSE, 0);
        
        hbox = gtk_hbox_new (FALSE, 6);
@@ -234,10 +250,14 @@ imap_pop_configuration (ModestStoreWidget *self)
 
        gtk_label_set_text (GTK_LABEL(label),_("Authentication:"));
        gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 6);
-       gtk_box_pack_start (GTK_BOX(hbox),   modest_widget_factory_get_combo_box
-                           (priv->factory, MODEST_COMBO_BOX_TYPE_AUTH_PROTOS),
-                           FALSE, FALSE, 0);
+       
+       /* Note: This ModestPairList* must exist for as long as the combo
+        * that uses it, because the ModestComboBox uses the ID opaquely, 
+        * so it can't know how to manage its memory. */
+       priv->transport_store_protos = modest_protocol_info_get_transport_store_protocol_pair_list ();
+       combo =  modest_combo_box_new (priv->transport_store_protos, g_str_equal);
 
+       gtk_box_pack_start (GTK_BOX(hbox), combo, FALSE, FALSE, 0);
        priv->remember_pwd =
                gtk_check_button_new_with_label (_("Remember password"));
        gtk_box_pack_start (GTK_BOX(hbox),priv->remember_pwd,
@@ -245,6 +265,10 @@ imap_pop_configuration (ModestStoreWidget *self)
        
        gtk_box_pack_start (GTK_BOX(box), hbox, FALSE, FALSE, 0);
 
+       /* Handle entry modifications */
+       g_signal_connect (priv->username, "changed", G_CALLBACK (on_entry_changed), self);
+       g_signal_connect (priv->servername, "changed", G_CALLBACK (on_entry_changed), self);
+
        return box;
 }
 
@@ -252,26 +276,19 @@ imap_pop_configuration (ModestStoreWidget *self)
 static void
 modest_store_widget_finalize (GObject *obj)
 {
-       ModestStoreWidgetPrivate *priv;
-       priv = MODEST_STORE_WIDGET_GET_PRIVATE(obj);
+       ModestStoreWidgetPrivate *priv = MODEST_STORE_WIDGET_GET_PRIVATE(obj);
+       
+       /* These had to stay alive for as long as the comboboxes that used them: */
+       modest_pair_list_free (priv->security_protos);
+       modest_pair_list_free (priv->transport_store_protos);
        
-       if (priv->factory) {
-               g_object_unref (priv->factory);
-               priv->factory = NULL;
-       }
-
-       if (priv->proto) {
-               g_free (priv->proto);
-               priv->proto = NULL;
-       }
-
        G_OBJECT_CLASS(parent_class)->finalize (obj);
 }
 
 
 
 GtkWidget*
-modest_store_widget_new (ModestWidgetFactory *factory, const gchar *proto)
+modest_store_widget_new (ModestTransportStoreProtocol proto)
 {
        GObject *obj;
        GtkWidget *w;
@@ -279,25 +296,20 @@ modest_store_widget_new (ModestWidgetFactory *factory, const gchar *proto)
        ModestStoreWidgetPrivate *priv;
        
        g_return_val_if_fail (proto, NULL);
-       g_return_val_if_fail (factory, NULL);
 
        obj = g_object_new(MODEST_TYPE_STORE_WIDGET, NULL);
        self = MODEST_STORE_WIDGET(obj);
        priv = MODEST_STORE_WIDGET_GET_PRIVATE(self);
 
-       g_object_ref (factory);
-       priv->factory = factory;
-
-       priv->proto = g_strdup (proto);
+       priv->proto = proto;
        
-       if (strcmp (proto, MODEST_PROTOCOL_STORE_POP) == 0 ||
-           strcmp (proto, MODEST_PROTOCOL_STORE_IMAP) == 0) {
+       if (proto == MODEST_PROTOCOL_STORE_POP || proto == MODEST_PROTOCOL_STORE_IMAP)
                w = imap_pop_configuration (self);
-       } else if (strcmp (proto, MODEST_PROTOCOL_STORE_MAILDIR) == 0) {
+       else if (proto == MODEST_PROTOCOL_STORE_MAILDIR) 
                w = maildir_configuration (self);
-       }  else if (strcmp (proto, MODEST_PROTOCOL_STORE_MBOX) == 0) {
+       else if (proto == MODEST_PROTOCOL_STORE_MBOX)
                w = mbox_configuration (self);
-       } else
+       else
                w = gtk_label_new ("");
        
        gtk_widget_show_all (w);
@@ -306,7 +318,6 @@ modest_store_widget_new (ModestWidgetFactory *factory, const gchar *proto)
        return GTK_WIDGET(self);
 }
 
-
 gboolean
 modest_store_widget_get_remember_password (ModestStoreWidget *self)
 {
@@ -315,10 +326,12 @@ modest_store_widget_get_remember_password (ModestStoreWidget *self)
        g_return_val_if_fail (self, FALSE);
        priv = MODEST_STORE_WIDGET_GET_PRIVATE(self);
 
-       return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(priv->remember_pwd));
+       if (GTK_IS_TOGGLE_BUTTON(priv->remember_pwd)) 
+               return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(priv->remember_pwd));
+       else
+               return FALSE;
 }
 
-
 const gchar*
 modest_store_widget_get_username (ModestStoreWidget *self)
 {
@@ -326,8 +339,11 @@ modest_store_widget_get_username (ModestStoreWidget *self)
 
        g_return_val_if_fail (self, NULL);
        priv = MODEST_STORE_WIDGET_GET_PRIVATE(self);
-       
-       return gtk_entry_get_text (GTK_ENTRY(priv->username));
+
+       if (GTK_IS_ENTRY(priv->username)) 
+               return gtk_entry_get_text (GTK_ENTRY(priv->username));
+       else
+               return NULL;
 }
 
 const gchar*
@@ -338,18 +354,35 @@ modest_store_widget_get_servername (ModestStoreWidget *self)
        g_return_val_if_fail (self, NULL);
        priv = MODEST_STORE_WIDGET_GET_PRIVATE(self);
        
-       return gtk_entry_get_text (GTK_ENTRY(priv->servername));
+       if (GTK_IS_ENTRY(priv->servername)) 
+               return gtk_entry_get_text (GTK_ENTRY(priv->servername));
+       else
+               return NULL;
 }
 
 
-const gchar*
+ModestTransportStoreProtocol
 modest_store_widget_get_proto (ModestStoreWidget *self)
 {
        ModestStoreWidgetPrivate *priv;
 
-       g_return_val_if_fail (self, FALSE);
+       g_return_val_if_fail (self, MODEST_PROTOCOL_TRANSPORT_STORE_UNKNOWN);
        priv = MODEST_STORE_WIDGET_GET_PRIVATE(self);
 
        return priv->proto;
 }
 
+
+gchar *
+modest_store_widget_get_path (ModestStoreWidget *self)
+{
+       ModestStoreWidgetPrivate *priv;
+       
+       g_return_val_if_fail (self, NULL);
+       priv = MODEST_STORE_WIDGET_GET_PRIVATE(self);
+
+       if (GTK_IS_FILE_CHOOSER(priv->chooser))
+               return gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(priv->chooser));
+       else
+               return NULL;
+}