+ switch ( dir)
+ {
+ case GTK_SCROLL_PAGE_DOWN:
+ gtk_adjustment_set_value (sheet->vadjustment,
+ sheet->vadjustment->value +
+ sheet->vadjustment->page_increment);
+ break;
+ case GTK_SCROLL_PAGE_UP:
+ gtk_adjustment_set_value (sheet->vadjustment,
+ sheet->vadjustment->value -
+ sheet->vadjustment->page_increment);
+
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+
+
+ vpixel += psppire_axis_pixel_start (sheet->vaxis,
+ min_visible_row (sheet));
+
+ new_row = row_from_ypixel (sheet, vpixel);
+
+ change_active_cell (sheet, new_row,
+ sheet->active_cell.col);
+}
+
+
+static void
+step_sheet (GtkSheet *sheet, GtkScrollType dir)
+{
+ gint current_row = sheet->active_cell.row;
+ gint current_col = sheet->active_cell.col;
+ GtkSheetCell new_cell ;
+ gboolean forbidden = FALSE;
+
+ new_cell.row = current_row;
+ new_cell.col = current_col;
+
+ switch ( dir)
+ {
+ case GTK_SCROLL_STEP_DOWN:
+ new_cell.row++;
+ break;
+ case GTK_SCROLL_STEP_UP:
+ new_cell.row--;
+ break;
+ case GTK_SCROLL_STEP_RIGHT:
+ new_cell.col++;
+ break;
+ case GTK_SCROLL_STEP_LEFT:
+ new_cell.col--;
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+
+
+ maximize_int (&new_cell.row, 0);
+ maximize_int (&new_cell.col, 0);
+
+ minimize_int (&new_cell.row,
+ psppire_axis_unit_count (sheet->vaxis) - 1);
+
+ minimize_int (&new_cell.col,
+ psppire_axis_unit_count (sheet->haxis) - 1);
+
+ g_signal_emit (sheet, sheet_signals[TRAVERSE], 0,
+ &sheet->active_cell,
+ &new_cell,
+ &forbidden);
+
+ if (forbidden)
+ return;
+
+ change_active_cell (sheet, new_cell.row, new_cell.col);
+
+ if ( new_cell.col > max_fully_visible_column (sheet))
+ {
+ glong hpos =
+ psppire_axis_pixel_start (sheet->haxis,
+ new_cell.col + 1);
+ hpos -= sheet->hadjustment->page_size;
+
+ gtk_adjustment_set_value (sheet->hadjustment,
+ hpos);
+ }
+ else if ( new_cell.col < min_fully_visible_column (sheet))
+ {
+ glong hpos =
+ psppire_axis_pixel_start (sheet->haxis,
+ new_cell.col);
+
+ gtk_adjustment_set_value (sheet->hadjustment,
+ hpos);
+ }
+
+
+ if ( new_cell.row > max_fully_visible_row (sheet))
+ {
+ glong vpos =
+ psppire_axis_pixel_start (sheet->vaxis,
+ new_cell.row + 1);
+ vpos -= sheet->vadjustment->page_size;
+
+ gtk_adjustment_set_value (sheet->vadjustment,
+ vpos);
+ }
+ else if ( new_cell.row < min_fully_visible_row (sheet))
+ {
+ glong vpos =
+ psppire_axis_pixel_start (sheet->vaxis,
+ new_cell.row);
+
+ gtk_adjustment_set_value (sheet->vadjustment,
+ vpos);
+ }
+}
+
+
+static gboolean
+gtk_sheet_key_press (GtkWidget *widget,
+ GdkEventKey *key)
+{
+ GtkSheet *sheet = GTK_SHEET (widget);