X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-data-editor.c;h=27d2f140991eaf220dbcae2b2a4a2ae64e682fea;hb=31f8fb281926b5b05feb67596627f0366c58d52e;hp=d5b0e5136042d0588cf91eaab60ff6a6e03fd5ea;hpb=da01baa7c5ac97ee0b23db58585b50c587f12957;p=pspp diff --git a/src/ui/gui/psppire-data-editor.c b/src/ui/gui/psppire-data-editor.c index d5b0e51360..27d2f14099 100644 --- a/src/ui/gui/psppire-data-editor.c +++ b/src/ui/gui/psppire-data-editor.c @@ -28,6 +28,7 @@ #include "libpspp/str.h" #include "ui/gui/executor.h" #include "ui/gui/helper.h" +#include "ui/gui/var-display.h" #include "ui/gui/psppire-data-store.h" #include "ui/gui/psppire-data-window.h" #include "ui/gui/psppire-value-entry.h" @@ -91,18 +92,51 @@ create_combo_renderer (GType type) return r; } -GtkCellRenderer *xx ; -GtkCellRenderer *column_width_renderer ; -GtkCellRenderer *measure_renderer ; -GtkCellRenderer *alignment_renderer ; +static gchar * +var_sheet_data_to_string (GtkTreeModel *m, gint col, gint row, const GValue *in) +{ + if (col >= n_DICT_COLS - 1) /* -1 because psppire-dict has an extra column */ + return NULL; + + const struct variable *var = psppire_dict_get_variable (PSPPIRE_DICT (m), row); + if (var == NULL) + return NULL; + + if (col == DICT_TVM_COL_TYPE) + { + const struct fmt_spec *print = var_get_print_format (var); + return strdup (fmt_gui_name (print->type)); + } + else if (col == DICT_TVM_COL_MISSING_VALUES) + return missing_values_to_string (var, NULL); + else if (col == DICT_TVM_COL_VALUE_LABELS) + { + const struct val_labs *vls = var_get_value_labels (var); + if (vls == NULL) + return strdup (_("None")); + const struct val_lab **labels = val_labs_sorted (vls); + const struct val_lab *vl = labels[0]; + gchar *vstr = value_to_text (vl->value, var); + char *text = xasprintf (_("{%s, %s}..."), vstr, + val_lab_get_escaped_label (vl)); + free (vstr); + free (labels); + return text; + } + return jmd_sheet_default_forward_conversion (m, col, row, in); +} +static GtkCellRenderer *spin_renderer; +static GtkCellRenderer *column_width_renderer; +static GtkCellRenderer *measure_renderer; +static GtkCellRenderer *alignment_renderer; static GtkCellRenderer * select_renderer_func (gint col, gint row, GType type) { - if (!xx) - xx = create_spin_renderer (type); + if (!spin_renderer) + spin_renderer = create_spin_renderer (type); if (col == DICT_TVM_COL_ROLE && !column_width_renderer) column_width_renderer = create_combo_renderer (type); @@ -118,7 +152,7 @@ select_renderer_func (gint col, gint row, GType type) case DICT_TVM_COL_WIDTH: case DICT_TVM_COL_DECIMAL: case DICT_TVM_COL_COLUMNS: - return xx; + return spin_renderer; case DICT_TVM_COL_ALIGNMENT: return alignment_renderer; @@ -218,10 +252,17 @@ change_var_property (PsppireDict *dict, gint col, gint row, GValue *value) /* Return the IDXth variable */ struct variable *var = psppire_dict_get_variable (dict, row); + if (NULL == var) + var = psppire_dict_insert_variable (dict, row, NULL); + switch (col) { case DICT_TVM_COL_NAME: - dict_rename_var (dict->dict, var, g_value_get_string (value)); + { + const char *name = g_value_get_string (value); + if (psppire_dict_check_name (dict, name, FALSE)) + dict_rename_var (dict->dict, var, g_value_get_string (value)); + } break; case DICT_TVM_COL_LABEL: var_set_label (var, g_value_get_string (value)); @@ -428,7 +469,6 @@ psppire_data_editor_class_init (PsppireDataEditorClass *klass) g_object_class_install_property (object_class, PROP_SPLIT_WINDOW, split_window_spec); - } @@ -616,16 +656,28 @@ insert_new_case (PsppireDataEditor *de) } static void -delete_variables (PsppireDataEditor *de) +data_delete_variables (PsppireDataEditor *de) { JmdRange *range = JMD_SHEET(de->data_sheet)->selection; psppire_dict_delete_variables (de->dict, range->start_x, (range->end_x - range->start_x + 1)); - gtk_widget_queue_draw (GTK_WIDGET (de)); + gtk_widget_queue_draw (GTK_WIDGET (de->data_sheet)); } +static void +var_delete_variables (PsppireDataEditor *de) +{ + JmdRange *range = JMD_SHEET(de->var_sheet)->selection; + + psppire_dict_delete_variables (de->dict, range->start_y, + (range->end_y - range->start_y + 1)); + + gtk_widget_queue_draw (GTK_WIDGET (de->var_sheet)); +} + + static void insert_new_variable_data (PsppireDataEditor *de) { @@ -671,6 +723,8 @@ create_var_row_header_popup_menu (PsppireDataEditor *de) de->var_clear_variables_menu_item = gtk_menu_item_new_with_mnemonic (_("Cl_ear Variables")); + g_signal_connect_swapped (de->var_clear_variables_menu_item, "activate", + G_CALLBACK (var_delete_variables), de); gtk_widget_set_sensitive (de->var_clear_variables_menu_item, FALSE); gtk_menu_shell_append (GTK_MENU_SHELL (menu), de->var_clear_variables_menu_item); @@ -719,7 +773,7 @@ create_data_column_header_popup_menu (PsppireDataEditor *de) de->data_clear_variables_menu_item = gtk_menu_item_new_with_mnemonic (_("Cl_ear Variables")); g_signal_connect_swapped (de->data_clear_variables_menu_item, "activate", - G_CALLBACK (delete_variables), de); + G_CALLBACK (data_delete_variables), de); gtk_widget_set_sensitive (de->data_clear_variables_menu_item, FALSE); gtk_menu_shell_append (GTK_MENU_SHELL (menu), de->data_clear_variables_menu_item); @@ -744,6 +798,20 @@ create_data_column_header_popup_menu (PsppireDataEditor *de) return menu; } +static void +set_var_popup_sensitivity (JmdSheet *sheet, gpointer selection, gpointer p) +{ + + JmdRange *range = selection; + PsppireDataEditor *de = PSPPIRE_DATA_EDITOR (p); + gint width = gtk_tree_model_get_n_columns (sheet->data_model); + + gboolean whole_row_selected = (range->start_x == 0 && + range->end_x == width - 1 - 1); + /* PsppireDict has an "extra" column: TVM_COL_VAR ^^^ */ + gtk_widget_set_sensitive (de->var_clear_variables_menu_item, whole_row_selected); +} + static void set_menu_items_sensitivity (JmdSheet *sheet, gpointer selection, gpointer p) { @@ -909,9 +977,15 @@ psppire_data_editor_init (PsppireDataEditor *de) "select-renderer-func", select_renderer_func, NULL); + jmd_sheet_set_conversion_func (JMD_SHEET (de->var_sheet), + var_sheet_data_to_string, NULL); + g_signal_connect (de->var_sheet, "row-header-pressed", G_CALLBACK (show_variables_row_popup), de); + g_signal_connect (de->var_sheet, "selection-changed", + G_CALLBACK (set_var_popup_sensitivity), de); + GtkWidget *var_button = jmd_sheet_get_button (JMD_SHEET (de->var_sheet)); gtk_button_set_label (GTK_BUTTON (var_button), _("Variable"));