Fixed some warnings.

2001-03-01  Christopher James Lahey  <clahey@ximian.com>

	* e-cell-pixbuf.c: Fixed some warnings.

	* e-table-subset.c, e-table-subset.h: Added
	e_table_subset_print_debugging.

2001-02-27  Christopher James Lahey  <clahey@ximian.com>

	* e-table-sorted-variable.c: Moved etsv_compare to etsu_compare in
	e-table-sorting-utils.c.  Moved most of the contents of etsv_add
	to e_table_sorting_utils_insert in e-table-sorting-utils.c and
	call the function.

	* e-table-sorted.c: Rewrote ets_proxy_row_changed,
	ets_proxy_row_inserted, and ets_proxy_row_deleted.

	* e-table-sorting-utils.c, e-table-sorting-utils.h (etsu_compare,
	e_table_sorting_utils_insert): Added e_table_sorting_utils_insert.

	* e-table-subset-variable.c: Changed this implementation to be
	slightly more consistent with other code.

svn path=/trunk/; revision=8453
This commit is contained in:
Christopher James Lahey
2001-03-01 17:52:12 +00:00
committed by Chris Lahey
parent 90dabbdb22
commit 89ec4e5af6
8 changed files with 259 additions and 225 deletions

View File

@ -146,8 +146,6 @@ pixbuf_event (ECellView *ecell_view, GdkEvent *event,
int model_col, int view_col, int row,
ECellFlags flags, ECellActions *actions)
{
ECellPixbufView *pixbuf_view = (ECellPixbufView *) ecell_view;
/* noop */
return FALSE;
@ -156,7 +154,6 @@ pixbuf_event (ECellView *ecell_view, GdkEvent *event,
static gint
pixbuf_height (ECellView *ecell_view, int model_col, int view_col, int row)
{
ECellPixbufView *pixbuf_view = (ECellPixbufView *) ecell_view;
GdkPixbuf *pixbuf;
pixbuf = (GdkPixbuf *) e_table_model_value_at (ecell_view->e_table_model, model_col, row);
@ -173,7 +170,6 @@ pixbuf_height (ECellView *ecell_view, int model_col, int view_col, int row)
static gint
pixbuf_max_width (ECellView *ecell_view, int model_col, int view_col)
{
ECellPixbufView *pixbuf_view = (ECellPixbufView *) ecell_view;
gint num_rows, i;
gint max_width = -1;

View File

@ -100,39 +100,6 @@ etsv_insert_idle(ETableSortedVariable *etsv)
return FALSE;
}
/* This takes source rows. */
static int
etsv_compare(ETableSortedVariable *etsv, int row1, int row2)
{
int j;
int sort_count = e_table_sort_info_sorting_get_count(etsv->sort_info);
int comp_val = 0;
int ascending = 1;
ETableSubset *etss = E_TABLE_SUBSET(etsv);
for (j = 0; j < sort_count; j++) {
ETableSortColumn column = e_table_sort_info_sorting_get_nth(etsv->sort_info, j);
ETableCol *col;
col = e_table_header_get_column_by_col_idx(etsv->full_header, column.column);
if (col == NULL)
col = e_table_header_get_column (etsv->full_header, e_table_header_count (etsv->full_header) - 1);
comp_val = (*col->compare)(e_table_model_value_at (etss->source, col->col_idx, row1),
e_table_model_value_at (etss->source, col->col_idx, row2));
ascending = column.ascending;
if (comp_val != 0)
break;
}
if (comp_val == 0) {
if (row1 < row2)
comp_val = -1;
if (row1 > row2)
comp_val = 1;
}
if (!ascending)
comp_val = -comp_val;
return comp_val;
}
static void
etsv_add (ETableSubsetVariable *etssv,
@ -160,53 +127,7 @@ etsv_add (ETableSubsetVariable *etssv,
if (etsv->insert_idle_id == 0) {
etsv->insert_idle_id = g_idle_add_full(40, (GSourceFunc) etsv_insert_idle, etsv, NULL);
}
i = 0;
/* handle insertions when we have a 'sort group' */
if (e_table_model_has_sort_group(etss->source)) {
/* find the row this row maps to */
char *group = g_strdup(e_table_model_row_sort_group(etss->source, row));
const char *newgroup;
int cmp, grouplen, newgrouplen;
newgroup = strrchr(group, '/');
grouplen = strlen(group);
if (newgroup)
cmp = newgroup-group;
else
cmp = grouplen;
/* find first common parent */
while (i<etss->n_map) {
newgroup = e_table_model_row_sort_group(etss->source, etss->map_table[i]);
if (strncmp(newgroup, group, cmp) == 0) {
break;
}
i++;
}
/* check matching records */
while (i<etss->n_map) {
newgroup = e_table_model_row_sort_group(etss->source, etss->map_table[i]);
newgrouplen = strlen(newgroup);
if (strncmp(newgroup, group, cmp) == 0) {
/* common parent, check for same level */
if (grouplen == newgrouplen) {
if (etsv_compare(etsv, etss->map_table[i], row) >= 0)
break;
} else if (strncmp(newgroup + cmp, group + cmp, grouplen - cmp) == 0)
/* Found a child of the inserted node. Insert here. */
break;
} else {
/* ran out of common parents, insert here */
break;
}
i++;
}
g_free(group);
} else {
while (i < etss->n_map && etsv_compare(etsv, etss->map_table[i], row) < 0)
i++;
}
i = e_table_sorting_utils_insert(etss->source, etsv->sort_info, etsv->full_header, etss->map_table, etss->n_map, row);
memmove(etss->map_table + i + 1, etss->map_table + i, (etss->n_map - i) * sizeof(int));
}
}

View File

@ -99,7 +99,6 @@ ets_sort_idle(ETableSorted *ets)
return FALSE;
}
#if 0
static gboolean
ets_insert_idle(ETableSorted *ets)
{
@ -107,125 +106,6 @@ ets_insert_idle(ETableSorted *ets)
ets->insert_idle_id = 0;
return FALSE;
}
#endif
#if 0
/* This takes source rows. */
static int
ets_compare(ETableSorted *ets, int row1, int row2)
{
int j;
int sort_count = e_table_sort_info_sorting_get_count(ets->sort_info);
int comp_val = 0;
int ascending = 1;
ETableSubset *etss = E_TABLE_SUBSET(ets);
for (j = 0; j < sort_count; j++) {
ETableSortColumn column = e_table_sort_info_sorting_get_nth(ets->sort_info, j);
ETableCol *col;
col = e_table_header_get_column_by_col_idx(ets->full_header, column.column);
if (col == NULL)
col = e_table_header_get_column (ets->full_header, e_table_header_count (ets->full_header) - 1);
comp_val = (*col->compare)(e_table_model_value_at (etss->source, col->col_idx, row1),
e_table_model_value_at (etss->source, col->col_idx, row2));
ascending = column.ascending;
if (comp_val != 0)
break;
}
if (comp_val == 0) {
if (row1 < row2)
comp_val = -1;
if (row1 > row2)
comp_val = 1;
}
if (!ascending)
comp_val = -comp_val;
return comp_val;
}
static void
ets_add (ETableSorted *ets
gint row)
{
ETableModel *etm = E_TABLE_MODEL(etssv);
ETableSubset *etss = E_TABLE_SUBSET(etssv);
ETableSorted *ets = E_TABLE_SORTED (etssv);
int i;
if (etss->n_map + 1 > etssv->n_vals_allocated) {
etssv->n_vals_allocated += INCREMENT_AMOUNT;
etss->map_table = g_realloc (etss->map_table, (etssv->n_vals_allocated) * sizeof(int));
}
i = etss->n_map;
if (ets->sort_idle_id == 0) {
/* this is to see if we're inserting a lot of things between idle loops.
If we are, we're busy, its faster to just append and perform a full sort later */
ets->insert_count++;
if (ets->insert_count > ETS_INSERT_MAX) {
/* schedule a sort, and append instead */
ets->sort_idle_id = g_idle_add_full(50, (GSourceFunc) ets_sort_idle, ets, NULL);
} else {
/* make sure we have an idle handler to reset the count every now and then */
if (ets->insert_idle_id == 0) {
ets->insert_idle_id = g_idle_add_full(40, (GSourceFunc) ets_insert_idle, ets, NULL);
}
i = 0;
/* handle insertions when we have a 'sort group' */
if (e_table_model_has_sort_group(etss->source)) {
/* find the row this row maps to */
char *group = g_strdup(e_table_model_row_sort_group(etss->source, row));
const char *newgroup;
int cmp, grouplen, newgrouplen;
newgroup = strrchr(group, '/');
grouplen = strlen(group);
if (newgroup)
cmp = newgroup-group;
else
cmp = grouplen;
/* find first common parent */
while (i<etss->n_map) {
newgroup = e_table_model_row_sort_group(etss->source, etss->map_table[i]);
if (strncmp(newgroup, group, cmp) == 0) {
break;
}
i++;
}
/* check matching records */
while (i<etss->n_map) {
newgroup = e_table_model_row_sort_group(etss->source, etss->map_table[i]);
newgrouplen = strlen(newgroup);
if (strncmp(newgroup, group, cmp) == 0) {
/* common parent, check for same level */
if (grouplen == newgrouplen) {
if (ets_compare(ets, etss->map_table[i], row) >= 0)
break;
} else if (strncmp(newgroup + cmp, group + cmp, grouplen - cmp) == 0)
/* Found a child of the inserted node. Insert here. */
break;
} else {
/* ran out of common parents, insert here */
break;
}
i++;
}
g_free(group);
} else {
while (i < etss->n_map && ets_compare(ets, etss->map_table[i], row) < 0)
i++;
}
memmove(etss->map_table + i + 1, etss->map_table + i, (etss->n_map - i) * sizeof(int));
}
}
etss->map_table[i] = row;
etss->n_map++;
e_table_model_row_inserted (etm, i);
}
#endif
ETableModel *
e_table_sorted_new (ETableModel *source, ETableHeader *full_header, ETableSortInfo *sort_info)
@ -283,6 +163,9 @@ ets_proxy_model_row_changed (ETableSubset *subset, ETableModel *source, int row)
{
if (!E_TABLE_SORTED(subset)->sort_idle_id)
E_TABLE_SORTED(subset)->sort_idle_id = g_idle_add_full(50, (GSourceFunc) ets_sort_idle, subset, NULL);
if (ets_parent_class->proxy_model_row_changed)
(ets_parent_class->proxy_model_row_changed) (subset, source, row);
}
static void
@ -290,23 +173,81 @@ ets_proxy_model_cell_changed (ETableSubset *subset, ETableModel *source, int col
{
ETableSorted *ets = E_TABLE_SORTED(subset);
if (e_table_sorting_utils_affects_sort(source, ets->sort_info, ets->full_header, col))
ets_proxy_model_row_changed(subset, source, row);
else if (ets_parent_class->proxy_model_cell_changed) {
ets_proxy_model_row_changed(subset, source, row);
else if (ets_parent_class->proxy_model_cell_changed)
(ets_parent_class->proxy_model_cell_changed) (subset, source, col, row);
}
static void
ets_proxy_model_row_inserted (ETableSubset *etss, ETableModel *source, int row)
{
ETableModel *etm = E_TABLE_MODEL(etss);
ETableSorted *ets = E_TABLE_SORTED(etss);
int i;
e_table_model_pre_change (etm);
for (i = 0; i < etss->n_map; i++) {
if (etss->map_table[i] >= row)
etss->map_table[i] ++;
}
etss->map_table = g_realloc (etss->map_table, (etss->n_map + 1) * sizeof(int));
i = etss->n_map;
if (ets->sort_idle_id == 0) {
/* this is to see if we're inserting a lot of things between idle loops.
If we are, we're busy, its faster to just append and perform a full sort later */
ets->insert_count++;
if (ets->insert_count > ETS_INSERT_MAX) {
/* schedule a sort, and append instead */
ets->sort_idle_id = g_idle_add_full(50, (GSourceFunc) ets_sort_idle, ets, NULL);
} else {
/* make sure we have an idle handler to reset the count every now and then */
if (ets->insert_idle_id == 0) {
ets->insert_idle_id = g_idle_add_full(40, (GSourceFunc) ets_insert_idle, ets, NULL);
}
i = e_table_sorting_utils_insert(etss->source, ets->sort_info, ets->full_header, etss->map_table, etss->n_map, row);
memmove(etss->map_table + i + 1, etss->map_table + i, (etss->n_map - i) * sizeof(int));
}
}
etss->map_table[i] = row;
etss->n_map++;
e_table_model_row_inserted (etm, i);
d(g_print("inserted row %d", row));
d(e_table_subset_print_debugging(etss));
}
static void
ets_proxy_model_row_inserted (ETableSubset *subset, ETableModel *source, int row)
ets_proxy_model_row_deleted (ETableSubset *etss, ETableModel *source, int row)
{
ets_proxy_model_changed(subset, source);
}
ETableModel *etm = E_TABLE_MODEL(etss);
int i;
gboolean shift;
static void
ets_proxy_model_row_deleted (ETableSubset *subset, ETableModel *source, int row)
{
ets_proxy_model_changed(subset, source);
shift = row == etss->n_map - 1;
for (i = 0; i < etss->n_map; i++){
if (etss->map_table[i] == row) {
e_table_model_pre_change (etm);
memmove (etss->map_table + i, etss->map_table + i + 1, (etss->n_map - i - 1) * sizeof(int));
etss->n_map --;
if (shift)
e_table_model_row_deleted (etm, i);
}
}
if (!shift) {
for (i = 0; i < etss->n_map; i++) {
if (etss->map_table[i] >= row)
etss->map_table[i] --;
}
e_table_model_changed (etm);
}
d(g_print("deleted row %d", row));
d(e_table_subset_print_debugging(etss));
}
static void

View File

@ -5,6 +5,38 @@
#define d(x)
/* This takes source rows. */
static int
etsu_compare(ETableModel *source, ETableSortInfo *sort_info, ETableHeader *full_header, int row1, int row2)
{
int j;
int sort_count = e_table_sort_info_sorting_get_count(sort_info);
int comp_val = 0;
int ascending = 1;
for (j = 0; j < sort_count; j++) {
ETableSortColumn column = e_table_sort_info_sorting_get_nth(sort_info, j);
ETableCol *col;
col = e_table_header_get_column_by_col_idx(full_header, column.column);
if (col == NULL)
col = e_table_header_get_column (full_header, e_table_header_count (full_header) - 1);
comp_val = (*col->compare)(e_table_model_value_at (source, col->col_idx, row1),
e_table_model_value_at (source, col->col_idx, row2));
ascending = column.ascending;
if (comp_val != 0)
break;
}
if (comp_val == 0) {
if (row1 < row2)
comp_val = -1;
if (row1 > row2)
comp_val = 1;
}
if (!ascending)
comp_val = -comp_val;
return comp_val;
}
static ETableSortInfo *sort_info_closure;
static void **vals_closure;
@ -319,12 +351,6 @@ e_table_sorting_utils_sort(ETableModel *source, ETableSortInfo *sort_info, ETabl
if (col == NULL)
col = e_table_header_get_column (full_header, e_table_header_count (full_header) - 1);
for (i = 0; i < rows; i++) {
#if 0
if( !(i & 0xff) ) {
while(gtk_events_pending())
gtk_main_iteration();
}
#endif
vals_closure[map_table[i] * cols + j] = e_table_model_value_at (source, col->col_idx, map_table[i]);
}
compare_closure[j] = col->compare;
@ -370,3 +396,133 @@ e_table_sorting_utils_affects_sort (ETableModel *source,
}
return FALSE;
}
int
e_table_sorting_utils_insert(ETableModel *source, ETableSortInfo *sort_info, ETableHeader *full_header, int *map_table, int rows, int row)
{
int i;
i = 0;
/* handle insertions when we have a 'sort group' */
if (e_table_model_has_sort_group(source)) {
/* find the row this row maps to */
char *group = g_strdup(e_table_model_row_sort_group(source, row));
const char *newgroup;
int cmp, grouplen, newgrouplen;
newgroup = strrchr(group, '/');
grouplen = strlen(group);
if (newgroup)
cmp = newgroup-group;
else
cmp = grouplen;
/* find first common parent */
while (i < rows) {
newgroup = e_table_model_row_sort_group(source, map_table[i]);
if (strncmp(newgroup, group, cmp) == 0) {
break;
}
i++;
}
/* check matching records */
while (i<row) {
newgroup = e_table_model_row_sort_group(source, map_table[i]);
newgrouplen = strlen(newgroup);
if (strncmp(newgroup, group, cmp) == 0) {
/* common parent, check for same level */
if (grouplen == newgrouplen) {
if (etsu_compare(source, sort_info, full_header, map_table[i], row) >= 0)
break;
} else if (strncmp(newgroup + cmp, group + cmp, grouplen - cmp) == 0)
/* Found a child of the inserted node. Insert here. */
break;
} else {
/* ran out of common parents, insert here */
break;
}
i++;
}
g_free(group);
} else {
while (i < rows && etsu_compare(source, sort_info, full_header, map_table[i], row) < 0)
i++;
}
return i;
}
#if 0
void *bsearch(const void *key, const void *base, size_t nmemb,
size_t size, int (*compar)(const void *, const void *, void *), gpointer user_data)
{
}
int
e_table_sorting_utils_check_position (ETableModel *source, ETableSortInfo *sort_info, ETableHeader *full_header, int *map_table, int rows, int view_row)
{
int i;
int row;
i = view_row;
row = map_table[i];
/* handle insertions when we have a 'sort group' */
if (e_table_model_has_sort_group(source)) {
/* find the row this row maps to */
char *group = g_strdup(e_table_model_row_sort_group(source, row));
const char *newgroup;
int cmp, grouplen, newgrouplen;
newgroup = strrchr(group, '/');
grouplen = strlen(group);
if (newgroup)
cmp = newgroup-group;
else
cmp = grouplen;
/* find first common parent */
while (i < rows) {
newgroup = e_table_model_row_sort_group(source, map_table[i]);
if (strncmp(newgroup, group, cmp) == 0) {
break;
}
i++;
}
/* check matching records */
while (i < row) {
newgroup = e_table_model_row_sort_group(source, map_table[i]);
newgrouplen = strlen(newgroup);
if (strncmp(newgroup, group, cmp) == 0) {
/* common parent, check for same level */
if (grouplen == newgrouplen) {
if (etsu_compare(source, sort_info, full_header, map_table[i], row) >= 0)
break;
} else if (strncmp(newgroup + cmp, group + cmp, grouplen - cmp) == 0)
/* Found a child of the inserted node. Insert here. */
break;
} else {
/* ran out of common parents, insert here */
break;
}
i++;
}
g_free(group);
} else {
i = view_row;
if (i < rows && etsu_compare(source, sort_info, full_header, map_table[i + 1], row) < 0) {
i ++;
while (i < rows - 1 && etsu_compare(source, sort_info, full_header, map_table[i], row) < 0)
i ++;
} else if (i > 0 && etsu_compare(source, sort_info, full_header, map_table[i - 1], row) > 0) {
i --;
while (i > 0 && etsu_compare(source, sort_info, full_header, map_table[i], row) > 0)
i --;
}
}
return i;
}
#endif

View File

@ -21,6 +21,12 @@ gboolean e_table_sorting_utils_affects_sort (ETableModel *source,
ETableHeader *full_header,
int col);
int e_table_sorting_utils_insert (ETableModel *source,
ETableSortInfo *sort_info,
ETableHeader *full_header,
int *map_table,
int rows,
int row);
#ifdef __cplusplus
}

View File

@ -32,8 +32,8 @@ etssv_add (ETableSubsetVariable *etssv,
e_table_model_pre_change(etm);
if (etss->n_map + 1 > etssv->n_vals_allocated){
etss->map_table = g_realloc (etss->map_table, (etssv->n_vals_allocated + INCREMENT_AMOUNT) * sizeof(int));
etssv->n_vals_allocated += INCREMENT_AMOUNT;
etss->map_table = g_realloc (etss->map_table, etssv->n_vals_allocated * sizeof(int));
}
etss->map_table[etss->n_map++] = row;

View File

@ -379,3 +379,12 @@ e_table_subset_get_toplevel (ETableSubset *table)
else
return table->source;
}
void
e_table_subset_print_debugging (ETableSubset *table_model)
{
int i;
for (i = 0; i < table_model->n_map; i++) {
g_print("%8d\n", table_model->map_table[i]);
}
}

View File

@ -43,11 +43,16 @@ typedef struct {
void (*proxy_model_row_deleted) (ETableSubset *etss, ETableModel *etm, int row);
} ETableSubsetClass;
GtkType e_table_subset_get_type (void);
ETableModel *e_table_subset_new (ETableModel *etm, int n_vals);
ETableModel *e_table_subset_construct (ETableSubset *ets, ETableModel *source, int nvals);
GtkType e_table_subset_get_type (void);
ETableModel *e_table_subset_new (ETableModel *etm,
int n_vals);
ETableModel *e_table_subset_construct (ETableSubset *ets,
ETableModel *source,
int nvals);
ETableModel *e_table_subset_get_toplevel (ETableSubset *table_model);
ETableModel *e_table_subset_get_toplevel (ETableSubset *table_model);
void e_table_subset_print_debugging (ETableSubset *table_model);
#ifdef __cplusplus
}