Remove extraneous code moving sheet adjustments on updates
[pspp-builds.git] / lib / gtksheet / gtksheet.c
index 313727d268c986a4a5c8ff9dcf5512f0a914c635..db91026f46cbdd9e8495e97bbbb859d806ede716 100644 (file)
@@ -53,7 +53,7 @@
 #include <gtk/gtkcontainer.h>
 #include <pango/pango.h>
 #include "gtksheet.h"
-#include "gtkextra-marshal.h"
+#include <gtksheet/psppire-marshal.h>
 #include "gsheetmodel.h"
 #include <libpspp/misc.h>
 #include <math.h>
@@ -86,6 +86,8 @@ enum
 #define DEFAULT_COLUMN_WIDTH 80
 #define DEFAULT_ROW_HEIGHT 25
 
+static void set_entry_widget_font (GtkSheet *sheet);
+
 static void gtk_sheet_update_primary_selection (GtkSheet *sheet);
 static void draw_column_title_buttons_range (GtkSheet *sheet, gint first, gint n);
 static void draw_row_title_buttons_range (GtkSheet *sheet, gint first, gint n);
@@ -152,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);
 }
 
 
@@ -198,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
@@ -392,6 +390,7 @@ static void gtk_sheet_map                    (GtkWidget *widget);
 static void gtk_sheet_unmap                     (GtkWidget *widget);
 static gint gtk_sheet_expose                    (GtkWidget *widget,
                                                  GdkEventExpose *event);
+
 static void gtk_sheet_forall                    (GtkContainer *container,
                                                  gboolean include_internals,
                                                  GtkCallback callback,
@@ -421,7 +420,7 @@ static void gtk_sheet_size_allocate                  (GtkWidget *widget,
 /* Sheet queries */
 
 static gboolean gtk_sheet_range_isvisible (const GtkSheet *sheet,
-                                          GtkSheetRange range);
+                                          const GtkSheetRange *range);
 static gboolean gtk_sheet_cell_isvisible  (GtkSheet *sheet,
                                           gint row, gint column);
 /* Drawing Routines */
@@ -455,11 +454,11 @@ static void gtk_sheet_draw_border                  (GtkSheet *sheet,
 
 static void gtk_sheet_entry_changed             (GtkWidget *widget,
                                                  gpointer data);
-static void gtk_sheet_hide_active_cell          (GtkSheet *sheet);
+static void gtk_sheet_hide_entry_widget                 (GtkSheet *sheet);
 static void change_active_cell          (GtkSheet *sheet,
                                          gint row, gint col);
 static void gtk_sheet_draw_active_cell          (GtkSheet *sheet);
-static void gtk_sheet_show_active_cell          (GtkSheet *sheet);
+static void gtk_sheet_show_entry_widget                 (GtkSheet *sheet);
 static gboolean gtk_sheet_click_cell            (GtkSheet *sheet,
                                                  gint row,
                                                  gint column);
@@ -836,7 +835,7 @@ gtk_sheet_class_init (GtkSheetClass *klass)
                  G_SIGNAL_RUN_LAST,
                  0,
                  NULL, NULL,
-                 gtkextra_VOID__INT_POINTER,
+                 psppire_marshal_VOID__INT_POINTER,
                  G_TYPE_NONE,
                  2,
                  G_TYPE_INT,
@@ -857,7 +856,7 @@ gtk_sheet_class_init (GtkSheetClass *klass)
                  G_SIGNAL_RUN_LAST,
                  0,
                  NULL, NULL,
-                 gtkextra_VOID__INT_POINTER,
+                 psppire_marshal_VOID__INT_POINTER,
                  G_TYPE_NONE,
                  2,
                  G_TYPE_INT,
@@ -883,7 +882,7 @@ gtk_sheet_class_init (GtkSheetClass *klass)
                  G_SIGNAL_RUN_LAST,
                  offsetof (GtkSheetClass, resize_range),
                  NULL, NULL,
-                 gtkextra_VOID__BOXED_BOXED,
+                 psppire_marshal_VOID__BOXED_BOXED,
                  G_TYPE_NONE,
                  2,
                  GTK_TYPE_SHEET_RANGE, GTK_TYPE_SHEET_RANGE
@@ -895,7 +894,7 @@ gtk_sheet_class_init (GtkSheetClass *klass)
                  G_SIGNAL_RUN_LAST,
                  offsetof (GtkSheetClass, move_range),
                  NULL, NULL,
-                 gtkextra_VOID__BOXED_BOXED,
+                 psppire_marshal_VOID__BOXED_BOXED,
                  G_TYPE_NONE,
                  2,
                  GTK_TYPE_SHEET_RANGE, GTK_TYPE_SHEET_RANGE
@@ -907,7 +906,7 @@ gtk_sheet_class_init (GtkSheetClass *klass)
                  G_SIGNAL_RUN_LAST,
                  offsetof (GtkSheetClass, traverse),
                  NULL, NULL,
-                 gtkextra_BOOLEAN__BOXED_POINTER,
+                 psppire_marshal_BOOLEAN__BOXED_POINTER,
                  G_TYPE_BOOLEAN, 2,
                  GTK_TYPE_SHEET_CELL,
                  G_TYPE_POINTER);
@@ -919,7 +918,7 @@ gtk_sheet_class_init (GtkSheetClass *klass)
                  G_SIGNAL_RUN_LAST,
                  offsetof (GtkSheetClass, activate),
                  NULL, NULL,
-                 gtkextra_VOID__INT_INT_INT_INT,
+                 psppire_marshal_VOID__INT_INT_INT_INT,
                  G_TYPE_NONE, 4,
                  G_TYPE_INT, G_TYPE_INT,
                  G_TYPE_INT, G_TYPE_INT);
