* Created ModestProviderPicker widget for hildon2 toolkit.
authorJose Dapena Paz <jdapena@igalia.com>
Wed, 1 Oct 2008 08:52:19 +0000 (08:52 +0000)
committerJose Dapena Paz <jdapena@igalia.com>
Wed, 1 Oct 2008 08:52:19 +0000 (08:52 +0000)
* Modified hildon2 wizard to use the new provider picker.

pmo-trunk-r5829

src/hildon2/Makefile.am
src/hildon2/modest-easysetup-provider-combo-box.c [deleted file]
src/hildon2/modest-easysetup-provider-combo-box.h [deleted file]
src/hildon2/modest-easysetup-wizard-dialog.c
src/hildon2/modest-provider-picker.c [new file with mode: 0644]
src/hildon2/modest-provider-picker.h [new file with mode: 0644]

index 6d7fe13..f184fd2 100644 (file)
@@ -53,7 +53,7 @@ libmodest_ui_la_SOURCES=              \
        modest-default-account-settings-dialog.c \
        modest-easysetup-wizard-dialog.h modest-easysetup-wizard-dialog.c \
        modest-country-picker.h modest-country-picker.c \
-       modest-easysetup-provider-combo-box.h modest-easysetup-provider-combo-box.c \
+       modest-provider-picker.h modest-provider-picker.c \
        modest-easysetup-servertype-combo-box.h modest-easysetup-servertype-combo-box.c \
        modest-icon-names.h           \
        modest-maemo-global-settings-dialog.c \
