Avoid the need for an extra click when de-selecting a region
[pspp-builds.git] / lib / gtk-contrib / psppire-sheet.c
index 33e7b47a0cce90cf7121ab275a78c965d3b66d0a..c84d898984fbac6bfeaedfde639860183c4f0b19 100644 (file)
@@ -1,24 +1,24 @@
 /*
-   Copyright (C) 2006, 2008, 2009 Free Software Foundation
+  Copyright (C) 2006, 2008, 2009 Free Software Foundation
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation, either version 3 of the License, or
-   (at your option) any later version.
+  This program is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 3 of the License, or
+  (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+  You should have received a copy of the GNU General Public License
+  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 
- This file is derived from the gtksheet.c and extensively modified for the
- requirements of PSPPIRE.  The changes are copyright by the
- Free Software Foundation.  The copyright notice for the original work is
- below.
 This file is derived from the gtksheet.c and extensively modified for the
 requirements of PSPPIRE.  The changes are copyright by the
 Free Software Foundation.  The copyright notice for the original work is
 below.
 */
 
 /* GtkSheet widget for Gtk+.
@@ -80,7 +80,13 @@ enum
     PSPPIRE_SHEET_IN_XDRAG = 1 << 1,
     PSPPIRE_SHEET_IN_YDRAG = 1 << 2,
     PSPPIRE_SHEET_IN_DRAG = 1 << 3,
+
+    /* This flag is set when the user is actually in the process
+       of making a selection - ie while the mouse button is
+       depressed.
+    */
     PSPPIRE_SHEET_IN_SELECTION = 1 << 4,
+
     PSPPIRE_SHEET_IN_RESIZE = 1 << 5
   };
 
@@ -117,9 +123,6 @@ static void set_row_height (PsppireSheet *sheet,
 static void destroy_hover_window (PsppireSheetHoverTitle *);
 static PsppireSheetHoverTitle *create_hover_window (void);
 
-static GtkStateType psppire_sheet_cell_get_state (PsppireSheet *sheet, gint row, gint col);
-
-
 static inline  void
 dispose_string (const PsppireSheet *sheet, gchar *text)
 {
@@ -375,10 +378,10 @@ POSSIBLE_RESIZE (const PsppireSheet *sheet, gint x, gint y,
   ydrag = psppire_axis_start_pixel (sheet->vaxis, sheet->range.rowi) +
     psppire_axis_unit_size (sheet->vaxis, sheet->range.rowi);
 
-  if (sheet->state == PSPPIRE_SHEET_COLUMN_SELECTED)
+  if (sheet->select_status == PSPPIRE_SHEET_COLUMN_SELECTED)
     ydrag = psppire_axis_start_pixel (sheet->vaxis, min_visible_row (sheet));
 
-  if (sheet->state == PSPPIRE_SHEET_ROW_SELECTED)
+  if (sheet->select_status == PSPPIRE_SHEET_ROW_SELECTED)
     xdrag = psppire_axis_start_pixel (sheet->haxis, min_visible_column (sheet));
 
   *drag_column = column_from_xpixel (sheet, x);
@@ -392,24 +395,29 @@ POSSIBLE_RESIZE (const PsppireSheet *sheet, gint x, gint y,
 
 
 static gboolean
-rectangle_from_range (PsppireSheet *sheet, const PsppireSheetRange *range,
+rectangle_from_range (PsppireSheet *sheet, const PsppireSheetRange *input,
                      GdkRectangle *r)
 {
-  g_return_val_if_fail (range, FALSE);
+  PsppireSheetRange range = *input;
+
+  if ( range.row0 == -1 ) range.row0 = min_visible_row (sheet);
+  if ( range.rowi == -1 ) range.rowi = max_visible_row (sheet);
+  if ( range.col0 == -1 ) range.col0 = min_visible_column (sheet);
+  if ( range.coli == -1 ) range.coli = max_visible_column (sheet);
 
-  r->x = psppire_axis_start_pixel (sheet->haxis, range->col0);
+  r->x = psppire_axis_start_pixel (sheet->haxis, range.col0);
   r->x -= round (sheet->hadjustment->value);
 
-  r->y = psppire_axis_start_pixel (sheet->vaxis, range->row0);
+  r->y = psppire_axis_start_pixel (sheet->vaxis, range.row0);
   r->y -= round (sheet->vadjustment->value);
 
-  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->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_start_pixel (sheet->vaxis, range->rowi) -
-    psppire_axis_start_pixel (sheet->vaxis, range->row0) +
-    psppire_axis_unit_size (sheet->vaxis, range->rowi);
+  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);
 
   if ( sheet->column_titles_visible)
     {
@@ -450,33 +458,33 @@ static void psppire_sheet_unrealize                (GtkWidget *widget);
 static void psppire_sheet_map                   (GtkWidget *widget);
 static void psppire_sheet_unmap                         (GtkWidget *widget);
 static gint psppire_sheet_expose                        (GtkWidget *widget,
-                                                 GdkEventExpose *event);
+                                                         GdkEventExpose *event);
 
 static void psppire_sheet_forall                        (GtkContainer *container,
-                                                 gboolean include_internals,
-                                                 GtkCallback callback,
-                                                 gpointer callback_data);
+                                                         gboolean include_internals,
+                                                         GtkCallback callback,
+                                                         gpointer callback_data);
 
 static gboolean psppire_sheet_set_scroll_adjustments  (PsppireSheet *sheet,
-                                                 GtkAdjustment *hadjustment,
-                                                 GtkAdjustment *vadjustment);
+                                                      GtkAdjustment *hadjustment,
+                                                      GtkAdjustment *vadjustment);
 
 static gint psppire_sheet_button_press                  (GtkWidget *widget,
                                                  GdkEventButton *event);
 static gint psppire_sheet_button_release                (GtkWidget *widget,
-                                                 GdkEventButton *event);
+                                                         GdkEventButton *event);
 static gint psppire_sheet_motion                        (GtkWidget *widget,
-                                                 GdkEventMotion *event);
+                                                         GdkEventMotion *event);
 static gboolean psppire_sheet_crossing_notify           (GtkWidget *widget,
-                                                    GdkEventCrossing *event);
+                                                        GdkEventCrossing *event);
 static gint psppire_sheet_entry_key_press               (GtkWidget *widget,
-                                                 GdkEventKey *key);
+                                                         GdkEventKey *key);
 static gboolean psppire_sheet_key_press                 (GtkWidget *widget,
                                                  GdkEventKey *key);
 static void psppire_sheet_size_request                  (GtkWidget *widget,
                                                  GtkRequisition *requisition);
 static void psppire_sheet_size_allocate                 (GtkWidget *widget,
-                                                 GtkAllocation *allocation);
+                                                         GtkAllocation *allocation);
 
 static gboolean psppire_sheet_focus_in               (GtkWidget     *widget,
                                                      GdkEventFocus *event);
@@ -484,9 +492,9 @@ static gboolean psppire_sheet_focus_in               (GtkWidget     *widget,
 /* Sheet queries */
 
 static gboolean psppire_sheet_range_isvisible (const PsppireSheet *sheet,
-                                          const PsppireSheetRange *range);
+                                              const PsppireSheetRange *range);
 static gboolean psppire_sheet_cell_isvisible  (PsppireSheet *sheet,
-                                          gint row, gint column);
+                                              gint row, gint column);
 /* Drawing Routines */
 
 /* draw cell */
@@ -497,20 +505,7 @@ static void psppire_sheet_cell_draw (PsppireSheet *sheet, gint row, gint column)
 static void draw_sheet_region (PsppireSheet *sheet, GdkRegion *region);
 
 
-/* highlight the visible part of the selected range */
-static void psppire_sheet_range_draw_selection  (PsppireSheet *sheet,
-                                                 PsppireSheetRange range);
-
 /* Selection */
-
-static void psppire_sheet_real_select_range     (PsppireSheet *sheet,
-                                                 const PsppireSheetRange *range);
-static void psppire_sheet_real_unselect_range   (PsppireSheet *sheet,
-                                                 const PsppireSheetRange *range);
-static void psppire_sheet_extend_selection              (PsppireSheet *sheet,
-                                                 gint row, gint column);
-static void psppire_sheet_new_selection                 (PsppireSheet *sheet,
-                                                 PsppireSheetRange *range);
 static void psppire_sheet_draw_border           (PsppireSheet *sheet,
                                                  PsppireSheetRange range);
 
@@ -521,8 +516,8 @@ static void change_active_cell  (PsppireSheet *sheet, gint row, gint col);
 static gboolean psppire_sheet_draw_active_cell  (PsppireSheet *sheet);
 static void psppire_sheet_show_entry_widget             (PsppireSheet *sheet);
 static gboolean psppire_sheet_click_cell                (PsppireSheet *sheet,
-                                                 gint row,
-                                                 gint column);
+                                                         gint row,
+                                                         gint column);
 
 
 /* Scrollbars */
@@ -561,8 +556,8 @@ static void psppire_sheet_button_size_request        (PsppireSheet *sheet,
                                                  GtkRequisition *requisition);
 
 static void psppire_sheet_real_cell_clear               (PsppireSheet *sheet,
-                                                 gint row,
-                                                 gint column);
+                                                         gint row,
+                                                         gint column);
 
 
 /* Signals */
@@ -759,13 +754,13 @@ psppire_sheet_set_vertical_axis (PsppireSheet *sheet, PsppireAxis *a)
     g_object_ref (sheet->vaxis);
 }
 
