aboutsummaryrefslogtreecommitdiffstats
path: root/addressbook/gui/component/select-names
diff options
context:
space:
mode:
Diffstat (limited to 'addressbook/gui/component/select-names')
-rw-r--r--addressbook/gui/component/select-names/.cvsignore7
-rw-r--r--addressbook/gui/component/select-names/Makefile.am48
-rw-r--r--addressbook/gui/component/select-names/e-select-names-manager.c90
-rw-r--r--addressbook/gui/component/select-names/e-select-names-manager.h25
-rw-r--r--addressbook/gui/component/select-names/e-select-names-model.c200
-rw-r--r--addressbook/gui/component/select-names/e-select-names-model.h67
-rw-r--r--addressbook/gui/component/select-names/e-select-names-table-model.c157
-rw-r--r--addressbook/gui/component/select-names/e-select-names-table-model.h42
-rw-r--r--addressbook/gui/component/select-names/e-select-names-text-model.c263
-rw-r--r--addressbook/gui/component/select-names/e-select-names-text-model.h44
-rw-r--r--addressbook/gui/component/select-names/e-select-names.c344
-rw-r--r--addressbook/gui/component/select-names/e-select-names.h86
-rw-r--r--addressbook/gui/component/select-names/recipient.glade61
-rw-r--r--addressbook/gui/component/select-names/select-names.glade245
-rw-r--r--addressbook/gui/component/select-names/select-names.glade.h10
15 files changed, 1659 insertions, 30 deletions
diff --git a/addressbook/gui/component/select-names/.cvsignore b/addressbook/gui/component/select-names/.cvsignore
new file mode 100644
index 0000000000..d6c55c7345
--- /dev/null
+++ b/addressbook/gui/component/select-names/.cvsignore
@@ -0,0 +1,7 @@
+.deps
+.libs
+.pure
+Makefile
+Makefile.in
+*.lo
+*.la
diff --git a/addressbook/gui/component/select-names/Makefile.am b/addressbook/gui/component/select-names/Makefile.am
new file mode 100644
index 0000000000..4a1bbc4741
--- /dev/null
+++ b/addressbook/gui/component/select-names/Makefile.am
@@ -0,0 +1,48 @@
+CPPFLAGS = \
+ -DEVOLUTION_GLADEDIR=\""$(gladedir)"\"
+
+INCLUDES = \
+ -DG_LOG_DOMAIN=\"evolution-addressbook\" \
+ $(EXTRA_GNOME_CFLAGS) \
+ $(GNOME_INCLUDEDIR) \
+ -I$(top_srcdir) \
+ -I$(top_builddir) \
+ -I$(top_srcdir)/shell \
+ -I$(top_builddir)/shell \
+ -I$(top_srcdir)/widgets/e-text \
+ -I$(top_srcdir)/widgets/e-table \
+ -I$(top_srcdir)/addressbook/gui/minicard \
+ -I$(top_srcdir)/addressbook/contact-editor \
+ -I$(top_srcdir)/addressbook/backend \
+ -I$(top_builddir)/addressbook/backend \
+ $(BONOBO_HTML_GNOME_CFLAGS) \
+ -DEVOLUTION_VERSION=\""$(VERSION)"\" \
+ -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \
+ -DEVOLUTION_ICONSDIR=\""$(iconsdir)"\" \
+ -DEVOLUTION_LOCALEDIR=\""$(datadir)/locale"\" \
+ -DCAMEL_PROVIDERDIR=\""$(providerdir)"\"
+
+lib_LTLIBRARIES = libeselectnames.la
+
+libeselectnames_la_SOURCES = \
+ e-select-names-entry.c \
+ e-select-names-entry.h \
+ e-select-names-manager.c \
+ e-select-names-manager.h \
+ e-select-names-model.c \
+ e-select-names-model.h \
+ e-select-names-table-model.c \
+ e-select-names-table-model.h \
+ e-select-names-text-model.c \
+ e-select-names-text-model.h \
+ e-select-names.c \
+ e-select-names.h
+
+
+gladedir = $(datadir)/evolution/glade
+glade_DATA = select-names.glade
+
+EXTRA_DIST = \
+ $(glade_DATA) \
+ select-names.glade.h
+
diff --git a/addressbook/gui/component/select-names/e-select-names-manager.c b/addressbook/gui/component/select-names/e-select-names-manager.c
index 28981cf018..01b94057d6 100644
--- a/addressbook/gui/component/select-names/e-select-names-manager.c
+++ b/addressbook/gui/component/select-names/e-select-names-manager.c
@@ -13,6 +13,10 @@
#include <gtk/gtk.h>
#include "e-select-names-manager.h"
+#include "e-select-names-entry.h"
+#include "e-select-names-model.h"
+#include "e-select-names-text-model.h"
+#include "widgets/e-text/e-entry.h"
/* Object argument IDs */
enum {
@@ -21,6 +25,12 @@ enum {
};
+typedef struct {
+ char *id;
+ char *title;
+ ESelectNamesModel *model;
+} ESelectNamesManagerSection;
+
static void e_select_names_manager_init (ESelectNamesManager *manager);
static void e_select_names_manager_class_init (ESelectNamesManagerClass *klass);
@@ -28,8 +38,6 @@ static void e_select_names_manager_destroy (GtkObject *object);
static void e_select_names_manager_set_arg (GtkObject *object, GtkArg *arg, guint arg_id);
static void e_select_names_manager_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void fill_in_info(ESelectNamesManager *manager);
-
/**
* e_select_names_manager_get_type:
* @void:
@@ -98,9 +106,10 @@ static void
e_select_names_manager_destroy (GtkObject *object)
{
ESelectNamesManager *manager;
- int i;
manager = E_SELECT_NAMES_MANAGER (object);
+
+ gtk_object_unref(GTK_OBJECT(manager->sections));
}
@@ -114,7 +123,6 @@ e_select_names_manager_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
switch (arg_id) {
case ARG_CARD:
- fill_in_info(manager);
break;
default:
return;
@@ -131,11 +139,6 @@ e_select_names_manager_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
switch (arg_id) {
case ARG_CARD:
- e_select_names_manager_sync_card(manager);
- if (manager->card)
- GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(manager->card);
- else
- GTK_VALUE_OBJECT (*arg) = NULL;
break;
default:
arg->type = GTK_TYPE_INVALID;
@@ -143,6 +146,26 @@ e_select_names_manager_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
}
}
+static void *
+section_copy(const void *sec, void *data)
+{
+ const ESelectNamesManagerSection *section = sec;
+ ESelectNamesManagerSection *newsec;
+
+ newsec = g_new(ESelectNamesManagerSection, 1);
+ newsec->id = g_strdup(section->id);
+ newsec->title = g_strdup(section->title);
+ return newsec;
+}
+
+static void
+section_free(void *sec, void *data)
+{
+ ESelectNamesManagerSection *section = sec;
+ g_free(section->id);
+ g_free(section->title);
+ g_free(section);
+}
/**
* e_select_names_manager_init:
@@ -150,22 +173,51 @@ e_select_names_manager_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
static void
e_select_names_manager_init (ESelectNamesManager *manager)
{
+ manager->sections = e_list_new(section_copy, section_free, manager);
}
-static void
-fill_in_info(ESelectNamesManager *manager)
+void e_select_names_manager_add_section (ESelectNamesManager *manager,
+ char *id,
+ char *title)
{
- ECard *card = manager->card;
- if (card) {
+ ESelectNamesManagerSection *section;
+
+ section = g_new(ESelectNamesManagerSection, 1);
+ section->id = g_strdup(id);
+ section->title = g_strdup(title);
+ e_list_append(manager->sections, section);
+ section_free(section, manager);
+}
+GtkWidget *e_select_names_manager_create_entry (ESelectNamesManager *manager,
+ char *id)
+{
+ GtkWidget *entry;
+ ETextModel *model;
+ EIterator *iterator;
+ iterator = e_list_get_iterator(manager->sections);
+ for (; e_iterator_is_valid(iterator); e_iterator_next(iterator)) {
+ const ESelectNamesManagerSection *section = e_iterator_get(iterator);
+ if (!strcmp(section->id, id)) {
+ entry = GTK_WIDGET(e_entry_new());
+ model = e_select_names_text_model_new(section->model);
+ gtk_object_set(GTK_OBJECT(entry),
+ "model", model,
+ NULL);
+ return entry;
+ }
}
+ return NULL;
}
-void
-e_select_names_manager_sync_card(ESelectNamesManager *manager)
+void e_select_names_manager_activate_dialog (ESelectNamesManager *manager,
+ char *id)
{
- ECard *card = manager->card;
- if (card) {
- fill_in_info(manager);
- }
+}
+
+/* Of type ECard */
+EList *e_select_names_manager_get_cards (ESelectNamesManager *manager,
+ char *id)
+{
+ return NULL;
}
diff --git a/addressbook/gui/component/select-names/e-select-names-manager.h b/addressbook/gui/component/select-names/e-select-names-manager.h
index 5aba1d3295..600644f01a 100644
--- a/addressbook/gui/component/select-names/e-select-names-manager.h
+++ b/addressbook/gui/component/select-names/e-select-names-manager.h
@@ -12,6 +12,7 @@
#include <time.h>
#include <gtk/gtk.h>
#include <stdio.h>
+#include <e-util/e-list.h>
#define E_TYPE_SELECT_NAMES_MANAGER (e_select_names_manager_get_type ())
#define E_SELECT_NAMES_MANAGER(obj) (GTK_CHECK_CAST ((obj), E_TYPE_SELECT_NAMES_MANAGER, ESelectNamesManager))
@@ -24,26 +25,28 @@ typedef struct _ESelectNamesManagerClass ESelectNamesManagerClass;
struct _ESelectNamesManager {
GtkObject object;
-
+
+ EList *sections;
};
struct _ESelectNamesManagerClass {
GtkObjectClass parent_class;
};
-ESelectNamesManager *e_select_names_manager_new (void);
-void e_select_names_add_section (ESelectNamesManager *manager,
- char *id);
-GtkWidget *e_select_names_create_entry (ESelectNamesManager *manager,
- char *id);
-void e_select_names_activate_dialog (ESelectNamesManager *manager,
- char *id);
+ESelectNamesManager *e_select_names_manager_new (void);
+void e_select_names_manager_add_section (ESelectNamesManager *manager,
+ char *id,
+ char *title);
+GtkWidget *e_select_names_manager_create_entry (ESelectNamesManager *manager,
+ char *id);
+void e_select_names_manager_activate_dialog (ESelectNamesManager *manager,
+ char *id);
/* Of type ECard */
-ECardList *e_select_names_get_cards (ESelectNamesManager *manager,
- char *id);
+EList *e_select_names_manager_get_cards (ESelectNamesManager *manager,
+ char *id);
/* Standard Gtk function */
-GtkType e_select_names_manager_get_type (void);
+GtkType e_select_names_manager_get_type (void);
#endif /* ! __E_SELECT_NAMES_MANAGER_H__ */
diff --git a/addressbook/gui/component/select-names/e-select-names-model.c b/addressbook/gui/component/select-names/e-select-names-model.c
new file mode 100644
index 0000000000..8399136dd8
--- /dev/null
+++ b/addressbook/gui/component/select-names/e-select-names-model.c
@@ -0,0 +1,200 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Authors:
+ * Chris Lahey <clahey@helixcode.com>
+ *
+ * Copyright (C) 2000 Helix Code, Inc.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gtk/gtk.h>
+
+#include "e-select-names-model.h"
+
+enum {
+ E_SELECT_NAMES_MODEL_CHANGED,
+ E_SELECT_NAMES_MODEL_LAST_SIGNAL
+};
+
+static guint e_select_names_model_signals[E_SELECT_NAMES_MODEL_LAST_SIGNAL] = { 0 };
+
+/* Object argument IDs */
+enum {
+ ARG_0,
+ ARG_CARD,
+};
+
+static void e_select_names_model_init (ESelectNamesModel *model);
+static void e_select_names_model_class_init (ESelectNamesModelClass *klass);
+
+static void e_select_names_model_destroy (GtkObject *object);
+static void e_select_names_model_set_arg (GtkObject *object, GtkArg *arg, guint arg_id);
+static void e_select_names_model_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
+
+/**
+ * e_select_names_model_get_type:
+ * @void:
+ *
+ * Registers the &ESelectNamesModel class if necessary, and returns the type ID
+ * associated to it.
+ *
+ * Return value: The type ID of the &ESelectNamesModel class.
+ **/
+GtkType
+e_select_names_model_get_type (void)
+{
+ static GtkType model_type = 0;
+
+ if (!model_type) {
+ GtkTypeInfo model_info = {
+ "ESelectNamesModel",
+ sizeof (ESelectNamesModel),
+ sizeof (ESelectNamesModelClass),
+ (GtkClassInitFunc) e_select_names_model_class_init,
+ (GtkObjectInitFunc) e_select_names_model_init,
+ NULL, /* reserved_1 */
+ NULL, /* reserved_2 */
+ (GtkClassInitFunc) NULL
+ };
+
+ model_type = gtk_type_unique (gtk_object_get_type (), &model_info);
+ }
+
+ return model_type;
+}
+
+/**
+ * e_select_names_model_new:
+ * @VCard: a string in vCard format
+ *
+ * Returns: a new #ESelectNamesModel that wraps the @VCard.
+ */
+ESelectNamesModel *
+e_select_names_model_new (void)
+{
+ ESelectNamesModel *model = E_SELECT_NAMES_MODEL(gtk_type_new(e_select_names_model_get_type()));
+ return model;
+}
+
+static void
+e_select_names_model_class_init (ESelectNamesModelClass *klass)
+{
+ GtkObjectClass *object_class;
+
+ object_class = GTK_OBJECT_CLASS(klass);
+
+ e_select_names_model_signals[E_SELECT_NAMES_MODEL_CHANGED] =
+ gtk_signal_new ("changed",
+ GTK_RUN_LAST,
+ object_class->type,
+ GTK_SIGNAL_OFFSET (ESelectNamesModelClass, changed),
+ gtk_marshal_NONE__NONE,
+ GTK_TYPE_NONE, 0);
+
+ gtk_object_class_add_signals (object_class, e_select_names_model_signals, E_SELECT_NAMES_MODEL_LAST_SIGNAL);
+
+ gtk_object_add_arg_type ("ESelectNamesModel::card",
+ GTK_TYPE_OBJECT, GTK_ARG_READWRITE, ARG_CARD);
+
+ klass->changed = NULL;
+
+ object_class->destroy = e_select_names_model_destroy;
+ object_class->get_arg = e_select_names_model_get_arg;
+ object_class->set_arg = e_select_names_model_set_arg;
+}
+
+/*
+ * ESelectNamesModel lifecycle management and vcard loading/saving.
+ */
+
+static void
+e_select_names_model_destroy (GtkObject *object)
+{
+ ESelectNamesModel *model;
+
+ model = E_SELECT_NAMES_MODEL (object);
+
+ gtk_object_unref(GTK_OBJECT(model->data));
+}
+
+
+/* Set_arg handler for the model */
+static void
+e_select_names_model_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
+{
+ ESelectNamesModel *model;
+
+ model = E_SELECT_NAMES_MODEL (object);
+
+ switch (arg_id) {
+ case ARG_CARD:
+ break;
+ default:
+ return;
+ }
+}
+
+/* Get_arg handler for the model */
+static void
+e_select_names_model_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
+{
+ ESelectNamesModel *model;
+
+ model = E_SELECT_NAMES_MODEL (object);
+
+ switch (arg_id) {
+ case ARG_CARD:
+ break;
+ default:
+ arg->type = GTK_TYPE_INVALID;
+ break;
+ }
+}
+
+static void *
+data_copy(const void *sec, void *data)
+{
+ const ESelectNamesModelData *section = sec;
+ ESelectNamesModelData *newsec;
+
+ newsec = g_new(ESelectNamesModelData, 1);
+ newsec->type = section->type;
+ newsec->card = section->card;
+ if (newsec->card)
+ gtk_object_ref(GTK_OBJECT(newsec->card));
+ newsec->string = g_strdup(section->string);
+ return newsec;
+}
+
+static void
+data_free(void *sec, void *data)
+{
+ ESelectNamesModelData *section = sec;
+ if (section->card)
+ gtk_object_unref(GTK_OBJECT(section->card));
+ g_free(section->string);
+ g_free(section);
+}
+
+/**
+ * e_select_names_model_init:
+ */
+static void
+e_select_names_model_init (ESelectNamesModel *model)
+{
+ model->data = e_list_new(data_copy, data_free, model);
+}
+
+/* Of type ECard */
+EList *e_select_names_model_get_cards (ESelectNamesModel *model)
+{
+ return NULL;
+}
+
+EList *e_select_names_model_get_data (ESelectNamesModel *model)
+{
+ return model->data;
+}
diff --git a/addressbook/gui/component/select-names/e-select-names-model.h b/addressbook/gui/component/select-names/e-select-names-model.h
new file mode 100644
index 0000000000..20c90818f7
--- /dev/null
+++ b/addressbook/gui/component/select-names/e-select-names-model.h
@@ -0,0 +1,67 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Authors:
+ * Chris Lahey <clahey@helixcode.com>
+ *
+ * Copyright (C) 2000 Helix Code, Inc.
+ */
+
+#ifndef __E_SELECT_NAMES_MODEL_H__
+#define __E_SELECT_NAMES_MODEL_H__
+
+#include <time.h>
+#include <gtk/gtk.h>
+#include <stdio.h>
+#include <e-util/e-list.h>
+#include <addressbook/backend/ebook/e-card.h>
+
+#define E_TYPE_SELECT_NAMES_MODEL (e_select_names_model_get_type ())
+#define E_SELECT_NAMES_MODEL(obj) (GTK_CHECK_CAST ((obj), E_TYPE_SELECT_NAMES_MODEL, ESelectNamesModel))
+#define E_SELECT_NAMES_MODEL_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_SELECT_NAMES_MODEL, ESelectNamesModelClass))
+#define E_IS_SELECT_NAMES_MODEL(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_SELECT_NAMES_MODEL))
+#define E_IS_SELECT_NAMES_MODEL_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), E_TYPE_SELECT_NAMES_MODEL))
+
+typedef enum _ESelectNamesModelDataType ESelectNamesModelDataType;
+typedef struct _ESelectNamesModelData ESelectNamesModelData;
+typedef struct _ESelectNamesModel ESelectNamesModel;
+typedef struct _ESelectNamesModelClass ESelectNamesModelClass;
+
+enum _ESelectNamesModelDataType {
+ E_SELECT_NAMES_MODEL_DATA_TYPE_CARD,
+ E_SELECT_NAMES_MODEL_DATA_TYPE_STRING_ADDRESS,
+ E_SELECT_NAMES_MODEL_DATA_TYPE_SEPARATION_MATERIAL,
+};
+
+struct _ESelectNamesModelData {
+ ESelectNamesModelDataType type;
+ ECard *card;
+ char *string;
+};
+
+struct _ESelectNamesModel {
+ GtkObject object;
+
+ char *id;
+ char *title;
+
+ EList *data; /* Of type ESelectNamesModelData. */
+};
+
+struct _ESelectNamesModelClass {
+ GtkObjectClass parent_class;
+
+ void (*changed) (ESelectNamesModel *model);
+};
+
+ESelectNamesModel *e_select_names_model_new (void);
+
+/* Of type ECard */
+EList *e_select_names_model_get_cards (ESelectNamesModel *model);
+
+/* Of type ESelectNamesModelData */
+EList *e_select_names_model_get_data (ESelectNamesModel *model);
+
+/* Standard Gtk function */
+GtkType e_select_names_model_get_type (void);
+
+#endif /* ! __E_SELECT_NAMES_MODEL_H__ */
diff --git a/addressbook/gui/component/select-names/e-select-names-table-model.c b/addressbook/gui/component/select-names/e-select-names-table-model.c
new file mode 100644
index 0000000000..dc3edda5f9
--- /dev/null
+++ b/addressbook/gui/component/select-names/e-select-names-table-model.c
@@ -0,0 +1,157 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Authors:
+ * Chris Lahey <clahey@helixcode.com>
+ *
+ * Copyright (C) 2000 Helix Code, Inc.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gtk/gtk.h>
+
+#include "e-select-names-table-model.h"
+
+/* Object argument IDs */
+enum {
+ ARG_0,
+ ARG_SOURCE,
+};
+
+static void e_select_names_table_model_init (ESelectNamesTableModel *model);
+static void e_select_names_table_model_class_init (ESelectNamesTableModelClass *klass);
+
+static void e_select_names_table_model_destroy (GtkObject *object);
+static void e_select_names_table_model_set_arg (GtkObject *object, GtkArg *arg, guint arg_id);
+static void e_select_names_table_model_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
+
+/**
+ * e_select_names_table_model_get_type:
+ * @void:
+ *
+ * Registers the &ESelectNamesTableModel class if necessary, and returns the type ID
+ * associated to it.
+ *
+ * Return value: The type ID of the &ESelectNamesTableModel class.
+ **/
+GtkType
+e_select_names_table_model_get_type (void)
+{
+ static GtkType model_type = 0;
+
+ if (!model_type) {
+ GtkTypeInfo model_info = {
+ "ESelectNamesTableModel",
+ sizeof (ESelectNamesTableModel),
+ sizeof (ESelectNamesTableModelClass),
+ (GtkClassInitFunc) e_select_names_table_model_class_init,
+ (GtkObjectInitFunc) e_select_names_table_model_init,
+ NULL, /* reserved_1 */
+ NULL, /* reserved_2 */
+ (GtkClassInitFunc) NULL
+ };
+
+ model_type = gtk_type_unique (e_table_model_get_type (), &model_info);
+ }
+
+ return model_type;
+}
+
+/**
+ * e_select_names_table_model_new:
+ * @VCard: a string in vCard format
+ *
+ * Returns: a new #ESelectNamesTableModel that wraps the @VCard.
+ */
+ETableModel *
+e_select_names_table_model_new (ESelectNamesModel *source)
+{
+ ETableModel *model = E_TABLE_MODEL(gtk_type_new(e_select_names_table_model_get_type()));
+ gtk_object_set(GTK_OBJECT(model),
+ "source", source,
+ NULL);
+ return model;
+}
+
+static void
+e_select_names_table_model_class_init (ESelectNamesTableModelClass *klass)
+{
+ GtkObjectClass *object_class;
+ ETableModelClass *table_model_class;
+
+ object_class = GTK_OBJECT_CLASS(klass);
+ table_model_class = E_TABLE_MODEL_CLASS(klass);
+
+ gtk_object_add_arg_type ("ESelectNamesTableModel::source",
+ GTK_TYPE_OBJECT, GTK_ARG_READWRITE, ARG_SOURCE);
+
+ object_class->destroy = e_select_names_table_model_destroy;
+ object_class->get_arg = e_select_names_table_model_get_arg;
+ object_class->set_arg = e_select_names_table_model_set_arg;
+}
+
+/*
+ * ESelectNamesTableModel lifecycle management and vcard loading/saving.
+ */
+
+static void
+e_select_names_table_model_destroy (GtkObject *object)
+{
+ ESelectNamesTableModel *model;
+
+ model = E_SELECT_NAMES_TABLE_MODEL (object);
+
+ if (model->source)
+ gtk_object_unref(GTK_OBJECT(model->source));
+}
+
+
+/* Set_arg handler for the model */
+static void
+e_select_names_table_model_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
+{
+ ESelectNamesTableModel *model;
+
+ model = E_SELECT_NAMES_TABLE_MODEL (object);
+
+ switch (arg_id) {
+ case ARG_SOURCE:
+ if (model->source)
+ gtk_object_unref(GTK_OBJECT(model->source));
+ model->source = E_SELECT_NAMES_MODEL(GTK_VALUE_OBJECT(*arg));
+ if (model->source)
+ gtk_object_ref(GTK_OBJECT(model->source));
+ break;
+ default:
+ return;
+ }
+}
+
+/* Get_arg handler for the model */
+static void
+e_select_names_table_model_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
+{
+ ESelectNamesTableModel *model;
+
+ model = E_SELECT_NAMES_TABLE_MODEL (object);
+
+ switch (arg_id) {
+ case ARG_SOURCE:
+ GTK_VALUE_OBJECT(*arg) = GTK_OBJECT(model->source);
+ break;
+ default:
+ arg->type = GTK_TYPE_INVALID;
+ break;
+ }
+}
+
+/**
+ * e_select_names_table_model_init:
+ */
+static void
+e_select_names_table_model_init (ESelectNamesTableModel *model)
+{
+ model->source = NULL;
+}
diff --git a/addressbook/gui/component/select-names/e-select-names-table-model.h b/addressbook/gui/component/select-names/e-select-names-table-model.h
new file mode 100644
index 0000000000..94cbaff13a
--- /dev/null
+++ b/addressbook/gui/component/select-names/e-select-names-table-model.h
@@ -0,0 +1,42 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Authors:
+ * Chris Lahey <clahey@helixcode.com>
+ *
+ * Copyright (C) 2000 Helix Code, Inc.
+ */
+
+#ifndef __E_SELECT_NAMES_TABLE_MODEL_H__
+#define __E_SELECT_NAMES_TABLE_MODEL_H__
+
+#include <time.h>
+#include <gtk/gtk.h>
+#include <stdio.h>
+#include "e-select-names-model.h"
+#include <widgets/e-table/e-table-model.h>
+
+#define E_TYPE_SELECT_NAMES_TABLE_MODEL (e_select_names_table_model_get_type ())
+#define E_SELECT_NAMES_TABLE_MODEL(obj) (GTK_CHECK_CAST ((obj), E_TYPE_SELECT_NAMES_TABLE_MODEL, ESelectNamesTableModel))
+#define E_SELECT_NAMES_TABLE_MODEL_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_SELECT_NAMES_TABLE_MODEL, ESelectNamesTableModelClass))
+#define E_IS_SELECT_NAMES_TABLE_MODEL(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_SELECT_NAMES_TABLE_MODEL))
+#define E_IS_SELECT_NAMES_TABLE_MODEL_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), E_TYPE_SELECT_NAMES_TABLE_MODEL))
+
+typedef struct _ESelectNamesTableModel ESelectNamesTableModel;
+typedef struct _ESelectNamesTableModelClass ESelectNamesTableModelClass;
+
+struct _ESelectNamesTableModel {
+ ETableModel parent;
+
+ ESelectNamesModel *source;
+};
+
+struct _ESelectNamesTableModelClass {
+ ETableModel parent_class;
+};
+
+ETableModel *e_select_names_table_model_new (ESelectNamesModel *source);
+
+/* Standard Gtk function */
+GtkType e_select_names_table_model_get_type (void);
+
+#endif /* ! __E_SELECT_NAMES_TABLE_MODEL_H__ */
diff --git a/addressbook/gui/component/select-names/e-select-names-text-model.c b/addressbook/gui/component/select-names/e-select-names-text-model.c
new file mode 100644
index 0000000000..98d0f153c2
--- /dev/null
+++ b/addressbook/gui/component/select-names/e-select-names-text-model.c
@@ -0,0 +1,263 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Authors:
+ * Chris Lahey <clahey@helixcode.com>
+ *
+ * Copyright (C) 2000 Helix Code, Inc.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gtk/gtk.h>
+
+#include "e-select-names-text-model.h"
+
+/* Object argument IDs */
+enum {
+ ARG_0,
+ ARG_SOURCE,
+};
+
+static void e_select_names_text_model_init (ESelectNamesTextModel *model);
+static void e_select_names_text_model_class_init (ESelectNamesTextModelClass *klass);
+
+static void e_select_names_text_model_destroy (GtkObject *object);
+static void e_select_names_text_model_set_arg (GtkObject *object, GtkArg *arg, guint arg_id);
+static void e_select_names_text_model_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
+
+static void e_select_names_text_model_set_text (ETextModel *model, gchar *text);
+static void e_select_names_text_model_insert (ETextModel *model, gint position, gchar *text);
+static void e_select_names_text_model_insert_length (ETextModel *model, gint position, gchar *text, gint length);
+static void e_select_names_text_model_delete (ETextModel *model, gint position, gint length);
+
+static void e_select_names_text_model_model_changed (ESelectNamesModel *source,
+ ESelectNamesTextModel *model);
+
+
+ETextModelClass *parent_class;
+#define PARENT_TYPE e_text_model_get_type()
+
+/**
+ * e_select_names_text_model_get_type:
+ * @void:
+ *
+ * Registers the &ESelectNamesTextModel class if necessary, and returns the type ID
+ * associated to it.
+ *
+ * Return value: The type ID of the &ESelectNamesTextModel class.
+ **/
+GtkType
+e_select_names_text_model_get_type (void)
+{
+ static GtkType model_type = 0;
+
+ if (!model_type) {
+ GtkTypeInfo model_info = {
+ "ESelectNamesTextModel",
+ sizeof (ESelectNamesTextModel),
+ sizeof (ESelectNamesTextModelClass),
+ (GtkClassInitFunc) e_select_names_text_model_class_init,
+ (GtkObjectInitFunc) e_select_names_text_model_init,
+ NULL, /* reserved_1 */
+ NULL, /* reserved_2 */
+ (GtkClassInitFunc) NULL
+ };
+
+ model_type = gtk_type_unique (PARENT_TYPE, &model_info);
+ }
+
+ return model_type;
+}
+
+/**
+ * e_select_names_text_model_new:
+ * @VCard: a string in vCard format
+ *
+ * Returns: a new #ESelectNamesTextModel that wraps the @VCard.
+ */
+ETextModel *
+e_select_names_text_model_new (ESelectNamesModel *source)
+{
+ ETextModel *model = E_TEXT_MODEL(gtk_type_new(e_select_names_text_model_get_type()));
+ gtk_object_set(GTK_OBJECT(model),
+ "source", source,
+ NULL);
+ return model;
+}
+
+static void
+e_select_names_text_model_class_init (ESelectNamesTextModelClass *klass)
+{
+ GtkObjectClass *object_class;
+ ETextModelClass *text_model_class;
+
+ object_class = GTK_OBJECT_CLASS(klass);
+ text_model_class = E_TEXT_MODEL_CLASS(klass);
+
+ parent_class = gtk_type_class(PARENT_TYPE);
+
+ gtk_object_add_arg_type ("ESelectNamesTextModel::source",
+ GTK_TYPE_OBJECT, GTK_ARG_READWRITE, ARG_SOURCE);
+
+ object_class->destroy = e_select_names_text_model_destroy;
+ object_class->get_arg = e_select_names_text_model_get_arg;
+ object_class->set_arg = e_select_names_text_model_set_arg;
+
+ text_model_class->set_text = e_select_names_text_model_set_text;
+ text_model_class->insert = e_select_names_text_model_insert;
+ text_model_class->insert_length = e_select_names_text_model_insert_length;
+ text_model_class->delete = e_select_names_text_model_delete;
+}
+
+static void
+e_select_names_text_model_set_text (ETextModel *model, gchar *text)
+{
+ e_select_names_model_clear(model);
+}
+
+static void
+e_select_names_text_model_insert (ETextModel *model, gint position, gchar *text)
+{
+}
+
+static void
+e_select_names_text_model_insert_length (ETextModel *model, gint position, gchar *text, gint length)
+{
+}
+
+static void
+e_select_names_text_model_delete (ETextModel *model, gint position, gint length)
+{
+}
+
+static void
+e_select_names_text_model_model_changed (ESelectNamesModel *source,
+ ESelectNamesTextModel *model)
+{
+ EList *list = e_select_names_model_get_data(source);
+ EIterator *iterator = e_list_get_iterator(list);
+ int length = 0;
+ int length_count = 0;
+ int *lengthsp;
+ char *string;
+ char *stringp;
+ for (e_iterator_reset(iterator); e_iterator_is_valid(iterator); e_iterator_next(iterator)) {
+ const ESelectNamesModelData *data = e_iterator_get(iterator);
+ length += strlen(data->string);
+ length_count++;
+ }
+
+ g_free(model->lengths);
+ model->lengths = g_new(int, length_count + 1);
+ lengthsp = model->lengths;
+
+ string = g_new(char, length + 1);
+ stringp = string;
+ *stringp = 0;
+ for (e_iterator_reset(iterator); e_iterator_is_valid(iterator); e_iterator_next(iterator)) {
+ const ESelectNamesModelData *data = e_iterator_get(iterator);
+ int this_length;
+
+ strcpy(stringp, data->string);
+ this_length = strlen(stringp);
+ stringp += this_length;
+ *(lengthsp++) = this_length;
+ }
+ *stringp = 0;
+ *lengthsp = -1;
+ g_free(E_TEXT_MODEL(model)->text);
+ E_TEXT_MODEL(model)->text = string;
+}
+
+
+static void
+e_select_names_text_model_add_source (ESelectNamesTextModel *model,
+ ESelectNamesModel *source)
+{
+ model->source = source;
+ if (model->source)
+ gtk_object_ref(GTK_OBJECT(model->source));
+ model->source_changed_id = gtk_signal_connect(GTK_OBJECT(model->source), "changed",
+ GTK_SIGNAL_FUNC(e_select_names_text_model_model_changed),
+ model);
+}
+
+static void
+e_select_names_text_model_drop_source (ESelectNamesTextModel *model)
+{
+ if (model->source_changed_id)
+ gtk_signal_disconnect(GTK_OBJECT(model->source), model->source_changed_id);
+ if (model->source)
+ gtk_object_unref(GTK_OBJECT(model->source));
+ model->source = NULL;
+ model->source_changed_id = 0;
+}
+
+/*
+ * ESelectNamesTextModel lifecycle management and vcard loading/saving.
+ */
+
+static void
+e_select_names_text_model_destroy (GtkObject *object)
+{
+ ESelectNamesTextModel *model;
+
+ model = E_SELECT_NAMES_TEXT_MODEL (object);
+
+ e_select_names_text_model_drop_source(model);
+ g_free(model->lengths);
+
+ if (GTK_OBJECT_CLASS(parent_class)->destroy)
+ GTK_OBJECT_CLASS(parent_class)->destroy(object);
+}
+
+
+/* Set_arg handler for the model */
+static void
+e_select_names_text_model_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
+{
+ ESelectNamesTextModel *model;
+
+ model = E_SELECT_NAMES_TEXT_MODEL (object);
+
+ switch (arg_id) {
+ case ARG_SOURCE:
+ e_select_names_text_model_drop_source(model);
+ e_select_names_text_model_add_source(model, E_SELECT_NAMES_MODEL(GTK_VALUE_OBJECT(*arg)));
+ break;
+ default:
+ return;
+ }
+}
+
+/* Get_arg handler for the model */
+static void
+e_select_names_text_model_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
+{
+ ESelectNamesTextModel *model;
+
+ model = E_SELECT_NAMES_TEXT_MODEL (object);
+
+ switch (arg_id) {
+ case ARG_SOURCE:
+ GTK_VALUE_OBJECT(*arg) = GTK_OBJECT(model->source);
+ break;
+ default:
+ arg->type = GTK_TYPE_INVALID;
+ break;
+ }
+}
+
+/**
+ * e_select_names_text_model_init:
+ */
+static void
+e_select_names_text_model_init (ESelectNamesTextModel *model)
+{
+ model->source = NULL;
+ model->source_changed_id = 0;
+ model->lengths = NULL;
+}
+
diff --git a/addressbook/gui/component/select-names/e-select-names-text-model.h b/addressbook/gui/component/select-names/e-select-names-text-model.h
new file mode 100644
index 0000000000..564886ffc9
--- /dev/null
+++ b/addressbook/gui/component/select-names/e-select-names-text-model.h
@@ -0,0 +1,44 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Authors:
+ * Chris Lahey <clahey@helixcode.com>
+ *
+ * Copyright (C) 2000 Helix Code, Inc.
+ */
+
+#ifndef __E_SELECT_NAMES_TEXT_MODEL_H__
+#define __E_SELECT_NAMES_TEXT_MODEL_H__
+
+#include <time.h>
+#include <gtk/gtk.h>
+#include <stdio.h>
+#include "e-select-names-model.h"
+#include <widgets/e-text/e-text-model.h>
+
+#define E_TYPE_SELECT_NAMES_TEXT_MODEL (e_select_names_text_model_get_type ())
+#define E_SELECT_NAMES_TEXT_MODEL(obj) (GTK_CHECK_CAST ((obj), E_TYPE_SELECT_NAMES_TEXT_MODEL, ESelectNamesTextModel))
+#define E_SELECT_NAMES_TEXT_MODEL_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_SELECT_NAMES_TEXT_MODEL, ESelectNamesTextModelClass))
+#define E_IS_SELECT_NAMES_TEXT_MODEL(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_SELECT_NAMES_TEXT_MODEL))
+#define E_IS_SELECT_NAMES_TEXT_MODEL_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), E_TYPE_SELECT_NAMES_TEXT_MODEL))
+
+typedef struct _ESelectNamesTextModel ESelectNamesTextModel;
+typedef struct _ESelectNamesTextModelClass ESelectNamesTextModelClass;
+
+struct _ESelectNamesTextModel {
+ ETextModel parent;
+
+ ESelectNamesModel *source;
+ int source_changed_id;
+ int *lengths;
+};
+
+struct _ESelectNamesTextModelClass {
+ ETextModel parent_class;
+};
+
+ETextModel *e_select_names_text_model_new (ESelectNamesModel *source);
+
+/* Standard Gtk function */
+GtkType e_select_names_text_model_get_type (void);
+
+#endif /* ! __E_SELECT_NAMES_TEXT_MODEL_H__ */
diff --git a/addressbook/gui/component/select-names/e-select-names.c b/addressbook/gui/component/select-names/e-select-names.c
new file mode 100644
index 0000000000..a17dd410d3
--- /dev/null
+++ b/addressbook/gui/component/select-names/e-select-names.c
@@ -0,0 +1,344 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/* e-select-names.c
+ * Copyright (C) 2000 Helix Code, Inc.
+ * Author: Chris Lahey <clahey@helixcode.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * 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 library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+#include <gnome.h>
+#include "e-select-names.h"
+#include <e-table-simple.h>
+#include <e-table.h>
+#include <e-cell-text.h>
+#include <addressbook/gui/component/model/e-addressbook-model.h>
+#include <addressbook/gui/component/model/e-cardlist-model.h>
+#include <addressbook/backend/ebook/e-book.h>
+
+static void e_select_names_init (ESelectNames *card);
+static void e_select_names_class_init (ESelectNamesClass *klass);
+static void e_select_names_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
+static void e_select_names_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
+static void e_select_names_destroy (GtkObject *object);
+
+static GnomeDialogClass *parent_class = NULL;
+#define PARENT_TYPE gnome_dialog_get_type()
+
+/* The arguments we take */
+enum {
+ ARG_0,
+ ARG_BOOK,
+ ARG_QUERY,
+};
+
+typedef struct {
+ char *title;
+ ETableModel *model;
+ ESelectNames *names;
+} ESelectNamesChild;
+
+GtkType
+e_select_names_get_type (void)
+{
+ static GtkType type = 0;
+
+ if (!type) {
+ static const GtkTypeInfo info =
+ {
+ "ESelectNames",
+ sizeof (ESelectNames),
+ sizeof (ESelectNamesClass),
+ (GtkClassInitFunc) e_select_names_class_init,
+ (GtkObjectInitFunc) e_select_names_init,
+ /* reserved_1 */ NULL,
+ /* reserved_2 */ NULL,
+ (GtkClassInitFunc) NULL,
+ };
+
+ type = gtk_type_unique (PARENT_TYPE, &info);
+ }
+
+ return type;
+}
+
+static void
+e_select_names_class_init (ESelectNamesClass *klass)
+{
+ GtkObjectClass *object_class;
+
+ object_class = (GtkObjectClass*) klass;
+
+ parent_class = gtk_type_class (PARENT_TYPE);
+
+ gtk_object_add_arg_type ("ESelectNames::book", GTK_TYPE_OBJECT,
+ GTK_ARG_READWRITE, ARG_BOOK);
+ gtk_object_add_arg_type ("ESelectNames::query", GTK_TYPE_STRING,
+ GTK_ARG_READWRITE, ARG_QUERY);
+
+ object_class->set_arg = e_select_names_set_arg;
+ object_class->get_arg = e_select_names_get_arg;
+ object_class->destroy = e_select_names_destroy;
+}
+
+#define SPEC "<ETableSpecification no-header=\"1\"> \
+ <columns-shown> \
+ <column> 0 </column> \
+ <column> 2 </column> \
+ </columns-shown> \
+ <grouping> <leaf column=\"0\" ascending=\"1\"/> </grouping> \
+</ETableSpecification>"
+
+GtkWidget *e_addressbook_create_ebook_table(char *name, char *string1, char *string2, int num1, int num2);
+
+static void
+set_book(EBook *book, EBookStatus status, ETableModel *model)
+{
+ gtk_object_set(GTK_OBJECT(model),
+ "book", book,
+ NULL);
+ gtk_object_unref(GTK_OBJECT(book));
+}
+
+GtkWidget *
+e_addressbook_create_ebook_table(char *name, char *string1, char *string2, int num1, int num2)
+{
+ ETableModel *model;
+ ETableHeader *header;
+ ECell *cell_left_just;
+ EBook *book;
+ GtkWidget *table;
+ char *filename;
+ char *uri;
+
+ model = e_addressbook_model_new();
+ cell_left_just = e_cell_text_new (model, NULL, GTK_JUSTIFY_LEFT);
+
+ header = e_table_header_new ();
+ e_table_header_add_column (header, e_table_col_new (0, "Full Name", 1.0, 20, cell_left_just,
+ g_str_compare, TRUE), 0);
+
+ book = e_book_new();
+ gtk_object_ref(GTK_OBJECT(model));
+ gtk_object_ref(GTK_OBJECT(book));
+ filename = gnome_util_prepend_user_home("evolution/local/Contacts/addressbook.db");
+ uri = g_strdup_printf("file://%s", filename);
+ e_book_load_uri(book, uri, (EBookCallback) set_book, model);
+ g_free(uri);
+ g_free(filename);
+ table = e_table_new (header, model, SPEC);
+ gtk_object_set_data(GTK_OBJECT(table), "model", model);
+ return table;
+}
+
+static void
+set_current_selection(ETable *table, int row, ESelectNames *names)
+{
+ names->currently_selected = row;
+}
+
+static void
+e_select_names_init (ESelectNames *e_select_names)
+{
+ GladeXML *gui;
+ GtkWidget *widget;
+
+ gui = glade_xml_new (EVOLUTION_GLADEDIR "/select-names.glade", NULL);
+ e_select_names->gui = gui;
+
+ e_select_names->children = g_hash_table_new(g_str_hash, g_str_equal);
+ e_select_names->child_count = 0;
+
+ widget = glade_xml_get_widget(gui, "table-top");
+ if (!widget) {
+ return;
+ }
+ gtk_widget_ref(widget);
+ gtk_widget_unparent(widget);
+ gtk_box_pack_start(GTK_BOX(GNOME_DIALOG(e_select_names)->vbox), widget, TRUE, TRUE, 0);
+ gtk_widget_unref(widget);
+
+ gnome_dialog_append_buttons(GNOME_DIALOG(e_select_names),
+ GNOME_STOCK_BUTTON_OK,
+ GNOME_STOCK_BUTTON_CANCEL,
+ NULL);
+
+ e_select_names->table = E_TABLE(glade_xml_get_widget(gui, "table-source"));
+ e_select_names->model = gtk_object_get_data(GTK_OBJECT(e_select_names->table), "model");
+
+ e_select_names->currently_selected = -1;
+
+ gtk_signal_connect(GTK_OBJECT(e_select_names->table), "cursor_change",
+ GTK_SIGNAL_FUNC(set_current_selection), e_select_names);
+}
+
+static void e_select_names_child_free(char *key, ESelectNamesChild *child, ESelectNames *e_select_names)
+{
+ g_free(child->title);
+ gtk_object_unref(GTK_OBJECT(child->model));
+ g_free(key);
+}
+
+static void
+e_select_names_destroy (GtkObject *object) {
+ ESelectNames *e_select_names = E_SELECT_NAMES(object);
+
+ gtk_object_unref(GTK_OBJECT(e_select_names->gui));
+ g_hash_table_foreach(e_select_names->children, (GHFunc) e_select_names_child_free, e_select_names);
+ g_hash_table_destroy(e_select_names->children);
+}
+
+GtkWidget*
+e_select_names_new (void)
+{
+ GtkWidget *widget = GTK_WIDGET (gtk_type_new (e_select_names_get_type ()));
+ return widget;
+}
+
+static void
+e_select_names_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
+{
+ ESelectNames *editor;
+
+ editor = E_SELECT_NAMES (o);
+
+ switch (arg_id){
+ default:
+ return;
+ }
+}
+
+static void
+e_select_names_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
+{
+ ESelectNames *e_select_names;
+
+ e_select_names = E_SELECT_NAMES (object);
+
+ switch (arg_id) {
+ default:
+ arg->type = GTK_TYPE_INVALID;
+ break;
+ }
+}
+
+static void
+button_clicked(GtkWidget *button, ESelectNamesChild *child)
+{
+ ESelectNames *names = child->names;
+ int row = names->currently_selected;
+ if (row != -1) {
+ ECard *card = e_addressbook_model_get_card(E_ADDRESSBOOK_MODEL(names->model), row);
+ e_cardlist_model_add(E_CARDLIST_MODEL(child->model), &card, 1);
+ gtk_object_unref(GTK_OBJECT(card));
+ }
+}
+
+void
+e_select_names_add_section(ESelectNames *e_select_names, char *name, char *id)
+{
+ ESelectNamesChild *child;
+ GtkWidget *button;
+ GtkWidget *alignment;
+ GtkTable *table;
+ char *label;
+
+ ETableModel *model;
+ GtkWidget *etable;
+ ETableHeader *header;
+ ECell *cell_left_just;
+
+ if (g_hash_table_lookup(e_select_names->children, id)) {
+ return;
+ }
+
+ table = GTK_TABLE(glade_xml_get_widget (e_select_names->gui, "table-recipients"));
+
+ child = g_new(ESelectNamesChild, 1);
+
+ child->names = e_select_names;
+
+ e_select_names->child_count++;
+
+ alignment = gtk_alignment_new(0, 0, 1, 0);
+ label = g_strdup_printf("%s ->", _(name));
+ button = gtk_button_new_with_label(label);
+ g_free(label);
+ gtk_container_add(GTK_CONTAINER(alignment), button);
+ gtk_widget_show_all(alignment);
+ gtk_signal_connect(GTK_OBJECT(button), "clicked",
+ GTK_SIGNAL_FUNC(button_clicked), child);
+ gtk_table_attach(table, alignment,
+ 0, 1,
+ e_select_names->child_count,
+ e_select_names->child_count + 1,
+ GTK_FILL, GTK_FILL,
+ 0, 0);
+
+ model = e_cardlist_model_new();
+ header = e_table_header_new ();
+ cell_left_just = e_cell_text_new (model, NULL, GTK_JUSTIFY_LEFT);
+ e_table_header_add_column (header, e_table_col_new (0, "Full Name", 1.0, 20, cell_left_just,
+ g_str_compare, TRUE), 0);
+ etable = e_table_new (header, model, SPEC);
+
+ child->model = model;
+ gtk_object_ref(GTK_OBJECT(child->model));
+
+ gtk_widget_show(etable);
+
+ gtk_table_attach(table, etable,
+ 1, 2,
+ e_select_names->child_count,
+ e_select_names->child_count + 1,
+ GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND,
+ 0, 0);
+}
+
+static void *
+card_copy(const void *value, void *closure)
+{
+ gtk_object_ref(GTK_OBJECT(value));
+ return (void *)value;
+}
+
+static void
+card_free(void *value, void *closure)
+{
+ gtk_object_unref(GTK_OBJECT(value));
+}
+
+EList *
+e_select_names_get_section(ESelectNames *e_select_names, char *id)
+{
+ ESelectNamesChild *child;
+ int i;
+ int rows;
+ EList *list;
+
+ child = g_hash_table_lookup(e_select_names->children, id);
+ if (!child)
+ return NULL;
+ rows = e_table_model_row_count(child->model);
+
+ list = e_list_new(card_copy, card_free, NULL);
+ for (i = 0; i < rows; i++) {
+ ECard *card = e_cardlist_model_get(E_CARDLIST_MODEL(child->model), i);
+ e_list_append(list, card);
+ gtk_object_unref(GTK_OBJECT(card));
+ }
+ return list;
+}
diff --git a/addressbook/gui/component/select-names/e-select-names.h b/addressbook/gui/component/select-names/e-select-names.h
new file mode 100644
index 0000000000..c9d4619db2
--- /dev/null
+++ b/addressbook/gui/component/select-names/e-select-names.h
@@ -0,0 +1,86 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/* e-select-names.h
+ * Copyright (C) 2000 Helix Code, Inc.
+ * Author: Chris Lahey <clahey@helixcode.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * 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 library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+#ifndef __E_SELECT_NAMES_H__
+#define __E_SELECT_NAMES_H__
+
+#include <gnome.h>
+#include <glade/glade.h>
+#include <e-util/e-list.h>
+#include <widgets/e-table/e-table.h>
+
+#ifdef __cplusplus
+extern "C" {
+#pragma }
+#endif /* __cplusplus */
+
+/* ESelectNames - A dialog displaying information about a contact.
+ *
+ * The following arguments are available:
+ *
+ * name type read/write description
+ * --------------------------------------------------------------------------------
+ */
+
+#define E_SELECT_NAMES_TYPE (e_select_names_get_type ())
+#define E_SELECT_NAMES(obj) (GTK_CHECK_CAST ((obj), E_SELECT_NAMES_TYPE, ESelectNames))
+#define E_SELECT_NAMES_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_SELECT_NAMES_TYPE, ESelectNamesClass))
+#define E_IS_SELECT_NAMES(obj) (GTK_CHECK_TYPE ((obj), E_SELECT_NAMES_TYPE))
+#define E_IS_SELECT_NAMES_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_SELECT_NAMES_TYPE))
+
+
+typedef struct _ESelectNames ESelectNames;
+typedef struct _ESelectNamesClass ESelectNamesClass;
+
+struct _ESelectNames
+{
+ GnomeDialog parent;
+
+ /* item specific fields */
+ GladeXML *gui;
+
+ GHashTable *children; /* Of type char * to ESelectNamesChild */
+ int child_count;
+ ETable *table;
+ ETableModel *model;
+ int currently_selected;
+};
+
+struct _ESelectNamesClass
+{
+ GnomeDialogClass parent_class;
+};
+
+
+GtkWidget *e_select_names_new (void);
+GtkType e_select_names_get_type (void);
+void e_select_names_add_section (ESelectNames *e_select_names,
+ char *name,
+ char *id);
+/* Returns a ref counted list of addresses. */
+EList *e_select_names_get_section (ESelectNames *e_select_names,
+ char *id);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+
+#endif /* __E_SELECT_NAMES_H__ */
diff --git a/addressbook/gui/component/select-names/recipient.glade b/addressbook/gui/component/select-names/recipient.glade
new file mode 100644
index 0000000000..b60972d094
--- /dev/null
+++ b/addressbook/gui/component/select-names/recipient.glade
@@ -0,0 +1,61 @@
+<?xml version="1.0"?>
+<GTK-Interface>
+
+<project>
+ <name>Recipient</name>
+ <program_name>recipient</program_name>
+ <directory></directory>
+ <source_directory>src</source_directory>
+ <pixmaps_directory>pixmaps</pixmaps_directory>
+ <language>C</language>
+ <gnome_support>True</gnome_support>
+ <gettext_support>True</gettext_support>
+ <use_widget_names>True</use_widget_names>
+ <output_main_file>False</output_main_file>
+ <output_support_files>False</output_support_files>
+ <output_build_files>False</output_build_files>
+ <gnome_help_support>True</gnome_help_support>
+</project>
+
+<widget>
+ <class>GtkWindow</class>
+ <name>window1</name>
+ <visible>False</visible>
+ <title>window1</title>
+ <type>GTK_WINDOW_TOPLEVEL</type>
+ <position>GTK_WIN_POS_NONE</position>
+ <modal>False</modal>
+ <allow_shrink>False</allow_shrink>
+ <allow_grow>True</allow_grow>
+ <auto_shrink>False</auto_shrink>
+
+ <widget>
+ <class>GtkHBox</class>
+ <name>hbox-top</name>
+ <homogeneous>False</homogeneous>
+ <spacing>4</spacing>
+
+ <widget>
+ <class>GtkAlignment</class>
+ <name>alignment1</name>
+ <xalign>1.08033e-07</xalign>
+ <yalign>0</yalign>
+ <xscale>1</xscale>
+ <yscale>0</yscale>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>True</fill>
+ </child>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>text-button</name>
+ <can_focus>True</can_focus>
+ <label>-&gt;</label>
+ </widget>
+ </widget>
+ </widget>
+</widget>
+
+</GTK-Interface>
diff --git a/addressbook/gui/component/select-names/select-names.glade b/addressbook/gui/component/select-names/select-names.glade
new file mode 100644
index 0000000000..46da911228
--- /dev/null
+++ b/addressbook/gui/component/select-names/select-names.glade
@@ -0,0 +1,245 @@
+<?xml version="1.0"?>
+<GTK-Interface>
+
+<project>
+ <name>Select-names</name>
+ <program_name>select-names</program_name>
+ <directory></directory>
+ <source_directory>src</source_directory>
+ <pixmaps_directory>pixmaps</pixmaps_directory>
+ <language>C</language>
+ <gnome_support>True</gnome_support>
+ <gettext_support>True</gettext_support>
+ <output_main_file>False</output_main_file>
+ <output_support_files>False</output_support_files>
+ <output_build_files>False</output_build_files>
+ <output_translatable_strings>True</output_translatable_strings>
+ <translatable_strings_file>select-names.glade.h</translatable_strings_file>
+</project>
+
+<widget>
+ <class>GnomeDialog</class>
+ <name>dialog-top</name>
+ <visible>False</visible>
+ <title>Select Names</title>
+ <type>GTK_WINDOW_TOPLEVEL</type>
+ <position>GTK_WIN_POS_NONE</position>
+ <modal>False</modal>
+ <allow_shrink>False</allow_shrink>
+ <allow_grow>True</allow_grow>
+ <auto_shrink>False</auto_shrink>
+ <auto_close>False</auto_close>
+ <hide_on_close>False</hide_on_close>
+
+ <widget>
+ <class>GtkVBox</class>
+ <child_name>GnomeDialog:vbox</child_name>
+ <name>dialog-vbox1</name>
+ <homogeneous>False</homogeneous>
+ <spacing>8</spacing>
+ <child>
+ <padding>4</padding>
+ <expand>True</expand>
+ <fill>True</fill>
+ </child>
+
+ <widget>
+ <class>GtkHButtonBox</class>
+ <child_name>GnomeDialog:action_area</child_name>
+ <name>dialog-action_area1</name>
+ <layout_style>GTK_BUTTONBOX_END</layout_style>
+ <spacing>8</spacing>
+ <child_min_width>85</child_min_width>
+ <child_min_height>27</child_min_height>
+ <child_ipad_x>7</child_ipad_x>
+ <child_ipad_y>0</child_ipad_y>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>True</fill>
+ <pack>GTK_PACK_END</pack>
+ </child>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button1</name>
+ <can_default>True</can_default>
+ <can_focus>True</can_focus>
+ <stock_button>GNOME_STOCK_BUTTON_OK</stock_button>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button3</name>
+ <can_default>True</can_default>
+ <can_focus>True</can_focus>
+ <stock_button>GNOME_STOCK_BUTTON_CANCEL</stock_button>
+ </widget>
+ </widget>
+
+ <widget>
+ <class>GtkTable</class>
+ <name>table-top</name>
+ <rows>3</rows>
+ <columns>2</columns>
+ <homogeneous>False</homogeneous>
+ <row_spacing>6</row_spacing>
+ <column_spacing>6</column_spacing>
+ <child>
+ <padding>0</padding>
+ <expand>True</expand>
+ <fill>True</fill>
+ </child>
+
+ <widget>
+ <class>GtkHBox</class>
+ <name>hbox1</name>
+ <homogeneous>False</homogeneous>
+ <spacing>4</spacing>
+ <child>
+ <left_attach>0</left_attach>
+ <right_attach>1</right_attach>
+ <top_attach>1</top_attach>
+ <bottom_attach>2</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>True</xexpand>
+ <yexpand>False</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>True</yfill>
+ </child>
+
+ <widget>
+ <class>GtkEntry</class>
+ <name>entry-find</name>
+ <can_focus>True</can_focus>
+ <has_focus>True</has_focus>
+ <editable>True</editable>
+ <text_visible>True</text_visible>
+ <text_max_length>0</text_max_length>
+ <text></text>
+ <child>
+ <padding>0</padding>
+ <expand>True</expand>
+ <fill>True</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-find</name>
+ <can_focus>True</can_focus>
+ <label>Find...</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+ </widget>
+
+ <widget>
+ <class>GtkAccelLabel</class>
+ <name>accellabel1</name>
+ <label>T_ype name or select from List:</label>
+ <justify>GTK_JUSTIFY_LEFT</justify>
+ <wrap>False</wrap>
+ <xalign>0</xalign>
+ <yalign>0</yalign>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <child>
+ <left_attach>0</left_attach>
+ <right_attach>1</right_attach>
+ <top_attach>0</top_attach>
+ <bottom_attach>1</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>True</xexpand>
+ <yexpand>False</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>True</yfill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>Custom</class>
+ <name>table-source</name>
+ <creation_function>e_addressbook_create_ebook_table</creation_function>
+ <int1>0</int1>
+ <int2>0</int2>
+ <last_modification_time>Sat, 10 Jun 2000 22:02:57 GMT</last_modification_time>
+ <child>
+ <left_attach>0</left_attach>
+ <right_attach>1</right_attach>
+ <top_attach>2</top_attach>
+ <bottom_attach>3</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>True</xexpand>
+ <yexpand>True</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>True</yfill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkTable</class>
+ <name>table-recipients</name>
+ <rows>1</rows>
+ <columns>2</columns>
+ <homogeneous>False</homogeneous>
+ <row_spacing>4</row_spacing>
+ <column_spacing>4</column_spacing>
+ <child>
+ <left_attach>1</left_attach>
+ <right_attach>2</right_attach>
+ <top_attach>2</top_attach>
+ <bottom_attach>3</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>True</xexpand>
+ <yexpand>False</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>True</yfill>
+ </child>
+
+ <widget>
+ <class>GtkAccelLabel</class>
+ <name>accellabel2</name>
+ <label>Message Recipients</label>
+ <justify>GTK_JUSTIFY_CENTER</justify>
+ <wrap>False</wrap>
+ <xalign>0</xalign>
+ <yalign>0.5</yalign>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <child>
+ <left_attach>1</left_attach>
+ <right_attach>2</right_attach>
+ <top_attach>0</top_attach>
+ <bottom_attach>1</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>True</xexpand>
+ <yexpand>False</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>True</yfill>
+ </child>
+ </widget>
+ </widget>
+ </widget>
+ </widget>
+</widget>
+
+</GTK-Interface>
diff --git a/addressbook/gui/component/select-names/select-names.glade.h b/addressbook/gui/component/select-names/select-names.glade.h
new file mode 100644
index 0000000000..a21ddce689
--- /dev/null
+++ b/addressbook/gui/component/select-names/select-names.glade.h
@@ -0,0 +1,10 @@
+/*
+ * Translatable strings file generated by Glade.
+ * Add this file to your project's POTFILES.in.
+ * DO NOT compile it as part of your application.
+ */
+
+gchar *s = N_("Select Names");
+gchar *s = N_("Find...");
+gchar *s = N_("T_ype name or select from List:");
+gchar *s = N_("Message Recipients");