Only grab the focus when appropriate
[pspp] / lib / gtksheet / gtksheet.c
index 3c1f32252a1eab199cf0dc3c23216baf9854f7e4..5c868512c5aa51481f95e494ee4e64c4d7d6ca90 100644 (file)
@@ -154,9 +154,7 @@ min_fully_visible_row (const GtkSheet *sheet)
 static inline glong
 max_visible_row (const GtkSheet *sheet)
 {
-  return row_from_ypixel (sheet,
-                         sheet->vadjustment->value +
-                         sheet->vadjustment->page_size);
+  return row_from_ypixel (sheet, sheet->vadjustment->value + sheet->vadjustment->page_size);
 }
 
 
@@ -200,9 +198,7 @@ min_fully_visible_column (const GtkSheet *sheet)
 static inline glong
 max_visible_column (const GtkSheet *sheet)
 {
-  return column_from_xpixel (sheet,
-                            sheet->hadjustment->value +
-                            sheet->hadjustment->page_size);
+  return column_from_xpixel (sheet, sheet->hadjustment->value + sheet->hadjustment->page_size);
 }
 
 static inline glong
@@ -1165,13 +1161,6 @@ range_update_callback (GSheetModel *m, gint row0, gint col0,
   if ( !GTK_WIDGET_REALIZED (GTK_WIDGET (sheet)))
     return;
 
-  if ( max_visible_row (sheet) > g_sheet_model_get_row_count (sheet->model)
-       ||
-       max_visible_column (sheet) > g_sheet_model_get_column_count (sheet->model))
-    {
-      gtk_sheet_moveto (sheet, 0, 0, 0, 0);
-    }
-
   if ( ( row0 < 0 && col0 < 0 ) || ( rowi < 0 && coli < 0 ) )
     {
       gtk_sheet_range_draw (sheet, NULL);
@@ -1892,7 +1881,6 @@ static void
 global_button_clicked (GtkWidget *widget, gpointer data)
 {
   gtk_sheet_click_cell (GTK_SHEET (data), -1, -1);
-  gtk_widget_grab_focus (GTK_WIDGET (data));
 }
 
 
@@ -2144,11 +2132,7 @@ gtk_sheet_range_draw (GtkSheet *sheet, const GtkSheetRange *range)
   g_return_if_fail (drawing_range.rowi >= drawing_range.row0);
   g_return_if_fail (drawing_range.coli >= drawing_range.col0);
 
-  gdk_draw_rectangle (sheet->sheet_window,
-                     GTK_WIDGET (sheet)->style->white_gc,
-                     TRUE,
-                     area.x, area.y,
-                     area.width, area.height);
+  gdk_window_begin_paint_rect (sheet->sheet_window, &area);
 
   for (i = drawing_range.row0; i <= drawing_range.rowi; i++)
     for (j = drawing_range.col0; j <= drawing_range.coli; j++)
@@ -2166,6 +2150,8 @@ gtk_sheet_range_draw (GtkSheet *sheet, const GtkSheetRange *range)
       sheet->active_cell.col >= drawing_range.col0 &&
       sheet->active_cell.col <= drawing_range.coli)
     gtk_sheet_show_entry_widget (sheet);
+
+  gdk_window_end_paint (sheet->sheet_window);
 }
 
 static void
@@ -2671,8 +2657,6 @@ gtk_sheet_show_entry_widget (GtkSheet *sheet)
                                                       row, col));
   gtk_widget_map (sheet->entry_widget);
 
-  gtk_widget_grab_focus (GTK_WIDGET (sheet_entry));
-
   dispose_string (sheet, text);
 }
 
@@ -3103,28 +3087,27 @@ gtk_sheet_expose (GtkWidget *widget,
     }
 
 
