Applied patch #6428
[pspp-builds.git] / lib / gtksheet / gtksheet.c
index 7da94891d1764192a79d494336a1812b0970fe1f..fed265eb95acee635cbdd48b4e90e1c84327c01b 100644 (file)
@@ -5,7 +5,7 @@
  * 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+.
  * Copyright (C) 1999-2001 Adrian E. Feiguin <adrian@ifir.ifir.edu.ar>
@@ -881,12 +881,12 @@ static void column_titles_changed (GtkWidget *w, gint first, gint n_columns, gpo
 
 /* Properties */
 enum
-{
-  PROP_0,
-  PROP_ROW_GEO,
-  PROP_COL_GEO,
-  PROP_MODEL
-};
+  {
+    PROP_0,
+    PROP_ROW_GEO,
+    PROP_COL_GEO,
+    PROP_MODEL
+  };
 
 static void
 gtk_sheet_set_property (GObject         *object,
@@ -1263,7 +1263,6 @@ gtk_sheet_init (GtkSheet *sheet)
   sheet->selection_cell.row = 0;
   sheet->selection_cell.col = 0;
 
-  sheet->sheet_entry = NULL;
   sheet->pixmap = NULL;
 
   sheet->range.row0 = 0;
@@ -1276,7 +1275,8 @@ gtk_sheet_init (GtkSheet *sheet)
   sheet->sheet_window = NULL;
   sheet->sheet_window_width = 0;
   sheet->sheet_window_height = 0;
-  sheet->sheet_entry = NULL;
+  sheet->entry_widget = NULL;
+  sheet->entry_container = NULL;
   sheet->button = NULL;
 
   sheet->hoffset = 0;
@@ -1482,20 +1482,20 @@ gtk_sheet_set_model (GtkSheet *sheet, GSheetModel *model)
 
   if ( model)
     {
-  g_signal_connect (model, "range_changed",
-                   G_CALLBACK (range_update_callback), sheet);
+      g_signal_connect (model, "range_changed",
+                       G_CALLBACK (range_update_callback), sheet);
 
-  g_signal_connect (model, "rows_inserted",
-                   G_CALLBACK (rows_inserted_deleted_callback), sheet);
+      g_signal_connect (model, "rows_inserted",
+                       G_CALLBACK (rows_inserted_deleted_callback), sheet);
 
-  g_signal_connect (model, "rows_deleted",
-                   G_CALLBACK (rows_inserted_deleted_callback), sheet);
+      g_signal_connect (model, "rows_deleted",
+                       G_CALLBACK (rows_inserted_deleted_callback), sheet);
 
-  g_signal_connect (model, "columns_inserted",
-                   G_CALLBACK (columns_inserted_deleted_callback), sheet);
+      g_signal_connect (model, "columns_inserted",
+                       G_CALLBACK (columns_inserted_deleted_callback), sheet);
 
-  g_signal_connect (model, "columns_deleted",
-                   G_CALLBACK (columns_inserted_deleted_callback), sheet);
+      g_signal_connect (model, "columns_deleted",
+                       G_CALLBACK (columns_inserted_deleted_callback), sheet);
     }
 }
 
@@ -1794,7 +1794,7 @@ gtk_sheet_thaw (GtkSheet *sheet)
                           "value_changed");
 
   if (sheet->state == GTK_STATE_NORMAL)
-    if (sheet->sheet_entry && GTK_WIDGET_MAPPED (sheet->sheet_entry))
+    if (sheet->entry_widget && GTK_WIDGET_MAPPED (sheet->entry_widget))
       {
        gtk_sheet_activate_cell (sheet, sheet->active_cell.row,
                                 sheet->active_cell.col);
@@ -2415,13 +2415,7 @@ gtk_sheet_dispose  (GObject * object)
   if (sheet->model) g_object_unref (sheet->model);
   sheet->dispose_has_run = TRUE;
 
-  /* destroy the entry */
-  if (sheet->sheet_entry && GTK_IS_WIDGET (sheet->sheet_entry))
-    {
-      gtk_widget_destroy (sheet->sheet_entry);
-      sheet->sheet_entry = NULL;
-    }
-
+  g_object_unref (sheet->entry_container);
   g_object_unref (sheet->button);
 
   /* unref adjustments */
@@ -2601,13 +2595,8 @@ gtk_sheet_realize (GtkWidget * widget)
                                          GDK_GC_FUNCTION |
                                          GDK_GC_SUBWINDOW);
 
