1 /* Copyright (c) 2008, Nokia Corporation
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * * Neither the name of the Nokia Corporation nor the names of its
14 * contributors may be used to endorse or promote products derived from
15 * this software without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
18 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
20 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
21 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 #define _GNU_SOURCE /* So we can use the getline() function, which is a convenient GNU extension. */
36 #include "modest-utils.h"
37 #include "modest-country-picker.h"
38 #include <hildon/hildon.h>
39 #include <gtk/gtkliststore.h>
40 #include <gtk/gtkcelllayout.h>
41 #include <gtk/gtkcellrenderertext.h>
44 #include <string.h> /* For memcpy() */
46 #include <libintl.h> /* For dgettext(). */
48 /* Include config.h so that _() works: */
53 G_DEFINE_TYPE (ModestCountryPicker, modest_country_picker, HILDON_TYPE_PICKER_BUTTON);
58 /* GtkTreeModel *model; */
59 } ModestCountryPickerPrivate;
61 #define MODEST_COUNTRY_PICKER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), \
62 MODEST_TYPE_COUNTRY_PICKER, \
63 ModestCountryPickerPrivate))
66 modest_country_picker_get_property (GObject *object, guint property_id,
67 GValue *value, GParamSpec *pspec)
69 switch (property_id) {
71 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
76 modest_country_picker_set_property (GObject *object, guint property_id,
77 const GValue *value, GParamSpec *pspec)
79 switch (property_id) {
81 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
86 modest_country_picker_dispose (GObject *object)
88 if (G_OBJECT_CLASS (modest_country_picker_parent_class)->dispose)
89 G_OBJECT_CLASS (modest_country_picker_parent_class)->dispose (object);
93 MODEL_COL_NAME = 0, /* string */
94 MODEL_COL_MCC = 1 /* the 'effective mcc' for this country */
99 modest_country_picker_finalize (GObject *object)
101 G_OBJECT_CLASS (modest_country_picker_parent_class)->finalize (object);
105 modest_country_picker_class_init (ModestCountryPickerClass *klass)
107 GObjectClass *object_class = G_OBJECT_CLASS (klass);
109 g_type_class_add_private (klass, sizeof (ModestCountryPickerPrivate));
111 object_class->get_property = modest_country_picker_get_property;
112 object_class->set_property = modest_country_picker_set_property;
113 object_class->dispose = modest_country_picker_dispose;
114 object_class->finalize = modest_country_picker_finalize;
122 modest_country_picker_init (ModestCountryPicker *self)
124 ModestCountryPickerPrivate *priv = MODEST_COUNTRY_PICKER_GET_PRIVATE (self);
125 priv->locale_mcc = 0;
129 country_picker_print_func (HildonTouchSelector *selector, gpointer userdata)
135 /* Always pick the selected country from the tree view and
136 never from the entry */
137 model = hildon_touch_selector_get_model (selector, 0);
138 if (hildon_touch_selector_get_selected (selector, 0, &iter)) {
140 gtk_tree_model_get (model, &iter, 0, &text, -1);
147 modest_country_picker_load_data(ModestCountryPicker *self)
149 GtkCellRenderer *renderer;
152 HildonTouchSelectorColumn *column;
153 ModestCountryPickerPrivate *priv;
155 priv = MODEST_COUNTRY_PICKER_GET_PRIVATE (self);
157 /* Create a tree model for the combo box,
158 * with a string for the name, and an int for the MCC ID.
159 * This must match our MODEL_COLS enum constants.
161 model = modest_utils_create_country_model ();
164 * The ID model column in not shown in the view. */
165 renderer = gtk_cell_renderer_text_new ();
166 g_object_set (G_OBJECT (renderer), "ellipsize", PANGO_ELLIPSIZE_END, NULL);
168 selector = hildon_touch_selector_new ();
169 hildon_touch_selector_set_print_func (HILDON_TOUCH_SELECTOR (selector), (HildonTouchSelectorPrintFunc) country_picker_print_func);
171 modest_utils_fill_country_model (model, &(priv->locale_mcc));
173 /* Set this _after_ loading from file, it makes loading faster */
174 hildon_touch_selector_set_model (HILDON_TOUCH_SELECTOR (selector),
176 column = hildon_touch_selector_append_column (HILDON_TOUCH_SELECTOR (selector), model,
177 renderer, "text", MODEST_UTILS_COUNTRY_MODEL_COLUMN_NAME, NULL);
178 hildon_touch_selector_column_set_text_column (column, MODEST_UTILS_COUNTRY_MODEL_COLUMN_NAME);
180 hildon_picker_button_set_selector (HILDON_PICKER_BUTTON (self), HILDON_TOUCH_SELECTOR (selector));
182 g_object_unref (model);
186 modest_country_picker_new (HildonSizeType size,
187 HildonButtonArrangement arrangement)
189 ModestCountryPicker *picker = g_object_new (MODEST_TYPE_COUNTRY_PICKER,
190 "arrangement", arrangement,
194 /* For theming purpouses. Widget name must end in Button-finger */
195 gtk_widget_set_name ((GtkWidget *) picker, "ModestCountryPickerButton-finger");
201 * Returns the MCC number of the selected country, or 0 if no country was selected.
204 modest_country_picker_get_active_country_mcc (ModestCountryPicker *self)
209 found = hildon_touch_selector_get_selected (hildon_picker_button_get_selector
210 (HILDON_PICKER_BUTTON (self)), 0, &active);
213 gtk_tree_model_get (hildon_touch_selector_get_model (hildon_picker_button_get_selector
214 (HILDON_PICKER_BUTTON (self)),
216 &active, MODEST_UTILS_COUNTRY_MODEL_COLUMN_MCC, &mcc, -1);
219 return 0; /* Failed. */
224 * Selects the MCC number of the selected country.
225 * Specify 0 to select no country.
228 modest_country_picker_set_active_country_locale (ModestCountryPicker *self)
230 ModestCountryPickerPrivate *priv = MODEST_COUNTRY_PICKER_GET_PRIVATE (self);
236 selector = GTK_WIDGET (hildon_picker_button_get_selector (HILDON_PICKER_BUTTON (self)));
237 model = hildon_touch_selector_get_model (HILDON_TOUCH_SELECTOR (selector), 0);
238 if (!gtk_tree_model_get_iter_first (model, &iter))
241 gtk_tree_model_get (model, &iter, MODEST_UTILS_COUNTRY_MODEL_COLUMN_MCC, ¤t_mcc, -1);
242 if (priv->locale_mcc == current_mcc) {
243 hildon_touch_selector_select_iter (HILDON_TOUCH_SELECTOR (selector), 0,
245 hildon_button_set_value (HILDON_BUTTON (self),
246 hildon_touch_selector_get_current_text (HILDON_TOUCH_SELECTOR (selector)));
249 } while (gtk_tree_model_iter_next (model, &iter));
251 return FALSE; /* not found */