Merge 'master' into 'psppsheet'.
authorBen Pfaff <blp@cs.stanford.edu>
Sun, 30 Sep 2012 18:25:23 +0000 (11:25 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Sun, 30 Sep 2012 18:25:55 +0000 (11:25 -0700)
1  2 
src/ui/gui/autorecode-dialog.c
src/ui/gui/pspp-sheet-view.c
src/ui/gui/recode-dialog.c
src/ui/gui/split-file-dialog.c

index 8c771ce222d81e9ad9790dd20a5926cdb1d8a5d4,011d5c219a851576603af65c7955c841fea200a4..fb060f0a4061c940277670a18481247f222d5c59
@@@ -216,6 -216,7 +216,7 @@@ on_selection_change (GtkTreeSelection *
  
  
        ok = gtk_tree_model_get_iter (model, &iter, (GtkTreePath*) rows->data);
+       g_return_if_fail (ok);
  
        gtk_tree_model_get (model, &iter, 0, &var, -1);
  
@@@ -271,6 -272,7 +272,6 @@@ autorecode_dialog (PsppireDataWindow *d
    gint response;
  
    GtkBuilder *xml = builder_new ("autorecode.ui");
 -  PsppireVarStore *vs;
  
    GtkWidget *dialog = get_widget_assert   (xml, "autorecode-dialog");
    GtkWidget *source = get_widget_assert   (xml, "dict-view");
  
      }
  
 -  g_object_get (de->data_editor, "var-store", &vs, NULL);
  
    gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de));
  
 -  g_object_get (vs, "dictionary", &rd.dict, NULL);
 +  g_object_get (de->data_editor, "dictionary", &rd.dict, NULL);
    g_object_set (source, "model", rd.dict, NULL);
  
  
index c569d20403c201d967cbe7832349f71452141901,c4eec5637c9e2664d4b3cee3c39840f20b9e59b0..88a74a6e5e0c952b27bf6f065db5c262b0e7b954
@@@ -160,7 -160,8 +160,7 @@@ static void     pspp_sheet_view_get_pro
                                                    GValue          *value,
                                                    GParamSpec      *pspec);
  
 -/* gtkobject signals */
 -static void     pspp_sheet_view_destroy              (GtkObject        *object);
 +static void     pspp_sheet_view_dispose              (GObject        *object);
  
  /* gtkwidget signals */
  static void     pspp_sheet_view_realize              (GtkWidget        *widget);
