Added the One Sample T Test dialog
[pspp-builds.git] / src / ui / gui / t-test-independent-samples-dialog.c
1 /* PSPPIRE - a graphical user interface for PSPP.
2    Copyright (C) 2007  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
18
19 #include <config.h>
20 #include <glade/glade.h>
21 #include <gtk/gtk.h>
22 #include "t-test-independent-samples-dialog.h"
23 #include "psppire-dict.h"
24 #include "psppire-var-store.h"
25 #include "helper.h"
26 #include <gtksheet/gtksheet.h>
27 #include "data-editor.h"
28 #include "psppire-dialog.h"
29 #include "dialog-common.h"
30 #include "dict-display.h"
31 #include "widget-io.h"
32 #include "t-test-options.h"
33
34 #include <language/syntax-string-source.h>
35 #include "syntax-editor.h"
36
37 #include <gettext.h>
38 #define _(msgid) gettext (msgid)
39 #define N_(msgid) msgid
40
41
42 struct tt_indep_samples_dialog
43 {
44   GladeXML *xml;  /* The xml that generated the widgets */
45   GtkWidget *dialog;
46   PsppireDict *dict;
47   gboolean groups_defined;
48
49   struct tt_options_dialog *opts;
50 };
51
52
53 static gchar *
54 generate_syntax (const struct tt_indep_samples_dialog *d)
55 {
56   gchar *text;
57   GtkWidget *entry =
58     get_widget_assert (d->xml, "indep-samples-t-test-entry");
59
60   GtkWidget *tv =
61     get_widget_assert (d->xml, "indep-samples-t-test-treeview2");
62
63   GString *str = g_string_new ("T-TEST /VARIABLES=");
64
65   append_variable_names (str, d->dict, GTK_TREE_VIEW (tv));
66
67   g_string_append (str, "\n\t/GROUPS=");
68
69   g_string_append (str, gtk_entry_get_text (GTK_ENTRY (entry)));
70
71   if ( d->groups_defined )
72     {
73       GtkWidget *entry1 = get_widget_assert (d->xml, "group1-entry");
74       GtkWidget *entry2 = get_widget_assert (d->xml, "group2-entry");
75
76       g_string_append (str, "(");
77       g_string_append (str, gtk_entry_get_text (GTK_ENTRY (entry1)));
78       g_string_append (str, ",");
79       g_string_append (str, gtk_entry_get_text (GTK_ENTRY (entry2)));
80       g_string_append (str, ")");
81     }
82
83
84   tt_options_dialog_append_syntax (d->opts, str);
85
86   g_string_append (str, ".\n");
87
88   text = str->str;
89
90   g_string_free (str, FALSE);
91
92   return text;
93 }
94
95
96
97 static void
98 refresh (GladeXML *xml)
99 {
100   GtkWidget *entry =
101     get_widget_assert (xml, "indep-samples-t-test-entry");
102
103   GtkWidget *tv =
104     get_widget_assert (xml, "indep-samples-t-test-treeview2");
105
106   GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (tv));
107
108   gtk_entry_set_text (GTK_ENTRY (entry), "");
109
110   gtk_list_store_clear (GTK_LIST_STORE (model));
111 }
112
113
114 static gboolean
115 define_groups_state_valid (gpointer data)
116 {
117   struct tt_indep_samples_dialog *d = data;
118
119   GtkWidget *entry1 = get_widget_assert (d->xml, "group1-entry");
120   GtkWidget *entry2 = get_widget_assert (d->xml, "group2-entry");
121
122   if ( 0 == strcmp ("", gtk_entry_get_text (GTK_ENTRY (entry1))))
123     return FALSE;
124
125   if ( 0 == strcmp ("", gtk_entry_get_text (GTK_ENTRY (entry2))))
126     return FALSE;
127
128   return TRUE;
129 }
130
131 static void
132 run_define_groups (struct tt_indep_samples_dialog *ttd)
133 {
134   gint response;
135   GtkWidget *dialog =
136     get_widget_assert (ttd->xml, "define-groups-dialog");
137
138
139   psppire_dialog_set_valid_predicate (PSPPIRE_DIALOG (dialog),
140                                       define_groups_state_valid, ttd);
141
142   gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (ttd->dialog));
143
144   response = psppire_dialog_run (PSPPIRE_DIALOG (dialog));
145
146   ttd->groups_defined = (response == PSPPIRE_RESPONSE_CONTINUE);
147 }
148
149
150
151 static gboolean
152 dialog_state_valid (gpointer data)
153 {
154   struct tt_indep_samples_dialog *tt_d = data;
155
156   GtkWidget *entry =
157     get_widget_assert (tt_d->xml, "indep-samples-t-test-entry");
158
159   GtkWidget *tv_vars =
160     get_widget_assert (tt_d->xml, "indep-samples-t-test-treeview2");
161
162   GtkTreeModel *vars = gtk_tree_view_get_model (GTK_TREE_VIEW (tv_vars));
163
164   GtkTreeIter notused;
165
166   if ( 0 == strcmp ("", gtk_entry_get_text (GTK_ENTRY (entry))))
167     return FALSE;
168
169
170   if ( 0 == gtk_tree_model_get_iter_first (vars, &notused))
171     return FALSE;
172
173   return TRUE;
174 }
175
176
177 /* Pops up the dialog box */
178 void
179 t_test_independent_samples_dialog (GObject *o, gpointer data)
180 {
181   struct tt_indep_samples_dialog tt_d;
182   gint response;
183   struct data_editor *de = data;
184
185   PsppireVarStore *vs;
186
187   GladeXML *xml = XML_NEW ("t-test.glade");
188
189   GtkSheet *var_sheet =
190     GTK_SHEET (get_widget_assert (de->xml, "variable_sheet"));
191
192   GtkWidget *dict_view =
193     get_widget_assert (xml, "indep-samples-t-test-treeview1");
194
195   GtkWidget *test_variables_treeview =
196     get_widget_assert (xml, "indep-samples-t-test-treeview2");
197
198   GtkWidget *selector2 =
199     get_widget_assert (xml, "indep-samples-t-test-selector2");
200
201   GtkWidget *selector1 =
202     get_widget_assert (xml, "indep-samples-t-test-selector1");
203
204   GtkWidget *entry =
205     get_widget_assert (xml, "indep-samples-t-test-entry");
206
207   GtkWidget *define_groups_button =
208     get_widget_assert (xml, "define-groups-button");
209
210   GtkWidget *options_button =
211     get_widget_assert (xml, "options-button");
212
213   vs = PSPPIRE_VAR_STORE (gtk_sheet_get_model (var_sheet));
214
215   tt_d.dialog = get_widget_assert (xml, "t-test-independent-samples-dialog");
216   tt_d.xml = xml;
217   tt_d.dict = vs->dict;
218   tt_d.groups_defined = FALSE;
219   tt_d.opts = tt_options_dialog_create (xml, de->parent.window);
220
221   gtk_window_set_transient_for (GTK_WINDOW (tt_d.dialog), de->parent.window);
222
223   attach_dictionary_to_treeview (GTK_TREE_VIEW (dict_view),
224                                  vs->dict,
225                                  GTK_SELECTION_MULTIPLE, NULL);
226
227   set_dest_model (GTK_TREE_VIEW (test_variables_treeview), vs->dict);
228
229
230   psppire_selector_set_subjects (PSPPIRE_SELECTOR (selector1),
231                                  dict_view, test_variables_treeview,
232                                  insert_source_row_into_tree_view,
233                                  NULL);
234
235
236   psppire_selector_set_subjects (PSPPIRE_SELECTOR (selector2),
237                                  dict_view, entry,
238                                  insert_source_row_into_entry,
239                                  is_currently_in_entry);
240
241   g_signal_connect_swapped (define_groups_button, "clicked",
242                             G_CALLBACK (run_define_groups), &tt_d);
243
244
245   g_signal_connect_swapped (options_button, "clicked",
246                             G_CALLBACK (tt_options_dialog_run), tt_d.opts);
247
248
249   g_signal_connect_swapped (tt_d.dialog, "refresh", G_CALLBACK (refresh),  xml);
250
251
252   psppire_dialog_set_valid_predicate (PSPPIRE_DIALOG (tt_d.dialog),
253                                       dialog_state_valid, &tt_d);
254
255   response = psppire_dialog_run (PSPPIRE_DIALOG (tt_d.dialog));
256
257   switch (response)
258     {
259     case GTK_RESPONSE_OK:
260       {
261         gchar *syntax = generate_syntax (&tt_d);
262         struct getl_interface *sss = create_syntax_string_source (syntax);
263         execute_syntax (sss);
264
265         g_free (syntax);
266       }
267       break;
268     case PSPPIRE_RESPONSE_PASTE:
269       {
270         gchar *syntax = generate_syntax (&tt_d);
271
272         struct syntax_editor *se =
273           (struct syntax_editor *) window_create (WINDOW_SYNTAX, NULL);
274
275         gtk_text_buffer_insert_at_cursor (se->buffer, syntax, -1);
276
277         g_free (syntax);
278       }
279       break;
280     default:
281       break;
282     }
283
284   tt_options_dialog_destroy (tt_d.opts);
285   g_object_unref (xml);
286 }
287
288