New ModestProviderCombobox for running modest in gtk
authorJose Dapena Paz <jdapena@igalia.com>
Thu, 12 Nov 2009 18:41:54 +0000 (19:41 +0100)
committerJose Dapena Paz <jdapena@igalia.com>
Thu, 12 Nov 2009 18:41:54 +0000 (19:41 +0100)
src/hildon2/modest-easysetup-wizard-dialog.c
src/widgets/Makefile.am
src/widgets/modest-provider-combo-box.c [new file with mode: 0644]
src/widgets/modest-provider-combo-box.h [new file with mode: 0644]
src/widgets/modest-toolkit-factory.c
src/widgets/modest-toolkit-factory.h

index bcdc6c8..34748f0 100644 (file)
@@ -38,7 +38,6 @@
 #include <gtk/gtkbutton.h>
 #include <gtk/gtkmessagedialog.h>
 #include <gtk/gtkseparator.h>
-#include "modest-provider-picker.h"
 #include "modest-servertype-picker.h"
 #include "widgets/modest-validating-entry.h"
 #include "modest-text-utils.h"
@@ -114,7 +113,7 @@ struct _ModestEasysetupWizardDialogPrivate
 
        GtkWidget *page_account_details;
        GtkWidget *account_country_selector;
-       GtkWidget *account_serviceprovider_picker;
+       GtkWidget *account_serviceprovider_selector;
        GtkWidget *entry_account_title;
        GtkWidget *caption_account_title;
 
@@ -314,13 +313,13 @@ on_picker_button_value_changed (GtkWidget *widget, gpointer user_data)
 }
 
 static void
