[gnumeric] Names: fix relocation upon col/row ins/del.
- From: Morten Welinder <mortenw src gnome org>
- To: svn-commits-list gnome org
- Subject: [gnumeric] Names: fix relocation upon col/row ins/del.
- Date: Mon, 4 May 2009 22:09:13 -0400 (EDT)
commit 8b5301548a32a712b9b7c1d946665e1347bff0c4
Author: Morten Welinder <terra gnome org>
Date: Mon May 4 22:08:40 2009 -0400
Names: fix relocation upon col/row ins/del.
---
ChangeLog | 19 ++++++++++++++++++
src/dependent.c | 55 +++++++++++++++++-----------------------------------
src/expr.c | 37 +++++++++++++++++++++-------------
src/parse-util.c | 21 ++++++-------------
src/position.c | 4 +--
src/sheet.c | 8 +++++++
src/sheet.h | 2 +
src/xml-sax-read.c | 5 +--
8 files changed, 80 insertions(+), 71 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index f01b817..f22c456 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,24 @@
2009-05-04 Morten Welinder <terra gnome org>
+ * src/sheet.c (gnm_sheet_get_size2): New function.
+
+ * src/parse-util.c (cellref_as_string, r1c1_rangeref_parse,
+ rangeref_as_string, rangeref_parse): Simplify using
+ gnm_sheet_get_size2.
+
+ * src/position.c (gnm_rangeref_normalize_pp): Simplify using
+ gnm_sheet_get_size2.
+
+ * src/xml-sax-read.c (handle_delayed_names): Simplify using
+ gnm_sheet_get_size2.
+
+ * src/expr.c (reloc_restore_cellref): Take a GnmSheetSize, not a
+ Sheet. All callers changed.
+
+ * src/dependent.c (dependents_relocate): Relocate names with
+ respect to the right GnmParsePos.
+ (gnm_dep_container_dump): Just list the names.
+
* src/workbook.c (workbook_foreach_name): Add extra globals_only
flag. Caller changed.
diff --git a/src/dependent.c b/src/dependent.c
index 5c645b8..513825b 100644
--- a/src/dependent.c
+++ b/src/dependent.c
@@ -2112,12 +2112,14 @@ dependents_relocate (GnmExprRelocateInfo const *rinfo)
case GNM_EXPR_RELOCATE_COLS:
case GNM_EXPR_RELOCATE_ROWS: {
GSList *l, *names = names_referencing_sheet (sheet);
+ GnmExprRelocateInfo rinfo2 = *rinfo;
for (l = names; l; l = l->next) {
GnmNamedExpr *nexpr = l->data;
- GnmExprTop const *newtree =
- gnm_expr_top_relocate (nexpr->texpr,
- rinfo, TRUE);
+ GnmExprTop const *newtree;
+ rinfo2.pos = nexpr->pos;
+ newtree = gnm_expr_top_relocate (nexpr->texpr,
+ &rinfo2, TRUE);
if (newtree) {
GOUndo *u = expr_name_set_expr_undo_new (nexpr);
u_names = go_undo_combine (u_names, u);
@@ -2868,38 +2870,6 @@ dump_dynamic_dep (gpointer key, G_GNUC_UNUSED gpointer value,
g_string_free (out.accum, TRUE);
}
-static void
-cb_dump_name_dep (gpointer key, G_GNUC_UNUSED gpointer value,
- gpointer closure)
-{
- GnmDependent *dep = key;
- GString *target = closure;
-
- if (target->str[target->len - 1] != '[')
- g_string_append (target, ", ");
- dependent_debug_name (dep, target);
-}
-
-static void
-dump_name_dep (gpointer key, G_GNUC_UNUSED gpointer value,
- G_GNUC_UNUSED gpointer closure)
-{
- GnmNamedExpr *nexpr = key;
- GString *target = g_string_new (NULL);
-
- g_string_append (target, " ");
- if (!nexpr->active) g_string_append_c (target, '(');
- g_string_append (target, nexpr->name->str);
- if (!nexpr->active) g_string_append_c (target, ')');
- g_string_append (target, " -> [");
- if (nexpr->dependents)
- g_hash_table_foreach (nexpr->dependents, cb_dump_name_dep, target);
- g_string_append (target, "]");
-
- g_printerr ("%s\n", target->str);
- g_string_free (target, TRUE);
-}
-
/**
* gnm_dep_container_dump :
* @deps :
@@ -2946,9 +2916,20 @@ gnm_dep_container_dump (GnmDepContainer const *deps,
}
if (deps->referencing_names && g_hash_table_size (deps->referencing_names) > 0) {
- g_printerr (" Names whose expressions reference this sheet mapped to dependencies\n");
+ GSList *l, *names = NULL;
+
g_hash_table_foreach (deps->referencing_names,
- dump_name_dep, NULL);
+ (GHFunc)cb_collect_names,
+ &names);
+
+ g_printerr (" Names whose expressions explicitly reference this sheet\n ");
+ for (l = names; ; l = l->next) {
+ GnmNamedExpr *nexpr = l->data;
+ g_printerr ("%s%s",
+ expr_name_name (nexpr),
+ l->next ? ", " : "\n");
+ }
+ g_slist_free (names);
}
}
diff --git a/src/expr.c b/src/expr.c
index 0cc480f..ff3caff 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -1899,14 +1899,17 @@ reloc_normalize_cellref (RelocInfoInternal const *rinfo, GnmCellRef const *ref,
/* Return TRUE if @pos is out of bounds */
static gboolean
reloc_restore_cellref (RelocInfoInternal const *rinfo,
- Sheet *sheet, GnmCellPos const *pos,
+ GnmSheetSize const *ss, GnmCellPos const *pos,
GnmCellRef *res)
{
- if (res->sheet == rinfo->details->origin_sheet)
+ if (res->sheet == rinfo->details->origin_sheet) {
res->sheet = rinfo->details->target_sheet;
+ if (res->sheet)
+ ss = gnm_sheet_get_size (res->sheet);
+ }
- if (!res->col_relative || rinfo->check_rels) {
- if (pos->col < 0 || gnm_sheet_get_max_cols (sheet) <= pos->col)
+ if (!res->col_relative || rinfo->check_rels) {
+ if (pos->col < 0 || ss->max_cols <= pos->col)
return TRUE;
res->col = pos->col;
if (res->col_relative) {
@@ -1915,8 +1918,9 @@ reloc_restore_cellref (RelocInfoInternal const *rinfo,
res->col -= rinfo->details->col_offset;
}
}
- if (!res->row_relative || rinfo->check_rels) {
- if (pos->row < 0 || gnm_sheet_get_max_rows (sheet) <= pos->row)
+
+ if (!res->row_relative || rinfo->check_rels) {
+ if (pos->row < 0 || ss->max_rows <= pos->row)
return TRUE;
res->row = pos->row;
if (res->row_relative) {
@@ -1936,6 +1940,7 @@ reloc_cellrange (RelocInfoInternal const *rinfo, GnmValueRange const *v,
{
GnmRange r;
Sheet *start_sheet, *end_sheet;
+ GnmSheetSize const *start_ss, *end_ss;
gboolean full_col, full_row;
gboolean full_col_begin, full_row_begin;
@@ -1949,11 +1954,13 @@ reloc_cellrange (RelocInfoInternal const *rinfo, GnmValueRange const *v,
/* (Foo,NULL) in Bar will generate (Foo,Bar) in normalize */
if (NULL == v->cell.b.sheet)
end_sheet = start_sheet;
+ start_ss = gnm_sheet_get_size2 (start_sheet, rinfo->details->pos.wb);
+ end_ss = gnm_sheet_get_size2 (end_sheet, rinfo->details->pos.wb);
- full_col = sticky_end && r.end.row >= gnm_sheet_get_last_row (start_sheet);
+ full_col = sticky_end && r.end.row >= start_ss->max_rows - 1;
full_col_begin = full_col && r.start.row == 0;
- full_row = sticky_end && r.end.col >= gnm_sheet_get_last_col (start_sheet);
+ full_row = sticky_end && r.end.col >= start_ss->max_cols - 1;
full_row_begin = full_row && r.start.col == 0;
if (reloc_range (rinfo->details, start_sheet, end_sheet, &r) ||
@@ -1961,16 +1968,16 @@ reloc_cellrange (RelocInfoInternal const *rinfo, GnmValueRange const *v,
GnmRangeRef res = v->cell;
if (full_col)
- r.end.row = gnm_sheet_get_last_row (start_sheet);
+ r.end.row = start_ss->max_rows - 1;
if (full_col_begin)
r.start.row = 0;
if (full_row)
- r.end.col = gnm_sheet_get_last_col (start_sheet);
+ r.end.col = start_ss->max_cols - 1;
if (full_row_begin)
r.start.col = 0;
- if (reloc_restore_cellref (rinfo, start_sheet, &r.start, &res.a) ||
- reloc_restore_cellref (rinfo, end_sheet, &r.end, &res.b))
+ if (reloc_restore_cellref (rinfo, start_ss, &r.start, &res.a) ||
+ reloc_restore_cellref (rinfo, end_ss, &r.end, &res.b))
return gnm_expr_new_constant (value_new_error_REF (NULL));
if (gnm_rangeref_equal (&res, &v->cell))
return NULL;
@@ -2142,15 +2149,17 @@ gnm_expr_relocate (GnmExpr const *expr, RelocInfoInternal const *rinfo)
case GNM_EXPR_RELOCATE_COLS:
case GNM_EXPR_RELOCATE_ROWS: {
GnmRange r;
- Sheet *sheet;
+ Sheet *sheet;
+ GnmSheetSize const *ss;
reloc_normalize_cellref (rinfo, ref, &sheet, &r.start);
r.end = r.start;
+ ss = gnm_sheet_get_size2 (sheet, rinfo->details->pos.wb);
if (reloc_range (rinfo->details, sheet, sheet, &r) ||
rinfo->from_inside) {
GnmCellRef res = *ref;
- if (reloc_restore_cellref (rinfo, sheet, &r.start, &res))
+ if (reloc_restore_cellref (rinfo, ss, &r.start, &res))
return gnm_expr_new_constant (value_new_error_REF (NULL));
if (gnm_cellref_equal (&res, ref))
return NULL;
diff --git a/src/parse-util.c b/src/parse-util.c
index c4ee33a..4037907 100644
--- a/src/parse-util.c
+++ b/src/parse-util.c
@@ -273,9 +273,8 @@ cellref_as_string (GnmConventionsOut *out,
} else {
GnmCellPos pos;
Sheet const *size_sheet = eval_sheet (sheet, out->pp->sheet);
- GnmSheetSize const *ss = size_sheet
- ? gnm_sheet_get_size (size_sheet)
- : workbook_get_sheet_size (out->pp->wb);
+ GnmSheetSize const *ss =
+ gnm_sheet_get_size2 (size_sheet, out->pp->wb);
gnm_cellpos_init_cellref_ss (&pos, cell_ref, &out->pp->eval, ss);
@@ -305,9 +304,7 @@ rangeref_as_string (GnmConventionsOut *out, GnmRangeRef const *ref)
gnm_rangeref_normalize_pp (ref, out->pp, &start_sheet, &end_sheet, &r);
- end_ss = end_sheet
- ? gnm_sheet_get_size (end_sheet)
- : workbook_get_sheet_size (out->pp->wb);
+ end_ss = gnm_sheet_get_size2 (end_sheet, out->pp->wb);
if (ref->a.sheet) {
if (NULL != out->pp->wb && ref->a.sheet->workbook != out->pp->wb) {
@@ -960,10 +957,8 @@ r1c1_rangeref_parse (GnmRangeRef *res, char const *ptr, GnmParsePos const *pp)
a_sheet = eval_sheet (res->a.sheet, pp->sheet);
b_sheet = eval_sheet (res->b.sheet, a_sheet);
- a_ss = a_sheet
- ? gnm_sheet_get_size (a_sheet)
- : workbook_get_sheet_size (pp->wb);
- b_ss = b_sheet ? gnm_sheet_get_size (b_sheet) : a_ss;
+ a_ss = gnm_sheet_get_size2 (a_sheet, pp->wb);
+ b_ss = gnm_sheet_get_size2 (b_sheet, pp->wb);
if (*ptr == 'R' || *ptr == 'r') {
ptr = r1c1_get_index (ptr, a_ss,
@@ -1083,10 +1078,8 @@ rangeref_parse (GnmRangeRef *res, char const *start, GnmParsePos const *pp,
a_sheet = eval_sheet (res->a.sheet, pp->sheet);
b_sheet = eval_sheet (res->b.sheet, a_sheet);
- a_ss = a_sheet
- ? gnm_sheet_get_size (a_sheet)
- : workbook_get_sheet_size (pp->wb);
- b_ss = b_sheet ? gnm_sheet_get_size (b_sheet) : a_ss;
+ a_ss = gnm_sheet_get_size2 (a_sheet, pp->wb);
+ b_ss = gnm_sheet_get_size2 (b_sheet, pp->wb);
tmp1 = col_parse (ptr, a_ss, &res->a.col, &res->a.col_relative);
if (tmp1 == NULL) { /* check for row only ref 2:3 */
diff --git a/src/position.c b/src/position.c
index 7dd707d..f05445f 100644
--- a/src/position.c
+++ b/src/position.c
@@ -419,9 +419,7 @@ gnm_rangeref_normalize_pp (GnmRangeRef const *ref, GnmParsePos const *pp,
*start_sheet = eval_sheet (ref->a.sheet, pp->sheet);
*end_sheet = eval_sheet (ref->b.sheet, *start_sheet);
- ss = *start_sheet
- ? gnm_sheet_get_size (*start_sheet)
- : workbook_get_sheet_size (pp->wb);
+ ss = gnm_sheet_get_size2 (*start_sheet, pp->wb);
gnm_cellpos_init_cellref_ss (&dest->start, &ref->a, &pp->eval, ss);
ss = *end_sheet
diff --git a/src/sheet.c b/src/sheet.c
index c304848..7d8bd8d 100644
--- a/src/sheet.c
+++ b/src/sheet.c
@@ -5702,3 +5702,11 @@ gnm_sheet_get_size (Sheet const *sheet)
return &sheet->size;
}
+
+GnmSheetSize const *
+gnm_sheet_get_size2 (Sheet const *sheet, Workbook const *wb)
+{
+ return sheet
+ ? gnm_sheet_get_size (sheet)
+ : workbook_get_sheet_size (wb);
+}
diff --git a/src/sheet.h b/src/sheet.h
index 273444c..5a41fc2 100644
--- a/src/sheet.h
+++ b/src/sheet.h
@@ -135,6 +135,8 @@ void gnm_sheet_suggest_size (int *cols, int *rows);
GOUndo *gnm_sheet_resize (Sheet *sheet, int cols, int rows, GOCmdContext *cc);
GnmSheetSize const *gnm_sheet_get_size (Sheet const *sheet);
+GnmSheetSize const *gnm_sheet_get_size2 (Sheet const *sheet,
+ Workbook const *wb);
#define gnm_sheet_get_max_rows(sheet) (gnm_sheet_get_size(sheet)->max_rows)
#define gnm_sheet_get_max_cols(sheet) (gnm_sheet_get_size(sheet)->max_cols)
#define gnm_sheet_get_last_col(sheet) (gnm_sheet_get_max_cols(sheet) - 1)
diff --git a/src/xml-sax-read.c b/src/xml-sax-read.c
index bda564e..7ab065b 100644
--- a/src/xml-sax-read.c
+++ b/src/xml-sax-read.c
@@ -2322,9 +2322,8 @@ handle_delayed_names (XMLSaxParseState *state)
if (pos_str) {
GnmCellRef tmp;
char const *rest;
- GnmSheetSize const *ss = sheet
- ? gnm_sheet_get_size (sheet)
- : workbook_get_sheet_size (state->wb);
+ GnmSheetSize const *ss =
+ gnm_sheet_get_size2 (sheet, state->wb);
rest = cellref_parse (&tmp, ss, pos_str, &pp.eval);
if (rest != NULL && *rest == '\0') {
pp.eval.col = tmp.col;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]