[gnumeric] Sheet resize: fix problem with merges.



commit 4490137c5b0d1b449825ed3e1cc6954b6f0edab1
Author: Morten Welinder <terra gnome org>
Date:   Sun Oct 11 20:44:52 2009 -0400

    Sheet resize: fix problem with merges.

 ChangeLog                            |    7 ++++++
 NEWS                                 |    3 ++
 plugins/openoffice/openoffice-read.c |    6 +++-
 src/command-context.c                |   11 ++++++++++
 src/command-context.h                |    2 +
 src/commands.c                       |   10 ++++++++-
 src/sheet.c                          |   37 +++++++++++++++++++++++++++------
 src/sheet.h                          |    3 +-
 src/ssconvert.c                      |    3 +-
 9 files changed, 70 insertions(+), 12 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 6eace4c..fbba355 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2009-10-11  Morten Welinder  <terra gnome org>
+
+	* src/sheet.c (gnm_sheet_resize_main): Reduce ->cols.max_used and
+	->rows.max_used as appropriate.
+	(gnm_sheet_resize): Check for merges.  Add new perr argument.  All
+	callers changed.
+
 2009-10-11  Andreas J. Guelzow <aguelzow pyrshep ca>
 
 	* src/mathfunc.c (random_skew_normal): new
diff --git a/NEWS b/NEWS
index 8a85118..7fd5785 100644
--- a/NEWS
+++ b/NEWS
@@ -6,6 +6,9 @@ Andreas:
 Jody:
 	* First steps towards a turnkey win32 build.
 
