diff options
Diffstat (limited to 'widgets/e-table-sorted.c')
-rw-r--r-- | widgets/e-table-sorted.c | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/widgets/e-table-sorted.c b/widgets/e-table-sorted.c new file mode 100644 index 0000000000..d8c5273800 --- /dev/null +++ b/widgets/e-table-sorted.c @@ -0,0 +1,90 @@ +/* + * E-table-sorted.c: Implements a table that sorts another table + * + * Author: + * Miguel de Icaza (miguel@gnu.org) + * + * (C) 1999 Helix Code, Inc. + */ +#include <config.h> +#include <stdlib.h> +#include "e-util.h" +#include "e-table-sorted.h" + +#define PARENT_TYPE E_TABLE_MODEL_TYPE + +static ETableModelClass *ets_parent_class; + +static void +ets_destroy (GtkObject *object) +{ + ETableSorted *ets = E_TABLE_SORTED (object); + + gtk_object_unref (GTK_OBJECT (ets->source)); + gtk_object_unref (GTK_OBJECT (ets->header)); + free (ets->map_table); + + GTK_OBJECT_CLASS (ets_parent_class)->destroy (object); +} + +static void +ets_class_init (GtkObjectClass *klass) +{ + ets_parent_class = gtk_type_class (PARENT_TYPE); + klass->destroy = ets_destroy; +} + +E_MAKE_TYPE(e_table_sorted, "ETableSorted", ETableSorted, ets_class_init, NULL, PARENT_TYPE); + +static ETableSorted *sort_ets; + +static int +my_sort (const void *a, const void *b) +{ + GCompareFunc comp; + const int *ia = (const int *) a; + const int *ib = (const int *) b; + void *va, *vb; + + va = e_table_model_value_at (sort_ets->source, sort_ets->sort_idx, *ia); + vb = e_table_model_value_at (sort_ets->source, sort_ets->sort_idx, *ib); + + comp = sort_ets->sort_col->compare; + + return (*comp) (va, vb); +} + +ETableModel * +e_table_sorted_new (ETableModel *source, ETableHeader *header, short sort_field) +{ + ETableSorted *ets = gtk_type_new (E_TABLE_SORTED_TYPE); + const int nvals = e_table_model_row_count (source); + unsigned int *buffer; + int i; + + buffer = malloc (sizeof (unsigned int *) * nvals); + if (buffer = NULL) + return NULL; + ets->map_table = buffer; + ets->n_map = nvals; + ets->source = source; + ets->header = header; + ets->sort_col = e_table_header_get_column (header, sort_field); + ets->sort_idx = sort_field; + gtk_object_ref (GTK_OBJECT (source)); + gtk_object_ref (GTK_OBJECT (header)); + + /* Init */ + for (i = 0; i < nvals; i++) + ets->map_table [i] = i; + + /* Sort */ + g_assert (sort_ets == NULL); + sort_ets = ets; + qsort (ets->map_table, nvals, sizeof (unsigned int), my_sort); + sort_ets = NULL; + + return (ETableModel *) ets; +} + + |