-static const GtkBorder default_cell_padding = { 3, 3, 2, 2 };
+static const GtkBorder default_cell_padding = {3, 3, 3, 3};
 
 static void
 psppire_sheet_set_property (GObject         *object,
-                       guint            prop_id,
-                       const GValue    *value,
-                       GParamSpec      *pspec)
+                           guint            prop_id,
+                           const GValue    *value,
+                           GParamSpec      *pspec)
 
 {
   PsppireSheet *sheet = PSPPIRE_SHEET (object);
@@ -778,19 +773,19 @@ psppire_sheet_set_property (GObject         *object,
 
       sheet->cell_padding = g_value_dup_boxed (value);
 
-     if (NULL == sheet->cell_padding)
-       sheet->cell_padding = g_boxed_copy (GTK_TYPE_BORDER,
-                                          &default_cell_padding);
+      if (NULL == sheet->cell_padding)
+       sheet->cell_padding = g_boxed_copy (GTK_TYPE_BORDER,
+                                           &default_cell_padding);
 
-     if (sheet->vaxis)
-       g_object_set (sheet->vaxis, "padding",
-                    sheet->cell_padding->top + sheet->cell_padding->bottom,
-                    NULL);
+      if (sheet->vaxis)
+       g_object_set (sheet->vaxis, "padding",
+                     sheet->cell_padding->top + sheet->cell_padding->bottom,
+                     NULL);
 
-     if (sheet->haxis)
-       g_object_set (sheet->haxis, "padding",
-                    sheet->cell_padding->left + sheet->cell_padding->right,
-                    NULL);
+      if (sheet->haxis)
+       g_object_set (sheet->haxis, "padding",
+                     sheet->cell_padding->left + sheet->cell_padding->right,
+                     NULL);
       break;
     case PROP_VAXIS:
       psppire_sheet_set_vertical_axis (sheet, g_value_get_pointer (value));
@@ -815,9 +810,9 @@ psppire_sheet_set_property (GObject         *object,
 
 static void
 psppire_sheet_get_property (GObject         *object,
-                       guint            prop_id,
-                       GValue          *value,
-                       GParamSpec      *pspec)
+                           guint            prop_id,
+                           GValue          *value,
+                           GParamSpec      *pspec)
 {
   PsppireSheet *sheet = PSPPIRE_SHEET (object);
 
@@ -1135,7 +1130,7 @@ psppire_sheet_init (PsppireSheet *sheet)
 
   sheet->flags = 0;
   sheet->selection_mode = GTK_SELECTION_NONE;
-  sheet->state = PSPPIRE_SHEET_NORMAL;
+  sheet->select_status = PSPPIRE_SHEET_NORMAL;
 
   GTK_WIDGET_UNSET_FLAGS (sheet, GTK_NO_WINDOW);
   GTK_WIDGET_SET_FLAGS (sheet, GTK_CAN_FOCUS);
@@ -1155,16 +1150,12 @@ psppire_sheet_init (PsppireSheet *sheet)
 
   sheet->active_cell.row = 0;
   sheet->active_cell.col = 0;
-  sheet->selection_cell.row = 0;
-  sheet->selection_cell.col = 0;
 
   sheet->range.row0 = 0;
   sheet->range.rowi = 0;
   sheet->range.col0 = 0;
   sheet->range.coli = 0;
 
-  sheet->state = PSPPIRE_SHEET_NORMAL;
-
   sheet->sheet_window = NULL;
   sheet->entry_widget = NULL;
   sheet->button = NULL;
@@ -1200,7 +1191,7 @@ psppire_sheet_init (PsppireSheet *sheet)
 
 /* Cause RANGE to be redrawn. If RANGE is null, then the
    entire visible range will be redrawn.
- */
+*/
 static void
 redraw_range (PsppireSheet *sheet, PsppireSheetRange *range)
 {
@@ -1323,7 +1314,7 @@ range_update_callback (PsppireSheetModel *m, gint row0, gint col0,
       adjust_scrollbars (sheet);
 
       draw_row_title_buttons_range (sheet, min_visible_row (sheet),
-                                      max_visible_row (sheet));
+                                   max_visible_row (sheet));
 
       draw_column_title_buttons_range (sheet, min_visible_column (sheet),
                                       max_visible_column (sheet));
@@ -1409,25 +1400,18 @@ psppire_sheet_set_model (PsppireSheet *sheet, PsppireSheetModel *model)
 void
 psppire_sheet_change_entry (PsppireSheet *sheet, GtkType entry_type)
 {
-  gint state;
-
   g_return_if_fail (sheet != NULL);
   g_return_if_fail (PSPPIRE_IS_SHEET (sheet));
 
-  state = sheet->state;
-
-  if (sheet->state == PSPPIRE_SHEET_NORMAL)
+  if (sheet->select_status == PSPPIRE_SHEET_NORMAL)
     psppire_sheet_hide_entry_widget (sheet);
 
   sheet->entry_type = entry_type;
 
   create_sheet_entry (sheet);
 
-  if (state == PSPPIRE_SHEET_NORMAL)
-    {
-      psppire_sheet_show_entry_widget (sheet);
-    }
-
+  if (sheet->select_status == PSPPIRE_SHEET_NORMAL)
+    psppire_sheet_show_entry_widget (sheet);
 }
 
 void
@@ -1577,13 +1561,13 @@ psppire_sheet_hide_row_titles (PsppireSheet *sheet)
    be placed at the {bottom,right}.
    ROW or COL may be -1, in which case scrolling in that dimension
    does not occur.
- */
+*/
 void
 psppire_sheet_moveto (PsppireSheet *sheet,
-                 gint row,
-                 gint col,
-                 gfloat row_align,
-                 gfloat col_align)
+                     gint row,
+                     gint col,
+                     gfloat row_align,
+                     gfloat col_align)
 {
   gint width, height;
 
@@ -1618,59 +1602,11 @@ psppire_sheet_moveto (PsppireSheet *sheet,
 }
 
 
-void
-psppire_sheet_select_row (PsppireSheet *sheet, gint row)
-{
-  g_return_if_fail (sheet != NULL);
-  g_return_if_fail (PSPPIRE_IS_SHEET (sheet));
-
-  if (row < 0 || row >= psppire_axis_unit_count (sheet->vaxis))
-    return;
-
-  if (sheet->state != PSPPIRE_SHEET_NORMAL)
-    psppire_sheet_real_unselect_range (sheet, NULL);
-
-  sheet->state = PSPPIRE_SHEET_ROW_SELECTED;
-  sheet->range.row0 = row;
-  sheet->range.col0 = 0;
-  sheet->range.rowi = row;
-  sheet->range.coli = psppire_axis_unit_count (sheet->haxis) - 1;
-  sheet->active_cell.row = row;
-
-  g_signal_emit (sheet, sheet_signals[SELECT_ROW], 0, row);
-  psppire_sheet_real_select_range (sheet, NULL);
-}
-
-
-void
-psppire_sheet_select_column (PsppireSheet *sheet, gint column)
-{
-  g_return_if_fail (sheet != NULL);
-  g_return_if_fail (PSPPIRE_IS_SHEET (sheet));
-
-  if (column < 0 || column >= psppire_axis_unit_count (sheet->haxis))
-    return;
-
-  if (sheet->state != PSPPIRE_SHEET_NORMAL)
-    psppire_sheet_real_unselect_range (sheet, NULL);
-
-  sheet->state = PSPPIRE_SHEET_COLUMN_SELECTED;
-  sheet->range.row0 = 0;
-  sheet->range.col0 = column;
-  sheet->range.rowi = psppire_axis_unit_count (sheet->vaxis) - 1;
-  sheet->range.coli = column;
-  sheet->active_cell.col = column;
-
-  g_signal_emit (sheet, sheet_signals[SELECT_COLUMN], 0, column);
-  psppire_sheet_real_select_range (sheet, NULL);
-}
-
-
 
 
 static gboolean
 psppire_sheet_range_isvisible (const PsppireSheet *sheet,
-                          const PsppireSheetRange *range)
+                              const PsppireSheetRange *range)
 {
   g_return_val_if_fail (sheet != NULL, FALSE);
 
@@ -1703,7 +1639,7 @@ psppire_sheet_range_isvisible (const PsppireSheet *sheet,
 
 static gboolean
 psppire_sheet_cell_isvisible (PsppireSheet *sheet,
-                         gint row, gint column)
+                             gint row, gint column)
 {
   PsppireSheetRange range;
 
@@ -1731,8 +1667,8 @@ psppire_sheet_get_visible_range (PsppireSheet *sheet, PsppireSheetRange *range)
 
 static gboolean
 psppire_sheet_set_scroll_adjustments (PsppireSheet *sheet,
-                                 GtkAdjustment *hadjustment,
-                                 GtkAdjustment *vadjustment)
+                                     GtkAdjustment *hadjustment,
+                                     GtkAdjustment *vadjustment)
 {
   if ( sheet->vadjustment != vadjustment )
     {
@@ -1836,7 +1772,7 @@ psppire_sheet_dispose  (GObject *object)
 
 static void
 psppire_sheet_style_set (GtkWidget *widget,
-                    GtkStyle *previous_style)
+                        GtkStyle *previous_style)
 {
   PsppireSheet *sheet;
 
@@ -1856,7 +1792,6 @@ psppire_sheet_style_set (GtkWidget *widget,
   set_entry_widget_font (sheet);
 }
 
-#define BORDER_WIDTH 3
 
 static void
 psppire_sheet_realize (GtkWidget *widget)
@@ -1964,7 +1899,10 @@ psppire_sheet_realize (GtkWidget *widget)
   values.foreground = widget->style->white;
   values.function = GDK_INVERT;
   values.subwindow_mode = GDK_INCLUDE_INFERIORS;
-  values.line_width = BORDER_WIDTH;
+  values.line_width = MAX (sheet->cell_padding->left,
+                          MAX (sheet->cell_padding->right,
+                               MAX (sheet->cell_padding->top,
+                                    sheet->cell_padding->bottom)));
 
   sheet->xor_gc = gdk_gc_new_with_values (widget->window,
                                          &values,
@@ -1974,13 +1912,15 @@ psppire_sheet_realize (GtkWidget *widget)
                                          GDK_GC_LINE_WIDTH
                                          );
 
-
   gtk_widget_set_parent_window (sheet->entry_widget, sheet->sheet_window);
   gtk_widget_set_parent (sheet->entry_widget, GTK_WIDGET (sheet));
 
   gtk_widget_set_parent_window (sheet->button, sheet->sheet_window);
   gtk_widget_set_parent (sheet->button, GTK_WIDGET (sheet));
 
+  sheet->button->style = gtk_style_attach (sheet->button->style,
+                                          sheet->sheet_window);
+
 
   sheet->cursor_drag = gdk_cursor_new_for_display (display, GDK_PLUS);
 
@@ -2116,8 +2056,8 @@ psppire_sheet_map (GtkWidget *widget)
 
       redraw_range (sheet, NULL);
       change_active_cell (sheet,
-                    sheet->active_cell.row,
-                    sheet->active_cell.col);
+                         sheet->active_cell.row,
+                         sheet->active_cell.col);
     }
 }
 
@@ -2138,11 +2078,9 @@ psppire_sheet_unmap (GtkWidget *widget)
     gdk_window_hide (sheet->row_title_window);
   gdk_window_hide (widget->window);
 
-  if (GTK_WIDGET_MAPPED (sheet->entry_widget))
-    gtk_widget_unmap (sheet->entry_widget);
-
-  if (GTK_WIDGET_MAPPED (sheet->button))
-    gtk_widget_unmap (sheet->button);
+  gtk_widget_unmap (sheet->entry_widget);
+  gtk_widget_unmap (sheet->button);
+  gtk_widget_unmap (sheet->hover_window->window);
 }
 
 /* get cell attributes of the given cell */
@@ -2249,7 +2187,7 @@ psppire_sheet_cell_draw (PsppireSheet *sheet, gint row, gint col)
       break;
     default:
       g_critical ("Unhandled justification %d in column %d\n",
-                attributes.justification, col);
+                 attributes.justification, col);
       break;
     }
 
