X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Frecode-dialog.c;h=4ef8ae216d88f3a9825bf3555a5b0d81cbc36221;hb=da08e8b9ea6bfa772b4daec4a944279267852515;hp=0a3ab0dafc5799acf0d999a749d2cdce57a5aae4;hpb=f550aee00a62fe1d8baf62d83cd7efef6cc2ee92;p=pspp diff --git a/src/ui/gui/recode-dialog.c b/src/ui/gui/recode-dialog.c index 0a3ab0dafc..4ef8ae216d 100644 --- a/src/ui/gui/recode-dialog.c +++ b/src/ui/gui/recode-dialog.c @@ -1,5 +1,5 @@ /* PSPPIRE - a graphical user interface for PSPP. - Copyright (C) 2007, 2009 Free Software Foundation + Copyright (C) 2007, 2009, 2010, 2011, 2012, 2014 Free Software Foundation This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -30,14 +30,16 @@ #include +#include #include -#include #include #include #include -#include +#include +#include "helper.h" #include -#include + +#include "psppire-val-chooser.h" #include @@ -103,7 +105,7 @@ new_value_to_string (const GValue *src, GValue *dest) { case NV_NUMERIC: { - gchar *text = g_strdup_printf ("%g", nv->v.v); + gchar *text = g_strdup_printf ("%.*g", DBL_DIG + 1, nv->v.v); g_value_set_string (dest, text); g_free (text); } @@ -144,151 +146,6 @@ new_value_get_type (void) } - - - -/* A boxed type representing a value, or a range of values which may - potentially be replaced by something */ - -enum old_value_type - { - OV_NUMERIC, - OV_STRING, - OV_SYSMIS, - OV_MISSING, - OV_RANGE, - OV_LOW_UP, - OV_HIGH_DOWN, - OV_ELSE - }; - -struct old_value - { - enum old_value_type type; - union { - double v; - gchar *s; - double range[2]; - } v; - }; - - -static struct old_value * -old_value_copy (struct old_value *ov) -{ - struct old_value *copy = g_memdup (ov, sizeof (*copy)); - - if ( ov->type == OV_STRING ) - copy->v.s = g_strdup (ov->v.s); - - return copy; -} - - -static void -old_value_free (struct old_value *ov) -{ - if (ov->type == OV_STRING) - g_free (ov->v.s); - g_free (ov); -} - -static void -old_value_to_string (const GValue *src, GValue *dest) -{ - const struct old_value *ov = g_value_get_boxed (src); - - switch (ov->type) - { - case OV_NUMERIC: - { - gchar *text = g_strdup_printf ("%g", ov->v.v); - g_value_set_string (dest, text); - g_free (text); - } - break; - case OV_STRING: - g_value_set_string (dest, ov->v.s); - break; - case OV_MISSING: - g_value_set_string (dest, "MISSING"); - break; - case OV_SYSMIS: - g_value_set_string (dest, "SYSMIS"); - break; - case OV_ELSE: - g_value_set_string (dest, "ELSE"); - break; - case OV_RANGE: - { - gchar *text; - char en_dash[6] = {0,0,0,0,0,0}; - - g_unichar_to_utf8 (0x2013, en_dash); - - text = g_strdup_printf ("%g %s %g", - ov->v.range[0], - en_dash, - ov->v.range[1]); - g_value_set_string (dest, text); - g_free (text); - } - break; - case OV_LOW_UP: - { - gchar *text; - char en_dash[6] = {0,0,0,0,0,0}; - - g_unichar_to_utf8 (0x2013, en_dash); - - text = g_strdup_printf ("LOWEST %s %g", - en_dash, - ov->v.range[1]); - - g_value_set_string (dest, text); - g_free (text); - } - break; - case OV_HIGH_DOWN: - { - gchar *text; - char en_dash[6] = {0,0,0,0,0,0}; - - g_unichar_to_utf8 (0x2013, en_dash); - - text = g_strdup_printf ("%g %s HIGHEST", - ov->v.range[0], - en_dash); - - g_value_set_string (dest, text); - g_free (text); - } - break; - default: - g_warning ("Invalid type in old recode value"); - g_value_set_string (dest, "???"); - break; - }; -} - -static GType -old_value_get_type (void) -{ - static GType t = 0; - - if (t == 0 ) - { - t = g_boxed_type_register_static ("psppire-recode-old-values", - (GBoxedCopyFunc) old_value_copy, - (GBoxedFreeFunc) old_value_free); - - g_value_register_transform_func (t, G_TYPE_STRING, - old_value_to_string); - } - - return t; -} - enum @@ -296,13 +153,6 @@ enum BUTTON_NEW_VALUE, BUTTON_NEW_COPY, BUTTON_NEW_SYSMIS, - BUTTON_OLD_VALUE, - BUTTON_OLD_SYSMIS, - BUTTON_OLD_MISSING, - BUTTON_OLD_RANGE, - BUTTON_OLD_LOW_UP, - BUTTON_OLD_HIGH_DOWN, - BUTTON_OLD_ELSE, n_BUTTONS }; @@ -321,13 +171,9 @@ struct recode_dialog GtkWidget *convert_button; GtkWidget *new_copy_label; - GtkWidget *ov_value_entry; GtkWidget *new_value_entry; - GtkWidget *ov_range_lower_entry; - GtkWidget *ov_range_upper_entry; - GtkWidget *ov_low_up_entry; - GtkWidget *ov_high_down_entry; + GtkWidget *old_value_chooser; GtkListStore *value_map; @@ -365,7 +211,7 @@ refresh (PsppireDialog *dialog, struct recode_dialog *rd) gtk_widget_set_sensitive (rd->new_name_entry, FALSE); gtk_widget_set_sensitive (rd->new_label_entry, FALSE); - if ( rd->different ) + if ( rd->different && rd->varmap ) g_hash_table_remove_all (rd->varmap); gtk_list_store_clear (GTK_LIST_STORE (rd->value_map)); @@ -397,7 +243,7 @@ dialog_state_valid (gpointer data) if ( rd->different ) { - GtkTreeModel *model = GTK_TREE_MODEL (PSPPIRE_VAR_VIEW (rd->variable_treeview)->list); + GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (rd->variable_treeview)); if (g_hash_table_size (rd->varmap) != gtk_tree_model_iter_n_children (model, NULL) ) return FALSE; @@ -417,11 +263,6 @@ dialog_state_valid (gpointer data) static void on_old_new_show (struct recode_dialog *rd) { - gtk_toggle_button_set_active - (GTK_TOGGLE_BUTTON (rd->toggle[BUTTON_OLD_VALUE]), TRUE); - - g_signal_emit_by_name (rd->toggle[BUTTON_OLD_VALUE], "toggled"); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (rd->toggle[BUTTON_NEW_VALUE]), TRUE); @@ -474,7 +315,7 @@ recode_different_dialog (PsppireDataWindow *de) static gchar * num_to_string (gdouble x) { - return g_strdup_printf ("%g", x); + return g_strdup_printf ("%.*g", DBL_DIG + 1, x); } /* Callback which gets called when a new row is selected @@ -546,101 +387,7 @@ on_acr_selection_change (GtkTreeSelection *selection, gpointer data) g_value_unset (&nv_value); } - if ( ov ) - { - switch (ov->type) - { - case OV_STRING: - gtk_toggle_button_set_active - (GTK_TOGGLE_BUTTON (rd->toggle [BUTTON_OLD_VALUE]), TRUE); - - gtk_entry_set_text (GTK_ENTRY (rd->ov_value_entry), ov->v.s); - break; - - case OV_NUMERIC: - { - gchar *str; - - gtk_toggle_button_set_active - (GTK_TOGGLE_BUTTON (rd->toggle [BUTTON_OLD_VALUE]), TRUE); - - str = num_to_string (ov->v.v); - - gtk_entry_set_text (GTK_ENTRY (rd->ov_value_entry), str); - - g_free (str); - } - break; - - case OV_SYSMIS: - gtk_toggle_button_set_active - (GTK_TOGGLE_BUTTON (rd->toggle [BUTTON_OLD_SYSMIS]), TRUE); - break; - - case OV_MISSING: - gtk_toggle_button_set_active - (GTK_TOGGLE_BUTTON (rd->toggle [BUTTON_OLD_MISSING]), TRUE); - break; - - case OV_RANGE: - { - gchar *str; - - gtk_toggle_button_set_active - (GTK_TOGGLE_BUTTON (rd->toggle [BUTTON_OLD_RANGE]), TRUE); - - str = num_to_string (ov->v.range[0]); - - gtk_entry_set_text (GTK_ENTRY (rd->ov_range_lower_entry), str); - - g_free (str); - - - str = num_to_string (ov->v.range[1]); - - gtk_entry_set_text (GTK_ENTRY (rd->ov_range_upper_entry), str); - - g_free (str); - } - break; - - case OV_LOW_UP: - { - gchar *str = num_to_string (ov->v.range[1]); - - gtk_toggle_button_set_active - (GTK_TOGGLE_BUTTON (rd->toggle [BUTTON_OLD_LOW_UP]), TRUE); - - gtk_entry_set_text (GTK_ENTRY (rd->ov_low_up_entry), str); - - g_free (str); - } - break; - - case OV_HIGH_DOWN: - { - gchar *str = num_to_string (ov->v.range[0]); - - gtk_toggle_button_set_active - (GTK_TOGGLE_BUTTON (rd->toggle [BUTTON_OLD_HIGH_DOWN]), TRUE); - - gtk_entry_set_text (GTK_ENTRY (rd->ov_high_down_entry), str); - - g_free (str); - } - break; - - case OV_ELSE: - gtk_toggle_button_set_active - (GTK_TOGGLE_BUTTON (rd->toggle [BUTTON_OLD_ELSE]), TRUE); - break; - - default: - g_warning ("Unknown old value type"); - break; - }; - g_value_unset (&ov_value); - } + psppire_val_chooser_set_status (PSPPIRE_VAL_CHOOSER (rd->old_value_chooser), ov); } /* Name-Label pair */ @@ -688,7 +435,7 @@ on_selection_change (GtkTreeSelection *selection, gpointer data) { struct recode_dialog *rd = data; - GtkTreeModel *model = GTK_TREE_MODEL (PSPPIRE_VAR_VIEW (rd->variable_treeview)->list); + GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (rd->variable_treeview)); GList *rows = gtk_tree_selection_get_selected_rows (selection, &model); @@ -705,6 +452,7 @@ on_selection_change (GtkTreeSelection *selection, gpointer data) gtk_widget_set_sensitive (rd->new_label_entry, TRUE); ok = gtk_tree_model_get_iter (model, &iter, (GtkTreePath*) rows->data); + g_return_if_fail (ok); gtk_tree_model_get (model, &iter, 0, &var, @@ -767,7 +515,9 @@ on_change_clicked (GObject *obj, gpointer data) struct recode_dialog *rd = data; struct variable *var = NULL; struct nlp *nlp; - GtkTreeModel *model = GTK_TREE_MODEL (PSPPIRE_VAR_VIEW (rd->variable_treeview)->list); + + GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (rd->variable_treeview)); + GtkTreeIter iter; GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (rd->variable_treeview)); @@ -801,27 +551,11 @@ on_change_clicked (GObject *obj, gpointer data) } -/* If there's nothing selected in the variable treeview, - then automatically select the first item */ static void -select_something (GtkTreeModel *treemodel, - GtkTreePath *arg1, - GtkTreeIter *arg2, - gpointer data) +focus_value_entry (GtkWidget *w, struct recode_dialog *rd) { - struct recode_dialog *rd = data; - GtkTreeSelection *sel; - - sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (rd->variable_treeview)); - - if ( gtk_tree_selection_count_selected_rows (sel) < 1) - { - GtkTreeIter iter; - - gtk_tree_model_get_iter_first (treemodel, &iter); - - gtk_tree_selection_select_iter (sel, &iter); - } + if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w))) + gtk_widget_grab_focus (rd->new_value_entry); } @@ -886,9 +620,6 @@ recode_dialog (PsppireDataWindow *de, gboolean diff) GtkWidget *output_variable_box = get_widget_assert (builder,"frame4"); - PsppireVarStore *vs = NULL; - g_object_get (de->data_editor, "var-store", &vs, NULL); - rd.change_button = get_widget_assert (builder, "change-button"); rd.varmap = NULL; rd.dialog = get_widget_assert (builder, "recode-dialog"); @@ -897,7 +628,7 @@ recode_dialog (PsppireDataWindow *de, gboolean diff) rd.new_name_entry = get_widget_assert (builder, "dest-name-entry"); rd.new_label_entry = get_widget_assert (builder, "dest-label-entry"); - g_object_get (vs, "dictionary", &rd.dict, NULL); + g_object_get (de->data_editor, "dictionary", &rd.dict, NULL); rd.value_map = gtk_list_store_new (2, old_value_get_type (), @@ -921,7 +652,6 @@ recode_dialog (PsppireDataWindow *de, gboolean diff) if (rd.different) { - GtkTreeModel *model = GTK_TREE_MODEL (PSPPIRE_VAR_VIEW (rd.variable_treeview)->list); GtkTreeSelection *sel; GtkCellRenderer *renderer = gtk_cell_renderer_text_new (); @@ -955,10 +685,6 @@ recode_dialog (PsppireDataWindow *de, gboolean diff) g_signal_connect (rd.change_button, "clicked", G_CALLBACK (on_change_clicked), &rd); -#if 0 - g_signal_connect (model, "row-inserted", - G_CALLBACK (select_something), &rd); -#endif } psppire_selector_set_allow (PSPPIRE_SELECTOR (selector), homogeneous_types); @@ -970,24 +696,14 @@ recode_dialog (PsppireDataWindow *de, gboolean diff) rd.convert_button = get_widget_assert (builder, "checkbutton2"); - rd.ov_range_lower_entry = get_widget_assert (builder, "entry5"); - rd.ov_range_upper_entry = get_widget_assert (builder, "entry3"); - rd.ov_low_up_entry = get_widget_assert (builder, "entry6"); - rd.ov_high_down_entry = get_widget_assert (builder, "entry7"); + rd.old_value_chooser = get_widget_assert (builder, "val-chooser"); rd.new_value_entry = get_widget_assert (builder, "entry1"); - rd.ov_value_entry = get_widget_assert (builder, "entry2"); + rd.toggle[BUTTON_NEW_VALUE] = get_widget_assert (builder, "radiobutton1"); rd.toggle[BUTTON_NEW_SYSMIS] = get_widget_assert (builder, "radiobutton2"); rd.toggle[BUTTON_NEW_COPY] = get_widget_assert (builder, "radiobutton3"); - rd.toggle[BUTTON_OLD_VALUE] = get_widget_assert (builder, "radiobutton4"); - rd.toggle[BUTTON_OLD_SYSMIS] = get_widget_assert (builder, "radiobutton6"); - rd.toggle[BUTTON_OLD_MISSING]= get_widget_assert (builder, "radiobutton7"); - rd.toggle[BUTTON_OLD_RANGE] = get_widget_assert (builder, "radiobutton8"); - rd.toggle[BUTTON_OLD_LOW_UP] = get_widget_assert (builder, "radiobutton10"); - rd.toggle[BUTTON_OLD_HIGH_DOWN] = get_widget_assert (builder, "radiobutton5"); - rd.toggle[BUTTON_OLD_ELSE] = get_widget_assert (builder, "radiobutton11"); rd.new_copy_label = get_widget_assert (builder, "label3"); rd.strings_box = get_widget_assert (builder, "table3"); @@ -1003,6 +719,9 @@ recode_dialog (PsppireDataWindow *de, gboolean diff) g_signal_connect_swapped (rd.toggle[BUTTON_NEW_VALUE], "toggled", G_CALLBACK (set_acr), &rd); + g_signal_connect_after (rd.toggle[BUTTON_NEW_VALUE], "toggled", + G_CALLBACK (focus_value_entry), &rd); + g_signal_connect_swapped (rd.new_value_entry, "changed", G_CALLBACK (set_acr), &rd); @@ -1044,23 +763,6 @@ recode_dialog (PsppireDataWindow *de, gboolean diff) g_signal_connect (rd.toggle[BUTTON_NEW_VALUE], "toggled", G_CALLBACK (toggle_sensitivity), rd.new_value_entry); - g_signal_connect (rd.toggle[BUTTON_OLD_VALUE], "toggled", - G_CALLBACK (toggle_sensitivity), rd.ov_value_entry); - - g_signal_connect (rd.toggle[BUTTON_OLD_RANGE], "toggled", - G_CALLBACK (toggle_sensitivity), - get_widget_assert (builder, "entry3")); - - g_signal_connect (rd.toggle[BUTTON_OLD_RANGE], "toggled", - G_CALLBACK (toggle_sensitivity), - get_widget_assert (builder, "entry5")); - - g_signal_connect (rd.toggle[BUTTON_OLD_LOW_UP], "toggled", - G_CALLBACK (toggle_sensitivity), rd.ov_low_up_entry); - - g_signal_connect (rd.toggle[BUTTON_OLD_HIGH_DOWN], "toggled", - G_CALLBACK (toggle_sensitivity), rd.ov_high_down_entry); - g_signal_connect (rd.string_button, "toggled", G_CALLBACK (toggle_sensitivity), rd.width_entry); @@ -1085,28 +787,17 @@ recode_dialog (PsppireDataWindow *de, gboolean diff) switch (response) { case GTK_RESPONSE_OK: - { - gchar *syntax = generate_syntax (&rd); - - struct getl_interface *sss = create_syntax_string_source (syntax); - execute_syntax (sss); - - g_free (syntax); - } + g_free (execute_syntax_string (de, generate_syntax (&rd))); break; case PSPPIRE_RESPONSE_PASTE: - { - gchar *syntax = generate_syntax (&rd); - paste_syntax_to_window (syntax); - - g_free (syntax); - } + g_free (paste_syntax_to_window (generate_syntax (&rd))); break; default: break; } - g_hash_table_destroy (rd.varmap); + if (rd.varmap) + g_hash_table_destroy (rd.varmap); gtk_list_store_clear (GTK_LIST_STORE (rd.value_map)); g_object_unref (rd.value_map); @@ -1118,70 +809,11 @@ recode_dialog (PsppireDataWindow *de, gboolean diff) static gboolean set_old_value (GValue *val, const struct recode_dialog *rd) { - const gchar *text = NULL; - struct old_value ov; - if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON - (rd->toggle [BUTTON_OLD_VALUE]))) - { - text = gtk_entry_get_text (GTK_ENTRY (rd->ov_value_entry)); - if ( rd->input_var_is_string ) - { - ov.type = OV_STRING; - ov.v.s = g_strdup (text); - } - else - { - ov.type = OV_NUMERIC; - ov.v.v = g_strtod (text, 0); - } - } - else if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON - (rd->toggle [BUTTON_OLD_MISSING]))) - { - ov.type = OV_MISSING; - } - else if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON - (rd->toggle [BUTTON_OLD_SYSMIS]))) - { - ov.type = OV_SYSMIS; - } - else if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON - (rd->toggle [BUTTON_OLD_ELSE]))) - { - ov.type = OV_ELSE; - } - else if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON - (rd->toggle [BUTTON_OLD_RANGE]))) - { - const gchar *text; - text = gtk_entry_get_text (GTK_ENTRY (rd->ov_range_lower_entry)); - - ov.type = OV_RANGE; - ov.v.range[0] = g_strtod (text, 0); + PsppireValChooser *vc = PSPPIRE_VAL_CHOOSER (rd->old_value_chooser); - text = gtk_entry_get_text (GTK_ENTRY (rd->ov_range_upper_entry)); - ov.v.range[1] = g_strtod (text, 0); - } - else if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON - (rd->toggle [BUTTON_OLD_LOW_UP]))) - { - const gchar *text = - gtk_entry_get_text (GTK_ENTRY (rd->ov_low_up_entry)); - - ov.type = OV_LOW_UP; - ov.v.range[1] = g_strtod (text, 0); - } - else if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON - (rd->toggle [BUTTON_OLD_HIGH_DOWN]))) - { - const gchar *text = - gtk_entry_get_text (GTK_ENTRY (rd->ov_high_down_entry)); + struct old_value ov; - ov.type = OV_HIGH_DOWN; - ov.v.range[0] = g_strtod (text, 0); - } - else - return FALSE; + psppire_val_chooser_get_status (vc, &ov); g_value_init (val, old_value_get_type ()); g_value_set_boxed (val, &ov); @@ -1240,7 +872,7 @@ set_new_value (GValue *val, const struct recode_dialog *rd) /* A function to set a value in a column in the ACR */ -gboolean +static gboolean set_value (gint col, GValue *val, gpointer data) { struct recode_dialog *rd = data; @@ -1292,14 +924,8 @@ run_old_and_new_dialog (struct recode_dialog *rd) rd->input_var_is_string = var_is_alpha (v); - gtk_widget_set_sensitive (rd->toggle [BUTTON_OLD_SYSMIS], - var_is_numeric (v)); - gtk_widget_set_sensitive (rd->toggle [BUTTON_OLD_RANGE], - var_is_numeric (v)); - gtk_widget_set_sensitive (rd->toggle [BUTTON_OLD_LOW_UP], - var_is_numeric (v)); - gtk_widget_set_sensitive (rd->toggle [BUTTON_OLD_HIGH_DOWN], - var_is_numeric (v)); + g_object_set (rd->old_value_chooser, "is-string", rd->input_var_is_string, NULL); + gtk_widget_set_sensitive (rd->toggle [BUTTON_NEW_SYSMIS], var_is_numeric (v)); @@ -1326,92 +952,41 @@ run_old_and_new_dialog (struct recode_dialog *rd) /* Generate a syntax fragment for NV and append it to STR */ static void -new_value_append_syntax (GString *str, const struct new_value *nv) +new_value_append_syntax (struct string *dds, const struct new_value *nv) { switch (nv->type) { case NV_NUMERIC: - g_string_append_printf (str, "%g", nv->v.v); + ds_put_c_format (dds, "%.*g", DBL_DIG + 1, nv->v.v); break; case NV_STRING: - { - struct string ds = DS_EMPTY_INITIALIZER; - syntax_gen_string (&ds, ss_cstr (nv->v.s)); - g_string_append (str, ds_cstr (&ds)); - ds_destroy (&ds); - } + syntax_gen_string (dds, ss_cstr (nv->v.s)); break; case NV_COPY: - g_string_append (str, "COPY"); + ds_put_cstr (dds, "COPY"); break; case NV_SYSMIS: - g_string_append (str, "SYSMIS"); + ds_put_cstr (dds, "SYSMIS"); break; default: /* Shouldn't ever happen */ g_warning ("Invalid type in new recode value"); - g_string_append (str, "???"); + ds_put_cstr (dds, "???"); break; } } -/* Generate a syntax fragment for NV and append it to STR */ -static void -old_value_append_syntax (GString *str, const struct old_value *ov) -{ - switch (ov->type) - { - case OV_NUMERIC: - g_string_append_printf (str, "%g", ov->v.v); - break; - case OV_STRING: - { - struct string ds = DS_EMPTY_INITIALIZER; - syntax_gen_string (&ds, ss_cstr (ov->v.s)); - g_string_append (str, ds_cstr (&ds)); - ds_destroy (&ds); - } - break; - case OV_MISSING: - g_string_append (str, "MISSING"); - break; - case OV_SYSMIS: - g_string_append (str, "SYSMIS"); - break; - case OV_ELSE: - g_string_append (str, "ELSE"); - break; - case OV_RANGE: - g_string_append_printf (str, "%g THRU %g", - ov->v.range[0], - ov->v.range[1]); - break; - case OV_LOW_UP: - g_string_append_printf (str, "LOWEST THRU %g", - ov->v.range[1]); - break; - case OV_HIGH_DOWN: - g_string_append_printf (str, "%g THRU HIGHEST", - ov->v.range[0]); - break; - default: - g_warning ("Invalid type in old recode value"); - g_string_append (str, "???"); - break; - }; -} - - - static char * generate_syntax (const struct recode_dialog *rd) { gboolean ok; GtkTreeIter iter; gchar *text; + struct string dds; + + ds_init_empty (&dds); - GString *str = g_string_sized_new (100); /* Declare new string variables if applicable */ if ( rd->different && @@ -1425,24 +1000,24 @@ generate_syntax (const struct recode_dialog *rd) g_hash_table_iter_init (&iter, rd->varmap); while (g_hash_table_iter_next (&iter, (void**) &var, (void**) &nlp)) { - g_string_append (str, "\nSTRING "); - g_string_append (str, nlp->name); - g_string_append_printf (str, " (A%d).", + ds_put_cstr (&dds, "\nSTRING "); + ds_put_cstr (&dds, nlp->name); + ds_put_c_format (&dds, " (A%d).", (int) gtk_spin_button_get_value (GTK_SPIN_BUTTON (rd->width_entry) ) ); } } - g_string_append (str, "\nRECODE "); + ds_put_cstr (&dds, "\nRECODE "); - psppire_var_view_append_names (PSPPIRE_VAR_VIEW (rd->variable_treeview), 0, str); + psppire_var_view_append_names_str (PSPPIRE_VAR_VIEW (rd->variable_treeview), 0, &dds); - g_string_append (str, "\n\t"); + ds_put_cstr (&dds, "\n\t"); if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (rd->convert_button))) { - g_string_append (str, "(CONVERT) "); + ds_put_cstr (&dds, "(CONVERT) "); } for (ok = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (rd->value_map), @@ -1463,13 +1038,13 @@ generate_syntax (const struct recode_dialog *rd) ov = g_value_get_boxed (&ov_value); nv = g_value_get_boxed (&nv_value); - g_string_append (str, "("); + ds_put_cstr (&dds, "("); - old_value_append_syntax (str, ov); - g_string_append (str, " = "); - new_value_append_syntax (str, nv); + old_value_append_syntax (&dds, ov); + ds_put_cstr (&dds, " = "); + new_value_append_syntax (&dds, nv); - g_string_append (str, ") "); + ds_put_cstr (&dds, ") "); g_value_unset (&ov_value); g_value_unset (&nv_value); } @@ -1479,7 +1054,7 @@ generate_syntax (const struct recode_dialog *rd) { GtkTreeIter iter; - g_string_append (str, "\n\tINTO "); + ds_put_cstr (&dds, "\n\tINTO "); for (ok = psppire_var_view_get_iter_first (PSPPIRE_VAR_VIEW (rd->variable_treeview), &iter); ok; @@ -1490,12 +1065,12 @@ generate_syntax (const struct recode_dialog *rd) nlp = g_hash_table_lookup (rd->varmap, var); - g_string_append (str, nlp->name); - g_string_append (str, " "); + ds_put_cstr (&dds, nlp->name); + ds_put_cstr (&dds, " "); } } - g_string_append (str, "."); + ds_put_cstr (&dds, "."); /* If applicable, set labels for the new variables. */ if ( rd->different ) @@ -1509,17 +1084,24 @@ generate_syntax (const struct recode_dialog *rd) while (g_hash_table_iter_next (&iter, (void**) &var, (void**) &nlp)) { if (nlp->label) - g_string_append_printf (str, "\nVARIABLE LABELS %s %s.", - nlp->name, nlp->label); + { + struct string sl; + ds_init_empty (&sl); + syntax_gen_string (&sl, ss_cstr (nlp->label)); + ds_put_c_format (&dds, "\nVARIABLE LABELS %s %s.", + nlp->name, ds_cstr (&sl)); + + ds_destroy (&sl); + } } } - g_string_append (str, "\nEXECUTE.\n"); + ds_put_cstr (&dds, "\nEXECUTE.\n"); - text = str->str; + text = ds_steal_cstr (&dds); - g_string_free (str, FALSE); + ds_destroy (&dds); return text; }