/* * e-shell-startup-wizard.c * * Copyright (C) 2001 Ximian, Inc. * * This program is free software; you can redistribute it and/or * modify it under the terms of version 2 of the GNU General Public * License as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Authors: Iain Holmes */ #ifdef HAVE_CONFIG_H #include #endif #include "e-shell-startup-wizard.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include "importer/GNOME_Evolution_Importer.h" #include "e-timezone-dialog/e-timezone-dialog.h" #include "e-util/e-gtk-utils.h" #include #include "Evolution.h" typedef struct _TimezoneDialogPage { GtkWidget *page; GtkWidget *vbox; GtkObject *etd; } TimezoneDialogPage; typedef struct _ImportDialogPage { GtkWidget *page; GtkWidget *vbox; GList *importers; int running; gboolean prepared; } ImportDialogPage; typedef struct _MailDialogPage { GtkWidget *page; GtkWidget *vbox; GtkWidget *widget; Bonobo_Control control; } MailDialogPage; typedef struct _SWData { GladeXML *wizard; GtkWidget *dialog; GtkWidget *druid; GtkWidget *start, *finish; MailDialogPage *id_page; MailDialogPage *source_page; MailDialogPage *extra_page; MailDialogPage *transport_page; MailDialogPage *management_page; TimezoneDialogPage *timezone_page; ImportDialogPage *import_page; gboolean cancel; CORBA_Object mailer; Bonobo_EventSource event_source; BonoboListener *listener; int id; Bonobo_ConfigDatabase db; } SWData; typedef struct _IntelligentImporterData { CORBA_Object object; Bonobo_Control control; GtkWidget *widget; char *name; char *blurb; char *iid; } IntelligentImporterData; typedef struct _SelectedImporterData{ CORBA_Object importer; char *iid; } SelectedImporterData; static GHashTable *page_hash; static GList *page_list = NULL; static void druid_event_notify_cb (BonoboListener *listener, const char *name, BonoboArg *arg, CORBA_Environment *ev, SWData *data) { int buttons, pagenum; GnomeDruidPage *page; if (strcmp (name, EVOLUTION_WIZARD_SET_BUTTONS_SENSITIVE) == 0) { buttons = (int) *((CORBA_short *)arg->_value); gnome_druid_set_buttons_sensitive (GNOME_DRUID (data->druid), (buttons & 4) >> 2, (buttons & 2) >> 1, (buttons & 1)); } else if (strcmp (name, EVOLUTION_WIZARD_SET_SHOW_FINISH) == 0) { gnome_druid_set_show_finish (GNOME_DRUID (data->druid), (gboolean) *((CORBA_boolean *) arg->_value)); } else if (strcmp (name, EVOLUTION_WIZARD_SET_PAGE) == 0) { pagenum = (int) *((CORBA_short *) arg->_value); page = g_list_nth_data (page_list, pagenum); gnome_druid_set_page (GNOME_DRUID (data->druid), page); } } static void make_mail_dialog_pages (SWData *data) { CORBA_Environment ev; CORBA_Object object; CORBA_exception_init (&ev); data->mailer = oaf_activate_from_id ("OAFIID:GNOME_Evolution_Mail_Wizard", 0, NULL, &ev); if (BONOBO_EX (&ev)) { e_notice (NULL, GNOME_MESSAGE_BOX_ERROR, _("Could not start the Evolution Mailer Assistant interface\n(%s)"), CORBA_exception_id (&ev)); g_warning ("Could not start mailer (%s)", CORBA_exception_id (&ev)); CORBA_exception_free (&ev); data->mailer = CORBA_OBJECT_NIL; return; } CORBA_exception_free (&ev); if (data->mailer == CORBA_OBJECT_NIL) { e_notice (NULL, GNOME_MESSAGE_BOX_ERROR, _("Could not start the Evolution Mailer Assistant interface\n")); return; } CORBA_exception_init (&ev); data->event_source = Bonobo_Unknown_queryInterface (data->mailer, "IDL:Bonobo/EventSource:1.0", &ev); CORBA_exception_free (&ev); data->listener = bonobo_listener_new (NULL, NULL); gtk_signal_connect (GTK_OBJECT (data->listener), "event-notify", GTK_SIGNAL_FUNC (druid_event_notify_cb), data); object = bonobo_object_corba_objref (BONOBO_OBJECT (data->listener)); CORBA_exception_init (&ev); data->id = Bonobo_EventSource_addListener (data->event_source, object, &ev); CORBA_exception_free (&ev); } static int page_to_num (GnomeDruidPage *page) { return GPOINTER_TO_INT (g_hash_table_lookup (page_hash, page)); } static gboolean next_func (GnomeDruidPage *page, GnomeDruid *druid, SWData *data) { CORBA_Environment ev; int pagenum; CORBA_exception_init (&ev); pagenum = page_to_num (page); GNOME_Evolution_Wizard_notifyAction (data->mailer, pagenum, GNOME_Evolution_Wizard_NEXT, &ev); CORBA_exception_free (&ev); /* If on last page we own, let druid goto next page */ if (pagenum == g_list_length(page_list)-1) return FALSE; return TRUE; } static gboolean prepare_func (GnomeDruidPage *page, GnomeDruid *druid, SWData *data) { CORBA_Environment ev; int pagenum; CORBA_exception_init (&ev); pagenum = page_to_num (page); GNOME_Evolution_Wizard_notifyAction (data->mailer, pagenum, GNOME_Evolution_Wizard_PREPARE, &ev); CORBA_exception_free (&ev); return FALSE; } static gboolean back_func (GnomeDruidPage *page, GnomeDruid *druid, SWData *data) { CORBA_Environment ev; int pagenum; CORBA_exception_init (&ev); pagenum = page_to_num (page); GNOME_Evolution_Wizard_notifyAction (data->mailer, pagenum, GNOME_Evolution_Wizard_BACK, &ev); CORBA_exception_free (&ev); /* if we're on page 0, let the druid go back to the start page, if we have one */ if (pagenum == 0) return FALSE; return TRUE; } static void free_importers (SWData *data) { GList *l; for (l = data->import_page->importers; l; l = l->next) { IntelligentImporterData *iid; iid = l->data; if (iid->object != CORBA_OBJECT_NIL) { bonobo_object_release_unref (iid->object, NULL); } } g_list_free (data->import_page->importers); } static void start_importers (GList *p) { CORBA_Environment ev; for (; p; p = p->next) { SelectedImporterData *sid = p->data; CORBA_exception_init (&ev); GNOME_Evolution_IntelligentImporter_importData (sid->importer, &ev); if (BONOBO_EX (&ev)) { g_warning ("Error importing %s\n%s", sid->iid, CORBA_exception_id (&ev)); } CORBA_exception_free (&ev); } } static void do_import (SWData *data) { CORBA_Environment ev; GList *l, *selected = NULL; for (l = data->import_page->importers; l; l = l->next) { IntelligentImporterData *importer_data; SelectedImporterData *sid; char *iid; importer_data = l->data; iid = g_strdup (importer_data->iid); sid = g_new (SelectedImporterData, 1); sid->iid = iid; CORBA_exception_init (&ev); sid->importer = bonobo_object_dup_ref (importer_data->object, &ev); if (BONOBO_EX (&ev)) { g_warning ("Error duplication %s\n(%s)", iid, CORBA_exception_id (&ev)); g_free (iid); CORBA_exception_free (&ev); g_free (sid); continue; } CORBA_exception_free (&ev); selected = g_list_prepend (selected, sid); } free_importers (data); if (selected != NULL) { start_importers (selected); for (l = selected; l; l = l->next) { SelectedImporterData *sid = l->data; CORBA_exception_init (&ev); bonobo_object_release_unref (sid->importer, &ev); CORBA_exception_free (&ev); g_free (sid->iid); g_free (sid); } g_list_free (selected); } } static gboolean finish_func (GnomeDruidPage *page, GnomeDruid *druid, SWData *data) { CORBA_Environment ev; char *displayname, *tz; icaltimezone *zone; /* Notify mailer */ CORBA_exception_init (&ev); GNOME_Evolution_Wizard_notifyAction (data->mailer, 0, GNOME_Evolution_Wizard_FINISH, &ev); CORBA_exception_free (&ev); /* Set Timezone */ CORBA_exception_init (&ev); e_timezone_dialog_get_timezone (E_TIMEZONE_DIALOG (data->timezone_page->etd), &displayname); /* We know it is a builtin timezone, as that is all the user can change it to. */ zone = e_timezone_dialog_get_builtin_timezone (displayname); if (zone == NULL) tz = g_strdup ("UTC"); else tz = g_strdup (icaltimezone_get_location (zone)); bonobo_config_set_string (data->db, "/Calendar/Display/Timezone", tz, &ev); g_free (tz); CORBA_exception_free (&ev); do_import (data); /* Free data */ data->cancel = FALSE; /* Need to do this otherwise the timezone widget gets destroyed but the timezone object isn't, and we can get a crash like #22047. */ gtk_object_unref (GTK_OBJECT (data->timezone_page->etd)); data->timezone_page->etd = NULL; gtk_widget_destroy (data->dialog); gtk_main_quit (); return TRUE; } static void connect_page (GtkWidget *page, SWData *data) { gtk_signal_connect (GTK_OBJECT (page), "next", GTK_SIGNAL_FUNC (next_func), data); gtk_signal_connect (GTK_OBJECT (page), "prepare", GTK_SIGNAL_FUNC (prepare_func), data); gtk_signal_connect (GTK_OBJECT (page), "back", GTK_SIGNAL_FUNC (back_func), data); gtk_signal_connect (GTK_OBJECT (page), "finish", GTK_SIGNAL_FUNC (finish_func), data); } static MailDialogPage * make_identity_page (SWData *data) { MailDialogPage *page; CORBA_Environment ev; g_return_val_if_fail (data != NULL, NULL); g_return_val_if_fail (data->mailer != CORBA_OBJECT_NIL, NULL); page = g_new0 (MailDialogPage, 1); page->page = glade_xml_get_widget (data->wizard, "identity-page"); g_return_val_if_fail (page->page != NULL, NULL); connect_page (page->page, data); g_hash_table_insert (page_hash, page->page, GINT_TO_POINTER (0)); page_list = g_list_append (page_list, page->page); page->vbox = GNOME_DRUID_PAGE_STANDARD (page->page)->vbox; CORBA_exception_init (&ev); page->control = GNOME_Evolution_Wizard_getControl (data->mailer, 0, &ev); if (BONOBO_EX (&ev) || page->control == CORBA_OBJECT_NIL) { g_warning ("Error creating page: %s", CORBA_exception_id (&ev)); g_free (page); CORBA_exception_free (&ev); return NULL; } CORBA_exception_free (&ev); page->widget = bonobo_widget_new_control_from_objref (page->control, CORBA_OBJECT_NIL); gtk_box_pack_start (GTK_BOX (page->vbox), page->widget, TRUE, TRUE, 0); gtk_widget_show_all (page->widget); return page; } static MailDialogPage * make_receive_page (SWData *data) { MailDialogPage *page; CORBA_Environment ev; g_return_val_if_fail (data != NULL, NULL); g_return_val_if_fail (data->mailer != CORBA_OBJECT_NIL, NULL); page = g_new0 (MailDialogPage, 1); page->page = glade_xml_get_widget (data->wizard, "receive-page"); g_return_val_if_fail (page->page != NULL, NULL); connect_page (page->page, data); g_hash_table_insert (page_hash, page->page, GINT_TO_POINTER (1)); page_list = g_list_append (page_list, page->page); page->vbox = GNOME_DRUID_PAGE_STANDARD (page->page)->vbox; CORBA_exception_init (&ev); page->control = GNOME_Evolution_Wizard_getControl (data->mailer, 1, &ev); if (BONOBO_EX (&ev) || page->control == CORBA_OBJECT_NIL) { g_warning ("Error creating page: %s", CORBA_exception_id (&ev)); g_free (page); CORBA_exception_free (&ev); return NULL; } CORBA_exception_free (&ev); page->widget = bonobo_widget_new_control_from_objref (page->control, CORBA_OBJECT_NIL); gtk_box_pack_start (GTK_BOX (page->vbox), page->widget, TRUE, TRUE, 0); gtk_widget_show_all (page->widget); return page; } static MailDialogPage * make_extra_page (SWData *data) { MailDialogPage *page; CORBA_Environment ev; g_return_val_if_fail (data != NULL, NULL); g_return_val_if_fail (data->mailer != CORBA_OBJECT_NIL, NULL); page = g_new0 (MailDialogPage, 1); page->page = glade_xml_get_widget (data->wizard, "extra-page"); page_list = g_list_append (page_list, page->page); g_return_val_if_fail (page->page != NULL, NULL); connect_page (page->page, data); g_hash_table_insert (page_hash, page->page, GINT_TO_POINTER (2)); page->vbox = GNOME_DRUID_PAGE_STANDARD (page->page)->vbox; CORBA_exception_init (&ev); page->control = GNOME_Evolution_Wizard_getControl (data->mailer, 2, &ev); if (BONOBO_EX (&ev) || page->control == CORBA_OBJECT_NIL) { g_warning ("Error creating page: %s", CORBA_exception_id (&ev)); g_free (page); CORBA_exception_free (&ev); return NULL; } CORBA_exception_free (&ev); page->widget = bonobo_widget_new_control_from_objref (page->control, CORBA_OBJECT_NIL); gtk_box_pack_start (GTK_BOX (page->vbox), page->widget, TRUE, TRUE, 0); gtk_widget_show_all (page->widget); return page; } static MailDialogPage * make_transport_page (SWData *data) { MailDialogPage *page; CORBA_Environment ev; g_return_val_if_fail (data != NULL, NULL); g_return_val_if_fail (data->mailer != CORBA_OBJECT_NIL, NULL); page = g_new0 (MailDialogPage, 1); page->page = glade_xml_get_widget (data->wizard, "send-page"); g_return_val_if_fail (page->page != NULL, NULL); connect_page (page->page, data); g_hash_table_insert (page_hash, page->page, GINT_TO_POINTER (3)); page_list = g_list_append (page_list, page->page); page->vbox = GNOME_DRUID_PAGE_STANDARD (page->page)->vbox; CORBA_exception_init (&ev); page->control = GNOME_Evolution_Wizard_getControl (data->mailer, 3, &ev); if (BONOBO_EX (&ev) || page->control == CORBA_OBJECT_NIL) { g_warning ("Error creating page: %s", CORBA_exception_id (&ev)); g_free (page); CORBA_exception_free (&ev); return NULL; } CORBA_exception_free (&ev); page->widget = bonobo_widget_new_control_from_objref (page->control, CORBA_OBJECT_NIL); gtk_box_pack_start (GTK_BOX (page->vbox), page->widget, TRUE, TRUE, 0); gtk_widget_show_all (page->widget); return page; } static MailDialogPage * make_management_page (SWData *data) { MailDialogPage *page; CORBA_Environment ev; g_return_val_if_fail (data != NULL, NULL); g_return_val_if_fail (data->mailer != CORBA_OBJECT_NIL, NULL); page = g_new0 (MailDialogPage, 1); page->page = glade_xml_get_widget (data->wizard, "management-page"); g_return_val_if_fail (page->page != NULL, NULL); connect_page (page->page, data); g_hash_table_insert (page_hash, page->page, GINT_TO_POINTER (4)); page_list = g_list_append (page_list, page->page); page->vbox = GNOME_DRUID_PAGE_STANDARD (page->page)->vbox; CORBA_exception_init (&ev); page->control = GNOME_Evolution_Wizard_getControl (data->mailer, 4, &ev); if (BONOBO_EX (&ev) || page->control == CORBA_OBJECT_NIL) { g_warning ("Error creating page: %s", CORBA_exception_id (&ev)); g_free (page); CORBA_exception_free (&ev); return NULL; } CORBA_exception_free (&ev); page->widget = bonobo_widget_new_control_from_objref (page->control, CORBA_OBJECT_NIL); gtk_box_pack_start (GTK_BOX (page->vbox), page->widget, TRUE, TRUE, 0); gtk_widget_show_all (page->widget); return page; } static TimezoneDialogPage * make_timezone_page (SWData *data) { TimezoneDialogPage *page; ETimezoneDialog *etd; g_return_val_if_fail (data != NULL, NULL); page = g_new0 (TimezoneDialogPage, 1); page->page = glade_xml_get_widget (data->wizard, "timezone-page"); g_return_val_if_fail (page->page != NULL, NULL); page->vbox = GTK_WIDGET (GNOME_DRUID_PAGE_STANDARD (page->page)->vbox); etd = e_timezone_dialog_new (); page->etd = GTK_OBJECT (etd); e_timezone_dialog_reparent (E_TIMEZONE_DIALOG (page->etd), page->vbox); return page; } static GList * get_intelligent_importers (void) { OAF_ServerInfoList *info_list; GList *iids_ret = NULL; CORBA_Environment ev; int i; CORBA_exception_init (&ev); info_list = oaf_query ("repo_ids.has ('IDL:GNOME/Evolution/IntelligentImporter:1.0')", NULL, &ev); CORBA_exception_free (&ev); for (i = 0; i < info_list->_length; i++) { const OAF_ServerInfo *info; info = info_list->_buffer + i; iids_ret = g_list_prepend (iids_ret, g_strdup (info->iid)); } return iids_ret; } static gboolean prepare_importer_page (GnomeDruidPage *page, GnomeDruid *druid, SWData *data) { GtkWidget *dialog; ImportDialogPage *import; GList *l, *importers; GtkWidget *table; int running = 0; if (data->import_page->prepared == TRUE) { return TRUE; } data->import_page->prepared = TRUE; dialog = gnome_message_box_new (_("Please wait...\nScanning for existing setups"), GNOME_MESSAGE_BOX_INFO, NULL); e_make_widget_backing_stored (dialog); gtk_window_set_title (GTK_WINDOW (dialog), _("Starting Intelligent Importers")); gtk_widget_show_all (dialog); gtk_widget_show_now (dialog); gtk_widget_queue_draw (dialog); gdk_flush (); while (gtk_events_pending ()) { gtk_main_iteration (); } import = data->import_page; importers = get_intelligent_importers (); if (importers == NULL) { /* No importers, go directly to finish, do not pass go Do not collect $200 */ gnome_druid_set_page (druid, GNOME_DRUID_PAGE (data->finish)) ; gtk_widget_destroy (dialog); return TRUE; } table = gtk_table_new (g_list_length (importers), 2, FALSE); for (l = importers; l; l = l->next) { GtkWidget *label; IntelligentImporterData *id; CORBA_Environment ev; gboolean can_run; char *str; id = g_new0 (IntelligentImporterData, 1); id->iid = g_strdup (l->data); CORBA_exception_init (&ev); id->object = oaf_activate_from_id ((char *) id->iid, 0, NULL, &ev); if (BONOBO_EX (&ev)) { g_warning ("Could not start %s:%s", id->iid, CORBA_exception_id (&ev)); CORBA_exception_free (&ev); /* Clean up the IID */ g_free (id->iid); g_free (id); continue; } if (id->object == CORBA_OBJECT_NIL) { g_warning ("Could not activate component %s", id->iid); CORBA_exception_free (&ev); g_free (id->iid); g_free (id); continue; } can_run = GNOME_Evolution_IntelligentImporter_canImport (id->object, &ev); if (BONOBO_EX (&ev)) { g_warning ("Could not call canImport(%s): %s", id->iid, CORBA_exception_id (&ev)); bonobo_object_release_unref (id->object, &ev); CORBA_exception_free (&ev); g_free (id->iid); g_free (id); continue; } if (can_run == FALSE) { bonobo_object_release_unref (id->object, &ev); CORBA_exception_free (&ev); g_free (id->iid); g_free (id); continue; } running++; id->name = GNOME_Evolution_IntelligentImporter__get_importername (id->object, &ev); if (BONOBO_EX (&ev)) { g_warning ("Could not get name(%s): %s", id->iid, CORBA_exception_id (&ev)); bonobo_object_release_unref (id->object, &ev); CORBA_exception_free (&ev); g_free (id->iid); g_free (id); continue; } id->blurb = GNOME_Evolution_IntelligentImporter__get_message (id->object, &ev); if (BONOBO_EX (&ev)) { g_warning ("Could not get message(%s): %s", id->iid, CORBA_exception_id (&ev)); bonobo_object_release_unref (id->object, &ev); CORBA_exception_free (&ev); g_free (id->iid); CORBA_free (id->name); g_free (id); continue; } id->control = Bonobo_Unknown_queryInterface (id->object, "IDL:Bonobo/Control:1.0", &ev); if (BONOBO_EX (&ev)) { g_warning ("Could not QI for Bonobo/Control:1.0 %s:%s", id->iid, CORBA_exception_id (&ev)); bonobo_object_release_unref (id->object, &ev); CORBA_exception_free (&ev); g_free (id->iid); CORBA_free (id->name); CORBA_free (id->blurb); continue; } if (id->control != CORBA_OBJECT_NIL) { id->widget = bonobo_widget_new_control_from_objref (id->control, CORBA_OBJECT_NIL); gtk_widget_show (id->widget); } else { id->widget = gtk_label_new (""); gtk_widget_show (id->widget); } CORBA_exception_free (&ev); import->importers = g_list_prepend (import->importers, id); str = g_strdup_printf (_("From %s:"), id->name); label = gtk_label_new (str); g_free (str); gtk_misc_set_alignment (GTK_MISC (label), 0, .5); gtk_table_attach (GTK_TABLE (table), label, 0, 1, running - 1, running, GTK_FILL, 0, 0, 0); gtk_table_attach (GTK_TABLE (table), id->widget, 1, 2, running - 1, running, GTK_FILL, 0, 3, 0); gtk_widget_show_all (table); gtk_box_pack_start (GTK_BOX (data->import_page->vbox), table, FALSE, FALSE, 0); } if (running == 0) { gnome_druid_set_page (druid, GNOME_DRUID_PAGE (data->finish)); gtk_widget_destroy (dialog); return TRUE; } import->running = running; gtk_widget_destroy (dialog); return FALSE; } static ImportDialogPage * make_importer_page (SWData *data) { ImportDialogPage *page; GtkWidget *label, *sep; g_return_val_if_fail (data != NULL, NULL); page = g_new0 (ImportDialogPage, 1); page->page = glade_xml_get_widget (data->wizard, "import-page"); g_return_val_if_fail (page->page != NULL, NULL); gtk_signal_connect (GTK_OBJECT (page->page), "prepare", GTK_SIGNAL_FUNC (prepare_importer_page), data); page->vbox = GNOME_DRUID_PAGE_STANDARD (page->page)->vbox; gtk_container_set_border_width (GTK_CONTAINER (page->vbox), 4); label = gtk_label_new (_("Please select the information that you would like to import:")); gtk_box_pack_start (GTK_BOX (page->vbox), label, FALSE, FALSE, 3); sep = gtk_hseparator_new (); gtk_box_pack_start (GTK_BOX (page->vbox), sep, FALSE, FALSE, 3); page->prepared = FALSE; return page; } static void startup_wizard_cancel (GnomeDruid *druid, SWData *data) { /* Free data */ data->cancel = TRUE; if (data->timezone_page->etd != NULL) { /* Need to do this otherwise the timezone widget gets destroyed but the timezone object isn't, and we can get a crash like #22047. */ gtk_object_unref (GTK_OBJECT (data->timezone_page->etd)); data->timezone_page->etd = NULL; } gtk_widget_destroy (data->dialog); gtk_main_quit (); } gboolean e_shell_startup_wizard_create (void) { SWData *data; CORBA_Environment ev; int num_accounts; data = g_new0 (SWData, 1); CORBA_exception_init (&ev); data->db = bonobo_get_object ("wombat:", "Bonobo/ConfigDatabase", &ev); if (BONOBO_EX (&ev) || data->db == CORBA_OBJECT_NIL) { g_warning ("Error starting wombat: (%s)", CORBA_exception_id (&ev)); CORBA_exception_free (&ev); g_free (data); return FALSE; } num_accounts = bonobo_config_get_long_with_default (data->db, "/Mail/Accounts/num", 0, NULL); CORBA_exception_free (&ev); if (num_accounts != 0) { bonobo_object_release_unref (data->db, NULL); g_free (data); return TRUE; } data->wizard = glade_xml_new (EVOLUTION_GLADEDIR "/evolution-startup-wizard.glade", NULL); g_return_val_if_fail (data->wizard != NULL, FALSE); data->dialog = glade_xml_get_widget (data->wizard, "startup-wizard"); g_return_val_if_fail (data->dialog != NULL, FALSE); gtk_window_set_wmclass (GTK_WINDOW (data->dialog), "startup-wizard", "Evolution:shell"); page_hash = g_hash_table_new (NULL, NULL); data->druid = glade_xml_get_widget (data->wizard, "startup-druid"); g_return_val_if_fail (data->druid != NULL, FALSE); gnome_druid_set_buttons_sensitive (GNOME_DRUID (data->druid), FALSE, TRUE, FALSE); gtk_signal_connect (GTK_OBJECT (data->druid), "cancel", GTK_SIGNAL_FUNC (startup_wizard_cancel), data); data->start = glade_xml_get_widget (data->wizard, "start-page"); data->finish = glade_xml_get_widget (data->wizard, "done-page"); g_return_val_if_fail (data->start != NULL, FALSE); g_return_val_if_fail (data->finish != NULL, FALSE); gtk_signal_connect (GTK_OBJECT (data->finish), "finish", GTK_SIGNAL_FUNC (finish_func), data); make_mail_dialog_pages (data); g_return_val_if_fail (data->mailer != CORBA_OBJECT_NIL, TRUE); data->id_page = make_identity_page (data); data->source_page = make_receive_page (data); data->extra_page = make_extra_page (data); data->transport_page = make_transport_page (data); data->management_page = make_management_page (data); data->timezone_page = make_timezone_page (data); data->import_page = make_importer_page (data); g_return_val_if_fail (data->id_page != NULL, TRUE); g_return_val_if_fail (data->source_page != NULL, TRUE); g_return_val_if_fail (data->extra_page != NULL, TRUE); g_return_val_if_fail (data->transport_page != NULL, TRUE); g_return_val_if_fail (data->management_page != NULL, TRUE); g_return_val_if_fail (data->timezone_page != NULL, TRUE); g_return_val_if_fail (data->import_page != NULL, TRUE); gnome_druid_set_buttons_sensitive (GNOME_DRUID (data->druid), FALSE, TRUE, TRUE); gtk_widget_show_all (data->dialog); gtk_main (); /* Sync database */ Bonobo_ConfigDatabase_sync (data->db, &ev); bonobo_object_release_unref (data->db, NULL); CORBA_exception_free (&ev); return !data->cancel; } deletions'>-1/+5 * Suggest people use 1.2.x instead of 1.0.x.Joe Shaw2003-02-122-1/+6 * Use gtk_window_set_resizable() instead of gtk_window_set_policy().Jeffrey Stedfast2003-02-126-35/+25 * Register a destroy virtual method. (mail_accounts_tab_destroy): SetJeffrey Stedfast2003-02-125-29/+51 * Set mail_display->destroyed = TRUE. This is a workaround for theJeffrey Stedfast2003-02-123-13/+15 * Instead of simply ignoring bad chars, return the sentinal invalid charNot Zed2003-02-112-5/+11 * Don't try to make an error string from an uninitialized GnomeVFSResult.Hans Petter Jansson2003-02-112-4/+15 * [ fixes bug #33066 ] new function (set_entry_changed_signals): callChris Toshok2003-02-113-46/+92 * Use g_signal_emit() rather than gtk_signal_emit(). (build_flat): SameJeffrey Stedfast2003-02-1112-63/+63 * rewrite to use etta (find_next_in_range): helper func to search a range ofMike Kestner2003-02-111-25/+22 * Split the ORBit IDL compilation rules to work properly with parallelEttore Perazzoli2003-02-113-13/+39 * Split the IDL generated rules so ${ORBIT_IDL}Ettore Perazzoli2003-02-112-4/+17 * Make the CORBA IDL compilation work with parallel makes. Likewise.Ettore Perazzoli2003-02-114-19/+61 * (libeutil_static_la_DEPENDENCIES): MakeEttore Perazzoli2003-02-112-6/+18 * Install load-pine-addressbook and load-gnomecard-addressbook intoEttore Perazzoli2003-02-114-9/+36 * (libical_static_la_DEPENDENCIES): MakeEttore Perazzoli2003-02-102-1/+12 * Add LDFLAGS to ported libsRodney Dawes2003-02-102-0/+10 * look in the http cache for images when saving (image_save_as): removeLarry Ewing2003-02-102-24/+40 * gone. (match_initials): gone. (book_query_sexp): remove the primaryChris Toshok2003-02-105-52/+44 * lots of changes here. should be a big performance gain. god i hope this isChris Toshok2003-02-102-228/+110 * ignore test-completion.Chris Toshok2003-02-1011-713/+239 * Update Czech translation, remove some obsolete stringsMiloslav Trmac2003-02-092-883/+158 * Unmarked some strings which are unsuitable for translationKwok-Koon Cheung2003-02-091-3/+3 * fix length calculation. (create_folder_directory): remove alloca usage,Larry Ewing2003-02-092-3/+9 * Add missing files and remove non-existant one. Mark incorrectly translatedAbel Cheung2003-02-097-8/+18 * [ huge change, all for 1 little performance problem :) fixes #18207 ] useChris Toshok2003-02-0816-148/+244 * [ huge change, all for 1 little performance problem :) fixes #18207 ] useChris Toshok2003-02-088-46/+243 * add an activate handler that returns a response OK if the OK responseLarry Ewing2003-02-082-0/+25 * remove this file, as it's generated now Add this file to generate theRodney Dawes2003-02-083-3/+13 * Updating Amharic translation.Daniel Yacob2003-02-082-2437/+2532 * privlibexecdir not evolibexecdir for the server fileRodney Dawes2003-02-082-1/+5 * don't use random memory as a gconf client.Larry Ewing2003-02-082-0/+6 * Use g_object_new() instead of gtk_type_new().Jeffrey Stedfast2003-02-089-16/+38 * Fix installation of desktop/mime filesRodney Dawes2003-02-082-4/+9 * Fixes #37706Rodrigo Moya2003-02-082-2/+25 * Added missing files to .cvsignore and AC_PREREQ to configure.in.Christian Neumair2003-02-073-0/+9 * replaced deprecated calls (gtk_menu_append -> gtk_menu_shell_append andRadek Doulik2003-02-071-2/+2 * track change to e_book_load_uri type.Chris Toshok2003-02-072-3/+6 * check the status, not the book, and unref the book here.Chris Toshok2003-02-0718-139/+131 * Add fr to ALL_LINGUAS again.Ettore Perazzoli2003-02-072-1/+5 * (on_right_click): UseEttore Perazzoli2003-02-072-1/+7 * (control_activate): GetEttore Perazzoli2003-02-073-2/+7 * Use e_auto_kill_popup_menu_on_selection_done() instead ofEttore Perazzoli2003-02-073-2/+10 * Use different tmp file names so these rules can be executed in parallelEttore Perazzoli2003-02-074-24/+64 * (e_auto_kill_popup_menu_on_selection_done): Rename fromEttore Perazzoli2003-02-072-25/+28 * Fix KRB4_CFLAGS to work correctly Fix desktop file installation path UseRodney Dawes2003-02-074-4/+13 * Updated Czech translationMichal Bukovjan2003-02-072-687/+737 * Updated Czech translation.Michal Bukovjan2003-02-071-10622/+8641 * index bound bug (insert_children): prepend/reverse for nowMike Kestner2003-02-071-16/+27 * Set response_ids on the OK/Cancel buttonsDan Winship2003-02-072-0/+7 * show the widget before returning it.Dan Winship2003-02-072-1/+8 * Fix EVOLUTION_ICONSDIRDan Winship2003-02-072-2/+3 * add EVOLUTION_PRIVDATADIRDan Winship2003-02-079-9/+25 * AC_SUBST privlibdir, privincludedir, privdatadir (sent from ../configure).Dan Winship2003-02-076-34/+36 * export priv*dir for libical's configure to use.Dan Winship2003-02-072-0/+5 * Fix typo in previous commitDan Winship2003-02-072-1/+5 * add missing datadir=Dan Winship2003-02-071-0/+1 * s/PACKAGE/GETTEXT_PACKAGE/ in gettext initDan Winship2003-02-0719-24/+55 * s/wombat/evolution-wombat/Dan Winship2003-02-071-2/+2 * Remove -L${libdir}. (CFlags): s/includedir/privincludedir/Dan Winship2003-02-074-7/+18 * remove soundsdir defDan Winship2003-02-072-2/+2 * subst in $(toolsdir) instead of $(bindir)Dan Winship2003-02-073-8/+14 * cleanupDan Winship2003-02-072-6/+5 * use viewsdirDan Winship2003-02-075-12/+16 * Use privdatadir Likewise. Likewise. Likewise. Likewise. Likewise.Dan Winship2003-02-0710-21/+33 * Remove *dir defs that are in configure.in now (INCLUDES): clean up usingDan Winship2003-02-074-38/+44 * clean upDan Winship2003-02-069-11/+36 * remove imagesdir, etc, which are now defined in configure.inDan Winship2003-02-062-4/+6 * clean up, update, etcDan Winship2003-02-065-27/+33 * use POINTER_STRING_BOOL for activate_shortcut.Michael Zucci2003-02-064-3/+13 * add an activate handler to the entry so that hitting return will return anLarry Ewing2003-02-062-0/+13 * Added NONE,STRING,STRING,STRINGNot Zed2003-02-063-1/+9 * We want to copy whats in the default user dir, not the default user dir.Not Zed2003-02-062-1/+6 * use the parent path to find the parent node rather than the row, which isNot Zed2003-02-061-3/+4 * makefile and warnings fixesDan Winship2003-02-061-0/+105 * Update this some although it's not currently being builtDan Winship2003-02-061-6/+4 * Remove cruft. Rename ICONSDIR to IMAGESDIR. (gladedir, etspecdir,Dan Winship2003-02-0613-41/+35 * Use privlibexecdir. (INCLUDES): Remove cruft. (gladedir, serversdir):Dan Winship2003-02-063-19/+11 * Remove cruft. Rename ICONSDIR to IMAGESDIR. (gladedir, etspecdir): RemoveDan Winship2003-02-066-20/+11 * Define in terms of privincludedirDan Winship2003-02-063-8/+4 * Remove cruft. (libcal_utilincludedir): Define in terms of privincludedirDan Winship2003-02-061-2/+1 * Remove cruft. (pcsincludedir): Define in terms of privincludedirDan Winship2003-02-062-3/+1 * update Makefile.ams and fix a lot of warningsDan Winship2003-02-061-0/+143 * Remove cruftDan Winship2003-02-061-2/+1 * Remove cruft, rename ICONSDIR to IMAGESDIR. (serverdir, gladedir): RemoveDan Winship2003-02-064-35/+29 * Remove cruft. (serverdir, gladedir, etspecdir): Remove definitionsDan Winship2003-02-064-10/+2 * Remove cruft. (gladedir, etspecdir): Remove definitions. (glade_DATA):Dan Winship2003-02-067-31/+30 * Remove cruft. Define in terms of privdatadirDan Winship2003-02-062-3/+1 * Remove cruft, s/ICONSDIR/IMAGESDIR/ (gladedir, etspecdir): RemoveDan Winship2003-02-063-12/+7 * Remove some cruft. rename ICONSDIR to IMAGESDIR. (images_DATA): InstallDan Winship2003-02-065-32/+22 * Define in terms of privdatadir. (gladedir): Defined in configure.in now.Dan Winship2003-02-064-5/+4 * Remove cruft (ldapschemadir): Use privdatadir (pasincludedir): UseDan Winship2003-02-063-5/+2 * Remove cruft. (libebookincludedir): Use privincludedir.Dan Winship2003-02-069-20/+33 * Define in terms of privincludedirDan Winship2003-02-062-1/+6 * Defined in configure.in now (filterdir): Define using privdatadirDan Winship2003-02-062-2/+6 * Define in terms of privincludedir. (camellibexecdir): Define in terms ofDan Winship2003-02-068-15/+25 * Define EVOLUTION_IMAGES using $(imagesdir). Define EVOLUTION_GLADEDIRDan Winship2003-02-0616-38/+71 * Remove unneeded MAP_DIR define. (gladedir): Remove. Defined inDan Winship2003-02-063-2/+9 * Define MAP_DIR in terms of $(imagesdir). (widgetsincludedir): Define inDan Winship2003-02-062-2/+7 * define in terms of privincludedir.Dan Winship2003-02-0613-17/+40 * use privdatadirDan Winship2003-02-062-2/+5 * Define and AC_SUBST privlibexecdir, privdatadir, privincludedir,Dan Winship2003-02-062-28/+37 * Split out the mailto handling code from here so we can use it in theJeffrey Stedfast2003-02-062-36/+60 * add cal-recur.cDan Winship2003-02-062-0/+5 * s/BonoboXObject/BonoboObject/Dan Winship2003-02-063-8/+11 * s/BonoboXObject/BonoboObject/Dan Winship2003-02-063-6/+10 * s/BonoboXObject/BonoboObject/Dan Winship2003-02-065-18/+24 * array of localized month day names ("1st" - "31st")Dan Winship2003-02-067-75/+294 * s/glade_gnome_init/glade_init/Dan Winship2003-02-062-1/+5 * s/glade_gnome_init/glade_init/Dan Winship2003-02-063-2/+9 * Replace deprecated glade_gnome_init() with glade_init().Dan Winship2003-02-065-4/+15 * Replace deprecated glade_gnome_init() call with glade_init().Dan Winship2003-02-062-2/+2 * define and AC_SUBST privlibexecdir.Dan Winship2003-02-063-3/+26 * ru.po: Updated Russian translation from Russian team <gnome-cyr@gnome.org>.Dmitry Mastrukov2003-02-052-4899/+5161 * make GAL_LIBS use -lgal-2.0 remove extraneous GTK_LIBS reference update toMike Kestner2003-02-055-874/+613 * Init bag->owner to 0.Not Zed2003-02-052-63/+76 * re-enable. (prepare_importer_page): re-enable importer code.Not Zed2003-02-054-41/+34 * update from ../../importers/. (main): Removed.Not Zed2003-02-056-15/+3661 * The CVS server exited after applying everything from my last commit,Hans Petter2003-02-051-10/+22 * Rename to e_meeting_time_selector_on_invite_others_button_expose() andHans Petter Jansson2003-02-052-9/+26 * Use g_ascii_strdown() instead of g_strdown, since g_strdown is deprecated.Jeffrey Stedfast2003-02-058-41/+79 * thx to Baris, adjust phrasing in assorted places. tiny fixes, basically.Aaron Weber2003-02-052-7/+20 * Fix badly formatted ChangeLog entry. This has been bothering me since itHans Petter2003-02-051-2/+2 * Use PangoLayout to draw text.Hans Petter Jansson2003-02-052-12/+23 * Update AC_DEFINEs to use the new syntax to make acconfig.h unnecessary.Dan Winship2003-02-054-92/+45 * fixed button/text mismatchesJeffrey Stedfast2003-02-051-17/+17 * removed broken stringsJeffrey Stedfast2003-02-051-301/+335 * updated for e scroll frame --> gtk scrolled windowRadek Doulik2003-02-0514-95/+92 * replaced e scroll frame with gtk scrolled windowRadek Doulik2003-02-055-23/+21 * Updated it.po (style fixies)Marco Ciampa2003-02-052-67/+72 * add gnome-vfs-module-2.0 to the deps so we pick up the right include path.Chris Toshok2003-02-042-1/+6 * remove the --enable-shlib-components stuff.Chris Toshok2003-02-042-39/+8 * [ pull forward Jack Jia's fix for #34900 ] use a weak ref for the fileChris Toshok2003-02-042-9/+15 * pull forward Jack Jia's fix for #33672, but convert it to use unlinkChris Toshok2003-02-042-13/+22 * Get the thread_subject setting here instead of in regen_list_regen sinceJeffrey Stedfast2003-02-042-7/+13 * Just use gnome_vfs_get_mime_type_from_name() so we can forget all the crapJeffrey Stedfast2003-02-041-9/+7 * ops, buildJeffrey Stedfast2003-02-041-5/+2 * Just use gnome_vfs_get_mime_type_from_name().Jeffrey Stedfast2003-02-042-21/+8 * Just use gnome_vfs_get_mime_type_from_name() so we can forget all the crapJeffrey Stedfast2003-02-043-19/+29 * Updating Amharic translation.Daniel Yacob2003-02-042-8/+12 * Updates evolution/po/ChangeLog evolution/po/da.poKeld Jørn Simonsen2003-02-022-1752/+1884 * Updated Spanish translation from Francisco J FernandezGerman Poo-Caaman~o2003-02-022-2528/+2589 * Skip setting the "font_gdk" arg for now.Hans Petter Jansson2003-02-026-0/+29 * Use Pango to draw. (e_calendar_item_class_init): Add font_desc andHans Petter Jansson2003-02-024-17/+106 * Don't request combo boxes that are 0 pixels tall. (position_date_popup):Hans Petter Jansson2003-02-022-12/+29 * Just use gtk_widget_destroy as the G_CALLBACK function.Jeffrey Stedfast2003-02-021-14/+5 * Give gnome_vfs_get_uri_from_local_path a full path.Jeffrey Stedfast2003-02-022-10/+31 * Make .server file point to where wombat is now installed.Hans Petter Jansson2003-02-022-1/+6 * Uodates from Søren evolution/po/ChangeLog evolution/po/da.poKeld Jørn Simonsen2003-02-022-8260/+7000 * Small fix of it.poMarco Ciampa2003-02-022-12/+16 * gtk_widget_destroy the menu rather than g_object_unref'ing it.Jeffrey Stedfast2003-02-011-1/+1 * New function to return a cached list of labels.Jeffrey Stedfast2003-02-017-178/+210 * some fix of it.po fileMarco Ciampa2003-02-012-3/+7 * 30 January 2003, Aaron Weber <aaron@ximian.com>Aaron Weber2003-01-318-522/+253 * Fixes #35572Ronald Kuetemeier2003-01-312