@@ -930,7 +929,7 @@ gtk_sheet_class_init (GtkSheetClass *klass)
                  G_SIGNAL_RUN_LAST,
                  offsetof (GtkSheetClass, set_scroll_adjustments),
                  NULL, NULL,
-                 gtkextra_VOID__OBJECT_OBJECT,
+                 psppire_marshal_VOID__OBJECT_OBJECT,
                  G_TYPE_NONE, 2, GTK_TYPE_ADJUSTMENT, GTK_TYPE_ADJUSTMENT);
 
 
@@ -1162,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);
@@ -1268,7 +1260,7 @@ gtk_sheet_change_entry (GtkSheet *sheet, GtkType entry_type)
   state = sheet->state;
 
   if (sheet->state == GTK_SHEET_NORMAL)
-    gtk_sheet_hide_active_cell (sheet);
+    gtk_sheet_hide_entry_widget (sheet);
 
   sheet->entry_type = entry_type;
 
@@ -1276,7 +1268,7 @@ gtk_sheet_change_entry (GtkSheet *sheet, GtkType entry_type)
 
   if (state == GTK_SHEET_NORMAL)
     {
-      gtk_sheet_show_active_cell (sheet);
+      gtk_sheet_show_entry_widget (sheet);
     }
 
 }
@@ -1537,32 +1529,32 @@ gtk_sheet_select_column (GtkSheet *sheet, gint column)
 
 static gboolean
 gtk_sheet_range_isvisible (const GtkSheet *sheet,
-                          GtkSheetRange range)
+                          const GtkSheetRange *range)
 {
   g_return_val_if_fail (sheet != NULL, FALSE);
 
-  if (range.row0 < 0 || range.row0 >= psppire_axis_unit_count (sheet->vaxis))
+  if (range->row0 < 0 || range->row0 >= psppire_axis_unit_count (sheet->vaxis))
     return FALSE;
 
-  if (range.rowi < 0 || range.rowi >= psppire_axis_unit_count (sheet->vaxis))
+  if (range->rowi < 0 || range->rowi >= psppire_axis_unit_count (sheet->vaxis))
     return FALSE;
 
-  if (range.col0 < 0 || range.col0 >= psppire_axis_unit_count (sheet->haxis))
+  if (range->col0 < 0 || range->col0 >= psppire_axis_unit_count (sheet->haxis))
     return FALSE;
 
-  if (range.coli < 0 || range.coli >= psppire_axis_unit_count (sheet->haxis))
+  if (range->coli < 0 || range->coli >= psppire_axis_unit_count (sheet->haxis))
     return FALSE;
 
-  if (range.rowi < min_visible_row (sheet))
+  if (range->rowi < min_visible_row (sheet))
     return FALSE;
 
-  if (range.row0 > max_visible_row (sheet))
+  if (range->row0 > max_visible_row (sheet))
     return FALSE;
 
-  if (range.coli < min_visible_column (sheet))
+  if (range->coli < min_visible_column (sheet))
     return FALSE;
 
-  if (range.col0 > max_visible_column (sheet))
+  if (range->col0 > max_visible_column (sheet))
     return FALSE;
 
   return TRUE;
@@ -1579,7 +1571,7 @@ gtk_sheet_cell_isvisible (GtkSheet *sheet,
   range.rowi = row;
   range.coli = column;
 
-  return gtk_sheet_range_isvisible (sheet, range);
+  return gtk_sheet_range_isvisible (sheet, &range);
 }
 
 void
@@ -1707,8 +1699,11 @@ gtk_sheet_style_set (GtkWidget *widget,
       gtk_style_set_background (widget->style, widget->window, widget->state);
     }
 
+  set_entry_widget_font (sheet);
 }
 