diff --git a/src/hildon2/modest-easysetup-provider-combo-box.c b/src/hildon2/modest-easysetup-provider-combo-box.c
deleted file mode 100644 (file)
index 1147a1d..0000000
+++ /dev/null
@@ -1,332 +0,0 @@
-/* Copyright (c) 2006, Nokia Corporation
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- * * Neither the name of the Nokia Corporation nor the names of its
- *   contributors may be used to endorse or promote products derived from
- *   this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
- * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
- * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
- * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "modest-easysetup-provider-combo-box.h"
-#include <gtk/gtkliststore.h>
-#include <gtk/gtkcelllayout.h>
-#include <gtk/gtkcellrenderertext.h>
-#include <glib/gi18n.h>
-#include <modest-text-utils.h>
-#include "modest-protocol-registry.h"
-#include "modest-runtime.h"
-
-#include <stdlib.h>
-#include <string.h> /* For memcpy() */
-
-/* Include config.h so that _() works: */
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-G_DEFINE_TYPE (EasysetupProviderComboBox, easysetup_provider_combo_box, GTK_TYPE_COMBO_BOX);
-
-#define PROVIDER_COMBO_BOX_GET_PRIVATE(o) \
-       (G_TYPE_INSTANCE_GET_PRIVATE ((o), EASYSETUP_TYPE_PROVIDER_COMBO_BOX, EasysetupProviderComboBoxPrivate))
-
-typedef struct _EasysetupProviderComboBoxPrivate EasysetupProviderComboBoxPrivate;
-
-struct _EasysetupProviderComboBoxPrivate
-{
-       GtkTreeModel *model;
-};
-
-static void
-easysetup_provider_combo_box_get_property (GObject *object, guint property_id,
-                                                                                                                       GValue *value, GParamSpec *pspec)
-{
-       switch (property_id) {
-       default:
-               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
-       }
-}
-
-static void
-easysetup_provider_combo_box_set_property (GObject *object, guint property_id,
-                                                                                                                       const GValue *value, GParamSpec *pspec)
-{
-       switch (property_id) {
-       default:
-               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
-       }
-}
-
-static void
-easysetup_provider_combo_box_dispose (GObject *object)
-{
-       if (G_OBJECT_CLASS (easysetup_provider_combo_box_parent_class)->dispose)
-               G_OBJECT_CLASS (easysetup_provider_combo_box_parent_class)->dispose (object);
-}
-
-static void
-easysetup_provider_combo_box_finalize (GObject *object)
-{
-       EasysetupProviderComboBoxPrivate *priv = PROVIDER_COMBO_BOX_GET_PRIVATE (object);
-
-       g_object_unref (G_OBJECT (priv->model));
-
-       G_OBJECT_CLASS (easysetup_provider_combo_box_parent_class)->finalize (object);
-}
-
-static void
-easysetup_provider_combo_box_class_init (EasysetupProviderComboBoxClass *klass)
-{
-       GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
-       g_type_class_add_private (klass, sizeof (EasysetupProviderComboBoxPrivate));
-
-       object_class->get_property = easysetup_provider_combo_box_get_property;
-       object_class->set_property = easysetup_provider_combo_box_set_property;
-       object_class->dispose = easysetup_provider_combo_box_dispose;
-       object_class->finalize = easysetup_provider_combo_box_finalize;
-}
-
-enum MODEL_COLS {
-       MODEL_COL_ID, /* a string, not an int. */
-       MODEL_COL_NAME,
-       MODEL_COL_ID_TYPE
-};
-
-
-/*
- * strictly, we should sort providers with mcc=0 after the other ones.... but, we don't have
- * that info here, so ignoring for now.
- */
-static gint
-provider_sort_func (GtkTreeModel *model, GtkTreeIter *iter1, GtkTreeIter *iter2, gpointer user_data)
-{
-       gchar *prov1, *prov2;
-       gint retval;
-       
-       gtk_tree_model_get (model, iter1, MODEL_COL_NAME, &prov1, -1);
-       gtk_tree_model_get (model, iter2, MODEL_COL_NAME, &prov2, -1);
-
-       if (strcmp (prov1, prov2) == 0) 
-               retval = 0;
-       else if (strcmp (_("mcen_va_serviceprovider_other"), prov1) == 0)
-               retval = -1;
-       else if (strcmp (_("mcen_va_serviceprovider_other"), prov2) == 0)
-               retval = 1;
-       else
-               retval = modest_text_utils_utf8_strcmp (prov1, prov2, TRUE);
-       
-       g_free (prov1);
-       g_free (prov2);
-
-       return retval;
-}
-
-static void
-easysetup_provider_combo_box_init (EasysetupProviderComboBox *self)
-{
-       EasysetupProviderComboBoxPrivate *priv = PROVIDER_COMBO_BOX_GET_PRIVATE (self);
-
-       /* Create a tree model for the combo box,
-        * with a string for the name, and a string for the ID (e.g. "vodafone.it"), and the mcc
-        * This must match our MODEL_COLS enum constants.
-        */
-       priv->model = GTK_TREE_MODEL (gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT));
-
-       /* Setup the combo box: */
-       GtkComboBox *combobox = GTK_COMBO_BOX (self);
-       gtk_combo_box_set_model (combobox, priv->model);
-
-       /* Provider column:
-        * The ID model column in not shown in the view. */
-       GtkCellRenderer *renderer = gtk_cell_renderer_text_new ();
-       gtk_cell_layout_pack_start(GTK_CELL_LAYOUT (combobox), renderer, TRUE);
-       gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer,  "text", MODEL_COL_NAME, NULL);
-       
-       gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE(priv->model),
-                                             MODEL_COL_NAME, GTK_SORT_ASCENDING);
-       gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE(priv->model),
-                                         MODEL_COL_NAME,
-                                         (GtkTreeIterCompareFunc)provider_sort_func,
-                                         NULL, NULL);
-}
-
-EasysetupProviderComboBox*
-easysetup_provider_combo_box_new (void)
-{
-       return g_object_new (EASYSETUP_TYPE_PROVIDER_COMBO_BOX, NULL);
-}
-
-void
-easysetup_provider_combo_box_fill (EasysetupProviderComboBox *combobox, 
-                                  ModestPresets *presets,
-                                  gint mcc)
-{      
-       GtkTreeIter other_iter;
-       EasysetupProviderComboBoxPrivate *priv;
-       GtkListStore *liststore;        
-       GSList *provider_ids_used_already = NULL, *provider_protos, *tmp;
-       gchar ** provider_ids = NULL;
-       gchar ** provider_names;        
-       gchar ** iter_provider_names;
-       gchar ** iter_provider_ids;
-       ModestProtocolRegistry *registry;
-
-       g_return_if_fail (EASYSETUP_IS_PROVIDER_COMBO_BOX(combobox));
-
-       priv = PROVIDER_COMBO_BOX_GET_PRIVATE (combobox);
-       liststore = GTK_LIST_STORE (priv->model);
-       gtk_list_store_clear (liststore);
-       provider_names = modest_presets_get_providers (presets, mcc, TRUE, &provider_ids);
-
-       iter_provider_names = provider_names;
-       iter_provider_ids = provider_ids;
-
-       while(iter_provider_names && *iter_provider_names && iter_provider_ids && *iter_provider_ids) {
-               const gchar* provider_name = *iter_provider_names;
-               const gchar* provider_id = *iter_provider_ids;
-
-               /* Prevent duplicate providers: */
-               if (g_slist_find_custom (provider_ids_used_already, 
-                                        provider_id, (GCompareFunc)strcmp) == NULL) {
-                       /* printf("debug: provider_name=%s\n", provider_name); */
-
-                       /* Add the row: */
-                       GtkTreeIter iter;
-                       gtk_list_store_append (liststore, &iter);
-                       
-                       gtk_list_store_set(liststore, &iter, 
-                                          MODEL_COL_ID, provider_id, 
-                                          MODEL_COL_NAME, provider_name, 
-                                          MODEL_COL_ID_TYPE, EASYSETUP_PROVIDER_COMBO_BOX_ID_PROVIDER,
-                                          -1);
-                       
-                       provider_ids_used_already = g_slist_prepend (
-                               provider_ids_used_already, (gpointer)g_strdup (provider_id));
-               }
-               
-               ++iter_provider_names;
-               ++iter_provider_ids;
-       }
-       
-       /* Free the result of modest_presets_get_providers()
-        * as specified by its documentation: */
-       g_strfreev (provider_names);
-       g_strfreev (provider_ids);
-
-       /* Add the provider protocols */
-       registry = modest_runtime_get_protocol_registry ();
-       provider_protos = modest_protocol_registry_get_by_tag (registry, 
-                                                              MODEST_PROTOCOL_REGISTRY_PROVIDER_PROTOCOLS);
-       tmp = provider_protos;
-       while (tmp) {
-               GtkTreeIter iter;
-               ModestProtocol *proto = MODEST_PROTOCOL (tmp->data);
-               const gchar *name = modest_protocol_get_display_name (proto);
-
-               /* only add store protocols, no need to duplicate them */
-               if (modest_protocol_registry_protocol_type_has_tag (registry, 
-                                                                   modest_protocol_get_type_id (proto),
-                                                                   MODEST_PROTOCOL_REGISTRY_STORE_PROTOCOLS)) {
-                       gtk_list_store_append (liststore, &iter);
-                       gtk_list_store_set (liststore, &iter,
-                                           MODEL_COL_ID, modest_protocol_get_name (proto),
-                                           MODEL_COL_NAME, name,
-                                           MODEL_COL_ID_TYPE, EASYSETUP_PROVIDER_COMBO_BOX_ID_PLUGIN_PROTOCOL,
-                                           -1);
-               }
-               tmp = g_slist_next (tmp);
-       }
-       g_slist_free (provider_protos);
-       
-       /* Add the "Other" item: */
-       /* Note that ID 0 means "Other" for us: */
-       gtk_list_store_prepend (liststore, &other_iter);
-       gtk_list_store_set (liststore, &other_iter,
-                           MODEL_COL_ID, 0,
-                           MODEL_COL_NAME, _("mcen_va_serviceprovider_other"),
-                           MODEL_COL_ID_TYPE, EASYSETUP_PROVIDER_COMBO_BOX_ID_OTHER,
-                           -1);
-
-       /* Select the "Other" item: */
-       gtk_combo_box_set_active_iter (GTK_COMBO_BOX (combobox), &other_iter);
-       
-       g_slist_foreach (provider_ids_used_already, (GFunc)g_free, NULL);
-       g_slist_free (provider_ids_used_already);
-}
-
-/**
- * Returns the MCC number of the selected provider, 
- * or NULL if no provider was selected, or "Other" was selected. 
- */
-gchar*
-easysetup_provider_combo_box_get_active_provider_id (EasysetupProviderComboBox *combobox)
-{
-       GtkTreeIter active;
-
-       g_return_val_if_fail (EASYSETUP_IS_PROVIDER_COMBO_BOX(combobox), NULL);
-
-       const gboolean found = gtk_combo_box_get_active_iter (GTK_COMBO_BOX (combobox), &active);
-       if (found) {
-               EasysetupProviderComboBoxPrivate *priv = PROVIDER_COMBO_BOX_GET_PRIVATE (combobox);
-
-               gchar *id = NULL;
-               gtk_tree_model_get (priv->model, &active, MODEL_COL_ID, &id, -1);
-               return g_strdup(id);    
-       }
-
-       return NULL; /* Failed. */
-}
-
-void 
-easysetup_provider_combo_box_set_others_provider (EasysetupProviderComboBox *combobox)
-{
-       GtkTreeModel *model;
-       GtkTreeIter others_iter;
-
-       g_return_if_fail (EASYSETUP_IS_PROVIDER_COMBO_BOX(combobox));
-       
-       model = gtk_combo_box_get_model (GTK_COMBO_BOX (combobox));
-       
-       if (gtk_tree_model_get_iter_first (model, &others_iter))
-               gtk_combo_box_set_active_iter (GTK_COMBO_BOX (combobox), &others_iter);
-}
-
-EasysetupProviderComboBoxIdType 
-easysetup_provider_combo_box_get_active_id_type (EasysetupProviderComboBox *combobox)
-{
-       GtkTreeIter active;
-
-       g_return_val_if_fail (EASYSETUP_IS_PROVIDER_COMBO_BOX (combobox), 
-                             EASYSETUP_PROVIDER_COMBO_BOX_ID_OTHER);
-
-       if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (combobox), &active)) {
-               EasysetupProviderComboBoxPrivate *priv = PROVIDER_COMBO_BOX_GET_PRIVATE (combobox);
-               EasysetupProviderComboBoxIdType id_type;
-
-               gtk_tree_model_get (priv->model, &active, MODEL_COL_ID_TYPE, &id_type, -1);
-               return id_type; 
-       } else {
-               /* Fallback to other */
-               return EASYSETUP_PROVIDER_COMBO_BOX_ID_OTHER;
-       }
-}
diff --git a/src/hildon2/modest-easysetup-provider-combo-box.h b/src/hildon2/modest-easysetup-provider-combo-box.h
deleted file mode 100644 (file)
index d4bc283..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-/* Copyright (c) 2006, Nokia Corporation
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- * * Neither the name of the Nokia Corporation nor the names of its
- *   contributors may be used to endorse or promote products derived from
- *   this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
- * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
- * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
- * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _EASYSETUP_PROVIDER_COMBO_BOX
-#define _EASYSETUP_PROVIDER_COMBO_BOX
-
-#include <gtk/gtkcombobox.h>
-#include "modest-presets.h"
-
-G_BEGIN_DECLS
-
-#define EASYSETUP_TYPE_PROVIDER_COMBO_BOX easysetup_provider_combo_box_get_type()
-
-#define EASYSETUP_PROVIDER_COMBO_BOX(obj) \
-       (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
-       EASYSETUP_TYPE_PROVIDER_COMBO_BOX, EasysetupProviderComboBox))
-
-#define EASYSETUP_PROVIDER_COMBO_BOX_CLASS(klass) \
-       (G_TYPE_CHECK_CLASS_CAST ((klass), \
-       EASYSETUP_TYPE_PROVIDER_COMBO_BOX, EasysetupProviderComboBoxClass))
-
-#define EASYSETUP_IS_PROVIDER_COMBO_BOX(obj) \
-       (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
-       EASYSETUP_TYPE_PROVIDER_COMBO_BOX))
-
-#define EASYSETUP_IS_PROVIDER_COMBO_BOX_CLASS(klass) \
-       (G_TYPE_CHECK_CLASS_TYPE ((klass), \
-       EASYSETUP_TYPE_PROVIDER_COMBO_BOX))
-
-#define EASYSETUP_PROVIDER_COMBO_BOX_GET_CLASS(obj) \
-       (G_TYPE_INSTANCE_GET_CLASS ((obj), \
-       EASYSETUP_TYPE_PROVIDER_COMBO_BOX, EasysetupProviderComboBoxClass))
-
-/** The thype of the ID
- *
- * this means the value of returned by get_active_provider_id will be
- * different depending on the value returned by get_active_id_type
- *
- * If the selected option is a provider then the ID will be the provider ID
- * If the selected option is "Other..." the the ID will be 0
- * If the selected option is a provider protocol () the the ID will be protocol name
- **/
-typedef enum {
-       EASYSETUP_PROVIDER_COMBO_BOX_ID_PROVIDER,
-       EASYSETUP_PROVIDER_COMBO_BOX_ID_OTHER,
-       EASYSETUP_PROVIDER_COMBO_BOX_ID_PLUGIN_PROTOCOL
-} EasysetupProviderComboBoxIdType;
-
-typedef struct {
-       GtkComboBox parent;
-} EasysetupProviderComboBox;
-
-typedef struct {
-       GtkComboBoxClass parent_class;
-} EasysetupProviderComboBoxClass;
-
-GType easysetup_provider_combo_box_get_type (void);
-
-EasysetupProviderComboBox* easysetup_provider_combo_box_new (void);
-
-void easysetup_provider_combo_box_fill (EasysetupProviderComboBox *combobox, ModestPresets *presets,
-                                       gint mcc);
-
-gchar* easysetup_provider_combo_box_get_active_provider_id (EasysetupProviderComboBox *combobox);
-
-EasysetupProviderComboBoxIdType easysetup_provider_combo_box_get_active_id_type (EasysetupProviderComboBox *combobox);
-
-G_END_DECLS
-
-#endif /* _EASYSETUP_PROVIDER_COMBO_BOX */
index 8ddc972..3c98895 100644 (file)
@@ -41,7 +41,7 @@
 #include <gtk/gtkmessagedialog.h>
 #include <gtk/gtkseparator.h>
 #include "modest-country-picker.h"
