Remove deprecated objects GtkAction and GtkUIManager
[pspp] / src / ui / gui / psppire-data-sheet.c
index 279c36953efcb668564fdfd5a92a784e7af246ce..b4e3d5f3d6cd8304b0764de216e10e7e575cc008 100644 (file)
@@ -124,6 +124,7 @@ on_query_tooltip (GtkWidget *widget, gint wx, gint wy,
   int width;
 
   g_return_val_if_fail (data_store != NULL, FALSE);
+  g_return_val_if_fail (data_store->datasheet != NULL, FALSE);
 
   if (!get_tooltip_location (widget, tooltip, wx, wy, &row, &column))
     return FALSE;
@@ -176,9 +177,9 @@ render_row_number_cell (PsppSheetViewColumn *tree_column,
 {
   PsppireDataStore *store = store_;
   GValue gvalue = { 0, };
-  gint row;
+  gint row = GPOINTER_TO_INT (iter->user_data);
 
-  row = GPOINTER_TO_INT (iter->user_data);
+  g_return_if_fail (store->datasheet);
 
   g_value_init (&gvalue, G_TYPE_INT);
   g_value_set_int (&gvalue, row + 1);
@@ -290,8 +291,9 @@ get_string_width (PsppSheetView *treeview, GtkCellRenderer *renderer,
 {
   gint width;
   g_object_set (G_OBJECT (renderer), "text", string, (void *) NULL);
-  gtk_cell_renderer_get_size (renderer, GTK_WIDGET (treeview),
-                              NULL, NULL, NULL, &width, NULL);
+  gtk_cell_renderer_get_preferred_width (renderer, GTK_WIDGET (treeview),
+                                        NULL, &width);
+
   return width;
 }
 
@@ -419,7 +421,7 @@ on_data_column_edited (GtkCellRendererText *cell,
     {
       gtk_widget_queue_resize (GTK_WIDGET (data_sheet));
       data_sheet->scroll_to_bottom_signal =
-        g_signal_connect (data_sheet, "size-request",
+        g_signal_connect (data_sheet, "size-allocate",
                           G_CALLBACK (scroll_to_bottom), NULL);
     }
   else
@@ -589,16 +591,71 @@ on_data_column_resized (GObject    *gobject,
   var_set_display_width (var, display_width);
 }
 
+enum sort_order
+  {
+    SORT_ASCEND,
+    SORT_DESCEND
+  };
+
+static void
+do_sort (PsppireDataSheet *data_sheet, enum sort_order order)
+{
+  PsppSheetView *sheet_view = PSPP_SHEET_VIEW (data_sheet);
+  PsppSheetSelection *selection = pspp_sheet_view_get_selection (sheet_view);
+  PsppireDataWindow *pdw;
+  GList *list, *iter;
+  GString *syntax;
+  int n_vars;
+
+  pdw = psppire_data_window_for_data_store (data_sheet->data_store);
+  g_return_if_fail (pdw != NULL);
+
+  list = pspp_sheet_selection_get_selected_columns (selection);
+
+  syntax = g_string_new ("SORT CASES BY");
+  n_vars = 0;
+  for (iter = list; iter; iter = iter->next)
+    {
+      PsppSheetViewColumn *column = iter->data;
+      struct variable *var;
+
+      var = g_object_get_data (G_OBJECT (column), "variable");
+      if (var != NULL)
+        {
+          g_string_append_printf (syntax, " %s", var_get_name (var));
+          n_vars++;
+        }
+    }
+  if (n_vars > 0)
+    {
+      if (order == SORT_DESCEND)
+        g_string_append (syntax, " (DOWN)");
+      g_string_append_c (syntax, '.');
+      execute_const_syntax_string (pdw, syntax->str);
+    }
+  g_string_free (syntax, TRUE);
+}
+
+static void
+on_sort_up (PsppireDataSheet *data_sheet)
+{
+  do_sort (data_sheet, SORT_ASCEND);
+}
+
+static void
+on_sort_down (PsppireDataSheet *data_sheet)
+{
+  do_sort (data_sheet, SORT_DESCEND);
+}
+
 static void
 do_data_column_popup_menu (PsppSheetViewColumn *column,
                            guint button, guint32 time)
 {
   GtkWidget *sheet_view = pspp_sheet_view_column_get_tree_view (column);
   PsppireDataSheet *data_sheet = PSPPIRE_DATA_SHEET (sheet_view);
-  GtkWidget *menu;
 
-  menu = get_widget_assert (data_sheet->builder, "datasheet-variable-popup");
-  gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, button, time);
+  gtk_menu_popup (GTK_MENU (data_sheet->column_popup_menu), NULL, NULL, NULL, NULL, button, time);
 }
 
 static void
@@ -674,7 +731,7 @@ add_data_column_cell_renderer (PsppireDataSheet *data_sheet,
   var = g_object_get_data (G_OBJECT (column), "variable");
   g_return_if_fail (var != NULL);
 
-  if (var_has_value_labels (var))
+  if (data_sheet->show_value_labels && var_has_value_labels (var))
     {
       cell = gtk_cell_renderer_combo_new ();
       g_object_set (G_OBJECT (cell),
@@ -836,8 +893,7 @@ enum
     PROP_CASE_NUMBERS,
     PROP_CURRENT_CASE,
     PROP_MAY_CREATE_VARS,
-    PROP_MAY_DELETE_VARS,
-    PROP_UI_MANAGER
+    PROP_MAY_DELETE_VARS
   };
 
 static void
@@ -877,7 +933,6 @@ psppire_data_sheet_set_property (GObject      *object,
                                               g_value_get_boolean (value));
       break;
 
-    case PROP_UI_MANAGER:
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -918,10 +973,6 @@ psppire_data_sheet_get_property (GObject      *object,
       g_value_set_boolean (value, obj->may_delete_vars);
       break;
 
-    case PROP_UI_MANAGER:
-      g_value_set_object (value, psppire_data_sheet_get_ui_manager (obj));
-      break;
-
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -943,10 +994,11 @@ psppire_data_sheet_set_value_labels (PsppireDataSheet *ds,
     {
       ds->show_value_labels = show_value_labels;
       g_object_notify (G_OBJECT (ds), "value-labels");
-      gtk_widget_queue_draw (GTK_WIDGET (ds));
 
-      /* Make the cell being edited refresh too. */
-      pspp_sheet_view_stop_editing (PSPP_SHEET_VIEW (ds), TRUE);
+      /* Pretend the model changed, to force the columns to be rebuilt.
+         Otherwise cell renderers won't get changed from combo boxes to text
+         entries or vice versa. */
+      g_object_notify (G_OBJECT (ds), "model");
     }
 }
 
@@ -1186,20 +1238,6 @@ psppire_data_sheet_get_current_case (const PsppireDataSheet *data_sheet)
   return row;
 }
 
-GtkUIManager *
-psppire_data_sheet_get_ui_manager (PsppireDataSheet *data_sheet)
-{
-  if (data_sheet->uim == NULL)
-    {
-      data_sheet->uim = 
-       GTK_UI_MANAGER (get_object_assert (data_sheet->builder,
-                                          "data_sheet_uim",
-                                          GTK_TYPE_UI_MANAGER));
-      g_object_ref (data_sheet->uim);
-    }
-
-  return data_sheet->uim;
-}
 
 static void
 psppire_data_sheet_dispose (GObject *object)
@@ -1220,11 +1258,6 @@ psppire_data_sheet_dispose (GObject *object)
 
   psppire_data_sheet_unset_data_store (data_sheet);
 
-  g_object_unref (data_sheet->builder);
-
-  if (data_sheet->uim)
-    g_object_unref (data_sheet->uim);
-
   G_OBJECT_CLASS (psppire_data_sheet_parent_class)->dispose (object);
 }
 
@@ -1311,6 +1344,7 @@ psppire_data_sheet_class_init (PsppireDataSheetClass *class)
                           TRUE,
                           G_PARAM_READWRITE));
 
+  
   g_object_class_install_property (
     gobject_class,
     PROP_MAY_DELETE_VARS,
@@ -1319,31 +1353,21 @@ psppire_data_sheet_class_init (PsppireDataSheetClass *class)
                           "Whether the user may delete variables",
                           TRUE,
                           G_PARAM_READWRITE));
-
-  g_object_class_install_property (
-    gobject_class,
-    PROP_UI_MANAGER,
-    g_param_spec_object ("ui-manager",
-                         "UI Manager",
-                         "UI manager for the data sheet.  The client should merge this UI manager with the active UI manager to obtain data sheet specific menu items and tool bar items.",
-                         GTK_TYPE_UI_MANAGER,
-                         G_PARAM_READABLE));
 }
 
 static void
-do_popup_menu (GtkWidget *widget, guint button, guint32 time)
+do_row_popup_menu (GtkWidget *widget, guint button, guint32 time)
 {
   PsppireDataSheet *data_sheet = PSPPIRE_DATA_SHEET (widget);
-  GtkWidget *menu;
 
-  menu = get_widget_assert (data_sheet->builder, "datasheet-cases-popup");
-  gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, button, time);
+  
+  gtk_menu_popup (GTK_MENU (data_sheet->row_popup_menu), NULL, NULL, NULL, NULL, button, time);
 }
 
 static void
 on_popup_menu (GtkWidget *widget, gpointer user_data UNUSED)
 {
-  do_popup_menu (widget, 0, gtk_get_current_event_time ());
+  do_row_popup_menu (widget, 0, gtk_get_current_event_time ());
 }
 
 static gboolean
@@ -1371,7 +1395,7 @@ on_button_pressed (GtkWidget *widget, GdkEventButton *event,
             }
         }
 
