Use the new controls implemented in the addressbook in the message

composer.

svn path=/trunk/; revision=3973
This commit is contained in:
Ettore Perazzoli
2000-07-08 08:30:04 +00:00
parent baad423775
commit 899e079e77
3 changed files with 216 additions and 25 deletions

View File

@ -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.

View File

@ -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 \

View File

@ -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;
@ -56,12 +66,87 @@ 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;
entry = E_MSG_COMPOSER_ADDRESS_ENTRY (entry_widget);
list = e_msg_composer_address_entry_get_addresses (entry);
bonobo_widget_get_property (BONOBO_WIDGET (entry_widget), "text", &s, NULL);
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;
}