X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fhildon2%2Fmodest-provider-picker.c;h=4da709b18c94a782250d01f34ad0edc6babd49b1;hb=57cedf59b21a6e53f87a7ad79b9d5c25b62f5db1;hp=f5763e4ee842b7f8352f3f42026e88fd4f46b850;hpb=0a7c11e4ab92b8ad12116a699620739f55b2b619;p=modest diff --git a/src/hildon2/modest-provider-picker.c b/src/hildon2/modest-provider-picker.c index f5763e4..4da709b 100644 --- a/src/hildon2/modest-provider-picker.c +++ b/src/hildon2/modest-provider-picker.c @@ -35,6 +35,7 @@ #include #include "modest-protocol-registry.h" #include "modest-runtime.h" +#include #include #include /* For memcpy() */ @@ -81,6 +82,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 @@ -90,10 +106,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; @@ -103,7 +130,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); @@ -111,7 +138,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)) { @@ -136,7 +163,8 @@ modest_provider_picker_init (ModestProviderPicker *self) } ModestProviderPicker* -modest_provider_picker_new (void) +modest_provider_picker_new (HildonSizeType size, + HildonButtonArrangement arrangement) { ModestProviderPickerPrivate *priv; ModestProviderPicker *self; @@ -144,8 +172,8 @@ modest_provider_picker_new (void) GtkWidget *selector; self = g_object_new (MODEST_TYPE_PROVIDER_PICKER, - "arrangement", HILDON_BUTTON_ARRANGEMENT_VERTICAL, - "size", HILDON_SIZE_AUTO, + "arrangement", arrangement, + "size", size, NULL); priv = MODEST_PROVIDER_PICKER_GET_PRIVATE (self); @@ -169,7 +197,7 @@ modest_provider_picker_new (void) 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_touch_selector_set_print_func (HILDON_TOUCH_SELECTOR (selector), (HildonTouchSelectorPrintFunc) 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)); @@ -239,24 +267,39 @@ modest_provider_picker_fill (ModestProviderPicker *self, 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) { + 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); /* 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); + 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; } - tmp = g_slist_next (tmp); + + if (MODEST_ACCOUNT_PROTOCOL (proto) && + !modest_account_protocol_is_supported (MODEST_ACCOUNT_PROTOCOL (proto))) { + continue; + } + + 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); @@ -336,7 +379,7 @@ modest_provider_picker_get_active_id_type (ModestProviderPicker *self) selector = GTK_WIDGET (hildon_picker_button_get_selector (HILDON_PICKER_BUTTON(self))); - if (hildon_touch_selector_get_selected (HILDON_TOUCH_SELECTOR (self), 0, &active)) { + if (hildon_touch_selector_get_selected (HILDON_TOUCH_SELECTOR (selector), 0, &active)) { ModestProviderPickerPrivate *priv = MODEST_PROVIDER_PICKER_GET_PRIVATE (self); ModestProviderPickerIdType id_type;