* Fixes NB#104978, crash in account wizard when language/region do not match
[modest] / src / hildon2 / modest-country-picker.c
index 9cbce91..8309f92 100644 (file)
@@ -35,6 +35,7 @@
 
 #include "modest-maemo-utils.h"
 #include "modest-country-picker.h"
+#include <hildon/hildon-touch-selector-entry.h>
 #include <gtk/gtkliststore.h>
 #include <gtk/gtkcelllayout.h>
 #include <gtk/gtkcellrenderertext.h>
@@ -168,9 +169,13 @@ parse_mcc_mapping_line (const char* line,  char** country)
        tab = g_utf8_strrchr (line, -1, '\t');
        *country = g_utf8_find_next_char (tab, NULL);
 
-       /* Replace by end of string */
-       final = g_utf8_strrchr (tab, g_utf8_strlen (tab, 100) + 1, '\n');
-       *final = '\0';
+       /* Replace by end of string. We need to use strlen, because
+          g_utf8_strrchr expects bytes and not UTF8 characters  */
+       final = g_utf8_strrchr (tab, strlen (tab) + 1, '\n');
+       if (G_LIKELY (final))
+               *final = '\0';
+       else
+               tab[strlen(tab) - 1] = '\0';
 
        /* Get MCC code */
        mcc[0] = g_utf8_get_char (line);
@@ -257,6 +262,25 @@ modest_country_picker_init (ModestCountryPicker *self)
        priv->locale_mcc = 0;
 }
 
+static gchar *
+country_picker_print_func (HildonTouchSelector *selector)
+{
+       GtkTreeModel *model;
+       GtkTreeIter iter;
+       gchar *text = NULL;
+
+       /* Always pick the selected country from the tree view and
+          never from the entry */
+       model = hildon_touch_selector_get_model (selector, 0);
+       if (hildon_touch_selector_get_selected (selector, 0, &iter)) {
+               gint column;
+
+               column = hildon_touch_selector_entry_get_text_column (HILDON_TOUCH_SELECTOR_ENTRY (selector));
+               gtk_tree_model_get (model, &iter, column, &text, -1);
+       }
+       return text;
+}
+
 void
 modest_country_picker_load_data(ModestCountryPicker *self)
 {
@@ -276,7 +300,8 @@ modest_country_picker_load_data(ModestCountryPicker *self)
        renderer = gtk_cell_renderer_text_new ();
        g_object_set (G_OBJECT (renderer), "ellipsize", PANGO_ELLIPSIZE_END, NULL);
 
-       selector = hildon_touch_selector_new ();
+       selector = hildon_touch_selector_entry_new ();
+       hildon_touch_selector_set_print_func (HILDON_TOUCH_SELECTOR (selector), country_picker_print_func);
        column = hildon_touch_selector_append_column (HILDON_TOUCH_SELECTOR (selector), GTK_TREE_MODEL (model),
                                                      renderer, "text", MODEL_COL_NAME, NULL);
        g_object_set (G_OBJECT (column), "text-column", MODEL_COL_NAME, NULL);
@@ -287,6 +312,12 @@ modest_country_picker_load_data(ModestCountryPicker *self)
        /* Set this _after_ loading from file, it makes loading faster */
        hildon_touch_selector_set_model (HILDON_TOUCH_SELECTOR (selector),
                                         0, GTK_TREE_MODEL (model));
+       hildon_touch_selector_entry_set_text_column (HILDON_TOUCH_SELECTOR_ENTRY (selector),
+                                                    MODEL_COL_NAME);
+       hildon_touch_selector_entry_set_input_mode (HILDON_TOUCH_SELECTOR_ENTRY (selector),
+                                                   HILDON_GTK_INPUT_MODE_ALPHA |
+                                                   HILDON_GTK_INPUT_MODE_AUTOCAP);
+
        hildon_picker_button_set_selector (HILDON_PICKER_BUTTON (self), HILDON_TOUCH_SELECTOR (selector));
 
        g_object_unref (model);