@@ -2315,12 +2253,7 @@ draw_sheet_region (PsppireSheet *sheet, GdkRegion *region)
        psppire_sheet_cell_draw (sheet, i, j);
     }
 
-  if (sheet->state != PSPPIRE_SHEET_NORMAL &&
-      psppire_sheet_range_isvisible (sheet, &sheet->range))
-    psppire_sheet_range_draw_selection (sheet, drawing_range);
-
-
-  if (sheet->state == GTK_STATE_NORMAL &&
+  if (sheet->select_status == PSPPIRE_SHEET_NORMAL &&
       sheet->active_cell.row >= drawing_range.row0 &&
       sheet->active_cell.row <= drawing_range.rowi &&
       sheet->active_cell.col >= drawing_range.col0 &&
@@ -2329,68 +2262,6 @@ draw_sheet_region (PsppireSheet *sheet, GdkRegion *region)
 }
 
 
-static void
-psppire_sheet_range_draw_selection (PsppireSheet *sheet, PsppireSheetRange range)
-{
-  GdkRectangle area;
-  gint i, j;
-  PsppireSheetRange aux;
-
-  if (range.col0 > sheet->range.coli || range.coli < sheet->range.col0 ||
-      range.row0 > sheet->range.rowi || range.rowi < sheet->range.row0)
-    return;
-
-  if (!psppire_sheet_range_isvisible (sheet, &range)) return;
-  if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return;
-
-  aux = range;
-
-  range.col0 = MAX (sheet->range.col0, range.col0);
-  range.coli = MIN (sheet->range.coli, range.coli);
-  range.row0 = MAX (sheet->range.row0, range.row0);
-  range.rowi = MIN (sheet->range.rowi, range.rowi);
-
-  range.col0 = MAX (range.col0, min_visible_column (sheet));
-  range.coli = MIN (range.coli, max_visible_column (sheet));
-  range.row0 = MAX (range.row0, min_visible_row (sheet));
-  range.rowi = MIN (range.rowi, max_visible_row (sheet));
-
-  for (i = range.row0; i <= range.rowi; i++)
-    {
-      for (j = range.col0; j <= range.coli; j++)
-       {
-         if (psppire_sheet_cell_get_state (sheet, i, j) == GTK_STATE_SELECTED)
-           {
-             rectangle_from_cell (sheet, i, j, &area);
-
-             if (i == sheet->range.row0)
-               {
-                 area.y = area.y + 2;
-                 area.height = area.height - 2;
-               }
-             if (i == sheet->range.rowi) area.height = area.height - 3;
-             if (j == sheet->range.col0)
-               {
-                 area.x = area.x + 2;
-                 area.width = area.width - 2;
-               }
-             if (j == sheet->range.coli) area.width = area.width - 3;
-
-             if (i != sheet->active_cell.row || j != sheet->active_cell.col)
-               {
-                 gdk_draw_rectangle (sheet->sheet_window,
-                                     sheet->xor_gc,
-                                     TRUE,
-                                     area.x + 1, area.y + 1,
-                                     area.width, area.height);
-               }
-           }
-
-       }
-    }
-
-  psppire_sheet_draw_border (sheet, sheet->range);
-}
 
 static inline gint
 safe_strcmp (const gchar *s1, const gchar *s2)
@@ -2403,8 +2274,8 @@ safe_strcmp (const gchar *s1, const gchar *s2)
 
 static void
 psppire_sheet_set_cell (PsppireSheet *sheet, gint row, gint col,
-                   GtkJustification justification,
-                   const gchar *text)
+                       GtkJustification justification,
+                       const gchar *text)
 {
   PsppireSheetModel *model ;
   gchar *old_text ;
@@ -2491,51 +2362,15 @@ psppire_sheet_cell_get_text (const PsppireSheet *sheet, gint row, gint col)
 }
 
 
