X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmaemo%2Fmodest-maemo-global-settings-dialog.c;h=7f3d2ca99d716b1d8cc1bd8a624ab297a2586ee3;hp=5c5e5d8606d53660d7b15b89623106da21548b70;hb=40a8f5cbe03bd040fe3403dbfa6806df4fb6bc8a;hpb=46a234c81bceecac16ac22ae3f281b79247d46f7 diff --git a/src/maemo/modest-maemo-global-settings-dialog.c b/src/maemo/modest-maemo-global-settings-dialog.c index 5c5e5d8..7f3d2ca 100644 --- a/src/maemo/modest-maemo-global-settings-dialog.c +++ b/src/maemo/modest-maemo-global-settings-dialog.c @@ -31,7 +31,7 @@ #include #endif /*HAVE_CONFIG_H*/ -#ifdef MODEST_HILDON_VERSION_0 +#ifdef MODEST_HAVE_HILDON0_WIDGETS #include #include #include @@ -39,29 +39,37 @@ #include #include #include -#endif /*MODEST_HILDON_VERSION_0*/ +#endif /*MODEST_HAVE_HILDON0_WIDGETS*/ #include +#include #include #include #include #include #include #include +#include "modest-runtime.h" #include "widgets/modest-global-settings-dialog-priv.h" #include "widgets/modest-combo-box.h" #include "maemo/modest-maemo-global-settings-dialog.h" #include "widgets/modest-ui-constants.h" +#include +#include #define MSG_SIZE_MAX_VAL 5000 #define MSG_SIZE_DEF_VAL 1000 #define MSG_SIZE_MIN_VAL 1 +#define DEFAULT_FOCUS_WIDGET "default-focus-widget" + /* 'private'/'protected' functions */ static void modest_maemo_global_settings_dialog_class_init (ModestMaemoGlobalSettingsDialogClass *klass); static void modest_maemo_global_settings_dialog_init (ModestMaemoGlobalSettingsDialog *obj); static void modest_maemo_global_settings_dialog_finalize (GObject *obj); +static ModestConnectedVia current_connection (void); + /* list my signals */ enum { /* MY_SIGNAL_1, */ @@ -69,15 +77,24 @@ enum { LAST_SIGNAL }; -static GtkWidget* create_updating_page (ModestMaemoGlobalSettingsDialog *self); -static GtkWidget* create_composing_page (ModestMaemoGlobalSettingsDialog *self); +static GtkWidget* create_updating_page (ModestMaemoGlobalSettingsDialog *self); +static GtkWidget* create_composing_page (ModestMaemoGlobalSettingsDialog *self); + +static gboolean on_range_error (HildonNumberEditor *editor, + HildonNumberEditorErrorType type, + gpointer user_data); + +static void on_auto_update_toggled (GtkToggleButton *togglebutton, + gpointer user_data); -static gboolean on_range_error (HildonNumberEditor *editor, - HildonNumberEditorErrorType type, - gpointer user_data); +static gboolean on_inner_tabs_key_pressed (GtkWidget *widget, + GdkEventKey *event, + gpointer user_data); typedef struct _ModestMaemoGlobalSettingsDialogPrivate ModestMaemoGlobalSettingsDialogPrivate; struct _ModestMaemoGlobalSettingsDialogPrivate { + ModestPairList *connect_via_list; + gint switch_handler; }; #define MODEST_MAEMO_GLOBAL_SETTINGS_DIALOG_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ MODEST_TYPE_MAEMO_GLOBAL_SETTINGS_DIALOG, \ @@ -122,36 +139,129 @@ modest_maemo_global_settings_dialog_class_init (ModestMaemoGlobalSettingsDialogC gobject_class->finalize = modest_maemo_global_settings_dialog_finalize; g_type_class_add_private (gobject_class, sizeof(ModestMaemoGlobalSettingsDialogPrivate)); + + MODEST_GLOBAL_SETTINGS_DIALOG_CLASS (klass)->current_connection_func = current_connection; } +typedef struct { + ModestMaemoGlobalSettingsDialog *dia; + GtkWidget *focus_widget; +} SwitchPageHelper; + +static gboolean +idle_select_default_focus (gpointer data) +{ + ModestGlobalSettingsDialogPrivate *ppriv; + ModestMaemoGlobalSettingsDialogPrivate *priv; + SwitchPageHelper *helper; + + helper = (SwitchPageHelper *) data; + priv = MODEST_MAEMO_GLOBAL_SETTINGS_DIALOG_GET_PRIVATE (helper->dia); + ppriv = MODEST_GLOBAL_SETTINGS_DIALOG_GET_PRIVATE (helper->dia); + + /* Grab focus, we need to block in order to prevent a + recursive call to this callback */ + g_signal_handler_block (G_OBJECT (ppriv->notebook), priv->switch_handler); + gdk_threads_enter (); + gtk_widget_grab_focus (helper->focus_widget); + gdk_threads_leave (); + g_signal_handler_unblock (G_OBJECT (ppriv->notebook), priv->switch_handler); + g_free (helper); + + return FALSE; +} + + +static void +on_switch_page (GtkNotebook *notebook, GtkNotebookPage *page, guint page_num, gpointer user_data) +{ + /* grab the focus to the default element in the current page */ + GtkWidget *selected_page = NULL, *focus_item = NULL; + ModestGlobalSettingsDialogPrivate *ppriv; + ModestMaemoGlobalSettingsDialogPrivate *priv; + SwitchPageHelper *helper; + + priv = MODEST_MAEMO_GLOBAL_SETTINGS_DIALOG_GET_PRIVATE (user_data); + ppriv = MODEST_GLOBAL_SETTINGS_DIALOG_GET_PRIVATE (user_data); + + selected_page = gtk_notebook_get_nth_page (notebook, page_num); + focus_item = GTK_WIDGET(g_object_get_data (G_OBJECT(selected_page), DEFAULT_FOCUS_WIDGET)); + if (!focus_item) { + g_printerr ("modest: cannot get focus item\n"); + return; + } + + /* Create the helper */ + helper = g_malloc0 (sizeof (SwitchPageHelper)); + helper->dia = MODEST_MAEMO_GLOBAL_SETTINGS_DIALOG (user_data); + helper->focus_widget = focus_item; + + /* Focus the widget in an idle. We need to do this in an idle, + because this handler is executed *before* the page was + really switched, so the focus is not placed in the right + widget */ + g_idle_add (idle_select_default_focus, helper); +} + + static void modest_maemo_global_settings_dialog_init (ModestMaemoGlobalSettingsDialog *self) { + ModestMaemoGlobalSettingsDialogPrivate *priv; ModestGlobalSettingsDialogPrivate *ppriv; -/* GdkGeometry *geometry; */ + priv = MODEST_MAEMO_GLOBAL_SETTINGS_DIALOG_GET_PRIVATE (self); ppriv = MODEST_GLOBAL_SETTINGS_DIALOG_GET_PRIVATE (self); ppriv->updating_page = create_updating_page (self); ppriv->composing_page = create_composing_page (self); + /* Set the default focusable widgets */ + g_object_set_data (G_OBJECT(ppriv->updating_page), DEFAULT_FOCUS_WIDGET, + (gpointer)ppriv->auto_update); + g_object_set_data (G_OBJECT(ppriv->composing_page), DEFAULT_FOCUS_WIDGET, + (gpointer)ppriv->msg_format); + /* Add the notebook pages: */ gtk_notebook_append_page (GTK_NOTEBOOK (ppriv->notebook), ppriv->updating_page, - gtk_label_new (_("mcen_ti_options_updating"))); + gtk_label_new (_("mcen_ti_options_updating"))); gtk_notebook_append_page (GTK_NOTEBOOK (ppriv->notebook), ppriv->composing_page, - gtk_label_new (_("mcen_ti_options_composing"))); + gtk_label_new (_("mcen_ti_options_composing"))); gtk_container_add (GTK_CONTAINER (GTK_DIALOG (self)->vbox), ppriv->notebook); gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (self)->vbox), MODEST_MARGIN_HALF); + g_signal_connect (G_OBJECT (self), "key-press-event", + G_CALLBACK (on_inner_tabs_key_pressed), self); + priv->switch_handler = g_signal_connect (G_OBJECT(ppriv->notebook), "switch-page", + G_CALLBACK(on_switch_page), self); + /* Load current config */ - _modest_global_settings_dialog_load_conf (ppriv); - gtk_widget_show_all (ppriv->notebook); + _modest_global_settings_dialog_load_conf (MODEST_GLOBAL_SETTINGS_DIALOG (self)); + + /* Set first page */ + gtk_notebook_set_current_page (GTK_NOTEBOOK (ppriv->notebook), 0); } static void modest_maemo_global_settings_dialog_finalize (GObject *obj) { + ModestGlobalSettingsDialogPrivate *ppriv; + ModestMaemoGlobalSettingsDialogPrivate *priv; + + priv = MODEST_MAEMO_GLOBAL_SETTINGS_DIALOG_GET_PRIVATE (obj); + ppriv = MODEST_GLOBAL_SETTINGS_DIALOG_GET_PRIVATE (obj); + + if (priv->switch_handler && ppriv->notebook) { + /* TODO: This causes a g_warning: + modest[13409]: GLIB WARNING ** GLib-GObject - invalid unclassed pointer in cast to `GObject' + modest[13409]: GLIB WARNING ** GLib-GObject - instance with invalid (NULL) class pointer + modest[13409]: GLIB CRITICAL ** GLib-GObject - g_signal_handler_disconnect: assertion `G_TYPE_CHECK_INSTANCE (instance)' failed + */ + g_signal_handler_disconnect (G_OBJECT (ppriv->notebook), priv->switch_handler); + priv->switch_handler = 0; + } + /* free/unref instance resources here */ G_OBJECT_CLASS(parent_class)->finalize (obj); } @@ -171,7 +281,6 @@ create_updating_page (ModestMaemoGlobalSettingsDialog *self) { GtkWidget *vbox, *vbox_update, *vbox_limit, *caption; GtkSizeGroup *size_group; - ModestPairList *list; ModestGlobalSettingsDialogPrivate *ppriv; ppriv = MODEST_GLOBAL_SETTINGS_DIALOG_GET_PRIVATE (self); @@ -189,11 +298,16 @@ create_updating_page (ModestMaemoGlobalSettingsDialog *self) NULL, HILDON_CAPTION_MANDATORY); gtk_box_pack_start (GTK_BOX (vbox_update), caption, FALSE, FALSE, MODEST_MARGIN_HALF); + g_signal_connect (ppriv->auto_update, "toggled", G_CALLBACK (on_auto_update_toggled), self); /* Connected via */ - list = _modest_global_settings_dialog_get_connected_via (); - ppriv->connect_via = modest_combo_box_new (list, g_int_equal); - modest_pair_list_free (list); + + /* Note: This ModestPairList* must exist for as long as the combo + * that uses it, because the ModestComboBox uses the ID opaquely, + * so it can't know how to manage its memory. */ + ppriv->connect_via_list = _modest_global_settings_dialog_get_connected_via (); + ppriv->connect_via = modest_combo_box_new (ppriv->connect_via_list, g_int_equal); + caption = hildon_caption_new (size_group, _("mcen_fi_options_connectiontype"), ppriv->connect_via, @@ -202,9 +316,13 @@ create_updating_page (ModestMaemoGlobalSettingsDialog *self) gtk_box_pack_start (GTK_BOX (vbox_update), caption, FALSE, FALSE, MODEST_MARGIN_HALF); /* Update interval */ - list = _modest_global_settings_dialog_get_update_interval (); - ppriv->update_interval = modest_combo_box_new (list, g_int_equal); - modest_pair_list_free (list); + + /* Note: This ModestPairList* must exist for as long as the combo + * that uses it, because the ModestComboBox uses the ID opaquely, + * so it can't know how to manage its memory. */ + ppriv->update_interval_list = _modest_global_settings_dialog_get_update_interval (); + ppriv->update_interval = modest_combo_box_new (ppriv->update_interval_list, g_int_equal); + caption = hildon_caption_new (size_group, _("mcen_fi_options_updateinterval"), ppriv->update_interval, @@ -223,8 +341,8 @@ create_updating_page (ModestMaemoGlobalSettingsDialog *self) size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); /* Size limit */ - ppriv->size_limit = hildon_number_editor_new (MSG_SIZE_MIN_VAL, MSG_SIZE_MAX_VAL);; - hildon_number_editor_set_value (HILDON_NUMBER_EDITOR (ppriv->size_limit), MSG_SIZE_DEF_VAL);; + ppriv->size_limit = hildon_number_editor_new (MSG_SIZE_MIN_VAL, MSG_SIZE_MAX_VAL); + hildon_number_editor_set_value (HILDON_NUMBER_EDITOR (ppriv->size_limit), MSG_SIZE_DEF_VAL); g_signal_connect (ppriv->size_limit, "range_error", G_CALLBACK (on_range_error), self); caption = hildon_caption_new (size_group, _("mcen_fi_advsetup_sizelimit"), @@ -244,7 +362,7 @@ create_updating_page (ModestMaemoGlobalSettingsDialog *self) /* Add to vbox */ gtk_box_pack_start (GTK_BOX (vbox), vbox_limit, FALSE, FALSE, MODEST_MARGIN_HALF); - + return vbox; } @@ -257,7 +375,6 @@ create_composing_page (ModestMaemoGlobalSettingsDialog *self) GtkWidget *vbox; GtkSizeGroup *size_group; ModestGlobalSettingsDialogPrivate *ppriv; - ModestPairList *list; GtkWidget *caption; ppriv = MODEST_GLOBAL_SETTINGS_DIALOG_GET_PRIVATE (self); @@ -265,9 +382,13 @@ create_composing_page (ModestMaemoGlobalSettingsDialog *self) vbox = gtk_vbox_new (FALSE, MODEST_MARGIN_DEFAULT); /* Update interval */ - list = _modest_global_settings_dialog_get_msg_formats (); - ppriv->msg_format = modest_combo_box_new (list, g_int_equal); - modest_pair_list_free (list); + + /* Note: This ModestPairList* must exist for as long as the combo + * that uses it, because the ModestComboBox uses the ID opaquely, + * so it can't know how to manage its memory. */ + ppriv->msg_format_list = _modest_global_settings_dialog_get_msg_formats (); + ppriv->msg_format = modest_combo_box_new (ppriv->msg_format_list, g_int_equal); + caption = hildon_caption_new (size_group, _("mcen_fi_options_messageformat"), ppriv->msg_format, @@ -287,6 +408,26 @@ create_composing_page (ModestMaemoGlobalSettingsDialog *self) return vbox; } +static void +on_auto_update_toggled (GtkToggleButton *togglebutton, + gpointer user_data) +{ + ModestGlobalSettingsDialogPrivate *ppriv; + GtkWidget *caption1, *caption2; + + ppriv = MODEST_GLOBAL_SETTINGS_DIALOG_GET_PRIVATE (user_data); + caption1 = gtk_widget_get_ancestor (ppriv->connect_via, HILDON_TYPE_CAPTION); + caption2 = gtk_widget_get_ancestor (ppriv->update_interval, HILDON_TYPE_CAPTION); + + if (gtk_toggle_button_get_active (togglebutton)) { + gtk_widget_set_sensitive (caption1, TRUE); + gtk_widget_set_sensitive (caption2, TRUE); + } else { + gtk_widget_set_sensitive (caption1, FALSE); + gtk_widget_set_sensitive (caption2, FALSE); + } +} + static gboolean on_range_error (HildonNumberEditor *editor, HildonNumberEditorErrorType type, @@ -296,16 +437,28 @@ on_range_error (HildonNumberEditor *editor, gint new_val; switch (type) { +#ifdef MODEST_HAVE_HILDON0_WIDGETS case MAXIMUM_VALUE_EXCEED: - msg = g_strdup_printf (_("ckct_ib_maximum_value"), MSG_SIZE_MAX_VAL); +#else + case HILDON_NUMBER_EDITOR_ERROR_MAXIMUM_VALUE_EXCEED: +#endif + msg = g_strdup_printf (dgettext("hildon-libs", "ckct_ib_maximum_value"), MSG_SIZE_MAX_VAL); new_val = MSG_SIZE_MAX_VAL; break; +#ifdef MODEST_HAVE_HILDON0_WIDGETS case MINIMUM_VALUE_EXCEED: - msg = g_strdup_printf (_("ckct_ib_minimum_value"), MSG_SIZE_MIN_VAL); +#else + case HILDON_NUMBER_EDITOR_ERROR_MINIMUM_VALUE_EXCEED: +#endif + msg = g_strdup_printf (dgettext("hildon-libs", "ckct_ib_minimum_value"), MSG_SIZE_MIN_VAL); new_val = MSG_SIZE_MIN_VAL; break; +#ifdef MODEST_HAVE_HILDON0_WIDGETS case ERRONEOUS_VALUE: - msg = g_strdup_printf (_("ckct_ib_set_a_value_within_range"), +#else + case HILDON_NUMBER_EDITOR_ERROR_ERRONEOUS_VALUE: +#endif + msg = g_strdup_printf (dgettext("hildon-libs", "ckct_ib_set_a_value_within_range"), MSG_SIZE_MIN_VAL, MSG_SIZE_MAX_VAL); /* FIXME: use the previous */ @@ -326,3 +479,61 @@ on_range_error (HildonNumberEditor *editor, return TRUE; } + +static ModestConnectedVia +current_connection (void) +{ + TnyAccountStore *account_store = NULL; + TnyDevice *device = NULL; + ModestConnectedVia retval = MODEST_CONNECTED_VIA_ANY; + + account_store = TNY_ACCOUNT_STORE (modest_runtime_get_account_store ()); + device = tny_account_store_get_device (account_store); + + if (!tny_device_is_online (device)) + return MODEST_CONNECTED_VIA_ANY; + + /* Get iap id */ + const gchar *iap_id = tny_maemo_conic_device_get_current_iap_id (TNY_MAEMO_CONIC_DEVICE (device)); + if (iap_id) { + ConIcIap *iap = tny_maemo_conic_device_get_iap ( + TNY_MAEMO_CONIC_DEVICE (device), iap_id); + const gchar *bearer_type = con_ic_iap_get_bearer_type (iap); + if (bearer_type) { + if (!strcmp (bearer_type, CON_IC_BEARER_WLAN_INFRA) || + !strcmp (bearer_type, CON_IC_BEARER_WLAN_ADHOC)) + retval = MODEST_CONNECTED_VIA_WLAN; + else + retval = MODEST_CONNECTED_VIA_ANY; + } + + g_object_unref (iap); + } + + g_object_unref (device); + + return retval; +} + +static gboolean +on_inner_tabs_key_pressed (GtkWidget *widget, + GdkEventKey *event, + gpointer user_data) +{ + ModestGlobalSettingsDialogPrivate *ppriv; + gboolean retval = FALSE; + + ppriv = MODEST_GLOBAL_SETTINGS_DIALOG_GET_PRIVATE (user_data); + + if (widget == user_data) { + if (event->keyval == GDK_Right) { + gtk_notebook_next_page (GTK_NOTEBOOK (ppriv->notebook)); + retval = TRUE; + } else if (event->keyval == GDK_Left) { + gtk_notebook_prev_page (GTK_NOTEBOOK (ppriv->notebook)); + retval = TRUE; + } + } + + return retval; +}