diff options
author | Christopher James Lahey <clahey@ximian.com> | 2001-02-24 07:00:09 +0800 |
---|---|---|
committer | Chris Lahey <clahey@src.gnome.org> | 2001-02-24 07:00:09 +0800 |
commit | 40d58afa7ce854ae8154a7f0ce32997f57d99ea4 (patch) | |
tree | 70cac56e91a6a9c056218837dc14be298f8befd6 /widgets/table/e-table-group-container.c | |
parent | 669c08181079cc48352959b829f578ea922351a6 (diff) | |
download | gsoc2013-evolution-40d58afa7ce854ae8154a7f0ce32997f57d99ea4.tar gsoc2013-evolution-40d58afa7ce854ae8154a7f0ce32997f57d99ea4.tar.gz gsoc2013-evolution-40d58afa7ce854ae8154a7f0ce32997f57d99ea4.tar.bz2 gsoc2013-evolution-40d58afa7ce854ae8154a7f0ce32997f57d99ea4.tar.lz gsoc2013-evolution-40d58afa7ce854ae8154a7f0ce32997f57d99ea4.tar.xz gsoc2013-evolution-40d58afa7ce854ae8154a7f0ce32997f57d99ea4.tar.zst gsoc2013-evolution-40d58afa7ce854ae8154a7f0ce32997f57d99ea4.zip |
Added e-table/e-table-sorting-utils.lo.
2001-02-23 Christopher James Lahey <clahey@ximian.com>
* gal/Makefile.am (libgal_la_LIBADD): Added
e-table/e-table-sorting-utils.lo.
From gal/e-table/ChangeLog:
2001-02-23 Christopher James Lahey <clahey@ximian.com>
* Makefile.am (libetable_la_SOURCES): Added
e-table-sorting-utils.c.
(libetableinclude_HEADERS): Added e-table-sorting-utils.h.
* e-table-group-container.c: Implemented add_array method. Use
add_array to implement add_all instead of using add. Did some
general clean up.
* e-table-group-leaf.c, e-table-group-leaf.h: Implemented
add_array method. Changed everything to use an ETableSubset
variable instead of an ETableSortedVariable. Implemented it as
ETableSortedVariable if there's grouping involved and ETableSorted
if there isn't.
* e-table-group.c, e-table-group.h: Added add_array method. Added
unused get_position code.
* e-table-sorted-variable.c, e-table-sorted-variable.h: Moved a
lot of the actual implementation of sorting to
e-table-sorting-utils.c. Got rid of the signal handlers here
since we weren't using them and ETableSubset has the proxy virtual
methods.
* e-table-sorted.c, e-table-sorted.h: Completely replaced these
files with a variation on ETableSortedVariable that doesn't have
the add methods and such but instead just mimics the source
model's set of rows completely.
* e-table-sorter.c, e-table-sorter.h: Added functions to get at
the arrays here.
* e-table-sorting-utils.c, e-table-sorting-utils.h: Utility
functions for doing sorting.
* e-table-subset-variable.c, e-table-subset-variable.h: Added
add_array method.
* e-table-subset.c, e-table-subset.h: Made it so that the signal
hookups to the source model's signals are virtual methods.
* e-table.c, e-table.h: Don't call add_all and add and remove type
functions if not grouped. Don't rebuild for sort changes unless
it was either grouped before or will be grouped now.
svn path=/trunk/; revision=8374
Diffstat (limited to 'widgets/table/e-table-group-container.c')
-rw-r--r-- | widgets/table/e-table-group-container.c | 123 |
1 files changed, 96 insertions, 27 deletions
diff --git a/widgets/table/e-table-group-container.c b/widgets/table/e-table-group-container.c index b92498657e..9f2efb290a 100644 --- a/widgets/table/e-table-group-container.c +++ b/widgets/table/e-table-group-container.c @@ -387,33 +387,13 @@ child_key_press (ETableGroup *etg, int row, int col, GdkEvent *event, return e_table_group_key_press (E_TABLE_GROUP (etgc), row, col, event); } -static void -etgc_add (ETableGroup *etg, gint row) +static ETableGroupContainerChildNode * +create_child_node (ETableGroupContainer *etgc, void *val) { - ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER (etg); - void *val = e_table_model_value_at (etg->model, etgc->ecol->col_idx, row); - GCompareFunc comp = etgc->ecol->compare; - GList *list = etgc->children; ETableGroup *child; ETableGroupContainerChildNode *child_node; - int i = 0; + ETableGroup *etg = E_TABLE_GROUP(etgc); - for (; list; list = g_list_next (list), i++){ - int comp_val; - - child_node = list->data; - comp_val = (*comp)(child_node->key, val); - if (comp_val == 0) { - child = child_node->child; - child_node->count ++; - e_table_group_add (child, row); - compute_text (etgc, child_node); - return; - } - if ((comp_val > 0 && etgc->ascending) || - (comp_val < 0 && (!etgc->ascending))) - break; - } child_node = g_new (ETableGroupContainerChildNode, 1); child_node->rect = gnome_canvas_item_new (GNOME_CANVAS_GROUP (etgc), gnome_canvas_rect_get_type (), @@ -453,6 +433,40 @@ etgc_add (ETableGroup *etg, gint row) child_node->child = child; child_node->key = e_table_model_duplicate_value (etg->model, etgc->ecol->col_idx, val); child_node->string = e_table_model_value_to_string (etg->model, etgc->ecol->col_idx, val); + child_node->count = 0; + + return child_node; +} + +static void +etgc_add (ETableGroup *etg, gint row) +{ + ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER (etg); + void *val = e_table_model_value_at (etg->model, etgc->ecol->col_idx, row); + GCompareFunc comp = etgc->ecol->compare; + GList *list = etgc->children; + ETableGroup *child; + ETableGroupContainerChildNode *child_node; + int i = 0; + + for (; list; list = g_list_next (list), i++){ + int comp_val; + + child_node = list->data; + comp_val = (*comp)(child_node->key, val); + if (comp_val == 0) { + child = child_node->child; + child_node->count ++; + e_table_group_add (child, row); + compute_text (etgc, child_node); + return; + } + if ((comp_val > 0 && etgc->ascending) || + (comp_val < 0 && (!etgc->ascending))) + break; + } + child_node = create_child_node (etgc, val); + child = child_node->child; child_node->count = 1; e_table_group_add (child, row); @@ -466,12 +480,66 @@ etgc_add (ETableGroup *etg, gint row) } static void -etgc_add_all (ETableGroup *etg) +etgc_add_array (ETableGroup *etg, const int *array, int count) { - int rows = e_table_model_row_count(etg->model); int i; - for (i = 0; i < rows; i++) - etgc_add(etg, i); + ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER (etg); + void *lastval = 0; + int laststart = 0; + GCompareFunc comp = etgc->ecol->compare; + ETableGroupContainerChildNode *child_node; + ETableGroup *child; + + if (count <= 0) + return; + + e_table_group_container_list_free (etgc); + etgc->children = NULL; + + lastval = e_table_model_value_at (etg->model, etgc->ecol->col_idx, array[0]); + + for (i = 1; i < count; i++) { + void *val = e_table_model_value_at (etg->model, etgc->ecol->col_idx, array[i]); + int comp_val; + + comp_val = (*comp)(lastval, val); + if (comp_val != 0) { + child_node = create_child_node(etgc, lastval); + child = child_node->child; + + e_table_group_add_array(child, array + laststart, i - laststart); + child_node->count = i - laststart; + + etgc->children = g_list_append (etgc->children, child_node); + compute_text (etgc, child_node); + laststart = i; + lastval = val; + } + } + + child_node = create_child_node(etgc, lastval); + child = child_node->child; + + e_table_group_add_array(child, array + laststart, i - laststart); + child_node->count = i - laststart; + + etgc->children = g_list_append (etgc->children, child_node); + compute_text (etgc, child_node); + + e_canvas_item_request_reflow (GNOME_CANVAS_ITEM (etgc)); +} + +static void +etgc_add_all (ETableGroup *etg) +{ + ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER (etg); + ETableSorter *sorter = etgc->table_selection_model->sorter; + int *array; + int count; + + e_table_sorter_get_sorted_to_model_array(sorter, &array, &count); + + etgc_add_array(etg, array, count); } static gboolean @@ -726,6 +794,7 @@ etgc_class_init (GtkObjectClass *object_class) etgc_parent_class = gtk_type_class (PARENT_TYPE); e_group_class->add = etgc_add; + e_group_class->add_array = etgc_add_array; e_group_class->add_all = etgc_add_all; e_group_class->remove = etgc_remove; e_group_class->increment = etgc_increment; |