X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Frecode-dialog.c;h=4ef8ae216d88f3a9825bf3555a5b0d81cbc36221;hb=50c7b5b389eb39accf65c8716f6a3f73b5b30aa6;hp=d92517c757a7e5d7cbbb246f10388c5a8a50eb84;hpb=4233ff9b1569035a8b748b3695cb865e6412e5b2;p=pspp diff --git a/src/ui/gui/recode-dialog.c b/src/ui/gui/recode-dialog.c index d92517c757..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, 2010, 2011 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,13 +30,14 @@ #include +#include #include #include #include #include -#include +#include +#include "helper.h" #include -#include #include "psppire-val-chooser.h" @@ -104,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); } @@ -242,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; @@ -314,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 @@ -434,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); @@ -451,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, @@ -513,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)); @@ -547,6 +551,14 @@ on_change_clicked (GObject *obj, gpointer data) } +static void +focus_value_entry (GtkWidget *w, struct recode_dialog *rd) +{ + if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w))) + gtk_widget_grab_focus (rd->new_value_entry); +} + + /* Callback for the new_value_entry and new_value_togglebutton widgets. It's used to enable/disable the acr. */ static void @@ -608,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"); @@ -619,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 (), @@ -710,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); @@ -860,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; @@ -940,31 +952,26 @@ 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; } } @@ -976,8 +983,10 @@ 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 && @@ -991,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), @@ -1029,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); } @@ -1045,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; @@ -1056,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 ) @@ -1075,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; }