-      do_popup_menu (widget, event->button, event->time);
+      do_row_popup_menu (widget, event->button, event->time);
 
       return TRUE;
     }
@@ -1379,8 +1403,8 @@ on_button_pressed (GtkWidget *widget, GdkEventButton *event,
   return FALSE;
 }
 
-static void
-on_edit_clear_cases (GtkAction *action, PsppireDataSheet *data_sheet)
+void
+psppire_data_sheet_edit_clear_cases (PsppireDataSheet *data_sheet)
 {
   PsppSheetView *sheet_view = PSPP_SHEET_VIEW (data_sheet);
   PsppSheetSelection *selection = pspp_sheet_view_get_selection (sheet_view);
@@ -1405,17 +1429,20 @@ on_selection_changed (PsppSheetSelection *selection,
 {
   PsppSheetView *sheet_view = pspp_sheet_selection_get_tree_view (selection);
   PsppireDataSheet *data_sheet = PSPPIRE_DATA_SHEET (sheet_view);
-  gint n_selected_rows;
   gboolean any_variables_selected;
   gboolean may_delete_cases, may_delete_vars, may_insert_vars;
   GList *list, *iter;
   GtkTreePath *path;
-  GtkAction *action;
 
-  n_selected_rows = pspp_sheet_selection_count_selected_rows (selection);
+  GtkWidget *top = gtk_widget_get_toplevel (GTK_WIDGET (data_sheet));
+  if (! PSPPIRE_IS_DATA_WINDOW (top))
+    return;
+  
+  PsppireDataWindow *dw = PSPPIRE_DATA_WINDOW (top);
+
+  gint n_selected_rows = pspp_sheet_selection_count_selected_rows (selection);
 
-  action = get_action_assert (data_sheet->builder, "edit_insert-case");
-  gtk_action_set_sensitive (action, n_selected_rows > 0);
+  gtk_widget_set_sensitive (dw->mi_insert_case, n_selected_rows > 0);
 
   switch (n_selected_rows)
     {
@@ -1436,12 +1463,13 @@ on_selection_changed (PsppSheetSelection *selection,
       may_delete_cases = TRUE;
       break;
     }
-  action = get_action_assert (data_sheet->builder, "edit_clear-cases");
-  gtk_action_set_sensitive (action, may_delete_cases);
+
+  gtk_widget_set_sensitive (dw->mi_clear_cases, may_delete_cases);
 
   any_variables_selected = FALSE;
   may_delete_vars = may_insert_vars = FALSE;
   list = pspp_sheet_selection_get_selected_columns (selection);
+
   for (iter = list; iter != NULL; iter = iter->next)
     {
       PsppSheetViewColumn *column = iter->data;
@@ -1461,17 +1489,10 @@ on_selection_changed (PsppSheetSelection *selection,
   may_insert_vars = may_insert_vars && data_sheet->may_create_vars;
   may_delete_vars = may_delete_vars && data_sheet->may_delete_vars;
 
-  action = get_action_assert (data_sheet->builder, "edit_insert-variable");
-  gtk_action_set_sensitive (action, may_insert_vars);
-
-  action = get_action_assert (data_sheet->builder, "edit_clear-variables");
-  gtk_action_set_sensitive (action, may_delete_vars);
-
-  action = get_action_assert (data_sheet->builder, "sort-up");
-  gtk_action_set_sensitive (action, may_delete_vars);
-
-  action = get_action_assert (data_sheet->builder, "sort-down");
-  gtk_action_set_sensitive (action, may_delete_vars);
+  gtk_widget_set_sensitive (dw->mi_insert_var, may_insert_vars);
+  gtk_widget_set_sensitive (dw->mi_clear_variables, may_delete_vars);
+  gtk_widget_set_sensitive (data_sheet->pu_sort_up, may_delete_vars);
+  gtk_widget_set_sensitive (data_sheet->pu_sort_down, may_delete_vars);
 
   psppire_data_sheet_update_clip_actions (data_sheet);
   psppire_data_sheet_update_primary_selection (data_sheet,
@@ -1526,25 +1547,23 @@ psppire_data_sheet_get_selected_range (PsppireDataSheet *data_sheet,
   return TRUE;
 }
 
-static void
-on_edit_insert_case (GtkAction *action, PsppireDataSheet *data_sheet)
+/* Insert a case at the selected row */
+void
+psppire_data_sheet_insert_case (PsppireDataSheet *data_sheet)
 {
   PsppSheetView *sheet_view = PSPP_SHEET_VIEW (data_sheet);
   PsppSheetSelection *selection = pspp_sheet_view_get_selection (sheet_view);
   PsppireDataStore *data_store = data_sheet->data_store;
-  struct range_set *selected;
-  unsigned long row;
-
-  selected = pspp_sheet_selection_get_range_set (selection);
-  row = range_set_scan (selected, 0);
+  struct range_set *selected = pspp_sheet_selection_get_range_set (selection);
+  unsigned long row = range_set_scan (selected, 0);
   range_set_destroy (selected);
 
   if (row <= psppire_data_store_get_case_count (data_store))
     psppire_data_store_insert_new_case (data_store, row);
 }
 
-static void
-on_edit_insert_variable (GtkAction *action, PsppireDataSheet *data_sheet)
+void
+psppire_data_sheet_insert_variable (PsppireDataSheet *data_sheet)
 {
   PsppSheetView *sheet_view = PSPP_SHEET_VIEW (data_sheet);
   PsppSheetSelection *selection = pspp_sheet_view_get_selection (sheet_view);
@@ -1567,118 +1586,42 @@ on_edit_insert_variable (GtkAction *action, PsppireDataSheet *data_sheet)
     psppire_dict_insert_variable (dict, index, name);
 }
 
-static void
-on_edit_clear_variables (GtkAction *action, PsppireDataSheet *data_sheet)
+void
+psppire_data_sheet_edit_clear_variables (PsppireDataSheet *data_sheet)
 {
   PsppSheetView *sheet_view = PSPP_SHEET_VIEW (data_sheet);
   PsppSheetSelection *selection = pspp_sheet_view_get_selection (sheet_view);
   PsppireDict *dict = data_sheet->data_store->dict;
-  GList *list, *iter;
-
-  list = pspp_sheet_selection_get_selected_columns (selection);
+  GList *iter;
+  GList *list = pspp_sheet_selection_get_selected_columns (selection);
+  
   if (list == NULL)
     return;
   list = g_list_reverse (list);
   for (iter = list; iter; iter = iter->next)
     {
       PsppSheetViewColumn *column = iter->data;
-      struct variable *var;
-
-      var = g_object_get_data (G_OBJECT (column), "variable");
+      struct variable *var = g_object_get_data (G_OBJECT (column), "variable");
       if (var != NULL)
         psppire_dict_delete_variables (dict, var_get_dict_index (var), 1);
     }
   g_list_free (list);
 }
 
-enum sort_order
-  {
-    SORT_ASCEND,
-    SORT_DESCEND
-  };
-
-static void
-do_sort (PsppireDataSheet *data_sheet, enum sort_order order)
-{
-  PsppSheetView *sheet_view = PSPP_SHEET_VIEW (data_sheet);
-  PsppSheetSelection *selection = pspp_sheet_view_get_selection (sheet_view);
-  PsppireDataWindow *pdw;
-  GList *list, *iter;
-  GString *syntax;
-  int n_vars;
-
-  pdw = psppire_data_window_for_data_store (data_sheet->data_store);
-  g_return_if_fail (pdw != NULL);
-
-  list = pspp_sheet_selection_get_selected_columns (selection);
-
-  syntax = g_string_new ("SORT CASES BY");
-  n_vars = 0;
-  for (iter = list; iter; iter = iter->next)
-    {
-      PsppSheetViewColumn *column = iter->data;
-      struct variable *var;
-
-      var = g_object_get_data (G_OBJECT (column), "variable");
-      if (var != NULL)
-        {
-          g_string_append_printf (syntax, " %s", var_get_name (var));
-          n_vars++;
-        }
-    }
-  if (n_vars > 0)
-    {
-      if (order == SORT_DESCEND)
-        g_string_append (syntax, " (DOWN)");
-      g_string_append_c (syntax, '.');
-      execute_const_syntax_string (pdw, syntax->str);
-    }
-  g_string_free (syntax, TRUE);
-}
-
-void
-on_sort_up (GtkAction *action, PsppireDataSheet *data_sheet)
-{
-  do_sort (data_sheet, SORT_ASCEND);
-}
-
-void
-on_sort_down (GtkAction *action, PsppireDataSheet *data_sheet)
-{
-  do_sort (data_sheet, SORT_DESCEND);
-}
-
 void
-on_edit_goto_case (GtkAction *action, PsppireDataSheet *data_sheet)
-{
-  goto_case_dialog (data_sheet);
-}
-
-void
-on_edit_find (GtkAction *action, PsppireDataSheet *data_sheet)
-{
-  PsppireDataWindow *pdw;
-
-  pdw = psppire_data_window_for_data_store (data_sheet->data_store);
-  g_return_if_fail (pdw != NULL);
-
-  find_dialog (pdw);
-}
-
-void
-on_edit_copy (GtkAction *action, PsppireDataSheet *data_sheet)
+psppire_data_sheet_edit_copy (PsppireDataSheet *data_sheet)
 {
   psppire_data_sheet_set_clip (data_sheet, FALSE);
 }
 
 void
-on_edit_cut (GtkAction *action, PsppireDataSheet *data_sheet)
+psppire_data_sheet_edit_cut (PsppireDataSheet *data_sheet)
 {
   psppire_data_sheet_set_clip (data_sheet, TRUE);
 }
 
 void
-on_edit_paste (GtkAction *action, PsppireDataSheet *data_sheet)
+psppire_data_sheet_edit_paste (PsppireDataSheet *data_sheet)
 {
   GdkDisplay *display = gtk_widget_get_display (GTK_WIDGET (data_sheet));
   GtkClipboard *clipboard =
@@ -1694,7 +1637,6 @@ static void
 psppire_data_sheet_init (PsppireDataSheet *obj)
 {
   PsppSheetView *sheet_view = PSPP_SHEET_VIEW (obj);
-  GtkAction *action;
 
   obj->show_value_labels = FALSE;
   obj->show_case_numbers = TRUE;
@@ -1709,11 +1651,53 @@ psppire_data_sheet_init (PsppireDataSheet *obj)
   obj->new_variable_column = NULL;
   obj->container = NULL;
 
-  obj->uim = NULL;
   obj->dispose_has_run = FALSE;
 
   pspp_sheet_view_set_special_cells (sheet_view, PSPP_SHEET_VIEW_SPECIAL_CELLS_YES);
 
+  {
+    obj->row_popup_menu = gtk_menu_new ();
+    int i = 0;
+
+    GtkWidget *insert_case = gtk_menu_item_new_with_mnemonic (_("_Insert Case"));
+    GtkWidget *clear_cases = gtk_menu_item_new_with_mnemonic (_("Cl_ear Cases"));
+
+    gtk_menu_attach (GTK_MENU (obj->row_popup_menu), insert_case,     0, 1, i, i + 1); ++i;
+    gtk_menu_attach (GTK_MENU (obj->row_popup_menu), clear_cases,     0, 1, i, i + 1); ++i;
+
+    g_signal_connect_swapped (clear_cases, "activate", G_CALLBACK (psppire_data_sheet_edit_clear_cases), obj);
+    g_signal_connect_swapped (insert_case, "activate", G_CALLBACK (psppire_data_sheet_insert_case), obj);
+  
+    gtk_widget_show_all (obj->row_popup_menu);
+  }
+  
+  {
+    obj->column_popup_menu = gtk_menu_new ();
+    int i = 0;
+
+    GtkWidget *insert_variable = gtk_menu_item_new_with_mnemonic (_("_Insert Variable"));
+    GtkWidget *clear_variables = gtk_menu_item_new_with_mnemonic (_("Cl_ear Variables"));
+    obj->pu_sort_up = gtk_menu_item_new_with_mnemonic (_("Sort _Ascending"));
+    obj->pu_sort_down = gtk_menu_item_new_with_mnemonic (_("Sort _Descending"));
+
+    g_signal_connect_swapped (clear_variables, "activate", G_CALLBACK (psppire_data_sheet_edit_clear_variables), obj);
+    g_signal_connect_swapped (insert_variable, "activate", G_CALLBACK (psppire_data_sheet_insert_variable), obj);
+
+    g_signal_connect_swapped (obj->pu_sort_up, "activate", G_CALLBACK (on_sort_up), obj);
+    g_signal_connect_swapped (obj->pu_sort_down, "activate", G_CALLBACK (on_sort_down), obj);
+  
+    gtk_menu_attach (GTK_MENU (obj->column_popup_menu), insert_variable,     0, 1, i, i + 1); ++i;
+    gtk_menu_attach (GTK_MENU (obj->column_popup_menu), clear_variables,     0, 1, i, i + 1); ++i;
+
+    gtk_menu_attach (GTK_MENU (obj->column_popup_menu), gtk_separator_menu_item_new (),     0, 1, i, i + 1); ++i;
+  
+    gtk_menu_attach (GTK_MENU (obj->column_popup_menu), obj->pu_sort_up,             0, 1, i, i + 1); ++i;
+    gtk_menu_attach (GTK_MENU (obj->column_popup_menu), obj->pu_sort_down,           0, 1, i, i + 1); ++i;
+
+    gtk_widget_show_all (obj->column_popup_menu);
+  }
+
+  
   g_signal_connect (obj, "notify::model",
                     G_CALLBACK (psppire_data_sheet_model_changed), NULL);
 
@@ -1726,51 +1710,11 @@ psppire_data_sheet_init (PsppireDataSheet *obj)
                     G_CALLBACK (on_query_tooltip), NULL);
   g_signal_connect (obj, "button-press-event",
                     G_CALLBACK (on_button_pressed), NULL);
+  
   g_signal_connect (obj, "popup-menu", G_CALLBACK (on_popup_menu), NULL);
 
-  obj->builder = builder_new ("data-sheet.ui");
-
-  action = get_action_assert (obj->builder, "edit_clear-cases");
-  g_signal_connect (action, "activate", G_CALLBACK (on_edit_clear_cases),
-                    obj);
-  gtk_action_set_sensitive (action, FALSE);
   g_signal_connect (pspp_sheet_view_get_selection (sheet_view),
                     "changed", G_CALLBACK (on_selection_changed), NULL);
-
-  action = get_action_assert (obj->builder, "edit_insert-case");
-  g_signal_connect (action, "activate", G_CALLBACK (on_edit_insert_case),
-                    obj);
-
-  action = get_action_assert (obj->builder, "edit_insert-variable");
-  g_signal_connect (action, "activate", G_CALLBACK (on_edit_insert_variable),
-                    obj);
-
-  action = get_action_assert (obj->builder, "edit_goto-case");
-  g_signal_connect (action, "activate", G_CALLBACK (on_edit_goto_case),
-                    obj);
-
-  action = get_action_assert (obj->builder, "edit_copy");
-  g_signal_connect (action, "activate", G_CALLBACK (on_edit_copy), obj);
-
-  action = get_action_assert (obj->builder, "edit_cut");
-  g_signal_connect (action, "activate", G_CALLBACK (on_edit_cut), obj);
-
-  action = get_action_assert (obj->builder, "edit_paste");
-  g_signal_connect (action, "activate", G_CALLBACK (on_edit_paste), obj);
-
-  action = get_action_assert (obj->builder, "edit_clear-variables");
-  g_signal_connect (action, "activate", G_CALLBACK (on_edit_clear_variables),
-                    obj);
-
-  action = get_action_assert (obj->builder, "edit_find");
-  g_signal_connect (action, "activate", G_CALLBACK (on_edit_find), obj);
-
-  action = get_action_assert (obj->builder, "sort-up");
-  g_signal_connect (action, "activate", G_CALLBACK (on_sort_up), obj);
-
-  action = get_action_assert (obj->builder, "sort-down");
-  g_signal_connect (action, "activate", G_CALLBACK (on_sort_down), obj);
-
 }
 
 GtkWidget *
@@ -1792,19 +1736,11 @@ refresh_model (PsppireDataSheet *data_sheet)
 
   if (data_sheet->data_store != NULL)
     {
-      PsppireEmptyListStore *model;
-      GtkAction *action;
-      int n_rows;
-
-      n_rows = psppire_data_store_get_case_count (data_sheet->data_store) + 1;
-      model = psppire_empty_list_store_new (n_rows);
+      int n_rows = psppire_data_store_get_case_count (data_sheet->data_store) + 1;
+      PsppireEmptyListStore *model = psppire_empty_list_store_new (n_rows);
       pspp_sheet_view_set_model (PSPP_SHEET_VIEW (data_sheet),
                                  GTK_TREE_MODEL (model));
       g_object_unref (model);
-
-      action = get_action_assert (data_sheet->builder, "edit_copy");
-      g_signal_connect (action, "activate", G_CALLBACK (on_edit_copy),
-                        data_sheet);
     }
 }
 
@@ -1909,6 +1845,7 @@ on_variable_display_width_changed (PsppireDict *dict, int dict_index,
 
 static void
 on_variable_changed (PsppireDict *dict, int dict_index,
+                    guint what, const struct variable *oldvar,
                      PsppireDataSheet *data_sheet)
 {
   PsppireDataStore *data_store = psppire_data_sheet_get_data_store (data_sheet);
@@ -1921,11 +1858,16 @@ on_variable_changed (PsppireDict *dict, int dict_index,
   g_return_if_fail (data_sheet->data_store != NULL);
   g_return_if_fail (dict == data_sheet->data_store->dict);
 
+
+  if (what & VAR_TRAIT_DISPLAY_WIDTH)
+    on_variable_display_width_changed (dict, dict_index, data_sheet);
+
   column = psppire_data_sheet_find_column_for_variable (data_sheet,
                                                         dict_index);
   if (column == NULL)
     return;
 
+
   var = psppire_dict_get_variable (data_store->dict, dict_index);
   g_return_if_fail (var != NULL);
 
@@ -2045,9 +1987,6 @@ psppire_data_sheet_set_data_store (PsppireDataSheet *data_sheet,
       g_signal_connect (data_store->dict, "variable-changed",
                         G_CALLBACK (on_variable_changed),
                         data_sheet);
-      g_signal_connect (data_store->dict, "variable-display-width-changed",
-                        G_CALLBACK (on_variable_display_width_changed),
-                        data_sheet);
       g_signal_connect (data_store->dict, "variable-inserted",
                         G_CALLBACK (on_variable_inserted), data_sheet);
       g_signal_connect (data_store->dict, "variable-deleted",
@@ -2305,7 +2244,7 @@ psppire_data_sheet_clipboard_set (GtkSelectionData *selection_data,
       g_assert_not_reached ();
     }
 
-  gtk_selection_data_set (selection_data, selection_data->target,
+  gtk_selection_data_set (selection_data, gtk_selection_data_get_target (selection_data),
                          8,
                          (const guchar *) string->str, string->len);
 
@@ -2365,21 +2304,22 @@ static void
 psppire_data_sheet_update_clip_actions (PsppireDataSheet *data_sheet)
 {
   struct range_set *rows, *cols;
-  GtkAction *action;
-  gboolean enable;
+  GtkWidget *top = gtk_widget_get_toplevel (GTK_WIDGET (data_sheet));
+  if (! PSPPIRE_IS_DATA_WINDOW (top))
+    return;
+  
+  PsppireDataWindow *dw = PSPPIRE_DATA_WINDOW (top);
+  gboolean enable =
+    psppire_data_sheet_get_selected_range (data_sheet, &rows, &cols);
 
-  enable = psppire_data_sheet_get_selected_range (data_sheet, &rows, &cols);
   if (enable)
     {
       range_set_destroy (rows);
       range_set_destroy (cols);
     }
 
-  action = get_action_assert (data_sheet->builder, "edit_copy");
-  gtk_action_set_sensitive (action, enable);
-
-  action = get_action_assert (data_sheet->builder, "edit_cut");
-  gtk_action_set_sensitive (action, enable);
+  gtk_widget_set_sensitive (dw->mi_copy, enable);
+  gtk_widget_set_sensitive (dw->mi_cut, enable);
 }
 
 static void
@@ -2438,13 +2378,13 @@ psppire_data_sheet_clip_received_cb (GtkClipboard *clipboard,
   gint first_column;
   char *c;
 
-  if ( sd->length < 0 )
+  if ( gtk_selection_data_get_length (sd) < 0 )
     return;
 
-  if ( sd->type != gdk_atom_intern ("UTF8_STRING", FALSE))
+  if ( gtk_selection_data_get_data_type (sd) != gdk_atom_intern ("UTF8_STRING", FALSE))
     return;
 
-  c = (char *) sd->data;
+  c = (char *) gtk_selection_data_get_data (sd);
 
   /* Get the starting selected position in the data sheet.  (Possibly we should
      only paste into the selected range if it's larger than one cell?) */
@@ -2458,14 +2398,14 @@ psppire_data_sheet_clip_received_cb (GtkClipboard *clipboard,
   g_return_if_fail (next_row >= 0);
   g_return_if_fail (next_column >= 0);
 
-  while (count < sd->length)
+  while (count < gtk_selection_data_get_length (sd))
     {
       gint row = next_row;
       gint column = next_column;
       struct variable *var;
       char *s = c;
 
-      while (*c != '\t' && *c != '\n' && count < sd->length)
+      while (*c != '\t' && *c != '\n' && count < gtk_selection_data_get_length (sd))
         {
           c++;
           count++;
@@ -2495,11 +2435,9 @@ psppire_data_sheet_targets_received_cb (GtkClipboard *clipboard,
                                         gint n_atoms,
                                         gpointer data)
 {
-  GtkAction *action = GTK_ACTION (data);
-  gboolean compatible_target;
+  GtkWidget *mi = GTK_WIDGET (data);
+  gboolean compatible_target = FALSE;
   gint i;
-
-  compatible_target = FALSE;
   for (i = 0; i < G_N_ELEMENTS (targets); i++)
     {
       GdkAtom target = gdk_atom_intern (targets[i].target, TRUE);
@@ -2513,17 +2451,21 @@ psppire_data_sheet_targets_received_cb (GtkClipboard *clipboard,
           }
     }
 
-  gtk_action_set_sensitive (action, compatible_target);
-  g_object_unref (action);
+  gtk_widget_set_sensitive (mi, compatible_target);
 }
 
 static void
 on_owner_change (GtkClipboard *clip, GdkEventOwnerChange *event, gpointer data)
 {
   PsppireDataSheet *data_sheet = PSPPIRE_DATA_SHEET (data);
-  GtkAction *action = get_action_assert (data_sheet->builder, "edit_paste");
 
-  g_object_ref (action);
-  gtk_clipboard_request_targets (clip, psppire_data_sheet_targets_received_cb,
-                                 action);
+  GtkWidget *top = gtk_widget_get_toplevel (GTK_WIDGET (data_sheet));
+  if (! PSPPIRE_IS_DATA_WINDOW (top))
+    return;
+  
+  PsppireDataWindow *dw = PSPPIRE_DATA_WINDOW (top);
+
+  gtk_clipboard_request_targets (clip,
+                                psppire_data_sheet_targets_received_cb,
+                                dw->mi_paste);
 }