+Morten:
+	* Fix sheet-resize vs. merges issue.  [#582030]
+
 --------------------------------------------------------------------------
 Gnumeric 1.9.14
 
diff --git a/plugins/openoffice/openoffice-read.c b/plugins/openoffice/openoffice-read.c
index 2c8687c..1bf4e45 100644
--- a/plugins/openoffice/openoffice-read.c
+++ b/plugins/openoffice/openoffice-read.c
@@ -926,12 +926,13 @@ oo_extent_sheet_cols (Sheet *sheet, int cols)
 {
 	GOUndo   * goundo;
 	int new_cols, new_rows;
+	gboolean err;
 
 	new_cols = cols;
 	new_rows = gnm_sheet_get_max_rows (sheet);
 	gnm_sheet_suggest_size (&new_cols, &new_rows);
 
-	goundo = gnm_sheet_resize (sheet, new_cols, new_rows, NULL);
+	goundo = gnm_sheet_resize (sheet, new_cols, new_rows, NULL, &err);
 	g_object_unref (G_OBJECT (goundo));
 
 	return gnm_sheet_get_max_cols (sheet);
@@ -1024,12 +1025,13 @@ oo_extent_sheet_rows (Sheet *sheet, int rows)
 {
 	GOUndo   * goundo;
 	int new_cols, new_rows;
+	gboolean err;
 
 	new_cols = gnm_sheet_get_max_cols (sheet);
 	new_rows = rows;
 	gnm_sheet_suggest_size (&new_cols, &new_rows);
 
-	goundo = gnm_sheet_resize (sheet, new_cols, new_rows, NULL);
+	goundo = gnm_sheet_resize (sheet, new_cols, new_rows, NULL, &err);
 	g_object_unref (G_OBJECT (goundo));
 
 	return gnm_sheet_get_max_rows (sheet);
diff --git a/src/command-context.c b/src/command-context.c
index fce8005..b91f581 100644
--- a/src/command-context.c
+++ b/src/command-context.c
@@ -59,6 +59,17 @@ gnm_cmd_context_error_splits_array (GOCmdContext *context,
 	go_cmd_context_error (context, err);
 }
 
+void
+gnm_cmd_context_error_splits_merge (GOCmdContext *context,
+				    GnmRange const *merge)
+{
+	GError *err =
+		g_error_new (gnm_error_array(), 1,
+			     _("Would split merge %s"),
+			     range_as_string (merge));
+	go_cmd_context_error (context, err);
+}
+
 GQuark
 gnm_error_array (void)
 {
diff --git a/src/command-context.h b/src/command-context.h
index 899a738..ef1c437 100644
--- a/src/command-context.h
+++ b/src/command-context.h
@@ -11,6 +11,8 @@ G_BEGIN_DECLS
 void  gnm_cmd_context_error_calc	 (GOCmdContext *cc, char const *msg);
 void  gnm_cmd_context_error_splits_array (GOCmdContext *cc, char const *cmd,
 					  GnmRange const *array);
+void  gnm_cmd_context_error_splits_merge (GOCmdContext *cc,
+					  GnmRange const *merge);
 
 GQuark gnm_error_array (void);
 GQuark gnm_error_calc  (void);
diff --git a/src/commands.c b/src/commands.c
index 1b197bf..b33d7cb 100644
--- a/src/commands.c
+++ b/src/commands.c
@@ -4794,8 +4794,16 @@ cmd_resize_sheets_redo (GnmCommand *cmd, WorkbookControl *wbc)
 
 	for (l = me->sheets; l; l = l->next) {
 		Sheet *sheet = l->data;
-		GOUndo *u = gnm_sheet_resize (sheet, me->cols, me->rows, cc);
+		gboolean err;
+		GOUndo *u = gnm_sheet_resize (sheet, me->cols, me->rows,
+					      cc, &err);
 		me->undo = go_undo_combine (me->undo, u);
+
+		if (err) {
+			if (me->undo)
+				go_undo_undo_with_data (me->undo, cc);
+			return TRUE;
+		}
 	}
 
 	return FALSE;
diff --git a/src/sheet.c b/src/sheet.c
index 536b859..28ff4a6 100644
--- a/src/sheet.c
+++ b/src/sheet.c
@@ -1119,7 +1119,6 @@ gnm_sheet_resize_main (Sheet *sheet, int cols, int rows,
 		       GOCmdContext *cc, GOUndo **pundo)
 {
 	int old_cols, old_rows;
-	static gboolean warned = FALSE;
 
 	if (pundo) *pundo = NULL;
 
@@ -1128,11 +1127,6 @@ gnm_sheet_resize_main (Sheet *sheet, int cols, int rows,
 	if (old_cols == cols && old_rows == rows)
 		return;
 
-	if (!warned) {
-		g_warning ("Changing sheet size is experimental.");
-		warned = TRUE;
-	}
-
 	/* ---------------------------------------- */
 	/* Remove the columns and rows that will disappear.  */
 
@@ -1231,7 +1225,10 @@ gnm_sheet_resize_main (Sheet *sheet, int cols, int rows,
 	/* Actually change the properties.  */
 
 	sheet->size.max_cols = cols;
+	sheet->cols.max_used = MIN (sheet->cols.max_used, cols - 1);
 	sheet->size.max_rows = rows;
+	sheet->rows.max_used = MIN (sheet->rows.max_used, rows - 1);
+
 	if (old_cols != cols)
 		g_object_notify (G_OBJECT (sheet), "columns");
 	if (old_rows != rows)
@@ -1266,15 +1263,41 @@ gnm_sheet_resize_main (Sheet *sheet, int cols, int rows,
 }
 
 GOUndo *
-gnm_sheet_resize (Sheet *sheet, int cols, int rows, GOCmdContext *cc)
+gnm_sheet_resize (Sheet *sheet, int cols, int rows,
+		  GOCmdContext *cc, gboolean *perr)
 {
 	GOUndo *undo = NULL;
 
 	g_return_val_if_fail (IS_SHEET (sheet), NULL);
 	g_return_val_if_fail (gnm_sheet_valid_size (cols, rows), NULL);
 
+	if (cols < sheet->size.max_cols || rows < sheet->size.max_rows) {
+		GSList *overlap, *l;
+		gboolean bad = FALSE;
+		GnmRange r;
+
+		r.start.col = r.start.row = 0;
+		r.end.col = MIN (cols, sheet->size.max_cols) - 1;
+		r.end.row = MIN (rows, sheet->size.max_rows) - 1;
+
+		overlap = gnm_sheet_merge_get_overlap (sheet, &r);
+		for (l = overlap; l && !bad; l = l->next) {
+			GnmRange const *m = l->data;
+			if (!range_contained (m, &r)) {
+				bad = TRUE;
+				gnm_cmd_context_error_splits_merge (cc, m);
+			}
+		}
+		g_slist_free (overlap);
+		if (bad) {
+			*perr = TRUE;
+			return NULL;
+		}
+	}
+
 	gnm_sheet_resize_main (sheet, cols, rows, cc, &undo);
 
+	*perr = FALSE;
 	return undo;
 }
 
diff --git a/src/sheet.h b/src/sheet.h
index 739d01c..1dc56bb 100644
--- a/src/sheet.h
+++ b/src/sheet.h
@@ -132,7 +132,8 @@ void      sheet_destroy_contents (Sheet *sheet);
 gboolean  gnm_sheet_valid_size   (int cols, int rows);
 void      gnm_sheet_suggest_size (int *cols, int *rows);
 
-GOUndo   *gnm_sheet_resize       (Sheet *sheet, int cols, int rows, GOCmdContext *cc);
+GOUndo   *gnm_sheet_resize       (Sheet *sheet, int cols, int rows,
+				  GOCmdContext *cc, gboolean *perr);
 
 GnmSheetSize const *gnm_sheet_get_size (Sheet const *sheet);
 GnmSheetSize const *gnm_sheet_get_size2 (Sheet const *sheet,
diff --git a/src/ssconvert.c b/src/ssconvert.c
index a497e1c..9915744 100644
--- a/src/ssconvert.c
+++ b/src/ssconvert.c
@@ -351,6 +351,7 @@ merge_single (Workbook *wb, Workbook *wb2,
 		int loc = workbook_sheet_count (wb);
 		GOUndo *undo;
 		char *sheet_name;
+		gboolean err;
 
 		g_object_ref (sheet);
 		workbook_sheet_delete (sheet);
@@ -359,7 +360,7 @@ merge_single (Workbook *wb, Workbook *wb2,
 		/* Fix names that reference the old workbook */
 		gnm_sheet_foreach_name (sheet, (GHFunc)cb_fixup_name_wb, wb);
 
-		undo = gnm_sheet_resize (sheet, cmax, rmax, cc);
+		undo = gnm_sheet_resize (sheet, cmax, rmax, cc, &err);
 		if (undo)
 			g_object_unref (undo);
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]