-static GtkStateType
-psppire_sheet_cell_get_state (PsppireSheet *sheet, gint row, gint col)
-{
-  gint state;
-  PsppireSheetRange *range;
-
-  g_return_val_if_fail (sheet != NULL, 0);
-  g_return_val_if_fail (PSPPIRE_IS_SHEET (sheet), 0);
-  if (col >= psppire_axis_unit_count (sheet->haxis) || row >= psppire_axis_unit_count (sheet->vaxis)) return 0;
-  if (col < 0 || row < 0) return 0;
-
-  state = sheet->state;
-  range = &sheet->range;
-
-  switch (state)
-    {
-    case PSPPIRE_SHEET_NORMAL:
-      return GTK_STATE_NORMAL;
-      break;
-    case PSPPIRE_SHEET_ROW_SELECTED:
-      if (row >= range->row0 && row <= range->rowi)
-       return GTK_STATE_SELECTED;
-      break;
-    case PSPPIRE_SHEET_COLUMN_SELECTED:
-      if (col >= range->col0 && col <= range->coli)
-       return GTK_STATE_SELECTED;
-      break;
-    case PSPPIRE_SHEET_RANGE_SELECTED:
-      if (row >= range->row0 && row <= range->rowi && \
-         col >= range->col0 && col <= range->coli)
-       return GTK_STATE_SELECTED;
-      break;
-    }
-  return GTK_STATE_NORMAL;
-}
-
 /* Convert X, Y (in pixels) to *ROW, *COLUMN
    If the function returns FALSE, then the results will be unreliable.
 */
 static gboolean
 psppire_sheet_get_pixel_info (PsppireSheet *sheet,
-                         gint x,
-                         gint y,
-                         gint *row,
-                         gint *column)
+                             gint x,
+                             gint y,
+                             gint *row,
+                             gint *column)
 {
   gint trow, tcol;
   *row = -G_MAXINT;
@@ -2593,9 +2428,9 @@ psppire_sheet_get_pixel_info (PsppireSheet *sheet,
 
 gboolean
 psppire_sheet_get_cell_area (PsppireSheet *sheet,
-                        gint row,
-                        gint column,
-                        GdkRectangle *area)
+                            gint row,
+                            gint column,
+                            GdkRectangle *area)
 {
   g_return_val_if_fail (sheet != NULL, 0);
   g_return_val_if_fail (PSPPIRE_IS_SHEET (sheet), 0);
@@ -2660,7 +2495,7 @@ entry_load_text (PsppireSheet *sheet)
   PsppireSheetCellAttr attributes;
 
   if (!GTK_WIDGET_VISIBLE (sheet->entry_widget)) return;
-  if (sheet->state != GTK_STATE_NORMAL) return;
+  if (sheet->select_status != PSPPIRE_SHEET_NORMAL) return;
 
   row = sheet->active_cell.row;
   col = sheet->active_cell.col;
@@ -2707,28 +2542,16 @@ change_active_cell (PsppireSheet *sheet, gint row, gint col)
        || col > psppire_axis_unit_count (sheet->haxis))
     return;
 
-  if (sheet->state != PSPPIRE_SHEET_NORMAL)
-    {
-      sheet->state = PSPPIRE_SHEET_NORMAL;
-      psppire_sheet_real_unselect_range (sheet, NULL);
-    }
-
   old_row = sheet->active_cell.row;
   old_col = sheet->active_cell.col;
 
-  /* Erase the old cell */
-  psppire_sheet_draw_active_cell (sheet);
-
   entry_load_text (sheet);
 
-  sheet->range.row0 = row;
-  sheet->range.col0 = col;
-  sheet->range.rowi = row;
-  sheet->range.coli = col;
+  /* Erase the old cell border */
+  psppire_sheet_draw_active_cell (sheet);
+
   sheet->active_cell.row = row;
   sheet->active_cell.col = col;
-  sheet->selection_cell.row = row;
-  sheet->selection_cell.col = col;
 
   PSPPIRE_SHEET_UNSET_FLAGS (sheet, PSPPIRE_SHEET_IN_SELECTION);
 
@@ -2762,7 +2585,7 @@ psppire_sheet_show_entry_widget (PsppireSheet *sheet)
     return;
 
   if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return;
-  if (sheet->state != PSPPIRE_SHEET_NORMAL) return;
+  if (sheet->select_status != PSPPIRE_SHEET_NORMAL) return;
   if (PSPPIRE_SHEET_IN_SELECTION (sheet)) return;
 
   GTK_WIDGET_SET_FLAGS (GTK_WIDGET (sheet->entry_widget), GTK_VISIBLE);
@@ -2784,28 +2607,28 @@ psppire_sheet_show_entry_widget (PsppireSheet *sheet)
       
       dispose_string (sheet, text);
 
-       {
-         switch (attributes.justification)
-           {
-           case GTK_JUSTIFY_RIGHT:
-             gtk_entry_set_alignment (GTK_ENTRY (sheet_entry), 1.0);
-             break;
-           case GTK_JUSTIFY_CENTER:
-             gtk_entry_set_alignment (GTK_ENTRY (sheet_entry), 0.5);
-             break;
-           case GTK_JUSTIFY_LEFT:
-           default:
-             gtk_entry_set_alignment (GTK_ENTRY (sheet_entry), 0.0);
-             break;
-           }
-       }
+      {
+       switch (attributes.justification)
+         {
+         case GTK_JUSTIFY_RIGHT:
+           gtk_entry_set_alignment (GTK_ENTRY (sheet_entry), 1.0);
+           break;
+         case GTK_JUSTIFY_CENTER:
+           gtk_entry_set_alignment (GTK_ENTRY (sheet_entry), 0.5);
+           break;
+         case GTK_JUSTIFY_LEFT:
+         default:
+           gtk_entry_set_alignment (GTK_ENTRY (sheet_entry), 0.0);
+           break;
+         }
+      }
     }
 
   psppire_sheet_size_allocate_entry (sheet);
 
   gtk_widget_set_sensitive (GTK_WIDGET (sheet_entry),
                            psppire_sheet_model_is_editable (sheet->model,
-                                                      row, col));
+                                                            row, col));
   gtk_widget_map (sheet->entry_widget);
 }
 
@@ -2834,270 +2657,100 @@ psppire_sheet_draw_active_cell (PsppireSheet *sheet)
 
 
 static void
-psppire_sheet_new_selection (PsppireSheet *sheet, PsppireSheetRange *range)
+psppire_sheet_draw_border (PsppireSheet *sheet, PsppireSheetRange new_range)
 {
-  gint i, j, mask1, mask2;
-  gint state, selected;
-  gint x, y, width, height;
-  PsppireSheetRange new_range, aux_range;
-
-  g_return_if_fail (sheet != NULL);
-
-  if (range == NULL) range=&sheet->range;
-
-  new_range=*range;
+  GdkRectangle area;
 
-  range->row0 = MIN (range->row0, sheet->range.row0);
-  range->rowi = MAX (range->rowi, sheet->range.rowi);
-  range->col0 = MIN (range->col0, sheet->range.col0);
-  range->coli = MAX (range->coli, sheet->range.coli);
+  rectangle_from_range (sheet, &new_range, &area);
 
-  range->row0 = MAX (range->row0, min_visible_row (sheet));
-  range->rowi = MIN (range->rowi, max_visible_row (sheet));
-  range->col0 = MAX (range->col0, min_visible_column (sheet));
-  range->coli = MIN (range->coli, max_visible_column (sheet));
+  area.width ++;
+  area.height ++;
 
-  aux_range.row0 = MAX (new_range.row0, min_visible_row (sheet));
-  aux_range.rowi = MIN (new_range.rowi, max_visible_row (sheet));
-  aux_range.col0 = MAX (new_range.col0, min_visible_column (sheet));
-  aux_range.coli = MIN (new_range.coli, max_visible_column (sheet));
+  gdk_gc_set_clip_rectangle (sheet->xor_gc, &area);
 
-  for (i = range->row0; i <= range->rowi; i++)
-    {
-      for (j = range->col0; j <= range->coli; j++)
-       {
+  area.x += sheet->cell_padding->left / 2;
+  area.y += sheet->cell_padding->top / 2;
+  area.width -= (sheet->cell_padding->left + sheet->cell_padding->right ) / 2;
+  area.height -= (sheet->cell_padding->top + sheet->cell_padding->bottom ) / 2;
 
-         state = psppire_sheet_cell_get_state (sheet, i, j);
-         selected= (i <= new_range.rowi && i >= new_range.row0 &&
-                    j <= new_range.coli && j >= new_range.col0) ? TRUE : FALSE;
+  gdk_draw_rectangle (sheet->sheet_window,  sheet->xor_gc,
+                     FALSE,
+                     area.x,
+                     area.y,
+                     area.width,
+                     area.height);
 
-         if (state == GTK_STATE_SELECTED && selected &&
-             (i == sheet->range.row0 || i == sheet->range.rowi ||
-              j == sheet->range.col0 || j == sheet->range.coli ||
-              i == new_range.row0 || i == new_range.rowi ||
-              j == new_range.col0 || j == new_range.coli))
-           {
+  gdk_gc_set_clip_rectangle (sheet->xor_gc, NULL);
+}
 
-             mask1 = i == sheet->range.row0 ? 1 : 0;
-             mask1 = i == sheet->range.rowi ? mask1 + 2 : mask1;
-             mask1 = j == sheet->range.col0 ? mask1 + 4 : mask1;
-             mask1 = j == sheet->range.coli ? mask1 + 8 : mask1;
-
-             mask2 = i == new_range.row0 ? 1 : 0;
-             mask2 = i == new_range.rowi ? mask2 + 2 : mask2;
-             mask2 = j == new_range.col0 ? mask2 + 4 : mask2;
-             mask2 = j == new_range.coli ? mask2 + 8 : mask2;
-
-             if (mask1 != mask2)
-               {
-                 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)
-                   {
-                     y = y - 3;
-                     height = height + 3;
-                   }
-                 if (i == sheet->range.rowi) height = height + 3;
-                 if (j == sheet->range.col0)
-                   {
-                     x = x - 3;
-                     width = width + 3;
-                   }
-                 if (j == sheet->range.coli) width = width + 3;
-
-                 if (i != sheet->active_cell.row || j != sheet->active_cell.col)
-                   {
-                     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)
-                       {
-                         y = y+2;
-                         height = height - 2;
-                       }
-                     if (i == new_range.rowi) height = height - 3;
-                     if (j == new_range.col0)
-                       {
-                         x = x+2;
-                         width = width - 2;
-                       }
-                     if (j == new_range.coli) width = width - 3;
-
-                     gdk_draw_rectangle (sheet->sheet_window,
-                                         sheet->xor_gc,
-                                         TRUE,
-                                         x + 1, y + 1,
-                                         width, height);
-                   }
-               }
-           }
-       }
-    }
+\f
 
-  for (i = range->row0; i <= range->rowi; i++)
-    {
-      for (j = range->col0; j <= range->coli; j++)
-       {
+/* Selection related functions */
 
-         state = psppire_sheet_cell_get_state (sheet, i, j);
-         selected= (i <= new_range.rowi && i >= new_range.row0 &&
-                    j <= new_range.coli && j >= new_range.col0) ? TRUE : FALSE;
+void
+psppire_sheet_select_row (PsppireSheet *sheet,  gint row)
+{
+  GdkRectangle area;
+  sheet->select_status = PSPPIRE_SHEET_ROW_SELECTED;
 
-         if (state == GTK_STATE_SELECTED && !selected)
-           {
+  sheet->range.col0 = sheet->range.coli = -1;
+  sheet->range.row0 = sheet->range.rowi = row;
 
-             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)
-               {
-                 y = y - 3;
-                 height = height + 3;
-               }
-             if (i == sheet->range.rowi) height = height + 3;
-             if (j == sheet->range.col0)
-               {
-                 x = x - 3;
-                 width = width + 3;
-               }
-             if (j == sheet->range.coli) width = width + 3;
+  rectangle_from_range (sheet, &sheet->range, &area);
+  area.x++;
+  area.y++;
 
-           }
-       }
-    }
+  gdk_window_invalidate_rect (sheet->sheet_window, &area, FALSE);
+}
 
