X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fhildon2%2Fmodest-provider-picker.c;h=539089fb0ad6773cc73cda7d19c9803df0abd1c1;hp=e949d81ac29d5419a124778b451bda68a02b2e15;hb=37248da61b420a2bc36167cbc2d201bcdfc5a5e8;hpb=8882009413d13c0c3e807c9dc256a3e44750e32d diff --git a/src/hildon2/modest-provider-picker.c b/src/hildon2/modest-provider-picker.c index e949d81..539089f 100644 --- a/src/hildon2/modest-provider-picker.c +++ b/src/hildon2/modest-provider-picker.c @@ -28,6 +28,7 @@ */ #include "modest-provider-picker.h" +#include #include #include #include @@ -55,12 +56,15 @@ typedef struct _ModestProviderPickerPrivate ModestProviderPickerPrivate; struct _ModestProviderPickerPrivate { GtkTreeModel *model; + GHashTable *enabled_plugin_ids; }; static void modest_provider_picker_finalize (GObject *object) { ModestProviderPickerPrivate *priv = MODEST_PROVIDER_PICKER_GET_PRIVATE (object); + g_hash_table_destroy (priv->enabled_plugin_ids); + g_object_unref (G_OBJECT (priv->model)); G_OBJECT_CLASS (modest_provider_picker_parent_class)->finalize (object); @@ -82,6 +86,21 @@ enum MODEL_COLS { MODEL_COL_ID_TYPE }; +static gint +id_type_index (ModestProviderPickerIdType id_type) +{ + switch (id_type) { + case MODEST_PROVIDER_PICKER_ID_OTHER: + return 2; + break; + case MODEST_PROVIDER_PICKER_ID_PLUGIN_PROTOCOL: + return 1; + break; + case MODEST_PROVIDER_PICKER_ID_PROVIDER: + default: + return 0; + } +} /* * strictly, we should sort providers with mcc=0 after the other ones.... but, we don't have @@ -91,10 +110,21 @@ static gint provider_sort_func (GtkTreeModel *model, GtkTreeIter *iter1, GtkTreeIter *iter2, gpointer user_data) { gchar *prov1, *prov2; + ModestProviderPickerIdType id_type1, id_type2; gint retval; - gtk_tree_model_get (model, iter1, MODEL_COL_NAME, &prov1, -1); - gtk_tree_model_get (model, iter2, MODEL_COL_NAME, &prov2, -1); + gtk_tree_model_get (model, iter1, + MODEL_COL_NAME, &prov1, + MODEL_COL_ID_TYPE, &id_type1, + -1); + gtk_tree_model_get (model, iter2, + MODEL_COL_NAME, &prov2, + MODEL_COL_ID_TYPE, &id_type2, + -1); + + retval = id_type_index (id_type2) - id_type_index (id_type1); + if (retval != 0) + goto end; if (strcmp (prov1, prov2) == 0) retval = 0; @@ -104,7 +134,7 @@ provider_sort_func (GtkTreeModel *model, GtkTreeIter *iter1, GtkTreeIter *iter2, retval = 1; else retval = modest_text_utils_utf8_strcmp (prov1, prov2, TRUE); - +end: g_free (prov1); g_free (prov2); @@ -112,7 +142,7 @@ provider_sort_func (GtkTreeModel *model, GtkTreeIter *iter1, GtkTreeIter *iter2, } static gchar * -touch_selector_print_func (HildonTouchSelector *selector) +touch_selector_print_func (HildonTouchSelector *selector, gpointer userdata) { GtkTreeIter iter; if (hildon_touch_selector_get_selected (HILDON_TOUCH_SELECTOR (selector), 0, &iter)) { @@ -134,6 +164,8 @@ modest_provider_picker_init (ModestProviderPicker *self) priv = MODEST_PROVIDER_PICKER_GET_PRIVATE (self); priv->model = NULL; + priv->enabled_plugin_ids = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, NULL); } ModestProviderPicker* @@ -144,6 +176,7 @@ modest_provider_picker_new (HildonSizeType size, ModestProviderPicker *self; GtkCellRenderer *renderer; GtkWidget *selector; + HildonTouchSelectorColumn *column; self = g_object_new (MODEST_TYPE_PROVIDER_PICKER, "arrangement", arrangement, @@ -167,15 +200,20 @@ modest_provider_picker_new (HildonSizeType size, 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_print_func (HILDON_TOUCH_SELECTOR (selector), + (HildonTouchSelectorPrintFunc) touch_selector_print_func); 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); + column = hildon_touch_selector_append_column (HILDON_TOUCH_SELECTOR (selector), GTK_TREE_MODEL (priv->model), + renderer, "text", MODEL_COL_NAME, NULL); + hildon_touch_selector_column_set_text_column (column, MODEL_COL_NAME); + hildon_picker_button_set_selector (HILDON_PICKER_BUTTON (self), HILDON_TOUCH_SELECTOR (selector)); modest_provider_picker_set_others_provider (MODEST_PROVIDER_PICKER (self)); + /* For theming purpouses. Widget name must end in Button-finger */ + gtk_widget_set_name ((GtkWidget *) self, "ModestProviderPickerButton-finger"); + return self; } @@ -205,6 +243,8 @@ modest_provider_picker_fill (ModestProviderPicker *self, iter_provider_names = provider_names; iter_provider_ids = provider_ids; + g_hash_table_remove_all (priv->enabled_plugin_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; @@ -274,6 +314,7 @@ modest_provider_picker_fill (ModestProviderPicker *self, MODEL_COL_NAME, name, MODEL_COL_ID_TYPE, MODEST_PROVIDER_PICKER_ID_PLUGIN_PROTOCOL, -1); + g_hash_table_insert (priv->enabled_plugin_ids, g_strdup (modest_protocol_get_name (proto)), NULL); } g_slist_free (provider_protos); @@ -297,6 +338,87 @@ modest_provider_picker_fill (ModestProviderPicker *self, } +void +modest_provider_picker_refresh (ModestProviderPicker *self) +{ + ModestProviderPickerPrivate *priv; + GtkListStore *liststore; + GSList *provider_protos, *tmp; + ModestProtocolRegistry *registry; + + g_return_if_fail (MODEST_IS_PROVIDER_PICKER(self)); + + priv = MODEST_PROVIDER_PICKER_GET_PRIVATE (self); + liststore = GTK_LIST_STORE (priv->model); + /* Add the provider protocols */ + registry = modest_runtime_get_protocol_registry (); + provider_protos = modest_protocol_registry_get_by_tag (registry, + MODEST_PROTOCOL_REGISTRY_PROVIDER_PROTOCOLS); + for (tmp = provider_protos; tmp != NULL; tmp = g_slist_next (tmp)) { + + GtkTreeIter iter; + ModestProtocol *proto = MODEST_PROTOCOL (tmp->data); + const gchar *name = modest_protocol_get_display_name (proto); + gboolean provider_exists; + + /* 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)) + continue; + + if (modest_protocol_registry_protocol_type_has_tag + (registry, + modest_protocol_get_type_id (proto), + MODEST_PROTOCOL_REGISTRY_SINGLETON_PROVIDER_PROTOCOLS)) { + /* Check if there's already an account configured with this account type */ + if (modest_account_mgr_singleton_protocol_exists (modest_runtime_get_account_mgr (), + modest_protocol_get_type_id (proto))) + continue; + } + + provider_exists = g_hash_table_lookup_extended (priv->enabled_plugin_ids, modest_protocol_get_name (proto), + NULL, NULL); + + if (MODEST_ACCOUNT_PROTOCOL (proto) && + !modest_account_protocol_is_supported (MODEST_ACCOUNT_PROTOCOL (proto))) { + + if (provider_exists) { + GtkTreeIter iter; + + if (!gtk_tree_model_get_iter_first (priv->model, &iter)) + continue; + + do { + gchar *id = NULL; + gtk_tree_model_get (priv->model, &iter, + MODEL_COL_ID, &id, + -1); + + if (g_strcmp0 (id, modest_protocol_get_name (proto)) == 0) { + gtk_list_store_remove (GTK_LIST_STORE (priv->model), &iter); + break; + } + + } while (gtk_tree_model_iter_next (priv->model, &iter)); + } + + continue; + } + + if (!provider_exists) { + 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); + } + } + g_slist_free (provider_protos); + +} + /** * Returns the MCC number of the selected provider, * or NULL if no provider was selected, or "Other" was selected.