aboutsummaryrefslogtreecommitdiffstats
path: root/addressbook/backend/ebook/e-card-list-iterator.c
diff options
context:
space:
mode:
Diffstat (limited to 'addressbook/backend/ebook/e-card-list-iterator.c')
-rw-r--r--addressbook/backend/ebook/e-card-list-iterator.c199
1 files changed, 199 insertions, 0 deletions
diff --git a/addressbook/backend/ebook/e-card-list-iterator.c b/addressbook/backend/ebook/e-card-list-iterator.c
new file mode 100644
index 0000000000..e6d9a9c040
--- /dev/null
+++ b/addressbook/backend/ebook/e-card-list-iterator.c
@@ -0,0 +1,199 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Authors:
+ * Christopher James Lahey <clahey@umich.edu>
+ *
+ * Copyright (C) 2000 Helix Code, Inc.
+ * Copyright (C) 1999 The Free Software Foundation
+ */
+
+#include <config.h>
+#include <gtk/gtk.h>
+
+#include <e-card-list-iterator.h>
+#include <e-card-list.h>
+
+static void e_card_list_iterator_init (ECardListIterator *card);
+static void e_card_list_iterator_class_init (ECardListIteratorClass *klass);
+
+static void e_card_list_iterator_invalidate (ECardIterator *iterator);
+static gboolean e_card_list_iterator_is_valid (ECardIterator *iterator);
+static void e_card_list_iterator_set (ECardIterator *iterator,
+ void *object);
+static void e_card_list_iterator_delete (ECardIterator *iterator);
+static gboolean e_card_list_iterator_prev (ECardIterator *iterator);
+static gboolean e_card_list_iterator_next (ECardIterator *iterator);
+static void e_card_list_iterator_reset (ECardIterator *iterator);
+static void *e_card_list_iterator_get (ECardIterator *iterator);
+static void e_card_list_iterator_destroy (GtkObject *object);
+
+#define PARENT_TYPE (e_card_iterator_get_type ())
+
+static GtkObjectClass *parent_class;
+#define PARENT_CLASS (E_CARD_LIST_ITERATOR_CLASS(parent_class))
+
+/**
+ * e_card_list_iterator_get_type:
+ * @void:
+ *
+ * Registers the &ECardListIterator class if necessary, and returns the type ID
+ * associated to it.
+ *
+ * Return value: The type ID of the &ECardListIterator class.
+ **/
+GtkType
+e_card_list_iterator_get_type (void)
+{
+ static GtkType type = 0;
+
+ if (!type) {
+ GtkTypeInfo info = {
+ "ECardListIterator",
+ sizeof (ECardListIterator),
+ sizeof (ECardListIteratorClass),
+ (GtkClassInitFunc) e_card_list_iterator_class_init,
+ (GtkObjectInitFunc) e_card_list_iterator_init,
+ NULL, /* reserved_1 */
+ NULL, /* reserved_2 */
+ (GtkClassInitFunc) NULL
+ };
+
+ type = gtk_type_unique (PARENT_TYPE, &info);
+ }
+
+ return type;
+}
+
+static void
+e_card_list_iterator_class_init (ECardListIteratorClass *klass)
+{
+ GtkObjectClass *object_class;
+ ECardIteratorClass *iterator_class;
+
+ object_class = GTK_OBJECT_CLASS(klass);
+ iterator_class = E_CARD_ITERATOR_CLASS(klass);
+
+ parent_class = gtk_type_class (PARENT_TYPE);
+
+ object_class->destroy = e_card_list_iterator_destroy;
+
+ iterator_class->invalidate = e_card_list_iterator_invalidate;
+ iterator_class->get = e_card_list_iterator_get;
+ iterator_class->reset = e_card_list_iterator_reset;
+ iterator_class->next = e_card_list_iterator_next;
+ iterator_class->prev = e_card_list_iterator_prev;
+ iterator_class->delete = e_card_list_iterator_delete;
+ iterator_class->set = e_card_list_iterator_set;
+ iterator_class->is_valid = e_card_list_iterator_is_valid;
+}
+
+
+
+/**
+ * e_card_list_iterator_init:
+ */
+static void
+e_card_list_iterator_init (ECardListIterator *card)
+{
+}
+
+ECardIterator *
+e_card_list_iterator_new (ECardList *list)
+{
+ ECardListIterator *iterator = gtk_type_new(e_card_list_iterator_get_type());
+
+ iterator->list = list;
+ gtk_object_ref(GTK_OBJECT(list));
+ iterator->iterator = list->list;
+
+ return E_CARD_ITERATOR(iterator);
+}
+
+/*
+ * Virtual functions:
+ */
+static void
+e_card_list_iterator_destroy (GtkObject *object)
+{
+ ECardListIterator *iterator = E_CARD_LIST_ITERATOR(object);
+ e_card_list_remove_iterator(iterator->list, E_CARD_ITERATOR(iterator));
+ gtk_object_unref(GTK_OBJECT(iterator->list));
+}
+
+static void *
+e_card_list_iterator_get (ECardIterator *_iterator)
+{
+ ECardListIterator *iterator = E_CARD_LIST_ITERATOR(_iterator);
+ if (iterator->iterator)
+ return iterator->iterator->data;
+ else
+ return NULL;
+}
+
+static void
+e_card_list_iterator_reset (ECardIterator *_iterator)
+{
+ ECardListIterator *iterator = E_CARD_LIST_ITERATOR(_iterator);
+ iterator->iterator = iterator->list->list;
+}
+
+static gboolean
+e_card_list_iterator_next (ECardIterator *_iterator)
+{
+ ECardListIterator *iterator = E_CARD_LIST_ITERATOR(_iterator);
+ if (iterator->iterator)
+ iterator->iterator = g_list_next(iterator->iterator);
+ return (iterator->iterator != NULL);
+}
+
+static gboolean
+e_card_list_iterator_prev (ECardIterator *_iterator)
+{
+ ECardListIterator *iterator = E_CARD_LIST_ITERATOR(_iterator);
+ if (iterator->iterator)
+ iterator->iterator = g_list_previous(iterator->iterator);
+ return (iterator->iterator != NULL);
+}
+
+static void
+e_card_list_iterator_delete (ECardIterator *_iterator)
+{
+ ECardListIterator *iterator = E_CARD_LIST_ITERATOR(_iterator);
+ if (iterator->iterator) {
+ GList *temp = iterator->iterator->next;
+ if (iterator->list->free)
+ iterator->list->free(iterator->iterator->data, iterator->list->closure);
+ iterator->list->list = g_list_remove_link(iterator->list->list, iterator->iterator);
+ iterator->iterator = temp;
+ e_card_list_invalidate_iterators(iterator->list, E_CARD_ITERATOR(iterator));
+ }
+}
+
+static void
+e_card_list_iterator_set (ECardIterator *_iterator,
+ void *object)
+{
+ ECardListIterator *iterator = E_CARD_LIST_ITERATOR(_iterator);
+ if (iterator->iterator) {
+ if (iterator->list->free)
+ iterator->list->free(iterator->iterator->data, iterator->list->closure);
+ if (iterator->list->copy)
+ iterator->iterator->data = iterator->list->copy(object, iterator->list->closure);
+ else
+ iterator->iterator->data = object;
+ }
+}
+
+static gboolean
+e_card_list_iterator_is_valid (ECardIterator *_iterator)
+{
+ ECardListIterator *iterator = E_CARD_LIST_ITERATOR(_iterator);
+ return iterator->iterator != NULL;
+}
+
+static void
+e_card_list_iterator_invalidate (ECardIterator *_iterator)
+{
+ ECardListIterator *iterator = E_CARD_LIST_ITERATOR(_iterator);
+ iterator->iterator = NULL;
+}