X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmaemo%2Feasysetup%2Fmodest-easysetup-provider-combo-box.c;h=0ca0cf323b8c7398b6dd470a572f7d97ac1c3f3d;hp=3caded6003bd5dfb990f4312a02ea7ef00ccb8a0;hb=8b526c9f3277121da415cb9c72fec24f02441b64;hpb=3fdfee96b812d8e1794d388a3975334133ccf61b diff --git a/src/maemo/easysetup/modest-easysetup-provider-combo-box.c b/src/maemo/easysetup/modest-easysetup-provider-combo-box.c index 3caded6..0ca0cf3 100644 --- a/src/maemo/easysetup/modest-easysetup-provider-combo-box.c +++ b/src/maemo/easysetup/modest-easysetup-provider-combo-box.c @@ -1,6 +1,30 @@ -/* Copyright (c) 2007, Nokia Corporation +/* 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" @@ -8,6 +32,7 @@ #include #include #include +#include #include #include /* For memcpy() */ @@ -81,10 +106,37 @@ easysetup_provider_combo_box_class_init (EasysetupProviderComboBoxClass *klass) enum MODEL_COLS { MODEL_COL_NAME = 0, - MODEL_COL_ID = 1 /* a string, not an int. */ + MODEL_COL_ID = 1 /* a string, not an int. */ }; +/* + * strictly, we should sort providers with mcc=0 after the other ones.... but, we don't have + * that info here, so ignoring for now. + */ +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) @@ -92,7 +144,7 @@ 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"). + * 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 (2, G_TYPE_STRING, G_TYPE_STRING)); @@ -105,11 +157,14 @@ easysetup_provider_combo_box_init (EasysetupProviderComboBox *self) * 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_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer, "text", MODEL_COL_NAME, NULL); - /* The application should call easysetup_provider_combo_box_fill() - * to actually add some rows. */ + 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* @@ -118,7 +173,9 @@ 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 country_id) +void +easysetup_provider_combo_box_fill (EasysetupProviderComboBox *combobox, ModestPresets *presets, + gint mcc) { EasysetupProviderComboBoxPrivate *priv = PROVIDER_COMBO_BOX_GET_PRIVATE (combobox); @@ -126,48 +183,58 @@ void easysetup_provider_combo_box_fill (EasysetupProviderComboBox *combobox, Mod GtkListStore *liststore = GTK_LIST_STORE (priv->model); gtk_list_store_clear (liststore); + GSList *provider_ids_used_already = NULL; + /* Add the appropriate rows for this country, from the presets file: */ gchar ** provider_ids = NULL; - gchar ** provider_names = modest_presets_get_providers (presets, country_id, - TRUE /* include_globals */, &provider_ids); - + gchar ** provider_names = modest_presets_get_providers (presets, mcc, + TRUE /* include_globals */, &provider_ids); gchar ** iter_provider_names = provider_names; gchar ** iter_provider_ids = provider_ids; - while(iter_provider_names && *iter_provider_names && iter_provider_ids && *iter_provider_ids) - { + while(iter_provider_names && *iter_provider_names && iter_provider_ids && *iter_provider_ids) { const gchar* provider_name = *iter_provider_names; - if(!provider_name) - continue; - const gchar* provider_id = *iter_provider_ids; - if(!provider_id) - continue; - /* 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, -1); - - ++iter_provider_names; - ++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, -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 "Other" item: */ /* Note that ID 0 means "Other" for us: */ /* TODO: We need a Logical ID for this text. */ GtkTreeIter iter; - gtk_list_store_append (liststore, &iter); - gtk_list_store_set (liststore, &iter, MODEL_COL_ID, 0, MODEL_COL_NAME, _("Other..."), -1); + gtk_list_store_prepend (liststore, &iter); + gtk_list_store_set (liststore, &iter, MODEL_COL_ID, 0, MODEL_COL_NAME, _("mcen_va_serviceprovider_other"), + -1); /* Select the "Other" item: */ gtk_combo_box_set_active_iter (GTK_COMBO_BOX (combobox), &iter); + + g_slist_foreach (provider_ids_used_already, (GFunc)g_free, NULL); + g_slist_free (provider_ids_used_already); } /**