X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-data-sheet.c;h=b4e3d5f3d6cd8304b0764de216e10e7e575cc008;hb=a74cf2a2c1391eae93cba8cbe6772cc3b8013193;hp=01afb5ed8772e50a9bd136241de385429a0d646e;hpb=0b0ca44889e637251cb5f2dbf3c7fdc4ec8b9bd7;p=pspp diff --git a/src/ui/gui/psppire-data-sheet.c b/src/ui/gui/psppire-data-sheet.c index 01afb5ed87..b4e3d5f3d6 100644 --- a/src/ui/gui/psppire-data-sheet.c +++ b/src/ui/gui/psppire-data-sheet.c @@ -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; } @@ -337,13 +339,15 @@ on_data_column_editing_started (GtkCellRenderer *cell, if (var_has_value_labels (var) && GTK_IS_COMBO_BOX (editable)) { const struct val_labs *labels = var_get_value_labels (var); - const struct val_lab *vl; + const struct val_lab **vls = val_labs_sorted (labels); + size_t n_vls = val_labs_count (labels); GtkListStore *list_store; + int i; list_store = gtk_list_store_new (1, G_TYPE_STRING); - for (vl = val_labs_first (labels); vl != NULL; - vl = val_labs_next (labels, vl)) + for (i = 0; i < n_vls; ++i) { + const struct val_lab *vl = vls[i]; GtkTreeIter iter; gtk_list_store_append (list_store, &iter); @@ -351,6 +355,7 @@ on_data_column_editing_started (GtkCellRenderer *cell, 0, val_lab_get_label (vl), -1); } + free (vls); gtk_combo_box_set_model (GTK_COMBO_BOX (editable), GTK_TREE_MODEL (list_store)); @@ -416,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 @@ -586,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 @@ -671,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), @@ -833,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 @@ -874,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; @@ -915,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; @@ -940,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"); } } @@ -1183,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) @@ -1217,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); } @@ -1308,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, @@ -1316,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 @@ -1368,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; } @@ -1376,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); @@ -1402,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) { @@ -1433,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; @@ -1458,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, @@ -1523,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); @@ -1564,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 = @@ -1691,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; @@ -1706,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); @@ -1723,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 * @@ -1789,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); } } @@ -1906,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); @@ -1918,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); @@ -2042,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", @@ -2302,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); @@ -2362,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 @@ -2435,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?) */ @@ -2455,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++; @@ -2492,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); @@ -2510,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); }