-#include "modest-easysetup-provider-combo-box.h"
+#include "modest-provider-picker.h"
 #include "modest-easysetup-servertype-combo-box.h"
 #include "widgets/modest-validating-entry.h"
 #include "modest-text-utils.h"
@@ -104,7 +104,7 @@ struct _ModestEasysetupWizardDialogPrivate
        
        GtkWidget *page_account_details;
        GtkWidget *account_country_picker;
-       GtkWidget *combo_account_serviceprovider;
+       GtkWidget *account_serviceprovider_picker;
        GtkWidget *entry_account_title;
        
        GtkWidget *page_user_details;
@@ -214,91 +214,6 @@ get_port_from_protocol (ModestProtocolType server_type,
        return server_port;
 }
 
-/* static GList*  */
-/* check_for_supported_auth_methods (ModestEasysetupWizardDialog* self) */
-/* { */
-/*     GError *error = NULL; */
-/*     ModestProtocolType protocol_type; */
-/*     const gchar* hostname; */
-/*     const gchar* username; */
-/*     ModestProtocolType security_protocol_incoming_type; */
-/*     ModestProtocolRegistry *registry; */
-/*     int port_num;  */
-/*     GList *list_auth_methods; */
-/*     ModestEasysetupWizardDialogPrivate *priv; */
-       
-/*     priv = MODEST_EASYSETUP_WIZARD_DIALOG_GET_PRIVATE (self); */
-/*     registry = modest_runtime_get_protocol_registry (); */
-/*     protocol_type = easysetup_servertype_combo_box_get_active_servertype ( */
-/*             EASYSETUP_SERVERTYPE_COMBO_BOX (priv->combo_incoming_servertype)); */
-/*     hostname = gtk_entry_get_text(GTK_ENTRY(priv->entry_incomingserver)); */
-/*     username = gtk_entry_get_text(GTK_ENTRY(priv->entry_user_username)); */
-/*     security_protocol_incoming_type = modest_serversecurity_combo_box_get_active_serversecurity */
-/*             (MODEST_SERVERSECURITY_COMBO_BOX (priv->combo_incoming_security)); */
-/*     port_num = get_port_from_protocol(protocol_type, FALSE);  */
-/*     list_auth_methods = modest_utils_get_supported_secure_authentication_methods (protocol_type, hostname, port_num,  */
-/*                                                                                   username, GTK_WINDOW (self), &error); */
-
-/*     if (list_auth_methods) { */
-/*             /\* TODO: Select the correct method *\/ */
-/*             GList* list = NULL; */
-/*             GList* method; */
-/*             for (method = list_auth_methods; method != NULL; method = g_list_next(method)) { */
-/*                     ModestProtocolType auth_protocol_type = (ModestProtocolType) (GPOINTER_TO_INT(method->data)); */
-/*                     if (modest_protocol_registry_protocol_type_has_tag (registry, auth_protocol_type, */
-/*                                                                         MODEST_PROTOCOL_REGISTRY_SECURE_PROTOCOLS)) { */
-/*                             list = g_list_append(list, GINT_TO_POINTER(auth_protocol_type)); */
-/*                     } */
-/*             } */
-
-/*             g_list_free(list_auth_methods); */
-
-/*             if (list) */
-/*                     return list; */
-/*     } */
-
-/*     if(error == NULL || error->domain != modest_utils_get_supported_secure_authentication_error_quark() || */
-/*                     error->code != MODEST_UTILS_GET_SUPPORTED_SECURE_AUTHENTICATION_ERROR_CANCELED) */
-/*     { */
-/*             modest_platform_information_banner (GTK_WIDGET(self), NULL, */
-/*                                                 _("mcen_ib_unableto_discover_auth_methods")); */
-/*     } */
-
-/*     if(error != NULL) */
-/*             g_error_free(error); */
-
-/*     return NULL; */
-/* } */
-
-/* static gboolean check_has_supported_auth_methods(ModestEasysetupWizardDialog* self) */
-/* { */
-/*     GList* methods = check_for_supported_auth_methods(self); */
-/*     if (!methods) */
-/*     { */
-/*             return FALSE; */
-/*     } */
-
-/*     g_list_free(methods); */
-/*     return TRUE; */
-/* } */
-
-/* static ModestProtocolType check_first_supported_auth_method(ModestEasysetupWizardDialog* self) */
-/* { */
-/*     ModestProtocolType result; */
-
-/*     result = MODEST_PROTOCOLS_AUTH_PASSWORD; */
-
-/*     GList* methods = check_for_supported_auth_methods(self); */
-/*     if (methods) */
-/*     { */
-/*             /\* Use the first one: *\/ */
-/*             result = (ModestProtocolType) (GPOINTER_TO_INT(methods->data)); */
-/*             g_list_free(methods); */
-/*     } */
-
-/*     return result; */
-/* } */
-
 static void
 invoke_enable_buttons_vfunc (ModestEasysetupWizardDialog *wizard_dialog)
 {
@@ -411,13 +326,13 @@ on_account_country_selector_changed (HildonTouchSelector *widget, gint column, g
        if (priv->presets != NULL) {
                gint mcc = modest_country_picker_get_active_country_mcc (
                        MODEST_COUNTRY_PICKER (priv->account_country_picker));
-               easysetup_provider_combo_box_fill (
-                       EASYSETUP_PROVIDER_COMBO_BOX (priv->combo_account_serviceprovider), priv->presets, mcc);
+               modest_provider_picker_fill (
+                       MODEST_PROVIDER_PICKER (priv->account_serviceprovider_picker), priv->presets, mcc);
        }
 }
 
 static void
-on_combo_account_serviceprovider (GtkComboBox *widget, gpointer user_data)
+on_account_serviceprovider_selector_changed (GtkComboBox *widget, gint column, gpointer user_data)
 {
        ModestEasysetupWizardDialog *self = MODEST_EASYSETUP_WIZARD_DIALOG (user_data);
        g_assert(self);
@@ -426,8 +341,8 @@ on_combo_account_serviceprovider (GtkComboBox *widget, gpointer user_data)
        priv->dirty = TRUE;
        
        /* Fill the providers combo, based on the selected country: */
-       gchar* provider_id = easysetup_provider_combo_box_get_active_provider_id (
-               EASYSETUP_PROVIDER_COMBO_BOX (priv->combo_account_serviceprovider));
+       gchar* provider_id = modest_provider_picker_get_active_provider_id (
+               MODEST_PROVIDER_PICKER (priv->account_serviceprovider_picker));
        
        gchar* domain_name = NULL;
        if(provider_id)
@@ -477,7 +392,7 @@ create_page_account_details (ModestEasysetupWizardDialog *self)
        gtk_box_pack_start (GTK_BOX (box), priv->account_country_picker, FALSE, FALSE, MODEST_MARGIN_HALF);
        gtk_widget_show (priv->account_country_picker);
        
-       /* connect to country combo's changed signal, so we can fill the provider combo: */
+       /* connect to country combo's changed signal, so we can fill the provider picker: */
        g_signal_connect (G_OBJECT (hildon_picker_button_get_selector 
                                    (HILDON_PICKER_BUTTON (priv->account_country_picker))),
                          "changed",
@@ -488,18 +403,18 @@ create_page_account_details (ModestEasysetupWizardDialog *self)
        gtk_widget_show (separator);
             
        /* The service provider widgets: */     
-       priv->combo_account_serviceprovider = GTK_WIDGET (easysetup_provider_combo_box_new ());
-       gtk_widget_set_size_request (priv->combo_account_serviceprovider, 320, -1);
-       
-       caption = create_caption_new_with_asterisk (self, sizegroup, _("mcen_fi_serviceprovider"), 
-                                                  priv->combo_account_serviceprovider, NULL, HILDON_CAPTION_OPTIONAL);
-       gtk_widget_show (priv->combo_account_serviceprovider);
-       gtk_box_pack_start (GTK_BOX (box), caption, FALSE, FALSE, MODEST_MARGIN_HALF);
-       gtk_widget_show (caption);
+       priv->account_serviceprovider_picker = GTK_WIDGET (modest_provider_picker_new ());
+       hildon_button_set_title (HILDON_BUTTON (priv->account_serviceprovider_picker), _("mcen_fi_serviceprovider"));
+       g_signal_connect (G_OBJECT (priv->account_serviceprovider_picker), "value-changed",
+                         G_CALLBACK (on_picker_button_value_changed), self);
+       gtk_box_pack_start (GTK_BOX (box), priv->account_serviceprovider_picker, FALSE, FALSE, MODEST_MARGIN_HALF);
+       gtk_widget_show (priv->account_serviceprovider_picker);
        
        /* connect to providers combo's changed signal, so we can fill the email address: */
-       g_signal_connect (G_OBJECT (priv->combo_account_serviceprovider), "changed",
-                         G_CALLBACK (on_combo_account_serviceprovider), self);
+       g_signal_connect (G_OBJECT (hildon_picker_button_get_selector 
+                                   (HILDON_PICKER_BUTTON (priv->account_serviceprovider_picker))),
+                         "changed",
+                         G_CALLBACK (on_account_serviceprovider_selector_changed), self);
        
        /* The description widgets: */  
        priv->entry_account_title = GTK_WIDGET (modest_validating_entry_new ());
@@ -1128,9 +1043,10 @@ presets_idle (gpointer userdata)
                        MODEST_COUNTRY_PICKER (priv->account_country_picker));
                mcc = modest_country_picker_get_active_country_mcc (
                        MODEST_COUNTRY_PICKER (priv->account_country_picker));
-               easysetup_provider_combo_box_fill (
-                       EASYSETUP_PROVIDER_COMBO_BOX (priv->combo_account_serviceprovider),
+               modest_provider_picker_fill (
+                       MODEST_PROVIDER_PICKER (priv->account_serviceprovider_picker),
                        priv->presets, mcc);
+               modest_provider_picker_set_others_provider (MODEST_PROVIDER_PICKER (priv->account_serviceprovider_picker));
        }
 
        priv->dirty = FALSE;
@@ -1426,16 +1342,16 @@ static void
 create_subsequent_pages (ModestEasysetupWizardDialog *self)
 {
        ModestEasysetupWizardDialogPrivate *priv;
-       EasysetupProviderComboBox *combo;
-       EasysetupProviderComboBoxIdType id_type;
+       ModestProviderPicker *picker;
+        ModestProviderPickerIdType id_type;
        GtkNotebook *notebook;
 
        priv = MODEST_EASYSETUP_WIZARD_DIALOG_GET_PRIVATE (self);
-       combo = EASYSETUP_PROVIDER_COMBO_BOX (priv->combo_account_serviceprovider);
-       id_type = easysetup_provider_combo_box_get_active_id_type (combo);
+       picker = MODEST_PROVIDER_PICKER (priv->account_serviceprovider_picker);
+       id_type = modest_provider_picker_get_active_id_type (picker);
        g_object_get (self, "wizard-notebook", &notebook, NULL);
 
-       if (id_type == EASYSETUP_PROVIDER_COMBO_BOX_ID_OTHER) {
+       if (id_type == MODEST_PROVIDER_PICKER_ID_OTHER) {
                /* "Other..." was selected: */
 
                /* If we come from a rollbacked easysetup */
@@ -1465,7 +1381,7 @@ create_subsequent_pages (ModestEasysetupWizardDialog *self)
                }
 
                /* It's a pluggable protocol and not a provider with presets */
-               if (id_type == EASYSETUP_PROVIDER_COMBO_BOX_ID_PLUGIN_PROTOCOL) {
+               if (id_type == MODEST_PROVIDER_PICKER_ID_PLUGIN_PROTOCOL) {
                        ModestProtocol *protocol;
                        gchar *proto_name;
                        ModestProtocolType proto_type;
@@ -1480,7 +1396,7 @@ create_subsequent_pages (ModestEasysetupWizardDialog *self)
                                priv->page_complete_easysetup = NULL;
                        }
                        
-                       proto_name = easysetup_provider_combo_box_get_active_provider_id (combo);
+                       proto_name = modest_provider_picker_get_active_provider_id (picker);
                        protocol = modest_protocol_registry_get_protocol_by_name (modest_runtime_get_protocol_registry (),
                                                                                  MODEST_PROTOCOL_REGISTRY_PROVIDER_PROTOCOLS,
                                                                                  proto_name);
@@ -1880,20 +1796,20 @@ save_to_settings (ModestEasysetupWizardDialog *self)
        ModestProtocolType store_auth_protocol, transport_auth_protocol;
        ModestServerAccountSettings *store_settings, *transport_settings;
        const gchar *fullname, *email_address;
-       EasysetupProviderComboBox *combo;
-       EasysetupProviderComboBoxIdType id_type;
+       ModestProviderPicker *picker;
+       ModestProviderPickerIdType id_type;
 
        priv = MODEST_EASYSETUP_WIZARD_DIALOG_GET_PRIVATE (self);
-       combo = EASYSETUP_PROVIDER_COMBO_BOX (priv->combo_account_serviceprovider);
+       picker = MODEST_PROVIDER_PICKER (priv->account_serviceprovider_picker);
        protocol_registry = modest_runtime_get_protocol_registry ();
 
        /* Get details from the specified presets: */
-       id_type = easysetup_provider_combo_box_get_active_id_type (combo);
-       provider_id = easysetup_provider_combo_box_get_active_provider_id (combo);
+       id_type = modest_provider_picker_get_active_id_type (picker);
+       provider_id = modest_provider_picker_get_active_provider_id (picker);
                
        /* Let the plugin save the settings. We do a return in order
           to save an indentation level */
-       if (id_type == EASYSETUP_PROVIDER_COMBO_BOX_ID_PLUGIN_PROTOCOL) {
+       if (id_type == MODEST_PROVIDER_PICKER_ID_PLUGIN_PROTOCOL) {
                ModestProtocol *protocol;
 
                protocol = modest_protocol_registry_get_protocol_by_name (
diff --git a/src/hildon2/modest-provider-picker.c b/src/hildon2/modest-provider-picker.c
new file mode 100644 (file)
index 0000000..f5763e4
--- /dev/null
@@ -0,0 +1,349 @@
+/* Copyright (c) 2006, 2008 Nokia Corporation
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * * Neither the name of the Nokia Corporation nor the names of its
+ *   contributors may be used to endorse or promote products derived from
+ *   this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "modest-provider-picker.h"
+#include <gtk/gtkliststore.h>
+#include <gtk/gtkcelllayout.h>
+#include <gtk/gtkcellrenderertext.h>
+#include <glib/gi18n.h>
+#include <modest-text-utils.h>
+#include "modest-protocol-registry.h"
+#include "modest-runtime.h"
+
+#include <stdlib.h>
+#include <string.h> /* For memcpy() */
+
+/* Include config.h so that _() works: */
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+G_DEFINE_TYPE (ModestProviderPicker, modest_provider_picker, HILDON_TYPE_PICKER_BUTTON);
+
+#define MODEST_PROVIDER_PICKER_GET_PRIVATE(o) \
+       (G_TYPE_INSTANCE_GET_PRIVATE ((o), MODEST_TYPE_PROVIDER_PICKER, ModestProviderPickerPrivate))
+
+typedef struct _ModestProviderPickerPrivate ModestProviderPickerPrivate;
+
+struct _ModestProviderPickerPrivate
+{
+       GtkTreeModel *model;
+};
+static void
+modest_provider_picker_finalize (GObject *object)
+{
+       ModestProviderPickerPrivate *priv = MODEST_PROVIDER_PICKER_GET_PRIVATE (object);
+
+       g_object_unref (G_OBJECT (priv->model));
+
+       G_OBJECT_CLASS (modest_provider_picker_parent_class)->finalize (object);
+}
+
+static void
+modest_provider_picker_class_init (ModestProviderPickerClass *klass)
+{
+       GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+       g_type_class_add_private (klass, sizeof (ModestProviderPickerPrivate));
+
+       object_class->finalize = modest_provider_picker_finalize;
+}
+
+enum MODEL_COLS {
+       MODEL_COL_ID, /* a string, not an int. */
+       MODEL_COL_NAME,
+       MODEL_COL_ID_TYPE
+};
+
+
+/*
+ * strictly, we should sort providers with mcc=0 after the other ones.... but, we don't have
+ * that info here, so ignoring for now.
+ */
+static gint
+provider_sort_func (GtkTreeModel *model, GtkTreeIter *iter1, GtkTreeIter *iter2, gpointer user_data)
+{
+       gchar *prov1, *prov2;
+       gint retval;
+       
+       gtk_tree_model_get (model, iter1, MODEL_COL_NAME, &prov1, -1);
+       gtk_tree_model_get (model, iter2, MODEL_COL_NAME, &prov2, -1);
+
+       if (strcmp (prov1, prov2) == 0) 
+               retval = 0;
+       else if (strcmp (_("mcen_va_serviceprovider_other"), prov1) == 0)
+               retval = -1;
+       else if (strcmp (_("mcen_va_serviceprovider_other"), prov2) == 0)
+               retval = 1;
+       else
+               retval = modest_text_utils_utf8_strcmp (prov1, prov2, TRUE);
+       
+       g_free (prov1);
+       g_free (prov2);
+
+       return retval;
+}
+
+static gchar *
+touch_selector_print_func (HildonTouchSelector *selector)
+{
+       GtkTreeIter iter;
+       if (hildon_touch_selector_get_selected (HILDON_TOUCH_SELECTOR (selector), 0, &iter)) {
+               GtkTreeModel *model;
+               GValue value = {0,};
+               
+               model = hildon_touch_selector_get_model (HILDON_TOUCH_SELECTOR (selector), 0);
+               gtk_tree_model_get_value (model, &iter, MODEL_COL_NAME, &value);
+               return g_value_dup_string (&value);
+       }
+       return NULL;
+}
+
+
+static void
+modest_provider_picker_init (ModestProviderPicker *self)
+{
+       ModestProviderPickerPrivate *priv;
+
+       priv = MODEST_PROVIDER_PICKER_GET_PRIVATE (self);
+       priv->model = NULL;
+}
+
+ModestProviderPicker*
+modest_provider_picker_new (void)
+{
+       ModestProviderPickerPrivate *priv;
+       ModestProviderPicker *self;
+       GtkCellRenderer *renderer;
+       GtkWidget *selector;
+
+       self = g_object_new (MODEST_TYPE_PROVIDER_PICKER, 
+                            "arrangement", HILDON_BUTTON_ARRANGEMENT_VERTICAL,
+                            "size", HILDON_SIZE_AUTO,
+                            NULL);
+       priv = MODEST_PROVIDER_PICKER_GET_PRIVATE (self);
+
+       /* Create the tree model for the selector,
+        * with a string for the name, and a string for the ID (e.g. "vodafone.it"), and the mcc
+        * This must match our MODEL_COLS enum constants.
+        */
+       priv->model = GTK_TREE_MODEL (gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT));
+       gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE(priv->model),
+                                             MODEL_COL_NAME, GTK_SORT_ASCENDING);
+       gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE(priv->model),
+                                         MODEL_COL_NAME,
+                                         (GtkTreeIterCompareFunc)provider_sort_func,
+                                         NULL, NULL);
+
+       renderer = gtk_cell_renderer_text_new ();
+       g_object_set (G_OBJECT (renderer), "ellipsize", PANGO_ELLIPSIZE_END, NULL);
+
+       selector = hildon_touch_selector_new ();
+       hildon_touch_selector_append_column (HILDON_TOUCH_SELECTOR (selector), GTK_TREE_MODEL (priv->model),
+                                            renderer, "text", MODEL_COL_NAME, NULL);
+
+       hildon_touch_selector_set_model (HILDON_TOUCH_SELECTOR (selector), 0, GTK_TREE_MODEL (priv->model));
+       hildon_touch_selector_set_print_func (HILDON_TOUCH_SELECTOR (selector), touch_selector_print_func);
+
+       hildon_picker_button_set_selector (HILDON_PICKER_BUTTON (self), HILDON_TOUCH_SELECTOR (selector));
+       modest_provider_picker_set_others_provider (MODEST_PROVIDER_PICKER (self));
+
+       return self;
+}
+
+void
+modest_provider_picker_fill (ModestProviderPicker *self, 
+                            ModestPresets *presets,
+                            gint mcc)
+{      
+       GtkTreeIter other_iter;
+       ModestProviderPickerPrivate *priv;
+       GtkListStore *liststore;        
+       GSList *provider_ids_used_already = NULL, *provider_protos, *tmp;
+       gchar ** provider_ids = NULL;
+       gchar ** provider_names;        
+       gchar ** iter_provider_names;
+       gchar ** iter_provider_ids;
+       ModestProtocolRegistry *registry;
+       GtkWidget *selector;
+
+       g_return_if_fail (MODEST_IS_PROVIDER_PICKER(self));
+
+       priv = MODEST_PROVIDER_PICKER_GET_PRIVATE (self);
+       liststore = GTK_LIST_STORE (priv->model);
+       gtk_list_store_clear (liststore);
+       provider_names = modest_presets_get_providers (presets, mcc, TRUE, &provider_ids);
+
+       iter_provider_names = provider_names;
+       iter_provider_ids = provider_ids;
+
+       while(iter_provider_names && *iter_provider_names && iter_provider_ids && *iter_provider_ids) {
+               const gchar* provider_name = *iter_provider_names;
+               const gchar* provider_id = *iter_provider_ids;
+
+               /* Prevent duplicate providers: */
+               if (g_slist_find_custom (provider_ids_used_already, 
+                                        provider_id, (GCompareFunc)strcmp) == NULL) {
+                       /* printf("debug: provider_name=%s\n", provider_name); */
+
+                       /* Add the row: */
+                       GtkTreeIter iter;
+                       gtk_list_store_append (liststore, &iter);
+                       
+                       gtk_list_store_set(liststore, &iter, 
+                                          MODEL_COL_ID, provider_id, 
+                                          MODEL_COL_NAME, provider_name, 
+                                          MODEL_COL_ID_TYPE, MODEST_PROVIDER_PICKER_ID_PROVIDER,
+                                          -1);
+                       
+                       provider_ids_used_already = g_slist_prepend (
+                               provider_ids_used_already, (gpointer)g_strdup (provider_id));
+               }
+               
+               ++iter_provider_names;
+               ++iter_provider_ids;
+       }
+       
+       /* Free the result of modest_presets_get_providers()
+        * as specified by its documentation: */
+       g_strfreev (provider_names);
+       g_strfreev (provider_ids);
+
+       /* Add the provider protocols */
+       registry = modest_runtime_get_protocol_registry ();
+       provider_protos = modest_protocol_registry_get_by_tag (registry, 
+                                                              MODEST_PROTOCOL_REGISTRY_PROVIDER_PROTOCOLS);
+       tmp = provider_protos;
+       while (tmp) {
+               GtkTreeIter iter;
+               ModestProtocol *proto = MODEST_PROTOCOL (tmp->data);
+               const gchar *name = modest_protocol_get_display_name (proto);
+
+               /* only add store protocols, no need to duplicate them */
+               if (modest_protocol_registry_protocol_type_has_tag (registry, 
+                                                                   modest_protocol_get_type_id (proto),
+                                                                   MODEST_PROTOCOL_REGISTRY_STORE_PROTOCOLS)) {
+                       gtk_list_store_append (liststore, &iter);
+                       gtk_list_store_set (liststore, &iter,
+                                           MODEL_COL_ID, modest_protocol_get_name (proto),
+                                           MODEL_COL_NAME, name,
+                                           MODEL_COL_ID_TYPE, MODEST_PROVIDER_PICKER_ID_PLUGIN_PROTOCOL,
+                                           -1);
+               }
+               tmp = g_slist_next (tmp);
+       }
+       g_slist_free (provider_protos);
+       
+       g_slist_foreach (provider_ids_used_already, (GFunc)g_free, NULL);
+       g_slist_free (provider_ids_used_already);
+
+       /* Add the "Other" item: */
+       /* Note that ID 0 means "Other" for us: */
+       gtk_list_store_prepend (liststore, &other_iter);
+       gtk_list_store_set (liststore, &other_iter,
+                           MODEL_COL_ID, 0,
+                           MODEL_COL_NAME, _("mcen_va_serviceprovider_other"),
+                           MODEL_COL_ID_TYPE, MODEST_PROVIDER_PICKER_ID_OTHER,
+                           -1);
+
+       /* Select the "Other" item: */
+       selector = GTK_WIDGET (hildon_picker_button_get_selector (HILDON_PICKER_BUTTON (self)));
+       hildon_touch_selector_select_iter (HILDON_TOUCH_SELECTOR (selector), 0, &other_iter, TRUE);
+       hildon_button_set_value (HILDON_BUTTON (self),
+                                hildon_touch_selector_get_current_text (HILDON_TOUCH_SELECTOR (selector)));
+       
+}
+
+/**
+ * Returns the MCC number of the selected provider, 
+ * or NULL if no provider was selected, or "Other" was selected. 
+ */
+gchar*
+modest_provider_picker_get_active_provider_id (ModestProviderPicker *self)
+{
+       GtkTreeIter active;
+       gboolean found;
+       GtkWidget *selector;
+
+       g_return_val_if_fail (MODEST_IS_PROVIDER_PICKER(self), NULL);
+
+       selector = GTK_WIDGET (hildon_picker_button_get_selector (HILDON_PICKER_BUTTON (self)));
+       found = hildon_touch_selector_get_selected (HILDON_TOUCH_SELECTOR (selector), 0, &active);
+       if (found) {
+               ModestProviderPickerPrivate *priv = MODEST_PROVIDER_PICKER_GET_PRIVATE (self);
+
+               gchar *id = NULL;
+               gtk_tree_model_get (priv->model, &active, MODEL_COL_ID, &id, -1);
+               return g_strdup(id);    
+       }
+
+       return NULL; /* Failed. */
+}
+
+void 
+modest_provider_picker_set_others_provider (ModestProviderPicker *self)
+{
+       GtkTreeModel *model;
+       GtkTreeIter others_iter;
+       GtkWidget *selector;
+
+       g_return_if_fail (MODEST_IS_PROVIDER_PICKER(self));
+       
+       selector = GTK_WIDGET (hildon_picker_button_get_selector (HILDON_PICKER_BUTTON (self)));
+       model = hildon_touch_selector_get_model (HILDON_TOUCH_SELECTOR (selector), 0);
+       
+       if (gtk_tree_model_get_iter_first (model, &others_iter)) {
+               hildon_touch_selector_select_iter (HILDON_TOUCH_SELECTOR (selector), 0, &others_iter, TRUE);
+               hildon_button_set_value (HILDON_BUTTON (self),
+                                        hildon_touch_selector_get_current_text (HILDON_TOUCH_SELECTOR (selector)));
+       }
+}
+
+ModestProviderPickerIdType 
+modest_provider_picker_get_active_id_type (ModestProviderPicker *self)
+{
+       GtkTreeIter active;
+       GtkWidget *selector;
+
+       g_return_val_if_fail (MODEST_IS_PROVIDER_PICKER (self), 
+                             MODEST_PROVIDER_PICKER_ID_OTHER);
+
+       selector = GTK_WIDGET (hildon_picker_button_get_selector (HILDON_PICKER_BUTTON(self)));
+
+       if (hildon_touch_selector_get_selected (HILDON_TOUCH_SELECTOR (self), 0, &active)) {
+               ModestProviderPickerPrivate *priv = MODEST_PROVIDER_PICKER_GET_PRIVATE (self);
+               ModestProviderPickerIdType id_type;
+
+               gtk_tree_model_get (priv->model, &active, MODEL_COL_ID_TYPE, &id_type, -1);
+               return id_type; 
+       } else {
+               /* Fallback to other */
+               return MODEST_PROVIDER_PICKER_ID_OTHER;
+       }
+}
diff --git a/src/hildon2/modest-provider-picker.h b/src/hildon2/modest-provider-picker.h
new file mode 100644 (file)
index 0000000..e9709fb
--- /dev/null
@@ -0,0 +1,98 @@
+/* Copyright (c) 2006, 2008 Nokia Corporation
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * * Neither the name of the Nokia Corporation nor the names of its
+ *   contributors may be used to endorse or promote products derived from
+ *   this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _MODEST_PROVIDER_PICKER
+#define _MODEST_PROVIDER_PICKER
+
+#include <hildon/hildon-picker-button.h>
+#include "modest-presets.h"
+
+G_BEGIN_DECLS
+
+#define MODEST_TYPE_PROVIDER_PICKER modest_provider_picker_get_type()
+
+#define MODEST_PROVIDER_PICKER(obj) \
+       (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+       MODEST_TYPE_PROVIDER_PICKER, ModestProviderPicker))
+
+#define MODEST_PROVIDER_PICKER_CLASS(klass) \
+       (G_TYPE_CHECK_CLASS_CAST ((klass), \
+       MODEST_TYPE_PROVIDER_PICKER, ModestProviderPickerClass))
+
+#define MODEST_IS_PROVIDER_PICKER(obj) \
+       (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+       MODEST_TYPE_PROVIDER_PICKER))
+
+#define MODEST_IS_PROVIDER_PICKER_CLASS(klass) \
+       (G_TYPE_CHECK_CLASS_TYPE ((klass), \
+       MODEST_TYPE_PROVIDER_PICKER))
+
+#define MODEST_PROVIDER_PICKER_GET_CLASS(obj) \
+       (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+       MODEST_TYPE_PROVIDER_PICKER, ModestProviderPickerClass))
+
+/** The thype of the ID
+ *
+ * this means the value of returned by get_active_provider_id will be
+ * different depending on the value returned by get_active_id_type
+ *
+ * If the selected option is a provider then the ID will be the provider ID
+ * If the selected option is "Other..." the the ID will be 0
+ * If the selected option is a provider protocol () the the ID will be protocol name
+ **/
+typedef enum {
+       MODEST_PROVIDER_PICKER_ID_PROVIDER,
+       MODEST_PROVIDER_PICKER_ID_OTHER,
+       MODEST_PROVIDER_PICKER_ID_PLUGIN_PROTOCOL
+} ModestProviderPickerIdType;
+
+typedef struct {
+       HildonPickerButton parent;
+} ModestProviderPicker;
+
+typedef struct {
+       HildonPickerButtonClass parent_class;
+} ModestProviderPickerClass;
+
+GType modest_provider_picker_get_type (void);
+
+ModestProviderPicker* modest_provider_picker_new (void);
+
+void modest_provider_picker_fill (ModestProviderPicker *combobox, ModestPresets *presets,
+                                 gint mcc);
+
+gchar* modest_provider_picker_get_active_provider_id (ModestProviderPicker *combobox);
+
+ModestProviderPickerIdType modest_provider_picker_get_active_id_type (ModestProviderPicker *combobox);
+
+void modest_provider_picker_set_others_provider (ModestProviderPicker *self);
+
+G_END_DECLS
+
+#endif /* _MODEST_PROVIDER_PICKER */