aboutsummaryrefslogtreecommitdiffstats
path: root/widgets/table/e-table-group-container.c
diff options
context:
space:
mode:
authorChristopher James Lahey <clahey@ximian.com>2001-02-24 07:00:09 +0800
committerChris Lahey <clahey@src.gnome.org>2001-02-24 07:00:09 +0800
commit40d58afa7ce854ae8154a7f0ce32997f57d99ea4 (patch)
tree70cac56e91a6a9c056218837dc14be298f8befd6 /widgets/table/e-table-group-container.c
parent669c08181079cc48352959b829f578ea922351a6 (diff)
downloadgsoc2013-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.c123
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;