+#define BORDER_WIDTH 2
+
 static void
 gtk_sheet_realize (GtkWidget *widget)
 {
@@ -1717,7 +1712,7 @@ gtk_sheet_realize (GtkWidget *widget)
   const gint attributes_mask =
     GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP | GDK_WA_CURSOR;
 
-  GdkGCValues values, auxvalues;
+  GdkGCValues values;
   GdkColormap *colormap;
   GdkDisplay *display;
 
@@ -1814,12 +1809,10 @@ gtk_sheet_realize (GtkWidget *widget)
   sheet->fg_gc = gdk_gc_new (widget->window);
   sheet->bg_gc = gdk_gc_new (widget->window);
 
-  gdk_gc_get_values (sheet->fg_gc, &auxvalues);
-
   values.foreground = widget->style->white;
   values.function = GDK_INVERT;
   values.subwindow_mode = GDK_INCLUDE_INFERIORS;
-  values.line_width = 3;
+  values.line_width = BORDER_WIDTH;
 
   sheet->xor_gc = gdk_gc_new_with_values (widget->window,
                                          &values,
@@ -2009,6 +2002,7 @@ gtk_sheet_cell_draw (GtkSheet *sheet, gint row, gint col)
 {
   PangoLayout *layout;
   PangoRectangle text;
+  PangoFontDescription *font_desc = GTK_WIDGET (sheet)->style->font_desc;
   gint font_height;
 
   gchar *label;
@@ -2050,8 +2044,6 @@ gtk_sheet_cell_draw (GtkSheet *sheet, gint row, gint col)
                          area.width, area.height);
     }
 
-  //  gtk_sheet_cell_draw_label (sheet, row, col);
-
 
   label = gtk_sheet_cell_get_text (sheet, row, col);
   if (NULL == label)
@@ -2060,15 +2052,16 @@ gtk_sheet_cell_draw (GtkSheet *sheet, gint row, gint col)
 
   layout = gtk_widget_create_pango_layout (GTK_WIDGET (sheet), label);
   dispose_string (sheet, label);
-  pango_layout_set_font_description (layout, attributes.font_desc);
 
 
+  pango_layout_set_font_description (layout, font_desc);
+
   pango_layout_get_pixel_extents (layout, NULL, &text);
 
   gdk_gc_set_clip_rectangle (sheet->fg_gc, &area);
 
-  font_height = pango_font_description_get_size (attributes.font_desc);
-  if ( !pango_font_description_get_size_is_absolute (attributes.font_desc))
+  font_height = pango_font_description_get_size (font_desc);
+  if ( !pango_font_description_get_size_is_absolute (font_desc))
     font_height /= PANGO_SCALE;
 
   /* Centre the text vertically */
@@ -2134,16 +2127,13 @@ gtk_sheet_range_draw (GtkSheet *sheet, const GtkSheetRange *range)
       drawing_range.rowi = MIN (range->rowi, max_visible_row (sheet));
       drawing_range.coli = MIN (range->coli, max_visible_column (sheet));
 
-
       rectangle_from_range (sheet, &drawing_range, &area);
     }
 