-  if (sheet->sheet_entry->parent)
-    {
-      gtk_widget_ref (sheet->sheet_entry);
-      gtk_widget_unparent (sheet->sheet_entry);
-    }
-  gtk_widget_set_parent_window (sheet->sheet_entry, sheet->sheet_window);
-  gtk_widget_set_parent (sheet->sheet_entry, GTK_WIDGET (sheet));
+  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));
@@ -2745,12 +2734,12 @@ gtk_sheet_map (GtkWidget * widget)
          gdk_window_show (sheet->row_title_window);
        }
 
-      if (!GTK_WIDGET_MAPPED (sheet->sheet_entry)
+      if (!GTK_WIDGET_MAPPED (sheet->entry_widget)
          && sheet->active_cell.row >= 0
          && sheet->active_cell.col >= 0 )
        {
-         gtk_widget_show (sheet->sheet_entry);
-         gtk_widget_map (sheet->sheet_entry);
+         gtk_widget_show (sheet->entry_widget);
+         gtk_widget_map (sheet->entry_widget);
        }
 
       if (GTK_WIDGET_VISIBLE (sheet->button) &&
@@ -2810,8 +2799,8 @@ gtk_sheet_unmap (GtkWidget * widget)
        gdk_window_hide (sheet->row_title_window);
       gdk_window_hide (widget->window);
 
-      if (GTK_WIDGET_MAPPED (sheet->sheet_entry))
-       gtk_widget_unmap (sheet->sheet_entry);
+      if (GTK_WIDGET_MAPPED (sheet->entry_widget))
+       gtk_widget_unmap (sheet->entry_widget);
 
       if (GTK_WIDGET_MAPPED (sheet->button))
        gtk_widget_unmap (sheet->button);
@@ -2983,18 +2972,18 @@ gtk_sheet_cell_draw_label (GtkSheet *sheet, gint row, gint col)
     case GTK_JUSTIFY_RIGHT:
       size = area.width;
       area.x +=area.width;
-       {
-         for (i = col - 1; i >= MIN_VISIBLE_COLUMN (sheet); i--)
-           {
-             if ( !gtk_sheet_cell_empty (sheet, row, i)) break;
-             if (size >= text_width + CELLOFFSET) break;
-             size +=xxx_column_width (sheet, i);
-             xxx_column_set_right_column (sheet, i,
-                                          MAX (col,
-                                               xxx_column_right_column (sheet, i)));
-           }
-         area.width = size;
-       }
+      {
+       for (i = col - 1; i >= MIN_VISIBLE_COLUMN (sheet); i--)
+         {
+           if ( !gtk_sheet_cell_empty (sheet, row, i)) break;
+           if (size >= text_width + CELLOFFSET) break;
+           size +=xxx_column_width (sheet, i);
+           xxx_column_set_right_column (sheet, i,
+                                        MAX (col,
+                                             xxx_column_right_column (sheet, i)));
+         }
+       area.width = size;
+      }
       area.x -= size;
       xoffset += area.width - text_width - 2 * CELLOFFSET -
        attributes.border.width / 2;
@@ -3003,28 +2992,28 @@ gtk_sheet_cell_draw_label (GtkSheet *sheet, gint row, gint col)
       sizel = area.width / 2;
       sizer = area.width / 2;
       area.x += area.width / 2;
-       {
-         for (i = col + 1; i <= MAX_VISIBLE_COLUMN (sheet); i++)
-           {
-             if ( ! gtk_sheet_cell_empty (sheet, row, i)) break;
-             if (sizer >= text_width / 2) break;
-             sizer += xxx_column_width (sheet, i);
-             xxx_column_set_left_column (sheet, i,
-                                         MIN (
-                                              col,
-                                              xxx_column_left_column (sheet, i)));
-           }
-         for (i = col - 1; i >= MIN_VISIBLE_COLUMN (sheet); i--)
-           {
-             if ( ! gtk_sheet_cell_empty (sheet, row, i)) break;
-             if (sizel >= text_width / 2) break;
-             sizel +=xxx_column_width (sheet, i);
-             xxx_column_set_right_column (sheet, i,
-                                          MAX (col,
-                                               xxx_column_right_column (sheet, i)));
-           }
-         size = MIN (sizel, sizer);
-       }
+      {
+       for (i = col + 1; i <= MAX_VISIBLE_COLUMN (sheet); i++)
+         {
+           if ( ! gtk_sheet_cell_empty (sheet, row, i)) break;
+           if (sizer >= text_width / 2) break;
+           sizer += xxx_column_width (sheet, i);
+           xxx_column_set_left_column (sheet, i,
+                                       MIN (
+                                            col,
+                                            xxx_column_left_column (sheet, i)));
+         }
+       for (i = col - 1; i >= MIN_VISIBLE_COLUMN (sheet); i--)
+         {
+           if ( ! gtk_sheet_cell_empty (sheet, row, i)) break;
+           if (sizel >= text_width / 2) break;
+           sizel +=xxx_column_width (sheet, i);
+           xxx_column_set_right_column (sheet, i,
+                                        MAX (col,
+                                             xxx_column_right_column (sheet, i)));
+         }
+       size = MIN (sizel, sizer);
+      }
       area.x -= sizel;
       xoffset += sizel - text_width / 2 - CELLOFFSET;
       area.width = sizel + sizer;
@@ -3032,20 +3021,20 @@ gtk_sheet_cell_draw_label (GtkSheet *sheet, gint row, gint col)
     case GTK_JUSTIFY_LEFT:
     default:
       size = area.width;
-       {
-         for (i = col + 1; i <= MAX_VISIBLE_COLUMN (sheet); i++)
-           {
-             if (! gtk_sheet_cell_empty (sheet, row, i)) break;
-             if (size >= text_width + CELLOFFSET) break;
-             size +=xxx_column_width (sheet, i);
-             xxx_column_set_left_column (sheet, i,
-                                         MIN (
-                                              col,
-                                              xxx_column_left_column (sheet, i)));
-
-           }
-         area.width = size;
-       }
+      {
+       for (i = col + 1; i <= MAX_VISIBLE_COLUMN (sheet); i++)
+         {
+           if (! gtk_sheet_cell_empty (sheet, row, i)) break;
+           if (size >= text_width + CELLOFFSET) break;
+           size +=xxx_column_width (sheet, i);
+           xxx_column_set_left_column (sheet, i,
+                                       MIN (
+                                            col,
+                                            xxx_column_left_column (sheet, i)));
+
+         }
+       area.width = size;
+      }
       xoffset += attributes.border.width / 2;
       break;
     }
@@ -3647,7 +3636,7 @@ gtk_sheet_set_active_cell (GtkSheet *sheet, gint row, gint column)
     return FALSE;
 
   if (GTK_WIDGET_REALIZED (GTK_WIDGET (sheet)))
-      gtk_sheet_deactivate_cell (sheet);
+    gtk_sheet_deactivate_cell (sheet);
 
   sheet->active_cell.row = row;
   sheet->active_cell.col = column;
@@ -3698,8 +3687,8 @@ gtk_sheet_entry_changed (GtkWidget *widget, gpointer data)
 
   if (row < 0 || col < 0) return;
 
-  sheet->active_cell.row =1;
-  sheet->active_cell.col =1;
+  sheet->active_cell.row = -1;
+  sheet->active_cell.col = -1;
 
   text = gtk_entry_get_text (GTK_ENTRY (gtk_sheet_get_entry (sheet)));
 
@@ -3778,8 +3767,8 @@ gtk_sheet_hide_active_cell (GtkSheet *sheet)
   row = sheet->active_cell.row;
   col = sheet->active_cell.col;
 
-  gtk_widget_hide (sheet->sheet_entry);
-  gtk_widget_unmap (sheet->sheet_entry);
+  gtk_widget_hide (sheet->entry_widget);
+  gtk_widget_unmap (sheet->entry_widget);
 
   if (row != -1 && col != -1)
     gdk_draw_pixmap (sheet->sheet_window,
@@ -3794,7 +3783,7 @@ gtk_sheet_hide_active_cell (GtkSheet *sheet)
 
   gtk_widget_grab_focus (GTK_WIDGET (sheet));
 
-  GTK_WIDGET_UNSET_FLAGS (GTK_WIDGET (sheet->sheet_entry), GTK_VISIBLE);
+  GTK_WIDGET_UNSET_FLAGS (GTK_WIDGET (sheet->entry_widget), GTK_VISIBLE);
 
 }
 
@@ -3865,7 +3854,7 @@ gtk_sheet_show_active_cell (GtkSheet *sheet)
   if (sheet->state != GTK_SHEET_NORMAL) return;
   if (GTK_SHEET_IN_SELECTION (sheet)) return;
 
-  GTK_WIDGET_SET_FLAGS (GTK_WIDGET (sheet->sheet_entry), GTK_VISIBLE);
+  GTK_WIDGET_SET_FLAGS (GTK_WIDGET (sheet->entry_widget), GTK_VISIBLE);
 
   sheet_entry = GTK_ENTRY (gtk_sheet_get_entry (sheet));
 
@@ -3896,7 +3885,7 @@ gtk_sheet_show_active_cell (GtkSheet *sheet)
   gtk_sheet_entry_set_max_size (sheet);
   gtk_sheet_size_allocate_entry (sheet);
 
-  gtk_widget_map (sheet->sheet_entry);
+  gtk_widget_map (sheet->entry_widget);
 
   gtk_widget_grab_focus (GTK_WIDGET (sheet_entry));
 
@@ -4278,7 +4267,7 @@ gtk_sheet_draw_border (GtkSheet *sheet, GtkSheetRange new_range)
 
   gdk_gc_set_clip_rectangle (sheet->xor_gc, &area);
 
-  for (i =1; i <= 1; ++i)
+  for (i = -1; i <= 1; ++i)
     gdk_draw_rectangle (sheet->sheet_window,
                        sheet->xor_gc,
                        FALSE,
@@ -4480,6 +4469,9 @@ gtk_sheet_select_range (GtkSheet * sheet, const GtkSheetRange *range)
 void
 gtk_sheet_unselect_range (GtkSheet * sheet)
 {
+  if (! GTK_WIDGET_REALIZED (GTK_WIDGET (sheet)))
+    return;
+
   gtk_sheet_real_unselect_range (sheet, NULL);
   sheet->state = GTK_STATE_NORMAL;
 
@@ -4574,11 +4566,7 @@ gtk_sheet_expose (GtkWidget * widget,
          if ((!GTK_SHEET_IN_XDRAG (sheet)) && (!GTK_SHEET_IN_YDRAG (sheet)))
            {
              if (sheet->state == GTK_SHEET_NORMAL)
-               {
-                 gtk_sheet_draw_active_cell (sheet);
-                 if (!GTK_SHEET_IN_SELECTION (sheet))
-                   gtk_widget_queue_draw (sheet->sheet_entry);
-               }
+               gtk_sheet_draw_active_cell (sheet);
            }
        }
     }
@@ -5464,8 +5452,8 @@ gtk_sheet_move_query (GtkSheet *sheet, gint row, gint column)
 
   row_move = FALSE;
   column_move = FALSE;
-  row_align =1.;
-  col_align =1.;
+  row_align = -1.;
+  col_align = -1.;
 
   height = sheet->sheet_window_height;
   width = sheet->sheet_window_width;
@@ -5619,7 +5607,7 @@ gtk_sheet_key_press (GtkWidget *widget,
       if (sheet->state == GTK_SHEET_NORMAL &&
          !GTK_SHEET_IN_SELECTION (sheet))
        g_signal_stop_emission_by_name (gtk_sheet_get_entry (sheet),
-                                        "key-press-event");
+                                       "key-press-event");
       row = sheet->active_cell.row;
       col = sheet->active_cell.col;
       if (sheet->state == GTK_SHEET_COLUMN_SELECTED)
@@ -6090,7 +6078,7 @@ gtk_sheet_size_allocate_entry (GtkSheet *sheet)
                                   &attributes) )
     return ;
 
