Replaced GTK_STATE_NORMAL with PSPPIRE_SHEET_NORMAL where appropriate
[pspp-builds.git] / lib / gtk-contrib / psppire-sheet.c
index f68ccad3d8b0e544973563216da6daccabe23ac9..46719927e0cff14260efddc39d15d8542712b2c7 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
   };
 
@@ -375,10 +381,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);
@@ -450,33 +456,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 +490,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 +503,12 @@ 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 +519,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 +559,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 */
@@ -763,9 +761,9 @@ 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 +776,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 +813,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 +1133,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 +1153,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 +1194,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 +1317,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 +1403,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 +1564,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;
 
@@ -1627,10 +1614,10 @@ psppire_sheet_select_row (PsppireSheet *sheet, gint row)
   if (row < 0 || row >= psppire_axis_unit_count (sheet->vaxis))
     return;
 
-  if (sheet->state != PSPPIRE_SHEET_NORMAL)
+  if (sheet->select_status != PSPPIRE_SHEET_NORMAL)
     psppire_sheet_real_unselect_range (sheet, NULL);
 
-  sheet->state = PSPPIRE_SHEET_ROW_SELECTED;
+  sheet->select_status = PSPPIRE_SHEET_ROW_SELECTED;
   sheet->range.row0 = row;
   sheet->range.col0 = 0;
   sheet->range.rowi = row;
@@ -1650,10 +1637,10 @@ psppire_sheet_select_column (PsppireSheet *sheet, gint column)
   if (column < 0 || column >= psppire_axis_unit_count (sheet->haxis))
     return;
 
-  if (sheet->state != PSPPIRE_SHEET_NORMAL)
+  if (sheet->select_status != PSPPIRE_SHEET_NORMAL)
     psppire_sheet_real_unselect_range (sheet, NULL);
 
-  sheet->state = PSPPIRE_SHEET_COLUMN_SELECTED;
+  sheet->select_status = PSPPIRE_SHEET_COLUMN_SELECTED;
   sheet->range.row0 = 0;
   sheet->range.col0 = column;
   sheet->range.rowi = psppire_axis_unit_count (sheet->vaxis) - 1;
@@ -1668,7 +1655,7 @@ psppire_sheet_select_column (PsppireSheet *sheet, gint column)
 
 static gboolean
 psppire_sheet_range_isvisible (const PsppireSheet *sheet,
-                          const PsppireSheetRange *range)
+                              const PsppireSheetRange *range)
 {
   g_return_val_if_fail (sheet != NULL, FALSE);
 
@@ -1701,7 +1688,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;
 
@@ -1729,8 +1716,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 )
     {
@@ -1834,7 +1821,7 @@ psppire_sheet_dispose  (GObject *object)
 
 static void
 psppire_sheet_style_set (GtkWidget *widget,
-                    GtkStyle *previous_style)
+                        GtkStyle *previous_style)
 {
   PsppireSheet *sheet;
 
@@ -1981,7 +1968,7 @@ psppire_sheet_realize (GtkWidget *widget)
   gtk_widget_set_parent (sheet->button, GTK_WIDGET (sheet));
 
   sheet->button->style = gtk_style_attach (sheet->button->style,
-                                          sheet->sheet_window);
+                                          sheet->sheet_window);
 
 
   sheet->cursor_drag = gdk_cursor_new_for_display (display, GDK_PLUS);
@@ -2118,8 +2105,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);
     }
 }
 
@@ -2249,7 +2236,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 +2302,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 +2311,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 +2323,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 ;
@@ -2494,7 +2414,6 @@ 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);
@@ -2502,10 +2421,9 @@ psppire_sheet_cell_get_state (PsppireSheet *sheet, gint row, gint col)
   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)
+  switch (sheet->select_status)
     {
     case PSPPIRE_SHEET_NORMAL:
       return GTK_STATE_NORMAL;
@@ -2532,10 +2450,10 @@ psppire_sheet_cell_get_state (PsppireSheet *sheet, gint row, gint col)
 */
 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 +2511,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 +2578,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,12 +2625,6 @@ 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;
 
@@ -2721,14 +2633,8 @@ change_active_cell (PsppireSheet *sheet, gint row, gint col)
   /* Erase the old cell border */
   psppire_sheet_draw_active_cell (sheet);
 
-  sheet->range.row0 = row;
-  sheet->range.col0 = col;
-  sheet->range.rowi = row;
-  sheet->range.coli = col;
   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 +2668,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 +2690,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);
 }
 
@@ -2833,250 +2739,6 @@ psppire_sheet_draw_active_cell (PsppireSheet *sheet)
 
 
 
-static void
-psppire_sheet_new_selection (PsppireSheet *sheet, PsppireSheetRange *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;
-
-  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);
-
-  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));
-
-  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));
-
-  for (i = range->row0; i <= range->rowi; i++)
-    {
-      for (j = range->col0; j <= range->coli; j++)
-       {
-
-         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;
-
-         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))
-           {
-
-             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);
-                   }
-               }
-           }
-       }
-    }
-
-  for (i = range->row0; i <= range->rowi; i++)
-    {
-      for (j = range->col0; j <= range->coli; j++)
-       {
-
-         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;
-
-         if (state == GTK_STATE_SELECTED && !selected)
-           {
-
-             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;
-
-           }
-       }
-    }
-
-  for (i = range->row0; i <= range->rowi; i++)
-    {
-      for (j = range->col0; j <= range->coli; j++)
-       {
-
-         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;
-
-         if (state != GTK_STATE_SELECTED && selected &&
-             (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);
-
-           }
-
-       }
-    }
-
-  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);
-           }
-       }
-    }
-
-  *range = new_range;
-}
-
-
-
 static void
 psppire_sheet_draw_border (PsppireSheet *sheet, PsppireSheetRange new_range)
 {
@@ -3107,10 +2769,8 @@ psppire_sheet_draw_border (PsppireSheet *sheet, PsppireSheetRange new_range)
 
 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;
@@ -3120,20 +2780,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);
@@ -3159,17 +2805,15 @@ psppire_sheet_select_range (PsppireSheet *sheet, const PsppireSheetRange *range)
   if (range->col0 < 0 || range->coli < 0) return;
 
 
