aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--addressbook/gui/widgets/e-addressbook-treeview-adapter.c627
-rw-r--r--addressbook/gui/widgets/e-addressbook-treeview-adapter.h44
-rw-r--r--addressbook/gui/widgets/gal-view-factory-treeview.c86
-rw-r--r--addressbook/gui/widgets/gal-view-factory-treeview.h35
-rw-r--r--addressbook/gui/widgets/gal-view-minicard.c2
-rw-r--r--addressbook/gui/widgets/gal-view-treeview.c227
-rw-r--r--addressbook/gui/widgets/gal-view-treeview.h43
7 files changed, 1063 insertions, 1 deletions
diff --git a/addressbook/gui/widgets/e-addressbook-treeview-adapter.c b/addressbook/gui/widgets/e-addressbook-treeview-adapter.c
new file mode 100644
index 0000000000..d6401133ec
--- /dev/null
+++ b/addressbook/gui/widgets/e-addressbook-treeview-adapter.c
@@ -0,0 +1,627 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+#include <config.h>
+#include "e-addressbook-model.h"
+#include "e-addressbook-treeview-adapter.h"
+#include "e-card-merging.h"
+#include "e-addressbook-util.h"
+#include <gtk/gtktreednd.h>
+#include <libxml/tree.h>
+#include <libxml/parser.h>
+#include <libxml/xmlmemory.h>
+
+struct _EAddressbookTreeViewAdapterPrivate {
+ EAddressbookModel *model;
+
+ gint stamp;
+
+ ECardSimple **simples;
+ int count;
+
+ int create_card_id, remove_card_id, modify_card_id, model_changed_id;
+};
+
+#define PARENT_TYPE G_TYPE_OBJECT
+GObjectClass *parent_class;
+
+#define COLS (E_CARD_SIMPLE_FIELD_LAST)
+
+static void
+unlink_model(EAddressbookTreeViewAdapter *adapter)
+{
+ EAddressbookTreeViewAdapterPrivate *priv = adapter->priv;
+ int i;
+
+ g_signal_handler_disconnect (priv->model,
+ priv->create_card_id);
+ g_signal_handler_disconnect (priv->model,
+ priv->remove_card_id);
+ g_signal_handler_disconnect (priv->model,
+ priv->modify_card_id);
+ g_signal_handler_disconnect (priv->model,
+ priv->model_changed_id);
+
+ priv->create_card_id = 0;
+ priv->remove_card_id = 0;
+ priv->modify_card_id = 0;
+ priv->model_changed_id = 0;
+
+ /* free up the existing mapping if there is one */
+ if (priv->simples) {
+ for (i = 0; i < priv->count; i ++)
+ g_object_unref (priv->simples[i]);
+ g_free (priv->simples);
+ priv->simples = NULL;
+ }
+
+ g_object_unref (priv->model);
+
+ priv->model = NULL;
+}
+
+static void
+build_simple_mapping(EAddressbookTreeViewAdapter *adapter)
+{
+ EAddressbookTreeViewAdapterPrivate *priv = adapter->priv;
+ int i;
+
+ /* free up the existing mapping if there is one */
+ if (priv->simples) {
+ for (i = 0; i < priv->count; i ++)
+ g_object_unref (priv->simples[i]);
+ g_free (priv->simples);
+ }
+
+ /* build up our mapping to ECardSimple*'s */
+ priv->count = e_addressbook_model_card_count (priv->model);
+ priv->simples = g_new (ECardSimple*, priv->count);
+ for (i = 0; i < priv->count; i ++) {
+ priv->simples[i] = e_card_simple_new (e_addressbook_model_card_at (priv->model, i));
+ g_object_ref (priv->simples[i]);
+ }
+}
+
+static void
+addressbook_destroy(GtkObject *object)
+{
+ EAddressbookTreeViewAdapter *adapter = E_ADDRESSBOOK_TREEVIEW_ADAPTER(object);
+
+ unlink_model(adapter);
+
+ g_free (adapter->priv);
+}
+
+#if 0
+static void
+addressbook_set_value_at (ETableModel *etc, int col, int row, const void *val)
+{
+ EAddressbookTreeViewAdapter *adapter = E_ADDRESSBOOK_TABLE_ADAPTER(etc);
+ EAddressbookTableAdapterPrivate *priv = adapter->priv;
+ if (e_addressbook_model_editable (priv->model)) {
+ ECard *card;
+
+ if ( col >= COLS|| row >= e_addressbook_model_card_count (priv->model) )
+ return;
+
+ e_table_model_pre_change(etc);
+
+ e_card_simple_set(priv->simples[row],
+ col,
+ val);
+ g_object_get(priv->simples[row],
+ "card", &card,
+ NULL);
+
+ e_card_merging_book_commit_card(e_addressbook_model_get_ebook(priv->model),
+ card, card_modified_cb, NULL);
+
+ /* XXX do we need this? shouldn't the commit_card generate a changed signal? */
+ e_table_model_cell_changed(etc, col, row);
+ }
+}
+
+/* This function returns whether a particular cell is editable. */
+static gboolean
+addressbook_is_cell_editable (ETableModel *etc, int col, int row)
+{
+ EAddressbookTableAdapter *adapter = E_ADDRESSBOOK_TABLE_ADAPTER(etc);
+ EAddressbookTableAdapterPrivate *priv = adapter->priv;
+ ECard *card;
+
+ if (row >= 0 && row < e_addressbook_model_card_count (priv->model))
+ card = e_addressbook_model_card_at (priv->model, row);
+ else
+ card = NULL;
+
+ if (!e_addressbook_model_editable(priv->model))
+ return FALSE;
+ else if (card && e_card_evolution_list (card))
+ /* we only allow editing of the name and file as for
+ lists */
+ return col == E_CARD_SIMPLE_FIELD_FULL_NAME || col == E_CARD_SIMPLE_FIELD_FILE_AS;
+ else
+ return col < E_CARD_SIMPLE_FIELD_LAST_SIMPLE_STRING;
+}
+
+static void
+addressbook_append_row (ETableModel *etm, ETableModel *source, gint row)
+{
+ EAddressbookTableAdapter *adapter = E_ADDRESSBOOK_TABLE_ADAPTER(etm);
+ EAddressbookTableAdapterPrivate *priv = adapter->priv;
+ ECard *card;
+ ECardSimple *simple;
+ int col;
+
+ card = e_card_new("");
+ simple = e_card_simple_new(card);
+
+ for (col = 0; col < E_CARD_SIMPLE_FIELD_LAST_SIMPLE_STRING; col++) {
+ const void *val = e_table_model_value_at(source, col, row);
+ e_card_simple_set(simple, col, val);
+ }
+ e_card_simple_sync_card(simple);
+ e_card_merging_book_add_card (e_addressbook_model_get_ebook (priv->model), card, NULL, NULL);
+ g_object_unref (simple);
+ g_object_unref (card);
+}
+#endif
+
+static void
+e_addressbook_treeview_adapter_class_init (GtkObjectClass *object_class)
+{
+ parent_class = g_type_class_peek_parent (object_class);
+
+ object_class->destroy = addressbook_destroy;
+}
+
+static void
+e_addressbook_treeview_adapter_init (GtkObject *object)
+{
+ EAddressbookTreeViewAdapter *adapter = E_ADDRESSBOOK_TREEVIEW_ADAPTER(object);
+ EAddressbookTreeViewAdapterPrivate *priv;
+
+ priv = adapter->priv = g_new0 (EAddressbookTreeViewAdapterPrivate, 1);
+
+ priv->create_card_id = 0;
+ priv->remove_card_id = 0;
+ priv->modify_card_id = 0;
+ priv->model_changed_id = 0;
+ priv->simples = NULL;
+ priv->count = 0;
+}
+
+static void
+get_iter (EAddressbookTreeViewAdapter *adapter, gint index, GtkTreeIter *iter)
+{
+ EAddressbookTreeViewAdapterPrivate *priv = adapter->priv;
+
+ iter->stamp = priv->stamp;
+ iter->user_data = GINT_TO_POINTER (index);
+}
+
+static void
+create_card (EAddressbookModel *model,
+ gint index, gint count,
+ EAddressbookTreeViewAdapter *adapter)
+{
+ EAddressbookTreeViewAdapterPrivate *priv = adapter->priv;
+ int i;
+
+ priv->count += count;
+ priv->simples = g_renew(ECardSimple *, priv->simples, priv->count);
+ memmove (priv->simples + index + count, priv->simples + index, (priv->count - index - count) * sizeof (ECardSimple *));
+
+ for (i = 0; i < count; i ++) {
+ GtkTreeIter iter;
+ GtkTreePath *path;
+
+ priv->simples[index + i] = e_card_simple_new (e_addressbook_model_card_at (priv->model, index + i));
+
+ get_iter (adapter, index + i, &iter);
+ path = gtk_tree_model_get_path (GTK_TREE_MODEL (adapter), &iter);
+
+ gtk_tree_model_row_inserted (GTK_TREE_MODEL (adapter), path, &iter);
+ gtk_tree_model_row_changed (GTK_TREE_MODEL (adapter), path, &iter);
+
+ gtk_tree_path_free (path);
+ }
+}
+
+static void
+remove_card (EAddressbookModel *model,
+ gint index,
+ EAddressbookTreeViewAdapter *adapter)
+{
+ EAddressbookTreeViewAdapterPrivate *priv = adapter->priv;
+ GtkTreeIter iter;
+ GtkTreePath *path;
+
+ g_object_unref (priv->simples[index]);
+ memmove (priv->simples + index, priv->simples + index + 1, (priv->count - index - 1) * sizeof (ECardSimple *));
+ priv->count --;
+ get_iter (adapter, index, &iter);
+ path = gtk_tree_model_get_path (GTK_TREE_MODEL (adapter), &iter);
+
+ gtk_tree_model_row_deleted (GTK_TREE_MODEL (adapter), path);
+
+ gtk_tree_path_free (path);
+}
+
+static void
+modify_card (EAddressbookModel *model,
+ gint index,
+ EAddressbookTreeViewAdapter *adapter)
+{
+ EAddressbookTreeViewAdapterPrivate *priv = adapter->priv;
+ GtkTreeIter iter;
+ GtkTreePath *path;
+
+ g_object_unref (priv->simples[index]);
+ priv->simples[index] = e_card_simple_new (e_addressbook_model_card_at (priv->model, index));
+
+ get_iter (adapter, index, &iter);
+ path = gtk_tree_model_get_path (GTK_TREE_MODEL (adapter), &iter);
+
+ gtk_tree_model_row_changed (GTK_TREE_MODEL (adapter), path, &iter);
+
+ gtk_tree_path_free (path);
+}
+
+static void
+model_changed (EAddressbookModel *model,
+ EAddressbookTreeViewAdapter *adapter)
+{
+ int i;
+
+ /* there has *got* to be an easier/faster way to do this... */
+ for (i = 0; i < adapter->priv->count; i++) {
+ remove_card (model, i, adapter);
+ }
+
+ build_simple_mapping (adapter);
+
+ if (adapter->priv->count) {
+ printf ("AIIEEEEEE\n");
+ }
+
+ /* XXX this isn't right either, we need to add the new cards */
+}
+
+static GtkTreeModelFlags
+adapter_get_flags (GtkTreeModel *tree_model)
+{
+ g_return_val_if_fail (E_IS_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model), 0);
+
+ return GTK_TREE_MODEL_LIST_ONLY;
+}
+
+static gint
+adapter_get_n_columns (GtkTreeModel *tree_model)
+{
+ g_return_val_if_fail (E_IS_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model), 0);
+
+ return COLS;
+}
+
+static GType
+adapter_get_column_type (GtkTreeModel *tree_model,
+ gint index)
+{
+ g_return_val_if_fail (E_IS_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model), G_TYPE_INVALID);
+ g_return_val_if_fail (index < COLS && index >= 0, G_TYPE_INVALID);
+
+ return G_TYPE_STRING;
+}
+
+static gboolean
+adapter_get_iter (GtkTreeModel *tree_model,
+ GtkTreeIter *iter,
+ GtkTreePath *path)
+{
+ EAddressbookTreeViewAdapter *adapter;
+ GSList *list;
+ gint i;
+
+ g_return_val_if_fail (E_IS_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model), FALSE);
+ g_return_val_if_fail (gtk_tree_path_get_depth (path) > 0, FALSE);
+
+ adapter = E_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model);
+
+ i = gtk_tree_path_get_indices (path)[0];
+
+ if (i >= adapter->priv->count)
+ return FALSE;
+
+ iter->stamp = adapter->priv->stamp;
+ iter->user_data = GINT_TO_POINTER (i);
+
+ return TRUE;
+}
+
+static GtkTreePath *
+adapter_get_path (GtkTreeModel *tree_model,
+ GtkTreeIter *iter)
+{
+ EAddressbookTreeViewAdapter *adapter = E_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model);
+ GtkTreePath *retval;
+
+ g_return_val_if_fail (E_IS_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model), NULL);
+ g_return_val_if_fail (iter->stamp == adapter->priv->stamp, NULL);
+
+
+ if (GPOINTER_TO_INT (iter->user_data) >= adapter->priv->count)
+ return NULL;
+
+ retval = gtk_tree_path_new ();
+ gtk_tree_path_append_index (retval, GPOINTER_TO_INT (iter->user_data));
+ return retval;
+}
+
+static void
+adapter_get_value (GtkTreeModel *tree_model,
+ GtkTreeIter *iter,
+ gint column,
+ GValue *value)
+{
+ EAddressbookTreeViewAdapter *adapter = E_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model);
+ ECardSimple *simple;
+ gint tmp_column = column;
+ const char *v;
+
+ g_return_if_fail (E_IS_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model));
+ g_return_if_fail (column < COLS);
+ g_return_if_fail (adapter->priv->stamp == iter->stamp);
+
+ simple = adapter->priv->simples [ GPOINTER_TO_INT (iter->user_data) ];
+
+ v = e_card_simple_get_const(simple, column);
+
+ if (v && !strncmp (v, "<?xml", 5)) {
+ EDestination *dest = e_destination_import (v);
+ if (dest) {
+ /* XXX blech, we leak this */
+ v = g_strdup (e_destination_get_address (dest));
+ g_object_unref (dest);
+ }
+ }
+
+ g_value_init (value, G_TYPE_STRING);
+ g_value_set_string (value, (v ? v : ""));
+}
+
+static gboolean
+adapter_iter_next (GtkTreeModel *tree_model,
+ GtkTreeIter *iter)
+{
+ EAddressbookTreeViewAdapter *adapter;
+
+ g_return_val_if_fail (E_IS_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model), FALSE);
+ g_return_val_if_fail (E_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model)->priv->stamp == iter->stamp, FALSE);
+
+ adapter = E_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model);
+
+ iter->user_data = GINT_TO_POINTER (GPOINTER_TO_INT (iter->user_data) + 1);
+
+ return (GPOINTER_TO_INT (iter->user_data) < adapter->priv->count);
+}
+
+static gboolean
+adapter_iter_children (GtkTreeModel *tree_model,
+ GtkTreeIter *iter,
+ GtkTreeIter *parent)
+{
+ EAddressbookTreeViewAdapter *adapter = E_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model);
+
+ /* this is a list, nodes have no children */
+ if (parent)
+ return FALSE;
+
+ /* but if parent == NULL we return the list itself as children of the
+ * "root"
+ */
+ if (adapter->priv->count) {
+ iter->stamp = adapter->priv->stamp;
+ iter->user_data = GINT_TO_POINTER (0);
+ return TRUE;
+ }
+ else
+ return FALSE;
+}
+
+static gboolean
+adapter_iter_has_child (GtkTreeModel *tree_model,
+ GtkTreeIter *iter)
+{
+ return FALSE;
+}
+
+static gint
+adapter_iter_n_children (GtkTreeModel *tree_model,
+ GtkTreeIter *iter)
+{
+ EAddressbookTreeViewAdapter *adapter = E_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model);
+
+ g_return_val_if_fail (E_IS_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model), -1);
+ if (iter == NULL)
+ return adapter->priv->count;
+
+ g_return_val_if_fail (adapter->priv->stamp == iter->stamp, -1);
+ return 0;
+}
+
+static gboolean
+adapter_iter_nth_child (GtkTreeModel *tree_model,
+ GtkTreeIter *iter,
+ GtkTreeIter *parent,
+ gint n)
+{
+ EAddressbookTreeViewAdapter *adapter = E_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model);
+
+ g_return_val_if_fail (E_IS_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model), FALSE);
+
+ if (parent)
+ return FALSE;
+
+ if (n < adapter->priv->count) {
+ iter->stamp = adapter->priv->stamp;
+ iter->user_data = GINT_TO_POINTER (n);
+ return TRUE;
+ }
+ else
+ return FALSE;
+}
+
+static gboolean
+adapter_iter_parent (GtkTreeModel *tree_model,
+ GtkTreeIter *iter,
+ GtkTreeIter *child)
+{
+ return FALSE;
+}
+
+static void
+adapter_tree_model_init (GtkTreeModelIface *iface)
+{
+ iface->get_flags = adapter_get_flags;
+ iface->get_n_columns = adapter_get_n_columns;
+ iface->get_column_type = adapter_get_column_type;
+ iface->get_iter = adapter_get_iter;
+ iface->get_path = adapter_get_path;
+ iface->get_value = adapter_get_value;
+ iface->iter_next = adapter_iter_next;
+ iface->iter_children = adapter_iter_children;
+ iface->iter_has_child = adapter_iter_has_child;
+ iface->iter_n_children = adapter_iter_n_children;
+ iface->iter_nth_child = adapter_iter_nth_child;
+ iface->iter_parent = adapter_iter_parent;
+}
+
+static gboolean
+adapter_drag_data_delete (GtkTreeDragSource *drag_source,
+ GtkTreePath *path)
+{
+ g_return_val_if_fail (E_IS_ADDRESSBOOK_TREEVIEW_ADAPTER (drag_source), FALSE);
+
+ return FALSE;
+}
+
+static gboolean
+adapter_drag_data_get (GtkTreeDragSource *drag_source,
+ GtkTreePath *path,
+ GtkSelectionData *selection_data)
+{
+ g_return_val_if_fail (E_IS_ADDRESSBOOK_TREEVIEW_ADAPTER (drag_source), FALSE);
+
+ /* Note that we don't need to handle the GTK_TREE_MODEL_ROW
+ * target, because the default handler does it for us, but
+ * we do anyway for the convenience of someone maybe overriding the
+ * default handler.
+ */
+
+ if (gtk_tree_set_row_drag_data (selection_data,
+ GTK_TREE_MODEL (drag_source),
+ path)) {
+ return TRUE;
+ }
+ else {
+ if (selection_data->target == gdk_atom_intern ("text/x-vcard", FALSE)) {
+ printf ("HI THERE\n");
+ }
+ }
+
+ return FALSE;
+}
+
+static void
+adapter_drag_source_init (GtkTreeDragSourceIface *iface)
+{
+ iface->drag_data_delete = adapter_drag_data_delete;
+ iface->drag_data_get = adapter_drag_data_get;
+}
+
+GType
+e_addressbook_treeview_adapter_get_type (void)
+{
+ static GType type = 0;
+
+ if (!type) {
+ static const GTypeInfo adapter_info = {
+ sizeof (EAddressbookTreeViewAdapterClass),
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ (GClassInitFunc) e_addressbook_treeview_adapter_class_init,
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ sizeof (EAddressbookTreeViewAdapter),
+ 0, /* n_preallocs */
+ (GInstanceInitFunc) e_addressbook_treeview_adapter_init,
+ };
+
+ static const GInterfaceInfo tree_model_info = {
+ (GInterfaceInitFunc) adapter_tree_model_init,
+ NULL,
+ NULL
+ };
+
+ static const GInterfaceInfo drag_source_info = {
+ (GInterfaceInitFunc) adapter_drag_source_init,
+ NULL,
+ NULL
+ };
+
+ type = g_type_register_static (PARENT_TYPE, "EAddressbookTreeViewAdapter", &adapter_info, 0);
+
+ g_type_add_interface_static (type,
+ GTK_TYPE_TREE_MODEL,
+ &tree_model_info);
+
+ g_type_add_interface_static (type,
+ GTK_TYPE_TREE_DRAG_SOURCE,
+ &drag_source_info);
+ }
+
+ return type;
+}
+
+void
+e_addressbook_treeview_adapter_construct (EAddressbookTreeViewAdapter *adapter,
+ EAddressbookModel *model)
+{
+ EAddressbookTreeViewAdapterPrivate *priv = adapter->priv;
+
+ priv->model = model;
+ g_object_ref (priv->model);
+
+ priv->stamp = g_random_int ();
+
+ priv->create_card_id = g_signal_connect(priv->model,
+ "card_added",
+ G_CALLBACK(create_card),
+ adapter);
+ priv->remove_card_id = g_signal_connect(priv->model,
+ "card_removed",
+ G_CALLBACK(remove_card),
+ adapter);
+ priv->modify_card_id = g_signal_connect(priv->model,
+ "card_changed",
+ G_CALLBACK(modify_card),
+ adapter);
+ priv->model_changed_id = g_signal_connect(priv->model,
+ "model_changed",
+ G_CALLBACK(model_changed),
+ adapter);
+
+ build_simple_mapping (adapter);
+}
+
+GtkTreeModel *
+e_addressbook_treeview_adapter_new (EAddressbookModel *model)
+{
+ EAddressbookTreeViewAdapter *et;
+
+ et = g_object_new(E_TYPE_ADDRESSBOOK_TREEVIEW_ADAPTER, NULL);
+
+ e_addressbook_treeview_adapter_construct (et, model);
+
+ return (GtkTreeModel*)et;
+}
diff --git a/addressbook/gui/widgets/e-addressbook-treeview-adapter.h b/addressbook/gui/widgets/e-addressbook-treeview-adapter.h
new file mode 100644
index 0000000000..2c4370dee3
--- /dev/null
+++ b/addressbook/gui/widgets/e-addressbook-treeview-adapter.h
@@ -0,0 +1,44 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+#ifndef _E_ADDRESSBOOK_TREEVIEW_ADAPTER_H_
+#define _E_ADDRESSBOOK_TREEVIEW_ADAPTER_H_
+
+#include <gtk/gtktreemodel.h>
+#include "addressbook/backend/ebook/e-book.h"
+#include "addressbook/backend/ebook/e-book-view.h"
+#include "addressbook/backend/ebook/e-card-simple.h"
+
+#define E_TYPE_ADDRESSBOOK_TREEVIEW_ADAPTER (e_addressbook_treeview_adapter_get_type ())
+#define E_ADDRESSBOOK_TREEVIEW_ADAPTER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TYPE_ADDRESSBOOK_TREEVIEW_ADAPTER, EAddressbookTreeViewAdapter))
+#define E_ADDRESSBOOK_TREEVIEW_ADAPTER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), E_TYPE_ADDRESSBOOK_TREEVIEW_ADAPTER, EAddressbookTreeViewAdapterClass))
+#define E_IS_ADDRESSBOOK_TREEVIEW_ADAPTER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TYPE_ADDRESSBOOK_TREEVIEW_ADAPTER))
+#define E_IS_ADDRESSBOOK_TREEVIEW_ADAPTER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TYPE_ADDRESSBOOK_TREEVIEW_ADAPTER))
+
+/* Virtual Column list:
+ 0 Email
+ 1 Full Name
+ 2 Street
+ 3 Phone
+*/
+
+typedef struct _EAddressbookTreeViewAdapter EAddressbookTreeViewAdapter;
+typedef struct _EAddressbookTreeViewAdapterPrivate EAddressbookTreeViewAdapterPrivate;
+typedef struct _EAddressbookTreeViewAdapterClass EAddressbookTreeViewAdapterClass;
+
+struct _EAddressbookTreeViewAdapter {
+ GObject parent;
+
+ EAddressbookTreeViewAdapterPrivate *priv;
+};
+
+
+struct _EAddressbookTreeViewAdapterClass {
+ GObjectClass parent_class;
+};
+
+
+GType e_addressbook_treeview_adapter_get_type (void);
+void e_addressbook_treeview_adapter_construct (EAddressbookTreeViewAdapter *adapter,
+ EAddressbookModel *model);
+GtkTreeModel *e_addressbook_treeview_adapter_new (EAddressbookModel *model);
+
+#endif /* _E_ADDRESSBOOK_TABLE_ADAPTER_H_ */
diff --git a/addressbook/gui/widgets/gal-view-factory-treeview.c b/addressbook/gui/widgets/gal-view-factory-treeview.c
new file mode 100644
index 0000000000..b14c8dec59
--- /dev/null
+++ b/addressbook/gui/widgets/gal-view-factory-treeview.c
@@ -0,0 +1,86 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8
+ -*- */
+/*
+ * gal-view-factory-treeview.c: A View Factory
+ *
+ * Authors:
+ * Chris Lahey <clahey@ximian.com>
+ *
+ * (C) 2000, 2001 Ximian, Inc.
+ */
+#include <config.h>
+#include <glib.h>
+#include <libgnome/gnome-i18n.h>
+#include <gal/util/e-util.h>
+#include "gal-view-factory-treeview.h"
+#include "gal-view-treeview.h"
+
+#define PARENT_TYPE GAL_VIEW_FACTORY_TYPE
+
+static GalViewFactoryClass *gal_view_factory_treeview_parent_class;
+
+static const char *
+gal_view_factory_treeview_get_title (GalViewFactory *factory)
+{
+ return _("GTK Tree View");
+}
+
+static GalView *
+gal_view_factory_treeview_new_view (GalViewFactory *factory,
+ const char *name)
+{
+ return gal_view_treeview_new(name);
+}
+
+static const char *
+gal_view_factory_treeview_get_type_code (GalViewFactory *factory)
+{
+ return "treeview";
+}
+
+static void
+gal_view_factory_treeview_class_init (GObjectClass *object_class)
+{
+ GalViewFactoryClass *view_factory_class = GAL_VIEW_FACTORY_CLASS(object_class);
+ gal_view_factory_treeview_parent_class = g_type_class_ref (PARENT_TYPE);
+
+ view_factory_class->get_title = gal_view_factory_treeview_get_title;
+ view_factory_class->new_view = gal_view_factory_treeview_new_view;
+ view_factory_class->get_type_code = gal_view_factory_treeview_get_type_code;
+}
+
+static void
+gal_view_factory_treeview_init (GalViewFactoryTreeView *factory)
+{
+}
+
+/**
+ * gal_view_treeview_new
+ *
+ * A new GalViewFactory for creating TreeView views. Create one of
+ * these and pass it to GalViewCollection for use.
+ *
+ * Returns: The new GalViewFactoryTreeView.
+ */
+GalViewFactory *
+gal_view_factory_treeview_new (void)
+{
+ return gal_view_factory_treeview_construct (g_object_new (GAL_TYPE_VIEW_FACTORY_TREEVIEW, NULL));
+}
+
+/**
+ * gal_view_treeview_construct
+ * @factory: The factory to construct
+ *
+ * constructs the GalViewFactoryTreeView. To be used by subclasses and
+ * language bindings.
+ *
+ * Returns: The GalViewFactoryTreeView.
+ */
+GalViewFactory *
+gal_view_factory_treeview_construct (GalViewFactoryTreeView *factory)
+{
+ return GAL_VIEW_FACTORY(factory);
+}
+
+E_MAKE_TYPE(gal_view_factory_treeview, "GalViewFactoryTreeView", GalViewFactoryTreeView, gal_view_factory_treeview_class_init, gal_view_factory_treeview_init, PARENT_TYPE)
diff --git a/addressbook/gui/widgets/gal-view-factory-treeview.h b/addressbook/gui/widgets/gal-view-factory-treeview.h
new file mode 100644
index 0000000000..4795c6d3aa
--- /dev/null
+++ b/addressbook/gui/widgets/gal-view-factory-treeview.h
@@ -0,0 +1,35 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * gal-view-factory-treeview.c: A View Factory
+ *
+ * Authors:
+ * Chris Toshok <toshok@ximian.com>
+ *
+ * (C) 2000, 2001 Ximian, Inc.
+ */
+#ifndef _GAL_VIEW_FACTORY_TREEVIEW_H_
+#define _GAL_VIEW_FACTORY_TREEVIEW_H_
+
+#include <gtk/gtkobject.h>
+#include <gal/menus/gal-view-factory.h>
+
+#define GAL_TYPE_VIEW_FACTORY_TREEVIEW (gal_view_factory_treeview_get_type ())
+#define GAL_VIEW_FACTORY_TREEVIEW(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GAL_TYPE_VIEW_FACTORY_TREEVIEW, GalViewFactoryTreeView))
+#define GAL_VIEW_FACTORY_TREEVIEW_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GAL_TYPE_VIEW_FACTORY_TREEVIEW, GalViewFactoryTreeViewClass))
+#define GAL_IS_VIEW_FACTORY_TREEVIEW(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GAL_TYPE_VIEW_FACTORY_TREEVIEW))
+#define GAL_IS_VIEW_FACTORY_TREEVIEW_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GAL_TYPE_VIEW_FACTORY_TREEVIEW))
+
+typedef struct {
+ GalViewFactory base;
+} GalViewFactoryTreeView;
+
+typedef struct {
+ GalViewFactoryClass parent_class;
+} GalViewFactoryTreeViewClass;
+
+/* Standard functions */
+GType gal_view_factory_treeview_get_type (void);
+GalViewFactory *gal_view_factory_treeview_new (void);
+GalViewFactory *gal_view_factory_treeview_construct (GalViewFactoryTreeView *factory);
+
+#endif /* _GAL_VIEW_FACTORY_TREEVIEW_H_ */
diff --git a/addressbook/gui/widgets/gal-view-minicard.c b/addressbook/gui/widgets/gal-view-minicard.c
index 4265af25ba..0d8e01c36b 100644
--- a/addressbook/gui/widgets/gal-view-minicard.c
+++ b/addressbook/gui/widgets/gal-view-minicard.c
@@ -18,7 +18,7 @@
static GalViewClass *gal_view_minicard_parent_class;
static void
-gal_view_minicard_edit (GalView *view)
+gal_view_minicard_edit (GalView *view, GtkWindow *parent_window)
{
/* GalViewMinicard *minicard_view = GAL_VIEW_MINICARD(view); */
}
diff --git a/addressbook/gui/widgets/gal-view-treeview.c b/addressbook/gui/widgets/gal-view-treeview.c
new file mode 100644
index 0000000000..8d13d4aa26
--- /dev/null
+++ b/addressbook/gui/widgets/gal-view-treeview.c
@@ -0,0 +1,227 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * gal-view-treeview.c: An TreeView View
+ *
+ * Authors:
+ * Chris Lahey <clahey@ximian.com>
+ *
+ * (C) 2000, 2001 Ximian, Inc.
+ */
+#include <config.h>
+#include "gal-view-treeview.h"
+#include <libxml/parser.h>
+#include <gal/util/e-xml-utils.h>
+
+#define PARENT_TYPE gal_view_get_type ()
+#define d(x) x
+
+static GalViewClass *gal_view_treeview_parent_class;
+
+static void
+gal_view_treeview_edit (GalView *view, GtkWindow *parent_window)
+{
+ /* GalViewTreeView *treeview_view = GAL_VIEW_TREEVIEW(view); */
+}
+
+static void
+gal_view_treeview_load (GalView *view,
+ const char *filename)
+{
+#if 0
+ xmlDoc *doc;
+ doc = xmlParseFile (filename);
+ if (doc) {
+ xmlNode *root = xmlDocGetRootElement(doc);
+ GAL_VIEW_TREEVIEW (view)->column_width = e_xml_get_double_prop_by_name_with_default (root, "column_width", 150);
+ xmlFreeDoc(doc);
+ }
+#endif
+}
+
+static void
+gal_view_treeview_save (GalView *view,
+ const char *filename)
+{
+#if 0
+ xmlDoc *doc;
+ xmlNode *root;
+
+ doc = xmlNewDoc("1.0");
+ root = xmlNewNode (NULL, "ETreeViewViewState");
+ e_xml_set_double_prop_by_name (root, "column_width", GAL_VIEW_TREEVIEW (view)->column_width);
+ xmlDocSetRootElement(doc, root);
+ xmlSaveFile(filename, doc);
+ xmlFreeDoc(doc);
+#endif
+}
+
+static const char *
+gal_view_treeview_get_title (GalView *view)
+{
+ return GAL_VIEW_TREEVIEW(view)->title;
+}
+
+static void
+gal_view_treeview_set_title (GalView *view,
+ const char *title)
+{
+ g_free(GAL_VIEW_TREEVIEW(view)->title);
+ GAL_VIEW_TREEVIEW(view)->title = g_strdup(title);
+}
+
+static const char *
+gal_view_treeview_get_type_code (GalView *view)
+{
+ return "treeview";
+}
+
+static GalView *
+gal_view_treeview_clone (GalView *view)
+{
+ GalViewTreeView *gvm, *new;
+
+ gvm = GAL_VIEW_TREEVIEW(view);
+
+ new = g_object_new (GAL_TYPE_VIEW_TREEVIEW, NULL);
+ new->title = g_strdup (gvm->title);
+
+ return GAL_VIEW(new);
+}
+
+static void
+gal_view_treeview_dispose (GObject *object)
+{
+ GalViewTreeView *view = GAL_VIEW_TREEVIEW(object);
+ gal_view_treeview_detach (view);
+ g_free(view->title);
+}
+
+static void
+gal_view_treeview_class_init (GObjectClass *object_class)
+{
+ GalViewClass *gal_view_class = GAL_VIEW_CLASS(object_class);
+ gal_view_treeview_parent_class = g_type_class_ref (PARENT_TYPE);
+
+ gal_view_class->edit = gal_view_treeview_edit ;
+ gal_view_class->load = gal_view_treeview_load ;
+ gal_view_class->save = gal_view_treeview_save ;
+ gal_view_class->get_title = gal_view_treeview_get_title ;
+ gal_view_class->set_title = gal_view_treeview_set_title ;
+ gal_view_class->get_type_code = gal_view_treeview_get_type_code;
+ gal_view_class->clone = gal_view_treeview_clone ;
+
+ object_class->dispose = gal_view_treeview_dispose ;
+}
+
+static void
+gal_view_treeview_init (GalViewTreeView *gvm)
+{
+ gvm->title = NULL;
+
+ gvm->tree = NULL;
+}
+
+/**
+ * gal_view_treeview_new
+ * @title: The name of the new view.
+ *
+ * Returns a new GalViewTreeView. This is primarily for use by
+ * GalViewFactoryTreeView.
+ *
+ * Returns: The new GalViewTreeView.
+ */
+GalView *
+gal_view_treeview_new (const gchar *title)
+{
+ return gal_view_treeview_construct (g_object_new (GAL_TYPE_VIEW_TREEVIEW, NULL), title);
+}
+
+/**
+ * gal_view_treeview_construct
+ * @view: The view to construct.
+ * @title: The name of the new view.
+ *
+ * constructs the GalViewTreeView. To be used by subclasses and
+ * language bindings.
+ *
+ * Returns: The GalViewTreeView.
+ */
+GalView *
+gal_view_treeview_construct (GalViewTreeView *view,
+ const gchar *title)
+{
+ view->title = g_strdup(title);
+ return GAL_VIEW(view);
+}
+
+GType
+gal_view_treeview_get_type (void)
+{
+ static GType type = 0;
+
+ if (!type) {
+ static const GTypeInfo info = {
+ sizeof (GalViewTreeViewClass),
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ (GClassInitFunc) gal_view_treeview_class_init,
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ sizeof (GalViewTreeView),
+ 0, /* n_preallocs */
+ (GInstanceInitFunc) gal_view_treeview_init,
+ };
+
+ type = g_type_register_static (PARENT_TYPE, "GalViewTreeView", &info, 0);
+ }
+
+ return type;
+}
+
+#if 0
+static void
+column_width_changed (ETable *table, double width, GalViewMinicard *view)
+{
+ d(g_print("%s: Old width = %f, New width = %f\n", __FUNCTION__, view->column_width, width));
+ if (view->column_width != width) {
+ view->column_width = width;
+ gal_view_changed(GAL_VIEW(view));
+ }
+}
+#endif
+
+void
+gal_view_treeview_attach (GalViewTreeView *view, GtkTreeView *tree)
+{
+#if 0
+ gal_view_treeview_detach (view);
+
+ view->emvw = emvw;
+
+ g_object_ref (view->emvw);
+
+ g_object_set (view->emvw,
+ "column_width", view->column_width,
+ NULL);
+
+ view->emvw_column_width_changed_id =
+ g_signal_connect(view->emvw, "column_width_changed",
+ G_CALLBACK (column_width_changed), view);
+#endif
+}
+
+void
+gal_view_treeview_detach (GalViewTreeView *view)
+{
+#if 0
+ if (view->emvw == NULL)
+ return;
+ if (view->emvw_column_width_changed_id) {
+ g_signal_handler_disconnect (view->emvw,
+ view->emvw_column_width_changed_id);
+ view->emvw_column_width_changed_id = 0;
+ }
+ g_object_unref (view->emvw);
+ view->emvw = NULL;
+#endif
+}
diff --git a/addressbook/gui/widgets/gal-view-treeview.h b/addressbook/gui/widgets/gal-view-treeview.h
new file mode 100644
index 0000000000..a0313856a6
--- /dev/null
+++ b/addressbook/gui/widgets/gal-view-treeview.h
@@ -0,0 +1,43 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * gal-view-treeview.h: An TreeView View
+ *
+ * Authors:
+ * Chris Toshok <toshok@ximian.com>
+ *
+ * (C) 2000, 2001 Ximian, Inc.
+ */
+#ifndef _GAL_VIEW_TREEVIEW_H_
+#define _GAL_VIEW_TREEVIEW_H_
+
+#include <gal/menus/gal-view.h>
+#include <gtk/gtktreeview.h>
+
+#define GAL_TYPE_VIEW_TREEVIEW (gal_view_treeview_get_type ())
+#define GAL_VIEW_TREEVIEW(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GAL_TYPE_VIEW_TREEVIEW, GalViewTreeView))
+#define GAL_VIEW_TREEVIEW_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GAL_TYPE_VIEW_TREEVIEW, GalViewTreeViewClass))
+#define GAL_IS_VIEW_TREEVIEW(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GAL_TYPE_VIEW_TREEVIEW))
+#define GAL_IS_VIEW_TREEVIEW_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GAL_TYPE_VIEW_TREEVIEW))
+
+typedef struct {
+ GalView base;
+
+ char *title;
+
+ GtkTreeView *tree;
+} GalViewTreeView;
+
+typedef struct {
+ GalViewClass parent_class;
+} GalViewTreeViewClass;
+
+/* Standard functions */
+GType gal_view_treeview_get_type (void);
+GalView *gal_view_treeview_new (const gchar *title);
+GalView *gal_view_treeview_construct (GalViewTreeView *view,
+ const gchar *title);
+void gal_view_treeview_attach (GalViewTreeView *view,
+ GtkTreeView *tree);
+void gal_view_treeview_detach (GalViewTreeView *view);
+
+#endif /* _GAL_VIEW_TREEVIEW_H_ */