diff options
-rw-r--r-- | composer/ChangeLog | 13 | ||||
-rw-r--r-- | composer/Makefile.am | 35 | ||||
-rw-r--r-- | composer/e-msg-composer-hdrs.c | 193 |
3 files changed, 216 insertions, 25 deletions
diff --git a/composer/ChangeLog b/composer/ChangeLog index c30e85aeba..9c778989dd 100644 --- a/composer/ChangeLog +++ b/composer/ChangeLog @@ -1,3 +1,16 @@ +2000-07-08 Ettore Perazzoli <ettore@helixcode.com> + + * e-msg-composer-hdrs.c: New member `corba_select_names' in + `EMsgComposerHdrsPrivate'. + (destroy): If not `CORBA_OBJECT_NIL', release. + (init): Init to `CORBA_OBJECT_NIL'. + (setup_corba): New. + (e_msg_composer_hdrs_new): Call it. + (add_entry): Create the entries by using the ::SelectNames + interface. + (address_button_clicked_cb): Activate the dialog through the + ::SelectNames interface. + 2000-06-29 Jeffrey Stedfast <fejj@helixcode.com> * e-msg-composer.c: Changed "Exit" to "Close" in the File menu. diff --git a/composer/Makefile.am b/composer/Makefile.am index 0c78a7b9f3..44c19403ca 100644 --- a/composer/Makefile.am +++ b/composer/Makefile.am @@ -1,3 +1,22 @@ +## CORBA stuff + +IDLS = \ + $(top_srcdir)/addressbook/gui/component/select-names/Evolution-Addressbook-SelectNames.idl + +IDL_GENERATED = \ + Evolution-Addressbook-SelectNames.h \ + Evolution-Addressbook-SelectNames-common.c \ + Evolution-Addressbook-SelectNames-skels.c \ + Evolution-Addressbook-SelectNames-stubs.c + +Evolution-Addressbook-SelectNames-impl.o: Evolution-Addressbook-SelectNames.h + +$(IDL_GENERATED): $(IDLS) + $(ORBIT_IDL) -I$(datadir)/idl -I`$(GNOME_CONFIG) --datadir`/idl \ + $(top_srcdir)/addressbook/gui/component/select-names/Evolution-Addressbook-SelectNames.idl + +## + gladedir = $(datadir)/evolution/glade glade_DATA = \ @@ -11,19 +30,21 @@ libcomposerincludedir = $(includedir)/composer noinst_LTLIBRARIES = libcomposer.la libcomposer_la_LDFLAGS = -static -INCLUDES = \ - -I$(top_srcdir) \ - -I$(top_builddir) \ - -I$(top_srcdir)/camel \ - -I$(top_builddir)/camel \ - $(GNOME_INCLUDEDIR) \ - $(BONOBO_GNOME_CFLAGS) \ +INCLUDES = \ + -I$(top_srcdir) \ + -I$(top_builddir) \ + -I$(top_srcdir)/camel \ + -I$(top_builddir)/camel \ + -I$(top_builddir)/addressbook/gui/component/select-names \ + $(GNOME_INCLUDEDIR) \ + $(BONOBO_GNOME_CFLAGS) \ -DG_LOG_DOMAIN=\"composer\" CPPFLAGS = \ -DE_GLADEDIR=\"$(gladedir)\" libcomposer_la_SOURCES = \ + $(IDL_GENERATED) \ e-msg-composer-address-dialog.c \ e-msg-composer-address-dialog.h \ e-msg-composer-address-entry.c \ diff --git a/composer/e-msg-composer-hdrs.c b/composer/e-msg-composer-hdrs.c index a331511c0c..b40934f487 100644 --- a/composer/e-msg-composer-hdrs.c +++ b/composer/e-msg-composer-hdrs.c @@ -28,11 +28,21 @@ #include <gnome.h> #include <camel/camel.h> +#include <bonobo.h> + +#include <liboaf/liboaf.h> + +#include "Evolution-Addressbook-SelectNames.h" + #include "e-msg-composer-address-entry.h" #include "e-msg-composer-hdrs.h" +#define SELECT_NAMES_OAFID "OAFIID:addressbook:select-names:39301deb-174b-40d1-8a6e-5edc300f7b61" + struct _EMsgComposerHdrsPrivate { + Evolution_Addressbook_SelectNames corba_select_names; + /* Total number of headers that we have. */ guint num_hdrs; @@ -57,11 +67,86 @@ enum { static gint signals[LAST_SIGNAL]; +static gboolean +setup_corba (EMsgComposerHdrs *hdrs) +{ + EMsgComposerHdrsPrivate *priv; + CORBA_Environment ev; + + priv = hdrs->priv; + + g_assert (priv->corba_select_names == CORBA_OBJECT_NIL); + + CORBA_exception_init (&ev); + + priv->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 || priv->corba_select_names == CORBA_OBJECT_NIL) { + g_warning ("Cannot activate -- %s", SELECT_NAMES_OAFID); + CORBA_exception_free (&ev); + return FALSE; + } + + CORBA_exception_free (&ev); + + return TRUE; +} + + static void address_button_clicked_cb (GtkButton *button, gpointer data) { - gtk_signal_emit (GTK_OBJECT (data), signals[SHOW_ADDRESS_DIALOG]); + EMsgComposerHdrs *hdrs; + EMsgComposerHdrsPrivate *priv; + CORBA_Environment ev; + + hdrs = E_MSG_COMPOSER_HDRS (data); + priv = hdrs->priv; + + CORBA_exception_init (&ev); + + /* FIXME section. */ + Evolution_Addressbook_SelectNames_activate_dialog (priv->corba_select_names, "", &ev); + + CORBA_exception_free (&ev); +} + +static GtkWidget * +create_addressbook_entry (EMsgComposerHdrs *hdrs, + const char *name) +{ + EMsgComposerHdrsPrivate *priv; + Evolution_Addressbook_SelectNames corba_select_names; + Bonobo_Control corba_control; + GtkWidget *control_widget; + CORBA_Environment ev; + + priv = hdrs->priv; + corba_select_names = priv->corba_select_names; + + CORBA_exception_init (&ev); + + Evolution_Addressbook_SelectNames_add_section (corba_select_names, name, name, &ev); + if (ev._major != CORBA_NO_EXCEPTION) { + CORBA_exception_free (&ev); + return NULL; + } + + corba_control = Evolution_Addressbook_SelectNames_get_entry_for_section (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); + + return control_widget; } static GtkWidget * @@ -69,7 +154,7 @@ add_header (EMsgComposerHdrs *hdrs, const gchar *name, const gchar *tip, const gchar *tip_private, - gboolean addrbook_button) + gboolean is_addrbook) { EMsgComposerHdrsPrivate *priv; GtkWidget *label; @@ -78,7 +163,7 @@ add_header (EMsgComposerHdrs *hdrs, priv = hdrs->priv; - if (addrbook_button) { + if (is_addrbook) { label = gtk_button_new_with_label (name); GTK_OBJECT_UNSET_FLAGS(label, GTK_CAN_FOCUS); gtk_signal_connect (GTK_OBJECT (label), "clicked", @@ -99,14 +184,20 @@ add_header (EMsgComposerHdrs *hdrs, pad, pad); gtk_widget_show (label); - entry = e_msg_composer_address_entry_new (); - gtk_table_attach (GTK_TABLE (hdrs), entry, - 1, 2, priv->num_hdrs, priv->num_hdrs + 1, - GTK_FILL | GTK_EXPAND, GTK_FILL, - 2, 2); - gtk_widget_show (entry); + if (is_addrbook) + entry = create_addressbook_entry (hdrs, name); + else + entry = gtk_entry_new (); - gtk_tooltips_set_tip (hdrs->priv->tooltips, entry, tip, tip_private); + if (entry != NULL) { + gtk_table_attach (GTK_TABLE (hdrs), entry, + 1, 2, priv->num_hdrs, priv->num_hdrs + 1, + GTK_FILL | GTK_EXPAND, GTK_FILL, + 2, 2); + gtk_widget_show (entry); + + gtk_tooltips_set_tip (hdrs->priv->tooltips, entry, tip, tip_private); + } priv->num_hdrs++; @@ -157,6 +248,14 @@ destroy (GtkObject *object) hdrs = E_MSG_COMPOSER_HDRS (object); priv = hdrs->priv; + if (priv->corba_select_names != CORBA_OBJECT_NIL) { + CORBA_Environment ev; + + CORBA_exception_init (&ev); + CORBA_Object_release (priv->corba_select_names, &ev); + CORBA_exception_free (&ev); + } + gtk_object_destroy (GTK_OBJECT (priv->tooltips)); if (GTK_OBJECT_CLASS (parent_class)->destroy != NULL) @@ -193,9 +292,11 @@ init (EMsgComposerHdrs *hdrs) priv = g_new (EMsgComposerHdrsPrivate, 1); - priv->to_entry = NULL; - priv->cc_entry = NULL; - priv->bcc_entry = NULL; + priv->corba_select_names = CORBA_OBJECT_NIL; + + priv->to_entry = NULL; + priv->cc_entry = NULL; + priv->bcc_entry = NULL; priv->subject_entry = NULL; priv->tooltips = gtk_tooltips_new (); @@ -238,24 +339,81 @@ e_msg_composer_hdrs_new (void) new = gtk_type_new (e_msg_composer_hdrs_get_type ()); priv = new->priv; - setup_headers (E_MSG_COMPOSER_HDRS (new)); + if (! setup_corba (new)) { + gtk_widget_destroy (GTK_WIDGET (new)); + return NULL; + } + + setup_headers (new); return GTK_WIDGET (new); } +static GList * +decode_addresses (const char *s) +{ + const char *p, *oldp; + gboolean in_quotes; + GList *list; + + g_print ("Decoding addresses -- %s\n", s ? s : "(null)"); + + if (s == NULL) + return NULL; + + in_quotes = FALSE; + list = NULL; + + p = s; + oldp = s; + + while (1) { + if (*p == '"') { + in_quotes = ! in_quotes; + p++; + } else if ((! in_quotes && *p == ',') || *p == 0) { + if (p != oldp) { + char *new_addr; + + new_addr = g_strndup (oldp, p - oldp); + new_addr = g_strstrip (new_addr); + if (*new_addr != '\0') + list = g_list_prepend (list, new_addr); + else + g_free (new_addr); + } + + while (*p == ',' || *p == ' ' || *p == '\t') + p++; + + if (*p == 0) + break; + + oldp = p; + } else { + p++; + } + } + + return g_list_reverse (list); +} + static void set_recipients (CamelMimeMessage *msg, GtkWidget *entry_widget, const gchar *type) { - EMsgComposerAddressEntry *entry; GList *list; GList *p; struct _header_address *addr; + char *s; + + bonobo_widget_get_property (BONOBO_WIDGET (entry_widget), "text", &s, NULL); - entry = E_MSG_COMPOSER_ADDRESS_ENTRY (entry_widget); - list = e_msg_composer_address_entry_get_addresses (entry); + list = decode_addresses (s); + + g_free (s); /* FIXME leak? */ @@ -419,4 +577,3 @@ e_msg_composer_hdrs_get_subject_entry (EMsgComposerHdrs *hdrs) return hdrs->priv->subject_entry; } - |