-  for (i = range->row0; i <= range->rowi; i++)
-    {
-      for (j = range->col0; j <= range->coli; j++)
-       {
+void
+psppire_sheet_select_column (PsppireSheet *sheet,  gint column)
+{
+  GdkRectangle area;
+  sheet->select_status = PSPPIRE_SHEET_COLUMN_SELECTED;
 
-         state = psppire_sheet_cell_get_state (sheet, i, j);
-         selected= (i <= new_range.rowi && i >= new_range.row0 &&
-                    j <= new_range.coli && j >= new_range.col0) ? TRUE : FALSE;
+  sheet->range.col0 = sheet->range.coli = column;
+  sheet->range.row0 = sheet->range.rowi = -1;
 
-         if (state != GTK_STATE_SELECTED && selected &&
-             (i != sheet->active_cell.row || j != sheet->active_cell.col))
-           {
+  rectangle_from_range (sheet, &sheet->range, &area);
+  area.x++;
+  area.y++;
 
-             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)
-               {
-                 y = y+2;
-                 height = height - 2;
-               }
-             if (i == new_range.rowi) height = height - 3;
-             if (j == new_range.col0)
-               {
-                 x = x+2;
-                 width = width - 2;
-               }
-             if (j == new_range.coli) width = width - 3;
-
-             gdk_draw_rectangle (sheet->sheet_window,
-                                 sheet->xor_gc,
-                                 TRUE,
-                                 x + 1, y + 1,
-                                 width, height);
+  gdk_window_invalidate_rect (sheet->sheet_window, &area, FALSE);
+}
 
-           }
 
-       }
-    }
+void
+psppire_sheet_select_range (PsppireSheet *sheet, const PsppireSheetRange *range)
+{
+  GdkRectangle area;
+  sheet->select_status = PSPPIRE_SHEET_RANGE_SELECTED;
 
-  for (i = aux_range.row0; i <= aux_range.rowi; i++)
-    {
-      for (j = aux_range.col0; j <= aux_range.coli; j++)
-       {
-         state = psppire_sheet_cell_get_state (sheet, i, j);
-
-         mask1 = i == sheet->range.row0 ? 1 : 0;
-         mask1 = i == sheet->range.rowi ? mask1 + 2 : mask1;
-         mask1 = j == sheet->range.col0 ? mask1 + 4 : mask1;
-         mask1 = j == sheet->range.coli ? mask1 + 8 : mask1;
-
-         mask2 = i == new_range.row0 ? 1 : 0;
-         mask2 = i == new_range.rowi ? mask2 + 2 : mask2;
-         mask2 = j == new_range.col0 ? mask2 + 4 : mask2;
-         mask2 = j == new_range.coli ? mask2 + 8 : mask2;
-         if (mask2 != mask1 || (mask2 == mask1 && state != GTK_STATE_SELECTED))
-           {
-             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)
-               gdk_draw_rectangle (sheet->sheet_window,
-                                   sheet->xor_gc,
-                                   TRUE,
-                                   x + 1, y - 1,
-                                   width, 3);
-
-
-             if (mask2 & 2)
-               gdk_draw_rectangle (sheet->sheet_window,
-                                   sheet->xor_gc,
-                                   TRUE,
-                                   x + 1, y + height - 1,
-                                   width, 3);
-
-             if (mask2 & 4)
-               gdk_draw_rectangle (sheet->sheet_window,
-                                   sheet->xor_gc,
-                                   TRUE,
-                                   x - 1, y + 1,
-                                   3, height);
-
-
-             if (mask2 & 8)
-               gdk_draw_rectangle (sheet->sheet_window,
-                                   sheet->xor_gc,
-                                   TRUE,
-                                   x + width - 1, y + 1,
-                                   3, height);
-           }
-       }
-    }
+  sheet->range = *range;
 
-  *range = new_range;
+  rectangle_from_range (sheet, range, &area);
+  area.x++;
+  area.y++;
+  gdk_window_invalidate_rect (sheet->sheet_window, &area, FALSE);
 }
 
 
-
-static void
-psppire_sheet_draw_border (PsppireSheet *sheet, PsppireSheetRange new_range)
+void
+psppire_sheet_unselect_range (PsppireSheet *sheet)
 {
   GdkRectangle area;
+  sheet->select_status = PSPPIRE_SHEET_NORMAL;
 
-  rectangle_from_range (sheet, &new_range, &area);
-
-  gdk_draw_rectangle (sheet->sheet_window,
-                     sheet->xor_gc,
-                     FALSE,
-                     area.x, area.y,
-                     area.width, area.height);
+  rectangle_from_range (sheet, &sheet->range, &area);
+  area.x++;
+  area.y++;
+  gdk_window_invalidate_rect (sheet->sheet_window, &area, FALSE);        
 }
 
