From d66694bf42b1096fbfd59f7d6cb23356a57deaa2 Mon Sep 17 00:00:00 2001 From: Arturo Espinosa Date: Tue, 28 Jul 1998 20:14:09 +0000 Subject: [PATCH] Simple brute force, stupid, idiotic recomputetation engine; Will be gone soon --- ChangeLog-1999-07-09 | 6 ++++ ChangeLog-2000-02-23 | 6 ++++ OChangeLog-1999-07-09 | 6 ++++ OChangeLog-2000-02-23 | 6 ++++ src/gnumeric-canvas.c | 1 + src/gnumeric-sheet.c | 1 + src/sheet.c | 80 ++++++++++++++++++++++++++++--------------- src/sheet.h | 2 ++ 8 files changed, 80 insertions(+), 28 deletions(-) diff --git a/ChangeLog-1999-07-09 b/ChangeLog-1999-07-09 index 953bec1b6..0bee2cb88 100644 --- a/ChangeLog-1999-07-09 +++ b/ChangeLog-1999-07-09 @@ -1,3 +1,9 @@ +1998-07-28 + + * src/sheet.c (sheet_cell_new): Insert the row, not the cell in + the column list. + (sheet_cell_foreach_range): Fixety fix + 1998-07-27 * src/sheet.c (sheet_cell_new): Cells are born with their propper diff --git a/ChangeLog-2000-02-23 b/ChangeLog-2000-02-23 index 953bec1b6..0bee2cb88 100644 --- a/ChangeLog-2000-02-23 +++ b/ChangeLog-2000-02-23 @@ -1,3 +1,9 @@ +1998-07-28 + + * src/sheet.c (sheet_cell_new): Insert the row, not the cell in + the column list. + (sheet_cell_foreach_range): Fixety fix + 1998-07-27 * src/sheet.c (sheet_cell_new): Cells are born with their propper diff --git a/OChangeLog-1999-07-09 b/OChangeLog-1999-07-09 index 953bec1b6..0bee2cb88 100644 --- a/OChangeLog-1999-07-09 +++ b/OChangeLog-1999-07-09 @@ -1,3 +1,9 @@ +1998-07-28 + + * src/sheet.c (sheet_cell_new): Insert the row, not the cell in + the column list. + (sheet_cell_foreach_range): Fixety fix + 1998-07-27 * src/sheet.c (sheet_cell_new): Cells are born with their propper diff --git a/OChangeLog-2000-02-23 b/OChangeLog-2000-02-23 index 953bec1b6..0bee2cb88 100644 --- a/OChangeLog-2000-02-23 +++ b/OChangeLog-2000-02-23 @@ -1,3 +1,9 @@ +1998-07-28 + + * src/sheet.c (sheet_cell_new): Insert the row, not the cell in + the column list. + (sheet_cell_foreach_range): Fixety fix + 1998-07-27 * src/sheet.c (sheet_cell_new): Cells are born with their propper diff --git a/src/gnumeric-canvas.c b/src/gnumeric-canvas.c index 8b085916d..8042c73e5 100644 --- a/src/gnumeric-canvas.c +++ b/src/gnumeric-canvas.c @@ -81,6 +81,7 @@ gnumeric_sheet_set_current_value (GnumericSheet *sheet) cell_set_text (sheet->sheet, cell, gtk_entry_get_text (GTK_ENTRY (sheet->entry))); if (sheet->selection) stop_cell_selection (sheet); + sheet_brute_force_recompute (sheet->sheet); sheet_redraw_all (sheet->sheet); } diff --git a/src/gnumeric-sheet.c b/src/gnumeric-sheet.c index 8b085916d..8042c73e5 100644 --- a/src/gnumeric-sheet.c +++ b/src/gnumeric-sheet.c @@ -81,6 +81,7 @@ gnumeric_sheet_set_current_value (GnumericSheet *sheet) cell_set_text (sheet->sheet, cell, gtk_entry_get_text (GTK_ENTRY (sheet->entry))); if (sheet->selection) stop_cell_selection (sheet); + sheet_brute_force_recompute (sheet->sheet); sheet_redraw_all (sheet->sheet); } diff --git a/src/sheet.c b/src/sheet.c index 7d509a607..659e01357 100644 --- a/src/sheet.c +++ b/src/sheet.c @@ -21,17 +21,55 @@ sheet_redraw_all (Sheet *sheet) } static void -recompute_one_cell (Sheet *sheet, int col, int row, Cell *cell, void *closure) +sheet_compute_cell (Sheet *sheet, Cell *cell) { + char *error_msg; + Value *v; + + if (cell->text) + g_free (cell->text); + + v = eval_node_value (sheet, + cell->parsed_node, + &error_msg); + + if (cell->value) + eval_release_value (cell->value); + if (v == NULL){ + cell->text = g_strdup (error_msg); + cell->value = NULL; + } else { + /* FIXME: Use the format stuff */ + cell->value = v; + cell->text = eval_value_string (v); + } +} + +static void +recompute_one_cell (Sheet *sheet, int col, int row, Cell *cell, void *closure) +{ + if (cell->parsed_node == NULL) + return; + + printf ("recomputing %d %d\n", col, row); + sheet_compute_cell (sheet, cell); + sheet_redraw_cell_region (sheet, + cell->col->pos, cell->row->pos, + cell->col->pos, cell->row->pos); } void sheet_brute_force_recompute (Sheet *sheet) { - sheet_cell_foreach_range (sheet, 1, 0, 0, SHEET_MAX_COL, SHEET_MAX_ROW, + g_return_if_fail (sheet != NULL); + g_return_if_fail (IS_SHEET (sheet)); + + printf ("brute force!\n"); + sheet_cell_foreach_range (sheet, 1, + 0, 0, + SHEET_MAX_COLS, SHEET_MAX_ROWS, recompute_one_cell, NULL); - } static void @@ -1036,29 +1074,30 @@ sheet_cell_foreach_range (Sheet *sheet, int only_existing, last_row_gen = -1; for (row = (GList *) ci->data; row; row = row->data){ - ColRowInfo *ri = row->data; - - if (ri->pos < start_row) + Cell *cell = (Cell *) row->data; + int row_pos = cell->row->pos; + + if (row_pos < start_row) continue; - if (ri->pos > end_row) + if (row_pos > end_row) break; if (!only_existing){ if (last_row_gen > 0){ - if (ri->pos != last_row_gen+1) + if (row_pos != last_row_gen+1) gen_row_blanks (sheet, ci->pos, last_row_gen, - ri->pos, + row_pos, callback, closure); } - if (ri->pos > start_row) + if (row_pos > start_row) gen_row_blanks (sheet, ci->pos, - ri->pos, start_row, + row_pos, start_row, callback, closure); } - (*callback)(sheet, ci->pos, ri->pos, (Cell *) ri->data, closure); + (*callback)(sheet, ci->pos, row_pos, cell, closure); } } } @@ -1118,7 +1157,6 @@ void cell_set_formula (Sheet *sheet, Cell *cell, char *text) { char *error_msg; - Value *v; g_return_if_fail (sheet != NULL); g_return_if_fail (IS_SHEET (sheet)); @@ -1135,21 +1173,7 @@ cell_set_formula (Sheet *sheet, Cell *cell, char *text) return; } - v = eval_node_value (sheet, - cell->parsed_node, - &error_msg); - - if (cell->value) - eval_release_value (cell->value); - - if (v == NULL){ - cell->text = g_strdup (error_msg); - cell->value = NULL; - } else { - /* FIXME: Use the format stuff */ - cell->value = v; - cell->text = eval_value_string (v); - } + sheet_compute_cell (sheet, cell); } diff --git a/src/sheet.h b/src/sheet.h index 51564abec..efcfa5e7b 100644 --- a/src/sheet.h +++ b/src/sheet.h @@ -89,6 +89,8 @@ void sheet_selection_extend_horizontal (Sheet *sheet, int count); void sheet_selection_extend_vertical (Sheet *sheet, int count); int sheet_selection_is_cell_selected (Sheet *sheet, int col, int row); +void sheet_brute_force_recompute (Sheet *sheet); + /* Cell management */ Cell *sheet_cell_new (Sheet *sheet, int col, int row); void sheet_cell_foreach_range (Sheet *sheet, int only_existing, -- GitLab