X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fwidgets%2Fmodest-global-settings-dialog.c;h=59cd35cb142f47e8cc33805c8846f385a2c17d08;hp=f77fc94835411315ce4f37f40e6c6785d1680c44;hb=HEAD;hpb=d6ea0a5d1f08adc2afe5f87499964d6de93d39c7 diff --git a/src/widgets/modest-global-settings-dialog.c b/src/widgets/modest-global-settings-dialog.c index f77fc94..59cd35c 100644 --- a/src/widgets/modest-global-settings-dialog.c +++ b/src/widgets/modest-global-settings-dialog.c @@ -28,10 +28,8 @@ */ #include -#include -#include -#include -#include +#include +#include #include "widgets/modest-global-settings-dialog.h" #include "widgets/modest-global-settings-dialog-priv.h" #include "modest-defs.h" @@ -40,13 +38,9 @@ #include "modest-ui-constants.h" #include "modest-tny-msg.h" #include "modest-platform.h" -#include "widgets/modest-combo-box.h" -#ifdef MODEST_PLATFORM_MAEMO -#ifdef MODEST_HILDON_VERSION_0 -#include -#else +#ifdef MODEST_TOOLKIT_HILDON2 +#include "modest-hildon-includes.h" #include -#endif /*MODEST_HILDON_VERSION_0*/ #endif /* include other impl specific header files */ @@ -60,11 +54,17 @@ static void modest_global_settings_dialog_finalize (GObject *obj); static void on_response (GtkDialog *dialog, gint arg1, gpointer user_data); -static void get_current_settings (ModestGlobalSettingsDialogPrivate *priv, +static gboolean on_delete_event (GtkWidget *widget, + GdkEvent *event, + gpointer user_data); + +static void get_current_settings (ModestGlobalSettingsDialogPrivate *priv, ModestGlobalSettingsState *state); static ModestConnectedVia current_connection_default (void); +static gboolean modest_global_settings_dialog_save_settings_default (ModestGlobalSettingsDialog *self); + /* list my signals */ enum { /* MY_SIGNAL_1, */ @@ -114,48 +114,40 @@ modest_global_settings_dialog_class_init (ModestGlobalSettingsDialogClass *klass g_type_class_add_private (gobject_class, sizeof(ModestGlobalSettingsDialogPrivate)); klass->current_connection_func = current_connection_default; + klass->save_settings_func = modest_global_settings_dialog_save_settings_default; } static void modest_global_settings_dialog_init (ModestGlobalSettingsDialog *self) { ModestGlobalSettingsDialogPrivate *priv; -/* GdkGeometry *geometry; */ priv = MODEST_GLOBAL_SETTINGS_DIALOG_GET_PRIVATE (self); priv->notebook = gtk_notebook_new (); - priv->changed = FALSE; + priv->default_account_selector = NULL; + priv->accounts_list = NULL; - /* Add the buttons: */ - gtk_dialog_add_button (GTK_DIALOG (self), GTK_STOCK_OK, GTK_RESPONSE_OK); - gtk_dialog_add_button (GTK_DIALOG (self), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); - - /* Connect to the dialog's response signal: */ + /* Connect to the dialog's "response" and "delete-event" signals */ g_signal_connect (G_OBJECT (self), "response", G_CALLBACK (on_response), self); + g_signal_connect (G_OBJECT (self), "delete-event", G_CALLBACK (on_delete_event), self); /* Set title */ gtk_window_set_title (GTK_WINDOW (self), _("mcen_ti_options")); - - /* Set geometry */ -/* geometry = g_malloc0(sizeof (GdkGeometry)); */ -/* geometry->max_width = MODEST_DIALOG_WINDOW_MAX_WIDTH; */ -/* geometry->min_width = MODEST_DIALOG_WINDOW_MIN_WIDTH; */ -/* geometry->max_height = MODEST_DIALOG_WINDOW_MAX_HEIGHT; */ -/* geometry->min_height = MODEST_DIALOG_WINDOW_MIN_HEIGHT; */ -/* gtk_window_set_geometry_hints (GTK_WINDOW (self), */ -/* GTK_WIDGET (self), */ -/* geometry, */ -/* GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE); */ - gtk_widget_set_size_request (GTK_WIDGET (self), - MODEST_DIALOG_WINDOW_MAX_WIDTH, - MODEST_DIALOG_WINDOW_MAX_HEIGHT); } static void modest_global_settings_dialog_finalize (GObject *obj) { -/* free/unref instance resources here */ + ModestGlobalSettingsDialogPrivate *priv = + MODEST_GLOBAL_SETTINGS_DIALOG_GET_PRIVATE (obj); + + /* These had to stay alive as long as the comboboxes that used them: */ + modest_pair_list_free (priv->connect_via_list); + modest_pair_list_free (priv->update_interval_list); + modest_pair_list_free (priv->msg_format_list); + modest_pair_list_free (priv->accounts_list); + G_OBJECT_CLASS(parent_class)->finalize (obj); } @@ -174,17 +166,23 @@ add_to_modest_pair_list (const gint num, const gchar *str, GSList **list) *list = g_slist_prepend (*list, pair); } -/* - * Gets a list of pairs - */ ModestPairList * _modest_global_settings_dialog_get_connected_via (void) { GSList *list = NULL; + const gchar *message; - add_to_modest_pair_list (MODEST_CONNECTED_VIA_WLAN, - _("mcen_va_options_connectiontype_wlan"), - &list); +#ifndef MODEST_TOOLKIT_GTK + const gchar *env_var = getenv ("OSSO_PRODUCT_HARDWARE"); + /* Check if WIMAX is available */ + if (env_var && !strncmp (env_var, "RX-48", 5)) + message = _("mcen_va_options_connectiontype_wlan_wimax"); + else + message = _("mcen_va_options_connectiontype_wlan"); +#else + message = _("mcen_va_options_connectiontype_wlan"); +#endif + add_to_modest_pair_list (MODEST_CONNECTED_VIA_WLAN_OR_WIMAX, message, &list); add_to_modest_pair_list (MODEST_CONNECTED_VIA_ANY, _("mcen_va_options_connectiontype_all"), &list); @@ -200,25 +198,35 @@ _modest_global_settings_dialog_get_update_interval (void) { GSList *list = NULL; - add_to_modest_pair_list (MODEST_UPDATE_INTERVAL_5_MIN, - _("mcen_va_options_updateinterval_5min"), + add_to_modest_pair_list (MODEST_UPDATE_INTERVAL_5_MIN, + _("mcen_va_options_updateinterval_5min"), + &list); + add_to_modest_pair_list (MODEST_UPDATE_INTERVAL_10_MIN, + _("mcen_va_options_updateinterval_10min"), &list); - add_to_modest_pair_list (MODEST_UPDATE_INTERVAL_10_MIN, - _("mcen_va_options_updateinterval_10min"), + add_to_modest_pair_list (MODEST_UPDATE_INTERVAL_15_MIN, + _("mcen_va_options_updateinterval_15min"), &list); - add_to_modest_pair_list (MODEST_UPDATE_INTERVAL_15_MIN, - _("mcen_va_options_updateinterval_15min"), + add_to_modest_pair_list (MODEST_UPDATE_INTERVAL_30_MIN, + _("mcen_va_options_updateinterval_30min"), &list); - add_to_modest_pair_list (MODEST_UPDATE_INTERVAL_30_MIN, - _("mcen_va_options_updateinterval_30min"), + add_to_modest_pair_list (MODEST_UPDATE_INTERVAL_1_HOUR, + _("mcen_va_options_updateinterval_1h"), &list); - add_to_modest_pair_list (MODEST_UPDATE_INTERVAL_1_HOUR, - _("mcen_va_options_updateinterval_1h"), + add_to_modest_pair_list (MODEST_UPDATE_INTERVAL_2_HOUR, + _("mcen_va_options_updateinterval_2h"), &list); - add_to_modest_pair_list (MODEST_UPDATE_INTERVAL_2_HOUR, - _("mcen_va_options_updateinterval_2h"), + add_to_modest_pair_list (MODEST_UPDATE_INTERVAL_4_HOUR, + _("mcen_va_options_updateinterval_4h"), + &list); + add_to_modest_pair_list (MODEST_UPDATE_INTERVAL_8_HOUR, + _("mcen_va_options_updateinterval_8h"), + &list); + add_to_modest_pair_list (MODEST_UPDATE_INTERVAL_24_HOUR, + _("mcen_va_options_updateinterval_24h"), &list); + return (ModestPairList *) g_slist_reverse (list); } @@ -240,133 +248,32 @@ _modest_global_settings_dialog_get_msg_formats (void) return (ModestPairList *) g_slist_reverse (list); } -void -_modest_global_settings_dialog_load_conf (ModestGlobalSettingsDialog *self) -{ - ModestConf *conf; - gboolean checked; - gint combo_id, value; - GError *error = NULL; - ModestGlobalSettingsDialogPrivate *priv; - - priv = MODEST_GLOBAL_SETTINGS_DIALOG_GET_PRIVATE (self); - conf = modest_runtime_get_conf (); - - /* Autoupdate */ - checked = modest_conf_get_bool (conf, MODEST_CONF_AUTO_UPDATE, &error); - if (error) { - g_clear_error (&error); - error = NULL; - checked = FALSE; - } - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->auto_update), checked); - priv->initial_state.auto_update = checked; - - /* Connected by */ - combo_id = modest_conf_get_int (conf, MODEST_CONF_UPDATE_WHEN_CONNECTED_BY, &error); - if (error) { - g_error_free (error); - error = NULL; - combo_id = MODEST_CONNECTED_VIA_WLAN; - } - modest_combo_box_set_active_id (MODEST_COMBO_BOX (priv->connect_via), - (gpointer) &combo_id); - priv->initial_state.connect_via = combo_id; - - /* Emit toggled to update the visibility of connect_by caption */ - gtk_toggle_button_toggled (GTK_TOGGLE_BUTTON (priv->auto_update)); - - /* Update interval */ - combo_id = modest_conf_get_int (conf, MODEST_CONF_UPDATE_INTERVAL, &error); - if (error) { - g_error_free (error); - error = NULL; - combo_id = MODEST_UPDATE_INTERVAL_15_MIN; - } - modest_combo_box_set_active_id (MODEST_COMBO_BOX (priv->update_interval), - (gpointer) &combo_id); - priv->initial_state.update_interval = combo_id; - - /* Size limit */ - value = modest_conf_get_int (conf, MODEST_CONF_MSG_SIZE_LIMIT, &error); - if (error) { - g_error_free (error); - error = NULL; - value = 1000; - } - /* It's better to do this in the subclasses, but it's just one - line, so we'll leave it here for the moment */ -#ifdef MODEST_PLATFORM_MAEMO - hildon_number_editor_set_value (HILDON_NUMBER_EDITOR (priv->size_limit), value); -#else - gtk_spin_button_set_value (GTK_SPIN_BUTTON (priv->size_limit, value)); -#endif - priv->initial_state.size_limit = value; - - /* Play sound */ - checked = modest_conf_get_bool (conf, MODEST_CONF_PLAY_SOUND_MSG_ARRIVE, &error); - if (error) { - g_error_free (error); - error = NULL; - checked = FALSE; - } - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->play_sound), checked); - priv->initial_state.play_sound = checked; - - /* Msg format */ - combo_id = modest_conf_get_int (conf, MODEST_CONF_PREFER_FORMATTED_TEXT, &error); - if (error) { - g_error_free (error); - error = NULL; - combo_id = MODEST_FILE_FORMAT_FORMATTED_TEXT; - } - modest_combo_box_set_active_id (MODEST_COMBO_BOX (priv->msg_format), - (gpointer) &combo_id); - priv->initial_state.msg_format = combo_id; - - /* Include reply */ - value = modest_conf_get_int (conf, MODEST_CONF_REPLY_TYPE, &error); - if (error) { - g_error_free (error); - error = NULL; - value = MODEST_TNY_MSG_REPLY_TYPE_QUOTE; - } - if (value == MODEST_TNY_MSG_REPLY_TYPE_QUOTE) - checked = TRUE; - else - checked = FALSE; - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->include_reply), checked); - priv->initial_state.include_reply = checked; -} - -static void -get_current_settings (ModestGlobalSettingsDialogPrivate *priv, - ModestGlobalSettingsState *state) +static void +get_current_settings (ModestGlobalSettingsDialogPrivate *priv, + ModestGlobalSettingsState *state) { gint *id; /* Get values from UI */ - state->auto_update = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->auto_update)); - id = modest_combo_box_get_active_id (MODEST_COMBO_BOX (priv->connect_via)); + state->notifications = modest_togglable_get_active (priv->notifications); + state->add_to_contacts = modest_togglable_get_active (priv->add_to_contacts); + state->auto_update = modest_togglable_get_active (priv->auto_update); + id = modest_selector_get_active_id (priv->connect_via); + state->default_account = modest_selector_get_active_id (priv->default_account_selector); state->connect_via = *id; -#ifdef MODEST_PLATFORM_MAEMO - state->size_limit = hildon_number_editor_get_value (HILDON_NUMBER_EDITOR (priv->size_limit)); -#else - state->size_limit = gtk_spin_button_set_value (GTK_SPIN_BUTTON (priv->size_limit)); -#endif - id = modest_combo_box_get_active_id (MODEST_COMBO_BOX (priv->update_interval)); + + id = modest_selector_get_active_id (priv->update_interval); state->update_interval = *id; - state->play_sound = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->play_sound)); - id = modest_combo_box_get_active_id (MODEST_COMBO_BOX (priv->msg_format)); - state->msg_format = *id; - state->include_reply = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->include_reply)); + id = modest_selector_get_active_id (priv->msg_format); + state->play_sound = priv->initial_state.play_sound; + state->prefer_formatted_text = (*id == MODEST_FILE_FORMAT_FORMATTED_TEXT) ? TRUE : FALSE; } -gboolean -_modest_global_settings_dialog_save_conf (ModestGlobalSettingsDialog *self) +static gboolean +modest_global_settings_dialog_save_settings_default (ModestGlobalSettingsDialog *self) { ModestConf *conf; - ModestGlobalSettingsState current_state; + ModestGlobalSettingsState current_state = {0,}; GError *error = NULL; ModestGlobalSettingsDialogPrivate *priv; @@ -377,40 +284,44 @@ _modest_global_settings_dialog_save_conf (ModestGlobalSettingsDialog *self) get_current_settings (priv, ¤t_state); /* Save configuration */ + modest_conf_set_bool (conf, MODEST_CONF_NOTIFICATIONS, current_state.notifications, &error); + RETURN_FALSE_ON_ERROR(error); + modest_conf_set_bool (conf, MODEST_CONF_AUTO_ADD_TO_CONTACTS, current_state.add_to_contacts, &error); + RETURN_FALSE_ON_ERROR(error); modest_conf_set_bool (conf, MODEST_CONF_AUTO_UPDATE, current_state.auto_update, &error); RETURN_FALSE_ON_ERROR(error); modest_conf_set_int (conf, MODEST_CONF_UPDATE_WHEN_CONNECTED_BY, current_state.connect_via, NULL); RETURN_FALSE_ON_ERROR(error); modest_conf_set_int (conf, MODEST_CONF_UPDATE_INTERVAL, current_state.update_interval, NULL); RETURN_FALSE_ON_ERROR(error); - modest_conf_set_int (conf, MODEST_CONF_MSG_SIZE_LIMIT, current_state.size_limit, NULL); - RETURN_FALSE_ON_ERROR(error); modest_conf_set_bool (conf, MODEST_CONF_PLAY_SOUND_MSG_ARRIVE, current_state.play_sound, NULL); RETURN_FALSE_ON_ERROR(error); - modest_conf_set_int (conf, MODEST_CONF_PREFER_FORMATTED_TEXT, current_state.msg_format, NULL); - RETURN_FALSE_ON_ERROR(error); - modest_conf_set_int (conf, MODEST_CONF_REPLY_TYPE, - (current_state.include_reply) ? MODEST_TNY_MSG_REPLY_TYPE_QUOTE : - MODEST_TNY_MSG_REPLY_TYPE_CITE, NULL); + modest_conf_set_bool (conf, MODEST_CONF_PREFER_FORMATTED_TEXT, current_state.prefer_formatted_text, NULL); RETURN_FALSE_ON_ERROR(error); + if (current_state.default_account && + (!priv->initial_state.default_account || + strcmp (current_state.default_account, priv->initial_state.default_account)!= 0)) { + modest_account_mgr_set_default_account (modest_runtime_get_account_mgr (), + current_state.default_account); + } /* Apply changes */ - if (priv->initial_state.auto_update != current_state.auto_update || + if (priv->initial_state.auto_update != current_state.auto_update || priv->initial_state.connect_via != current_state.connect_via || priv->initial_state.update_interval != current_state.update_interval) { TnyAccountStore *account_store; TnyDevice *device; - + if (!current_state.auto_update) { modest_platform_set_update_interval (0); /* To avoid a new indentation level */ goto exit; } - + account_store = TNY_ACCOUNT_STORE (modest_runtime_get_account_store ()); device = tny_account_store_get_device (account_store); - + if (tny_device_is_online (device)) { /* If connected via any then set update interval */ if (current_state.connect_via == MODEST_CONNECTED_VIA_ANY) { @@ -420,7 +331,7 @@ _modest_global_settings_dialog_save_conf (ModestGlobalSettingsDialog *self) selected the same connect_via method than the one already used by the device */ - ModestConnectedVia connect_via = + ModestConnectedVia connect_via = MODEST_GLOBAL_SETTINGS_DIALOG_GET_CLASS(self)->current_connection_func (); if (current_state.connect_via == connect_via) @@ -432,9 +343,9 @@ _modest_global_settings_dialog_save_conf (ModestGlobalSettingsDialog *self) /* Disable autoupdate in offline mode */ modest_platform_set_update_interval (0); } - g_object_unref (device); + g_object_unref (device); } - + exit: return TRUE; } @@ -444,25 +355,45 @@ settings_changed (ModestGlobalSettingsState initial_state, ModestGlobalSettingsState current_state) { if (initial_state.auto_update != current_state.auto_update || + initial_state.notifications != current_state.notifications || + initial_state.add_to_contacts != current_state.add_to_contacts || initial_state.connect_via != current_state.connect_via || initial_state.update_interval != current_state.update_interval || - initial_state.size_limit != current_state.size_limit || initial_state.play_sound != current_state.play_sound || - initial_state.msg_format != current_state.msg_format || - initial_state.include_reply != current_state.include_reply) + initial_state.prefer_formatted_text != current_state.prefer_formatted_text || + (current_state.default_account && + (!initial_state.default_account || + strcmp (current_state.default_account, initial_state.default_account)!= 0))) return TRUE; else return FALSE; } +static gboolean +on_delete_event (GtkWidget *widget, + GdkEvent *event, + gpointer user_data) +{ + ModestGlobalSettingsDialogPrivate *priv; + ModestGlobalSettingsState current_state; + + priv = MODEST_GLOBAL_SETTINGS_DIALOG_GET_PRIVATE (user_data); + + /* If settings changed, them the response method already asked + the user, because it's always executed before (see + GtkDialog code). If it's not then simply close */ + get_current_settings (priv, ¤t_state); + return settings_changed (priv->initial_state, current_state); +} + static void on_response (GtkDialog *dialog, gint arg1, gpointer user_data) { ModestGlobalSettingsDialogPrivate *priv; - ModestGlobalSettingsState current_state; - gboolean changed; + ModestGlobalSettingsState current_state = {0,}; + gboolean changed = FALSE; priv = MODEST_GLOBAL_SETTINGS_DIALOG_GET_PRIVATE (user_data); @@ -473,30 +404,38 @@ on_response (GtkDialog *dialog, if (changed) { gboolean saved; - saved = _modest_global_settings_dialog_save_conf (MODEST_GLOBAL_SETTINGS_DIALOG (dialog)); + saved = modest_global_settings_dialog_save_settings (MODEST_GLOBAL_SETTINGS_DIALOG (dialog)); if (saved) { - modest_platform_run_information_dialog (GTK_WINDOW (user_data), - _("mcen_ib_advsetup_settings_saved")); + modest_platform_information_banner (NULL, NULL, + _("mcen_ib_advsetup_settings_saved")); } else { - modest_platform_run_information_dialog (GTK_WINDOW (user_data), - _("mail_ib_setting_failed")); + modest_platform_information_banner (NULL, NULL, + _("mail_ib_setting_failed")); } } } else { if (changed) { gint response; - response = modest_platform_run_confirmation_dialog (GTK_WINDOW (user_data), + response = modest_platform_run_confirmation_dialog (GTK_WINDOW (user_data), _("imum_nc_wizard_confirm_lose_changes")); /* Do not close if the user Cancels */ - if (response == GTK_RESPONSE_CANCEL) - g_signal_stop_emission_by_name (dialog, "response"); + if (response != GTK_RESPONSE_OK) + g_signal_stop_emission_by_name (user_data, "response"); } } } -static ModestConnectedVia +static ModestConnectedVia current_connection_default (void) { g_warning ("You must implement %s", __FUNCTION__); - g_return_val_if_reached (-1); + g_return_val_if_reached (MODEST_CONNECTED_VIA_ANY); +} + +gboolean +modest_global_settings_dialog_save_settings (ModestGlobalSettingsDialog *self) +{ + g_return_val_if_fail (MODEST_IS_GLOBAL_SETTINGS_DIALOG (self), FALSE); + + return MODEST_GLOBAL_SETTINGS_DIALOG_GET_CLASS(self)->save_settings_func (self); }