Prevent sheet from stepping outside its valid cell range.
authorJohn Darrington <john@darrington.wattle.id.au>
Thu, 20 Nov 2008 23:23:08 +0000 (08:23 +0900)
committerJohn Darrington <john@darrington.wattle.id.au>
Thu, 20 Nov 2008 23:23:08 +0000 (08:23 +0900)
lib/gtksheet/gtksheet.c
src/libpspp/misc.h

index ba59e6772b7aaf193dc1575bfc66127997dc2b8b..4728891baa9ab46eccf4f34f25361987f40fcf6a 100644 (file)
@@ -58,6 +58,7 @@
 #include "gtksheet.h"
 #include "gtkextra-marshal.h"
 #include "gsheetmodel.h"
+#include <libpspp/misc.h>
 
 /* sheet flags */
 enum
@@ -4371,6 +4372,16 @@ step_sheet (GtkSheet *sheet, GtkScrollType dir)
       break;
     }
 
+
+  maximize_int (&new_row, 0);
+  maximize_int (&new_col, 0);
+
+  minimize_int (&new_row,
+               g_sheet_row_get_row_count (sheet->row_geometry) - 1);
+
+  minimize_int (&new_col,
+               g_sheet_column_get_column_count (sheet->column_geometry) - 1);
+
   g_signal_emit (sheet, sheet_signals[TRAVERSE], 0,
                 current_row, current_col,
                 &new_row, &new_col, &forbidden);
index 3b02515709ca9969c8d67eab5c9c2210e4822d1e..c2f865d90c95512d7ec4d3517c68dff96e0181d4 100644 (file)
@@ -77,4 +77,23 @@ maximize (double *dest, double src)
     *dest = src;
 }
 
+
+/* Set *DEST to the lower of *DEST and SRC */
+static inline void
+minimize_int (int *dest, int src)
+{
+  if (src < *dest)
+    *dest = src;
+}
+
+
+/* Set *DEST to the greater of *DEST and SRC */
+static inline void
+maximize_int (int *dest, int src)
+{
+  if (src > *dest)
+    *dest = src;
+}
+
+
 #endif /* libpspp/misc.h */