-on_serviceprovider_picker_button_value_changed (HildonPickerButton *widget, gpointer user_data)
+on_serviceprovider_selector_value_changed (GtkWidget *widget, gpointer user_data)
 {
        gchar* default_account_name_start;
        gchar* default_account_name;
        ModestEasysetupWizardDialog *self;
        ModestEasysetupWizardDialogPrivate *priv;
-       ModestProviderPickerIdType provider_id_type;
+       ModestProviderSelectorIdType provider_id_type;
        ModestProtocol *protocol;
        gchar *proto_name;
        ModestProtocolType proto_type;
@@ -331,17 +330,13 @@ on_serviceprovider_picker_button_value_changed (HildonPickerButton *widget, gpoi
 
        on_picker_button_value_changed (GTK_WIDGET (widget), user_data);
 
-       provider_id_type = modest_provider_picker_get_active_id_type (
-               MODEST_PROVIDER_PICKER (priv->account_serviceprovider_picker));
-       if (provider_id_type == MODEST_PROVIDER_PICKER_ID_OTHER) {
+       provider_id_type = modest_provider_selector_get_active_id_type (
+               priv->account_serviceprovider_selector);
+       if (provider_id_type == MODEST_PROVIDER_SELECTOR_ID_OTHER) {
                default_account_name_start = g_strdup (_("mcen_ia_emailsetup_defaultname"));
        } else {
-               GtkWidget *selector;
-
-               selector = GTK_WIDGET (hildon_picker_button_get_selector (HILDON_PICKER_BUTTON (widget)));
-               default_account_name_start =
-                       g_strdup (hildon_touch_selector_get_current_text (HILDON_TOUCH_SELECTOR (selector)));
-
+               /* obtain properly the account name! */
+               default_account_name_start = modest_provider_selector_get_active_provider_label (widget);
        }
        default_account_name = modest_account_mgr_get_unused_account_display_name (
                priv->account_manager, default_account_name_start);
@@ -349,7 +344,7 @@ on_serviceprovider_picker_button_value_changed (HildonPickerButton *widget, gpoi
        default_account_name_start = NULL;
 
        hide_account_title = FALSE;
-       proto_name = modest_provider_picker_get_active_provider_id (MODEST_PROVIDER_PICKER (priv->account_serviceprovider_picker));
+       proto_name = modest_provider_selector_get_active_provider_id (priv->account_serviceprovider_selector);
        if (proto_name != NULL) {
                protocol = modest_protocol_registry_get_protocol_by_name (modest_runtime_get_protocol_registry (),
                                                                          MODEST_PROTOCOL_REGISTRY_PROVIDER_PROTOCOLS,
@@ -458,11 +453,10 @@ on_account_country_selector_changed (GtkWidget *widget, gpointer user_data)
 
        priv->dirty = TRUE;
 
-       /* Fill the providers picker, based on the selected country: */
+       /* Fill the providers selector, based on the selected country: */
        if (priv->presets != NULL) {
                gint mcc = modest_country_selector_get_active_country_mcc (priv->account_country_selector);
-               modest_provider_picker_fill (
-                       MODEST_PROVIDER_PICKER (priv->account_serviceprovider_picker), priv->presets, mcc);
+               modest_provider_selector_fill (priv->account_serviceprovider_selector, priv->presets, mcc);
        }
 }
 
@@ -476,8 +470,8 @@ update_user_email_from_provider (ModestEasysetupWizardDialog *self)
        priv = MODEST_EASYSETUP_WIZARD_DIALOG_GET_PRIVATE (self);
 
        /* Fill the providers combo, based on the selected country: */
-       provider_id = modest_provider_picker_get_active_provider_id (
-               MODEST_PROVIDER_PICKER (priv->account_serviceprovider_picker));
+       provider_id = modest_provider_selector_get_active_provider_id (
+               priv->account_serviceprovider_selector);
 
        if (provider_id) {
                gchar *domain_name = modest_presets_get_domain (priv->presets, provider_id);
@@ -497,7 +491,19 @@ update_user_email_from_provider (ModestEasysetupWizardDialog *self)
 }
 
 static void
-on_account_serviceprovider_selector_changed (HildonTouchSelector *widget, gint column, gpointer user_data)
+on_account_serviceprovider_selector_changed (GtkWidget *widget, gint column, gpointer user_data)
+{
+       ModestEasysetupWizardDialog *self = MODEST_EASYSETUP_WIZARD_DIALOG (user_data);
+       g_assert(self);
+       ModestEasysetupWizardDialogPrivate *priv = MODEST_EASYSETUP_WIZARD_DIALOG_GET_PRIVATE (self);
+
+       priv->dirty = TRUE;
+
+       update_user_email_from_provider (self);
+}
+
+static void
+on_account_serviceprovider_selector_combo_box_changed (GtkWidget *widget, gpointer user_data)
 {
        ModestEasysetupWizardDialog *self = MODEST_EASYSETUP_WIZARD_DIALOG (user_data);
        g_assert(self);
@@ -557,15 +563,26 @@ create_page_account_details (ModestEasysetupWizardDialog *self)
        gtk_widget_show (priv->account_country_selector);
 
        /* The service provider widgets: */
-       priv->account_serviceprovider_picker = GTK_WIDGET (modest_provider_picker_new (MODEST_EDITABLE_SIZE,
-                                                                                      HILDON_BUTTON_ARRANGEMENT_HORIZONTAL));
-       modest_maemo_utils_set_hbutton_layout (title_sizegroup, value_sizegroup,
-                                              _("mcen_fi_serviceprovider"),
-                                              priv->account_serviceprovider_picker);
-       g_signal_connect (G_OBJECT (priv->account_serviceprovider_picker), "value-changed",
-                         G_CALLBACK (on_serviceprovider_picker_button_value_changed), self);
-       gtk_box_pack_start (GTK_BOX (box), priv->account_serviceprovider_picker, FALSE, FALSE, 0);
-       gtk_widget_show (priv->account_serviceprovider_picker);
+       priv->account_serviceprovider_selector = modest_toolkit_factory_create_provider_selector (modest_runtime_get_toolkit_factory ());
+       if (GTK_IS_COMBO_BOX (priv->account_serviceprovider_selector)) {
+               GtkWidget *captioned;
+               g_signal_connect (G_OBJECT (priv->account_serviceprovider_selector), "changed",
+                                 G_CALLBACK (on_serviceprovider_selector_value_changed), self);
+               captioned = modest_maemo_utils_create_captioned (title_sizegroup, value_sizegroup,
+                                                                _("mcen_fi_serviceprovider"), FALSE,
+                                                                priv->account_serviceprovider_selector);
+               
+               gtk_box_pack_start (GTK_BOX (box), captioned, FALSE, FALSE, MODEST_MARGIN_HALF);
+               gtk_widget_show (captioned);
+       } else {
+               modest_maemo_utils_set_hbutton_layout (title_sizegroup, value_sizegroup,
+                                                      _("mcen_fi_serviceprovider"),
+                                                      priv->account_serviceprovider_selector);
+               g_signal_connect (G_OBJECT (priv->account_serviceprovider_selector), "value-changed",
+                                 G_CALLBACK (on_serviceprovider_selector_value_changed), self);
+               gtk_box_pack_start (GTK_BOX (box), priv->account_serviceprovider_selector, FALSE, FALSE, 0);
+       }
+       gtk_widget_show (priv->account_serviceprovider_selector);
 
        /* The description widgets: */
        priv->entry_account_title = GTK_WIDGET (modest_validating_entry_new ());
@@ -647,8 +664,8 @@ on_user_username_changed(GtkWidget* widget, ModestEasysetupWizardDialog *self)
        priv = MODEST_EASYSETUP_WIZARD_DIALOG_GET_PRIVATE (self);
 
        /* Work out the user email address */
-       provider_id = modest_provider_picker_get_active_provider_id (
-               MODEST_PROVIDER_PICKER (priv->account_serviceprovider_picker));
+       provider_id = modest_provider_selector_get_active_provider_id (
+               priv->account_serviceprovider_selector);
 
        if (provider_id) {
                const gchar *current_username;
@@ -1315,16 +1332,21 @@ fill_providers (ModestEasysetupWizardDialog *self)
 
                modest_country_selector_set_active_country_locale (priv->account_country_selector);
                mcc = modest_country_selector_get_active_country_mcc (priv->account_country_selector);
-               modest_provider_picker_fill (
-                       MODEST_PROVIDER_PICKER (priv->account_serviceprovider_picker),
+               modest_provider_selector_fill (
+                       priv->account_serviceprovider_selector,
                        priv->presets, mcc);
                /* connect to providers picker's changed signal, so we can fill the email address: */
-               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);
-
-               modest_provider_picker_set_others_provider (MODEST_PROVIDER_PICKER (priv->account_serviceprovider_picker));
+               if (GTK_IS_COMBO_BOX (priv->account_serviceprovider_selector)) {
+                       g_signal_connect (priv->account_serviceprovider_selector,
+                                         "changed",
+                                         G_CALLBACK (on_account_serviceprovider_selector_combo_box_changed), self);
+               } else {
+                       g_signal_connect (G_OBJECT (hildon_picker_button_get_selector
+                                                   (HILDON_PICKER_BUTTON (priv->account_serviceprovider_selector))),
+                                         "changed",
+                                         G_CALLBACK (on_account_serviceprovider_selector_changed), self);
+               }
+               modest_provider_selector_set_others_provider (priv->account_serviceprovider_selector);
        }
 
        priv->dirty = FALSE;
@@ -1666,23 +1688,23 @@ static void
 create_subsequent_pages (ModestEasysetupWizardDialog *self)
 {
        ModestEasysetupWizardDialogPrivate *priv;
-       ModestProviderPicker *picker;
-        ModestProviderPickerIdType id_type;
+       GtkWidget *picker;
+        ModestProviderSelectorIdType id_type;
        GtkNotebook *notebook;
 
        priv = MODEST_EASYSETUP_WIZARD_DIALOG_GET_PRIVATE (self);
-       picker = MODEST_PROVIDER_PICKER (priv->account_serviceprovider_picker);
-       id_type = modest_provider_picker_get_active_id_type (picker);
+       picker = priv->account_serviceprovider_selector;
+       id_type = modest_provider_selector_get_active_id_type (picker);
        g_object_get (self, "wizard-notebook", &notebook, NULL);
 
        /* Remove the response override handler for non-plugin
           protocols. For plugins it'll be overriden later */
-       if (id_type != MODEST_PROVIDER_PICKER_ID_PLUGIN_PROTOCOL)
+       if (id_type != MODEST_PROVIDER_SELECTOR_ID_PLUGIN_PROTOCOL)
                modest_wizard_dialog_set_response_override_handler (MODEST_WIZARD_DIALOG (self),
                                                                    NULL);
 
 
-       if (id_type == MODEST_PROVIDER_PICKER_ID_OTHER) {
+       if (id_type == MODEST_PROVIDER_SELECTOR_ID_OTHER) {
                /* "Other..." was selected: */
 
                /* If we come from a rollbacked easysetup */
@@ -1712,14 +1734,14 @@ create_subsequent_pages (ModestEasysetupWizardDialog *self)
                }
 
                /* It's a pluggable protocol and not a provider with presets */
-               if (id_type == MODEST_PROVIDER_PICKER_ID_PLUGIN_PROTOCOL) {
+               if (id_type == MODEST_PROVIDER_SELECTOR_ID_PLUGIN_PROTOCOL) {
                        ModestProtocol *protocol;
                        gchar *proto_name;
                        ModestProtocolType proto_type;
                        ModestWizardDialogResponseOverrideFunc response_override;
 
                        /* Get protocol data */
-                       proto_name = modest_provider_picker_get_active_provider_id (picker);
+                       proto_name = modest_provider_selector_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);
@@ -2205,20 +2227,20 @@ save_to_settings (ModestEasysetupWizardDialog *self)
        ModestProtocolType store_auth_protocol, transport_auth_protocol;
        ModestServerAccountSettings *store_settings, *transport_settings;
        const gchar *fullname, *email_address;
-       ModestProviderPicker *picker;
-       ModestProviderPickerIdType id_type;
+       GtkWidget *picker;
+       ModestProviderSelectorIdType id_type;
 
        priv = MODEST_EASYSETUP_WIZARD_DIALOG_GET_PRIVATE (self);
-       picker = MODEST_PROVIDER_PICKER (priv->account_serviceprovider_picker);
+       picker = priv->account_serviceprovider_selector;
        protocol_registry = modest_runtime_get_protocol_registry ();
 
        /* Get details from the specified presets: */
-       id_type = modest_provider_picker_get_active_id_type (picker);
-       provider_id = modest_provider_picker_get_active_provider_id (picker);
+       id_type = modest_provider_selector_get_active_id_type (picker);
+       provider_id = modest_provider_selector_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 == MODEST_PROVIDER_PICKER_ID_PLUGIN_PROTOCOL) {
+       if (id_type == MODEST_PROVIDER_SELECTOR_ID_PLUGIN_PROTOCOL) {
                ModestProtocol *protocol;
 
                protocol = modest_protocol_registry_get_protocol_by_name (
index c76b3f4..e0004c1 100644 (file)
@@ -95,6 +95,8 @@ libmodest_widgets_la_SOURCES=          \
        modest-details-dialog.h        \
        modest-progress-bar.c   \
        modest-progress-bar.h   \
+       modest-provider-combo-box.c    \
+       modest-provider-combo-box.h    \
        modest-recpt-editor.c          \
        modest-recpt-editor.h          \
        modest-recpt-view.c            \
diff --git a/src/widgets/modest-provider-combo-box.c b/src/widgets/modest-provider-combo-box.c
new file mode 100644 (file)
index 0000000..8bf3b15
--- /dev/null
@@ -0,0 +1,365 @@
+/* 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-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 <modest-account-protocol.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 (ModestProviderComboBox, modest_provider_combo_box, GTK_TYPE_COMBO_BOX);
+
+#define MODEST_PROVIDER_COMBO_BOX_GET_PRIVATE(o) \
+       (G_TYPE_INSTANCE_GET_PRIVATE ((o), MODEST_TYPE_PROVIDER_COMBO_BOX, ModestProviderComboBoxPrivate))
+
+typedef struct _ModestProviderComboBoxPrivate ModestProviderComboBoxPrivate;
+
+struct _ModestProviderComboBoxPrivate
+{
+       GtkTreeModel *model;
+};
+
+static void
+modest_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
+modest_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
+modest_provider_combo_box_dispose (GObject *object)
+{
+       if (G_OBJECT_CLASS (modest_provider_combo_box_parent_class)->dispose)
+               G_OBJECT_CLASS (modest_provider_combo_box_parent_class)->dispose (object);
+}
+
+static void
+modest_provider_combo_box_finalize (GObject *object)
+{
+       ModestProviderComboBoxPrivate *priv = MODEST_PROVIDER_COMBO_BOX_GET_PRIVATE (object);
+
+       g_object_unref (G_OBJECT (priv->model));
+
+       G_OBJECT_CLASS (modest_provider_combo_box_parent_class)->finalize (object);
+}
+
+static void
+modest_provider_combo_box_class_init (ModestProviderComboBoxClass *klass)
+{
+       GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+       g_type_class_add_private (klass, sizeof (ModestProviderComboBoxPrivate));
+
+       object_class->get_property = modest_provider_combo_box_get_property;
+       object_class->set_property = modest_provider_combo_box_set_property;
+       object_class->dispose = modest_provider_combo_box_dispose;
+       object_class->finalize = modest_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
+modest_provider_combo_box_init (ModestProviderComboBox *self)
+{
+       ModestProviderComboBoxPrivate *priv = MODEST_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);
+}
+
+ModestProviderComboBox*
+modest_provider_combo_box_new (void)
+{
+       ModestProviderComboBox *self;
+
+       self =  g_object_new (MODEST_TYPE_PROVIDER_COMBO_BOX, NULL);
+       modest_provider_combo_box_set_others_provider (MODEST_PROVIDER_COMBO_BOX (self));
+
+       return self;
+}
+
+void
+modest_provider_combo_box_fill (ModestProviderComboBox *combobox, 
+                               ModestPresets *presets,
+                               gint mcc)
+{      
+       GtkTreeIter other_iter;
+       ModestProviderComboBoxPrivate *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 (MODEST_IS_PROVIDER_COMBO_BOX(combobox));
+
+       priv = MODEST_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, MODEST_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);
+
+               /* 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)) {
+                       gboolean supported;
+
+                       supported = modest_account_protocol_is_supported (MODEST_ACCOUNT_PROTOCOL (proto));
+
+                       if (supported) {
+                               const gchar *name = modest_protocol_get_display_name (proto);
+
+                               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_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, MODEST_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*
+modest_provider_combo_box_get_active_provider_id (ModestProviderComboBox *combobox)
+{
+       GtkTreeIter active;
+
+       g_return_val_if_fail (MODEST_IS_PROVIDER_COMBO_BOX(combobox), NULL);
+
+       const gboolean found = gtk_combo_box_get_active_iter (GTK_COMBO_BOX (combobox), &active);
+       if (found) {
+               ModestProviderComboBoxPrivate *priv = MODEST_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. */
+}
+
+gchar*
+modest_provider_combo_box_get_active_provider_label (ModestProviderComboBox *combobox)
+{
+       GtkTreeIter active;
+
+       g_return_val_if_fail (MODEST_IS_PROVIDER_COMBO_BOX(combobox), NULL);
+
+       const gboolean found = gtk_combo_box_get_active_iter (GTK_COMBO_BOX (combobox), &active);
+       if (found) {
+               ModestProviderComboBoxPrivate *priv = MODEST_PROVIDER_COMBO_BOX_GET_PRIVATE (combobox);
+
+               gchar *label = NULL;
+               gtk_tree_model_get (priv->model, &active, MODEL_COL_NAME, &label, -1);
+               return g_strdup(label); 
+       }
+
+       return NULL; /* Failed. */
+}
+
+void 
+modest_provider_combo_box_set_others_provider (ModestProviderComboBox *combobox)
+{
+       GtkTreeModel *model;
+       GtkTreeIter others_iter;
+
+       g_return_if_fail (MODEST_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);
+}
+
+ModestProviderComboBoxIdType 
+modest_provider_combo_box_get_active_id_type (ModestProviderComboBox *combobox)
+{
+       GtkTreeIter active;
+
+       g_return_val_if_fail (MODEST_IS_PROVIDER_COMBO_BOX (combobox), 
+                             MODEST_PROVIDER_COMBO_BOX_ID_OTHER);
+
+       if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (combobox), &active)) {
+               ModestProviderComboBoxPrivate *priv = MODEST_PROVIDER_COMBO_BOX_GET_PRIVATE (combobox);
+               ModestProviderComboBoxIdType 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_COMBO_BOX_ID_OTHER;
+       }
+}
+
diff --git a/src/widgets/modest-provider-combo-box.h b/src/widgets/modest-provider-combo-box.h
new file mode 100644 (file)
index 0000000..aca9a00
--- /dev/null
@@ -0,0 +1,101 @@
+/* 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 _MODEST_PROVIDER_COMBO_BOX
+#define _MODEST_PROVIDER_COMBO_BOX
+
+#include <gtk/gtkcombobox.h>
+#include <modest-presets.h>
+
+G_BEGIN_DECLS
+
+#define MODEST_TYPE_PROVIDER_COMBO_BOX modest_provider_combo_box_get_type()
+
+#define MODEST_PROVIDER_COMBO_BOX(obj) \
+       (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+       MODEST_TYPE_PROVIDER_COMBO_BOX, ModestProviderComboBox))
+
+#define MODEST_PROVIDER_COMBO_BOX_CLASS(klass) \
+       (G_TYPE_CHECK_CLASS_CAST ((klass), \
+       MODEST_TYPE_PROVIDER_COMBO_BOX, ModestProviderComboBoxClass))
+
+#define MODEST_IS_PROVIDER_COMBO_BOX(obj) \
+       (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+       MODEST_TYPE_PROVIDER_COMBO_BOX))
+
+#define MODEST_IS_PROVIDER_COMBO_BOX_CLASS(klass) \
+       (G_TYPE_CHECK_CLASS_TYPE ((klass), \
+       MODEST_TYPE_PROVIDER_COMBO_BOX))
+
+#define MODEST_PROVIDER_COMBO_BOX_GET_CLASS(obj) \
+       (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+       MODEST_TYPE_PROVIDER_COMBO_BOX, ModestProviderComboBoxClass))
+
+/** The type 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 singleton provider protocol then the ID will be protocol name
+ **/
+typedef enum {
+       MODEST_PROVIDER_COMBO_BOX_ID_PROVIDER,
+       MODEST_PROVIDER_COMBO_BOX_ID_OTHER,
+       MODEST_PROVIDER_COMBO_BOX_ID_PLUGIN_PROTOCOL
+} ModestProviderComboBoxIdType;
+
+typedef struct {
+       GtkComboBox parent;
+} ModestProviderComboBox;
+
+typedef struct {
+       GtkComboBoxClass parent_class;
+} ModestProviderComboBoxClass;
+
+GType modest_provider_combo_box_get_type (void);
+
+ModestProviderComboBox* modest_provider_combo_box_new (void);
+
+void modest_provider_combo_box_fill (ModestProviderComboBox *combobox, ModestPresets *presets,
+                                    gint mcc);
+
+gchar* modest_provider_combo_box_get_active_provider_id (ModestProviderComboBox *combobox);
+
+gchar* modest_provider_combo_box_get_active_provider_label (ModestProviderComboBox *combobox);
+
+ModestProviderComboBoxIdType modest_provider_combo_box_get_active_id_type (ModestProviderComboBox *combobox);
+
+void  modest_provider_combo_box_set_others_provider (ModestProviderComboBox *self);
+
+
+G_END_DECLS
+
+#endif /* _MODEST_PROVIDER_COMBO_BOX */
index 55a5965..f4eef10 100644 (file)
@@ -44,6 +44,7 @@
 #define USE_GTK_ENTRY
 #define USE_GTK_FILE_CHOOSER
 #define USE_COUNTRY_COMBOBOX
+#define USE_PROVIDER_COMBOBOX
 #endif
 
 #ifdef USE_SCROLLED_WINDOW
 #include <modest-country-picker.h>
 #endif
 
+#ifdef USE_PROVIDER_COMBOBOX
+#include <modest-provider-combo-box.h>
+#else
+#include <modest-provider-picker.h>
+#endif
+
 static void modest_toolkit_factory_class_init (ModestToolkitFactoryClass *klass);
 static void modest_toolkit_factory_init (ModestToolkitFactory *self);
 
@@ -84,6 +91,7 @@ static GtkWidget * modest_toolkit_factory_create_file_chooser_dialog_default  (M
                                                                               GtkWindow *parent,
                                                                               GtkFileChooserAction action);
 static GtkWidget * modest_toolkit_factory_create_country_selector_default     (ModestToolkitFactory *self);
+static GtkWidget * modest_toolkit_factory_create_provider_selector_default     (ModestToolkitFactory *self);
 /* globals */
 static GObjectClass *parent_class = NULL;
 
@@ -112,6 +120,7 @@ modest_toolkit_factory_class_init (ModestToolkitFactoryClass *klass)
        klass->create_number_entry = modest_toolkit_factory_create_number_entry_default;
        klass->create_file_chooser_dialog = modest_toolkit_factory_create_file_chooser_dialog_default;
        klass->create_country_selector = modest_toolkit_factory_create_country_selector_default;
+       klass->create_provider_selector = modest_toolkit_factory_create_provider_selector_default;
 }
 
 static void
@@ -426,3 +435,115 @@ modest_country_selector_set_active_country_locale (GtkWidget *widget)
        return modest_country_picker_set_active_country_locale (MODEST_COUNTRY_PICKER (widget));
 #endif
 }
+
+GtkWidget *
+modest_toolkit_factory_create_provider_selector (ModestToolkitFactory *self)
+{
+       return MODEST_TOOLKIT_FACTORY_GET_CLASS (self)->create_provider_selector (self);
+}
+
+static GtkWidget *
+modest_toolkit_factory_create_provider_selector_default (ModestToolkitFactory *self)
+{
+       GtkWidget *result;
+#ifdef USE_PROVIDER_COMBOBOX
+       result = modest_provider_combo_box_new ();
+#else
+       result = GTK_WIDGET (modest_provider_picker_new (MODEST_EDITABLE_SIZE, 
+                                                        HILDON_BUTTON_ARRANGEMENT_HORIZONTAL));
+#endif
+       return result;
+}
+
+void
+modest_provider_selector_fill (GtkWidget *widget,
+                              ModestPresets *presets,
+                              gint mcc)
+{
+#ifdef USE_PROVIDER_COMBOBOX
+       modest_provider_combo_box_fill (MODEST_PROVIDER_COMBO_BOX (widget),
+                                       presets,
+                                       mcc);
+#else
+       modest_provider_picker_fill (MODEST_PROVIDER_PICKER (widget),
+                                    presets,
+                                    mcc);
+#endif
+}
+
+gchar *
+modest_provider_selector_get_active_provider_id (GtkWidget *widget)
+{
+#ifdef USE_PROVIDER_COMBOBOX
+       return modest_provider_combo_box_get_active_provider_id (MODEST_PROVIDER_COMBO_BOX (widget));
+#else
+       return modest_provider_picker_get_active_provider_id (MODEST_PROVIDER_PICKER (widget));
+#endif
+}
+
+gchar *
+modest_provider_selector_get_active_provider_label (GtkWidget *widget)
+{
+#ifdef USE_PROVIDER_COMBOBOX
+       
+       return modest_provider_combo_box_get_active_provider_label (MODEST_PROVIDER_COMBO_BOX (widget));
+#else
+       GtkWidget *selector;
+       
+       selector = GTK_WIDGET (hildon_picker_button_get_selector (HILDON_PICKER_BUTTON (widget)));
+       return g_strdup (hildon_touch_selector_get_current_text (HILDON_TOUCH_SELECTOR (selector)));
+#endif
+}
+
+ModestProviderSelectorIdType
+modest_provider_selector_get_active_id_type (GtkWidget *widget)
+{
+       ModestProviderSelectorIdType result;
+#ifdef USE_PROVIDER_COMBOBOX
+       ModestProviderComboBoxIdType id_type;
+
+       id_type = modest_provider_combo_box_get_active_id_type (MODEST_PROVIDER_COMBO_BOX (widget));
+       switch (id_type) {
+       case MODEST_PROVIDER_COMBO_BOX_ID_PROVIDER:
+               result = MODEST_PROVIDER_SELECTOR_ID_PROVIDER;
+               break;
+       case MODEST_PROVIDER_COMBO_BOX_ID_OTHER:
+               result = MODEST_PROVIDER_SELECTOR_ID_OTHER;
+               break;
+       case MODEST_PROVIDER_COMBO_BOX_ID_PLUGIN_PROTOCOL:
+               result = MODEST_PROVIDER_SELECTOR_ID_PLUGIN_PROTOCOL;
+               break;
+       default:
+               result = MODEST_PROVIDER_SELECTOR_ID_OTHER;
+       }
+       return result;
+#else
+       ModestProviderPickerIdType id_type;
+
+       id_type = modest_provider_picker_get_active_id_type (MODEST_PROVIDER_PICKER (widget));
+       switch (id_type) {
+       case MODEST_PROVIDER_PICKER_ID_PROVIDER:
+               result = MODEST_PROVIDER_SELECTOR_ID_PROVIDER;
+               break;
+       case MODEST_PROVIDER_PICKER_ID_OTHER:
+               result = MODEST_PROVIDER_SELECTOR_ID_OTHER;
+               break;
+       case MODEST_PROVIDER_PICKER_ID_PLUGIN_PROTOCOL:
+               result = MODEST_PROVIDER_SELECTOR_ID_PLUGIN_PROTOCOL;
+               break;
+       default:
+               result = MODEST_PROVIDER_SELECTOR_ID_OTHER;
+       }
+#endif
+       return result;
+}
+
+void
+modest_provider_selector_set_others_provider (GtkWidget *self)
+{
+#ifdef USE_PROVIDER_COMBOBOX
+       modest_provider_combo_box_set_others_provider (MODEST_PROVIDER_COMBO_BOX (self));
+#else
+       modest_provider_picker_set_others_provider (MODEST_PROVIDER_PICKER (self));
+#endif
+}
index 9269ce8..a3e04f4 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <glib-object.h>
 #include <gtk/gtk.h>
+#include <modest-presets.h>
 
 G_BEGIN_DECLS
 
@@ -44,6 +45,7 @@ struct                                          _ModestToolkitFactoryClass
        GtkWidget * (*create_file_chooser_dialog) (ModestToolkitFactory *self, const gchar *title,
                                                   GtkWindow *parent, GtkFileChooserAction action);
        GtkWidget * (*create_country_selector) (ModestToolkitFactory *self);
+       GtkWidget * (*create_provider_selector) (ModestToolkitFactory *self);
 };
 
 struct                                          _ModestToolkitFactory
@@ -83,6 +85,9 @@ modest_toolkit_factory_create_file_chooser_dialog (ModestToolkitFactory *self, c
 GtkWidget *
 modest_toolkit_factory_create_country_selector (ModestToolkitFactory *self);
 
+GtkWidget *
+modest_toolkit_factory_create_provider_selector (ModestToolkitFactory *self);
+
 gboolean
 modest_togglable_get_active (GtkWidget *widget);
 
@@ -125,6 +130,28 @@ modest_country_selector_load_data (GtkWidget *widget);
 gboolean
 modest_country_selector_set_active_country_locale (GtkWidget *widget);
 
+typedef enum {
+       MODEST_PROVIDER_SELECTOR_ID_PROVIDER,
+       MODEST_PROVIDER_SELECTOR_ID_OTHER,
+       MODEST_PROVIDER_SELECTOR_ID_PLUGIN_PROTOCOL
+} ModestProviderSelectorIdType;
+
+
+void
+modest_provider_selector_fill (GtkWidget *widget, ModestPresets *presets, gint mcc);
+
+gchar *
+modest_provider_selector_get_active_provider_id (GtkWidget *widget);
+
+gchar *
+modest_provider_selector_get_active_provider_label (GtkWidget *widget);
+
+ModestProviderSelectorIdType
+modest_provider_selector_get_active_id_type (GtkWidget *widget);
+
+void
+modest_provider_selector_set_others_provider (GtkWidget *self);
+
 
 #ifndef MODEST_TOOLKIT_HILDON2
 #define USE_GTK_SPIN_BUTTON