X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fhildon2%2Fmodest-easysetup-wizard-dialog.c;h=c092e6da9f3766aced4cde25769612fc19e1ee4c;hb=aabf935124d8b258b76b2296c8d75062a5e8fe74;hp=283e24aabef0dffb461a308a9d885148c0d3db4b;hpb=e25c92b48e4dea24d1fe19eed87292eebfb5b7f4;p=modest diff --git a/src/hildon2/modest-easysetup-wizard-dialog.c b/src/hildon2/modest-easysetup-wizard-dialog.c index 283e24a..c092e6d 100644 --- a/src/hildon2/modest-easysetup-wizard-dialog.c +++ b/src/hildon2/modest-easysetup-wizard-dialog.c @@ -103,6 +103,12 @@ struct _ModestEasysetupWizardDialogPrivate /* notebook pages: */ GtkWidget *page_welcome; + GtkWidget *check_support_progress; + gboolean check_support_done; + guint check_support_show_progress_id; + guint check_support_progress_pulse_id; + gint pending_check_support; + gboolean destroyed; GtkWidget *page_account_details; GtkWidget *account_country_picker; @@ -139,8 +145,16 @@ struct _ModestEasysetupWizardDialogPrivate static void save_to_settings (ModestEasysetupWizardDialog *self); static void real_enable_buttons (ModestWizardDialog *dialog, gboolean enable_next); +static void on_update_model (ModestWizardDialog *dialog); +static gboolean on_save (ModestWizardDialog *dialog); static GList* check_for_supported_auth_methods (ModestEasysetupWizardDialog* self); static gboolean check_has_supported_auth_methods(ModestEasysetupWizardDialog* self); +static void check_support_callback (ModestAccountProtocol *protocol, + gboolean supported, + gpointer userdata); +static void check_support_of_protocols (ModestEasysetupWizardDialog *self); +static gboolean check_support_show_progress (gpointer userdata); +static gboolean check_support_progress_pulse (gpointer userdata); static gboolean on_delete_event (GtkWidget *widget, @@ -162,6 +176,19 @@ on_easysetup_changed(GtkWidget* widget, ModestEasysetupWizardDialog* wizard) static void modest_easysetup_wizard_dialog_dispose (GObject *object) { + ModestEasysetupWizardDialogPrivate *priv = MODEST_EASYSETUP_WIZARD_DIALOG_GET_PRIVATE (object); + priv->destroyed = TRUE; + + if (priv->check_support_show_progress_id > 0) { + g_source_remove (priv->check_support_show_progress_id); + priv->check_support_show_progress_id = 0; + } + + if (priv->check_support_progress_pulse_id > 0) { + g_source_remove (priv->check_support_progress_pulse_id); + priv->check_support_progress_pulse_id = 0; + } + if (G_OBJECT_CLASS (modest_easysetup_wizard_dialog_parent_class)->dispose) G_OBJECT_CLASS (modest_easysetup_wizard_dialog_parent_class)->dispose (object); } @@ -171,10 +198,10 @@ modest_easysetup_wizard_dialog_finalize (GObject *object) { ModestEasysetupWizardDialog *self = MODEST_EASYSETUP_WIZARD_DIALOG (object); ModestEasysetupWizardDialogPrivate *priv = MODEST_EASYSETUP_WIZARD_DIALOG_GET_PRIVATE (self); - + if (priv->account_manager) g_object_unref (G_OBJECT (priv->account_manager)); - + if (priv->presets) modest_presets_destroy (priv->presets); @@ -185,7 +212,7 @@ modest_easysetup_wizard_dialog_finalize (GObject *object) modest_signal_mgr_disconnect_all_and_destroy (priv->missing_data_signals); priv->missing_data_signals = NULL; } - + G_OBJECT_CLASS (modest_easysetup_wizard_dialog_parent_class)->finalize (object); } @@ -220,16 +247,16 @@ static void invoke_enable_buttons_vfunc (ModestEasysetupWizardDialog *wizard_dialog) { ModestWizardDialogClass *klass = MODEST_WIZARD_DIALOG_GET_CLASS (wizard_dialog); - + /* Call the vfunc, which may be overridden by derived classes: */ if (klass->enable_buttons) { GtkNotebook *notebook = NULL; g_object_get (wizard_dialog, "wizard-notebook", ¬ebook, NULL); - + const gint current_page_num = gtk_notebook_get_current_page (notebook); if (current_page_num == -1) return; - + GtkWidget* current_page_widget = gtk_notebook_get_nth_page (notebook, current_page_num); (*(klass->enable_buttons))(MODEST_WIZARD_DIALOG (wizard_dialog), current_page_widget); } @@ -238,9 +265,28 @@ invoke_enable_buttons_vfunc (ModestEasysetupWizardDialog *wizard_dialog) static void on_caption_entry_changed (GtkEditable *editable, gpointer user_data) { - ModestEasysetupWizardDialog *self = MODEST_EASYSETUP_WIZARD_DIALOG (user_data); - g_assert(self); + ModestEasysetupWizardDialog *self; + gboolean mandatory, empty; + ModestEasysetupWizardDialogPrivate *priv; + + g_return_if_fail (user_data); + + self = MODEST_EASYSETUP_WIZARD_DIALOG (user_data); + priv = MODEST_EASYSETUP_WIZARD_DIALOG_GET_PRIVATE (self); + invoke_enable_buttons_vfunc(self); + + empty = !g_utf8_collate (gtk_entry_get_text (GTK_ENTRY (editable)), ""); + mandatory = ((GtkWidget *) editable == priv->entry_account_title) || + ((GtkWidget *) editable == priv->entry_user_username) || + ((GtkWidget *) editable == priv->entry_user_email); + + /* Show a banner & get focus */ + if (empty && mandatory) { + modest_platform_information_banner ((GtkWidget *) editable, NULL, + _CS("ckct_ib_enter_some_text")); + gtk_widget_grab_focus (GTK_WIDGET (editable)); + } } static void @@ -329,13 +375,20 @@ create_captioned (ModestEasysetupWizardDialog *self, static GtkWidget* create_page_welcome (ModestEasysetupWizardDialog *self) { - GtkWidget *box = gtk_vbox_new (FALSE, MODEST_MARGIN_NONE); - GtkWidget *label = gtk_label_new(_("mcen_ia_emailsetup_intro")); + GtkWidget *box; + GtkWidget *label; + ModestEasysetupWizardDialogPrivate *priv; + + priv = MODEST_EASYSETUP_WIZARD_DIALOG_GET_PRIVATE (self); + box = gtk_vbox_new (FALSE, MODEST_MARGIN_NONE); + label = gtk_label_new(_("mcen_ia_emailsetup_intro")); + priv->check_support_progress = gtk_progress_bar_new (); gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); /* So that it is not truncated: */ gtk_widget_set_size_request (label, LABELS_WIDTH, -1); gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0); gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0); + gtk_box_pack_end (GTK_BOX (box), priv->check_support_progress, FALSE, FALSE, 0); gtk_widget_show (label); gtk_widget_show (GTK_WIDGET (box)); return GTK_WIDGET (box); @@ -363,8 +416,7 @@ static void update_user_email_from_provider (ModestEasysetupWizardDialog *self) { ModestEasysetupWizardDialogPrivate *priv; - gchar* provider_id; - gchar* domain_name = NULL; + gchar* provider_id = NULL, *with_at = NULL; g_assert(self); priv = MODEST_EASYSETUP_WIZARD_DIALOG_GET_PRIVATE (self); @@ -372,18 +424,21 @@ update_user_email_from_provider (ModestEasysetupWizardDialog *self) /* Fill the providers combo, based on the selected country: */ provider_id = modest_provider_picker_get_active_provider_id ( MODEST_PROVIDER_PICKER (priv->account_serviceprovider_picker)); - - if(provider_id) - domain_name = modest_presets_get_domain (priv->presets, provider_id); - - if(!domain_name) - domain_name = g_strdup (MODEST_EXAMPLE_EMAIL_ADDRESS); - + + if (provider_id) { + gchar *domain_name = modest_presets_get_domain (priv->presets, provider_id); + with_at = g_strdup_printf ("%c%s", '@', domain_name); + g_free (domain_name); + } + + /* The sample address already contains the '@' */ + if (!with_at) + with_at = g_strdup (MODEST_EXAMPLE_EMAIL_ADDRESS); + if (priv->entry_user_email) - hildon_entry_set_text (HILDON_ENTRY (priv->entry_user_email), domain_name); - - g_free (domain_name); - + hildon_entry_set_text (HILDON_ENTRY (priv->entry_user_email), with_at); + + g_free (with_at); g_free (provider_id); } @@ -1071,24 +1126,11 @@ on_response_before (ModestWizardDialog *wizard_dialog, } } -typedef struct IdleData { - ModestEasysetupWizardDialog *dialog; - ModestPresets *presets; -} IdleData; - -static gboolean -presets_idle (gpointer userdata) +static void +fill_providers (ModestEasysetupWizardDialog *self) { - IdleData *idle_data = (IdleData *) userdata; - ModestEasysetupWizardDialog *self = MODEST_EASYSETUP_WIZARD_DIALOG (idle_data->dialog); ModestEasysetupWizardDialogPrivate *priv = MODEST_EASYSETUP_WIZARD_DIALOG_GET_PRIVATE (self); - g_assert (idle_data->presets); - - gdk_threads_enter (); - - priv->presets = idle_data->presets; - if (MODEST_IS_COUNTRY_PICKER (priv->account_country_picker)) { /* gint mcc = get_default_country_code(); */ gint mcc; @@ -1119,6 +1161,29 @@ presets_idle (gpointer userdata) priv->dirty = FALSE; +} + +typedef struct IdleData { + ModestEasysetupWizardDialog *dialog; + ModestPresets *presets; +} IdleData; + +static gboolean +presets_idle (gpointer userdata) +{ + IdleData *idle_data = (IdleData *) userdata; + ModestEasysetupWizardDialog *self = MODEST_EASYSETUP_WIZARD_DIALOG (idle_data->dialog); + ModestEasysetupWizardDialogPrivate *priv = MODEST_EASYSETUP_WIZARD_DIALOG_GET_PRIVATE (self); + + g_assert (idle_data->presets); + + gdk_threads_enter (); + + priv->presets = idle_data->presets; + + if (priv->check_support_done) + fill_providers (self); + g_object_unref (idle_data->dialog); g_free (idle_data); @@ -1239,6 +1304,11 @@ modest_easysetup_wizard_dialog_init (ModestEasysetupWizardDialog *self) g_object_ref (priv->account_manager); /* Initialize fields */ + priv->check_support_done = FALSE; + priv->check_support_show_progress_id = 0; + priv->check_support_progress_pulse_id = 0; + priv->pending_check_support = 0; + priv->destroyed = FALSE; priv->page_welcome = create_page_welcome (self); priv->page_account_details = create_page_account_details (self); @@ -1284,7 +1354,7 @@ modest_easysetup_wizard_dialog_init (ModestEasysetupWizardDialog *self) /* Reset dirty, because there was no user input until now */ priv->dirty = FALSE; - + /* 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 ( @@ -1295,6 +1365,8 @@ modest_easysetup_wizard_dialog_init (ModestEasysetupWizardDialog *self) g_thread_create (presets_loader, self, FALSE, NULL); priv->settings = modest_account_settings_new (); + + check_support_of_protocols (self); } ModestEasysetupWizardDialog* @@ -1779,7 +1851,7 @@ real_enable_buttons (ModestWizardDialog *dialog, gboolean enable_next) /* Get data */ priv = MODEST_EASYSETUP_WIZARD_DIALOG_GET_PRIVATE (dialog); g_object_get (dialog, "wizard-notebook", ¬ebook, NULL); - + /* Disable the Finish button until we are on the last page, * because HildonWizardDialog enables this for all but the * first page */ @@ -1796,8 +1868,12 @@ real_enable_buttons (ModestWizardDialog *dialog, gboolean enable_next) gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), MODEST_WIZARD_DIALOG_FINISH, FALSE); + + /* If the check support is not done then do not enable + the wizard to continue */ + enable_next = enable_next && priv->check_support_done; } - + gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), MODEST_WIZARD_DIALOG_NEXT, enable_next); @@ -1853,6 +1929,8 @@ modest_easysetup_wizard_dialog_class_init (ModestEasysetupWizardDialogClass *kla ModestWizardDialogClass *base_klass = (ModestWizardDialogClass*)(klass); base_klass->before_next = on_before_next; base_klass->enable_buttons = on_enable_buttons; + base_klass->update_model = on_update_model; + base_klass->save = on_save; } /** @@ -2102,6 +2180,33 @@ save_to_settings (ModestEasysetupWizardDialog *self) g_free (provider_id); } + +static void +on_update_model (ModestWizardDialog *dialog) +{ + ModestEasysetupWizardDialog *self = MODEST_EASYSETUP_WIZARD_DIALOG (dialog); + save_to_settings (self); + +} + +static gboolean +on_save (ModestWizardDialog *dialog) +{ + ModestEasysetupWizardDialog *self = MODEST_EASYSETUP_WIZARD_DIALOG (dialog); + ModestEasysetupWizardDialogPrivate *priv = MODEST_EASYSETUP_WIZARD_DIALOG_GET_PRIVATE (self); + + save_to_settings (self); + + if (modest_account_mgr_check_already_configured_account (priv->account_manager, priv->settings)) { + modest_platform_information_banner (NULL, NULL, _("mail_ib_setting_failed")); + return FALSE; + } + + return modest_account_mgr_add_account_from_settings (priv->account_manager, priv->settings); + +} + + static GList* check_for_supported_auth_methods (ModestEasysetupWizardDialog* self) { @@ -2171,3 +2276,119 @@ check_has_supported_auth_methods(ModestEasysetupWizardDialog* self) return TRUE; } +static gboolean +check_support_progress_pulse (gpointer userdata) +{ + ModestEasysetupWizardDialog *self = (ModestEasysetupWizardDialog *) userdata; + ModestEasysetupWizardDialogPrivate *priv = MODEST_EASYSETUP_WIZARD_DIALOG_GET_PRIVATE (self); + + if (priv->destroyed) { + priv->check_support_progress_pulse_id = 0; + return FALSE; + } + + gtk_progress_bar_pulse (GTK_PROGRESS_BAR (priv->check_support_progress)); + + return TRUE; +} + +static gboolean +check_support_show_progress (gpointer userdata) +{ + ModestEasysetupWizardDialog *self = (ModestEasysetupWizardDialog *) userdata; + ModestEasysetupWizardDialogPrivate *priv = MODEST_EASYSETUP_WIZARD_DIALOG_GET_PRIVATE (self); + + priv->check_support_show_progress_id = 0; + + if (priv->destroyed) + return FALSE; + + gtk_widget_show (priv->check_support_progress); + gtk_progress_bar_pulse (GTK_PROGRESS_BAR (priv->check_support_progress)); + + priv->check_support_progress_pulse_id = g_timeout_add (200, check_support_progress_pulse, self); + + return FALSE; +} + +static void +check_support_callback (ModestAccountProtocol *protocol, + gboolean supported, + gpointer userdata) +{ + ModestEasysetupWizardDialog *self = (ModestEasysetupWizardDialog *) userdata; + ModestEasysetupWizardDialogPrivate *priv = MODEST_EASYSETUP_WIZARD_DIALOG_GET_PRIVATE (self); + + priv->pending_check_support --; + + if (priv->check_support_show_progress_id > 0) { + g_source_remove (priv->check_support_show_progress_id); + priv->check_support_show_progress_id = 0; + } + + if (priv->check_support_progress_pulse_id > 0) { + g_source_remove (priv->check_support_progress_pulse_id); + priv->check_support_progress_pulse_id = 0; + } + + if (priv->pending_check_support == 0) { + priv->check_support_done = TRUE; + + if (!priv->destroyed) { + if (priv->presets) + fill_providers (self); + gtk_widget_hide (priv->check_support_progress); + invoke_enable_buttons_vfunc (self); + } + } + g_object_unref (self); +} + + +static void +check_support_of_protocols (ModestEasysetupWizardDialog *self) +{ + ModestProtocolRegistry *registry; + GSList *provider_protos, *node; + ModestEasysetupWizardDialogPrivate *priv = MODEST_EASYSETUP_WIZARD_DIALOG_GET_PRIVATE (self); + + registry = modest_runtime_get_protocol_registry (); + provider_protos = modest_protocol_registry_get_by_tag (registry, + MODEST_PROTOCOL_REGISTRY_PROVIDER_PROTOCOLS); + + for (node = provider_protos; node != NULL; node = g_slist_next (node)) { + ModestProtocol *proto = MODEST_PROTOCOL (node->data); + + if (!modest_protocol_registry_protocol_type_has_tag (registry, + modest_protocol_get_type_id (proto), + MODEST_PROTOCOL_REGISTRY_STORE_PROTOCOLS)) + continue; + + if (modest_protocol_registry_protocol_type_has_tag + (registry, + modest_protocol_get_type_id (proto), + MODEST_PROTOCOL_REGISTRY_SINGLETON_PROVIDER_PROTOCOLS)) { + /* Check if there's already an account configured with this account type */ + if (modest_account_mgr_singleton_protocol_exists (modest_runtime_get_account_mgr (), + modest_protocol_get_type_id (proto))) + continue; + } + + if (MODEST_ACCOUNT_PROTOCOL (proto)) { + priv->pending_check_support ++; + modest_account_protocol_check_support (MODEST_ACCOUNT_PROTOCOL (proto), + check_support_callback, + g_object_ref (self)); + } + } + g_slist_free (provider_protos); + + if (priv->pending_check_support > 0) { + priv->check_support_show_progress_id = g_timeout_add_full (G_PRIORITY_DEFAULT, 1000, + check_support_show_progress, + g_object_ref (self), g_object_unref); + } else { + priv->check_support_done = TRUE; + } + invoke_enable_buttons_vfunc (self); +}