Tab key now moves to next row, upon end of line.
[pspp-builds.git] / lib / gtk-contrib / psppire-sheet.c
index dac561a134b9b2ad99aac73c16699edab2852535..908081e1a0abaafe0e2627e6ff8a6a9ded3e6fa2 100644 (file)
@@ -476,6 +476,11 @@ static void psppire_sheet_size_request              (GtkWidget *widget,
 static void psppire_sheet_size_allocate                 (GtkWidget *widget,
                                                  GtkAllocation *allocation);
 
+static gboolean psppire_sheet_focus_in               (GtkWidget     *widget,
+                                                     GdkEventFocus *event,
+                                                     gpointer       user_data);
+
+
 /* Sheet queries */
 
 static gboolean psppire_sheet_range_isvisible (const PsppireSheet *sheet,
@@ -1064,7 +1069,7 @@ psppire_sheet_class_init (PsppireSheetClass *klass)
   widget_class->expose_event = psppire_sheet_expose;
   widget_class->size_request = psppire_sheet_size_request;
   widget_class->size_allocate = psppire_sheet_size_allocate;
-  widget_class->focus_in_event = NULL;
+  widget_class->focus_in_event = psppire_sheet_focus_in;
   widget_class->focus_out_event = NULL;
 
   klass->set_scroll_adjustments = psppire_sheet_set_scroll_adjustments;
@@ -4052,6 +4057,20 @@ psppire_sheet_crossing_notify (GtkWidget *widget,
   return TRUE;
 }
 
+
+static gboolean
+psppire_sheet_focus_in (GtkWidget     *w,
+                       GdkEventFocus *event,
+                       gpointer       user_data)
+{
+  PsppireSheet *sheet = PSPPIRE_SHEET (w);
+
+  gtk_widget_grab_focus (sheet->entry_widget);
+
+  return TRUE;
+}
+
+
 static void
 psppire_sheet_extend_selection (PsppireSheet *sheet, gint row, gint column)
 {
@@ -4185,12 +4204,29 @@ step_sheet (PsppireSheet *sheet, GtkScrollType dir)
     case GTK_SCROLL_STEP_LEFT:
       new_cell.col--;
       break;
+    case GTK_SCROLL_STEP_FORWARD:
+      new_cell.col++;
+      if (new_cell.col >=
+         psppire_sheet_model_get_column_count (sheet->model))
+       {
+         new_cell.col = 0;
+         new_cell.row++;
+       }
+      break;
+    case GTK_SCROLL_STEP_BACKWARD:
+      new_cell.col--;
+      if (new_cell.col < 0)
+       {
+         new_cell.col =
+           psppire_sheet_model_get_column_count (sheet->model) - 1;
+         new_cell.row--;
+       }
+      break;
     default:
       g_assert_not_reached ();
       break;
     }
 
-
   g_signal_emit (sheet, sheet_signals[TRAVERSE], 0,
                 &sheet->active_cell,
                 &new_cell,
@@ -4268,10 +4304,14 @@ psppire_sheet_key_press (GtkWidget *widget,
   switch (key->keyval)
     {
     case GDK_Tab:
+      step_sheet (sheet, GTK_SCROLL_STEP_FORWARD);
+      break;
     case GDK_Right:
       step_sheet (sheet, GTK_SCROLL_STEP_RIGHT);
       break;
     case GDK_ISO_Left_Tab:
+      step_sheet (sheet, GTK_SCROLL_STEP_BACKWARD);
+      break;
     case GDK_Left:
       step_sheet (sheet, GTK_SCROLL_STEP_LEFT);
       break;
@@ -4584,8 +4624,6 @@ set_entry_widget_font (PsppireSheet *sheet)
   gtk_widget_modify_style (sheet->entry_widget, style);
 }
 
-
-
 static void
 create_sheet_entry (PsppireSheet *sheet)
 {