Categoricals.c Create entries for all groups.
[pspp] / src / ui / gui / chi-square-dialog.c
1 /* PSPPIRE - a graphical user interface for PSPP.
2    Copyright (C) 2010  Free Software Foundation
3
4    This program is free software: you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation, either version 3 of the License, or
7    (at your option) any later version.
8
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program.  If not, see <http://www.gnu.org/licenses/>. */
16
17 #include <config.h>
18
19 #include "chi-square-dialog.h"
20
21 #include <language/syntax-string-source.h>
22
23 #include "psppire-dialog.h"
24 #include "psppire-var-view.h"
25 #include "psppire-acr.h"
26 #include "dialog-common.h"
27
28 #include "helper.h"
29 #include "executor.h"
30
31
32 #include <gtk/gtk.h>
33
34 struct chisquare_dialog
35 {
36   PsppireDict *dict;
37   GtkWidget *var_view;
38
39   GtkWidget *button1;
40   GtkWidget *button2;
41
42   GtkWidget *range_button;
43   GtkWidget *value_lower;
44   GtkWidget *value_upper;
45
46   GtkWidget *values_button;
47
48   GtkListStore *expected_list;
49 };
50
51 static void
52 set_sensitivity (GtkToggleButton *button, GtkWidget *w)
53 {
54   gboolean state = gtk_toggle_button_get_active (button);
55   gtk_widget_set_sensitive (w, state);
56 }
57
58
59 static gboolean
60 dialog_state_valid (gpointer data)
61 {
62   struct chisquare_dialog *csd = data;
63
64   GtkTreeModel *vars =
65     gtk_tree_view_get_model (GTK_TREE_VIEW (csd->var_view));
66
67   GtkTreeIter notused;
68
69   if ( !gtk_tree_model_get_iter_first (vars, &notused) )
70     return FALSE;
71
72   return TRUE;
73 }
74
75
76 static void
77 refresh (struct chisquare_dialog *csd)
78 {
79   GtkTreeModel *liststore =
80     gtk_tree_view_get_model (GTK_TREE_VIEW (csd->var_view));
81
82   gtk_list_store_clear (GTK_LIST_STORE (liststore));
83
84   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (csd->button1), TRUE);
85
86   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (csd->button2), TRUE);
87 }
88
89
90
91 static char *
92 generate_syntax (const struct chisquare_dialog *scd)
93 {
94   gchar *text;
95   GString *string;
96
97
98   string = g_string_new ("NPAR TEST\n\t/CHISQUARE=");
99
100   psppire_var_view_append_names (PSPPIRE_VAR_VIEW (scd->var_view), 0, string);
101
102
103   if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (scd->range_button)))
104     {
105       g_string_append (string, "(");
106       
107       g_string_append (string, 
108                        gtk_entry_get_text (GTK_ENTRY (scd->value_lower)));
109
110       g_string_append (string, ", ");
111
112       g_string_append (string,
113                        gtk_entry_get_text (GTK_ENTRY (scd->value_upper)));
114
115       g_string_append (string, ")");
116     }
117
118
119
120
121   if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (scd->values_button)))
122     {
123       GtkListStore *ls = scd->expected_list;
124       GtkTreeIter iter;
125       gboolean ok;
126
127       g_string_append (string, "\n\t");
128       g_string_append (string, "/EXPECTED = ");
129
130       
131       for (ok = gtk_tree_model_get_iter_first (GTK_TREE_MODEL(ls),
132                                                &iter);
133            ok;
134            ok = gtk_tree_model_iter_next (GTK_TREE_MODEL (ls), &iter))
135         {
136           gdouble v;
137
138           gtk_tree_model_get (GTK_TREE_MODEL (ls), &iter, 0, &v, -1);
139
140           g_string_append_printf (string, " %g", v);
141         }
142
143
144
145     }
146
147   g_string_append (string, ".\n");
148
149   text = string->str;
150
151   g_string_free (string, FALSE);
152
153   return text;
154 }
155
156
157
158 /* Pops up the Chi-Square dialog box */
159 void
160 chisquare_dialog (PsppireDataWindow *dw)
161 {
162   gint response;
163
164   struct chisquare_dialog csd;
165
166   GtkBuilder *xml = builder_new ("chi-square.ui");
167   PsppireVarStore *vs;
168
169   GtkWidget *dialog = get_widget_assert   (xml, "chisquare-dialog");
170
171   GtkWidget *range_table = get_widget_assert   (xml, "range-table");
172
173
174
175   GtkWidget *values_acr = get_widget_assert   (xml, "psppire-acr1");
176   GtkWidget *expected_value_entry =
177     get_widget_assert   (xml, "expected-value-entry");
178
179
180   GtkWidget *dict_view = get_widget_assert   (xml, "dict-view");
181
182   csd.expected_list = gtk_list_store_new (1, G_TYPE_DOUBLE);
183
184   csd.button1 = get_widget_assert   (xml, "radiobutton1");
185   csd.button2 = get_widget_assert   (xml, "radiobutton3");
186   csd.var_view = get_widget_assert   (xml, "variables-treeview");
187
188   csd.range_button = get_widget_assert   (xml, "radiobutton4");
189   csd.value_lower = get_widget_assert   (xml, "entry1");
190   csd.value_upper = get_widget_assert   (xml, "entry2");
191
192   csd.values_button = get_widget_assert   (xml, "radiobutton2");
193
194   g_object_get (dw->data_editor, "var-store", &vs, NULL);
195
196   gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (dw));
197  
198
199   g_object_get (vs, "dictionary", &csd.dict, NULL);
200   g_object_set (dict_view,
201                 "model", csd.dict, 
202                 "predicate", var_is_numeric,
203                 NULL);
204
205
206   g_signal_connect (csd.range_button, "toggled", G_CALLBACK (set_sensitivity), 
207                     range_table);
208
209
210   g_signal_connect (csd.values_button, "toggled", G_CALLBACK (set_sensitivity), 
211                     values_acr);
212
213   g_signal_connect (csd.values_button, "toggled", G_CALLBACK (set_sensitivity), 
214                     expected_value_entry);
215
216
217   psppire_acr_set_entry (PSPPIRE_ACR (values_acr),
218                          GTK_ENTRY (expected_value_entry));
219
220   psppire_acr_set_model(PSPPIRE_ACR (values_acr), csd.expected_list);
221
222   g_signal_connect_swapped (dialog, "refresh", G_CALLBACK (refresh),  &csd);
223
224   psppire_dialog_set_valid_predicate (PSPPIRE_DIALOG (dialog),
225                                       dialog_state_valid, &csd);
226
227   response = psppire_dialog_run (PSPPIRE_DIALOG (dialog));
228
229
230   switch (response)
231     {
232     case GTK_RESPONSE_OK:
233       {
234         gchar *syntax = generate_syntax (&csd);
235
236         struct getl_interface *sss = create_syntax_string_source (syntax);
237         execute_syntax (sss);
238
239         g_free (syntax);
240       }
241       break;
242     case PSPPIRE_RESPONSE_PASTE:
243       {
244         gchar *syntax = generate_syntax (&csd);
245         paste_syntax_to_window (syntax);
246         g_free (syntax);
247       }
248       break;
249     default:
250       break;
251     }
252
253   g_object_unref (xml);
254 }