+  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++)
@@ -2152,7 +2142,7 @@ gtk_sheet_range_draw (GtkSheet *sheet, const GtkSheetRange *range)
       }
 
   if (sheet->state != GTK_SHEET_NORMAL &&
-      gtk_sheet_range_isvisible (sheet, sheet->range))
+      gtk_sheet_range_isvisible (sheet, &sheet->range))
     gtk_sheet_range_draw_selection (sheet, drawing_range);
 
   if (sheet->state == GTK_STATE_NORMAL &&
@@ -2160,7 +2150,9 @@ gtk_sheet_range_draw (GtkSheet *sheet, const GtkSheetRange *range)
       sheet->active_cell.row <= drawing_range.rowi &&
       sheet->active_cell.col >= drawing_range.col0 &&
       sheet->active_cell.col <= drawing_range.coli)
-    gtk_sheet_show_active_cell (sheet);
+    gtk_sheet_show_entry_widget (sheet);
+
+  gdk_window_end_paint (sheet->sheet_window);
 }
 
 static void
@@ -2174,7 +2166,7 @@ gtk_sheet_range_draw_selection (GtkSheet *sheet, GtkSheetRange range)
       range.row0 > sheet->range.rowi || range.rowi < sheet->range.row0)
     return;
 
-  if (!gtk_sheet_range_isvisible (sheet, range)) return;
+  if (!gtk_sheet_range_isvisible (sheet, &range)) return;
   if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return;
 
   aux = range;
@@ -2467,7 +2459,7 @@ gtk_sheet_set_active_cell (GtkSheet *sheet, gint row, gint col)
 
   if ( row == -1 || col == -1)
     {
-      gtk_sheet_hide_active_cell (sheet);
+      gtk_sheet_hide_entry_widget (sheet);
       return;
     }
 
@@ -2524,10 +2516,8 @@ gtk_sheet_entry_changed (GtkWidget *widget, gpointer data)
 
 
 static void
-gtk_sheet_hide_active_cell (GtkSheet *sheet)
+gtk_sheet_hide_entry_widget (GtkSheet *sheet)
 {
-  GdkRectangle area;
-
   if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet)))
     return;
 
@@ -2537,19 +2527,6 @@ gtk_sheet_hide_active_cell (GtkSheet *sheet)
   gtk_widget_hide (sheet->entry_widget);
   gtk_widget_unmap (sheet->entry_widget);
 
-  rectangle_from_cell (sheet,
-                      sheet->active_cell.row, sheet->active_cell.col,
-                      &area);
-
-  gdk_draw_rectangle (sheet->sheet_window,
-                     GTK_WIDGET (sheet)->style->white_gc,
-                     TRUE,
-                     area.x, area.y,
-                     area.width, area.height);
-
-  gtk_sheet_cell_draw (sheet, sheet->active_cell.row,
-                              sheet->active_cell.col);
-
   GTK_WIDGET_UNSET_FLAGS (GTK_WIDGET (sheet->entry_widget), GTK_VISIBLE);
 }
 
@@ -2574,11 +2551,30 @@ change_active_cell (GtkSheet *sheet, gint row, gint col)
       gtk_sheet_real_unselect_range (sheet, NULL);
     }
 
+
   g_signal_handler_block   (sheet->entry_widget, sheet->entry_handler_id);
 
   old_row = sheet->active_cell.row;
   old_col = sheet->active_cell.col;
 
+  {
+    /* Redraw the neighbourhood of the old active cell */
+    GtkSheetRange r;
+    r.col0 = old_col - 1;
+    r.coli = old_col + 1;
+    r.row0 = old_row - 1;
+    r.rowi = old_row + 1;
+
+    maximize_int (&r.row0, 0);
+    maximize_int (&r.col0, 0);
+    minimize_int (&r.rowi, psppire_axis_unit_count (sheet->vaxis) - 1);
+    minimize_int (&r.coli, psppire_axis_unit_count (sheet->haxis) - 1);
+
+
+    if (  gtk_sheet_range_isvisible (sheet, &r))
+      gtk_sheet_range_draw (sheet, &r);
+  }
+
   sheet->range.row0 = row;
   sheet->range.col0 = col;
   sheet->range.rowi = row;
