diff options
Diffstat (limited to 'shell/e-shell-importer.c')
-rw-r--r-- | shell/e-shell-importer.c | 507 |
1 files changed, 483 insertions, 24 deletions
diff --git a/shell/e-shell-importer.c b/shell/e-shell-importer.c index 42de414c3b..eeda75024f 100644 --- a/shell/e-shell-importer.c +++ b/shell/e-shell-importer.c @@ -42,6 +42,9 @@ #include <liboaf/liboaf.h> +#include <bonobo/bonobo-exception.h> +#include <bonobo/bonobo-widget.h> + #include "e-shell.h" #include "e-shell-view.h" #include "e-local-storage.h" /* for E_LOCAL_STORAGE_NAME */ @@ -68,6 +71,20 @@ typedef struct _ImportDialogFilePage { gboolean need_filename; } ImportDialogFilePage; +typedef struct _ImportDialogTypePage { + GtkWidget *vbox; + GtkWidget *intelligent; + GtkWidget *file; +} ImportDialogTypePage; + +typedef struct _ImportDialogImporterPage { + GtkWidget *vbox; + + GList *importers; + gboolean prepared; + int running; +} ImportDialogImporterPage; + typedef struct _ImportData { EShell *shell; EShellView *view; @@ -76,12 +93,34 @@ typedef struct _ImportData { GtkWidget *dialog; GtkWidget *druid; ImportDialogFilePage *filepage; + ImportDialogTypePage *typepage; + ImportDialogImporterPage *importerpage; + GtkWidget *filedialog; + GtkWidget *typedialog; + GtkWidget *intelligent; + GnomeDruidPageStart *start; + GnomeDruidPageFinish *finish; GtkWidget *vbox; char *choosen_iid; } ImportData; +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; + /* #define IMPORTER_DEBUG */ @@ -98,11 +137,17 @@ static struct { char *name; char *text; } info[] = { + { "type_html", + N_("Choose the type of importer to run") + }, { "file_html", N_("Choose the file that you want to import into Evolution, " "and select what type of file it is from the list.\n\n" "You can select \"Automatic\" if you do not know, and " "Evolution will attempt to work it out.") + }, + { "intelligent_html", + N_("Please select the information that you would like to import") } }; static int num_info = (sizeof (info) / sizeof (info[0])); @@ -549,7 +594,7 @@ static ImportDialogFilePage * importer_file_page_new (ImportData *data) { ImportDialogFilePage *page; - GtkWidget *table, *label, *widget; + GtkWidget *table, *label; int row = 0; page = g_new0 (ImportDialogFilePage, 1); @@ -594,6 +639,229 @@ importer_file_page_new (ImportData *data) return page; } +static ImportDialogTypePage * +importer_type_page_new (ImportData *data) +{ + ImportDialogTypePage *page; + + page = g_new0 (ImportDialogTypePage, 1); + + page->vbox = gtk_vbox_new (FALSE, 5); + page->intelligent = gtk_radio_button_new_with_label (NULL, + _("Import data and settings from older programs")); + gtk_box_pack_start (GTK_BOX (page->vbox), page->intelligent, FALSE, FALSE, 0); + + page->file = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (page->intelligent), + _("Import a single file")); + gtk_box_pack_start (GTK_BOX (page->vbox), page->file, FALSE, FALSE, 0); + gtk_widget_show_all (page->vbox); + return page; +} + +static ImportDialogImporterPage * +importer_importer_page_new (ImportData *data) +{ + ImportDialogImporterPage *page; + GtkWidget *sep; + + page = g_new0 (ImportDialogImporterPage, 1); + + page->vbox = gtk_vbox_new (FALSE, 5); + gtk_container_set_border_width (GTK_CONTAINER (page->vbox), 4); + + sep = gtk_hseparator_new (); + gtk_box_pack_start (GTK_BOX (page->vbox), sep, FALSE, FALSE, 0); + + page->prepared = FALSE; + gtk_widget_show_all (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_intelligent_page (GnomeDruid *druid, + GnomeDruidPage *page, + ImportData *data) +{ + GtkWidget *dialog; + ImportDialogImporterPage *import; + GList *l, *importers; + GtkWidget *table; + int running = 0; + + if (data->importerpage->prepared == TRUE) { + return TRUE; + } + + data->importerpage->prepared = TRUE; + + dialog = gnome_message_box_new (_("Please wait...\nScanning for existing setups"), GNOME_MESSAGE_BOX_INFO, NULL); + gtk_window_set_title (GTK_WINDOW (dialog), _("Starting Intelligent Importers")); + gtk_widget_show_all (dialog); + while (gtk_events_pending ()) { + gtk_main_iteration (); + } + + import = data->importerpage; + importers = get_intelligent_importers (); + if (importers == NULL) { + /* No importers, go directly to finish, do not pass go + Do not collect $200 */ + import->running = 0; + 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_table_attach (GTK_TABLE (table), label, 0, 1, running - 1, + running, 0, 0, 0, 0); + gtk_table_attach (GTK_TABLE (table), id->widget, 1, 2, + running - 1, running, 0, 0, 0, 0); + gtk_widget_show_all (table); + + gtk_box_pack_start (GTK_BOX (data->importerpage->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 void import_druid_cancel (GnomeDruid *druid, ImportData *data) @@ -635,25 +903,116 @@ folder_cancelled (EShellFolderSelectionDialog *dialog, } static void +free_importers (ImportData *data) +{ + GList *l; + + for (l = data->importerpage->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->importerpage->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 (ImportData *data) +{ + CORBA_Environment ev; + GList *l, *selected = NULL; + + for (l = data->importerpage->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 void import_druid_finish (GnomeDruidPage *page, GnomeDruid *druid, ImportData *data) { GtkWidget *folder; - folder = e_shell_folder_selection_dialog_new (data->shell, - _("Select folder"), - _("Select a destination folder for importing this data"), - e_shell_view_get_current_uri (data->view), - NULL, NULL); - - gtk_signal_connect (GTK_OBJECT (folder), "folder_selected", - GTK_SIGNAL_FUNC (folder_selected), data); - gtk_signal_connect (GTK_OBJECT (folder), "cancelled", - GTK_SIGNAL_FUNC (folder_cancelled), data); - - gtk_widget_hide (data->dialog); - gtk_widget_show (folder); + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->typepage->intelligent))) { + do_import (data); + gtk_widget_destroy (data->dialog); + } else { + folder = e_shell_folder_selection_dialog_new (data->shell, + _("Select folder"), + _("Select a destination folder for importing this data"), + e_shell_view_get_current_uri (data->view), + NULL, NULL); + + gtk_signal_connect (GTK_OBJECT (folder), "folder_selected", + GTK_SIGNAL_FUNC (folder_selected), data); + gtk_signal_connect (GTK_OBJECT (folder), "cancelled", + GTK_SIGNAL_FUNC (folder_cancelled), data); + + gtk_widget_hide (data->dialog); + gtk_widget_show (folder); + } } static gboolean @@ -667,6 +1026,74 @@ prepare_file_page (GnomeDruidPage *page, return FALSE; } +static gboolean +next_file_page (GnomeDruidPage *page, + GnomeDruid *druid, + ImportData *data) +{ + gnome_druid_set_page (druid, GNOME_DRUID_PAGE (data->finish)); + return TRUE; +} + +static gboolean +back_file_page (GnomeDruidPage *page, + GnomeDruid *druid, + ImportData *data) +{ + gnome_druid_set_page (druid, GNOME_DRUID_PAGE (data->typedialog)); + return TRUE; +} + +static gboolean +next_type_page (GnomeDruidPage *page, + GnomeDruid *druid, + ImportData *data) +{ + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->typepage->intelligent))) { + gnome_druid_set_page (druid, GNOME_DRUID_PAGE (data->intelligent)); + } else { + gnome_druid_set_page (druid, GNOME_DRUID_PAGE (data->filedialog)); + } + + return TRUE; +} + +static gboolean +back_finish_page (GnomeDruidPage *page, + GnomeDruid *druid, + ImportData *data) +{ + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->typepage->intelligent))) { + if (data->importerpage->running != 0) { + gnome_druid_set_page (druid, GNOME_DRUID_PAGE (data->intelligent)); + } else { + gnome_druid_set_page (druid, GNOME_DRUID_PAGE (data->typedialog)); + } + } else { + gnome_druid_set_page (druid, GNOME_DRUID_PAGE (data->filedialog)); + } + + return TRUE; +} + +static gboolean +back_intelligent_page (GnomeDruidPage *page, + GnomeDruid *druid, + ImportData *data) +{ + gnome_druid_set_page (druid, GNOME_DRUID_PAGE (data->typedialog)); + return TRUE; +} + +static gboolean +next_intelligent_page (GnomeDruidPage *page, + GnomeDruid *druid, + ImportData *data) +{ + gnome_druid_set_page (druid, GNOME_DRUID_PAGE (data->finish)); + return TRUE; +} + /* Hack to change the Finish button */ static void druid_finish_button_change (GnomeDruid *druid) @@ -695,8 +1122,6 @@ show_import_wizard (BonoboUIComponent *component, const char *cname) { ImportData *data = g_new0 (ImportData, 1); - GnomeDruidPageStart *start; - GnomeDruidPageFinish *finish; GtkWidget *html; data->view = E_SHELL_VIEW (user_data); @@ -712,24 +1137,58 @@ show_import_wizard (BonoboUIComponent *component, GTK_SIGNAL_FUNC (import_druid_cancel), data); druid_finish_button_change (GNOME_DRUID (data->druid)); - start = GNOME_DRUID_PAGE_START (glade_xml_get_widget (data->wizard, "page1")); - data->filedialog = glade_xml_get_widget (data->wizard, "page2"); + data->start = GNOME_DRUID_PAGE_START (glade_xml_get_widget (data->wizard, "page0")); + + data->typedialog = glade_xml_get_widget (data->wizard, "page1"); + gtk_signal_connect (GTK_OBJECT (data->typedialog), "next", + GTK_SIGNAL_FUNC (next_type_page), data); + data->typepage = importer_type_page_new (data); + html = create_html ("type_html"); + gtk_box_pack_start (GTK_BOX (data->typepage->vbox), html, FALSE, TRUE, 0); + gtk_box_reorder_child (GTK_BOX (data->typepage->vbox), html, 0); + + gtk_box_pack_start (GTK_BOX (GNOME_DRUID_PAGE_STANDARD (data->typedialog)->vbox), data->typepage->vbox, TRUE, TRUE, 0); + + + + data->intelligent = glade_xml_get_widget (data->wizard, "page2-intelligent"); + gtk_signal_connect (GTK_OBJECT (data->intelligent), "next", + GTK_SIGNAL_FUNC (next_intelligent_page), data); + gtk_signal_connect (GTK_OBJECT (data->intelligent), "back", + GTK_SIGNAL_FUNC (back_intelligent_page), data); + gtk_signal_connect (GTK_OBJECT (data->intelligent), "prepare", + GTK_SIGNAL_FUNC (prepare_intelligent_page), data); + + data->importerpage = importer_importer_page_new (data); + html = create_html ("intelligent_html"); + gtk_box_pack_start (GTK_BOX (data->importerpage->vbox), html, FALSE, TRUE, 0); + gtk_box_reorder_child (GTK_BOX (data->importerpage->vbox), html, 0); + + gtk_box_pack_start (GTK_BOX (GNOME_DRUID_PAGE_STANDARD (data->intelligent)->vbox), data->importerpage->vbox, TRUE, TRUE, 0); + + + data->filedialog = glade_xml_get_widget (data->wizard, "page2-file"); gtk_signal_connect (GTK_OBJECT (data->filedialog), "prepare", GTK_SIGNAL_FUNC (prepare_file_page), data); + gtk_signal_connect (GTK_OBJECT (data->filedialog), "next", + GTK_SIGNAL_FUNC (next_file_page), data); + gtk_signal_connect (GTK_OBJECT (data->filedialog), "back", + GTK_SIGNAL_FUNC (back_file_page), data); - finish = GNOME_DRUID_PAGE_FINISH (glade_xml_get_widget (data->wizard, "page3")); + data->finish = GNOME_DRUID_PAGE_FINISH (glade_xml_get_widget (data->wizard, "page3")); + gtk_signal_connect (GTK_OBJECT (data->finish), "back", + GTK_SIGNAL_FUNC (back_finish_page), data); data->filepage = importer_file_page_new (data); - data->vbox = data->filepage->vbox; html = create_html ("file_html"); - gtk_box_pack_start (GTK_BOX (data->vbox), html, FALSE, TRUE, 0); - gtk_box_reorder_child (GTK_BOX (data->vbox), html, 0); + gtk_box_pack_start (GTK_BOX (data->filepage->vbox), html, FALSE, TRUE, 0); + gtk_box_reorder_child (GTK_BOX (data->filepage->vbox), html, 0); - gtk_box_pack_start (GTK_BOX (GNOME_DRUID_PAGE_STANDARD (data->filedialog)->vbox), data->vbox, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (GNOME_DRUID_PAGE_STANDARD (data->filedialog)->vbox), data->filepage->vbox, TRUE, TRUE, 0); /* Finish page */ - gtk_signal_connect (GTK_OBJECT (finish), "finish", + gtk_signal_connect (GTK_OBJECT (data->finish), "finish", GTK_SIGNAL_FUNC (import_druid_finish), data); gtk_signal_connect (GTK_OBJECT (data->dialog), "destroy", GTK_SIGNAL_FUNC (import_druid_destroy), data); |