static gboolean
dialog_state_valid (gpointer data)
{
+ PsppireDialogActionSelect *act = PSPPIRE_DIALOG_ACTION_SELECT (data);
+ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (act->radiobutton_all)))
+ {
+ return TRUE;
+ }
+ else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (act->radiobutton_filter_variable)))
+ {
+ const gchar *text = gtk_entry_get_text (GTK_ENTRY (act->entry));
+ if (!psppire_dict_lookup_var (PSPPIRE_DIALOG_ACTION (act)->dict, text))
+ return FALSE;
+ }
+
return TRUE;
}
static const gchar label2[] = N_("Exactly %3d cases from the first %3d cases.");
+/* Ensure that the range "first" and "last" spinbuttons are self consistent */
+static void
+sample_consistent (GtkSpinButton *spin, PsppireDialogActionSelect *act)
+{
+ gdouble size = gtk_spin_button_get_value (GTK_SPIN_BUTTON (act->spin_sample_size));
+ gdouble limit = gtk_spin_button_get_value (GTK_SPIN_BUTTON (act->spin_sample_limit));
+
+ if (limit < size)
+ {
+ if (spin == GTK_SPIN_BUTTON (act->spin_sample_size))
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (act->spin_sample_limit), size);
+ if (spin == GTK_SPIN_BUTTON (act->spin_sample_limit))
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (act->spin_sample_size), limit);
+ }
+}
+
+
static void
sample_subdialog (GtkButton *b, gpointer data)
{
if (!scd->hbox2)
{
scd->hbox2 =
- psppire_scanf_new (gettext (label2), &scd->spinbutton1, &scd->spinbutton2);
+ psppire_scanf_new (gettext (label2), &scd->spin_sample_size, &scd->spin_sample_limit);
- gtk_spin_button_set_range (GTK_SPIN_BUTTON (scd->spinbutton1),
+ gtk_spin_button_set_range (GTK_SPIN_BUTTON (scd->spin_sample_size),
1, case_count);
- gtk_spin_button_set_range (GTK_SPIN_BUTTON (scd->spinbutton2),
+ gtk_spin_button_set_range (GTK_SPIN_BUTTON (scd->spin_sample_limit),
1, case_count);
+ g_signal_connect (scd->spin_sample_size, "value-changed", G_CALLBACK (sample_consistent), scd);
+ g_signal_connect (scd->spin_sample_limit, "value-changed", G_CALLBACK (sample_consistent), scd);
+
+
gtk_widget_show (scd->hbox2);
gtk_widget_set_sensitive (scd->hbox2, FALSE);
else
{
text =
- widget_printf (gettext(label2), scd->spinbutton1, scd->spinbutton2);
+ widget_printf (gettext(label2), scd->spin_sample_size, scd->spin_sample_limit);
gtk_label_set_text (GTK_LABEL (scd->l0), text);
}
}
}
-
+/* Ensure that the range "first" and "last" spinbuttons are self consistent */
static void
-psppire_dialog_action_select_activate (PsppireDialogAction *a)
+consistency (GtkSpinButton *spin, PsppireDialogActionSelect *act)
{
- PsppireDialogActionSelect *act = PSPPIRE_DIALOG_ACTION_SELECT (a);
- PsppireDialogAction *pda = PSPPIRE_DIALOG_ACTION (a);
+ gdouble first = gtk_spin_button_get_value (GTK_SPIN_BUTTON (act->first));
+ gdouble last = gtk_spin_button_get_value (GTK_SPIN_BUTTON (act->last));
- GHashTable *thing = psppire_dialog_action_get_hash_table (pda);
- GtkBuilder *xml = g_hash_table_lookup (thing, a);
- if (!xml)
+ if (last < first)
{
- xml = builder_new ("select-cases.ui");
- g_hash_table_insert (thing, a, xml);
+ if (spin == GTK_SPIN_BUTTON (act->first))
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (act->last), first);
+ if (spin == GTK_SPIN_BUTTON (act->last))
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (act->first), last);
+ }
+}
+static GtkBuilder *
+psppire_dialog_action_select_activate (PsppireDialogAction *a, GVariant *param)
+{
+ PsppireDialogActionSelect *act = PSPPIRE_DIALOG_ACTION_SELECT (a);
+ PsppireDialogAction *pda = PSPPIRE_DIALOG_ACTION (a);
+
+ GtkBuilder *xml = builder_new ( "select-cases.ui");
- pda->dialog = get_widget_assert (xml, "select-cases-dialog");
- pda->source = get_widget_assert (xml, "select-cases-treeview");
+ pda->dialog = get_widget_assert (xml, "select-cases-dialog");
+ pda->source = get_widget_assert (xml, "select-cases-treeview");
- g_object_set (pda->source,
- "selection-mode", GTK_SELECTION_SINGLE,
- NULL);
-
- act->entry = get_widget_assert (xml, "filter-variable-entry");
+ g_object_set (pda->source,
+ "selection-mode", GTK_SELECTION_SINGLE,
+ NULL);
- GtkWidget *selector = get_widget_assert (xml, "psppire-selector-filter");
- psppire_selector_set_filter_func (PSPPIRE_SELECTOR (selector),
- is_currently_in_entry);
+ act->entry = get_widget_assert (xml, "filter-variable-entry");
- act->rsample_dialog = get_widget_assert (xml, "select-cases-random-sample-dialog");
- act->percent = get_widget_assert (xml, "radiobutton-sample-percent");
- act->sample_n_cases = get_widget_assert (xml, "radiobutton-sample-n-cases");
- act->table = get_widget_assert (xml, "select-cases-random-sample-table");
+ GtkWidget *selector = get_widget_assert (xml, "psppire-selector-filter");
+ psppire_selector_set_filter_func (PSPPIRE_SELECTOR (selector),
+ is_currently_in_entry);
- act->l0 = get_widget_assert (xml, "random-sample-label");;
+ act->rsample_dialog = get_widget_assert (xml, "select-cases-random-sample-dialog");
+ act->percent = get_widget_assert (xml, "radiobutton-sample-percent");
+ act->sample_n_cases = get_widget_assert (xml, "radiobutton-sample-n-cases");
+ act->table = get_widget_assert (xml, "select-cases-random-sample-table");
- act->radiobutton_range = get_widget_assert (xml, "radiobutton-range");
- act->range_subdialog = get_widget_assert (xml, "select-cases-range-dialog");
+ act->l0 = get_widget_assert (xml, "random-sample-label");;
- act->first = get_widget_assert (xml, "range-dialog-first");
- act->last = get_widget_assert (xml, "range-dialog-last");
+ act->radiobutton_range = get_widget_assert (xml, "radiobutton-range");
+ act->range_subdialog = get_widget_assert (xml, "select-cases-range-dialog");
- act->l1 = get_widget_assert (xml, "range-sample-label");
- act->radiobutton_sample = get_widget_assert (xml, "radiobutton-sample");
+ act->first = get_widget_assert (xml, "range-dialog-first");
+ act->last = get_widget_assert (xml, "range-dialog-last");
- act->radiobutton_all = get_widget_assert (xml, "radiobutton-all");
- act->radiobutton_filter_variable = get_widget_assert (xml, "radiobutton-filter-variable");
+ g_signal_connect (act->first, "value-changed", G_CALLBACK (consistency), act);
+ g_signal_connect (act->last, "value-changed", G_CALLBACK (consistency), act);
- act->radiobutton_filter = get_widget_assert (xml, "radiobutton-filter");
- act->radiobutton_delete = get_widget_assert (xml, "radiobutton-delete");
+ act->l1 = get_widget_assert (xml, "range-sample-label");
+ act->radiobutton_sample = get_widget_assert (xml, "radiobutton-sample");
+ act->radiobutton_all = get_widget_assert (xml, "radiobutton-all");
+ act->radiobutton_filter_variable = get_widget_assert (xml, "radiobutton-filter-variable");
- GtkWidget *button_range = get_widget_assert (xml, "button-range");
- GtkWidget *button_sample = get_widget_assert (xml, "button-sample");
+ act->radiobutton_filter = get_widget_assert (xml, "radiobutton-filter");
+ act->radiobutton_delete = get_widget_assert (xml, "radiobutton-delete");
- GtkWidget *button_if =get_widget_assert (xml, "button-if");
- GtkWidget *radiobutton_if = get_widget_assert (xml, "radiobutton-if");
+ GtkWidget *button_range = get_widget_assert (xml, "button-range");
+ GtkWidget *button_sample = get_widget_assert (xml, "button-sample");
- GtkWidget *sample_label = get_widget_assert (xml, "random-sample-label");
+ GtkWidget *button_if =get_widget_assert (xml, "button-if");
- g_signal_connect (act->radiobutton_all, "toggled",
- G_CALLBACK (set_sensitivity_from_toggle_invert),
- get_widget_assert (xml, "filter-delete-button-box"));
+ GtkWidget *radiobutton_if = get_widget_assert (xml, "radiobutton-if");
- g_signal_connect (button_if, "clicked",
- G_CALLBACK (set_radiobutton), radiobutton_if);
+ GtkWidget *sample_label = get_widget_assert (xml, "random-sample-label");
- g_signal_connect (button_sample, "clicked",
- G_CALLBACK (set_radiobutton), act->radiobutton_sample);
+ g_signal_connect (act->radiobutton_all, "toggled",
+ G_CALLBACK (set_sensitivity_from_toggle_invert),
+ get_widget_assert (xml, "filter-delete-button-box"));
- g_signal_connect (button_range, "clicked",
- G_CALLBACK (set_radiobutton), act->radiobutton_range);
+ g_signal_connect (button_if, "clicked",
+ G_CALLBACK (set_radiobutton), radiobutton_if);
- g_signal_connect (selector, "clicked",
- G_CALLBACK (set_radiobutton), act->radiobutton_filter_variable);
+ g_signal_connect (button_sample, "clicked",
+ G_CALLBACK (set_radiobutton), act->radiobutton_sample);
- g_signal_connect (selector, "selected",
- G_CALLBACK (set_radiobutton), act->radiobutton_filter_variable);
+ g_signal_connect (button_range, "clicked",
+ G_CALLBACK (set_radiobutton), act->radiobutton_range);
- g_signal_connect (act->radiobutton_range, "toggled",
- G_CALLBACK (set_sensitivity_from_toggle),
- act->l1);
+ g_signal_connect (selector, "clicked",
+ G_CALLBACK (set_radiobutton), act->radiobutton_filter_variable);
- g_signal_connect (act->radiobutton_sample, "toggled",
- G_CALLBACK (set_sensitivity_from_toggle),
- sample_label);
+ g_signal_connect (selector, "selected",
+ G_CALLBACK (set_radiobutton), act->radiobutton_filter_variable);
- g_signal_connect (act->radiobutton_filter_variable, "toggled",
- G_CALLBACK (set_sensitivity_from_toggle),
- act->entry);
+ g_signal_connect (act->radiobutton_range, "toggled",
+ G_CALLBACK (set_sensitivity_from_toggle),
+ act->l1);
- g_signal_connect (button_range,
- "clicked", G_CALLBACK (range_subdialog), act);
+ g_signal_connect (act->radiobutton_sample, "toggled",
+ G_CALLBACK (set_sensitivity_from_toggle),
+ sample_label);
- g_signal_connect (button_sample,
- "clicked", G_CALLBACK (sample_subdialog), act);
- }
+ g_signal_connect (act->radiobutton_filter_variable, "toggled",
+ G_CALLBACK (set_sensitivity_from_toggle),
+ act->entry);
+ g_signal_connect (button_range,
+ "clicked", G_CALLBACK (range_subdialog), act);
+
+ g_signal_connect (button_sample,
+ "clicked", G_CALLBACK (sample_subdialog), act);
psppire_dialog_action_set_refresh (pda, refresh);
psppire_dialog_action_set_valid_predicate (pda,
- dialog_state_valid);
-
- if (PSPPIRE_DIALOG_ACTION_CLASS (psppire_dialog_action_select_parent_class)->activate)
- PSPPIRE_DIALOG_ACTION_CLASS (psppire_dialog_action_select_parent_class)->activate (pda);
+ dialog_state_valid);
+ return xml;
}
static char *
-generate_syntax_filter (PsppireDialogAction *a)
+generate_syntax_filter (const PsppireDialogAction *a)
{
PsppireDialogActionSelect *scd = PSPPIRE_DIALOG_ACTION_SELECT (a);
else
{
const gint n_cases =
- gtk_spin_button_get_value (GTK_SPIN_BUTTON (scd->spinbutton1));
+ gtk_spin_button_get_value (GTK_SPIN_BUTTON (scd->spin_sample_size));
const gint from_n_cases =
- gtk_spin_button_get_value (GTK_SPIN_BUTTON (scd->spinbutton2));
+ gtk_spin_button_get_value (GTK_SPIN_BUTTON (scd->spin_sample_limit));
const gchar ranvar[]="rv_$";
filter, ranvar);
ds_put_cstr (&dss, "EXECUTE.\n");
-
+
ds_put_c_format (&dss,
"COMPUTE %s = $CASENUM.\n",
static gchar *
-generate_syntax_delete (PsppireDialogAction *a)
+generate_syntax_delete (const PsppireDialogAction *a)
{
PsppireDialogActionSelect *scd = PSPPIRE_DIALOG_ACTION_SELECT (a);
gchar *text = NULL;
(GTK_TOGGLE_BUTTON (scd->radiobutton_sample)))
{
ds_put_cstr (&dss, "SAMPLE ");
-
+
if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (scd->percent)))
{
const double percentage =
else
{
const gint n_cases =
- gtk_spin_button_get_value (GTK_SPIN_BUTTON (scd->spinbutton1));
+ gtk_spin_button_get_value (GTK_SPIN_BUTTON (scd->spin_sample_size));
const gint from_n_cases =
- gtk_spin_button_get_value (GTK_SPIN_BUTTON (scd->spinbutton2));
-
+ gtk_spin_button_get_value (GTK_SPIN_BUTTON (scd->spin_sample_limit));
+
ds_put_c_format (&dss, "%d FROM %d .", n_cases, from_n_cases);
}
-
+
}
else if ( gtk_toggle_button_get_active
(GTK_TOGGLE_BUTTON (scd->radiobutton_range)))
static gchar *
-generate_syntax (PsppireDialogAction *a)
+generate_syntax (const PsppireDialogAction *a)
{
PsppireDialogActionSelect *scd = PSPPIRE_DIALOG_ACTION_SELECT (a);
{
return g_strdup ("FILTER OFF.\n");
}
-
+
/* Are we filtering or deleting ? */
if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (scd->radiobutton_delete)))
{
static void
psppire_dialog_action_select_class_init (PsppireDialogActionSelectClass *class)
{
- psppire_dialog_action_set_activation (class, psppire_dialog_action_select_activate);
+ PSPPIRE_DIALOG_ACTION_CLASS (class)->initial_activate = psppire_dialog_action_select_activate;
PSPPIRE_DIALOG_ACTION_CLASS (class)->generate_syntax = generate_syntax;
}