X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fmaemo%2Fmodest-connection-specific-smtp-edit-window.c;h=f4047d18775b2040985fcd9b9ac088ebd0cc2f73;hb=30ec701bc2d1c270022e3543994f0221f6fb8b8c;hp=6303d848a02a02081782c548e84e641386ca0daa;hpb=3dd601be88c9190baf0f278f07aa7654874154c0;p=modest diff --git a/src/maemo/modest-connection-specific-smtp-edit-window.c b/src/maemo/modest-connection-specific-smtp-edit-window.c index 6303d84..f4047d1 100644 --- a/src/maemo/modest-connection-specific-smtp-edit-window.c +++ b/src/maemo/modest-connection-specific-smtp-edit-window.c @@ -40,6 +40,8 @@ #include #include #include +#include "modest-text-utils.h" +#include "modest-maemo-utils.h" #include @@ -63,6 +65,7 @@ struct _ModestConnectionSpecificSmtpEditWindowPrivate GtkWidget *button_cancel; gboolean is_dirty; + gboolean range_error_occured; }; static void @@ -128,9 +131,74 @@ on_change(GtkWidget* widget, ModestConnectionSpecificSmtpEditWindow *self) static void on_value_changed(GtkWidget* widget, GValue* value, ModestConnectionSpecificSmtpEditWindow *self) { + ModestConnectionSpecificSmtpEditWindowPrivate *priv = + CONNECTION_SPECIFIC_SMTP_EDIT_WINDOW_GET_PRIVATE (self); + + priv->range_error_occured = FALSE; on_change(widget, self); } +static gboolean +on_range_error (GtkWidget *widget, HildonNumberEditorErrorType type, gpointer user_data) +{ + ModestConnectionSpecificSmtpEditWindow *self = user_data; + ModestConnectionSpecificSmtpEditWindowPrivate *priv = + CONNECTION_SPECIFIC_SMTP_EDIT_WINDOW_GET_PRIVATE (self); + + /* We want to prevent the closure of the dialog when a range error occured. The problem is that + * the hildon number editor already resets the value to the default value, so we have to + * remember that such an error occured. */ + priv->range_error_occured = TRUE; + + /* Show error message by not returning TRUE */ + return FALSE; +} + +static void +on_response (GtkDialog *dialog, int response_id, gpointer user_data) +{ + const gchar *hostname; + ModestConnectionSpecificSmtpEditWindow *self = user_data; + ModestConnectionSpecificSmtpEditWindowPrivate *priv = + CONNECTION_SPECIFIC_SMTP_EDIT_WINDOW_GET_PRIVATE (self); + + hostname = gtk_entry_get_text (GTK_ENTRY (priv->entry_outgoingserver)); + + /* Don't close the dialog if a range error occured */ + if(priv->range_error_occured) + { + priv->range_error_occured = FALSE; + g_signal_stop_emission_by_name (dialog, "response"); + gtk_widget_grab_focus (priv->entry_port); + return; + } + + /* Don't close the dialog if a range error occured */ + if(response_id == GTK_RESPONSE_OK) { + if (hostname && (hostname[0] != '\0') && + (!modest_text_utils_validate_domain_name (hostname))) { + g_signal_stop_emission_by_name (dialog, "response"); + hildon_banner_show_information (NULL, NULL, _("mcen_ib_invalid_servername")); + gtk_widget_grab_focus (priv->entry_outgoingserver); + gtk_editable_select_region (GTK_EDITABLE (priv->entry_outgoingserver), 0, -1); + return; + } + } + +} + +static void on_set_focus_child (GtkContainer *container, GtkWidget *widget, gpointer user_data) +{ + ModestConnectionSpecificSmtpEditWindow *self = user_data; + ModestConnectionSpecificSmtpEditWindowPrivate *priv = + CONNECTION_SPECIFIC_SMTP_EDIT_WINDOW_GET_PRIVATE (self); + + /* Another child gained focus. Since the number editor already reset a + * possible range error to the default value, we allow closure of the + * dialog */ + priv->range_error_occured = FALSE; +} + static void on_combo_security_changed (GtkComboBox *widget, gpointer user_data) { @@ -238,9 +306,11 @@ modest_connection_specific_smtp_edit_window_init (ModestConnectionSpecificSmtpEd /* The port number widgets: */ if (!priv->entry_port) - priv->entry_port = GTK_WIDGET (hildon_number_editor_new (0, 65535)); + priv->entry_port = GTK_WIDGET (hildon_number_editor_new (1, 65535)); caption = hildon_caption_new (sizegroup, - _("mcen_li_emailsetup_smtp"), priv->entry_port, NULL, HILDON_CAPTION_OPTIONAL); + _("mcen_fi_emailsetup_port"), priv->entry_port, NULL, HILDON_CAPTION_OPTIONAL); + gtk_widget_add_events(GTK_WIDGET(priv->entry_port), GDK_FOCUS_CHANGE_MASK); + g_signal_connect(G_OBJECT(priv->entry_port), "range-error", G_CALLBACK(on_range_error), self); g_signal_connect(G_OBJECT(priv->entry_port), "notify::value", G_CALLBACK(on_value_changed), self); gtk_widget_show (priv->entry_port); gtk_box_pack_start (GTK_BOX (box), caption, FALSE, FALSE, MODEST_MARGIN_HALF); @@ -251,18 +321,25 @@ modest_connection_specific_smtp_edit_window_init (ModestConnectionSpecificSmtpEd on_combo_security_changed (GTK_COMBO_BOX (priv->combo_outgoing_security), self); /* 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); + gtk_dialog_add_button (GTK_DIALOG (self), _("mcen_bd_dialog_ok"), GTK_RESPONSE_OK); + gtk_dialog_add_button (GTK_DIALOG (self), _("mcen_bd_dialog_cancel"), GTK_RESPONSE_CANCEL); priv->is_dirty = FALSE; + priv->range_error_occured = FALSE; + g_signal_connect(G_OBJECT(self), "response", G_CALLBACK(on_response), self); + g_signal_connect(G_OBJECT(box), "set-focus-child", G_CALLBACK(on_set_focus_child), self); gtk_widget_show (box); /* When this window is shown, hibernation should not be possible, * because there is no sensible way to save the state: */ - modest_window_mgr_prevent_hibernation_while_window_is_shown ( - modest_runtime_get_window_mgr (), GTK_WINDOW (self)); + modest_window_mgr_prevent_hibernation_while_window_is_shown ( + modest_runtime_get_window_mgr (), GTK_WINDOW (self)); + + hildon_help_dialog_help_enable (GTK_DIALOG(self), + "applications_email_connectionspecificsmtpconf", + modest_maemo_utils_get_osso_context()); } ModestConnectionSpecificSmtpEditWindow* @@ -313,12 +390,22 @@ modest_connection_specific_smtp_edit_window_get_settings ( ModestConnectionSpecificSmtpEditWindow *window, ModestAccountMgr *account_manager) { - ModestConnectionSpecificSmtpEditWindowPrivate *priv = - CONNECTION_SPECIFIC_SMTP_EDIT_WINDOW_GET_PRIVATE (window); + ModestConnectionSpecificSmtpEditWindowPrivate *priv = NULL; + ModestServerAccountData *result = NULL; + const gchar *outgoing_server = NULL; + + priv = CONNECTION_SPECIFIC_SMTP_EDIT_WINDOW_GET_PRIVATE (window); + outgoing_server = gtk_entry_get_text (GTK_ENTRY (priv->entry_outgoingserver)); + + /* If the outgoing server is NULL, we are removing the connection specific + * settings */ + if ((outgoing_server == NULL) || (outgoing_server[0] == '\0')) { + return NULL; + } /* Use g_slice_new0(), because that's what modest_account_mgr_free_server_account_data() * expects us to use. */ - ModestServerAccountData *result = g_slice_new0 (ModestServerAccountData); + result = g_slice_new0 (ModestServerAccountData); result->hostname = g_strdup (gtk_entry_get_text (GTK_ENTRY (priv->entry_outgoingserver))); result->username = g_strdup (gtk_entry_get_text (GTK_ENTRY (priv->entry_user_username)));