X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fmaemo%2Fmodest-connection-specific-smtp-edit-window.c;h=4ea4209f0f552eff2b28eefd42a13d019c203930;hb=addd1287234fa35a521c56e6d6472de35739b3a2;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..4ea4209 100644 --- a/src/maemo/modest-connection-specific-smtp-edit-window.c +++ b/src/maemo/modest-connection-specific-smtp-edit-window.c @@ -40,6 +40,7 @@ #include #include #include +#include "modest-text-utils.h" #include @@ -63,6 +64,7 @@ struct _ModestConnectionSpecificSmtpEditWindowPrivate GtkWidget *button_cancel; gboolean is_dirty; + gboolean range_error_occured; }; static void @@ -128,9 +130,71 @@ 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(response_id == GTK_RESPONSE_OK) { + if (!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; + } + } + + /* Don't close the dialog if a range error occured */ + if(response_id == GTK_RESPONSE_OK && priv->range_error_occured) + { + g_signal_stop_emission_by_name (dialog, "response"); + gtk_widget_grab_focus (priv->entry_port); + 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 +302,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); @@ -255,13 +321,16 @@ modest_connection_specific_smtp_edit_window_init (ModestConnectionSpecificSmtpEd gtk_dialog_add_button (GTK_DIALOG (self), GTK_STOCK_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_window_mgr_prevent_hibernation_while_window_is_shown ( modest_runtime_get_window_mgr (), GTK_WINDOW (self)); }