-  if (sheet->state != PSPPIRE_SHEET_NORMAL)
+  if (sheet->select_status != 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->selection_cell.row = range->rowi;
-  sheet->selection_cell.col = range->coli;
 
-  sheet->state = PSPPIRE_SHEET_RANGE_SELECTED;
+  sheet->select_status = PSPPIRE_SHEET_RANGE_SELECTED;
   psppire_sheet_real_select_range (sheet, NULL);
 }
 
@@ -3180,16 +2824,13 @@ psppire_sheet_unselect_range (PsppireSheet *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);
+  sheet->select_status = PSPPIRE_SHEET_NORMAL;
 }
 
 
 static void
 psppire_sheet_real_unselect_range (PsppireSheet *sheet,
-                              const PsppireSheetRange *range)
+                                  const PsppireSheetRange *range)
 {
   g_return_if_fail (sheet != NULL);
   g_return_if_fail (GTK_WIDGET_REALIZED (GTK_WIDGET (sheet)));
@@ -3211,8 +2852,7 @@ psppire_sheet_real_unselect_range (PsppireSheet *sheet,
 
 
 static gint
-psppire_sheet_expose (GtkWidget *widget,
-                 GdkEventExpose *event)
+psppire_sheet_expose (GtkWidget *widget, GdkEventExpose *event)
 {
   PsppireSheet *sheet = PSPPIRE_SHEET (widget);
 
@@ -3242,21 +2882,35 @@ 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)))
        {
@@ -3283,8 +2937,7 @@ 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;
@@ -3395,7 +3048,17 @@ psppire_sheet_button_press (GtkWidget *widget,
       gtk_grab_add (GTK_WIDGET (sheet));
 
       if (psppire_sheet_click_cell (sheet, row, column))
-       PSPPIRE_SHEET_SET_FLAGS (sheet, PSPPIRE_SHEET_IN_SELECTION);
+       {
+         if ( sheet->select_status == PSPPIRE_SHEET_NORMAL)
+           {
+             sheet->range.row0 = row;
+             sheet->range.col0 = column;
+           }
+         else
+           {
+             sheet->select_status = PSPPIRE_SHEET_NORMAL;
+           }
+       }
     }
 
   if (event->window == sheet->column_title_window)
@@ -3456,7 +3119,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;
@@ -3489,24 +3152,8 @@ psppire_sheet_click_cell (PsppireSheet *sheet, gint row, gint column)
       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->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));
 
@@ -3515,7 +3162,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);
 
@@ -3567,10 +3214,6 @@ psppire_sheet_button_release (GtkWidget *widget,
 
       psppire_sheet_real_unselect_range (sheet, NULL);
 
-      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;
@@ -3588,34 +3231,28 @@ psppire_sheet_button_release (GtkWidget *widget,
 
       psppire_sheet_real_unselect_range (sheet, NULL);
 
-      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;
       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);
@@ -3760,7 +3397,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);
 
@@ -3945,8 +3582,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;
@@ -4008,8 +3645,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;
@@ -4044,18 +3681,33 @@ 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) )
+       {
+         GdkRectangle area;
+         sheet->range.rowi = row;
+         sheet->range.coli = column;
+         sheet->select_status = PSPPIRE_SHEET_RANGE_SELECTED;
+
+         rectangle_from_range (sheet, &sheet->range, &area);
+         gdk_window_invalidate_rect (sheet->sheet_window, &area, FALSE);
+       }
+      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);
 
@@ -4083,63 +3735,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);
@@ -4160,7 +3759,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)
     {
@@ -4182,12 +3781,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);
 }
 
 
@@ -4264,7 +3863,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,
@@ -4274,7 +3873,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);
@@ -4285,7 +3884,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,
@@ -4295,7 +3894,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);
@@ -4307,7 +3906,7 @@ step_sheet (PsppireSheet *sheet, GtkScrollType dir)
 
 static gboolean
 psppire_sheet_key_press (GtkWidget *widget,
-                    GdkEventKey *key)
+                        GdkEventKey *key)
 {
   PsppireSheet *sheet = PSPPIRE_SHEET (widget);
 
@@ -4347,7 +3946,7 @@ psppire_sheet_key_press (GtkWidget *widget,
                                sheet->vadjustment->lower);
 
       change_active_cell (sheet,  0,
-                              sheet->active_cell.col);
+                         sheet->active_cell.col);
 
       break;
 
@@ -4376,7 +3975,7 @@ psppire_sheet_key_press (GtkWidget *widget,
 
 static void
 psppire_sheet_size_request (GtkWidget *widget,
-                       GtkRequisition *requisition)
+                           GtkRequisition *requisition)
 {
   PsppireSheet *sheet;
 
@@ -4401,7 +4000,7 @@ psppire_sheet_size_request (GtkWidget *widget,
 
 static void
 psppire_sheet_size_allocate (GtkWidget *widget,
-                        GtkAllocation *allocation)
+                            GtkAllocation *allocation)
 {
   PsppireSheet *sheet;
   GtkAllocation sheet_allocation;
@@ -4593,8 +4192,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) )
@@ -4715,8 +4314,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;
@@ -5269,7 +4868,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 ;
@@ -5317,8 +4916,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;
@@ -5338,9 +4937,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);