-  if ( GTK_WIDGET_REALIZED (sheet->sheet_entry) )
+  if ( GTK_WIDGET_REALIZED (sheet->entry_widget) )
     {
       if (!GTK_WIDGET (sheet_entry)->style)
        gtk_widget_ensure_style (GTK_WIDGET (sheet_entry));
@@ -6110,12 +6098,12 @@ gtk_sheet_size_allocate_entry (GtkSheet *sheet)
       style->font_desc = pango_font_description_copy (attributes.font_desc);
 
       GTK_WIDGET (sheet_entry)->style = style;
-      gtk_widget_size_request (sheet->sheet_entry, NULL);
+      gtk_widget_size_request (sheet->entry_widget, NULL);
       GTK_WIDGET (sheet_entry)->style = previous_style;
 
       if (style != previous_style)
        {
-         if (!GTK_IS_ITEM_ENTRY (sheet->sheet_entry))
+         if (!GTK_IS_ITEM_ENTRY (sheet->entry_widget))
            {
              style->bg[GTK_STATE_NORMAL] = previous_style->bg[GTK_STATE_NORMAL];
              style->fg[GTK_STATE_NORMAL] = previous_style->fg[GTK_STATE_NORMAL];
@@ -6150,7 +6138,7 @@ gtk_sheet_size_allocate_entry (GtkSheet *sheet)
   shentry_allocation.width = column_width;
   shentry_allocation.height = yyy_row_height (sheet, sheet->active_cell.row);
 
-  if (GTK_IS_ITEM_ENTRY (sheet->sheet_entry))
+  if (GTK_IS_ITEM_ENTRY (sheet->entry_widget))
     {
       shentry_allocation.height -= 2 * CELLOFFSET;
       shentry_allocation.y += CELLOFFSET;
@@ -6171,7 +6159,7 @@ gtk_sheet_size_allocate_entry (GtkSheet *sheet)
        }
     }
 
-  if (!GTK_IS_ITEM_ENTRY (sheet->sheet_entry))
+  if (!GTK_IS_ITEM_ENTRY (sheet->entry_widget))
     {
       shentry_allocation.x += 2;
       shentry_allocation.y += 2;
@@ -6179,7 +6167,7 @@ gtk_sheet_size_allocate_entry (GtkSheet *sheet)
       shentry_allocation.height -= MIN (shentry_allocation.height, 3);
     }
 
-  gtk_widget_size_allocate (sheet->sheet_entry, &shentry_allocation);
+  gtk_widget_size_allocate (sheet->entry_widget, &shentry_allocation);
 
   if (previous_style == style) g_object_unref (previous_style);
 }
@@ -6197,10 +6185,10 @@ gtk_sheet_entry_set_max_size (GtkSheet *sheet)
   row = sheet->active_cell.row;
   col = sheet->active_cell.col;
 
-  if ( ! GTK_IS_ITEM_ENTRY (sheet->sheet_entry) )
+  if ( ! GTK_IS_ITEM_ENTRY (sheet->entry_widget) )
     return;
 
-  justification = GTK_ITEM_ENTRY (sheet->sheet_entry)->justification;
+  justification = GTK_ITEM_ENTRY (sheet->entry_widget)->justification;
 
   switch (justification)
     {
@@ -6248,76 +6236,56 @@ gtk_sheet_entry_set_max_size (GtkSheet *sheet)
 
   if (size != 0)
     size += xxx_column_width (sheet, col);
-  GTK_ITEM_ENTRY (sheet->sheet_entry)->text_max_size = size;
+  GTK_ITEM_ENTRY (sheet->entry_widget)->text_max_size = size;
 }
 
 
 static void
 create_sheet_entry (GtkSheet *sheet)
 {
-  GtkWidget *widget;
-  GtkWidget *parent;
-  GtkWidget *entry;
-  gint found_entry = FALSE;
-
-  widget = GTK_WIDGET (sheet);
-
-  if (sheet->sheet_entry)
+  if (sheet->entry_widget)
     {
-      /* avoids warnings */
-      gtk_widget_ref (sheet->sheet_entry);
-      gtk_widget_unparent (sheet->sheet_entry);
-      gtk_widget_destroy (sheet->sheet_entry);
+      gtk_widget_unparent (sheet->entry_widget);
     }
 
   if (sheet->entry_type)
     {
-      if (!g_type_is_a (sheet->entry_type, GTK_TYPE_ENTRY))
-       {
-         parent = g_object_new (sheet->entry_type, NULL);
+      sheet->entry_container = g_object_new (sheet->entry_type, NULL);
+      g_object_ref_sink (sheet->entry_container);
+      sheet->entry_widget = gtk_sheet_get_entry (sheet);
 
-         sheet->sheet_entry = parent;
-
-         entry = gtk_sheet_get_entry (sheet);
-         if (GTK_IS_ENTRY (entry))
-           found_entry = TRUE;
-       }
-      else
+      if  ( NULL == sheet->entry_widget)
        {
-         parent = g_object_new (sheet->entry_type, NULL);
-         entry = parent;
-         found_entry = TRUE;
+         g_warning ("Entry type is %s. It must be GtkEntry subclass, or a widget containing one. "
+                    "Using default", g_type_name (sheet->entry_type));
+         g_object_unref (sheet->entry_container);
+         sheet->entry_widget = sheet->entry_container = gtk_item_entry_new ();
        }
-
-      if (!found_entry)
+      else
        {
-         g_warning ("Entry type must be GtkEntry subclass, using default");
-         entry = gtk_item_entry_new ();
-         sheet->sheet_entry = entry;
+         sheet->entry_widget = sheet->entry_container ;
        }
-      else
-       sheet->sheet_entry = parent;
     }
   else
     {
-      entry = gtk_item_entry_new ();
-      sheet->sheet_entry = entry;
+      sheet->entry_widget = sheet->entry_container = gtk_item_entry_new ();
+      g_object_ref_sink (sheet->entry_container);
     }
 
-  gtk_widget_size_request (sheet->sheet_entry, NULL);
+  gtk_widget_size_request (sheet->entry_widget, NULL);
 
   if (GTK_WIDGET_REALIZED (sheet))
     {
-      gtk_widget_set_parent_window (sheet->sheet_entry, sheet->sheet_window);
-      gtk_widget_set_parent (sheet->sheet_entry, GTK_WIDGET (sheet));
-      gtk_widget_realize (sheet->sheet_entry);
+      gtk_widget_set_parent_window (sheet->entry_widget, sheet->sheet_window);
+      gtk_widget_set_parent (sheet->entry_widget, GTK_WIDGET (sheet));
+      gtk_widget_realize (sheet->entry_widget);
     }
 
-  g_signal_connect_swapped (entry, "key_press_event",
+  g_signal_connect_swapped (sheet->entry_widget, "key_press_event",
                            G_CALLBACK (gtk_sheet_entry_key_press),
                            sheet);
 
-  gtk_widget_show (sheet->sheet_entry);
+  gtk_widget_show (sheet->entry_widget);
 }
 
 
@@ -6343,11 +6311,13 @@ gtk_sheet_get_entry (GtkSheet *sheet)
 
   g_return_val_if_fail (sheet != NULL, NULL);
   g_return_val_if_fail (GTK_IS_SHEET (sheet), NULL);
-  g_return_val_if_fail (sheet->sheet_entry != NULL, NULL);
+  g_return_val_if_fail (sheet->entry_widget != NULL, NULL);
 
-  if (GTK_IS_ENTRY (sheet->sheet_entry)) return (sheet->sheet_entry);
+  if (GTK_IS_ENTRY (sheet->entry_container))
+    return (sheet->entry_container);
 
-  parent = GTK_WIDGET (sheet->sheet_entry);
+  //parent = GTK_WIDGET (sheet->entry_widget);
+  parent = sheet->entry_container;
 
   if (GTK_IS_TABLE (parent)) children = GTK_TABLE (parent)->children;
   if (GTK_IS_BOX (parent)) children = GTK_BOX (parent)->children;
@@ -6392,9 +6362,9 @@ gtk_sheet_get_entry_widget (GtkSheet *sheet)
 {
   g_return_val_if_fail (sheet != NULL, NULL);
   g_return_val_if_fail (GTK_IS_SHEET (sheet), NULL);
-  g_return_val_if_fail (sheet->sheet_entry != NULL, NULL);
+  g_return_val_if_fail (sheet->entry_widget != NULL, NULL);
 
-  return (sheet->sheet_entry);
+  return (sheet->entry_widget);
 }
 
 
@@ -6605,7 +6575,7 @@ gtk_sheet_column_title_button_draw (GtkSheet *sheet, gint column)
                             is_sensitive, allocation);
 
       /* FIXME: Not freeing this button is correct (sort of),
-      because in PSPP the model always returns a static copy */
+        because in PSPP the model always returns a static copy */
 
       /* gtk_sheet_button_free (button); */
 
@@ -6756,7 +6726,7 @@ vadjustment_value_changed (GtkAdjustment * adjustment,
 
   sheet->voffset = - value;
 
-  if (GTK_WIDGET_REALIZED (sheet->sheet_entry) &&
+  if (GTK_WIDGET_REALIZED (sheet->entry_widget) &&
       sheet->state == GTK_SHEET_NORMAL &&
       sheet->active_cell.row >= 0 && sheet->active_cell.col >= 0 &&
       !gtk_sheet_cell_isvisible (sheet, sheet->active_cell.row,
@@ -6770,7 +6740,7 @@ vadjustment_value_changed (GtkAdjustment * adjustment,
        gtk_sheet_cell_clear (sheet,
                              sheet->active_cell.row,
                              sheet->active_cell.col);
-      gtk_widget_unmap (sheet->sheet_entry);
+      gtk_widget_unmap (sheet->entry_widget);
     }
 
   gtk_sheet_position_children (sheet);
@@ -6862,7 +6832,7 @@ hadjustment_value_changed (GtkAdjustment * adjustment,
     }
 
   sheet->hoffset = - value;
-  if (GTK_WIDGET_REALIZED (sheet->sheet_entry) &&
+  if (GTK_WIDGET_REALIZED (sheet->entry_widget) &&
       sheet->state == GTK_SHEET_NORMAL &&
       sheet->active_cell.row >= 0 && sheet->active_cell.col >= 0 &&
       !gtk_sheet_cell_isvisible (sheet, sheet->active_cell.row,
@@ -6876,7 +6846,7 @@ hadjustment_value_changed (GtkAdjustment * adjustment,
                              sheet->active_cell.row,
                              sheet->active_cell.col);
 
-      gtk_widget_unmap (sheet->sheet_entry);
+      gtk_widget_unmap (sheet->entry_widget);
     }
 
   gtk_sheet_position_children (sheet);
@@ -6966,7 +6936,7 @@ draw_xor_rectangle (GtkSheet *sheet, GtkSheetRange range)
 
   gdk_gc_set_clip_rectangle (sheet->xor_gc, &clip_area);
 
-  for (i =1; i <= 1; ++i)
+  for (i = -1; i <= 1; ++i)
     gdk_draw_rectangle (sheet->sheet_window,
                        sheet->xor_gc,
                        FALSE,
@@ -7685,10 +7655,12 @@ gtk_sheet_forall (GtkContainer *container,
 
       (* callback) (child->widget, callback_data);
     }
-  if (sheet->button)
+
+  if (sheet->button && sheet->button->parent)
     (* callback) (sheet->button, callback_data);
-  if (sheet->sheet_entry)
-    (* callback) (sheet->sheet_entry, callback_data);
+
+  if (sheet->entry_container && GTK_IS_CONTAINER (sheet->entry_container))
+    (* callback) (sheet->entry_container, callback_data);
 }
 
 
@@ -7761,6 +7733,7 @@ gtk_sheet_remove (GtkContainer *container, GtkWidget *widget)
       g_free (child);
     }
 
+  gtk_widget_unparent (sheet->button);
 }
 
 static void
@@ -7906,7 +7879,7 @@ range_to_html (const GtkSheet *sheet)
   g_string_append (string, "<html>\n");
   g_string_append (string, "<body>\n");
   g_string_append (string, "<table>\n");
-  for (r = sheet->range.row0; r <= sheet->range.rowi; ++r) 
+  for (r = sheet->range.row0; r <= sheet->range.rowi; ++r)
     {
       g_string_append (string, "<tr>\n");
       for (c = sheet->range.col0; c <= sheet->range.coli; ++c)
@@ -7942,16 +7915,16 @@ primary_get_cb (GtkClipboard     *clipboard,
   GString *string = NULL;
 
   switch (info)
-  {
-  case SELECT_FMT_TEXT:
-    string = range_to_text (sheet);
-    break;
-  case SELECT_FMT_HTML:
-    string = range_to_html (sheet);
-    break;
-  default:
-    g_assert_not_reached ();
-  }
+    {
+    case SELECT_FMT_TEXT:
+      string = range_to_text (sheet);
+      break;
+    case SELECT_FMT_HTML:
+      string = range_to_html (sheet);
+      break;
+    default:
+      g_assert_not_reached ();
+    }
 
   gtk_selection_data_set (selection_data, selection_data->target,
                          8,
@@ -7973,24 +7946,24 @@ gtk_sheet_update_primary_selection (GtkSheet *sheet)
   static const GtkTargetEntry targets[] = {
     { "UTF8_STRING",   0, SELECT_FMT_TEXT },
     { "STRING",        0, SELECT_FMT_TEXT },
-    { "TEXT",          0, SELECT_FMT_TEXT }, 
+    { "TEXT",          0, SELECT_FMT_TEXT },
     { "COMPOUND_TEXT", 0, SELECT_FMT_TEXT },
-    { "text/plain;charset=utf-8", 0, SELECT_FMT_TEXT }, 
+    { "text/plain;charset=utf-8", 0, SELECT_FMT_TEXT },
     { "text/plain",    0, SELECT_FMT_TEXT },
     { "text/html",     0, SELECT_FMT_HTML }
   };
-  
+
   GtkClipboard *clipboard;
 
   if (!GTK_WIDGET_REALIZED (sheet))
     return;
 
-  clipboard = gtk_widget_get_clipboard (GTK_WIDGET (sheet), 
+  clipboard = gtk_widget_get_clipboard (GTK_WIDGET (sheet),
                                        GDK_SELECTION_PRIMARY);
-  
+
   if (gtk_sheet_range_isvisible (sheet, sheet->range))
     {
-      if (!gtk_clipboard_set_with_owner (clipboard, targets, 
+      if (!gtk_clipboard_set_with_owner (clipboard, targets,
                                         G_N_ELEMENTS (targets),
                                         primary_get_cb, primary_clear_cb,
                                         G_OBJECT (sheet)))