@@ -2590,7 +2586,8 @@ change_active_cell (GtkSheet *sheet, gint row, gint col)
 
   GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_SELECTION);
 
-  gtk_sheet_show_active_cell (sheet);
+  gtk_sheet_draw_active_cell (sheet);
+  gtk_sheet_show_entry_widget (sheet);
 
 
   g_signal_emit (sheet, sheet_signals [ACTIVATE], 0,
@@ -2601,7 +2598,7 @@ change_active_cell (GtkSheet *sheet, gint row, gint col)
 }
 
 static void
-gtk_sheet_show_active_cell (GtkSheet *sheet)
+gtk_sheet_show_entry_widget (GtkSheet *sheet)
 {
   GtkEntry *sheet_entry;
   GtkSheetCellAttr attributes;
@@ -2633,14 +2630,11 @@ gtk_sheet_show_active_cell (GtkSheet *sheet)
   if ( ! text )
     text = g_strdup ("");
 
-  gtk_entry_set_visibility (GTK_ENTRY (sheet_entry), attributes.is_visible);
-
-
   if ( GTK_IS_ENTRY (sheet_entry))
     {
       const gchar *old_text = gtk_entry_get_text (GTK_ENTRY (sheet_entry));
       if (strcmp (old_text, text) != 0)
-       gtk_entry_set_text (GTK_ENTRY (sheet_entry), text);
+       gtk_entry_set_text (sheet_entry, text);
 
       switch (attributes.justification)
        {
@@ -2659,6 +2653,9 @@ gtk_sheet_show_active_cell (GtkSheet *sheet)
 
   gtk_sheet_size_allocate_entry (sheet);
 
+  gtk_widget_set_sensitive (GTK_WIDGET (sheet_entry),
+                           g_sheet_model_is_editable (sheet->model,
+                                                      row, col));
   gtk_widget_map (sheet->entry_widget);
 
   gtk_widget_grab_focus (GTK_WIDGET (sheet_entry));
@@ -2933,6 +2930,8 @@ gtk_sheet_new_selection (GtkSheet *sheet, GtkSheetRange *range)
   *range = new_range;
 }
 
+
+
 static void
 gtk_sheet_draw_border (GtkSheet *sheet, GtkSheetRange new_range)
 {
@@ -2943,10 +2942,10 @@ gtk_sheet_draw_border (GtkSheet *sheet, GtkSheetRange new_range)
   gdk_draw_rectangle (sheet->sheet_window,
                      sheet->xor_gc,
                      FALSE,
-                     area.x + 1,
-                     area.y + 1,
-                     area.width - 2,
-                     area.height - 2);
+                     area.x,
+                     area.y,
+                     area.width + 1,
+                     area.height + 1);
 }
 
 
@@ -3050,11 +3049,6 @@ gtk_sheet_real_unselect_range (GtkSheet *sheet,
   g_signal_emit (sheet, sheet_signals[SELECT_COLUMN], 0, -1);
   g_signal_emit (sheet, sheet_signals[SELECT_ROW], 0, -1);
 
-#if 0
-  if (gtk_sheet_range_isvisible (sheet, *range))
-    gtk_sheet_draw_backing_pixmap (sheet, *range);
-#endif
-
   sheet->range.row0 = -1;
   sheet->range.rowi = -1;
   sheet->range.col0 = -1;
@@ -3096,27 +3090,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;
+
+    maximize_int (&x, 0);
+    maximize_int (&y, 0);
 
-  range.rowi =
-    row_from_ypixel (sheet,
-                          event->area.y +
-                          event->area.height + sheet->vadjustment->value);
-  range.rowi++;
+    range.row0 = row_from_ypixel (sheet, y);
 
-  range.col0 =
-    column_from_xpixel (sheet,
-                       event->area.x + sheet->hadjustment->value);
-  range.col0--;
+    range.rowi = row_from_ypixel (sheet, y + event->area.height);
 
-  range.coli =
-    column_from_xpixel (sheet,
-                       event->area.x + event->area.width +
-                       sheet->hadjustment->value);
-  range.coli++;
+    range.col0 = column_from_xpixel (sheet, x);
+
+    range.coli = column_from_xpixel (sheet, x + event->area.width);
+  }
 
   if (event->window == sheet->sheet_window)
     {
@@ -3124,13 +3118,13 @@ gtk_sheet_expose (GtkWidget *widget,
 
       if (sheet->state != GTK_SHEET_NORMAL)
        {
-         if (gtk_sheet_range_isvisible (sheet, sheet->range))
+         if (gtk_sheet_range_isvisible (sheet, &sheet->range))
            gtk_sheet_range_draw (sheet, &sheet->range);
 
          if (GTK_SHEET_IN_RESIZE (sheet) || GTK_SHEET_IN_DRAG (sheet))
            gtk_sheet_range_draw (sheet, &sheet->drag_range);
 
-         if (gtk_sheet_range_isvisible (sheet, sheet->range))
+         if (gtk_sheet_range_isvisible (sheet, &sheet->range))
            gtk_sheet_range_draw_selection (sheet, sheet->range);
          if (GTK_SHEET_IN_RESIZE (sheet) || GTK_SHEET_IN_DRAG (sheet))
            draw_xor_rectangle (sheet, sheet->drag_range);
@@ -3143,9 +3137,6 @@ gtk_sheet_expose (GtkWidget *widget,
        }
     }
 
-  if (sheet->state != GTK_SHEET_NORMAL && GTK_SHEET_IN_SELECTION (sheet))
-    gtk_widget_grab_focus (GTK_WIDGET (sheet));
-
   (* GTK_WIDGET_CLASS (parent_class)->expose_event) (widget, event);
 
   return FALSE;
@@ -4342,14 +4333,6 @@ gtk_sheet_size_allocate (GtkWidget *widget,
                            allocation->width - 2 * border_width,
                            allocation->height - 2 * border_width);
 
-  /* use internal allocation structure for all the math
-   * because it's easier than always subtracting the container
-   * border width */
-  sheet->internal_allocation.x = 0;
-  sheet->internal_allocation.y = 0;
-  sheet->internal_allocation.width = allocation->width - 2 * border_width;
-  sheet->internal_allocation.height = allocation->height - 2 * border_width;
-
   sheet_allocation.x = 0;
   sheet_allocation.y = 0;
   sheet_allocation.width = allocation->width - 2 * border_width;
@@ -4519,7 +4502,6 @@ gtk_sheet_size_allocate_entry (GtkSheet *sheet)
   GtkSheetCellAttr attributes = { 0 };
   GtkEntry *sheet_entry;
 
-
   if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return;
   if (!GTK_WIDGET_MAPPED (GTK_WIDGET (sheet))) return;
 
@@ -4530,8 +4512,6 @@ gtk_sheet_size_allocate_entry (GtkSheet *sheet)
                                   &attributes) )
     return ;
 
-  gtk_widget_ensure_style (GTK_WIDGET (sheet_entry));
-
   if ( GTK_WIDGET_REALIZED (sheet->entry_widget) )
     {
       GtkStyle *style = GTK_WIDGET (sheet_entry)->style;
@@ -4542,21 +4522,37 @@ gtk_sheet_size_allocate_entry (GtkSheet *sheet)
       style->bg[GTK_STATE_ACTIVE] = attributes.background;
       style->fg[GTK_STATE_ACTIVE] = attributes.foreground;
       style->text[GTK_STATE_ACTIVE] = attributes.foreground;
-
-      pango_font_description_free (style->font_desc);
-      g_assert (attributes.font_desc);
-      style->font_desc = pango_font_description_copy (attributes.font_desc);
     }
 
   rectangle_from_cell (sheet, sheet->active_cell.row,
                       sheet->active_cell.col, &entry_alloc);
 
+  entry_alloc.width -= BORDER_WIDTH;
+  entry_alloc.height -= BORDER_WIDTH;
+  entry_alloc.x += BORDER_WIDTH / 2;
+  entry_alloc.y += BORDER_WIDTH / 2;
+
+
   gtk_widget_set_size_request (sheet->entry_widget, entry_alloc.width,
                               entry_alloc.height);
   gtk_widget_size_allocate (sheet->entry_widget, &entry_alloc);
 }
 
 
