Merge 'master' into 'psppsheet'.
[pspp] / src / ui / gui / recode-dialog.c
index d92517c757a7e5d7cbbb246f10388c5a8a50eb84..05984dd44b368af9684b167fd66b0420ff0881f4 100644 (file)
@@ -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  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
@@ -34,9 +34,9 @@
 #include <ui/gui/psppire-data-window.h>
 #include <ui/gui/dialog-common.h>
 #include <ui/gui/dict-display.h>
-#include <ui/gui/helper.h>
+#include <ui/gui/builder-wrapper.h>
+#include "helper.h"
 #include <ui/gui/psppire-dialog.h>
-#include <ui/gui/psppire-var-store.h>
 
 #include "psppire-val-chooser.h"
 
@@ -242,7 +242,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;
@@ -434,7 +434,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 +451,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 +514,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 +550,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 +619,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 +627,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 +718,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 +871,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;
@@ -1075,8 +1086,15 @@ 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));
+             g_string_append_printf (str, "\nVARIABLE LABELS %s %s.",
+                                     nlp->name, ds_cstr (&sl));
+
+             ds_destroy (&sl);
+           }
        }
     }