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=d0afe99fa15e20f6b7df7d273e7e3f4774818a4b;hpb=109eccf01c32b5784f464de2d424fd7a9905123f;p=pspp diff --git a/src/ui/gui/psppire-data-editor.c b/src/ui/gui/psppire-data-editor.c index d0afe99fa1..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); - } @@ -768,7 +808,7 @@ set_var_popup_sensitivity (JmdSheet *sheet, gpointer selection, gpointer p) gboolean whole_row_selected = (range->start_x == 0 && range->end_x == width - 1 - 1); - /* PsppireDict has an "extra" column: TVM_COL_VAR ^^^ */ + /* PsppireDict has an "extra" column: TVM_COL_VAR ^^^ */ gtk_widget_set_sensitive (de->var_clear_variables_menu_item, whole_row_selected); } @@ -937,6 +977,9 @@ 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);