+/* Copy the sheet's font to the entry widget */
+static void
+set_entry_widget_font (GtkSheet *sheet)
+{
+  GtkRcStyle *style = gtk_widget_get_modifier_style (sheet->entry_widget);
+
+  pango_font_description_free (style->font_desc);
+  style->font_desc = pango_font_description_copy (GTK_WIDGET (sheet)->style->font_desc);
+
+  gtk_widget_modify_style (sheet->entry_widget, style);
+}
+
+
+
 static void
 create_sheet_entry (GtkSheet *sheet)
 {
@@ -4565,18 +4561,18 @@ create_sheet_entry (GtkSheet *sheet)
       gtk_widget_unparent (sheet->entry_widget);
     }
 
-  if (sheet->entry_type)
-    {
-      sheet->entry_widget = g_object_new (sheet->entry_type, NULL);
-      g_object_ref_sink (sheet->entry_widget);
-    }
-  else
-    {
-      sheet->entry_widget = gtk_entry_new ();
-    }
+  sheet->entry_widget = g_object_new (sheet->entry_type, NULL);
+  g_object_ref_sink (sheet->entry_widget);
 
   gtk_widget_size_request (sheet->entry_widget, NULL);
 
+  if ( GTK_IS_ENTRY (sheet->entry_widget))
+    {
+      g_object_set (sheet->entry_widget,
+                   "has-frame", FALSE,
+                   NULL);
+    }
+
   if (GTK_WIDGET_REALIZED (sheet))
     {
       gtk_widget_set_parent_window (sheet->entry_widget, sheet->sheet_window);
@@ -4594,6 +4590,8 @@ create_sheet_entry (GtkSheet *sheet)
                      G_CALLBACK (gtk_sheet_entry_changed),
                      sheet);
 
