Add "dictionary" property to PsppireVarStore and use it.
[pspp-builds.git] / src / ui / gui / recode-dialog.c
index b233f116d88e14092682e875e5722f8aaa74a115..0bb82eb335a9a6d3c75a13f6c1cf34e47863c8a3 100644 (file)
@@ -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
 
 #include "recode-dialog.h"
 
+#include "executor.h"
+
 #include <gtk/gtk.h>
-#include <gtksheet/gtksheet.h>
 
+#include <xalloc.h>
 #include <language/syntax-string-source.h>
-#include <ui/gui/data-editor.h>
+#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/psppire-dialog.h>
 #include <ui/gui/psppire-var-store.h>
-#include <ui/gui/syntax-editor.h>
-#include <libpspp/syntax-gen.h>
+
+#include <ui/syntax-gen.h>
 
 #include "psppire-acr.h"
 
@@ -72,7 +74,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 +328,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 */
@@ -375,7 +376,7 @@ enum {
   COL_OLD,
   COL_NEW_NAME,
   COL_NEW_LABEL,
-  n_COLS
+  n_COL_VARS
 };
 
 enum {
@@ -472,14 +473,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,7 +489,7 @@ 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);
 }
@@ -838,37 +839,35 @@ set_acr (struct recode_dialog *rd)
 }
 
 static void
-recode_dialog (struct data_editor *de, gboolean diff)
+recode_dialog (PsppireDataWindow *de, gboolean diff)
 {
   gint response;
 
   struct recode_dialog rd;
 
-  GladeXML *xml = XML_NEW ("recode.glade");
+  GtkBuilder *builder = builder_new ("recode.ui");
 
+  GtkWidget *selector = get_widget_assert (builder, "psppire-selector1");
 
-  GtkWidget *selector = get_widget_assert (xml, "psppire-selector1");
+  GtkWidget *oldandnew = get_widget_assert (builder, "button1");
 
-  GtkWidget *oldandnew = get_widget_assert (xml, "button1");
 
+  GtkWidget *output_variable_box = get_widget_assert (builder,"frame4");
 
-  GtkWidget *output_variable_box = get_widget_assert (xml,"frame4");
 
-  GtkSheet *var_sheet =
-    GTK_SHEET (get_widget_assert (de->xml, "variable_sheet"));
+  PsppireVarStore *vs = NULL;
 
+  g_object_get (de->data_editor, "var-store", &vs, NULL);
 
-  PsppireVarStore *vs = PSPPIRE_VAR_STORE (gtk_sheet_get_model (var_sheet));
+  rd.change_button = get_widget_assert (builder, "change-button");
 
-  rd.change_button = get_widget_assert (xml, "change-button");
+  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");
 
-  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");
-
-  rd.dict = vs->dict;
+  g_object_get (vs, "dictionary", &rd.dict, NULL);
 
   rd.value_map = gtk_list_store_new (2,
                                     old_value_get_type (),
@@ -886,17 +885,14 @@ 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, "dictionary", rd.dict, NULL);
 
   if ( ! rd.different )
     {
-      set_dest_model (GTK_TREE_VIEW (rd.variable_treeview), vs->dict);
+      set_dest_model (GTK_TREE_VIEW (rd.variable_treeview), rd.dict);
     }
   else
     {
@@ -904,7 +900,7 @@ recode_dialog (struct data_editor *de, gboolean diff)
       GtkTreeViewColumn *col;
       GtkCellRenderer *renderer = gtk_cell_renderer_text_new ();
 
-      rd.var_map = gtk_list_store_new (n_COLS, G_TYPE_INT,
+      rd.var_map = gtk_list_store_new (n_COL_VARS, G_TYPE_INT,
                                                    G_TYPE_STRING,
                                                    G_TYPE_STRING);
 
@@ -920,7 +916,7 @@ recode_dialog (struct data_editor *de, gboolean diff)
 
       gtk_tree_view_column_set_cell_data_func (col, renderer,
                                               cell_var_name,
-                                              vs->dict, 0);
+                                              rd.dict, 0);
 
 
       gtk_tree_view_append_column (GTK_TREE_VIEW (rd.variable_treeview), col);
@@ -966,40 +962,40 @@ recode_dialog (struct data_editor *de, gboolean diff)
 
   /* 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);
@@ -1050,11 +1046,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);
@@ -1088,6 +1084,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);
 
@@ -1097,11 +1094,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);
       }
@@ -1110,7 +1103,11 @@ recode_dialog (struct data_editor *de, gboolean diff)
       break;
     }
 
-  g_object_unref (xml);
+
+  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 */
@@ -1263,11 +1260,9 @@ static void
 run_old_and_new_dialog (struct recode_dialog *rd)
 {
   gint response;
-  rd->local_store = clone_list_store (rd->value_map);
-
-  g_object_ref (rd->local_store);
+  GtkListStore *local_store = clone_list_store (rd->value_map);
 
-  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),
@@ -1316,7 +1311,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));
@@ -1334,9 +1334,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);
       }
@@ -1367,9 +1366,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);
       }
@@ -1533,9 +1531,9 @@ generate_syntax (const struct recode_dialog *rd)
              continue;
            }
 
-         ds_init_cstr (&ls, label);
+         ds_init_empty (&ls);
+         syntax_gen_string (&ls, ss_cstr (label));
          g_free (label);
-         gen_quoted_string (&ls);
 
          g_string_append_printf (str, "\nVARIABLE LABELS %s %s.",
                                  name, ds_cstr (&ls));