X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-dialog-action-select.c;h=5ee493a45f7fa79190c1daba34f975bcece675a4;hb=b525a9596e60d5ae4c6c464b4a426b77ade3dd72;hp=37451876ab50e256ace5b37624a481a6fb8b4936;hpb=7293c1a383d325c371bd708401e5a1d7586a4d90;p=pspp diff --git a/src/ui/gui/psppire-dialog-action-select.c b/src/ui/gui/psppire-dialog-action-select.c index 37451876ab..5ee493a45f 100644 --- a/src/ui/gui/psppire-dialog-action-select.c +++ b/src/ui/gui/psppire-dialog-action-select.c @@ -1,5 +1,5 @@ /* PSPPIRE - a graphical user interface for PSPP. - Copyright (C) 2007, 2008, 2009, 2010, 2011, 2014, 2015 Free Software Foundation, Inc. + Copyright (C) 2007, 2008, 2009, 2010, 2011, 2014, 2015, 2020 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 @@ -152,7 +152,7 @@ sample_subdialog (GtkButton *b, gpointer data) 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); @@ -172,7 +172,7 @@ sample_subdialog (GtkButton *b, gpointer data) response = psppire_dialog_run (PSPPIRE_DIALOG (scd->rsample_dialog)); - if ( response != PSPPIRE_RESPONSE_CONTINUE) + if (response != PSPPIRE_RESPONSE_CONTINUE) { g_signal_handlers_disconnect_by_func (G_OBJECT (scd->percent), @@ -192,7 +192,7 @@ sample_subdialog (GtkButton *b, gpointer data) { gchar *text; - if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (scd->percent))) + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (scd->percent))) { text = widget_printf (gettext(label1), scd->spinbutton); gtk_label_set_text (GTK_LABEL (scd->l0), text); @@ -231,7 +231,7 @@ range_subdialog (GtkButton *b, gpointer data) GTK_WINDOW (pda->dialog)); response = psppire_dialog_run (PSPPIRE_DIALOG (scd->range_subdialog)); - if ( response == PSPPIRE_RESPONSE_CONTINUE) + if (response == PSPPIRE_RESPONSE_CONTINUE) { gchar *text = widget_printf (_("%d thru %d"), scd->first, scd->last); gtk_label_set_text (GTK_LABEL (scd->l1), text); @@ -255,111 +255,119 @@ consistency (GtkSpinButton *spin, PsppireDialogActionSelect *act) } } -static void -psppire_dialog_action_select_activate (PsppireDialogAction *a) + +/* When the all cases label button is clicked, set the corresponding button + to active. This is a convenience thing, since the button itself has + a very small area and is hard to find with the mouse pointer. */ +static gboolean +on_button_release (GtkWidget *w, GdkEvent *e, gpointer a) { PsppireDialogActionSelect *act = PSPPIRE_DIALOG_ACTION_SELECT (a); - PsppireDialogAction *pda = PSPPIRE_DIALOG_ACTION (a); - GHashTable *thing = psppire_dialog_action_get_hash_table (pda); - GtkBuilder *xml = g_hash_table_lookup (thing, a); - if (!xml) - { - xml = builder_new ("select-cases.ui"); - g_hash_table_insert (thing, a, xml); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (act->radiobutton_all), TRUE); + return FALSE; +} - pda->dialog = get_widget_assert (xml, "select-cases-dialog"); - pda->source = get_widget_assert (xml, "select-cases-treeview"); +static GtkBuilder * +psppire_dialog_action_select_activate (PsppireDialogAction *a, GVariant *param) +{ + PsppireDialogActionSelect *act = PSPPIRE_DIALOG_ACTION_SELECT (a); + PsppireDialogAction *pda = PSPPIRE_DIALOG_ACTION (a); - g_object_set (pda->source, - "selection-mode", GTK_SELECTION_SINGLE, - NULL); - - act->entry = get_widget_assert (xml, "filter-variable-entry"); + GtkBuilder *xml = builder_new ("select-cases.ui"); - GtkWidget *selector = get_widget_assert (xml, "psppire-selector-filter"); - psppire_selector_set_filter_func (PSPPIRE_SELECTOR (selector), - is_currently_in_entry); + pda->dialog = get_widget_assert (xml, "select-cases-dialog"); + pda->source = get_widget_assert (xml, "select-cases-treeview"); - 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"); + g_object_set (pda->source, + "selection-mode", GTK_SELECTION_SINGLE, + NULL); - act->l0 = get_widget_assert (xml, "random-sample-label");; + act->entry = get_widget_assert (xml, "filter-variable-entry"); - act->radiobutton_range = get_widget_assert (xml, "radiobutton-range"); - act->range_subdialog = get_widget_assert (xml, "select-cases-range-dialog"); + GtkWidget *selector = get_widget_assert (xml, "psppire-selector-filter"); + psppire_selector_set_filter_func (PSPPIRE_SELECTOR (selector), + is_currently_in_entry); - act->first = get_widget_assert (xml, "range-dialog-first"); - act->last = get_widget_assert (xml, "range-dialog-last"); + 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"); - g_signal_connect (act->first, "value-changed", G_CALLBACK (consistency), act); - g_signal_connect (act->last, "value-changed", G_CALLBACK (consistency), act); + act->l0 = get_widget_assert (xml, "random-sample-label"); - act->l1 = get_widget_assert (xml, "range-sample-label"); - act->radiobutton_sample = get_widget_assert (xml, "radiobutton-sample"); + act->radiobutton_range = get_widget_assert (xml, "radiobutton-range"); + act->range_subdialog = get_widget_assert (xml, "select-cases-range-dialog"); - act->radiobutton_all = get_widget_assert (xml, "radiobutton-all"); - act->radiobutton_filter_variable = get_widget_assert (xml, "radiobutton-filter-variable"); + act->first = get_widget_assert (xml, "range-dialog-first"); + act->last = get_widget_assert (xml, "range-dialog-last"); - act->radiobutton_filter = get_widget_assert (xml, "radiobutton-filter"); - act->radiobutton_delete = get_widget_assert (xml, "radiobutton-delete"); + g_signal_connect (act->first, "value-changed", G_CALLBACK (consistency), act); + g_signal_connect (act->last, "value-changed", G_CALLBACK (consistency), act); + act->l1 = get_widget_assert (xml, "range-sample-label"); + act->radiobutton_sample = get_widget_assert (xml, "radiobutton-sample"); - GtkWidget *button_range = get_widget_assert (xml, "button-range"); - GtkWidget *button_sample = get_widget_assert (xml, "button-sample"); + act->radiobutton_all = get_widget_assert (xml, "radiobutton-all"); + act->radiobutton_filter_variable = get_widget_assert (xml, "radiobutton-filter-variable"); - GtkWidget *button_if =get_widget_assert (xml, "button-if"); + act->radiobutton_filter = get_widget_assert (xml, "radiobutton-filter"); + act->radiobutton_delete = get_widget_assert (xml, "radiobutton-delete"); - GtkWidget *radiobutton_if = get_widget_assert (xml, "radiobutton-if"); + GtkWidget *all_cases_event = get_widget_assert (xml, "all-cases-event"); + g_signal_connect (all_cases_event, "button-release-event", G_CALLBACK (on_button_release), act); - GtkWidget *sample_label = get_widget_assert (xml, "random-sample-label"); + GtkWidget *button_range = get_widget_assert (xml, "button-range"); + GtkWidget *button_sample = get_widget_assert (xml, "button-sample"); - g_signal_connect (act->radiobutton_all, "toggled", - G_CALLBACK (set_sensitivity_from_toggle_invert), - get_widget_assert (xml, "filter-delete-button-box")); + GtkWidget *button_if =get_widget_assert (xml, "button-if"); - g_signal_connect (button_if, "clicked", - G_CALLBACK (set_radiobutton), radiobutton_if); + GtkWidget *radiobutton_if = get_widget_assert (xml, "radiobutton-if"); - g_signal_connect (button_sample, "clicked", - G_CALLBACK (set_radiobutton), act->radiobutton_sample); + GtkWidget *sample_label = get_widget_assert (xml, "random-sample-label"); - g_signal_connect (button_range, "clicked", - G_CALLBACK (set_radiobutton), act->radiobutton_range); + 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 (selector, "clicked", - G_CALLBACK (set_radiobutton), act->radiobutton_filter_variable); + g_signal_connect (button_if, "clicked", + G_CALLBACK (set_radiobutton), radiobutton_if); - g_signal_connect (selector, "selected", - G_CALLBACK (set_radiobutton), act->radiobutton_filter_variable); + g_signal_connect (button_sample, "clicked", + G_CALLBACK (set_radiobutton), act->radiobutton_sample); - g_signal_connect (act->radiobutton_range, "toggled", - G_CALLBACK (set_sensitivity_from_toggle), - act->l1); + g_signal_connect (button_range, "clicked", + G_CALLBACK (set_radiobutton), act->radiobutton_range); - g_signal_connect (act->radiobutton_sample, "toggled", - G_CALLBACK (set_sensitivity_from_toggle), - sample_label); + g_signal_connect (selector, "clicked", + 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 (selector, "selected", + G_CALLBACK (set_radiobutton), act->radiobutton_filter_variable); - g_signal_connect (button_range, - "clicked", G_CALLBACK (range_subdialog), act); + g_signal_connect (act->radiobutton_range, "toggled", + G_CALLBACK (set_sensitivity_from_toggle), + act->l1); - g_signal_connect (button_sample, - "clicked", G_CALLBACK (sample_subdialog), act); - } + g_signal_connect (act->radiobutton_sample, "toggled", + G_CALLBACK (set_sensitivity_from_toggle), + sample_label); + 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); - + dialog_state_valid); + return xml; } @@ -387,10 +395,10 @@ generate_syntax_filter (const PsppireDialogAction *a) ds_put_cstr (&dss, "EXECUTE.\n"); } - else if ( gtk_toggle_button_get_active + else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (scd->radiobutton_sample))) { - if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (scd->percent))) + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (scd->percent))) { const double percentage = gtk_spin_button_get_value (GTK_SPIN_BUTTON (scd->spinbutton)); @@ -398,7 +406,7 @@ generate_syntax_filter (const PsppireDialogAction *a) ds_put_c_format (&dss, "COMPUTE %s = RV.UNIFORM (0,1) < %.*g.\n", filter, - DBL_DIG + 1, percentage / 100.0 ); + DBL_DIG + 1, percentage / 100.0); } else { @@ -422,27 +430,27 @@ generate_syntax_filter (const PsppireDialogAction *a) ranvar); ds_put_c_format (&dss, - "SORT BY %s, %s.\n", + "SORT CASES BY %s, %s.\n", filter, ranvar); ds_put_cstr (&dss, "EXECUTE.\n"); - + ds_put_c_format (&dss, "COMPUTE %s = $CASENUM.\n", - filter ); + filter); ds_put_c_format (&dss, "COMPUTE %s = %s <= %d\n", filter, filter, - n_cases ); + n_cases); ds_put_cstr (&dss, "EXECUTE.\n"); ds_put_c_format (&dss, - "SORT BY %s.\n", + "SORT CASES BY %s.\n", key); ds_put_c_format (&dss, @@ -474,7 +482,7 @@ generate_syntax_delete (const PsppireDialogAction *a) gchar *text = NULL; struct string dss; - if ( gtk_toggle_button_get_active + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (scd->radiobutton_all))) { return xstrdup ("\n"); @@ -482,12 +490,12 @@ generate_syntax_delete (const PsppireDialogAction *a) ds_init_empty (&dss); - if ( gtk_toggle_button_get_active + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (scd->radiobutton_sample))) { ds_put_cstr (&dss, "SAMPLE "); - - if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (scd->percent))) + + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (scd->percent))) { const double percentage = gtk_spin_button_get_value (GTK_SPIN_BUTTON (scd->spinbutton)); @@ -499,12 +507,12 @@ generate_syntax_delete (const PsppireDialogAction *a) 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->spin_sample_limit)); - + ds_put_c_format (&dss, "%d FROM %d .", n_cases, from_n_cases); } - + } - else if ( gtk_toggle_button_get_active + else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (scd->radiobutton_range))) { ds_put_c_format (&dss, @@ -540,13 +548,13 @@ generate_syntax (const PsppireDialogAction *a) PsppireDialogActionSelect *scd = PSPPIRE_DIALOG_ACTION_SELECT (a); /* In the simple case, all we need to do is cancel any existing filter */ - if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (scd->radiobutton_all))) + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (scd->radiobutton_all))) { return g_strdup ("FILTER OFF.\n"); } - + /* Are we filtering or deleting ? */ - if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (scd->radiobutton_delete))) + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (scd->radiobutton_delete))) { return generate_syntax_delete (a); } @@ -560,7 +568,7 @@ generate_syntax (const PsppireDialogAction *a) 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; }