X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Frecode-dialog.c;h=9a1af8d5d7a582a69119fb835b084c86b0ad5cad;hb=0c961d1c404e127d814bad99cf43e5e3d41dd1b1;hp=103c85c3250354d2a67c734e925bda58535a4780;hpb=c65449a628d13f4683e7dc7125874608c7152017;p=pspp-builds.git diff --git a/src/ui/gui/recode-dialog.c b/src/ui/gui/recode-dialog.c index 103c85c3..9a1af8d5 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 Free Software Foundation + Copyright (C) 2007, 2009 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 @@ -24,18 +24,22 @@ #include "recode-dialog.h" +#include "executor.h" + +#include "psppire-var-view.h" + #include -#include +#include #include -#include +#include #include #include #include #include #include -#include -#include + +#include #include "psppire-acr.h" @@ -72,7 +76,7 @@ new_value_copy (struct new_value *nv) struct new_value *copy = g_memdup (nv, sizeof (*copy)); if ( nv->type == NV_STRING ) - copy->v.s = strdup (nv->v.s); + copy->v.s = xstrdup (nv->v.s); return copy; } @@ -326,7 +330,6 @@ struct recode_dialog GtkWidget *ov_high_down_entry; GtkListStore *value_map; - GtkListStore *local_store; /* Indicates that the INTO {new variables} form of the dialog is being used */ @@ -336,13 +339,15 @@ struct recode_dialog gboolean input_var_is_string; - GtkListStore *var_map; GtkWidget *new_name_entry; GtkWidget *new_label_entry; GtkWidget *change_button; GtkWidget *string_button; GtkWidget *width_entry; + + /* A hash table of struct nlp's indexed by variable */ + GHashTable *varmap; }; @@ -351,33 +356,23 @@ static void run_old_and_new_dialog (struct recode_dialog *rd); static void refresh (PsppireDialog *dialog, struct recode_dialog *rd) { + GtkTreeModel *vars = + gtk_tree_view_get_model (GTK_TREE_VIEW (rd->variable_treeview)); + + gtk_list_store_clear (GTK_LIST_STORE (vars)); + gtk_widget_set_sensitive (rd->change_button, FALSE); gtk_widget_set_sensitive (rd->new_name_entry, FALSE); gtk_widget_set_sensitive (rd->new_label_entry, FALSE); - if ( rd->different ) - gtk_list_store_clear (GTK_LIST_STORE (rd->var_map)); - else - { - GtkTreeModel *vars = - gtk_tree_view_get_model (GTK_TREE_VIEW (rd->variable_treeview)); - - gtk_list_store_clear (GTK_LIST_STORE (vars)); - } + g_hash_table_remove_all (rd->varmap); gtk_list_store_clear (GTK_LIST_STORE (rd->value_map)); } static char * generate_syntax (const struct recode_dialog *rd); -enum { - COL_OLD, - COL_NEW_NAME, - COL_NEW_LABEL, - n_COLS -}; - enum { COL_VALUE_OLD, COL_VALUE_NEW, @@ -402,26 +397,10 @@ dialog_state_valid (gpointer data) if ( rd->different ) { - GtkTreeIter iter; - - gboolean ok; - - for (ok = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (rd->var_map), - &iter); - ok; - ok = gtk_tree_model_iter_next (GTK_TREE_MODEL (rd->var_map), - &iter)) - { - gchar *name = NULL; - - gtk_tree_model_get (GTK_TREE_MODEL (rd->var_map), &iter, - COL_NEW_NAME, &name, -1); + GtkTreeModel *model = GTK_TREE_MODEL (PSPPIRE_VAR_VIEW (rd->variable_treeview)->list); - if ( name == NULL ) - return FALSE; - - g_free (name); - } + if (g_hash_table_size (rd->varmap) != gtk_tree_model_iter_n_children (model, NULL) ) + return FALSE; } else { @@ -430,7 +409,6 @@ dialog_state_valid (gpointer data) if ( !gtk_tree_model_get_iter_first (vars, ¬_used)) return FALSE; - } return TRUE; @@ -472,14 +450,14 @@ toggle_sensitivity (GtkToggleButton *button, GtkWidget *target) gtk_widget_set_sensitive (target, state); } -static void recode_dialog (struct data_editor *de, gboolean diff); +static void recode_dialog (PsppireDataWindow *de, gboolean diff); /* Pops up the Recode Same version of the dialog box */ void recode_same_dialog (GObject *o, gpointer data) { - struct data_editor *de = data; + PsppireDataWindow *de = PSPPIRE_DATA_WINDOW (data); recode_dialog (de, FALSE); } @@ -488,27 +466,11 @@ recode_same_dialog (GObject *o, gpointer data) void recode_different_dialog (GObject *o, gpointer data) { - struct data_editor *de = data; + PsppireDataWindow *de = PSPPIRE_DATA_WINDOW (data); recode_dialog (de, TRUE); } -static void -render_new_var_name (GtkTreeViewColumn *tree_column, - GtkCellRenderer *cell, - GtkTreeModel *tree_model, - GtkTreeIter *iter, - gpointer data) -{ - gchar *new_var_name = NULL; - - gtk_tree_model_get (tree_model, iter, COL_NEW_NAME, &new_var_name, -1); - - g_object_set (cell, "text", new_var_name, NULL); - - g_free (new_var_name); -} - /* This might need to be changed to something less naive. In particular, what happends with dates, etc? @@ -685,6 +647,41 @@ on_acr_selection_change (GtkTreeSelection *selection, gpointer data) } } +/* Name-Label pair */ +struct nlp +{ + char *name; + char *label; +}; + +static struct nlp * +nlp_create (const char *name, const char *label) +{ + struct nlp *nlp = xmalloc (sizeof *nlp); + + nlp->name = g_strdup (name); + + nlp->label = NULL; + + if ( 0 != strcmp ("", label)) + nlp->label = g_strdup (label); + + return nlp; +} + +static void +nlp_destroy (gpointer data) +{ + struct nlp *nlp = data ; + if ( ! nlp ) + return; + + g_free (nlp->name); + g_free (nlp->label); + g_free (nlp); +} + + /* Callback which gets called when a new row is selected in the variable treeview. It sets the name and label entry widgets to reflect the @@ -694,18 +691,18 @@ static void on_selection_change (GtkTreeSelection *selection, gpointer data) { struct recode_dialog *rd = data; - GtkTreeModel *model = GTK_TREE_MODEL (rd->var_map); + + GtkTreeModel *model = GTK_TREE_MODEL (PSPPIRE_VAR_VIEW (rd->variable_treeview)->list); GList *rows = gtk_tree_selection_get_selected_rows (selection, &model); if ( rows && !rows->next) { /* Exactly one row is selected */ - + struct nlp *nlp; + struct variable *var; gboolean ok; GtkTreeIter iter; - gchar *name = NULL; - gchar *label = NULL; gtk_widget_set_sensitive (rd->change_button, TRUE); gtk_widget_set_sensitive (rd->new_name_entry, TRUE); @@ -713,16 +710,22 @@ on_selection_change (GtkTreeSelection *selection, gpointer data) ok = gtk_tree_model_get_iter (model, &iter, (GtkTreePath*) rows->data); - gtk_tree_model_get (GTK_TREE_MODEL (rd->var_map), &iter, - COL_NEW_NAME, &name, - COL_NEW_LABEL, &label, + gtk_tree_model_get (model, &iter, + 0, &var, -1); - gtk_entry_set_text (GTK_ENTRY (rd->new_name_entry), name ? name : ""); - gtk_entry_set_text (GTK_ENTRY (rd->new_label_entry), label ? label : ""); + nlp = g_hash_table_lookup (rd->varmap, var); - g_free (name); - g_free (label); + if (nlp) + { + gtk_entry_set_text (GTK_ENTRY (rd->new_name_entry), nlp->name ? nlp->name : ""); + gtk_entry_set_text (GTK_ENTRY (rd->new_label_entry), nlp->label ? nlp->label : ""); + } + else + { + gtk_entry_set_text (GTK_ENTRY (rd->new_name_entry), ""); + gtk_entry_set_text (GTK_ENTRY (rd->new_label_entry), ""); + } } else { @@ -734,6 +737,7 @@ on_selection_change (GtkTreeSelection *selection, gpointer data) gtk_entry_set_text (GTK_ENTRY (rd->new_label_entry), ""); } + g_list_foreach (rows, (GFunc) gtk_tree_path_free, NULL); g_list_free (rows); } @@ -761,12 +765,13 @@ on_convert_toggled (GtkToggleButton *b, struct recode_dialog *rd) gtk_widget_set_sensitive (rd->string_button, !active); } - static void on_change_clicked (GObject *obj, gpointer data) { struct recode_dialog *rd = data; - GtkTreeModel *model = GTK_TREE_MODEL (rd->var_map); + struct variable *var = NULL; + struct nlp *nlp; + GtkTreeModel *model = GTK_TREE_MODEL (PSPPIRE_VAR_VIEW (rd->variable_treeview)->list); GtkTreeIter iter; GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (rd->variable_treeview)); @@ -779,16 +784,22 @@ on_change_clicked (GObject *obj, gpointer data) const gchar *dest_var_label = gtk_entry_get_text (GTK_ENTRY (rd->new_label_entry)); - if ( NULL == rows ) - return; + if ( NULL == rows || rows->next != NULL) + goto finish; gtk_tree_model_get_iter (model, &iter, rows->data); - gtk_list_store_set (rd->var_map, &iter, - COL_NEW_NAME, dest_var_name, - COL_NEW_LABEL, dest_var_label, - -1); + gtk_tree_model_get (model, &iter, 0, &var, -1); + + g_hash_table_remove (rd->varmap, var); + nlp = nlp_create (dest_var_name, dest_var_label); + + g_hash_table_insert (rd->varmap, var, nlp); + + gtk_tree_model_row_changed (model, rows->data, &iter); + + finish: g_list_foreach (rows, (GFunc) gtk_tree_path_free, NULL); g_list_free (rows); } @@ -838,37 +849,59 @@ set_acr (struct recode_dialog *rd) } static void -recode_dialog (struct data_editor *de, gboolean diff) +render_new_var_name (GtkTreeViewColumn *tree_column, + GtkCellRenderer *cell, + GtkTreeModel *tree_model, + GtkTreeIter *iter, + gpointer data) { - gint response; + struct nlp *nlp = NULL; + struct recode_dialog *rd = data; - struct recode_dialog rd; + struct variable *var = NULL; + + gtk_tree_model_get (tree_model, iter, + 0, &var, + -1); - GladeXML *xml = XML_NEW ("recode.glade"); + nlp = g_hash_table_lookup (rd->varmap, var); + if ( nlp ) + g_object_set (cell, "text", nlp->name, NULL); + else + g_object_set (cell, "text", "", NULL); +} - GtkWidget *selector = get_widget_assert (xml, "psppire-selector1"); - GtkWidget *oldandnew = get_widget_assert (xml, "button1"); +static void +recode_dialog (PsppireDataWindow *de, gboolean diff) +{ + gint response; - GtkWidget *output_variable_box = get_widget_assert (xml,"frame4"); + struct recode_dialog rd; + + GtkBuilder *builder = builder_new ("recode.ui"); - GtkSheet *var_sheet = - GTK_SHEET (get_widget_assert (de->xml, "variable_sheet")); + GtkWidget *selector = get_widget_assert (builder, "psppire-selector1"); + GtkWidget *oldandnew = get_widget_assert (builder, "button1"); - PsppireVarStore *vs = PSPPIRE_VAR_STORE (gtk_sheet_get_model (var_sheet)); - rd.change_button = get_widget_assert (xml, "change-button"); + GtkWidget *output_variable_box = get_widget_assert (builder,"frame4"); - rd.dialog = get_widget_assert (xml, "recode-dialog"); - rd.dict_treeview = get_widget_assert (xml, "treeview1"); - rd.variable_treeview = get_widget_assert (xml, "treeview2"); - rd.new_name_entry = get_widget_assert (xml, "dest-name-entry"); - rd.new_label_entry = get_widget_assert (xml, "dest-label-entry"); + PsppireVarStore *vs = NULL; + g_object_get (de->data_editor, "var-store", &vs, NULL); - rd.dict = vs->dict; + rd.change_button = get_widget_assert (builder, "change-button"); + rd.varmap = NULL; + rd.dialog = get_widget_assert (builder, "recode-dialog"); + rd.dict_treeview = get_widget_assert (builder, "treeview1"); + rd.variable_treeview = get_widget_assert (builder, "treeview2"); + 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); rd.value_map = gtk_list_store_new (2, old_value_get_type (), @@ -886,119 +919,90 @@ recode_dialog (struct data_editor *de, gboolean diff) rd.different = diff; - gtk_window_set_transient_for (GTK_WINDOW (rd.dialog), de->parent.window); - + gtk_window_set_transient_for (GTK_WINDOW (rd.dialog), GTK_WINDOW (de)); - attach_dictionary_to_treeview (GTK_TREE_VIEW (rd.dict_treeview), - vs->dict, - GTK_SELECTION_MULTIPLE, NULL); + g_object_set (rd.dict_treeview, "model", rd.dict, NULL); - - if ( ! rd.different ) - { - set_dest_model (GTK_TREE_VIEW (rd.variable_treeview), vs->dict); - } - else + if (rd.different) { + GtkTreeModel *model = GTK_TREE_MODEL (PSPPIRE_VAR_VIEW (rd.variable_treeview)->list); GtkTreeSelection *sel; - GtkTreeViewColumn *col; - GtkCellRenderer *renderer = gtk_cell_renderer_text_new (); - rd.var_map = gtk_list_store_new (n_COLS, G_TYPE_INT, - G_TYPE_STRING, - G_TYPE_STRING); - - - - gtk_tree_view_set_model (GTK_TREE_VIEW (rd.variable_treeview), - GTK_TREE_MODEL (rd.var_map)); + GtkCellRenderer *renderer = gtk_cell_renderer_text_new (); - col = gtk_tree_view_column_new_with_attributes (_("Old"), - renderer, - "text", NULL, - NULL); + GtkTreeViewColumn *col = gtk_tree_view_column_new_with_attributes (_("New"), + renderer, + "text", NULL, + NULL); gtk_tree_view_column_set_cell_data_func (col, renderer, - cell_var_name, - vs->dict, 0); + render_new_var_name, + &rd, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (rd.variable_treeview), col); - renderer = gtk_cell_renderer_text_new (); + col = gtk_tree_view_get_column (GTK_TREE_VIEW (rd.variable_treeview), 0); - col = gtk_tree_view_column_new_with_attributes (_("New"), - renderer, - "text", NULL, - NULL); - - gtk_tree_view_column_set_cell_data_func (col, renderer, - render_new_var_name, - NULL, NULL); - - - gtk_tree_view_append_column (GTK_TREE_VIEW (rd.variable_treeview), col); + g_object_set (col, "title", _("Old"), NULL); g_object_set (rd.variable_treeview, "headers-visible", TRUE, NULL); - g_signal_connect (rd.change_button, "clicked", - G_CALLBACK (on_change_clicked), &rd); + rd.varmap = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, nlp_destroy); sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (rd.variable_treeview)); + g_signal_connect (sel, "changed", G_CALLBACK (on_selection_change), &rd); - g_signal_connect (rd.var_map, "row-inserted", + 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_subjects (PSPPIRE_SELECTOR (selector), - rd.dict_treeview, - rd.variable_treeview, - insert_source_row_into_tree_view, - NULL); - psppire_selector_set_allow (PSPPIRE_SELECTOR (selector), homogeneous_types); /* Set up the Old & New Values subdialog */ { - rd.string_button = get_widget_assert (xml, "checkbutton1"); - rd.width_entry = get_widget_assert (xml, "spinbutton1"); + rd.string_button = get_widget_assert (builder, "checkbutton1"); + rd.width_entry = get_widget_assert (builder, "spinbutton1"); - rd.convert_button = get_widget_assert (xml, "checkbutton2"); + rd.convert_button = get_widget_assert (builder, "checkbutton2"); - rd.ov_range_lower_entry = get_widget_assert (xml, "entry5"); - rd.ov_range_upper_entry = get_widget_assert (xml, "entry3"); - rd.ov_low_up_entry = get_widget_assert (xml, "entry6"); - rd.ov_high_down_entry = get_widget_assert (xml, "entry7"); + 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.new_value_entry = get_widget_assert (xml, "entry1"); - rd.ov_value_entry = get_widget_assert (xml, "entry2"); + 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 (xml, "radiobutton1"); - rd.toggle[BUTTON_NEW_SYSMIS] = get_widget_assert (xml, "radiobutton2"); - rd.toggle[BUTTON_NEW_COPY] = get_widget_assert (xml, "radiobutton3"); - rd.toggle[BUTTON_OLD_VALUE] = get_widget_assert (xml, "radiobutton4"); - rd.toggle[BUTTON_OLD_SYSMIS] = get_widget_assert (xml, "radiobutton6"); - rd.toggle[BUTTON_OLD_MISSING]= get_widget_assert (xml, "radiobutton7"); - rd.toggle[BUTTON_OLD_RANGE] = get_widget_assert (xml, "radiobutton8"); - rd.toggle[BUTTON_OLD_LOW_UP] = get_widget_assert (xml, "radiobutton10"); - rd.toggle[BUTTON_OLD_HIGH_DOWN] = get_widget_assert (xml, "radiobutton5"); - rd.toggle[BUTTON_OLD_ELSE] = get_widget_assert (xml, "radiobutton11"); + 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 (xml, "label3"); - rd.strings_box = get_widget_assert (xml, "table3"); + rd.new_copy_label = get_widget_assert (builder, "label3"); + rd.strings_box = get_widget_assert (builder, "table3"); rd.old_and_new_dialog = - PSPPIRE_DIALOG (get_widget_assert (xml, "old-new-values-dialog")); + PSPPIRE_DIALOG (get_widget_assert (builder, "old-new-values-dialog")); gtk_window_set_transient_for (GTK_WINDOW (rd.old_and_new_dialog), - de->parent.window); + GTK_WINDOW (de)); - rd.acr = PSPPIRE_ACR (get_widget_assert (xml, "psppire-acr1")); + rd.acr = PSPPIRE_ACR (get_widget_assert (builder, "psppire-acr1")); g_signal_connect_swapped (rd.toggle[BUTTON_NEW_VALUE], "toggled", G_CALLBACK (set_acr), &rd); @@ -1049,11 +1053,11 @@ recode_dialog (struct data_editor *de, gboolean diff) g_signal_connect (rd.toggle[BUTTON_OLD_RANGE], "toggled", G_CALLBACK (toggle_sensitivity), - get_widget_assert (xml, "entry3")); + get_widget_assert (builder, "entry3")); g_signal_connect (rd.toggle[BUTTON_OLD_RANGE], "toggled", G_CALLBACK (toggle_sensitivity), - get_widget_assert (xml, "entry5")); + get_widget_assert (builder, "entry5")); g_signal_connect (rd.toggle[BUTTON_OLD_LOW_UP], "toggled", G_CALLBACK (toggle_sensitivity), rd.ov_low_up_entry); @@ -1087,6 +1091,7 @@ recode_dialog (struct data_editor *de, gboolean diff) case GTK_RESPONSE_OK: { gchar *syntax = generate_syntax (&rd); + struct getl_interface *sss = create_syntax_string_source (syntax); execute_syntax (sss); @@ -1096,11 +1101,7 @@ recode_dialog (struct data_editor *de, gboolean diff) case PSPPIRE_RESPONSE_PASTE: { gchar *syntax = generate_syntax (&rd); - - struct syntax_editor *se = - (struct syntax_editor *) window_create (WINDOW_SYNTAX, NULL); - - gtk_text_buffer_insert_at_cursor (se->buffer, syntax, -1); + paste_syntax_in_new_window (syntax); g_free (syntax); } @@ -1109,7 +1110,12 @@ recode_dialog (struct data_editor *de, gboolean diff) break; } - g_object_unref (xml); + g_hash_table_destroy (rd.varmap); + + gtk_list_store_clear (GTK_LIST_STORE (rd.value_map)); + g_object_unref (rd.value_map); + + g_object_unref (builder); } /* Initialise VAL to reflect the current status of RD */ @@ -1262,11 +1268,9 @@ static void run_old_and_new_dialog (struct recode_dialog *rd) { gint response; - rd->local_store = clone_list_store (rd->value_map); + GtkListStore *local_store = clone_list_store (rd->value_map); - g_object_ref (rd->local_store); - - psppire_acr_set_model (rd->acr, rd->local_store); + psppire_acr_set_model (rd->acr, local_store); psppire_acr_set_get_value_func (rd->acr, set_value, rd); gtk_window_set_title (GTK_WINDOW (rd->old_and_new_dialog), @@ -1280,7 +1284,6 @@ run_old_and_new_dialog (struct recode_dialog *rd) /* Find the type of the first variable (it's invariant that all variables are of the same type) */ const struct variable *v; - gint idx; GtkTreeIter iter; GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (rd->variable_treeview)); @@ -1289,9 +1292,7 @@ run_old_and_new_dialog (struct recode_dialog *rd) g_return_if_fail (not_empty); - gtk_tree_model_get (model, &iter, 0, &idx, -1); - - v = psppire_dict_get_variable (rd->dict, idx); + gtk_tree_model_get (model, &iter, 0, &v, -1); rd->input_var_is_string = var_is_alpha (v); @@ -1315,7 +1316,12 @@ run_old_and_new_dialog (struct recode_dialog *rd) if ( response == PSPPIRE_RESPONSE_CONTINUE ) - rd->value_map = clone_list_store (rd->local_store); + { + g_object_unref (rd->value_map); + rd->value_map = clone_list_store (local_store); + } + else + g_object_unref (local_store); psppire_dialog_notify_change (PSPPIRE_DIALOG (rd->dialog)); @@ -1333,9 +1339,8 @@ new_value_append_syntax (GString *str, const struct new_value *nv) break; case NV_STRING: { - struct string ds; - ds_init_cstr (&ds, nv->v.s); - gen_quoted_string (&ds); + 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); } @@ -1366,9 +1371,8 @@ old_value_append_syntax (GString *str, const struct old_value *ov) break; case OV_STRING: { - struct string ds; - ds_init_cstr (&ds, ov->v.s); - gen_quoted_string (&ds); + 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); } @@ -1417,33 +1421,26 @@ generate_syntax (const struct recode_dialog *rd) if ( rd->different && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (rd->string_button))) { - GtkTreeIter iter; + GHashTableIter iter; + struct variable *var = NULL; + struct nlp *nlp = NULL; - for (ok = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (rd->var_map), - &iter); - ok; - ok = gtk_tree_model_iter_next (GTK_TREE_MODEL (rd->var_map), &iter)) + g_hash_table_iter_init (&iter, rd->varmap); + while (g_hash_table_iter_next (&iter, (void**) &var, (void**) &nlp)) { - gchar *name = NULL; - - gtk_tree_model_get (GTK_TREE_MODEL (rd->var_map), &iter, - COL_NEW_NAME, &name, -1); - g_string_append (str, "\nSTRING "); - g_string_append (str, name); + g_string_append (str, nlp->name); g_string_append_printf (str, " (A%d).", (int) gtk_spin_button_get_value (GTK_SPIN_BUTTON (rd->width_entry) ) ); - - g_free (name); } } g_string_append (str, "\nRECODE "); - append_variable_names (str, rd->dict, GTK_TREE_VIEW (rd->variable_treeview)); + psppire_var_view_append_names (PSPPIRE_VAR_VIEW (rd->variable_treeview), 0, str); g_string_append (str, "\n\t"); @@ -1484,67 +1481,43 @@ generate_syntax (const struct recode_dialog *rd) if ( rd->different ) { + GtkTreeIter iter; g_string_append (str, "\n\tINTO "); - for (ok = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (rd->var_map), - &iter); + for (ok = psppire_var_view_get_iter_first (PSPPIRE_VAR_VIEW (rd->variable_treeview), &iter); ok; - ok = gtk_tree_model_iter_next (GTK_TREE_MODEL (rd->var_map), &iter)) - { - gchar *name = NULL; - - gtk_tree_model_get (GTK_TREE_MODEL (rd->var_map), &iter, - COL_NEW_NAME, &name, -1); - - g_string_append (str, name); - g_string_append (str, " "); + ok = psppire_var_view_get_iter_next (PSPPIRE_VAR_VIEW (rd->variable_treeview), &iter)) + { + struct nlp *nlp = NULL; + const struct variable *var = psppire_var_view_get_variable (PSPPIRE_VAR_VIEW (rd->variable_treeview), 0, &iter); - g_free (name); - } + nlp = g_hash_table_lookup (rd->varmap, var); + + g_string_append (str, nlp->name); + g_string_append (str, " "); + } } g_string_append (str, "."); - /* If applicable, set labels for the new variables. */ if ( rd->different ) { - GtkTreeIter iter; + GHashTableIter iter; - for (ok = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (rd->var_map), - &iter); - ok; - ok = gtk_tree_model_iter_next (GTK_TREE_MODEL (rd->var_map), &iter)) + struct variable *var = NULL; + struct nlp *nlp = NULL; + + g_hash_table_iter_init (&iter, rd->varmap); + while (g_hash_table_iter_next (&iter, (void**) &var, (void**) &nlp)) { - struct string ls; - gchar *label = NULL; - gchar *name = NULL; - - gtk_tree_model_get (GTK_TREE_MODEL (rd->var_map), &iter, - COL_NEW_NAME, &name, - COL_NEW_LABEL, &label, -1); - - if ( 0 == strcmp (label, "") ) - { - g_free (name); - g_free (label); - continue; - } - - ds_init_cstr (&ls, label); - g_free (label); - gen_quoted_string (&ls); - - g_string_append_printf (str, "\nVARIABLE LABELS %s %s.", - name, ds_cstr (&ls)); - - g_free (name); - ds_destroy (&ls); + if (nlp->label) + g_string_append_printf (str, "\nVARIABLE LABELS %s %s.", + nlp->name, nlp->label); } } - g_string_append (str, "\nEXECUTE.\n");