-
 static void
 psppire_sheet_real_select_range (PsppireSheet *sheet,
-                            const PsppireSheetRange *range)
+                                const PsppireSheetRange *range)
 {
-  gint state;
-
   g_return_if_fail (sheet != NULL);
 
   if (range == NULL) range = &sheet->range;
@@ -3107,20 +2760,6 @@ psppire_sheet_real_select_range (PsppireSheet *sheet,
   if (range->row0 < 0 || range->rowi < 0) return;
   if (range->col0 < 0 || range->coli < 0) return;
 
-  state = sheet->state;
-
-#if 0
-  if (range->coli != sheet->range.coli || range->col0 != sheet->range.col0 ||
-      range->rowi != sheet->range.rowi || range->row0 != sheet->range.row0)
-    {
-      psppire_sheet_new_selection (sheet, &sheet->range);
-    }
-  else
-    {
-      psppire_sheet_range_draw_selection (sheet, sheet->range);
-    }
-#endif
-
   psppire_sheet_update_primary_selection (sheet);
 
   g_signal_emit (sheet, sheet_signals[SELECT_RANGE], 0, &sheet->range);
@@ -3133,75 +2772,10 @@ psppire_sheet_get_selected_range (PsppireSheet *sheet, PsppireSheetRange *range)
   g_return_if_fail (sheet != NULL);
   *range = sheet->range;
 }
-
-
-void
-psppire_sheet_select_range (PsppireSheet *sheet, const PsppireSheetRange *range)
-{
-  g_return_if_fail (sheet != NULL);
-
-  if (range == NULL) range=&sheet->range;
-
-  if (range->row0 < 0 || range->rowi < 0) return;
-  if (range->col0 < 0 || range->coli < 0) return;
-
-
-  if (sheet->state != PSPPIRE_SHEET_NORMAL)
-    psppire_sheet_real_unselect_range (sheet, NULL);
-
-  sheet->range.row0 = range->row0;
-  sheet->range.rowi = range->rowi;
-  sheet->range.col0 = range->col0;
-  sheet->range.coli = range->coli;
-  sheet->active_cell.row = range->row0;
-  sheet->active_cell.col = range->col0;
-  sheet->selection_cell.row = range->rowi;
-  sheet->selection_cell.col = range->coli;
-
-  sheet->state = PSPPIRE_SHEET_RANGE_SELECTED;
-  psppire_sheet_real_select_range (sheet, NULL);
-}
-
-void
-psppire_sheet_unselect_range (PsppireSheet *sheet)
-{
-  if (! GTK_WIDGET_REALIZED (GTK_WIDGET (sheet)))
-    return;
-
-  psppire_sheet_real_unselect_range (sheet, NULL);
-  sheet->state = GTK_STATE_NORMAL;
-
-  change_active_cell (sheet,
-                sheet->active_cell.row, sheet->active_cell.col);
-}
-
-
-static void
-psppire_sheet_real_unselect_range (PsppireSheet *sheet,
-                              const PsppireSheetRange *range)
-{
-  g_return_if_fail (sheet != NULL);
-  g_return_if_fail (GTK_WIDGET_REALIZED (GTK_WIDGET (sheet)));
-
-  if ( range == NULL)
-    range = &sheet->range;
-
-  if (range->row0 < 0 || range->rowi < 0) return;
-  if (range->col0 < 0 || range->coli < 0) return;
-
-  g_signal_emit (sheet, sheet_signals[SELECT_COLUMN], 0, -1);
-  g_signal_emit (sheet, sheet_signals[SELECT_ROW], 0, -1);
-
-  sheet->range.row0 = -1;
-  sheet->range.rowi = -1;
-  sheet->range.col0 = -1;
-  sheet->range.coli = -1;
-}
-
+\f
 
 static gint
-psppire_sheet_expose (GtkWidget *widget,
-                 GdkEventExpose *event)
+psppire_sheet_expose (GtkWidget *widget, GdkEventExpose *event)
 {
   PsppireSheet *sheet = PSPPIRE_SHEET (widget);
 
@@ -3231,21 +2805,34 @@ psppire_sheet_expose (GtkWidget *widget,
     {
       draw_sheet_region (sheet, event->region);
 
-#if 0
-      if (sheet->state != PSPPIRE_SHEET_NORMAL)
+      if (sheet->select_status != PSPPIRE_SHEET_NORMAL)
        {
+#if 0
          if (psppire_sheet_range_isvisible (sheet, &sheet->range))
            psppire_sheet_range_draw (sheet, &sheet->range);
 
          if (PSPPIRE_SHEET_IN_RESIZE (sheet) || PSPPIRE_SHEET_IN_DRAG (sheet))
            psppire_sheet_range_draw (sheet, &sheet->drag_range);
+#endif
 
-         if (psppire_sheet_range_isvisible (sheet, &sheet->range))
-           psppire_sheet_range_draw_selection (sheet, sheet->range);
+           {
+             GdkRectangle area;
+
+             rectangle_from_range (sheet, &sheet->range, &area);
+             
+             gdk_draw_rectangle (sheet->sheet_window,
+                                 sheet->xor_gc,
+                                 TRUE,
+                                 area.x + 1, area.y + 1,
+                                 area.width, area.height);
+           }
+
+#if 0
          if (PSPPIRE_SHEET_IN_RESIZE (sheet) || PSPPIRE_SHEET_IN_DRAG (sheet))
            draw_xor_rectangle (sheet, sheet->drag_range);
-       }
 #endif
+       }
+
 
       if ((!PSPPIRE_SHEET_IN_XDRAG (sheet)) && (!PSPPIRE_SHEET_IN_YDRAG (sheet)))
        {
@@ -3272,14 +2859,13 @@ psppire_sheet_expose (GtkWidget *widget,
 
 
 static gboolean
-psppire_sheet_button_press (GtkWidget *widget,
-                       GdkEventButton *event)
+psppire_sheet_button_press (GtkWidget *widget, GdkEventButton *event)
 {
   PsppireSheet *sheet;
   GdkModifierType mods;
   gint x, y;
   gint  row, column;
-  gboolean veto;
+
 
   g_return_val_if_fail (widget != NULL, FALSE);
   g_return_val_if_fail (PSPPIRE_IS_SHEET (widget), FALSE);
@@ -3312,7 +2898,8 @@ psppire_sheet_button_press (GtkWidget *widget,
                           sheet_signals[DOUBLE_CLICK_COLUMN], 0, column);
        }
     }
-  else if (event->window == sheet->row_title_window)
+  
+  if (event->window == sheet->row_title_window)
     {
       g_signal_emit (sheet,
                     sheet_signals[BUTTON_EVENT_ROW], 0,
@@ -3383,65 +2970,16 @@ psppire_sheet_button_press (GtkWidget *widget,
                        NULL, NULL, event->time);
       gtk_grab_add (GTK_WIDGET (sheet));
 
-      if (sheet->selection_mode != GTK_SELECTION_SINGLE &&
-         sheet->selection_mode != GTK_SELECTION_NONE &&
-         sheet->cursor_drag->type == GDK_SIZING &&
-         !PSPPIRE_SHEET_IN_SELECTION (sheet) && !PSPPIRE_SHEET_IN_RESIZE (sheet))
+      if ( sheet->select_status == PSPPIRE_SHEET_NORMAL)
        {
-         if (sheet->state == GTK_STATE_NORMAL)
-           {
-             row = sheet->active_cell.row;
-             column = sheet->active_cell.col;
-             sheet->active_cell.row = row;
-             sheet->active_cell.col = column;
-             sheet->drag_range = sheet->range;
-             sheet->state = PSPPIRE_SHEET_RANGE_SELECTED;
-             psppire_sheet_select_range (sheet, &sheet->drag_range);
-           }
-         sheet->x_drag = x;
-         sheet->y_drag = y;
-         if (row > sheet->range.rowi) row--;
-         if (column > sheet->range.coli) column--;
-         sheet->drag_cell.row = row;
-         sheet->drag_cell.col = column;
-         sheet->drag_range = sheet->range;
-         draw_xor_rectangle (sheet, sheet->drag_range);
-         PSPPIRE_SHEET_SET_FLAGS (sheet, PSPPIRE_SHEET_IN_RESIZE);
-       }
-      else if (sheet->cursor_drag->type == GDK_TOP_LEFT_ARROW &&
-              !PSPPIRE_SHEET_IN_SELECTION (sheet)
-              && ! PSPPIRE_SHEET_IN_DRAG (sheet)
-              && sheet->active_cell.row >= 0
-              && sheet->active_cell.col >= 0
-              )
-       {
-         if (sheet->state == GTK_STATE_NORMAL)
-           {
-             row = sheet->active_cell.row;
-             column = sheet->active_cell.col;
-             sheet->active_cell.row = row;
-             sheet->active_cell.col = column;
-             sheet->drag_range = sheet->range;
-             sheet->state = PSPPIRE_SHEET_RANGE_SELECTED;
-             psppire_sheet_select_range (sheet, &sheet->drag_range);
-           }
-         sheet->x_drag = x;
-         sheet->y_drag = y;
-         if (row < sheet->range.row0) row++;
-         if (row > sheet->range.rowi) row--;
-         if (column < sheet->range.col0) column++;
-         if (column > sheet->range.coli) column--;
-         sheet->drag_cell.row = row;
-         sheet->drag_cell.col = column;
-         sheet->drag_range = sheet->range;
-         draw_xor_rectangle (sheet, sheet->drag_range);
-         PSPPIRE_SHEET_SET_FLAGS (sheet, PSPPIRE_SHEET_IN_DRAG);
+         sheet->range.row0 = row;
+         sheet->range.col0 = column;
        }
       else
        {
-         veto = psppire_sheet_click_cell (sheet, row, column);
-         if (veto) PSPPIRE_SHEET_SET_FLAGS (sheet, PSPPIRE_SHEET_IN_SELECTION);
+         psppire_sheet_unselect_range (sheet);
        }
+      psppire_sheet_click_cell (sheet, row, column);
     }
 
   if (event->window == sheet->column_title_window)
@@ -3456,7 +2994,6 @@ psppire_sheet_button_press (GtkWidget *widget,
 
       if (psppire_sheet_model_get_column_sensitivity (sheet->model, column))
        {
-         veto = psppire_sheet_click_cell (sheet, -1, column);
          gtk_grab_add (GTK_WIDGET (sheet));
          PSPPIRE_SHEET_SET_FLAGS (sheet, PSPPIRE_SHEET_IN_SELECTION);
        }
@@ -3473,7 +3010,6 @@ psppire_sheet_button_press (GtkWidget *widget,
       row = row_from_ypixel (sheet, y);
       if (psppire_sheet_model_get_row_sensitivity (sheet->model, row))
        {
-         veto = psppire_sheet_click_cell (sheet, row, -1);
          gtk_grab_add (GTK_WIDGET (sheet));
          PSPPIRE_SHEET_SET_FLAGS (sheet, PSPPIRE_SHEET_IN_SELECTION);
        }
@@ -3504,7 +3040,7 @@ psppire_sheet_click_cell (PsppireSheet *sheet, gint row, gint column)
 
   if (forbid_move)
     {
-      if (sheet->state == GTK_STATE_NORMAL)
+      if (sheet->select_status == PSPPIRE_SHEET_NORMAL)
        return FALSE;
 
       row = sheet->active_cell.row;
@@ -3533,32 +3069,12 @@ psppire_sheet_click_cell (PsppireSheet *sheet, gint row, gint column)
       sheet->range.rowi = psppire_axis_unit_count (sheet->vaxis) - 1;
       sheet->range.coli =
        psppire_axis_unit_count (sheet->haxis) - 1;
-      sheet->active_cell.row = 0;
-      sheet->active_cell.col = 0;
       psppire_sheet_select_range (sheet, NULL);
       return TRUE;
     }
 
-  if (sheet->state != PSPPIRE_SHEET_NORMAL)
-    {
-      sheet->state = PSPPIRE_SHEET_NORMAL;
-      psppire_sheet_real_unselect_range (sheet, NULL);
-    }
-  else
-    {
-      change_active_cell (sheet, row, column);
-    }
-
-  sheet->active_cell.row = row;
-  sheet->active_cell.col = column;
-  sheet->selection_cell.row = row;
-  sheet->selection_cell.col = column;
-  sheet->range.row0 = row;
-  sheet->range.col0 = column;
-  sheet->range.rowi = row;
-  sheet->range.coli = column;
-  sheet->state = PSPPIRE_SHEET_NORMAL;
-  PSPPIRE_SHEET_SET_FLAGS (sheet, PSPPIRE_SHEET_IN_SELECTION);
+  if (sheet->select_status == PSPPIRE_SHEET_NORMAL)
+    change_active_cell (sheet, row, column);
 
   gtk_widget_grab_focus (GTK_WIDGET (sheet->entry_widget));
 
@@ -3567,7 +3083,7 @@ psppire_sheet_click_cell (PsppireSheet *sheet, gint row, gint column)
 
 static gint
 psppire_sheet_button_release (GtkWidget *widget,
-                         GdkEventButton *event)
+                             GdkEventButton *event)
 {
   GdkDisplay *display = gtk_widget_get_display (widget);
 
@@ -3617,16 +3133,8 @@ psppire_sheet_button_release (GtkWidget *widget,
       PSPPIRE_SHEET_UNSET_FLAGS (sheet, PSPPIRE_SHEET_IN_DRAG);
       gdk_display_pointer_ungrab (display, event->time);
 
-      psppire_sheet_real_unselect_range (sheet, NULL);
+      psppire_sheet_unselect_range (sheet);
 
-      sheet->active_cell.row = sheet->active_cell.row +
-       (sheet->drag_range.row0 - sheet->range.row0);
-      sheet->active_cell.col = sheet->active_cell.col +
-       (sheet->drag_range.col0 - sheet->range.col0);
-      sheet->selection_cell.row = sheet->selection_cell.row +
-       (sheet->drag_range.row0 - sheet->range.row0);
-      sheet->selection_cell.col = sheet->selection_cell.col +
-       (sheet->drag_range.col0 - sheet->range.col0);
       old_range = sheet->range;
       sheet->range = sheet->drag_range;
       sheet->drag_range = old_range;
@@ -3642,40 +3150,30 @@ psppire_sheet_button_release (GtkWidget *widget,
       PSPPIRE_SHEET_UNSET_FLAGS (sheet, PSPPIRE_SHEET_IN_RESIZE);
       gdk_display_pointer_ungrab (display, event->time);
 
-      psppire_sheet_real_unselect_range (sheet, NULL);
-
-      sheet->active_cell.row = sheet->active_cell.row +
-       (sheet->drag_range.row0 - sheet->range.row0);
-      sheet->active_cell.col = sheet->active_cell.col +
-       (sheet->drag_range.col0 - sheet->range.col0);
-      if (sheet->drag_range.row0 < sheet->range.row0)
-       sheet->selection_cell.row = sheet->drag_range.row0;
-      if (sheet->drag_range.rowi >= sheet->range.rowi)
-       sheet->selection_cell.row = sheet->drag_range.rowi;
-      if (sheet->drag_range.col0 < sheet->range.col0)
-       sheet->selection_cell.col = sheet->drag_range.col0;
-      if (sheet->drag_range.coli >= sheet->range.coli)
-       sheet->selection_cell.col = sheet->drag_range.coli;
+      psppire_sheet_unselect_range (sheet);
+
       old_range = sheet->range;
       sheet->range = sheet->drag_range;
       sheet->drag_range = old_range;
 
-      if (sheet->state == GTK_STATE_NORMAL) sheet->state = PSPPIRE_SHEET_RANGE_SELECTED;
+      if (sheet->select_status == PSPPIRE_SHEET_NORMAL) 
+       sheet->select_status = PSPPIRE_SHEET_RANGE_SELECTED;
+
       g_signal_emit (sheet, sheet_signals[RESIZE_RANGE], 0,
                     &sheet->drag_range, &sheet->range);
       psppire_sheet_select_range (sheet, &sheet->range);
     }
 
-  if (sheet->state == PSPPIRE_SHEET_NORMAL && PSPPIRE_SHEET_IN_SELECTION (sheet))
+  if (PSPPIRE_SHEET_IN_SELECTION (sheet))
     {
       PSPPIRE_SHEET_UNSET_FLAGS (sheet, PSPPIRE_SHEET_IN_SELECTION);
-      gdk_display_pointer_ungrab (display, event->time);
+      sheet->select_status = PSPPIRE_SHEET_RANGE_SELECTED;
+
       change_active_cell (sheet, sheet->active_cell.row,
-                              sheet->active_cell.col);
+                         sheet->active_cell.col);
     }
 
-  if (PSPPIRE_SHEET_IN_SELECTION)
-    gdk_display_pointer_ungrab (display, event->time);
+  gdk_display_pointer_ungrab (display, event->time);
   gtk_grab_remove (GTK_WIDGET (sheet));
 
   PSPPIRE_SHEET_UNSET_FLAGS (sheet, PSPPIRE_SHEET_IN_SELECTION);
@@ -3752,7 +3250,8 @@ create_hover_window (void)
 #define HOVER_WINDOW_Y_OFFSET 2
 
 static void
-show_subtitle (PsppireSheet *sheet, gint row, gint column, const gchar *subtitle)
+show_subtitle (PsppireSheet *sheet, gint row, gint column,
+              const gchar *subtitle)
 {
   gint x, y;
   gint px, py;
@@ -3802,6 +3301,8 @@ motion_timeout_callback (gpointer data)
   PsppireSheet *sheet = PSPPIRE_SHEET (data);
   gint x, y;
   gint row, column;
+
+  gdk_threads_enter ();
   gtk_widget_get_pointer (GTK_WIDGET (sheet), &x, &y);
 
   if ( psppire_sheet_get_pixel_info (sheet, x, y, &row, &column) )
@@ -3817,7 +3318,7 @@ motion_timeout_callback (gpointer data)
       if (sheet->column_title_under && column >= 0)
        {
          gchar *text = psppire_sheet_model_get_column_subtitle (sheet->model,
-                                                          column);
+                                                                column);
 
          show_subtitle (sheet, -1, column, text);
 
@@ -3825,6 +3326,7 @@ motion_timeout_callback (gpointer data)
        }
     }
 
+  gdk_threads_leave ();
   return FALSE;
 }
 
@@ -4001,8 +3503,8 @@ psppire_sheet_motion (GtkWidget *widget,  GdkEventMotion *event)
       PsppireSheetRange aux;
       column = column_from_xpixel (sheet, x)- sheet->drag_cell.col;
       row = row_from_ypixel (sheet, y) - sheet->drag_cell.row;
-      if (sheet->state == PSPPIRE_SHEET_COLUMN_SELECTED) row = 0;
-      if (sheet->state == PSPPIRE_SHEET_ROW_SELECTED) column = 0;
+      if (sheet->select_status == PSPPIRE_SHEET_COLUMN_SELECTED) row = 0;
+      if (sheet->select_status == PSPPIRE_SHEET_ROW_SELECTED) column = 0;
       sheet->x_drag = x;
       sheet->y_drag = y;
       aux = sheet->range;
@@ -4064,8 +3566,8 @@ psppire_sheet_motion (GtkWidget *widget,  GdkEventMotion *event)
            row +=1;
        }
 
-      if (sheet->state == PSPPIRE_SHEET_COLUMN_SELECTED) row = 0;
-      if (sheet->state == PSPPIRE_SHEET_ROW_SELECTED) column = 0;
+      if (sheet->select_status == PSPPIRE_SHEET_COLUMN_SELECTED) row = 0;
+      if (sheet->select_status == PSPPIRE_SHEET_ROW_SELECTED) column = 0;
       sheet->x_drag = x;
       sheet->y_drag = y;
       aux = sheet->range;
@@ -4100,18 +3602,34 @@ psppire_sheet_motion (GtkWidget *widget,  GdkEventMotion *event)
 
   psppire_sheet_get_pixel_info (sheet, x, y, &row, &column);
 
-  if (sheet->state == PSPPIRE_SHEET_NORMAL && row == sheet->active_cell.row &&
+  if (sheet->select_status == PSPPIRE_SHEET_NORMAL && row == sheet->active_cell.row &&
       column == sheet->active_cell.col) return TRUE;
 
-  if (PSPPIRE_SHEET_IN_SELECTION (sheet) && mods&GDK_BUTTON1_MASK)
-    psppire_sheet_extend_selection (sheet, row, column);
+  if ( mods & GDK_BUTTON1_MASK)
+    {
+      if (PSPPIRE_SHEET_IN_SELECTION (sheet) )
+       {
+         /* Redraw the old range */
+         psppire_sheet_unselect_range (sheet);
+
+         sheet->range.rowi = row;
+         sheet->range.coli = column;
+
+         /* Redraw the new range */
+         psppire_sheet_select_range (sheet, &sheet->range);
+       }
+      else
+       {
+         PSPPIRE_SHEET_SET_FLAGS (sheet, PSPPIRE_SHEET_IN_SELECTION);
+       }
+    }
 
   return TRUE;
 }
 
 static gboolean
 psppire_sheet_crossing_notify (GtkWidget *widget,
-                          GdkEventCrossing *event)
+                              GdkEventCrossing *event)
 {
   PsppireSheet *sheet = PSPPIRE_SHEET (widget);
 
@@ -4120,6 +3638,9 @@ psppire_sheet_crossing_notify (GtkWidget *widget,
   else if (event->window == sheet->row_title_window)
     sheet->row_title_under = event->type == GDK_ENTER_NOTIFY;
 
+  if (event->type == GDK_LEAVE_NOTIFY)
+    gtk_widget_hide (sheet->hover_window->window);
+
   return TRUE;
 }
 
@@ -4136,63 +3657,10 @@ psppire_sheet_focus_in (GtkWidget     *w,
 }
 
 
-static void
-psppire_sheet_extend_selection (PsppireSheet *sheet, gint row, gint column)
-{
-  PsppireSheetRange range;
-  gint state;
-  gint r, c;
-
-  if (row == sheet->selection_cell.row && column == sheet->selection_cell.col)
-    return;
-
-  if (sheet->selection_mode == GTK_SELECTION_SINGLE) return;
-
-  gtk_widget_grab_focus (GTK_WIDGET (sheet));
-
-  if (PSPPIRE_SHEET_IN_DRAG (sheet)) return;
-
-  state = sheet->state;
-
-  switch (sheet->state)
-    {
-    case PSPPIRE_SHEET_ROW_SELECTED:
-      column = psppire_axis_unit_count (sheet->haxis) - 1;
-      break;
-    case PSPPIRE_SHEET_COLUMN_SELECTED:
-      row = psppire_axis_unit_count (sheet->vaxis) - 1;
-      break;
-    case PSPPIRE_SHEET_NORMAL:
-      sheet->state = PSPPIRE_SHEET_RANGE_SELECTED;
-      r = sheet->active_cell.row;
-      c = sheet->active_cell.col;
-      sheet->range.col0 = c;
-      sheet->range.row0 = r;
-      sheet->range.coli = c;
-      sheet->range.rowi = r;
-      psppire_sheet_range_draw_selection (sheet, sheet->range);
-    case PSPPIRE_SHEET_RANGE_SELECTED:
-      sheet->state = PSPPIRE_SHEET_RANGE_SELECTED;
-    }
-
-  sheet->selection_cell.row = row;
-  sheet->selection_cell.col = column;
-
-  range.col0 = MIN (column, sheet->active_cell.col);
-  range.coli = MAX (column, sheet->active_cell.col);
-  range.row0 = MIN (row, sheet->active_cell.row);
-  range.rowi = MAX (row, sheet->active_cell.row);
-
-  if (range.row0 != sheet->range.row0 || range.rowi != sheet->range.rowi ||
-      range.col0 != sheet->range.col0 || range.coli != sheet->range.coli ||
-      state == PSPPIRE_SHEET_NORMAL)
-    psppire_sheet_real_select_range (sheet, &range);
-
-}
 
 static gint
 psppire_sheet_entry_key_press (GtkWidget *widget,
-                          GdkEventKey *key)
+                              GdkEventKey *key)
 {
   gboolean focus;
   g_signal_emit_by_name (widget, "key_press_event", key, &focus);
@@ -4213,7 +3681,7 @@ page_vertical (PsppireSheet *sheet, GtkScrollType dir)
   gint new_row;
 
   vpixel -= psppire_axis_start_pixel (sheet->vaxis,
-                                    min_visible_row (sheet));
+                                     min_visible_row (sheet));
 
   switch ( dir)
     {
@@ -4235,12 +3703,12 @@ page_vertical (PsppireSheet *sheet, GtkScrollType dir)
 
 
   vpixel += psppire_axis_start_pixel (sheet->vaxis,
-                                    min_visible_row (sheet));
+                                     min_visible_row (sheet));
 
   new_row =  row_from_ypixel (sheet, vpixel);
 
   change_active_cell (sheet, new_row,
-                          sheet->active_cell.col);
+                     sheet->active_cell.col);
 }
 
 
@@ -4317,7 +3785,7 @@ step_sheet (PsppireSheet *sheet, GtkScrollType dir)
     {
       glong hpos  =
        psppire_axis_start_pixel (sheet->haxis,
-                                   new_cell.col + 1);
+                                 new_cell.col + 1);
       hpos -= sheet->hadjustment->page_size;
 
       gtk_adjustment_set_value (sheet->hadjustment,
@@ -4327,7 +3795,7 @@ step_sheet (PsppireSheet *sheet, GtkScrollType dir)
     {
       glong hpos  =
        psppire_axis_start_pixel (sheet->haxis,
-                                   new_cell.col);
+                                 new_cell.col);
 
       gtk_adjustment_set_value (sheet->hadjustment,
                                hpos);
@@ -4338,7 +3806,7 @@ step_sheet (PsppireSheet *sheet, GtkScrollType dir)
     {
       glong vpos  =
        psppire_axis_start_pixel (sheet->vaxis,
-                                   new_cell.row + 1);
+                                 new_cell.row + 1);
       vpos -= sheet->vadjustment->page_size;
 
       gtk_adjustment_set_value (sheet->vadjustment,
@@ -4348,7 +3816,7 @@ step_sheet (PsppireSheet *sheet, GtkScrollType dir)
     {
       glong vpos  =
        psppire_axis_start_pixel (sheet->vaxis,
-                                   new_cell.row);
+                                 new_cell.row);
 
       gtk_adjustment_set_value (sheet->vadjustment,
                                vpos);
@@ -4360,7 +3828,7 @@ step_sheet (PsppireSheet *sheet, GtkScrollType dir)
 
 static gboolean
 psppire_sheet_key_press (GtkWidget *widget,
-                    GdkEventKey *key)
+                        GdkEventKey *key)
 {
   PsppireSheet *sheet = PSPPIRE_SHEET (widget);
 
@@ -4400,7 +3868,7 @@ psppire_sheet_key_press (GtkWidget *widget,
                                sheet->vadjustment->lower);
 
       change_active_cell (sheet,  0,
-                              sheet->active_cell.col);
+                         sheet->active_cell.col);
 
       break;
 
@@ -4429,7 +3897,7 @@ psppire_sheet_key_press (GtkWidget *widget,
 
 static void
 psppire_sheet_size_request (GtkWidget *widget,
-                       GtkRequisition *requisition)
+                           GtkRequisition *requisition)
 {
   PsppireSheet *sheet;
 
@@ -4454,7 +3922,7 @@ psppire_sheet_size_request (GtkWidget *widget,
 
 static void
 psppire_sheet_size_allocate (GtkWidget *widget,
-                        GtkAllocation *allocation)
+                            GtkAllocation *allocation)
 {
   PsppireSheet *sheet;
   GtkAllocation sheet_allocation;
@@ -4646,8 +4114,8 @@ psppire_sheet_size_allocate_entry (PsppireSheet *sheet)
   sheet_entry = psppire_sheet_get_entry (sheet);
 
   if ( ! psppire_sheet_get_attributes (sheet, sheet->active_cell.row,
-                                  sheet->active_cell.col,
-                                  &attributes) )
+                                      sheet->active_cell.col,
+                                      &attributes) )
     return ;
 
   if ( GTK_WIDGET_REALIZED (sheet->entry_widget) )
@@ -4665,10 +4133,10 @@ psppire_sheet_size_allocate_entry (PsppireSheet *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 += DIV_RND_UP (BORDER_WIDTH, 2);
-  entry_alloc.y += DIV_RND_UP (BORDER_WIDTH, 2);
+  entry_alloc.x += sheet->cell_padding->left;
+  entry_alloc.y += sheet->cell_padding->right;
+  entry_alloc.width -= sheet->cell_padding->left + sheet->cell_padding->right;
+  entry_alloc.height -= sheet->cell_padding->top + sheet->cell_padding->bottom;
 
 
   gtk_widget_set_size_request (sheet->entry_widget, entry_alloc.width,
@@ -4768,8 +4236,8 @@ psppire_sheet_get_entry (PsppireSheet *sheet)
 
 static void
 draw_button (PsppireSheet *sheet, GdkWindow *window,
-                      PsppireSheetButton *button, gboolean is_sensitive,
-                      GdkRectangle allocation)
+            PsppireSheetButton *button, gboolean is_sensitive,
+            GdkRectangle allocation)
 {
   GtkShadowType shadow_type;
   gint text_width = 0, text_height = 0;
@@ -4793,8 +4261,9 @@ draw_button (PsppireSheet *sheet, GdkWindow *window,
 
   gtk_paint_box (sheet->button->style, window,
                 GTK_STATE_NORMAL, GTK_SHADOW_OUT,
-                &allocation, GTK_WIDGET (sheet->button),
-                "buttondefault",
+                &allocation,
+                GTK_WIDGET (sheet->button),
+                NULL,
                 allocation.x, allocation.y,
                 allocation.width, allocation.height);
 
@@ -4810,7 +4279,7 @@ draw_button (PsppireSheet *sheet, GdkWindow *window,
     gtk_paint_box (sheet->button->style, window,
                   button->state, shadow_type,
                   &allocation, GTK_WIDGET (sheet->button),
-                  "button",
+                  NULL,
                   allocation.x, allocation.y,
                   allocation.width, allocation.height);
 
@@ -4828,7 +4297,7 @@ draw_button (PsppireSheet *sheet, GdkWindow *window,
                         shadow_type,
                         NULL,
                         GTK_WIDGET (sheet),
-                        "button",
+                        NULL,
                         points,
                         2,
                         TRUE);
@@ -5321,7 +4790,7 @@ set_row_height (PsppireSheet *sheet,
 
 static gboolean
 psppire_sheet_get_attributes (const PsppireSheet *sheet, gint row, gint col,
-                         PsppireSheetCellAttr *attr)
+                             PsppireSheetCellAttr *attr)
 {
   GdkColor *fg, *bg;
   const GtkJustification *j ;
@@ -5369,8 +4838,8 @@ psppire_sheet_get_attributes (const PsppireSheet *sheet, gint row, gint col,
 
 static void
 psppire_sheet_button_size_request       (PsppireSheet *sheet,
-                                 const PsppireSheetButton *button,
-                                 GtkRequisition *button_requisition)
+                                         const PsppireSheetButton *button,
+                                         GtkRequisition *button_requisition)
 {
   GtkRequisition requisition;
   GtkRequisition label_requisition;
@@ -5390,9 +4859,9 @@ psppire_sheet_button_size_request  (PsppireSheet *sheet,
 
 static void
 psppire_sheet_forall (GtkContainer *container,
-                 gboolean include_internals,
-                 GtkCallback callback,
-                 gpointer callback_data)
+                     gboolean include_internals,
+                     GtkCallback callback,
+                     gpointer callback_data)
 {
   PsppireSheet *sheet = PSPPIRE_SHEET (container);
 
@@ -5551,7 +5020,7 @@ primary_clear_cb (GtkClipboard *clipboard,
   if ( ! GTK_WIDGET_REALIZED (GTK_WIDGET (sheet)))
     return;
 
-  psppire_sheet_real_unselect_range (sheet, NULL);
+  psppire_sheet_unselect_range (sheet);
 }
 
 static void