[gnumeric] Names: fix relocation upon col/row ins/del.



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]