Rewrite Import Dialog.
[pspp] / src / ui / gui / select-cases-dialog.c
index 04fcf0dd52142bc8d628b5c17e4cb5ed9ee7770c..e7e8f004abea3de627bd1cac41979062ebf56095 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPPIRE - a graphical user interface for PSPP.
-   Copyright (C) 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+   Copyright (C) 2007, 2008, 2009, 2010, 2011, 2014 Free Software Foundation, Inc.
 
    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
@@ -17,6 +17,7 @@
 #include <config.h>
 
 #include "select-cases-dialog.h"
+#include <float.h>
 #include <gtk/gtk.h>
 #include "executor.h"
 #include "psppire-dialog.h"
 #include "dict-display.h"
 #include "dialog-common.h"
 #include "widget-io.h"
+#include "psppire-scanf.h"
+#include "builder-wrapper.h"
 #include "helper.h"
+
 #include <xalloc.h>
 
 
@@ -57,29 +61,8 @@ struct select_cases_dialog
 static gchar * generate_syntax (const struct select_cases_dialog *scd);
 
 
-static void
-set_sensitivity_from_toggle (GtkToggleButton *togglebutton,  gpointer data)
-{
-  GtkWidget *w = data;
-  gboolean active = gtk_toggle_button_get_active (togglebutton);
-
-  gtk_widget_set_sensitive (w, active);
-}
-
-static void
-set_sensitivity_from_toggle_invert (GtkToggleButton *togglebutton,
-                                   gpointer data)
-{
-  GtkWidget *w = data;
-  gboolean active = gtk_toggle_button_get_active (togglebutton);
-
-  gtk_widget_set_sensitive (w, !active);
-}
-
-
-
-static const gchar label1[]=N_("Approximately %3d%% of all cases.");
-static const gchar label2[]=N_("Exactly %3d cases from the first %3d cases.");
+static const gchar label1[] = N_("Approximately %3d%% of all cases.");
+static const gchar label2[] = N_("Exactly %3d cases from the first %3d cases.");
 
 
 static void