@@@ -428,8 -429,6 +428,8 @@@ static void     remove_scroll_timeou
  
  static guint tree_view_signals [LAST_SIGNAL] = { 0 };
  
 +static GtkBindingSet *edit_bindings;
 +
  \f
  
  /* GType Methods
@@@ -443,17 -442,15 +443,17 @@@ static voi
  pspp_sheet_view_class_init (PsppSheetViewClass *class)
  {
    GObjectClass *o_class;
 -  GtkObjectClass *object_class;
    GtkWidgetClass *widget_class;
    GtkContainerClass *container_class;
 -  GtkBindingSet *binding_set;
 +  GtkBindingSet *binding_set[2];
 +  int i;
 +
 +  binding_set[0] = gtk_binding_set_by_class (class);
  
 -  binding_set = gtk_binding_set_by_class (class);
 +  binding_set[1] = gtk_binding_set_new ("PsppSheetViewEditing");
 +  edit_bindings = binding_set[1];
  
    o_class = (GObjectClass *) class;
 -  object_class = (GtkObjectClass *) class;
    widget_class = (GtkWidgetClass *) class;
    container_class = (GtkContainerClass *) class;
  
    o_class->set_property = pspp_sheet_view_set_property;
    o_class->get_property = pspp_sheet_view_get_property;
    o_class->finalize = pspp_sheet_view_finalize;
 -
 -  /* GtkObject signals */
 -  object_class->destroy = pspp_sheet_view_destroy;
 +  o_class->dispose = pspp_sheet_view_dispose;
  
    /* GtkWidget signals */
    widget_class->map = pspp_sheet_view_map;
  
    tree_view_signals[MOVE_CURSOR] =
      g_signal_new ("move-cursor",
 -                G_TYPE_FROM_CLASS (object_class),
 +                G_TYPE_FROM_CLASS (o_class),
                  G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
                  G_STRUCT_OFFSET (PsppSheetViewClass, move_cursor),
                  NULL, NULL,
  
    tree_view_signals[SELECT_ALL] =
      g_signal_new ("select-all",
 -                G_TYPE_FROM_CLASS (object_class),
 +                G_TYPE_FROM_CLASS (o_class),
                  G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
                  G_STRUCT_OFFSET (PsppSheetViewClass, select_all),
                  NULL, NULL,
  
    tree_view_signals[UNSELECT_ALL] =
      g_signal_new ("unselect-all",
 -                G_TYPE_FROM_CLASS (object_class),
 +                G_TYPE_FROM_CLASS (o_class),
                  G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
                  G_STRUCT_OFFSET (PsppSheetViewClass, unselect_all),
                  NULL, NULL,
  
    tree_view_signals[SELECT_CURSOR_ROW] =
      g_signal_new ("select-cursor-row",
 -                G_TYPE_FROM_CLASS (object_class),
 +                G_TYPE_FROM_CLASS (o_class),
                  G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
                  G_STRUCT_OFFSET (PsppSheetViewClass, select_cursor_row),
                  NULL, NULL,
  
    tree_view_signals[TOGGLE_CURSOR_ROW] =
      g_signal_new ("toggle-cursor-row",
 -                G_TYPE_FROM_CLASS (object_class),
 +                G_TYPE_FROM_CLASS (o_class),
                  G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
                  G_STRUCT_OFFSET (PsppSheetViewClass, toggle_cursor_row),
                  NULL, NULL,
  
    tree_view_signals[START_INTERACTIVE_SEARCH] =
      g_signal_new ("start-interactive-search",
 -                G_TYPE_FROM_CLASS (object_class),
 +                G_TYPE_FROM_CLASS (o_class),
                  G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
                  G_STRUCT_OFFSET (PsppSheetViewClass, start_interactive_search),
                  NULL, NULL,
                  G_TYPE_BOOLEAN, 0);
  
    /* Key bindings */
 -  pspp_sheet_view_add_move_binding (binding_set, GDK_Up, 0, TRUE,
 -                                GTK_MOVEMENT_DISPLAY_LINES, -1);
 -  pspp_sheet_view_add_move_binding (binding_set, GDK_KP_Up, 0, TRUE,
 -                                GTK_MOVEMENT_DISPLAY_LINES, -1);
 +  for (i = 0; i < 2; i++)
 +    {
 +      pspp_sheet_view_add_move_binding (binding_set[i], GDK_Up, 0, TRUE,
 +                                        GTK_MOVEMENT_DISPLAY_LINES, -1);
 +      pspp_sheet_view_add_move_binding (binding_set[i], GDK_KP_Up, 0, TRUE,
 +                                        GTK_MOVEMENT_DISPLAY_LINES, -1);
  
 -  pspp_sheet_view_add_move_binding (binding_set, GDK_Down, 0, TRUE,
 -                                GTK_MOVEMENT_DISPLAY_LINES, 1);
 -  pspp_sheet_view_add_move_binding (binding_set, GDK_KP_Down, 0, TRUE,
 -                                GTK_MOVEMENT_DISPLAY_LINES, 1);
 +      pspp_sheet_view_add_move_binding (binding_set[i], GDK_Down, 0, TRUE,
 +                                        GTK_MOVEMENT_DISPLAY_LINES, 1);
 +      pspp_sheet_view_add_move_binding (binding_set[i], GDK_KP_Down, 0, TRUE,
 +                                        GTK_MOVEMENT_DISPLAY_LINES, 1);
  
 -  pspp_sheet_view_add_move_binding (binding_set, GDK_p, GDK_CONTROL_MASK, FALSE,
 -                                GTK_MOVEMENT_DISPLAY_LINES, -1);
 +      pspp_sheet_view_add_move_binding (binding_set[i], GDK_p, GDK_CONTROL_MASK, FALSE,
 +                                        GTK_MOVEMENT_DISPLAY_LINES, -1);
  
 -  pspp_sheet_view_add_move_binding (binding_set, GDK_n, GDK_CONTROL_MASK, FALSE,
 -                                GTK_MOVEMENT_DISPLAY_LINES, 1);
 +      pspp_sheet_view_add_move_binding (binding_set[i], GDK_n, GDK_CONTROL_MASK, FALSE,
 +                                        GTK_MOVEMENT_DISPLAY_LINES, 1);
  
 -  pspp_sheet_view_add_move_binding (binding_set, GDK_Home, 0, TRUE,
 -                                GTK_MOVEMENT_BUFFER_ENDS, -1);
 -  pspp_sheet_view_add_move_binding (binding_set, GDK_KP_Home, 0, TRUE,
 -                                GTK_MOVEMENT_BUFFER_ENDS, -1);
 +      pspp_sheet_view_add_move_binding (binding_set[i], GDK_Home, 0, TRUE,
 +                                        GTK_MOVEMENT_BUFFER_ENDS, -1);
 +      pspp_sheet_view_add_move_binding (binding_set[i], GDK_KP_Home, 0, TRUE,
 +                                        GTK_MOVEMENT_BUFFER_ENDS, -1);
  
 -  pspp_sheet_view_add_move_binding (binding_set, GDK_End, 0, TRUE,
 -                                GTK_MOVEMENT_BUFFER_ENDS, 1);
 -  pspp_sheet_view_add_move_binding (binding_set, GDK_KP_End, 0, TRUE,
 -                                GTK_MOVEMENT_BUFFER_ENDS, 1);
 +      pspp_sheet_view_add_move_binding (binding_set[i], GDK_End, 0, TRUE,
 +                                        GTK_MOVEMENT_BUFFER_ENDS, 1);
 +      pspp_sheet_view_add_move_binding (binding_set[i], GDK_KP_End, 0, TRUE,
 +                                        GTK_MOVEMENT_BUFFER_ENDS, 1);
  
 -  pspp_sheet_view_add_move_binding (binding_set, GDK_Page_Up, 0, TRUE,
 -                                GTK_MOVEMENT_PAGES, -1);
 -  pspp_sheet_view_add_move_binding (binding_set, GDK_KP_Page_Up, 0, TRUE,
 -                                GTK_MOVEMENT_PAGES, -1);
 +      pspp_sheet_view_add_move_binding (binding_set[i], GDK_Page_Up, 0, TRUE,
 +                                        GTK_MOVEMENT_PAGES, -1);
 +      pspp_sheet_view_add_move_binding (binding_set[i], GDK_KP_Page_Up, 0, TRUE,
 +                                        GTK_MOVEMENT_PAGES, -1);
  
 -  pspp_sheet_view_add_move_binding (binding_set, GDK_Page_Down, 0, TRUE,
 -                                GTK_MOVEMENT_PAGES, 1);
 -  pspp_sheet_view_add_move_binding (binding_set, GDK_KP_Page_Down, 0, TRUE,
 -                                GTK_MOVEMENT_PAGES, 1);
 +      pspp_sheet_view_add_move_binding (binding_set[i], GDK_Page_Down, 0, TRUE,
 +                                        GTK_MOVEMENT_PAGES, 1);
 +      pspp_sheet_view_add_move_binding (binding_set[i], GDK_KP_Page_Down, 0, TRUE,
 +                                        GTK_MOVEMENT_PAGES, 1);
  
  
 -  gtk_binding_entry_add_signal (binding_set, GDK_Right, 0, "move-cursor", 2,
 -                              G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS,
 -                              G_TYPE_INT, 1);
 +      gtk_binding_entry_add_signal (binding_set[i], GDK_Right, 0, "move-cursor", 2,
 +                                    G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS,
 +                                    G_TYPE_INT, 1);
  
 -  gtk_binding_entry_add_signal (binding_set, GDK_Left, 0, "move-cursor", 2,
 -                              G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS,
 -                              G_TYPE_INT, -1);
 +      gtk_binding_entry_add_signal (binding_set[i], GDK_Left, 0, "move-cursor", 2,
 +                                    G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS,
 +                                    G_TYPE_INT, -1);
  
 -  gtk_binding_entry_add_signal (binding_set, GDK_KP_Right, 0, "move-cursor", 2,
 -                              G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS,
 -                              G_TYPE_INT, 1);
 +      gtk_binding_entry_add_signal (binding_set[i], GDK_KP_Right, 0, "move-cursor", 2,
 +                                    G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS,
 +                                    G_TYPE_INT, 1);
  
 -  gtk_binding_entry_add_signal (binding_set, GDK_KP_Left, 0, "move-cursor", 2,
 -                              G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS,
 -                              G_TYPE_INT, -1);
 +      gtk_binding_entry_add_signal (binding_set[i], GDK_KP_Left, 0, "move-cursor", 2,
 +                                    G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS,
 +                                    G_TYPE_INT, -1);
  
 -  gtk_binding_entry_add_signal (binding_set, GDK_Right, GDK_CONTROL_MASK,
 -                                "move-cursor", 2,
 -                              G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS,
 -                              G_TYPE_INT, 1);
 +      gtk_binding_entry_add_signal (binding_set[i], GDK_Right, GDK_CONTROL_MASK,
 +                                    "move-cursor", 2,
 +                                    G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS,
 +                                    G_TYPE_INT, 1);
  
 -  gtk_binding_entry_add_signal (binding_set, GDK_Left, GDK_CONTROL_MASK,
 -                                "move-cursor", 2,
 -                              G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS,
 -                              G_TYPE_INT, -1);
 +      gtk_binding_entry_add_signal (binding_set[i], GDK_Left, GDK_CONTROL_MASK,
 +                                    "move-cursor", 2,
 +                                    G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS,
 +                                    G_TYPE_INT, -1);
  
 -  gtk_binding_entry_add_signal (binding_set, GDK_KP_Right, GDK_CONTROL_MASK,
 -                                "move-cursor", 2,
 -                              G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS,
 -                              G_TYPE_INT, 1);
 +      gtk_binding_entry_add_signal (binding_set[i], GDK_KP_Right, GDK_CONTROL_MASK,
 +                                    "move-cursor", 2,
 +                                    G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS,
 +                                    G_TYPE_INT, 1);
  
 -  gtk_binding_entry_add_signal (binding_set, GDK_KP_Left, GDK_CONTROL_MASK,
 -                                "move-cursor", 2,
 -                              G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS,
 -                              G_TYPE_INT, -1);
 +      gtk_binding_entry_add_signal (binding_set[i], GDK_KP_Left, GDK_CONTROL_MASK,
 +                                    "move-cursor", 2,
 +                                    G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS,
 +                                    G_TYPE_INT, -1);
 +
 +      gtk_binding_entry_add_signal (binding_set[i], GDK_f, GDK_CONTROL_MASK, "start-interactive-search", 0);
 +
 +      gtk_binding_entry_add_signal (binding_set[i], GDK_F, GDK_CONTROL_MASK, "start-interactive-search", 0);
 +    }
  
 -  gtk_binding_entry_add_signal (binding_set, GDK_space, GDK_CONTROL_MASK, "toggle-cursor-row", 0);
 -  gtk_binding_entry_add_signal (binding_set, GDK_KP_Space, GDK_CONTROL_MASK, "toggle-cursor-row", 0);
 +  gtk_binding_entry_add_signal (binding_set[0], GDK_space, GDK_CONTROL_MASK, "toggle-cursor-row", 0);
 +  gtk_binding_entry_add_signal (binding_set[0], GDK_KP_Space, GDK_CONTROL_MASK, "toggle-cursor-row", 0);
  
 -  gtk_binding_entry_add_signal (binding_set, GDK_a, GDK_CONTROL_MASK, "select-all", 0);
 -  gtk_binding_entry_add_signal (binding_set, GDK_slash, GDK_CONTROL_MASK, "select-all", 0);
 +  gtk_binding_entry_add_signal (binding_set[0], GDK_a, GDK_CONTROL_MASK, "select-all", 0);
 +  gtk_binding_entry_add_signal (binding_set[0], GDK_slash, GDK_CONTROL_MASK, "select-all", 0);
  
 -  gtk_binding_entry_add_signal (binding_set, GDK_A, GDK_CONTROL_MASK | GDK_SHIFT_MASK, "unselect-all", 0);
 -  gtk_binding_entry_add_signal (binding_set, GDK_backslash, GDK_CONTROL_MASK, "unselect-all", 0);
 +  gtk_binding_entry_add_signal (binding_set[0], GDK_A, GDK_CONTROL_MASK | GDK_SHIFT_MASK, "unselect-all", 0);
 +  gtk_binding_entry_add_signal (binding_set[0], GDK_backslash, GDK_CONTROL_MASK, "unselect-all", 0);
  
 -  gtk_binding_entry_add_signal (binding_set, GDK_space, GDK_SHIFT_MASK, "select-cursor-row", 1,
 +  gtk_binding_entry_add_signal (binding_set[0], GDK_space, GDK_SHIFT_MASK, "select-cursor-row", 1,
                                G_TYPE_BOOLEAN, TRUE);
 -  gtk_binding_entry_add_signal (binding_set, GDK_KP_Space, GDK_SHIFT_MASK, "select-cursor-row", 1,
 +  gtk_binding_entry_add_signal (binding_set[0], GDK_KP_Space, GDK_SHIFT_MASK, "select-cursor-row", 1,
                                G_TYPE_BOOLEAN, TRUE);
  
 -  gtk_binding_entry_add_signal (binding_set, GDK_space, 0, "select-cursor-row", 1,
 +  gtk_binding_entry_add_signal (binding_set[0], GDK_space, 0, "select-cursor-row", 1,
                                G_TYPE_BOOLEAN, TRUE);
 -  gtk_binding_entry_add_signal (binding_set, GDK_KP_Space, 0, "select-cursor-row", 1,
 +  gtk_binding_entry_add_signal (binding_set[0], GDK_KP_Space, 0, "select-cursor-row", 1,
                                G_TYPE_BOOLEAN, TRUE);
 -  gtk_binding_entry_add_signal (binding_set, GDK_Return, 0, "select-cursor-row", 1,
 +  gtk_binding_entry_add_signal (binding_set[0], GDK_Return, 0, "select-cursor-row", 1,
                                G_TYPE_BOOLEAN, TRUE);
 -  gtk_binding_entry_add_signal (binding_set, GDK_ISO_Enter, 0, "select-cursor-row", 1,
 +  gtk_binding_entry_add_signal (binding_set[0], GDK_ISO_Enter, 0, "select-cursor-row", 1,
                                G_TYPE_BOOLEAN, TRUE);
 -  gtk_binding_entry_add_signal (binding_set, GDK_KP_Enter, 0, "select-cursor-row", 1,
 +  gtk_binding_entry_add_signal (binding_set[0], GDK_KP_Enter, 0, "select-cursor-row", 1,
                                G_TYPE_BOOLEAN, TRUE);
  
 -  gtk_binding_entry_add_signal (binding_set, GDK_BackSpace, 0, "select-cursor-parent", 0);
 -  gtk_binding_entry_add_signal (binding_set, GDK_BackSpace, GDK_CONTROL_MASK, "select-cursor-parent", 0);
 -
 -  gtk_binding_entry_add_signal (binding_set, GDK_f, GDK_CONTROL_MASK, "start-interactive-search", 0);
 -
 -  gtk_binding_entry_add_signal (binding_set, GDK_F, GDK_CONTROL_MASK, "start-interactive-search", 0);
 +  gtk_binding_entry_add_signal (binding_set[0], GDK_BackSpace, 0, "select-cursor-parent", 0);
 +  gtk_binding_entry_add_signal (binding_set[0], GDK_BackSpace, GDK_CONTROL_MASK, "select-cursor-parent", 0);
  
    g_type_class_add_private (o_class, sizeof (PsppSheetViewPrivate));
  }
@@@ -1055,8 -1051,6 +1055,8 @@@ pspp_sheet_view_init (PsppSheetView *tr
    tree_view->priv->anchor_column = NULL;
  
    tree_view->priv->button_style = NULL;
 +
 +  tree_view->dispose_has_run = FALSE;
  }
  
  \f
@@@ -1214,41 -1208,9 +1214,41 @@@ pspp_sheet_view_get_property (GObjec
  }
  
  static void
 -pspp_sheet_view_finalize (GObject *object)
 +pspp_sheet_view_dispose (GObject *object)
  {
 -  G_OBJECT_CLASS (pspp_sheet_view_parent_class)->finalize (object);
 +  PsppSheetView *tree_view = PSPP_SHEET_VIEW (object);
 +
 +  if (tree_view->dispose_has_run)
 +    return;
 +
 +  tree_view->dispose_has_run = TRUE;
 +
 +  if (tree_view->priv->selection != NULL)
 +    {
 +      _pspp_sheet_selection_set_tree_view (tree_view->priv->selection, NULL);
 +      g_object_unref (tree_view->priv->selection);
 +      tree_view->priv->selection = NULL;
 +    }
 +
 +  if (tree_view->priv->hadjustment)
 +    {
 +      g_object_unref (tree_view->priv->hadjustment);
 +      tree_view->priv->hadjustment = NULL;
 +    }
 +  if (tree_view->priv->vadjustment)
 +    {
 +      g_object_unref (tree_view->priv->vadjustment);
 +      tree_view->priv->vadjustment = NULL;
 +    }
 +
 +  if (tree_view->priv->button_style)
 +    {
 +      g_object_unref (tree_view->priv->button_style);
 +      tree_view->priv->button_style = NULL;
 +    }
 +
 +
 +  G_OBJECT_CLASS (pspp_sheet_view_parent_class)->dispose (object);
  }
  
  \f
@@@ -1262,10 -1224,14 +1262,10 @@@ pspp_sheet_view_buildable_add_child (Gt
    pspp_sheet_view_append_column (PSPP_SHEET_VIEW (tree_view), PSPP_SHEET_VIEW_COLUMN (child));
  }
  
 -/* GtkObject Methods
 - */
 -
  static void
 -pspp_sheet_view_destroy (GtkObject *object)
 +pspp_sheet_view_finalize (GObject *object)
  {
    PsppSheetView *tree_view = PSPP_SHEET_VIEW (object);
 -  GList *list;
  
    pspp_sheet_view_stop_editing (tree_view, TRUE);
  
        tree_view->priv->selected = NULL;
      }
  
 -  if (tree_view->priv->columns != NULL)
 -    {
 -      list = tree_view->priv->columns;
 -      while (list)
 -      {
 -        PsppSheetViewColumn *column;
 -        column = PSPP_SHEET_VIEW_COLUMN (list->data);
 -        list = list->next;
 -        pspp_sheet_view_remove_column (tree_view, column);
 -      }
 -      tree_view->priv->columns = NULL;
 -    }
  
    tree_view->priv->prelight_node = -1;
  
 -  if (tree_view->priv->selection != NULL)
 -    {
 -      _pspp_sheet_selection_set_tree_view (tree_view->priv->selection, NULL);
 -      g_object_unref (tree_view->priv->selection);
 -      tree_view->priv->selection = NULL;
 -    }
  
    if (tree_view->priv->scroll_to_path != NULL)
      {
  
    pspp_sheet_view_set_model (tree_view, NULL);
  
 -  if (tree_view->priv->hadjustment)
 -    {
 -      g_object_unref (tree_view->priv->hadjustment);
 -      tree_view->priv->hadjustment = NULL;
 -    }
 -  if (tree_view->priv->vadjustment)
 -    {
 -      g_object_unref (tree_view->priv->vadjustment);
 -      tree_view->priv->vadjustment = NULL;
 -    }
 -
 -  if (tree_view->priv->button_style)
 -    {
 -      g_object_unref (tree_view->priv->button_style);
 -      tree_view->priv->button_style = NULL;
 -    }
  
 -  GTK_OBJECT_CLASS (pspp_sheet_view_parent_class)->destroy (object);
 +  G_OBJECT_CLASS (pspp_sheet_view_parent_class)->finalize (object);
  }
  
  \f
@@@ -1420,7 -1420,6 +1420,7 @@@ pspp_sheet_view_map (GtkWidget *widget
  static void
  pspp_sheet_view_realize (GtkWidget *widget)
  {
 +  gint i;
    PsppSheetView *tree_view = PSPP_SHEET_VIEW (widget);
    GList *tmp_list;
    GdkWindowAttr attributes;
    pspp_sheet_view_set_grid_lines (tree_view, tree_view->priv->grid_lines);
  
    install_presize_handler (tree_view); 
 +
 +  for (i = 0; i < 5; ++i)
 +    {
 +      tree_view->priv->grid_line_gc[i] = gdk_gc_new (widget->window);
 +      gdk_gc_copy (tree_view->priv->grid_line_gc[i], widget->style->text_aa_gc[i]);
 +    }
  }
  
  static void
  pspp_sheet_view_unrealize (GtkWidget *widget)
  {
 +  gint x;
    PsppSheetView *tree_view = PSPP_SHEET_VIEW (widget);
    PsppSheetViewPrivate *priv = tree_view->priv;
    GList *list;
  
 +  GTK_WIDGET_CLASS (pspp_sheet_view_parent_class)->unrealize (widget);
 +
    if (priv->scroll_timeout != 0)
      {
        g_source_remove (priv->scroll_timeout);
        priv->drag_highlight_window = NULL;
      }
  
 -  if (priv->grid_line_gc)
 +  for (x = 0 ; x < 5 ; ++x)
 +    g_object_unref (priv->grid_line_gc[x]);
 +
 +  if (tree_view->priv->columns != NULL)
      {
 -      g_object_unref (priv->grid_line_gc);
 -      priv->grid_line_gc = NULL;
 +      list = tree_view->priv->columns;
 +      while (list)
 +      {
 +        PsppSheetViewColumn *column;
 +        column = PSPP_SHEET_VIEW_COLUMN (list->data);
 +        list = list->next;
 +        pspp_sheet_view_remove_column (tree_view, column);
 +      }
 +      tree_view->priv->columns = NULL;
      }
 -
 -  GTK_WIDGET_CLASS (pspp_sheet_view_parent_class)->unrealize (widget);
  }
  
  /* GtkWidget::size_request helper */
@@@ -2321,7 -2303,6 +2321,6 @@@ pspp_sheet_view_button_press (GtkWidge
        PsppSheetViewColumn *column = NULL;
        GtkCellRenderer *focus_cell = NULL;
        gboolean row_double_click = FALSE;
-       gboolean node_selected;
  
        /* Empty tree? */
        if (tree_view->priv->row_count == 0)
          return TRUE;
  
        /* select */
-       node_selected = pspp_sheet_view_node_is_selected (tree_view, node);
        pre_val = tree_view->priv->vadjustment->value;
  
        path = _pspp_sheet_view_find_path (tree_view, node);
            tree_view->priv->press_start_node = node;
  
          if (tree_view->priv->rubber_banding_enable
-             //&& !node_selected
              && (tree_view->priv->selection->type == PSPP_SHEET_SELECTION_MULTIPLE ||
                    tree_view->priv->selection->type == PSPP_SHEET_SELECTION_RECTANGLE))
            {
@@@ -3745,7 -3724,7 +3742,7 @@@ pspp_sheet_view_draw_grid_lines (PsppSh
        if (current_x - 1 >= event->area.x
            && current_x - 1 < event->area.x + event->area.width)
          gdk_draw_line (event->window,
 -                       tree_view->priv->grid_line_gc,
 +                       tree_view->priv->grid_line_gc[GTK_WIDGET(tree_view)->state],
                         current_x - 1, min_y,
                         current_x - 1, max_y - min_y);
      }
@@@ -3771,7 -3750,6 +3768,6 @@@ pspp_sheet_view_bin_expose (GtkWidge
    gint new_y;
    gint y_offset, cell_offset;
    gint max_height;
-   gint depth;
    GdkRectangle background_area;
    GdkRectangle cell_area;
    guint flags;
    gtk_tree_model_get_iter (tree_view->priv->model,
                           &iter,
                           path);
-   depth = gtk_tree_path_get_depth (path);
    gtk_tree_path_free (path);
    
    cursor_path = NULL;
            {
              if (background_area.y > 0)
                gdk_draw_line (event->window,
 -                             tree_view->priv->grid_line_gc,
 +                             tree_view->priv->grid_line_gc[widget->state],
                               background_area.x, background_area.y,
                               background_area.x + background_area.width,
                               background_area.y);
  
              if (y_offset + max_height >= event->area.height)
                gdk_draw_line (event->window,
 -                             tree_view->priv->grid_line_gc,
 +                             tree_view->priv->grid_line_gc[widget->state],
                               background_area.x, background_area.y + max_height,
                               background_area.x + background_area.width,
                               background_area.y + max_height);
@@@ -5021,7 -4998,6 +5016,6 @@@ validate_row (PsppSheetView *tree_view
    gint horizontal_separator;
    gint vertical_separator;
    gint focus_line_width;
-   gboolean retval = FALSE;
    gboolean draw_vgrid_lines, draw_hgrid_lines;
    gint focus_pad;
    gint grid_line_width;
        }
  
        if (tmp_width > column->requested_width)
-       {
-         retval = TRUE;
-         column->requested_width = tmp_width;
-       }
+         column->requested_width = tmp_width;
      }
  
    if (draw_hgrid_lines)
@@@ -5360,9 -5333,6 +5351,9 @@@ do_presize_handler (PsppSheetView *tree
    validate_visible_area (tree_view);
    tree_view->priv->presize_handler_timer = 0;
  
 +  if (! gtk_widget_get_realized (GTK_WIDGET (tree_view)))
 +    return FALSE;
 +
    gtk_widget_size_request (GTK_WIDGET (tree_view), &requisition);
  
    tree_view->priv->hadjustment->upper = MAX (tree_view->priv->hadjustment->upper, (gfloat)requisition.width);
@@@ -6827,18 -6797,9 +6818,18 @@@ pspp_sheet_view_style_set (GtkWidget *w
  
    if (gtk_widget_get_realized (widget))
      {
 +      gint i;
 +      PsppSheetViewPrivate *priv = PSPP_SHEET_VIEW (widget)->priv;
 +
        gdk_window_set_back_pixmap (widget->window, NULL, FALSE);
        gdk_window_set_background (tree_view->priv->bin_window, &widget->style->base[widget->state]);
        gtk_style_set_background (widget->style, tree_view->priv->header_window, GTK_STATE_NORMAL);
 +      for (i = 0; i < 5 ; ++i)
 +      {
 +        g_object_unref (priv->grid_line_gc[i]);
 +        priv->grid_line_gc[i] = gdk_gc_new (widget->window);
 +        gdk_gc_copy (priv->grid_line_gc[i], widget->style->text_aa_gc[i]);
 +      }
  
        pspp_sheet_view_set_grid_lines (tree_view, tree_view->priv->grid_lines);
      }
@@@ -8056,7 -8017,7 +8047,7 @@@ pspp_sheet_view_move_cursor_left_right 
        gboolean left, right;
  
        column = list->data;
 -      if (column->visible == FALSE)
 +      if (column->visible == FALSE || column->row_head)
        goto loop_end;
  
        pspp_sheet_view_column_cell_set_cell_data (column,
@@@ -8812,7 -8773,6 +8803,6 @@@ pspp_sheet_view_set_model (PsppSheetVie
    if (tree_view->priv->model)
      {
        gint i;
-       GtkTreeModelFlags flags;
  
        if (tree_view->priv->search_column == -1)
        {
                        G_CALLBACK (pspp_sheet_view_rows_reordered),
                        tree_view);
  
-       flags = gtk_tree_model_get_flags (tree_view->priv->model);
        tree_view->priv->row_count = gtk_tree_model_iter_n_children (tree_view->priv->model, NULL);
  
        /*  FIXME: do I need to do this? pspp_sheet_view_create_buttons (tree_view); */
@@@ -9236,8 -9194,7 +9224,8 @@@ pspp_sheet_view_remove_column (PsppShee
        }
  
        if (tree_view->priv->n_columns == 0 &&
 -        pspp_sheet_view_get_headers_visible (tree_view))
 +        pspp_sheet_view_get_headers_visible (tree_view) && 
 +        tree_view->priv->header_window)
        gdk_window_hide (tree_view->priv->header_window);
  
        gtk_widget_queue_resize (GTK_WIDGET (tree_view));
@@@ -11052,7 -11009,6 +11040,6 @@@ pspp_sheet_view_create_row_drag_icon (P
    GdkRectangle background_area;
    GdkRectangle expose_area;
    GtkWidget *widget;
-   gint depth;
    /* start drawing inside the black outline */
    gint x = 1, y = 1;
    GdkDrawable *drawable;
    if (!gtk_widget_get_realized (widget))
      return NULL;
  
-   depth = gtk_tree_path_get_depth (path);
    _pspp_sheet_view_find_node (tree_view,
                              path,
                              &node);
@@@ -12091,154 -12045,6 +12076,154 @@@ pspp_sheet_view_editable_clicked (GtkBu
                                                 sheet_view);
  }
  
 +static gboolean
 +is_all_selected (GtkWidget *widget)
 +{
 +  GtkEntryBuffer *buffer;
 +  gint start_pos, end_pos;
 +
 +  if (!GTK_IS_ENTRY (widget))
 +    return FALSE;
 +
 +  buffer = gtk_entry_get_buffer (GTK_ENTRY (widget));
 +  return (gtk_editable_get_selection_bounds (GTK_EDITABLE (widget),
 +                                             &start_pos, &end_pos)
 +          && start_pos == 0
 +          && end_pos == gtk_entry_buffer_get_length (buffer));
 +}
 +
 +static gboolean
 +is_at_left (GtkWidget *widget)
 +{
 +  return (GTK_IS_ENTRY (widget)
 +          && gtk_editable_get_position (GTK_EDITABLE (widget)) == 0);
 +}
 +
 +static gboolean
 +is_at_right (GtkWidget *widget)
 +{
 +  GtkEntryBuffer *buffer;
 +  gint length;
 +
 +  if (!GTK_IS_ENTRY (widget))
 +    return FALSE;
 +
 +  buffer = gtk_entry_get_buffer (GTK_ENTRY (widget));
 +  length = gtk_entry_buffer_get_length (buffer);
 +  return gtk_editable_get_position (GTK_EDITABLE (widget)) == length;
 +}
 +
 +static gboolean
 +pspp_sheet_view_event (GtkWidget *widget,
 +                       GdkEventKey *event,
 +                       PsppSheetView *tree_view)
 +{
 +  PsppSheetViewColumn *column;
 +  GtkTreePath *path;
 +  gboolean handled;
 +  gboolean cancel;
 +  guint keyval;
 +  guint state;
 +  gint row;
 +
 +  /* Intercept only key press events.
 +     It would make sense to use "key-press-event" instead of "event", but
 +     GtkEntry attaches its own signal handler to "key-press-event" that runs
 +     before ours and overrides our desired behavior for GDK_Up and GDK_Down.
 +  */
 +  if (event->type != GDK_KEY_PRESS)
 +    return FALSE;
 +
 +  if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK | GDK_MOD1_MASK))
 +    {
 +      /* Pass through most keys that include modifiers. */
 +      if ((event->keyval == GDK_Tab || event->keyval == GDK_ISO_Left_Tab)
 +          && !(event->state & (GDK_CONTROL_MASK | GDK_MOD1_MASK)))
 +        {
 +          /* Special case for Shift-Tab. */
 +        }
 +      else
 +        return FALSE;
 +    }
 +
 +  keyval = event->keyval;
 +  state = event->state & ~(GDK_CONTROL_MASK | GDK_SHIFT_MASK | GDK_MOD1_MASK);
 +  cancel = FALSE;
 +  switch (event->keyval)
 +    {
 +    case GDK_Left:      case GDK_KP_Left:
 +      if (!is_all_selected (widget) && !is_at_left (widget))
 +        return FALSE;
 +      break;
 +
 +    case GDK_Right:     case GDK_KP_Right:
 +      if (!is_all_selected (widget) && !is_at_right (widget))
 +        return FALSE;
 +      break;
 +
 +    case GDK_Up:        case GDK_KP_Up:
 +    case GDK_Down:      case GDK_KP_Down:
 +      break;
 +
 +    case GDK_Page_Up:   case GDK_KP_Page_Up:
 +    case GDK_Page_Down: case GDK_KP_Page_Down:
 +      break;
 +
 +    case GDK_Escape:
 +      cancel = TRUE;
 +      break;
 +
 +    case GDK_Return:
 +      keyval = GDK_Down;
 +      break;
 +
 +    case GDK_Tab:
 +    case GDK_ISO_Left_Tab:
 +      keyval = event->state & GDK_SHIFT_MASK ? GDK_Left : GDK_Right;
 +      break;
 +
 +    default:
 +      return FALSE;
 +    }
 +
 +  row = tree_view->priv->edited_row;
 +  column = tree_view->priv->edited_column;
 +  path = gtk_tree_path_new_from_indices (row, -1);
 +
 +  pspp_sheet_view_stop_editing (tree_view, cancel);
 +  gtk_widget_grab_focus (GTK_WIDGET (tree_view));
 +
 +  pspp_sheet_view_set_cursor (tree_view, path, column, FALSE);
 +  gtk_tree_path_free (path);
 +
 +  handled = gtk_binding_set_activate (edit_bindings, keyval, state,
 +                                      GTK_OBJECT (tree_view));
 +  if (handled)
 +    g_signal_stop_emission_by_name (widget, "event");
 +
 +  pspp_sheet_view_get_cursor (tree_view, &path, NULL);
 +  pspp_sheet_view_start_editing (tree_view, path);
 +  gtk_tree_path_free (path);
 +
 +  return handled;
 +}
 +
 +static void
 +pspp_sheet_view_override_cell_keypresses (GtkWidget *widget,
 +                                          gpointer data)
 +{
 +  PsppSheetView *sheet_view = data;
 +
 +  g_signal_connect (widget, "event",
 +                    G_CALLBACK (pspp_sheet_view_event),
 +                    sheet_view);
 +
 +  if (GTK_IS_CONTAINER (widget))
 +    gtk_container_foreach (GTK_CONTAINER (widget),
 +                           pspp_sheet_view_override_cell_keypresses,
 +                           data);
 +}
 +
  static void
  pspp_sheet_view_real_start_editing (PsppSheetView       *tree_view,
                                  PsppSheetViewColumn *column,
    PsppSheetSelectionMode mode = pspp_sheet_selection_get_mode (tree_view->priv->selection);
    gint pre_val = tree_view->priv->vadjustment->value;
    GtkRequisition requisition;
 +  gint row;
 +
 +  g_return_if_fail (gtk_tree_path_get_depth (path) == 1);
  
    tree_view->priv->edited_column = column;
    _pspp_sheet_view_column_start_editing (column, GTK_CELL_EDITABLE (cell_editable));
  
 +  row = gtk_tree_path_get_indices (path)[0];
 +  tree_view->priv->edited_row = row;
    pspp_sheet_view_real_set_cursor (tree_view, path, FALSE, TRUE);
    cell_area->y += pre_val - (int)tree_view->priv->vadjustment->value;
  
                          G_CALLBACK (pspp_sheet_view_editable_button_press_event),
                          tree_view);
        g_object_set_data (G_OBJECT (cell_editable), "pspp-sheet-view-node",
 -                         GINT_TO_POINTER (gtk_tree_path_get_indices (path)[0]));
 +                         GINT_TO_POINTER (row));
        g_signal_connect (cell_editable, "clicked",
                          G_CALLBACK (pspp_sheet_view_editable_clicked),
                          tree_view);
      }
 +
 +  pspp_sheet_view_override_cell_keypresses (GTK_WIDGET (cell_editable),
 +                                            tree_view);
  }
  
  void
@@@ -12532,6 -12330,29 +12517,6 @@@ pspp_sheet_view_set_grid_lines (PsppShe
    old_grid_lines = priv->grid_lines;
    priv->grid_lines = grid_lines;
    
 -  if (gtk_widget_get_realized (widget))
 -    {
 -      if (grid_lines == PSPP_SHEET_VIEW_GRID_LINES_NONE &&
 -        priv->grid_line_gc)
 -      {
 -        g_object_unref (priv->grid_line_gc);
 -        priv->grid_line_gc = NULL;
 -      }
 -      
 -      if (grid_lines != PSPP_SHEET_VIEW_GRID_LINES_NONE && 
 -        !priv->grid_line_gc)
 -      {
 -        gint line_width;
 -
 -        gtk_widget_style_get (widget,
 -                              "grid-line-width", &line_width,
 -                              NULL);
 -      
 -        priv->grid_line_gc = gdk_gc_new (widget->window);
 -        gdk_gc_copy (priv->grid_line_gc, widget->style->black_gc);
 -      }      
 -    }
 -
    if (old_grid_lines != grid_lines)
      {
        gtk_widget_queue_draw (GTK_WIDGET (tree_view));
@@@ -12571,12 -12392,10 +12556,10 @@@ pspp_sheet_view_set_special_cells (Pspp
                              PsppSheetViewSpecialCells   special_cells)
  {
    PsppSheetViewPrivate *priv;
-   GtkWidget *widget;
  
    g_return_if_fail (PSPP_IS_SHEET_VIEW (tree_view));
  
    priv = tree_view->priv;
-   widget = GTK_WIDGET (tree_view);
  
    if (priv->special_cells != special_cells)
      {
index eddb4f0d62072aac2c119b266df00dcd30184079,5bdee0bb9e12984a15767b4e8cc4417df9dae304..543286094dd0a1bb10df9489cbb3ddf81cd6e5eb
@@@ -37,6 -37,7 +37,6 @@@
  #include <ui/gui/builder-wrapper.h>
  #include "helper.h"
  #include <ui/gui/psppire-dialog.h>
 -#include <ui/gui/psppire-var-store.h>
  
  #include "psppire-val-chooser.h"
  
@@@ -451,6 -452,7 +451,7 @@@ on_selection_change (GtkTreeSelection *
        gtk_widget_set_sensitive  (rd->new_label_entry, TRUE);
  
        ok = gtk_tree_model_get_iter (model, &iter, (GtkTreePath*) rows->data);
+       g_return_if_fail (ok);
  
        gtk_tree_model_get (model, &iter,
                          0, &var, 
@@@ -610,6 -612,9 +611,6 @@@ recode_dialog (PsppireDataWindow *de, g
  
    GtkWidget *output_variable_box = get_widget_assert (builder,"frame4");
  
 -  PsppireVarStore *vs = NULL;
 -  g_object_get (de->data_editor, "var-store", &vs, NULL);
 -
    rd.change_button = get_widget_assert (builder, "change-button");
    rd.varmap = NULL;
    rd.dialog = get_widget_assert   (builder, "recode-dialog");
    rd.new_name_entry = get_widget_assert (builder, "dest-name-entry");
    rd.new_label_entry = get_widget_assert (builder, "dest-label-entry");
  
 -  g_object_get (vs, "dictionary", &rd.dict, NULL);
 +  g_object_get (de->data_editor, "dictionary", &rd.dict, NULL);
  
    rd.value_map = gtk_list_store_new (2,
                                     old_value_get_type (),
index 82ef6315456bd1f9e3f2c6451cd303d2308c6ca1,e57075e2c602ea3c95d42de1c1bcb85e09473c04..2cf10d532945d837965b4861a837ec3a86e5f39d
@@@ -34,6 -34,9 +34,6 @@@
  
  #include "dialog-common.h"
  
 -/* FIXME: These shouldn't be here */
 -#include "psppire-var-store.h"
 -
  
  struct split_file_dialog
  {
@@@ -162,6 -165,7 +162,6 @@@ split_file_dialog (PsppireDataWindow *d
  {
    gint response;
    struct split_file_dialog sfd;
 -  PsppireVarStore *vs ;
  
    GtkWidget *dialog   ;
    GtkWidget *source   ;
  
    sfd.tv = GTK_TREE_VIEW (get_widget_assert (sfd.xml, "split-file-grouping-vars"));
  
 -  g_object_get (de->data_editor, "var-store", &vs, NULL);
 -
 -  g_object_get (vs, "dictionary", &sfd.dict, NULL);
 +  g_object_get (de->data_editor, "dictionary", &sfd.dict, NULL);
  
-   sfd.selector = PSPPIRE_SELECTOR (get_widget_assert (sfd.xml, "split-file-selector"));
+   sfd.selector = PSPPIRE_SELECTOR (selector);
  
    g_object_set (source, "model", sfd.dict, NULL);