diff options
Diffstat (limited to 'calendar/gui/dialogs/comp-editor-util.c')
-rw-r--r-- | calendar/gui/dialogs/comp-editor-util.c | 248 |
1 files changed, 248 insertions, 0 deletions
diff --git a/calendar/gui/dialogs/comp-editor-util.c b/calendar/gui/dialogs/comp-editor-util.c index 0e4384dca4..8ef7aebbab 100644 --- a/calendar/gui/dialogs/comp-editor-util.c +++ b/calendar/gui/dialogs/comp-editor-util.c @@ -23,11 +23,16 @@ #include <config.h> #endif +#include <ctype.h> #include <string.h> #include <ical.h> #include <glib.h> #include <libgnome/gnome-defs.h> #include <libgnome/gnome-i18n.h> +#include <liboaf/liboaf.h> +#include <bonobo/bonobo-control.h> +#include <bonobo/bonobo-widget.h> +#include <e-destination.h> #include <e-util/e-time-utils.h> #include <cal-util/timeutil.h> #include "../calendar-config.h" @@ -224,3 +229,246 @@ comp_editor_get_current_time (GtkObject *object, gpointer data) return tmp_tm; } + + + +/* + * These are utility functions to handle the SelectNames control we use + * for the contacts field, and its related dialog. + */ + +#define SELECT_NAMES_OAFID "OAFIID:GNOME_Evolution_Addressbook_SelectNames" + +GNOME_Evolution_Addressbook_SelectNames +comp_editor_create_contacts_component (void) +{ + GNOME_Evolution_Addressbook_SelectNames corba_select_names; + CORBA_Environment ev; + + CORBA_exception_init (&ev); + corba_select_names = oaf_activate_from_id (SELECT_NAMES_OAFID, 0, + NULL, &ev); + + /* OAF seems to be broken -- it can return a CORBA_OBJECT_NIL without + raising an exception in `ev'. */ + if (ev._major != CORBA_NO_EXCEPTION + || corba_select_names == CORBA_OBJECT_NIL) { + g_warning ("Cannot activate -- %s", SELECT_NAMES_OAFID); + CORBA_exception_free (&ev); + return CORBA_OBJECT_NIL; + } + + CORBA_exception_free (&ev); + + return corba_select_names; +} + + +GtkWidget * +comp_editor_create_contacts_control (GNOME_Evolution_Addressbook_SelectNames corba_select_names) +{ + Bonobo_Control corba_control; + GtkWidget *control_widget; + CORBA_Environment ev; + char *name = _("Contacts"); + + CORBA_exception_init (&ev); + + GNOME_Evolution_Addressbook_SelectNames_addSection ( + corba_select_names, name, name, &ev); + if (ev._major != CORBA_NO_EXCEPTION) { + CORBA_exception_free (&ev); + return NULL; + } + + corba_control = + GNOME_Evolution_Addressbook_SelectNames_getEntryBySection ( + corba_select_names, name, &ev); + + if (ev._major != CORBA_NO_EXCEPTION) { + CORBA_exception_free (&ev); + return NULL; + } + + CORBA_exception_free (&ev); + + control_widget = bonobo_widget_new_control_from_objref ( + corba_control, CORBA_OBJECT_NIL); + + gtk_widget_show (control_widget); + + return control_widget; +} + + +Bonobo_EventSource_ListenerId +comp_editor_connect_contacts_changed (GtkWidget *contacts_entry, + BonoboListenerCallbackFn changed_cb, + gpointer changed_cb_data) +{ + BonoboControlFrame *cf; + Bonobo_PropertyBag pb = CORBA_OBJECT_NIL; + + cf = bonobo_widget_get_control_frame (BONOBO_WIDGET (contacts_entry)); + pb = bonobo_control_frame_get_control_property_bag (cf, NULL); + + return bonobo_event_source_client_add_listener ( + pb, changed_cb, + "Bonobo/Property:change:entry_changed", + NULL, changed_cb_data); +} + + +void +comp_editor_show_contacts_dialog (GNOME_Evolution_Addressbook_SelectNames corba_select_names) +{ + CORBA_Environment ev; + + CORBA_exception_init (&ev); + GNOME_Evolution_Addressbook_SelectNames_activateDialog ( + corba_select_names, _("Contacts"), &ev); + CORBA_exception_free (&ev); +} + + +/* A simple 'name <email>' parser. + FIXME: Should probably use camel functions or something. */ +static void +parse_contact_string (const char *value, char **name, char **email) +{ + char *lbracket, *rbracket, *name_end, *tmp_name, *tmp_email; + + if (!value) { + *name = g_strdup (""); + *email = g_strdup (""); + return; + } + + lbracket = strchr (value, '<'); + rbracket = strchr (value, '>'); + + if (!lbracket || !rbracket || rbracket < lbracket) { + *name = g_strdup (value); + *email = g_strdup (""); + return; + } + + name_end = lbracket - 1; + while (name_end > value && isspace (*name_end)) + name_end--; + + tmp_name = g_malloc (name_end - value + 2); + strncpy (tmp_name, value, name_end - value + 1); + tmp_name[name_end - value + 1] = '\0'; + *name = tmp_name; + + tmp_email = g_malloc (rbracket - lbracket); + strncpy (tmp_email, lbracket + 1, rbracket - lbracket - 1); + tmp_email[rbracket - lbracket - 1] = '\0'; + *email = tmp_email; + + g_print ("Parsed: %s\n Name:'%s'\nEmail:'%s'\n", + value, *name, *email); +} + + +void +comp_editor_contacts_to_widget (GtkWidget *contacts_entry, + CalComponent *comp) +{ + GPtrArray *dest_array; + EDestination *dest; + GSList *contact_list, *elem; + char *contacts_string; + int i; + + cal_component_get_contact_list (comp, &contact_list); + dest_array = g_ptr_array_new (); + for (elem = contact_list; elem; elem = elem->next) { + CalComponentText *t = elem->data; + char *name, *email; + + parse_contact_string (t->value, &name, &email); + + dest = e_destination_new (); + e_destination_set_name (dest, name); + e_destination_set_email (dest, email); + g_ptr_array_add (dest_array, dest); + g_free (name); + g_free (email); + } + cal_component_free_text_list (contact_list); + + /* we need destv to be NULL terminated */ + g_ptr_array_add (dest_array, NULL); + + contacts_string = e_destination_exportv ((EDestination**) dest_array->pdata); + g_print ("Destinations: %s\n", contacts_string); + + bonobo_widget_set_property (BONOBO_WIDGET (contacts_entry), + "destinations", contacts_string, NULL); + + g_free (contacts_string); + + /* We free all dest_array except the last NULL we added. */ + for (i = 0; i < dest_array->len - 1; i++) { + dest = g_ptr_array_index (dest_array, i); + gtk_object_unref (GTK_OBJECT (dest)); + } + g_ptr_array_free (dest_array, TRUE); +} + + +void +comp_editor_contacts_to_component (GtkWidget *contacts_entry, + CalComponent *comp) +{ + EDestination **contact_destv; + GSList *contact_list = NULL, *elem; + char *contacts_string = NULL; + CalComponentText *t; + const char *name, *email; + int i; + + bonobo_widget_get_property (BONOBO_WIDGET (contacts_entry), + "destinations", &contacts_string, NULL); + g_print ("Contacts string: %s\n", contacts_string); + + contact_destv = e_destination_importv (contacts_string); + if (contact_destv) { + for (i = 0; contact_destv[i] != NULL; i++) { + name = e_destination_get_name (contact_destv[i]); + email = e_destination_get_email (contact_destv[i]); + + t = g_new0 (CalComponentText, 1); + t->altrep = NULL; + + /* If both name and email are given, use the standard + 'name <email>' form, otherwise use just the name + or the email address. + FIXME: I'm not sure this is correct syntax etc. */ + if (name && name[0] && email && email[0]) + t->value = g_strdup_printf ("%s <%s>", + name, email); + else if (name && name[0]) + t->value = g_strdup (name); + else + t->value = g_strdup (email); + + contact_list = g_slist_prepend (contact_list, t); + + gtk_object_unref (GTK_OBJECT (contact_destv[i])); + } + } + g_free (contact_destv); + + contact_list = g_slist_reverse (contact_list); + cal_component_set_contact_list (comp, contact_list); + + for (elem = contact_list; elem; elem = elem->next) { + t = elem->data; + g_free ((char*)t->value); + g_free (t); + } + g_slist_free (contact_list); +} |