@@ -103,12 +86,14 @@ sample_subdialog (GtkButton *b, gpointer data)
 
   if ( ! scd->hbox1 )
     {
-      scd->hbox1 = widget_scanf (gettext (label1), &scd->spinbutton);
+      scd->hbox1 = psppire_scanf_new (gettext (label1), &scd->spinbutton);
 
       gtk_widget_show (scd->hbox1);
 
-      gtk_table_attach_defaults (GTK_TABLE (table),
-                                scd->hbox1, 1, 2, 0, 1);
+      gtk_grid_attach (GTK_GRID (table),
+                                scd->hbox1, 
+       1, 0, 
+       1, 1);
 
       g_signal_connect (percent, "toggled",
                        G_CALLBACK (set_sensitivity_from_toggle), scd->hbox1);
@@ -120,7 +105,7 @@ sample_subdialog (GtkButton *b, gpointer data)
   if ( ! scd->hbox2 )
     {
       scd->hbox2 =
-       widget_scanf (gettext (label2), &scd->spinbutton1, &scd->spinbutton2);
+       psppire_scanf_new (gettext (label2), &scd->spinbutton1, &scd->spinbutton2);
 
       gtk_spin_button_set_range (GTK_SPIN_BUTTON (scd->spinbutton1),
                                 1, case_count);
@@ -131,8 +116,9 @@ sample_subdialog (GtkButton *b, gpointer data)
       gtk_widget_show (scd->hbox2);
       gtk_widget_set_sensitive (scd->hbox2, FALSE);
 
-      gtk_table_attach_defaults (GTK_TABLE (table),
-                                scd->hbox2, 1, 2, 1, 2);
+      gtk_grid_attach (GTK_GRID (table),
+                                scd->hbox2, 
+       1, 1, 1, 1);
 
       g_signal_connect (sample_n_cases, "toggled",
                        G_CALLBACK (set_sensitivity_from_toggle), scd->hbox2);
@@ -347,7 +333,7 @@ select_cases_dialog (PsppireDataWindow *de)
   switch (response)
     {
     case GTK_RESPONSE_OK:
-      g_free (execute_syntax_string (generate_syntax (&scd)));
+      g_free (execute_syntax_string (de, generate_syntax (&scd)));
       break;
     case PSPPIRE_RESPONSE_PASTE:
       g_free (paste_syntax_to_window (generate_syntax (&scd)));
@@ -364,12 +350,14 @@ static gchar *
 generate_syntax_filter (const struct select_cases_dialog *scd)
 {
   gchar *text = NULL;
-  GString *string = g_string_new ("");
+  struct string dss;
 
-  const gchar filter[]="filter_$";
+  const gchar *filter = "filter_$";
   const gchar key[]="case_$";
 
-  if ( gtk_toggle_button_get_active
+  ds_init_empty (&dss);
+
+  if (gtk_toggle_button_get_active
        (GTK_TOGGLE_BUTTON (get_widget_assert (scd->xml,
                                              "radiobutton-range"))))
     {
@@ -381,14 +369,14 @@ generate_syntax_filter (const struct select_cases_dialog *scd)
        GTK_SPIN_BUTTON (get_widget_assert (scd->xml,
                                           "range-dialog-last"));
 
-      g_string_append_printf (string,
+      ds_put_c_format (&dss,
                              "COMPUTE filter_$ = ($CASENUM >= %ld "
                               "AND $CASENUM <= %ld).\n",
                              (long) gtk_spin_button_get_value (first),
                              (long) gtk_spin_button_get_value (last)
                              );
 
-      g_string_append (string, "EXECUTE.\n");
+      ds_put_cstr (&dss, "EXECUTE.\n");
     }
   else if ( gtk_toggle_button_get_active
        (GTK_TOGGLE_BUTTON (get_widget_assert (scd->xml,
@@ -403,10 +391,10 @@ generate_syntax_filter (const struct select_cases_dialog *scd)
          const double percentage =
            gtk_spin_button_get_value (GTK_SPIN_BUTTON (scd->spinbutton));
 
-         g_string_append_printf (string,
-                                 "COMPUTE %s = RV.UNIFORM (0,1) < %g.\n",
+         ds_put_c_format (&dss,
+                                 "COMPUTE %s = RV.UNIFORM (0,1) < %.*g.\n",
                                  filter,
-                                 percentage / 100.0 );
+                                  DBL_DIG + 1, percentage / 100.0 );
        }
       else
        {
@@ -418,56 +406,62 @@ generate_syntax_filter (const struct select_cases_dialog *scd)
 
          const gchar ranvar[]="rv_$";
 
-         g_string_append_printf (string,
+         ds_put_c_format (&dss,
                                  "COMPUTE %s = $CASENUM.\n", key);
 
-         g_string_append_printf (string,
+         ds_put_c_format (&dss,
                                  "COMPUTE %s = %s > %d.\n",
                                  filter, key, from_n_cases);
 
-         g_string_append_printf (string,
+         ds_put_c_format (&dss,
                                  "COMPUTE %s = RV.UNIFORM (0, 1).\n",
                                  ranvar);
 
-         g_string_append_printf (string,
+         ds_put_c_format (&dss,
                                  "SORT BY %s, %s.\n",
                                  filter, ranvar);
 
-         g_string_append (string, "EXECUTE.\n");
+         ds_put_cstr (&dss, "EXECUTE.\n");
                                  
 
-         g_string_append_printf (string,
+         ds_put_c_format (&dss,
                                  "COMPUTE %s = $CASENUM.\n",
                                  filter );
 
-         g_string_append_printf (string,
+         ds_put_c_format (&dss,
                                  "COMPUTE %s = %s <= %d\n",
                                  filter,
                                  filter,
                                  n_cases );
 
-         g_string_append (string, "EXECUTE.\n");
+         ds_put_cstr (&dss, "EXECUTE.\n");
 
 
-         g_string_append_printf (string,
+         ds_put_c_format (&dss,
                                  "SORT BY %s.\n",
                                  key);
 
-         g_string_append_printf (string,
+         ds_put_c_format (&dss,
                                  "DELETE VARIABLES %s, %s.\n",
                                  key, ranvar);
-
        }
 
-      g_string_append (string, "EXECUTE.\n");
-
+      ds_put_cstr (&dss, "EXECUTE.\n");
+    }
+  else
+    {
+      GtkEntry *entry =
+       GTK_ENTRY (get_widget_assert (scd->xml,
+                                     "filter-variable-entry"));
+      filter = gtk_entry_get_text (entry);
     }
 
+  ds_put_c_format (&dss, "FILTER BY %s.\n", filter);
+
+  text  = ds_steal_cstr (&dss);
 
-  g_string_append_printf  (string, "FILTER BY %s.\n", filter);
+  ds_destroy (&dss);
 
-  text  = string->str;
-  g_string_free (string, FALSE);
   return text;
 }
 
@@ -475,7 +469,7 @@ static gchar *
 generate_syntax_delete (const struct select_cases_dialog *scd)
 {
   gchar *text = NULL;
-  GString *string = NULL;
+  struct string dss;
 
   if ( gtk_toggle_button_get_active
        (GTK_TOGGLE_BUTTON (get_widget_assert (scd->xml,
@@ -484,7 +478,7 @@ generate_syntax_delete (const struct select_cases_dialog *scd)
       return xstrdup ("\n");
     }
 
-  string = g_string_new ("");
+  ds_init_empty (&dss);
 
   if ( gtk_toggle_button_get_active
        (GTK_TOGGLE_BUTTON (get_widget_assert (scd->xml,
@@ -494,13 +488,13 @@ generate_syntax_delete (const struct select_cases_dialog *scd)
       get_widget_assert (scd->xml,
                         "radiobutton-sample-percent");
 
-    g_string_append (string, "SAMPLE ");
+    ds_put_cstr (&dss, "SAMPLE ");
 
     if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (random_sample)))
       {
        const double percentage =
          gtk_spin_button_get_value (GTK_SPIN_BUTTON (scd->spinbutton));
-       g_string_append_printf (string, "%g.", percentage / 100.0);
+       ds_put_c_format (&dss, "%g.", percentage / 100.0);
       }
     else
       {
@@ -509,7 +503,7 @@ generate_syntax_delete (const struct select_cases_dialog *scd)
        const gint from_n_cases =
          gtk_spin_button_get_value (GTK_SPIN_BUTTON (scd->spinbutton2));
 
-       g_string_append_printf (string, "%d FROM %d .", n_cases, from_n_cases);
+       ds_put_c_format (&dss, "%d FROM %d .", n_cases, from_n_cases);
       }
 
   }
@@ -525,14 +519,14 @@ generate_syntax_delete (const struct select_cases_dialog *scd)
        GTK_SPIN_BUTTON (get_widget_assert (scd->xml,
                                           "range-dialog-last"));
 
-      g_string_append_printf (string,
+      ds_put_c_format (&dss,
                              "COMPUTE filter_$ = ($CASENUM >= %ld "
                               "AND $CASENUM <= %ld).\n",
                              (long) gtk_spin_button_get_value (first),
                              (long) gtk_spin_button_get_value (last)
                              );
-      g_string_append (string, "EXECUTE.\n");
-      g_string_append_printf (string, "SELECT IF filter_$.\n");
+      ds_put_cstr (&dss, "EXECUTE.\n");
+      ds_put_c_format (&dss, "SELECT IF filter_$.\n");
 
     }
   else if ( gtk_toggle_button_get_active
@@ -544,17 +538,17 @@ generate_syntax_delete (const struct select_cases_dialog *scd)
        GTK_ENTRY (get_widget_assert (scd->xml,
                                      "filter-variable-entry"));
 
-      g_string_append_printf (string, "SELECT IF (%s <> 0).",
+      ds_put_c_format (&dss, "SELECT IF (%s <> 0).",
                              gtk_entry_get_text (entry));
     }
 
 
-  g_string_append (string, "\n");
+  ds_put_cstr (&dss, "\n");
 
+  text = ds_steal_cstr (&dss);
 
+  ds_destroy (&dss);
 
-  text  = string->str;
-  g_string_free (string, FALSE);
   return text;
 }