From 40e24cdab6d294af61ca54a96b0b901181dc7751 Mon Sep 17 00:00:00 2001 From: Christopher James Lahey Date: Mon, 3 Jul 2000 22:25:47 +0000 Subject: New list class with iterators. 2000-07-03 Christopher James Lahey * e-iterator.c, e-iterator.h, e-list-iterator.c, e-list-iterator.h, e-list.c, e-list.h: New list class with iterators. * e-canvas.c: Made it so that you don't get the same selection in the selection list more than once. svn path=/trunk/; revision=3871 --- e-util/e-list.c | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 e-util/e-list.c (limited to 'e-util/e-list.c') diff --git a/e-util/e-list.c b/e-util/e-list.c new file mode 100644 index 0000000000..bc5769fb38 --- /dev/null +++ b/e-util/e-list.c @@ -0,0 +1,140 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Authors: + * Christopher James Lahey + * + * Copyright (C) 2000 Helix Code, Inc. + * Copyright (C) 1999 The Free Software Foundation + */ + +#include +#include + +#include "e-list.h" +#include "e-list-iterator.h" + +#define ECL_CLASS(object) (E_LIST_CLASS(GTK_OBJECT((object))->klass)) + +static void e_list_init (EList *list); +static void e_list_class_init (EListClass *klass); +static void e_list_destroy (GtkObject *object); + +#define PARENT_TYPE (gtk_object_get_type ()) + +static GtkObjectClass *parent_class; + +/** + * e_list_get_type: + * @void: + * + * Registers the &EList class if necessary, and returns the type ID + * associated to it. + * + * Return value: The type ID of the &EList class. + **/ +GtkType +e_list_get_type (void) +{ + static GtkType type = 0; + + if (!type) { + GtkTypeInfo info = { + "EList", + sizeof (EList), + sizeof (EListClass), + (GtkClassInitFunc) e_list_class_init, + (GtkObjectInitFunc) e_list_init, + NULL, /* reserved_1 */ + NULL, /* reserved_2 */ + (GtkClassInitFunc) NULL + }; + + type = gtk_type_unique (PARENT_TYPE, &info); + } + + return type; +} + +static void +e_list_class_init (EListClass *klass) +{ + GtkObjectClass *object_class; + + object_class = GTK_OBJECT_CLASS(klass); + + parent_class = gtk_type_class (PARENT_TYPE); + + object_class->destroy = e_list_destroy; +} + +/** + * e_list_init: + */ +static void +e_list_init (EList *list) +{ + list->list = NULL; + list->iterators = NULL; +} + +EList * +e_list_new (EListCopyFunc copy, EListFreeFunc free, void *closure) +{ + EList *list = gtk_type_new(e_list_get_type()); + list->copy = copy; + list->free = free; + list->closure = closure; + return list; +} + +EIterator * +e_list_get_iterator (EList *list) +{ + EIterator *iterator = e_list_iterator_new(list); + list->iterators = g_list_append(list->iterators, iterator); + return iterator; +} + +int +e_list_length (EList *list) +{ + return g_list_length(list->list); +} + +void +e_list_append (EList *list, const void *data) +{ + e_list_invalidate_iterators(list, NULL); + if (list->copy) + list->list = g_list_append(list->list, list->copy(data, list->closure)); + else + list->list = g_list_append(list->list, (void *) data); +} + +void +e_list_invalidate_iterators (EList *list, EIterator *skip) +{ + GList *iterators = list->iterators; + for (; iterators; iterators = iterators->next) { + if (iterators->data != skip) { + e_iterator_invalidate(E_ITERATOR(iterators->data)); + } + } +} + +void +e_list_remove_iterator (EList *list, EIterator *iterator) +{ + list->iterators = g_list_remove(list->iterators, iterator); +} + +/* + * Virtual functions + */ +static void +e_list_destroy (GtkObject *object) +{ + EList *list = E_LIST(object); + g_list_foreach(list->list, (GFunc) list->free, list->closure); + g_list_free(list->list); +} -- cgit v1.2.3