-  range.row0 =
-    row_from_ypixel (sheet,
-                          event->area.y + sheet->vadjustment->value);
-  range.row0--;
+  {
+    gint y = event->area.y + sheet->vadjustment->value;
+    gint x = event->area.x + sheet->hadjustment->value;
+
+    if ( sheet->column_titles_visible)
+      y -= sheet->column_title_area.height;
+
+    if ( sheet->row_titles_visible)
+      x -= sheet->row_title_area.width;
 
-  range.rowi =
-    row_from_ypixel (sheet,
-                          event->area.y +
-                          event->area.height + sheet->vadjustment->value);
-  range.rowi++;
+    maximize_int (&x, 0);
+    maximize_int (&y, 0);
 
-  range.col0 =
-    column_from_xpixel (sheet,
-                       event->area.x + sheet->hadjustment->value);
-  range.col0--;
+    range.row0 = row_from_ypixel (sheet, y);
 
-  range.coli =
-    column_from_xpixel (sheet,
-                       event->area.x + event->area.width +
-                       sheet->hadjustment->value);
-  range.coli++;
+    range.rowi = row_from_ypixel (sheet, y + event->area.height);
 
+    range.col0 = column_from_xpixel (sheet, x);
+
+    range.coli = column_from_xpixel (sheet, x + event->area.width);
+  }
 
   if (event->window == sheet->sheet_window)
     {
@@ -3281,12 +3264,6 @@ gtk_sheet_button_press (GtkWidget *widget,
                        NULL, NULL, event->time);
       gtk_grab_add (GTK_WIDGET (sheet));
 
-      /* This seems to be a kludge to work around a problem where the sheet
-        scrolls to another position.  The timeout scrolls it back to its
-        original posn.          JMD 3 July 2007
-      */
-      gtk_widget_grab_focus (GTK_WIDGET (sheet));
-
       if (sheet->selection_mode != GTK_SELECTION_SINGLE &&
          sheet->selection_mode != GTK_SELECTION_NONE &&
          sheet->cursor_drag->type == GDK_SIZING &&
@@ -3362,7 +3339,6 @@ gtk_sheet_button_press (GtkWidget *widget,
        {
          veto = gtk_sheet_click_cell (sheet, -1, column);
          gtk_grab_add (GTK_WIDGET (sheet));
-         gtk_widget_grab_focus (GTK_WIDGET (sheet));
          GTK_SHEET_SET_FLAGS (sheet, GTK_SHEET_IN_SELECTION);
        }
     }
@@ -3380,7 +3356,6 @@ gtk_sheet_button_press (GtkWidget *widget,
        {
          veto = gtk_sheet_click_cell (sheet, row, -1);
          gtk_grab_add (GTK_WIDGET (sheet));
-         gtk_widget_grab_focus (GTK_WIDGET (sheet));
          GTK_SHEET_SET_FLAGS (sheet, GTK_SHEET_IN_SELECTION);
        }
     }
@@ -3465,7 +3440,11 @@ gtk_sheet_click_cell (GtkSheet *sheet, gint row, gint column)
   sheet->range.coli = column;
   sheet->state = GTK_SHEET_NORMAL;
   GTK_SHEET_SET_FLAGS (sheet, GTK_SHEET_IN_SELECTION);
+
   gtk_sheet_draw_active_cell (sheet);
+
+  gtk_widget_grab_focus (GTK_WIDGET (sheet->entry_widget));
+
   return TRUE;
 }
 
@@ -4191,6 +4170,7 @@ step_sheet (GtkSheet *sheet, GtkScrollType dir)
 
   change_active_cell (sheet, new_cell.row, new_cell.col);
 
+
   if ( new_cell.col > max_fully_visible_column (sheet))
     {
       glong hpos  =
@@ -4231,6 +4211,8 @@ step_sheet (GtkSheet *sheet, GtkScrollType dir)
       gtk_adjustment_set_value (sheet->vadjustment,
                                vpos);
     }
+
+  gtk_widget_grab_focus (GTK_WIDGET (sheet->entry_widget));
 }
 
 
@@ -4708,7 +4690,7 @@ draw_button (GtkSheet *sheet, GdkWindow *window,
 
       allocation.y += 2 * sheet->button->style->ythickness;
 
-      if (button->label && strlen (button->label)>0)
+      if (button->label && strlen (button->label) > 0)
        {
          PangoRectangle rect;
          gchar *line = button->label;