+static void
+on_var_column_edited (GtkCellRendererText *cell,
+ gchar *path_string,
+ gchar *new_text,
+ gpointer user_data)
+{
+ PsppireVarSheet *var_sheet = user_data;
+ GtkWindow *window = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (var_sheet)));
+ struct dictionary *dict = var_sheet->dict->dict;
+ enum vs_column column_id;
+ struct variable *var;
+ int width, decimals;
+ GtkTreePath *path;
+ gint row;
+
+ path = gtk_tree_path_new_from_string (path_string);
+ row = gtk_tree_path_get_indices (path)[0];
+ gtk_tree_path_free (path);
+
+ column_id = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (cell),
+ "column-id"));
+
+ var = psppire_dict_get_variable (var_sheet->dict, row);
+ if (var == NULL)
+ {
+ g_return_if_fail (column_id == VS_NAME);
+
+ if (!dict_id_is_valid (dict, new_text, false))
+ error_dialog (window,
+ g_strdup (_("Cannot create variable.")),
+ g_strdup_printf (_("\"%s\" is not a valid variable "
+ "name."), new_text));
+ else if (dict_lookup_var (dict, new_text) != NULL)
+ error_dialog (window,
+ g_strdup (_("Cannot create variable.")),
+ g_strdup_printf (_("This dictionary already contains "
+ "a variable named \"%s\"."),
+ new_text));
+ else
+ {
+ dict_create_var (var_sheet->dict->dict, new_text, 0);
+ if (!var_sheet->scroll_to_bottom_signal)
+ {
+ gtk_widget_queue_resize (GTK_WIDGET (var_sheet));
+ var_sheet->scroll_to_bottom_signal =
+ g_signal_connect (var_sheet, "size-request",
+ G_CALLBACK (scroll_to_bottom), NULL);
+ }
+ }
+
+ return;
+ }
+
+ switch (column_id)
+ {
+ case VS_NAME:
+ if (!dict_id_is_valid (dict, new_text, false))
+ error_dialog (window,
+ g_strdup (_("Cannot rename variable.")),
+ g_strdup_printf (_("\"%s\" is not a valid variable "
+ "name."), new_text));
+ else if (dict_lookup_var (dict, new_text) != NULL
+ && dict_lookup_var (dict, new_text) != var)
+ error_dialog (window,
+ g_strdup (_("Cannot rename variable.")),
+ g_strdup_printf (_("This dictionary already contains "
+ "a variable named \"%s\"."),
+ new_text));
+ else
+ dict_rename_var (dict, var, new_text);
+ break;
+
+ case VS_TYPE:
+ /* Not reachable. */
+ break;
+
+ case VS_WIDTH:
+ width = atoi (new_text);
+ if (width > 0)
+ {
+ struct fmt_spec format;
+
+ format = *var_get_print_format (var);
+ fmt_change_width (&format, width, var_sheet->format_use);
+ var_set_width (var, fmt_var_width (&format));
+ var_set_both_formats (var, &format);
+ }
+ break;
+
+ case VS_DECIMALS:
+ decimals = atoi (new_text);
+ if (decimals >= 0)
+ {
+ struct fmt_spec format;
+
+ format = *var_get_print_format (var);
+ fmt_change_decimals (&format, decimals, var_sheet->format_use);
+ var_set_print_format (var, &format);
+ }
+ break;
+
+ case VS_LABEL:
+ var_set_label (var, new_text, false);
+ break;
+
+ case VS_VALUES:
+ case VS_MISSING:
+ break;
+
+ case VS_COLUMNS:
+ width = atoi (new_text);
+ if (width > 0 && width < 2 * MAX_STRING)
+ var_set_display_width (var, width);
+ break;
+
+ case VS_ALIGN:
+ if (!strcmp (new_text, alignment_to_string (ALIGN_LEFT)))
+ var_set_alignment (var, ALIGN_LEFT);
+ else if (!strcmp (new_text, alignment_to_string (ALIGN_CENTRE)))
+ var_set_alignment (var, ALIGN_CENTRE);
+ else if (!strcmp (new_text, alignment_to_string (ALIGN_RIGHT)))
+ var_set_alignment (var, ALIGN_RIGHT);
+ break;
+
+ case VS_MEASURE:
+ if (!strcmp (new_text, measure_to_string (MEASURE_NOMINAL)))
+ var_set_measure (var, MEASURE_NOMINAL);
+ else if (!strcmp (new_text, measure_to_string (MEASURE_ORDINAL)))
+ var_set_measure (var, MEASURE_ORDINAL);
+ else if (!strcmp (new_text, measure_to_string (MEASURE_SCALE)))
+ var_set_measure (var, MEASURE_SCALE);
+ break;
+ }
+}