diff options
Diffstat (limited to 'widgets/e-table/e-table-sorted.c')
-rw-r--r-- | widgets/e-table/e-table-sorted.c | 137 |
1 files changed, 37 insertions, 100 deletions
diff --git a/widgets/e-table/e-table-sorted.c b/widgets/e-table/e-table-sorted.c index 2d53c79e5d..be19de2efb 100644 --- a/widgets/e-table/e-table-sorted.c +++ b/widgets/e-table/e-table-sorted.c @@ -11,93 +11,16 @@ #include "e-util.h" #include "e-table-sorted.h" -#define PARENT_TYPE E_TABLE_MODEL_TYPE +#define PARENT_TYPE E_TABLE_SUBSET_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 int -ets_column_count (ETableModel *etm) -{ - ETableSorted *ets = (ETableSorted *)etm; - - return e_table_model_column_count (ets->source); -} - -static const char * -ets_column_name (ETableModel *etm, int col) -{ - ETableSorted *ets = (ETableSorted *)etm; - - return e_table_model_column_name (ets->source, col); -} - -static int -ets_row_count (ETableModel *etm) -{ - ETableSorted *ets = (ETableSorted *)etm; - - return e_table_model_row_count (ets->source); -} - -static void * -ets_value_at (ETableModel *etm, int col, int row) -{ - ETableSorted *ets = (ETableSorted *)etm; - - return e_table_model_value_at (ets->source, col, ets->map_table [row]); -} - -static void -ets_set_value_at (ETableModel *etm, int col, int row, void *val) -{ - ETableSorted *ets = (ETableSorted *)etm; - - return e_table_model_set_value_at (ets->source, col, ets->map_table [row], val); -} - -static gboolean -ets_is_cell_editable (ETableModel *etm, int col, int row) -{ - ETableSorted *ets = (ETableSorted *)etm; - - return e_table_model_is_cell_editable (ets->source, col, ets->map_table [row]); -} - -static int -ets_row_height (ETableModel *etm, int row) -{ - ETableSorted *ets = (ETableSorted *)etm; - - return e_table_model_row_height (ets->source, ets->map_table [row]); -} - -static void ets_class_init (GtkObjectClass *klass) { ETableModelClass *table_class = (ETableModelClass *) klass; ets_parent_class = gtk_type_class (PARENT_TYPE); - klass->destroy = ets_destroy; - - table_class->column_count = ets_column_count; - table_class->column_name = ets_column_name; - table_class->row_count = ets_row_count; - table_class->value_at = ets_value_at; - table_class->set_value_at = ets_set_value_at; - table_class->is_cell_editable = ets_is_cell_editable; - table_class->row_height = ets_row_height; } E_MAKE_TYPE(e_table_sorted, "ETableSorted", ETableSorted, ets_class_init, NULL, PARENT_TYPE); @@ -108,49 +31,63 @@ static int my_sort (const void *a, const void *b) { GCompareFunc comp; + ETableModel *source = E_TABLE_SUBSET (sort_ets)->source; 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); + va = e_table_model_value_at (source, sort_ets->sort_col, *ia); + vb = e_table_model_value_at (source, sort_ets->sort_col, *ib); - comp = sort_ets->sort_col->compare; + return (*sort_ets->compare) (va, vb); +} - return (*comp) (va, vb); +static void +do_sort (ETableSorted *ets) +{ + ETableSubset *etss = E_TABLE_SUBSET (ets); + g_assert (sort_ets == NULL); + + sort_ets = ets; + qsort (etss->map_table, etss->n_map, sizeof (unsigned int), my_sort); + sort_ets = NULL; } ETableModel * -e_table_sorted_new (ETableModel *source, ETableHeader *header, short sort_field) +e_table_sorted_new (ETableModel *source, int col, GCompareFunc compare) { ETableSorted *ets = gtk_type_new (E_TABLE_SORTED_TYPE); + ETableSubset *etss = E_TABLE_SUBSET (ets); const int nvals = e_table_model_row_count (source); unsigned int *buffer; int i; - buffer = malloc (sizeof (unsigned int *) * nvals); - if (buffer = NULL) + if (e_table_subset_construct (etss, source, nvals) == NULL){ + gtk_object_destroy (GTK_OBJECT (ets)); 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)); + } + + ets->compare = compare; + ets->sort_col = col; /* Init */ for (i = 0; i < nvals; i++) - ets->map_table [i] = i; + etss->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; + do_sort (ets); return (ETableModel *) ets; } - +void +e_table_sorted_resort (ETableSorted *ets, int col, GCompareFunc compare) +{ + if (col == -1 || compare == NULL) + do_sort (ets); + else { + ets->sort_col = col; + ets->compare = compare; + do_sort (ets); + } +} + |