Fix some warnings
[pspp-builds.git] / lib / gtksheet / gtksheet.c
index 5641776df30c3e8cb6a83ee38677affdc6f48e51..609a81f500231e3a6f1997e035815b8e8f28d014 100644 (file)
@@ -93,9 +93,9 @@ 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);
 
 
-static void gtk_sheet_set_row_height (GtkSheet *sheet,
-                                     gint row,
-                                     guint height);
+static void set_row_height (GtkSheet *sheet,
+                           gint row,
+                           gint height);
 
 static void destroy_hover_window (GtkSheetHoverTitle *);
 static GtkSheetHoverTitle *create_hover_window (void);
@@ -122,13 +122,13 @@ dispose_string (const GtkSheet *sheet, gchar *text)
 static inline gint
 column_from_xpixel (const GtkSheet *sheet, gint pixel)
 {
-  return psppire_axis_get_unit_at_pixel (sheet->haxis, pixel);
+  return psppire_axis_unit_at_pixel (sheet->haxis, pixel);
 }
 
 static inline gint
 row_from_ypixel (const GtkSheet *sheet, gint pixel)
 {
-  return psppire_axis_get_unit_at_pixel (sheet->vaxis, pixel);
+  return psppire_axis_unit_at_pixel (sheet->vaxis, pixel);
 }
 
 
