diff options
Diffstat (limited to 'mail/mail-config.c')
-rw-r--r-- | mail/mail-config.c | 204 |
1 files changed, 152 insertions, 52 deletions
diff --git a/mail/mail-config.c b/mail/mail-config.c index bb03b65225..33d94de315 100644 --- a/mail/mail-config.c +++ b/mail/mail-config.c @@ -58,8 +58,10 @@ struct _MailDialogIdentityPage GtkWidget *address; GtkWidget *org; GtkWidget *sig; - IdentityPageCallback cb; - gpointer data; + IdentityPageCallback undonecb; + gpointer undonedata; + IdentityPageCallback donecb; + gpointer donedata; }; typedef struct @@ -90,6 +92,8 @@ struct _MailDialogServicePage MailDialogServicePageItem *spitem; ServicePageCallback changedcb; gpointer changeddata; + ServicePageCallback undonecb; + gpointer undonedata; ServicePageCallback donecb; gpointer donedata; }; @@ -139,8 +143,11 @@ typedef struct GtkWidget *dialog; GtkWidget *druid; MailDialogIdentityPage *idpage; + gboolean iddone; MailDialogSourcePage *spage; + gboolean sdone; MailDialogTransportPage *tpage; + gboolean tdone; } MailDruidDialog; typedef struct @@ -662,9 +669,11 @@ identity_page_changed (GtkWidget *widget, MailDialogIdentityPage *page) name = gtk_editable_get_chars (GTK_EDITABLE (page->name), 0, -1); addr = gtk_editable_get_chars (GTK_EDITABLE (page->address), 0, -1); - if (addr && name && page->cb) - page->cb (page, page->data); - + if (addr && *addr && name && *name && page->donecb) + page->donecb (page, page->donedata); + else if (page->undonecb) + page->undonecb (page, page->undonedata); + g_free (name); g_free (addr); } @@ -684,11 +693,19 @@ identity_page_extract (MailDialogIdentityPage *page) } static void +identity_page_set_undone_cb (MailDialogIdentityPage *page, + IdentityPageCallback cb, gpointer data) +{ + page->undonecb = cb; + page->undonedata = data; +} + +static void identity_page_set_done_cb (MailDialogIdentityPage *page, IdentityPageCallback cb, gpointer data) { - page->cb = cb; - page->data = data; + page->donecb = cb; + page->donedata = data; } static MailDialogIdentityPage * @@ -1090,6 +1107,8 @@ service_page_item_changed (GtkWidget *item, MailDialogServicePage *page) if (complete && page->donecb) { page->donecb (page, page->donedata); + } else if (!complete && page->undonecb) { + page->undonecb (page, page->undonedata); } } @@ -1281,11 +1300,22 @@ service_page_set_changed_cb (MailDialogServicePage *page, } static void +service_page_set_undone_cb (MailDialogServicePage *page, + ServicePageCallback cb, gpointer data) +{ + page->undonecb = cb; + page->undonedata = data; +} + +static void service_page_set_done_cb (MailDialogServicePage *page, ServicePageCallback cb, gpointer data) { page->donecb = cb; page->donedata = data; + + /* In case its already done */ + service_page_item_changed (page->spitem->item, page); } static MailDialogServicePage * @@ -1381,7 +1411,7 @@ news_page_new (GSList *sources) MailDialogNewsPage *page = g_new0 (MailDialogNewsPage, 1); GtkWidget *html; - page->page = service_page_new ("Mail source type:", sources); + page->page = service_page_new ("News source type:", sources); page->vbox = page->page->vbox; html = html_new (FALSE); @@ -1405,7 +1435,7 @@ transport_page_new (GSList *transports) MailDialogTransportPage *page = g_new0 (MailDialogTransportPage, 1); GtkWidget *html; - page->page = service_page_new ("Mail source type:", transports); + page->page = service_page_new ("Mail transport type:", transports); page->vbox = page->page->vbox; html = html_new (FALSE); @@ -1424,6 +1454,14 @@ transport_page_new (GSList *transports) /* Identity dialog */ static void +iddialog_page_undone (MailDialogIdentityPage *page, gpointer data) +{ + MailDialogIdentity *iddialog = (MailDialogIdentity *)data; + + gnome_dialog_set_sensitive (GNOME_DIALOG (iddialog->dialog), 0, FALSE); +} + +static void iddialog_page_done (MailDialogIdentityPage *page, gpointer data) { MailDialogIdentity *iddialog = (MailDialogIdentity *)data; @@ -1468,10 +1506,15 @@ identity_dialog (const MailConfigIdentity *id, GtkWidget *parent) /* Get the identity widget */ iddialog->page = identity_page_new (id); - identity_page_set_done_cb (iddialog->page, iddialog_page_done, - iddialog); gtk_box_pack_start (GTK_BOX (dialog_vbox), iddialog->page->vbox, TRUE, TRUE, 0); + + identity_page_set_undone_cb (iddialog->page, + iddialog_page_undone, + iddialog); + identity_page_set_done_cb (iddialog->page, + iddialog_page_done, + iddialog); gtk_widget_show (iddialog->page->vbox); /* Buttons */ @@ -1504,6 +1547,14 @@ identity_dialog (const MailConfigIdentity *id, GtkWidget *parent) /* Source Dialog */ static void +sdialog_page_undone (MailDialogServicePage *page, gpointer data) +{ + MailDialogSource *sdialog = (MailDialogSource *)data; + + gnome_dialog_set_sensitive (GNOME_DIALOG (sdialog->dialog), 0, FALSE); +} + +static void sdialog_page_done (MailDialogServicePage *page, gpointer data) { MailDialogSource *sdialog = (MailDialogSource *)data; @@ -1553,10 +1604,15 @@ source_dialog (MailConfigService *source, GtkWidget *parent) sdialog->page = source_page_new (sources); if (!new) service_page_set_url (sdialog->page->page, source); - service_page_set_done_cb (sdialog->page->page, - sdialog_page_done, sdialog); gtk_box_pack_start (GTK_BOX (dialog_vbox), sdialog->page->vbox, TRUE, TRUE, 0); + + service_page_set_undone_cb (sdialog->page->page, + sdialog_page_undone, + sdialog); + service_page_set_done_cb (sdialog->page->page, + sdialog_page_done, + sdialog); gtk_widget_show (sdialog->page->vbox); /* Buttons */ @@ -1590,6 +1646,14 @@ source_dialog (MailConfigService *source, GtkWidget *parent) /* News Dialog */ static void +ndialog_page_undone (MailDialogServicePage *page, gpointer data) +{ + MailDialogNews *ndialog = (MailDialogNews *)data; + + gnome_dialog_set_sensitive (GNOME_DIALOG (ndialog->dialog), 0, FALSE); +} + +static void ndialog_page_done (MailDialogServicePage *page, gpointer data) { MailDialogNews *ndialog = (MailDialogNews *)data; @@ -1637,10 +1701,15 @@ news_dialog (MailConfigService *source, GtkWidget *parent) /* Get the identity widget */ ndialog->page = news_page_new (news); service_page_set_url (ndialog->page->page, source); - service_page_set_done_cb (ndialog->page->page, - ndialog_page_done, ndialog); gtk_box_pack_start (GTK_BOX (dialog_vbox), ndialog->page->vbox, TRUE, TRUE, 0); + + service_page_set_undone_cb (ndialog->page->page, + ndialog_page_undone, + ndialog); + service_page_set_done_cb (ndialog->page->page, + ndialog_page_done, + ndialog); gtk_widget_show (ndialog->page->vbox); /* Buttons */ @@ -1672,52 +1741,70 @@ news_dialog (MailConfigService *source, GtkWidget *parent) } /* Mail configuration druid */ - -/* static gboolean */ -/* mail_druid_identity_next (GnomeDruidPage *page, gpointer arg1, */ -/* MailDruidDialog *dialog) */ -/* { */ -/* char *addr, *at; */ - -/* FIXME: we need more sanity checking than this. */ - -/* addr = gtk_editable_get_chars (GTK_EDITABLE (dialog->idpage->address), */ -/* 0, -1); */ -/* at = strchr (addr, '@'); */ -/* if (!at || !strchr (at + 1, '.')) { */ -/* error_dialog (GTK_WIDGET (page), "Email address must be " */ -/* "of the form \"user@domain\"."); */ -/* return TRUE; */ -/* } */ -/* g_free (addr); */ - -/* dialog->id = identity_page_extract (dialog->idpage); */ - -/* return FALSE; */ -/* } */ - static gboolean -mail_druid_prepare (GnomeDruidPage *page, GnomeDruid *druid, gpointer data) +mail_druid_prepare (GnomeDruidPage *page, GnomeDruid *druid, gboolean *active) { - gnome_druid_set_buttons_sensitive (druid, TRUE, FALSE, TRUE); + gnome_druid_set_buttons_sensitive (druid, TRUE, *active, TRUE); return FALSE; } static void +mail_druid_identity_undone (MailDialogIdentityPage *page, gpointer data) +{ + MailDruidDialog *dialog = (MailDruidDialog *) data; + + dialog->iddone = FALSE; + gnome_druid_set_buttons_sensitive (GNOME_DRUID (dialog->druid), + TRUE, FALSE, TRUE); +} + +static void mail_druid_identity_done (MailDialogIdentityPage *page, gpointer data) { MailDruidDialog *dialog = (MailDruidDialog *) data; + dialog->iddone = TRUE; gnome_druid_set_buttons_sensitive (GNOME_DRUID (dialog->druid), TRUE, TRUE, TRUE); } static void -mail_druid_service_done (MailDialogServicePage *page, gpointer data) +mail_druid_source_undone (MailDialogServicePage *page, gpointer data) +{ + MailDruidDialog *dialog = (MailDruidDialog *) data; + + dialog->sdone = FALSE; + gnome_druid_set_buttons_sensitive (GNOME_DRUID (dialog->druid), + TRUE, FALSE, TRUE); +} + +static void +mail_druid_source_done (MailDialogServicePage *page, gpointer data) { MailDruidDialog *dialog = (MailDruidDialog *) data; + dialog->sdone = TRUE; + gnome_druid_set_buttons_sensitive (GNOME_DRUID (dialog->druid), + TRUE, TRUE, TRUE); +} + +static void +mail_druid_transport_undone (MailDialogServicePage *page, gpointer data) +{ + MailDruidDialog *dialog = (MailDruidDialog *) data; + + dialog->tdone = FALSE; + gnome_druid_set_buttons_sensitive (GNOME_DRUID (dialog->druid), + TRUE, FALSE, TRUE); +} + +static void +mail_druid_transport_done (MailDialogServicePage *page, gpointer data) +{ + MailDruidDialog *dialog = (MailDruidDialog *) data; + + dialog->tdone = TRUE; gnome_druid_set_buttons_sensitive (GNOME_DRUID (dialog->druid), TRUE, TRUE, TRUE); } @@ -1794,15 +1881,19 @@ mail_config_druid (void) gnome_druid_page_standard_set_logo (dpage, identity_logo); dialog->idpage = identity_page_new (NULL); - identity_page_set_done_cb (dialog->idpage, - mail_druid_identity_done, - dialog); gtk_box_pack_start (GTK_BOX (dpage->vbox), dialog->idpage->vbox, TRUE, TRUE, 0); + identity_page_set_undone_cb (dialog->idpage, + mail_druid_identity_undone, + dialog); + identity_page_set_done_cb (dialog->idpage, + mail_druid_identity_done, + dialog); gtk_signal_connect (GTK_OBJECT (dpage), "prepare", - GTK_SIGNAL_FUNC (mail_druid_prepare), dialog); + GTK_SIGNAL_FUNC (mail_druid_prepare), + &dialog->iddone); gtk_widget_show (dialog->idpage->vbox); /* Source page */ @@ -1810,14 +1901,19 @@ mail_config_druid (void) gnome_druid_page_standard_set_logo (dpage, source_logo); dialog->spage = source_page_new (sources); - service_page_set_done_cb (dialog->spage->page, - mail_druid_service_done, dialog); gtk_box_pack_start (GTK_BOX (dpage->vbox), dialog->spage->vbox, TRUE, TRUE, 0); + service_page_set_done_cb (dialog->spage->page, + mail_druid_source_done, + dialog); + service_page_set_undone_cb (dialog->spage->page, + mail_druid_source_undone, + dialog); gtk_signal_connect (GTK_OBJECT (dpage), "prepare", - GTK_SIGNAL_FUNC (mail_druid_prepare), dialog); + GTK_SIGNAL_FUNC (mail_druid_prepare), + &dialog->sdone); gtk_widget_show (dialog->spage->vbox); /* Transport page */ @@ -1825,15 +1921,19 @@ mail_config_druid (void) gnome_druid_page_standard_set_logo (dpage, transport_logo); dialog->tpage = transport_page_new (transports); - service_page_set_done_cb (dialog->tpage->page, - mail_druid_service_done, dialog); gtk_box_pack_start (GTK_BOX (dpage->vbox), dialog->tpage->vbox, TRUE, TRUE, 0); + service_page_set_undone_cb (dialog->tpage->page, + mail_druid_transport_undone, + dialog); + service_page_set_done_cb (dialog->tpage->page, + mail_druid_transport_done, + dialog); gtk_signal_connect (GTK_OBJECT (dpage), "prepare", GTK_SIGNAL_FUNC (mail_druid_prepare), - dialog); + &dialog->tdone); gtk_widget_show (dialog->tpage->vbox); |