+  set_entry_widget_font (sheet);
+
   gtk_widget_show (sheet->entry_widget);
 }
 
@@ -4752,7 +4750,7 @@ draw_button (GtkSheet *sheet, GdkWindow *window,
 static void
 draw_column_title_buttons_range (GtkSheet *sheet, gint first, gint last)
 {
-  GdkRegion *region;
+  GdkRectangle rect;
   gint col;
   if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return;
 
@@ -4761,10 +4759,18 @@ draw_column_title_buttons_range (GtkSheet *sheet, gint first, gint last)
   g_return_if_fail (first >= min_visible_column (sheet));
   g_return_if_fail (last <= max_visible_column (sheet));
 
-  region =
-    gdk_drawable_get_visible_region (GDK_DRAWABLE (sheet->column_title_window));
+  rect.y = 0;
+  rect.height = sheet->column_title_area.height;
+  rect.x = psppire_axis_pixel_start (sheet->haxis, first) + CELL_SPACING;
+  rect.width = psppire_axis_pixel_start (sheet->haxis, last) + CELL_SPACING
+    + psppire_axis_unit_size (sheet->haxis, last);
+
+  rect.x -= sheet->hadjustment->value;
 
-  gdk_window_begin_paint_region (sheet->column_title_window, region);
+  minimize_int (&rect.width, sheet->column_title_area.width);
+  maximize_int (&rect.x, 0);
+
+  gdk_window_begin_paint_rect (sheet->column_title_window, &rect);
 
   for (col = first ; col <= last ; ++col)
     {
@@ -4793,7 +4799,7 @@ draw_column_title_buttons_range (GtkSheet *sheet, gint first, gint last)
 static void
 draw_row_title_buttons_range (GtkSheet *sheet, gint first, gint last)
 {
-  GdkRegion *region;
+  GdkRectangle rect;
   gint row;
   if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return;
 
@@ -4802,13 +4808,18 @@ draw_row_title_buttons_range (GtkSheet *sheet, gint first, gint last)
   g_return_if_fail (first >= min_visible_row (sheet));
   g_return_if_fail (last <= max_visible_row (sheet));
 
+  rect.x = 0;
+  rect.width = sheet->row_title_area.width;
+  rect.y = psppire_axis_pixel_start (sheet->vaxis, first) + CELL_SPACING;
+  rect.height = psppire_axis_pixel_start (sheet->vaxis, last) + CELL_SPACING
+    + psppire_axis_unit_size (sheet->vaxis, last);
 
-  region =
-    gdk_drawable_get_visible_region (GDK_DRAWABLE (sheet->row_title_window));
-
-  gdk_window_begin_paint_region (sheet->row_title_window, region);
+  rect.y -= sheet->vadjustment->value;
 
+  minimize_int (&rect.height, sheet->row_title_area.height);
+  maximize_int (&rect.y, 0);
 
+  gdk_window_begin_paint_rect (sheet->row_title_window, &rect);
   for (row = first; row <= last; ++row)
     {
       GdkRectangle allocation;
@@ -4928,6 +4939,7 @@ vadjustment_value_changed (GtkAdjustment *adjustment,
   gtk_sheet_range_draw (sheet, NULL);
   draw_row_title_buttons (sheet);
   //  size_allocate_global_button (sheet);
+  gtk_sheet_draw_active_cell (sheet);
 
   gdk_window_end_paint (sheet->sheet_window);
 }
@@ -4956,6 +4968,8 @@ hadjustment_value_changed (GtkAdjustment *adjustment,
   draw_column_title_buttons (sheet);
   //  size_allocate_global_button (sheet);
 
+  gtk_sheet_draw_active_cell (sheet);
+
   gdk_window_end_paint (sheet->sheet_window);
 }
 
@@ -5187,7 +5201,6 @@ gtk_sheet_get_attributes (const GtkSheet *sheet, gint row, gint col,
 {
   GdkColor *fg, *bg;
   const GtkJustification *j ;
-  const PangoFontDescription *font_desc ;
   const GtkSheetCellBorder *border ;
   GdkColormap *colormap;
 
@@ -5196,7 +5209,6 @@ gtk_sheet_get_attributes (const GtkSheet *sheet, gint row, gint col,
 
   if (row < 0 || col < 0) return FALSE;
 
-
   attr->foreground = GTK_WIDGET (sheet)->style->black;
   attr->background = sheet->color[BG_COLOR];
 
@@ -5206,11 +5218,8 @@ gtk_sheet_get_attributes (const GtkSheet *sheet, gint row, gint col,
   attr->border.join_style = GDK_JOIN_MITER;
   attr->border.mask = 0;
   attr->border.color = GTK_WIDGET (sheet)->style->black;
-  attr->font_desc = GTK_WIDGET (sheet)->style->font_desc;
 
   attr->is_editable = g_sheet_model_is_editable (sheet->model, row, col);
-  attr->is_visible = g_sheet_model_is_visible (sheet->model, row, col);
-
 
   colormap = gtk_widget_get_colormap (GTK_WIDGET (sheet));
   fg = g_sheet_model_get_foreground (sheet->model, row, col);
@@ -5234,9 +5243,6 @@ gtk_sheet_get_attributes (const GtkSheet *sheet, gint row, gint col,
   if (j)
     attr->justification = *j;
 
-  font_desc = g_sheet_model_get_font_desc (sheet->model, row, col);
-  if ( font_desc ) attr->font_desc = font_desc;
-
   border = g_sheet_model_get_cell_border (sheet->model, row, col);
 
   if ( border ) attr->border = *border;
@@ -5371,7 +5377,7 @@ range_to_text (const GtkSheet *sheet)
   gint r, c;
   GString *string;
 
-  if ( !gtk_sheet_range_isvisible (sheet, sheet->range))
+  if ( !gtk_sheet_range_isvisible (sheet, &sheet->range))
     return NULL;
 
   string = g_string_sized_new (80);
@@ -5397,7 +5403,7 @@ range_to_html (const GtkSheet *sheet)
   gint r, c;
   GString *string;
 
-  if ( !gtk_sheet_range_isvisible (sheet, sheet->range))
+  if ( !gtk_sheet_range_isvisible (sheet, &sheet->range))
     return NULL;
 
   string = g_string_sized_new (480);
@@ -5488,7 +5494,7 @@ gtk_sheet_update_primary_selection (GtkSheet *sheet)
   clipboard = gtk_widget_get_clipboard (GTK_WIDGET (sheet),
                                        GDK_SELECTION_PRIMARY);
 
-  if (gtk_sheet_range_isvisible (sheet, sheet->range))
+  if (gtk_sheet_range_isvisible (sheet, &sheet->range))
     {
       if (!gtk_clipboard_set_with_owner (clipboard, targets,
                                         G_N_ELEMENTS (targets),