@@ -145,7 +145,7 @@ min_fully_visible_row (const GtkSheet *sheet)
 {
   glong row = min_visible_row (sheet);
 
-  if ( psppire_axis_pixel_start (sheet->vaxis, row) < sheet->vadjustment->value)
+  if ( psppire_axis_start_pixel (sheet->vaxis, row) < sheet->vadjustment->value)
     row++;
 
   return row;
@@ -163,7 +163,7 @@ max_fully_visible_row (const GtkSheet *sheet)
 {
   glong row = max_visible_row (sheet);
 
-  if ( psppire_axis_pixel_start (sheet->vaxis, row)
+  if ( psppire_axis_start_pixel (sheet->vaxis, row)
        +
        psppire_axis_unit_size (sheet->vaxis, row)
        > sheet->vadjustment->value)
@@ -186,7 +186,7 @@ min_fully_visible_column (const GtkSheet *sheet)
 {
   glong col = min_visible_column (sheet);
 
-  if ( psppire_axis_pixel_start (sheet->haxis, col) < sheet->hadjustment->value)
+  if ( psppire_axis_start_pixel (sheet->haxis, col) < sheet->hadjustment->value)
     col++;
 
   return col;
@@ -206,8 +206,8 @@ max_fully_visible_column (const GtkSheet *sheet)
 {
   glong col = max_visible_column (sheet);
 
-  if ( psppire_axis_pixel_start (sheet->haxis, col)
-       + 
+  if ( psppire_axis_start_pixel (sheet->haxis, col)
+       +
        psppire_axis_unit_size (sheet->haxis, col)
        > sheet->hadjustment->value)
     col--;
@@ -245,6 +245,31 @@ on_column_boundary (const GtkSheet *sheet, gint x, gint *column)
   return FALSE;
 }
 
+static gboolean
+on_row_boundary (const GtkSheet *sheet, gint y, gint *row)
+{
+  gint r;
+
+  y += sheet->vadjustment->value;
+
+  r = row_from_ypixel (sheet, y);
+
+  if ( row_from_ypixel (sheet, y - DRAG_WIDTH / 2) < r )
+    {
+      *row = r - 1;
+      return TRUE;
+    }
+
+  if  ( row_from_ypixel (sheet, y + DRAG_WIDTH / 2) > r )
+    {
+      *row = r;
+      return TRUE;
+    }
+
+  return FALSE;
+}
+
+
 static inline gboolean
 POSSIBLE_DRAG (const GtkSheet *sheet, gint x, gint y,
               gint *drag_row, gint *drag_column)
@@ -259,17 +284,17 @@ POSSIBLE_DRAG (const GtkSheet *sheet, gint x, gint y,
   *drag_column = column_from_xpixel (sheet, x);
   *drag_row = row_from_ypixel (sheet, y);
 
-  if (x >= psppire_axis_pixel_start (sheet->haxis, sheet->range.col0) - DRAG_WIDTH / 2 &&
-      x <= psppire_axis_pixel_start (sheet->haxis, sheet->range.coli) +
+  if (x >= psppire_axis_start_pixel (sheet->haxis, sheet->range.col0) - DRAG_WIDTH / 2 &&
+      x <= psppire_axis_start_pixel (sheet->haxis, sheet->range.coli) +
       psppire_axis_unit_size (sheet->haxis, sheet->range.coli) + DRAG_WIDTH / 2)
     {
-      ydrag = psppire_axis_pixel_start (sheet->vaxis, sheet->range.row0);
+      ydrag = psppire_axis_start_pixel (sheet->vaxis, sheet->range.row0);
       if (y >= ydrag - DRAG_WIDTH / 2 && y <= ydrag + DRAG_WIDTH / 2)
        {
          *drag_row = sheet->range.row0;
          return TRUE;
        }
-      ydrag = psppire_axis_pixel_start (sheet->vaxis, sheet->range.rowi) +
+      ydrag = psppire_axis_start_pixel (sheet->vaxis, sheet->range.rowi) +
        psppire_axis_unit_size (sheet->vaxis, sheet->range.rowi);
       if (y >= ydrag - DRAG_WIDTH / 2 && y <= ydrag + DRAG_WIDTH / 2)
        {
@@ -278,17 +303,17 @@ POSSIBLE_DRAG (const GtkSheet *sheet, gint x, gint y,
        }
     }
 
-  if (y >= psppire_axis_pixel_start (sheet->vaxis, sheet->range.row0) - DRAG_WIDTH / 2 &&
-      y <= psppire_axis_pixel_start (sheet->vaxis, sheet->range.rowi) +
+  if (y >= psppire_axis_start_pixel (sheet->vaxis, sheet->range.row0) - DRAG_WIDTH / 2 &&
+      y <= psppire_axis_start_pixel (sheet->vaxis, sheet->range.rowi) +
       psppire_axis_unit_size (sheet->vaxis, sheet->range.rowi) + DRAG_WIDTH / 2)
     {
-      xdrag = psppire_axis_pixel_start (sheet->haxis, sheet->range.col0);
+      xdrag = psppire_axis_start_pixel (sheet->haxis, sheet->range.col0);
       if (x >= xdrag - DRAG_WIDTH / 2 && x <= xdrag + DRAG_WIDTH / 2)
        {
          *drag_column = sheet->range.col0;
          return TRUE;
        }
-      xdrag = psppire_axis_pixel_start (sheet->haxis, sheet->range.coli) +
+      xdrag = psppire_axis_start_pixel (sheet->haxis, sheet->range.coli) +
        psppire_axis_unit_size (sheet->haxis, sheet->range.coli);
       if (x >= xdrag - DRAG_WIDTH / 2 && x <= xdrag + DRAG_WIDTH / 2)
        {
@@ -311,17 +336,17 @@ POSSIBLE_RESIZE (const GtkSheet *sheet, gint x, gint y,
        sheet->range.col0 < 0 || sheet->range.coli < 0 )
     return FALSE;
 
-  xdrag = psppire_axis_pixel_start (sheet->haxis, sheet->range.coli)+
+  xdrag = psppire_axis_start_pixel (sheet->haxis, sheet->range.coli)+
     psppire_axis_unit_size (sheet->haxis, sheet->range.coli);
 
-  ydrag = psppire_axis_pixel_start (sheet->vaxis, sheet->range.rowi) +
+  ydrag = psppire_axis_start_pixel (sheet->vaxis, sheet->range.rowi) +
     psppire_axis_unit_size (sheet->vaxis, sheet->range.rowi);
 
   if (sheet->state == GTK_SHEET_COLUMN_SELECTED)
-    ydrag = psppire_axis_pixel_start (sheet->vaxis, min_visible_row (sheet));
+    ydrag = psppire_axis_start_pixel (sheet->vaxis, min_visible_row (sheet));
 
   if (sheet->state == GTK_SHEET_ROW_SELECTED)
-    xdrag = psppire_axis_pixel_start (sheet->haxis, min_visible_column (sheet));
+    xdrag = psppire_axis_start_pixel (sheet->haxis, min_visible_column (sheet));
 
   *drag_column = column_from_xpixel (sheet, x);
   *drag_row = row_from_ypixel (sheet, y);
@@ -339,25 +364,25 @@ rectangle_from_range (GtkSheet *sheet, const GtkSheetRange *range,
 {
   g_return_val_if_fail (range, FALSE);
 
-  r->x = psppire_axis_pixel_start (sheet->haxis, range->col0);
+  r->x = psppire_axis_start_pixel (sheet->haxis, range->col0);
   r->x -= round (sheet->hadjustment->value);
 
   if ( sheet->row_titles_visible)
     r->x += sheet->row_title_area.width;
 
 
-  r->y = psppire_axis_pixel_start (sheet->vaxis, range->row0);
+  r->y = psppire_axis_start_pixel (sheet->vaxis, range->row0);
   r->y -= round (sheet->vadjustment->value);
 
   if ( sheet->column_titles_visible)
     r->y += sheet->column_title_area.height;
 
-  r->width = psppire_axis_pixel_start (sheet->haxis, range->coli) -
-    psppire_axis_pixel_start (sheet->haxis, range->col0) +
+  r->width = psppire_axis_start_pixel (sheet->haxis, range->coli) -
+    psppire_axis_start_pixel (sheet->haxis, range->col0) +
     psppire_axis_unit_size (sheet->haxis, range->coli);
 
-  r->height = psppire_axis_pixel_start (sheet->vaxis, range->rowi) -
-    psppire_axis_pixel_start (sheet->vaxis, range->row0) +
+  r->height = psppire_axis_start_pixel (sheet->vaxis, range->rowi) -
+    psppire_axis_start_pixel (sheet->vaxis, range->row0) +
     psppire_axis_unit_size (sheet->vaxis, range->rowi);
 
   return TRUE;
@@ -429,9 +454,9 @@ static gboolean gtk_sheet_cell_isvisible  (GtkSheet *sheet,
 static void gtk_sheet_cell_draw (GtkSheet *sheet, gint row, gint column);
 
 
-/* draw visible part of range. If range == NULL then draw the whole screen */
-static void gtk_sheet_range_draw (GtkSheet *sheet,
-                                 const GtkSheetRange *range);
+/* draw visible part of range. */
+static void draw_sheet_region (GtkSheet *sheet, GdkRegion *region);
+
 
 /* highlight the visible part of the selected range */
 static void gtk_sheet_range_draw_selection      (GtkSheet *sheet,
@@ -457,7 +482,7 @@ static void gtk_sheet_entry_changed          (GtkWidget *widget,
 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 gboolean gtk_sheet_draw_active_cell              (GtkSheet *sheet);
 static void gtk_sheet_show_entry_widget                 (GtkSheet *sheet);
 static gboolean gtk_sheet_click_cell            (GtkSheet *sheet,
                                                  gint row,
@@ -478,12 +503,6 @@ static void draw_xor_hline                          (GtkSheet *sheet);
 static void draw_xor_rectangle                  (GtkSheet *sheet,
                                                  GtkSheetRange range);
 
-static guint new_column_width                   (GtkSheet *sheet,
-                                                 gint column,
-                                                 gint *x);
-static guint new_row_height                     (GtkSheet *sheet,
-                                                 gint row,
-                                                 gint *y);
 /* Sheet Button */
 
 static void create_global_button                (GtkSheet *sheet);
@@ -510,9 +529,6 @@ static void gtk_sheet_real_cell_clear                (GtkSheet *sheet,
                                                  gint column);
 
 
-static void gtk_sheet_column_size_request (GtkSheet *sheet,
-                                          gint col,
-                                          guint *requisition);
 static void gtk_sheet_row_size_request (GtkSheet *sheet,
                                        gint row,
                                        guint *requisition);
@@ -1045,7 +1061,6 @@ gtk_sheet_init (GtkSheet *sheet)
 
   sheet->sheet_window = NULL;
   sheet->entry_widget = NULL;
-  sheet->entry_handler_id = 0;
   sheet->button = NULL;
 
   sheet->hadjustment = NULL;
@@ -1062,9 +1077,6 @@ gtk_sheet_init (GtkSheet *sheet)
 
   sheet->motion_timer = 0;
 
-  sheet->columns_resizable = TRUE;
-  sheet->rows_resizable = TRUE;
-
   sheet->row_titles_visible = TRUE;
   sheet->row_title_area.width = DEFAULT_COLUMN_WIDTH;
 
@@ -1080,6 +1092,29 @@ gtk_sheet_init (GtkSheet *sheet)
 }
 
 
+/* Cause RANGE to be redrawn. If RANGE is null, then the
+   entire visible range will be redrawn.
+ */
+static void
+redraw_range (GtkSheet *sheet, GtkSheetRange *range)
+{
+  GdkRectangle rect;
+  if ( ! GTK_WIDGET_REALIZED (sheet))
+    return;
+
+  if ( NULL != range )
+    rectangle_from_range (sheet, range, &rect);
+  else
+    {
+      GdkRegion *r = gdk_drawable_get_visible_region (sheet->sheet_window);
+      gdk_region_get_clipbox (r, &rect);
+    }
+
+  gdk_window_invalidate_rect (sheet->sheet_window, &rect, FALSE);
+}
+
+
 /* Callback which occurs whenever columns are inserted / deleted in the model */
 static void
 columns_inserted_deleted_callback (GSheetModel *model, gint first_column,
@@ -1108,10 +1143,13 @@ columns_inserted_deleted_callback (GSheetModel *model, gint first_column,
   draw_column_title_buttons_range (sheet,
                                   first_column, max_visible_column (sheet));
 
-  gtk_sheet_range_draw (sheet, &range);
+
+  redraw_range (sheet, &range);
 }
 
 
+
+
 /* Callback which occurs whenever rows are inserted / deleted in the model */
 static void
 rows_inserted_deleted_callback (GSheetModel *model, gint first_row,
@@ -1138,7 +1176,7 @@ rows_inserted_deleted_callback (GSheetModel *model, gint first_row,
 
   draw_row_title_buttons_range (sheet, first_row, max_visible_row (sheet));
 
-  gtk_sheet_range_draw (sheet, &range);
+  redraw_range (sheet, &range);
 }
 
 /*
@@ -1163,7 +1201,7 @@ range_update_callback (GSheetModel *m, gint row0, gint col0,
 
   if ( ( row0 < 0 && col0 < 0 ) || ( rowi < 0 && coli < 0 ) )
     {
-      gtk_sheet_range_draw (sheet, NULL);
+      redraw_range (sheet, NULL);
       adjust_scrollbars (sheet);
 
       draw_row_title_buttons_range (sheet, min_visible_row (sheet),
@@ -1185,7 +1223,7 @@ range_update_callback (GSheetModel *m, gint row0, gint col0,
       range.coli = max_visible_column (sheet);
     }
 
-  gtk_sheet_range_draw (sheet, &range);
+  redraw_range (sheet, &range);
 }
 
 
@@ -1283,7 +1321,7 @@ gtk_sheet_show_grid (GtkSheet *sheet, gboolean show)
 
   sheet->show_grid = show;
 
-  gtk_sheet_range_draw (sheet, NULL);
+  redraw_range (sheet, NULL);
 }
 
 gboolean
@@ -1304,10 +1342,9 @@ gtk_sheet_get_columns_count (GtkSheet *sheet)
   return psppire_axis_unit_count (sheet->haxis);
 }
 
-static void
-gtk_sheet_set_column_width (GtkSheet *sheet,
-                           gint column,
-                           guint width);
+static void set_column_width (GtkSheet *sheet,
+                             gint column,
+                             gint width);
 
 
 void
@@ -1440,7 +1477,7 @@ gtk_sheet_moveto (GtkSheet *sheet,
 
   if (row >= 0)
   {
-    gint y =  psppire_axis_pixel_start (sheet->vaxis, row);
+    gint y =  psppire_axis_start_pixel (sheet->vaxis, row);
 
     gtk_adjustment_set_value (sheet->vadjustment, y - height * row_align);
   }
@@ -1448,33 +1485,13 @@ gtk_sheet_moveto (GtkSheet *sheet,
 
   if (col >= 0)
   {
-    gint x =  psppire_axis_pixel_start (sheet->haxis, col);
+    gint x =  psppire_axis_start_pixel (sheet->haxis, col);
 
     gtk_adjustment_set_value (sheet->hadjustment, x - width * col_align);
   }
 }
 
 
-static gboolean
-gtk_sheet_columns_resizable (GtkSheet *sheet)
-{
-  g_return_val_if_fail (sheet != NULL, FALSE);
-  g_return_val_if_fail (GTK_IS_SHEET (sheet), FALSE);
-
-  return sheet->columns_resizable;
-}
-
-
-static gboolean
-gtk_sheet_rows_resizable (GtkSheet *sheet)
-{
-  g_return_val_if_fail (sheet != NULL, FALSE);
-  g_return_val_if_fail (GTK_IS_SHEET (sheet), FALSE);
-
-  return sheet->rows_resizable;
-}
-
-
 void
 gtk_sheet_select_row (GtkSheet *sheet, gint row)
 {
@@ -1702,7 +1719,7 @@ gtk_sheet_style_set (GtkWidget *widget,
   set_entry_widget_font (sheet);
 }
 
-#define BORDER_WIDTH 2
+#define BORDER_WIDTH 3
 
 static void
 gtk_sheet_realize (GtkWidget *widget)
@@ -1964,7 +1981,7 @@ gtk_sheet_map (GtkWidget *widget)
            !GTK_WIDGET_MAPPED (GTK_BIN (sheet->button)->child))
          gtk_widget_map (GTK_BIN (sheet->button)->child);
 
-      gtk_sheet_range_draw (sheet, NULL);
+      redraw_range (sheet, NULL);
       change_active_cell (sheet,
                     sheet->active_cell.row,
                     sheet->active_cell.col);
@@ -2093,15 +2110,36 @@ gtk_sheet_cell_draw (GtkSheet *sheet, gint row, gint col)
 }
 
 
-
 static void
-gtk_sheet_range_draw (GtkSheet *sheet, const GtkSheetRange *range)
+draw_sheet_region (GtkSheet *sheet, GdkRegion *region)
 {
+  GtkSheetRange range;
+  GdkRectangle area;
+  gint y, x;
   gint i, j;
 
-  GdkRectangle area;
   GtkSheetRange drawing_range;
 
+  gdk_region_get_clipbox (region, &area);
+
+  y = area.y + sheet->vadjustment->value;
+  x = 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.row0 = row_from_ypixel (sheet, y);
+  range.rowi = row_from_ypixel (sheet, y + area.height);
+
+  range.col0 = column_from_xpixel (sheet, x);
+  range.coli = column_from_xpixel (sheet, x + area.width);
+
   g_return_if_fail (sheet != NULL);
   g_return_if_fail (GTK_SHEET (sheet));
 
@@ -2109,36 +2147,20 @@ gtk_sheet_range_draw (GtkSheet *sheet, const GtkSheetRange *range)
   if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return;
   if (!GTK_WIDGET_MAPPED (GTK_WIDGET (sheet))) return;
 
-  if (range == NULL)
-    {
-      drawing_range.row0 = min_visible_row (sheet);
-      drawing_range.col0 = min_visible_column (sheet);
-      drawing_range.rowi = MIN (max_visible_row (sheet),
-                               psppire_axis_unit_count (sheet->vaxis) - 1);
-      drawing_range.coli = max_visible_column (sheet);
-      gdk_drawable_get_size (sheet->sheet_window, &area.width, &area.height);
-      area.x = area.y = 0;
-    }
-  else
-    {
-      drawing_range.row0 = MAX (range->row0, min_visible_row (sheet));
-      drawing_range.col0 = MAX (range->col0, min_visible_column (sheet));
-      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);
-    }
+  drawing_range.row0 = MAX (range.row0, min_visible_row (sheet));
+  drawing_range.col0 = MAX (range.col0, min_visible_column (sheet));
+  drawing_range.rowi = MIN (range.rowi, max_visible_row (sheet));
+  drawing_range.coli = MIN (range.coli, max_visible_column (sheet));
 
   g_return_if_fail (drawing_range.rowi >= drawing_range.row0);
   g_return_if_fail (drawing_range.coli >= drawing_range.col0);
 
-  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++)
-      {
+    {
+      for (j = drawing_range.col0; j <= drawing_range.coli; j++)
        gtk_sheet_cell_draw (sheet, i, j);
-      }
+    }
 
   if (sheet->state != GTK_SHEET_NORMAL &&
       gtk_sheet_range_isvisible (sheet, &sheet->range))
@@ -2150,10 +2172,9 @@ 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
 gtk_sheet_range_draw_selection (GtkSheet *sheet, GtkSheetRange range)
 {
@@ -2274,7 +2295,7 @@ gtk_sheet_cell_clear (GtkSheet *sheet, gint row, gint column)
 
   gtk_sheet_real_cell_clear (sheet, row, column);
 
-  gtk_sheet_range_draw (sheet, &range);
+  redraw_range (sheet, &range);
 }
 
 static void
@@ -2424,8 +2445,8 @@ gtk_sheet_get_cell_area (GtkSheet *sheet,
   if (row >= psppire_axis_unit_count (sheet->vaxis) || column >= psppire_axis_unit_count (sheet->haxis))
     return FALSE;
 
-  area->x = (column == -1) ? 0 : psppire_axis_pixel_start (sheet->haxis, column);
-  area->y = (row == -1)    ? 0 : psppire_axis_pixel_start (sheet->vaxis, row);
+  area->x = (column == -1) ? 0 : psppire_axis_start_pixel (sheet->haxis, column);
+  area->y = (row == -1)    ? 0 : psppire_axis_start_pixel (sheet->vaxis, row);
 
   area->width= (column == -1) ? sheet->row_title_area.width
     : psppire_axis_unit_size (sheet->haxis, column);
@@ -2533,7 +2554,6 @@ static void
 change_active_cell (GtkSheet *sheet, gint row, gint col)
 {
   gint old_row, old_col;
-  glong old_handler_id = sheet->entry_handler_id;
 
   g_return_if_fail (GTK_IS_SHEET (sheet));
 
@@ -2550,29 +2570,11 @@ 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);
-  }
+  /* Erase the old cell */
+  gtk_sheet_draw_active_cell (sheet);
 
   sheet->range.row0 = row;
   sheet->range.col0 = col;
@@ -2592,8 +2594,6 @@ change_active_cell (GtkSheet *sheet, gint row, gint col)
   g_signal_emit (sheet, sheet_signals [ACTIVATE], 0,
                 row, col, old_row, old_col);
 
-  if ( old_handler_id == sheet->entry_handler_id)
-    g_signal_handler_unblock   (sheet->entry_widget, sheet->entry_handler_id);
 }
 
 static void
@@ -2660,27 +2660,26 @@ gtk_sheet_show_entry_widget (GtkSheet *sheet)
   dispose_string (sheet, text);
 }
 
-static void
+static gboolean
 gtk_sheet_draw_active_cell (GtkSheet *sheet)
 {
   gint row, col;
   GtkSheetRange range;
 
-  if (!GTK_WIDGET_DRAWABLE (GTK_WIDGET (sheet))) return;
-  if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return;
-
   row = sheet->active_cell.row;
   col = sheet->active_cell.col;
 
-  if (row < 0 || col < 0) return;
+  if (row < 0 || col < 0) return FALSE;
 
   if (!gtk_sheet_cell_isvisible (sheet, row, col))
-    return;
+    return FALSE;
 
   range.col0 = range.coli = col;
   range.row0 = range.rowi = row;
 
   gtk_sheet_draw_border (sheet, range);
+
+  return FALSE;
 }
 
 
@@ -2742,11 +2741,11 @@ gtk_sheet_new_selection (GtkSheet *sheet, GtkSheetRange *range)
 
              if (mask1 != mask2)
                {
-                 x = psppire_axis_pixel_start (sheet->haxis, j);
-                 y = psppire_axis_pixel_start (sheet->vaxis, i);
-                 width = psppire_axis_pixel_start (sheet->haxis, j)- x+
+                 x = psppire_axis_start_pixel (sheet->haxis, j);
+                 y = psppire_axis_start_pixel (sheet->vaxis, i);
+                 width = psppire_axis_start_pixel (sheet->haxis, j)- x+
                    psppire_axis_unit_size (sheet->haxis, j);
-                 height = psppire_axis_pixel_start (sheet->vaxis, i) - y + psppire_axis_unit_size (sheet->vaxis, i);
+                 height = psppire_axis_start_pixel (sheet->vaxis, i) - y + psppire_axis_unit_size (sheet->vaxis, i);
 
                  if (i == sheet->range.row0)
                    {
@@ -2763,12 +2762,12 @@ gtk_sheet_new_selection (GtkSheet *sheet, GtkSheetRange *range)
 
                  if (i != sheet->active_cell.row || j != sheet->active_cell.col)
                    {
-                     x = psppire_axis_pixel_start (sheet->haxis, j);
-                     y = psppire_axis_pixel_start (sheet->vaxis, i);
-                     width = psppire_axis_pixel_start (sheet->haxis, j)- x+
+                     x = psppire_axis_start_pixel (sheet->haxis, j);
+                     y = psppire_axis_start_pixel (sheet->vaxis, i);
+                     width = psppire_axis_start_pixel (sheet->haxis, j)- x+
                        psppire_axis_unit_size (sheet->haxis, j);
 
-                     height = psppire_axis_pixel_start (sheet->vaxis, i) - y + psppire_axis_unit_size (sheet->vaxis, i);
+                     height = psppire_axis_start_pixel (sheet->vaxis, i) - y + psppire_axis_unit_size (sheet->vaxis, i);
 
                      if (i == new_range.row0)
                        {
@@ -2806,10 +2805,10 @@ gtk_sheet_new_selection (GtkSheet *sheet, GtkSheetRange *range)
          if (state == GTK_STATE_SELECTED && !selected)
            {
 
-             x = psppire_axis_pixel_start (sheet->haxis, j);
-             y = psppire_axis_pixel_start (sheet->vaxis, i);
-             width = psppire_axis_pixel_start (sheet->haxis, j) - x + psppire_axis_unit_size (sheet->haxis, j);
-             height = psppire_axis_pixel_start (sheet->vaxis, i) - y + psppire_axis_unit_size (sheet->vaxis, i);
+             x = psppire_axis_start_pixel (sheet->haxis, j);
+             y = psppire_axis_start_pixel (sheet->vaxis, i);
+             width = psppire_axis_start_pixel (sheet->haxis, j) - x + psppire_axis_unit_size (sheet->haxis, j);
+             height = psppire_axis_start_pixel (sheet->vaxis, i) - y + psppire_axis_unit_size (sheet->vaxis, i);
 
              if (i == sheet->range.row0)
                {
@@ -2841,10 +2840,10 @@ gtk_sheet_new_selection (GtkSheet *sheet, GtkSheetRange *range)
              (i != sheet->active_cell.row || j != sheet->active_cell.col))
            {
 
-             x = psppire_axis_pixel_start (sheet->haxis, j);
-             y = psppire_axis_pixel_start (sheet->vaxis, i);
-             width = psppire_axis_pixel_start (sheet->haxis, j) - x + psppire_axis_unit_size (sheet->haxis, j);
-             height = psppire_axis_pixel_start (sheet->vaxis, i) - y + psppire_axis_unit_size (sheet->vaxis, i);
+             x = psppire_axis_start_pixel (sheet->haxis, j);
+             y = psppire_axis_start_pixel (sheet->vaxis, i);
+             width = psppire_axis_start_pixel (sheet->haxis, j) - x + psppire_axis_unit_size (sheet->haxis, j);
+             height = psppire_axis_start_pixel (sheet->vaxis, i) - y + psppire_axis_unit_size (sheet->vaxis, i);
 
              if (i == new_range.row0)
                {
@@ -2887,8 +2886,8 @@ gtk_sheet_new_selection (GtkSheet *sheet, GtkSheetRange *range)
          mask2 = j == new_range.coli ? mask2 + 8 : mask2;
          if (mask2 != mask1 || (mask2 == mask1 && state != GTK_STATE_SELECTED))
            {
-             x = psppire_axis_pixel_start (sheet->haxis, j);
-             y = psppire_axis_pixel_start (sheet->vaxis, i);
+             x = psppire_axis_start_pixel (sheet->haxis, j);
+             y = psppire_axis_start_pixel (sheet->vaxis, i);
              width = psppire_axis_unit_size (sheet->haxis, j);
              height = psppire_axis_unit_size (sheet->vaxis, i);
              if (mask2 & 1)
@@ -2939,10 +2938,8 @@ gtk_sheet_draw_border (GtkSheet *sheet, GtkSheetRange new_range)
   gdk_draw_rectangle (sheet->sheet_window,
                      sheet->xor_gc,
                      FALSE,
-                     area.x,
-                     area.y,
-                     area.width + 1,
-                     area.height + 1);
+                     area.x, area.y,
+                     area.width, area.height);
 }
 
 
@@ -3057,15 +3054,10 @@ static gint
 gtk_sheet_expose (GtkWidget *widget,
                  GdkEventExpose *event)
 {
-  GtkSheet *sheet;
-  GtkSheetRange range;
+  GtkSheet *sheet = GTK_SHEET (widget);
 
-  g_return_val_if_fail (widget != NULL, FALSE);
-  g_return_val_if_fail (GTK_IS_SHEET (widget), FALSE);
   g_return_val_if_fail (event != NULL, FALSE);
 
-  sheet = GTK_SHEET (widget);
-
   if (!GTK_WIDGET_DRAWABLE (widget))
     return FALSE;
 
@@ -3086,33 +3078,11 @@ gtk_sheet_expose (GtkWidget *widget,
                                       max_visible_column (sheet));
     }
 
-
-  {
-    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.row0 = row_from_ypixel (sheet, y);
-
-    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)
     {
-      gtk_sheet_range_draw (sheet, &range);
+      draw_sheet_region (sheet, event->region);
 
+#if 0
       if (sheet->state != GTK_SHEET_NORMAL)
        {
          if (gtk_sheet_range_isvisible (sheet, &sheet->range))
@@ -3126,12 +3096,24 @@ gtk_sheet_expose (GtkWidget *widget,
          if (GTK_SHEET_IN_RESIZE (sheet) || GTK_SHEET_IN_DRAG (sheet))
            draw_xor_rectangle (sheet, sheet->drag_range);
        }
+#endif
 
       if ((!GTK_SHEET_IN_XDRAG (sheet)) && (!GTK_SHEET_IN_YDRAG (sheet)))
        {
-         if (sheet->state == GTK_SHEET_NORMAL)
-           gtk_sheet_draw_active_cell (sheet);
+         GdkRectangle rect;
+         GtkSheetRange range;
+         range.row0 = range.rowi =  sheet->active_cell.row;
+         range.col0 = range.coli =  sheet->active_cell.col;
+
+         rectangle_from_range (sheet, &range, &rect);
+
+         if (GDK_OVERLAP_RECTANGLE_OUT !=
+             gdk_region_rect_in (event->region, &rect))
+           {
+             gtk_sheet_draw_active_cell (sheet);
+           }
        }
+
     }
 
   (* GTK_WIDGET_CLASS (parent_class)->expose_event) (widget, event);
@@ -3169,6 +3151,7 @@ gtk_sheet_button_press (GtkWidget *widget,
 
   if (event->window == sheet->column_title_window)
     {
+      sheet->x_drag = event->x;
       g_signal_emit (sheet,
                     sheet_signals[BUTTON_EVENT_COLUMN], 0,
                     column, event);
@@ -3200,21 +3183,12 @@ gtk_sheet_button_press (GtkWidget *widget,
 
 
   /* press on resize windows */
-  if (event->window == sheet->column_title_window &&
-      gtk_sheet_columns_resizable (sheet))
+  if (event->window == sheet->column_title_window)
     {
-#if 0
-      gtk_widget_get_pointer (widget, &sheet->x_drag, NULL);
-      if ( sheet->row_titles_visible)
-       sheet->x_drag -= sheet->row_title_area.width;
-#endif
-
       sheet->x_drag = event->x;
 
       if (on_column_boundary (sheet, sheet->x_drag, &sheet->drag_cell.col))
        {
-         guint req;
-         gtk_sheet_column_size_request (sheet, sheet->drag_cell.col, &req);
          GTK_SHEET_SET_FLAGS (sheet, GTK_SHEET_IN_XDRAG);
          gdk_pointer_grab (sheet->column_title_window, FALSE,
                            GDK_POINTER_MOTION_HINT_MASK |
@@ -3227,15 +3201,12 @@ gtk_sheet_button_press (GtkWidget *widget,
        }
     }
 
-  if (event->window == sheet->row_title_window && gtk_sheet_rows_resizable (sheet))
+  if (event->window == sheet->row_title_window)
     {
-      gtk_widget_get_pointer (widget, NULL, &sheet->y_drag);
+      sheet->y_drag = event->y;
 
-#if AXIS_TRANSITION
-      if (POSSIBLE_YDRAG (sheet, sheet->y_drag, &sheet->drag_cell.row))
+      if (on_row_boundary (sheet, sheet->y_drag, &sheet->drag_cell.row))
        {
-         guint req;
-         gtk_sheet_row_size_request (sheet, sheet->drag_cell.row, &req);
          GTK_SHEET_SET_FLAGS (sheet, GTK_SHEET_IN_YDRAG);
          gdk_pointer_grab (sheet->row_title_window, FALSE,
                            GDK_POINTER_MOTION_HINT_MASK |
@@ -3246,7 +3217,6 @@ gtk_sheet_button_press (GtkWidget *widget,
          draw_xor_hline (sheet);
          return TRUE;
        }
-#endif
     }
 
   /* the sheet itself does not handle other than single click events */
@@ -3441,8 +3411,6 @@ gtk_sheet_click_cell (GtkSheet *sheet, gint row, gint 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;
@@ -3452,7 +3420,6 @@ static gint
 gtk_sheet_button_release (GtkWidget *widget,
                          GdkEventButton *event)
 {
-  gint y;
   GdkDisplay *display = gtk_widget_get_display (widget);
 
   GtkSheet *sheet = GTK_SHEET (widget);
@@ -3460,7 +3427,6 @@ gtk_sheet_button_release (GtkWidget *widget,
   /* release on resize windows */
   if (GTK_SHEET_IN_XDRAG (sheet))
     {
-      gint xpos = event->x;
       gint width;
       GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_XDRAG);
       GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_SELECTION);
@@ -3468,27 +3434,33 @@ gtk_sheet_button_release (GtkWidget *widget,
       gdk_display_pointer_ungrab (display, event->time);
       draw_xor_vline (sheet);
 
-      width = new_column_width (sheet, sheet->drag_cell.col, &xpos);
+      width = event->x -
+       psppire_axis_start_pixel (sheet->haxis, sheet->drag_cell.col)
+       + sheet->hadjustment->value;
+
+      set_column_width (sheet, sheet->drag_cell.col, width);
 
-      gtk_sheet_set_column_width (sheet, sheet->drag_cell.col, width);
       return TRUE;
     }
 
   if (GTK_SHEET_IN_YDRAG (sheet))
     {
+      gint height;
       GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_YDRAG);
       GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_SELECTION);
-      gtk_widget_get_pointer (widget, NULL, &y);
+
       gdk_display_pointer_ungrab (display, event->time);
       draw_xor_hline (sheet);
 
-      gtk_sheet_set_row_height (sheet, sheet->drag_cell.row,
-                               new_row_height (sheet, sheet->drag_cell.row, &y));
-      g_signal_emit_by_name (sheet->vadjustment, "value_changed");
+      height = event->y -
+       psppire_axis_start_pixel (sheet->vaxis, sheet->drag_cell.row) +
+       sheet->vadjustment->value;
+
+      set_row_height (sheet, sheet->drag_cell.row, height);
+
       return TRUE;
     }
 
-
   if (GTK_SHEET_IN_DRAG (sheet))
     {
       GtkSheetRange old_range;
@@ -3710,19 +3682,15 @@ motion_timeout_callback (gpointer data)
 static gboolean
 gtk_sheet_motion (GtkWidget *widget,  GdkEventMotion *event)
 {
-  GtkSheet *sheet;
+  GtkSheet *sheet = GTK_SHEET (widget);
   GdkModifierType mods;
   GdkCursorType new_cursor;
   gint x, y;
   gint row, column;
   GdkDisplay *display;
 
-  g_return_val_if_fail (widget != NULL, FALSE);
-  g_return_val_if_fail (GTK_IS_SHEET (widget), FALSE);
   g_return_val_if_fail (event != NULL, FALSE);
 
-  sheet = GTK_SHEET (widget);
-
   display = gtk_widget_get_display (widget);
 
   /* selections on the sheet */
@@ -3752,8 +3720,7 @@ gtk_sheet_motion (GtkWidget *widget,  GdkEventMotion *event)
        }
     }
 
-  if (event->window == sheet->column_title_window &&
-      gtk_sheet_columns_resizable (sheet))
+  if (event->window == sheet->column_title_window)
     {
       if (!GTK_SHEET_IN_SELECTION (sheet) &&
          on_column_boundary (sheet, x, &column))
@@ -3762,7 +3729,9 @@ gtk_sheet_motion (GtkWidget *widget,  GdkEventMotion *event)
          if (new_cursor != sheet->cursor_drag->type)
            {
              gdk_cursor_unref (sheet->cursor_drag);
-             sheet->cursor_drag = gdk_cursor_new_for_display (display, GDK_SB_H_DOUBLE_ARROW);
+             sheet->cursor_drag =
+               gdk_cursor_new_for_display (display, new_cursor);
+
              gdk_window_set_cursor (sheet->column_title_window,
                                     sheet->cursor_drag);
            }
@@ -3774,37 +3743,39 @@ gtk_sheet_motion (GtkWidget *widget,  GdkEventMotion *event)
              new_cursor != sheet->cursor_drag->type)
            {
              gdk_cursor_unref (sheet->cursor_drag);
-             sheet->cursor_drag = gdk_cursor_new_for_display (display, GDK_TOP_LEFT_ARROW);
+             sheet->cursor_drag =
+               gdk_cursor_new_for_display (display, new_cursor);
              gdk_window_set_cursor (sheet->column_title_window,
                                     sheet->cursor_drag);
            }
        }
     }
-
-  if (event->window == sheet->row_title_window &&
-      gtk_sheet_rows_resizable (sheet))
+  else if (event->window == sheet->row_title_window)
     {
-#if AXIS_TRANSITION
-      if (!GTK_SHEET_IN_SELECTION (sheet) && POSSIBLE_YDRAG (sheet, y, &column))
+      if (!GTK_SHEET_IN_SELECTION (sheet) &&
+         on_row_boundary (sheet, y, &row))
        {
          new_cursor = GDK_SB_V_DOUBLE_ARROW;
          if (new_cursor != sheet->cursor_drag->type)
            {
              gdk_cursor_unref (sheet->cursor_drag);
-             sheet->cursor_drag = gdk_cursor_new_for_display (display, GDK_SB_V_DOUBLE_ARROW);
-             gdk_window_set_cursor (sheet->row_title_window, sheet->cursor_drag);
+             sheet->cursor_drag =
+               gdk_cursor_new_for_display (display, new_cursor);
+             gdk_window_set_cursor (sheet->row_title_window,
+                                    sheet->cursor_drag);
            }
        }
       else
-#endif
        {
          new_cursor = GDK_TOP_LEFT_ARROW;
          if (!GTK_SHEET_IN_YDRAG (sheet) &&
              new_cursor != sheet->cursor_drag->type)
            {
              gdk_cursor_unref (sheet->cursor_drag);
-             sheet->cursor_drag = gdk_cursor_new_for_display (display, GDK_TOP_LEFT_ARROW);
-             gdk_window_set_cursor (sheet->row_title_window, sheet->cursor_drag);
+             sheet->cursor_drag =
+               gdk_cursor_new_for_display (display, new_cursor);
+             gdk_window_set_cursor (sheet->row_title_window,
+                                    sheet->cursor_drag);
            }
        }
     }
@@ -3854,34 +3825,25 @@ gtk_sheet_motion (GtkWidget *widget,  GdkEventMotion *event)
 
   if (GTK_SHEET_IN_XDRAG (sheet))
     {
-      x = event->x;
-
-      new_column_width (sheet, sheet->drag_cell.col, &x);
-#if 0
-      if (x != sheet->x_drag)
+      if (event->x != sheet->x_drag)
        {
          draw_xor_vline (sheet);
-         sheet->x_drag = x;
+         sheet->x_drag = event->x;
          draw_xor_vline (sheet);
        }
-#endif
+
       return TRUE;
     }
 
   if (GTK_SHEET_IN_YDRAG (sheet))
     {
-      if (event->is_hint || event->window != widget->window)
-       gtk_widget_get_pointer (widget, NULL, &y);
-      else
-       y = event->y;
-
-      new_row_height (sheet, sheet->drag_cell.row, &y);
-      if (y != sheet->y_drag)
+      if (event->y != sheet->y_drag)
        {
          draw_xor_hline (sheet);
-         sheet->y_drag = y;
+         sheet->y_drag = event->y;
          draw_xor_hline (sheet);
        }
+
       return TRUE;
     }
 
@@ -3918,8 +3880,8 @@ gtk_sheet_motion (GtkWidget *widget,  GdkEventMotion *event)
       GtkSheetRange aux;
       gint v_h, current_col, current_row, col_threshold, row_threshold;
       v_h = 1;
-      if (abs (x - psppire_axis_pixel_start (sheet->haxis, sheet->drag_cell.col)) >
-         abs (y - psppire_axis_pixel_start (sheet->vaxis, sheet->drag_cell.row))) v_h = 2;
+      if (abs (x - psppire_axis_start_pixel (sheet->haxis, sheet->drag_cell.col)) >
+         abs (y - psppire_axis_start_pixel (sheet->vaxis, sheet->drag_cell.row))) v_h = 2;
 
       current_col = column_from_xpixel (sheet, x);
       current_row = row_from_ypixel (sheet, y);
@@ -3928,7 +3890,7 @@ gtk_sheet_motion (GtkWidget *widget,  GdkEventMotion *event)
 
       /*use half of column width resp. row height as threshold to
        expand selection*/
-      col_threshold = psppire_axis_pixel_start (sheet->haxis, current_col) +
+      col_threshold = psppire_axis_start_pixel (sheet->haxis, current_col) +
        psppire_axis_unit_size (sheet->haxis, current_col) / 2;
       if (column > 0)
        {
@@ -3940,7 +3902,7 @@ gtk_sheet_motion (GtkWidget *widget,  GdkEventMotion *event)
          if (x > col_threshold)
            column +=1;
        }
-      row_threshold = psppire_axis_pixel_start (sheet->vaxis, current_row) +
+      row_threshold = psppire_axis_start_pixel (sheet->vaxis, current_row) +
        psppire_axis_unit_size (sheet->vaxis, current_row)/2;
       if (row > 0)
        {
@@ -4084,11 +4046,11 @@ static void
 page_vertical (GtkSheet *sheet, GtkScrollType dir)
 {
   gint old_row = sheet->active_cell.row ;
-  glong vpixel = psppire_axis_pixel_start (sheet->vaxis, old_row);
+  glong vpixel = psppire_axis_start_pixel (sheet->vaxis, old_row);
 
   gint new_row;
 
-  vpixel -= psppire_axis_pixel_start (sheet->vaxis,
+  vpixel -= psppire_axis_start_pixel (sheet->vaxis,
                                     min_visible_row (sheet));
 
   switch ( dir)
@@ -4110,7 +4072,7 @@ page_vertical (GtkSheet *sheet, GtkScrollType dir)
     }
 
 
-  vpixel += psppire_axis_pixel_start (sheet->vaxis,
+  vpixel += psppire_axis_start_pixel (sheet->vaxis,
                                     min_visible_row (sheet));
 
   new_row =  row_from_ypixel (sheet, vpixel);
@@ -4151,6 +4113,15 @@ step_sheet (GtkSheet *sheet, GtkScrollType dir)
     }
 
 
+  g_signal_emit (sheet, sheet_signals[TRAVERSE], 0,
+                &sheet->active_cell,
+                &new_cell,
+                &forbidden);
+
+  if (forbidden)
+    return;
+
+
   maximize_int (&new_cell.row, 0);
   maximize_int (&new_cell.col, 0);
 
@@ -4160,21 +4131,13 @@ step_sheet (GtkSheet *sheet, GtkScrollType dir)
   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,
+       psppire_axis_start_pixel (sheet->haxis,
                                    new_cell.col + 1);
       hpos -= sheet->hadjustment->page_size;
 
@@ -4184,7 +4147,7 @@ step_sheet (GtkSheet *sheet, GtkScrollType dir)
   else if ( new_cell.col < min_fully_visible_column (sheet))
     {
       glong hpos  =
-       psppire_axis_pixel_start (sheet->haxis,
+       psppire_axis_start_pixel (sheet->haxis,
                                    new_cell.col);
 
       gtk_adjustment_set_value (sheet->hadjustment,
@@ -4195,7 +4158,7 @@ step_sheet (GtkSheet *sheet, GtkScrollType dir)
   if ( new_cell.row > max_fully_visible_row (sheet))
     {
       glong vpos  =
-       psppire_axis_pixel_start (sheet->vaxis,
+       psppire_axis_start_pixel (sheet->vaxis,
                                    new_cell.row + 1);
       vpos -= sheet->vadjustment->page_size;
 
@@ -4205,7 +4168,7 @@ step_sheet (GtkSheet *sheet, GtkScrollType dir)
   else if ( new_cell.row < min_fully_visible_row (sheet))
     {
       glong vpos  =
-       psppire_axis_pixel_start (sheet->vaxis,
+       psppire_axis_start_pixel (sheet->vaxis,
                                    new_cell.row);
 
       gtk_adjustment_set_value (sheet->vadjustment,
@@ -4523,10 +4486,10 @@ gtk_sheet_size_allocate_entry (GtkSheet *sheet)
   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;
+  entry_alloc.width -= BORDER_WIDTH ;
+  entry_alloc.height -= BORDER_WIDTH ;
+  entry_alloc.x += DIV_RND_UP (BORDER_WIDTH, 2);
+  entry_alloc.y += DIV_RND_UP (BORDER_WIDTH, 2);
 
 
   gtk_widget_set_size_request (sheet->entry_widget, entry_alloc.width,
@@ -4580,8 +4543,7 @@ create_sheet_entry (GtkSheet *sheet)
                            G_CALLBACK (gtk_sheet_entry_key_press),
                            sheet);
 
-  sheet->entry_handler_id =
-    g_signal_connect (sheet->entry_widget,
+  g_signal_connect (sheet->entry_widget,
                      "changed",
                      G_CALLBACK (gtk_sheet_entry_changed),
                      sheet);
@@ -4757,8 +4719,8 @@ draw_column_title_buttons_range (GtkSheet *sheet, gint first, gint last)
 
   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
+  rect.x = psppire_axis_start_pixel (sheet->haxis, first) + CELL_SPACING;
+  rect.width = psppire_axis_start_pixel (sheet->haxis, last) + CELL_SPACING
     + psppire_axis_unit_size (sheet->haxis, last);
 
   rect.x -= sheet->hadjustment->value;
@@ -4776,7 +4738,7 @@ draw_column_title_buttons_range (GtkSheet *sheet, gint first, gint last)
       GtkSheetButton *
        button = g_sheet_model_get_column_button (sheet->model, col);
       allocation.y = 0;
-      allocation.x = psppire_axis_pixel_start (sheet->haxis, col)
+      allocation.x = psppire_axis_start_pixel (sheet->haxis, col)
        + CELL_SPACING;
       allocation.x -= sheet->hadjustment->value;
 
@@ -4806,8 +4768,8 @@ draw_row_title_buttons_range (GtkSheet *sheet, gint first, gint last)
 
   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
+  rect.y = psppire_axis_start_pixel (sheet->vaxis, first) + CELL_SPACING;
+  rect.height = psppire_axis_start_pixel (sheet->vaxis, last) + CELL_SPACING
     + psppire_axis_unit_size (sheet->vaxis, last);
 
   rect.y -= sheet->vadjustment->value;
@@ -4825,7 +4787,7 @@ draw_row_title_buttons_range (GtkSheet *sheet, gint first, gint last)
       GtkSheetButton *button =
        g_sheet_model_get_row_button (sheet->model, row);
       allocation.x = 0;
-      allocation.y = psppire_axis_pixel_start (sheet->vaxis, row)
+      allocation.y = psppire_axis_start_pixel (sheet->vaxis, row)
        + CELL_SPACING;
       allocation.y -= sheet->vadjustment->value;
 
@@ -4862,7 +4824,7 @@ update_adjustment (GtkAdjustment *adj, PsppireAxis *axis, gint page_size)
     position = 0;
 
   adj->upper =
-    psppire_axis_pixel_start (axis, last_item)
+    psppire_axis_start_pixel (axis, last_item)
     +
     psppire_axis_unit_size (axis, last_item)
     ;
@@ -4870,10 +4832,12 @@ update_adjustment (GtkAdjustment *adj, PsppireAxis *axis, gint page_size)
   adj->lower = 0;
   adj->page_size = page_size;
 
+#if 0
   adj->value = position * (adj->upper - adj->lower) - adj->page_size;
 
   if ( adj->value < adj->lower)
     adj->value = adj->lower;
+#endif
 
   gtk_adjustment_changed (adj);
 }
@@ -4919,7 +4883,7 @@ adjust_scrollbars (GtkSheet *sheet)
       sheet->hadjustment->page_increment = width;
 
       sheet->hadjustment->upper =
-       psppire_axis_pixel_start (sheet->haxis, last_col)
+       psppire_axis_start_pixel (sheet->haxis, last_col)
        +
        psppire_axis_unit_size (sheet->haxis, last_col)
        ;
@@ -4939,7 +4903,6 @@ vadjustment_value_changed (GtkAdjustment *adjustment,
 
   if ( ! GTK_WIDGET_REALIZED (sheet)) return;
 
-
   gtk_widget_hide (sheet->entry_widget);
 
   region =
@@ -4947,13 +4910,14 @@ vadjustment_value_changed (GtkAdjustment *adjustment,
 
   gdk_window_begin_paint_region (sheet->sheet_window, region);
 
+  draw_sheet_region (sheet, region);
 
-  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);
+  gdk_region_destroy (region);
 }
 
 
@@ -4976,13 +4940,16 @@ hadjustment_value_changed (GtkAdjustment *adjustment,
 
   gdk_window_begin_paint_region (sheet->sheet_window, region);
 
-  gtk_sheet_range_draw (sheet, NULL);
+  draw_sheet_region (sheet, region);
+
   draw_column_title_buttons (sheet);
   //  size_allocate_global_button (sheet);
 
   gtk_sheet_draw_active_cell (sheet);
 
   gdk_window_end_paint (sheet->sheet_window);
+
+  gdk_region_destroy (region);
 }
 
 
@@ -4995,7 +4962,6 @@ draw_xor_vline (GtkSheet *sheet)
   gdk_drawable_get_size (sheet->sheet_window,
                         NULL, &height);
 
-
   if (sheet->row_titles_visible)
     xpos += sheet->row_title_area.width;
 
@@ -5036,11 +5002,11 @@ draw_xor_rectangle (GtkSheet *sheet, GtkSheetRange range)
   GdkRectangle clip_area, area;
   GdkGCValues values;
 
-  area.x = psppire_axis_pixel_start (sheet->haxis, range.col0);
-  area.y = psppire_axis_pixel_start (sheet->vaxis, range.row0);
-  area.width = psppire_axis_pixel_start (sheet->haxis, range.coli)- area.x+
+  area.x = psppire_axis_start_pixel (sheet->haxis, range.col0);
+  area.y = psppire_axis_start_pixel (sheet->vaxis, range.row0);
+  area.width = psppire_axis_start_pixel (sheet->haxis, range.coli)- area.x+
     psppire_axis_unit_size (sheet->haxis, range.coli);
-  area.height = psppire_axis_pixel_start (sheet->vaxis, range.rowi)- area.y +
+  area.height = psppire_axis_start_pixel (sheet->vaxis, range.rowi)- area.y +
     psppire_axis_unit_size (sheet->vaxis, range.rowi);
 
   clip_area.x = sheet->row_title_area.width;
@@ -5087,123 +5053,47 @@ draw_xor_rectangle (GtkSheet *sheet, GtkSheetRange range)
 }
 
 
-/* this function returns the new width of the column being resized given
- * the COLUMN and X position of the cursor; the x cursor position is passed
- * in as a pointer and automaticaly corrected if it's outside the acceptable
- * range */
-static guint
-new_column_width (GtkSheet *sheet, gint column, gint *x)
-{
-  gint left_pos = psppire_axis_pixel_start (sheet->haxis, column)
-    - sheet->hadjustment->value;
-
-  gint width = *x - left_pos;
-
-  if ( width < sheet->column_requisition)
-    {
-      width = sheet->column_requisition;
-      *x = left_pos + width;
-    }
-
-#if AXIS_TRANSITION
-  g_sheet_column_set_width (sheet->column_geometry, column, width);
-#endif
-
-  draw_column_title_buttons (sheet);
-
-  return width;
-}
-
-/* this function returns the new height of the row being resized given
- * the row and y position of the cursor; the y cursor position is passed
- * in as a pointer and automaticaly corrected if it's beyond min / max limits */
-static guint
-new_row_height (GtkSheet *sheet, gint row, gint *y)
-{
-  gint height;
-  guint min_height;
-
-  gint cy = *y;
-  min_height = sheet->row_requisition;
-
-  /* you can't shrink a row to less than its minimum height */
-  if (cy < psppire_axis_pixel_start (sheet->vaxis, row) + min_height)
-
-    {
-      *y = cy = psppire_axis_pixel_start (sheet->vaxis, row) + min_height;
-    }
-
-  /* calculate new row height making sure it doesn't end up
-   * less than the minimum height */
-  height = (cy - psppire_axis_pixel_start (sheet->vaxis, row));
-  if (height < min_height)
-    height = min_height;
-
-#if AXIS_TRANSITION
-  g_sheet_row_set_height (sheet->row_geometry, row, height);
-#endif
-  draw_row_title_buttons (sheet);
-
-  return height;
-}
-
 static void
-gtk_sheet_set_column_width (GtkSheet *sheet,
-                           gint column,
-                           guint width)
+set_column_width (GtkSheet *sheet,
+                 gint column,
+                 gint width)
 {
-  guint min_width;
-
   g_return_if_fail (sheet != NULL);
   g_return_if_fail (GTK_IS_SHEET (sheet));
 
   if (column < 0 || column >= psppire_axis_unit_count (sheet->haxis))
     return;
 
-  gtk_sheet_column_size_request (sheet, column, &min_width);
-  if (width < min_width) return;
-
-#if AXIS_TRANSITION
-  g_sheet_column_set_width (sheet->column_geometry, column, width);
-#endif
+  psppire_axis_resize (sheet->haxis, column, width);
 
   if (GTK_WIDGET_REALIZED (GTK_WIDGET (sheet)))
     {
       draw_column_title_buttons (sheet);
       adjust_scrollbars (sheet);
       gtk_sheet_size_allocate_entry (sheet);
-      gtk_sheet_range_draw (sheet, NULL);
+      redraw_range (sheet, NULL);
     }
 }
 
-
-
 static void
-gtk_sheet_set_row_height (GtkSheet *sheet,
-                         gint row,
-                         guint height)
+set_row_height (GtkSheet *sheet,
+               gint row,
+               gint height)
 {
-  guint min_height;
-
   g_return_if_fail (sheet != NULL);
   g_return_if_fail (GTK_IS_SHEET (sheet));
 
   if (row < 0 || row >= psppire_axis_unit_count (sheet->vaxis))
     return;
 
-  gtk_sheet_row_size_request (sheet, row, &min_height);
-  if (height < min_height) return;
-
-#if AXIS_TRANSITION
-  g_sheet_row_set_height (sheet->row_geometry, row, height);
-#endif
+  psppire_axis_resize (sheet->vaxis, row, height);
 
   if (GTK_WIDGET_REALIZED (GTK_WIDGET (sheet)) )
     {
       draw_row_title_buttons (sheet);
       adjust_scrollbars (sheet);
       gtk_sheet_size_allocate_entry (sheet);
-      gtk_sheet_range_draw (sheet, NULL);
+      redraw_range (sheet, NULL);
     }
 }
 
@@ -5213,7 +5103,6 @@ gtk_sheet_get_attributes (const GtkSheet *sheet, gint row, gint col,
 {
   GdkColor *fg, *bg;
   const GtkJustification *j ;
-  const GtkSheetCellBorder *border ;
   GdkColormap *colormap;
 
   g_return_val_if_fail (sheet != NULL, FALSE);
@@ -5255,10 +5144,6 @@ gtk_sheet_get_attributes (const GtkSheet *sheet, gint row, gint col,
   if (j)
     attr->justification = *j;
 
-  border = g_sheet_model_get_cell_border (sheet->model, row, col);
-
-  if ( border ) attr->border = *border;
-
   return TRUE;
 }
 
@@ -5283,43 +5168,6 @@ gtk_sheet_button_size_request     (GtkSheet *sheet,
 
 }
 
-static void
-gtk_sheet_row_size_request (GtkSheet *sheet,
-                           gint row,
-                           guint *requisition)
-{
-  GtkRequisition button_requisition;
-
-  gtk_sheet_button_size_request (sheet,
-                                g_sheet_model_get_row_button (sheet->model, row),
-                                &button_requisition);
-
-  *requisition = button_requisition.height;
-
-  sheet->row_requisition = *requisition;
-}
-
-static void
-gtk_sheet_column_size_request (GtkSheet *sheet,
-                              gint col,
-                              guint *requisition)
-{
-  GtkRequisition button_requisition;
-
-  GtkSheetButton *button = g_sheet_model_get_column_button (sheet->model, col);
-
-  gtk_sheet_button_size_request (sheet,
-                                button,
-                                &button_requisition);
-
-  gtk_sheet_button_free (button);
-
-  *requisition = button_requisition.width;
-
-  sheet->column_requisition = *requisition;
-}
-
-
 static void
 gtk_sheet_forall (GtkContainer *container,
                  gboolean include_internals,