Implement dialog box for the non-parametric 2-related-samples tests
authorJohn Darrington <john@darrington.wattle.id.au>
Fri, 1 Jul 2011 16:39:55 +0000 (18:39 +0200)
committerJohn Darrington <john@darrington.wattle.id.au>
Fri, 1 Jul 2011 16:39:55 +0000 (18:39 +0200)
src/ui/gui/automake.mk
src/ui/gui/data-editor.ui
src/ui/gui/npar-two-sample-related.c [new file with mode: 0644]
src/ui/gui/npar-two-sample-related.h [new file with mode: 0644]
src/ui/gui/paired-dialog.c [new file with mode: 0644]
src/ui/gui/paired-dialog.h [new file with mode: 0644]
src/ui/gui/paired-samples.ui
src/ui/gui/psppire-data-window.c
src/ui/gui/t-test-paired-samples.c

index b5a588e50668af646c1aa9abae56fd1a21754c78..f02f85bdcd80db6c54d808310ee843920c1a77c8 100644 (file)
@@ -172,6 +172,8 @@ src_ui_gui_psppire_SOURCES = \
        src/ui/gui/missing-val-dialog.h \
         src/ui/gui/oneway-anova-dialog.c \
         src/ui/gui/oneway-anova-dialog.h \
+       src/ui/gui/paired-dialog.c \
+       src/ui/gui/paired-dialog.h \
        src/ui/gui/psppire.c \
        src/ui/gui/psppire.h \
        src/ui/gui/psppire-acr.h \
@@ -243,6 +245,8 @@ src_ui_gui_psppire_SOURCES = \
        src/ui/gui/t-test-options.h \
        src/ui/gui/t-test-paired-samples.c \
        src/ui/gui/t-test-paired-samples.h \
+       src/ui/gui/npar-two-sample-related.c \
+       src/ui/gui/npar-two-sample-related.h \
        src/ui/gui/val-labs-dialog.c \
        src/ui/gui/val-labs-dialog.h \
        src/ui/gui/var-display.c \
index 670b4b86d892b39aff7ddfad094daa73300a90e5..83241ce556f82dc4c36edadc8c02966537d408f1 100644 (file)
             <property name="label" translatable="yes">_Binomial...</property>
           </object>
         </child>
+        <child>
+          <object class="GtkAction" id="two-related-samples">
+            <property name="name">"two-related-samples"></property>
+            <property name="label" translatable="yes">2 _Related Samples...</property>
+          </object>
+        </child>
         <child>
           <object class="GtkAction" id="k-related-samples">
             <property name="name">"k-related-samples"></property>
           <menu action="non-parametrics">
             <menuitem action="chi-square"/>
             <menuitem action="binomial"/>
+            <menuitem action="two-related-samples"/>
             <menuitem action="k-related-samples"/>
           </menu>
           <menuitem action="roc-curve"/>
diff --git a/src/ui/gui/npar-two-sample-related.c b/src/ui/gui/npar-two-sample-related.c
new file mode 100644 (file)
index 0000000..ac3bcd5
--- /dev/null
@@ -0,0 +1,170 @@
+/* PSPPIRE - a graphical user interface for PSPP.
+   Copyright (C) 2011  Free Software Foundation
+
+   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
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <config.h>
+#include <gtk/gtk.h>
+
+#include "psppire-data-window.h"
+#include "psppire-selector.h"
+#include "psppire-var-view.h"
+
+#include "psppire-dict.h"
+#include "psppire-var-store.h"
+
+#include "dialog-common.h"
+#include "psppire-dialog.h"
+
+#include "executor.h"
+
+#include "helper.h"
+
+#include "psppire-var-ptr.h"
+
+#include "paired-dialog.h"
+#include "npar-two-sample-related.h"
+
+#include <gettext.h>
+#define _(msgid) gettext (msgid)
+#define N_(msgid) msgid
+
+enum test
+  {
+    NT_WILCOXON,
+    NT_SIGN,
+    NT_MCNEMAR,
+    n_Tests
+  };
+
+struct ts_test
+{
+  GtkWidget *button;
+  char syntax[16];
+};
+
+
+static void
+refresh (void *aux)
+{
+  int i;
+  struct ts_test *tst = aux;
+
+  for (i = 0 ; i < n_Tests; ++i)
+    {
+      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tst[i].button), FALSE);
+    }
+}
+
+
+static gboolean
+valid (void *aux)
+{
+  int i;
+  struct ts_test *tst = aux;
+
+  for (i = 0 ; i < n_Tests; ++i)
+    {
+      if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (tst[i].button)))
+       return TRUE;
+    }
+
+  return FALSE;
+}
+
+
+
+static gchar *
+generate_syntax (struct paired_samples_dialog *psd, const struct ts_test *test)
+{
+  int i;
+  gchar *text = NULL;
+  GString *str = g_string_new ("NPAR TEST");
+
+  for (i = 0 ; i < n_Tests; ++i)
+  {
+    if (! gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (test[i].button)))
+      continue;
+
+    g_string_append (str, "\n\t");
+    g_string_append (str, test[i].syntax);
+
+    psppire_var_view_append_names (PSPPIRE_VAR_VIEW (psd->pairs_treeview), 0, str);
+
+    g_string_append (str, " WITH ");
+
+    psppire_var_view_append_names (PSPPIRE_VAR_VIEW (psd->pairs_treeview), 1, str);
+
+    g_string_append (str, " (PAIRED)");
+  }
+
+  g_string_append (str, ".\n");
+
+  text = str->str;
+  g_string_free (str, FALSE);
+
+  return text;
+}
+
+/* Pops up the dialog box */
+void
+two_related_dialog (PsppireDataWindow *de)
+{
+  gint response;
+  struct ts_test nts[n_Tests];
+  struct paired_samples_dialog *tt_d = two_sample_dialog_create (de);
+
+  GtkWidget *frame = gtk_frame_new (_("Test Type"));
+  GtkWidget *bb = gtk_vbutton_box_new ();
+
+  strcpy (nts[NT_WILCOXON].syntax, "/WILCOXON");
+  strcpy (nts[NT_SIGN].syntax, "/SIGN");
+  strcpy (nts[NT_MCNEMAR].syntax, "/MCNEMAR");
+
+  nts[NT_WILCOXON].button = gtk_check_button_new_with_mnemonic (_("_Wilcoxon"));
+  nts[NT_SIGN].button = gtk_check_button_new_with_mnemonic (_("_Sign"));
+  nts[NT_MCNEMAR].button = gtk_check_button_new_with_mnemonic (_("_McNemar"));
+
+  gtk_box_pack_start (GTK_BOX (bb), nts[NT_WILCOXON].button, FALSE, FALSE, 5);
+  gtk_box_pack_start (GTK_BOX (bb), nts[NT_SIGN].button,     FALSE, FALSE, 5);
+  gtk_box_pack_start (GTK_BOX (bb), nts[NT_MCNEMAR].button,  FALSE, FALSE, 5);
+
+  gtk_container_add (GTK_CONTAINER (frame), bb);
+
+  gtk_widget_show_all (frame);
+  two_sample_dialog_add_widget (tt_d, frame);
+
+  tt_d->refresh = refresh;
+  tt_d->valid = valid;
+  tt_d->aux = nts;
+
+  gtk_window_set_title (GTK_WINDOW (tt_d->dialog), _("Two-Related-Samples Tests"));
+
+  response = psppire_dialog_run (PSPPIRE_DIALOG (tt_d->dialog));
+
+  switch (response)
+    {
+    case GTK_RESPONSE_OK:
+      g_free (execute_syntax_string (de, generate_syntax (tt_d, nts)));
+      break;
+    case PSPPIRE_RESPONSE_PASTE:
+      g_free (paste_syntax_to_window (generate_syntax (tt_d, nts)));
+      break;
+    default:
+      break;
+    }
+
+  two_sample_dialog_destroy (tt_d);
+}
diff --git a/src/ui/gui/npar-two-sample-related.h b/src/ui/gui/npar-two-sample-related.h
new file mode 100644 (file)
index 0000000..de3a860
--- /dev/null
@@ -0,0 +1,26 @@
+/* PSPPIRE - a graphical user interface for PSPP.
+   Copyright (C) 2011  Free Software Foundation
+
+   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
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef NPAR_PAIRED_H
+#define NPAR_PAIRED_H 1
+
+#include "psppire-data-window.h"
+
+/* Pops up the dialog box */
+void two_related_dialog (PsppireDataWindow *de);
+
+#endif
diff --git a/src/ui/gui/paired-dialog.c b/src/ui/gui/paired-dialog.c
new file mode 100644 (file)
index 0000000..70f6c34
--- /dev/null
@@ -0,0 +1,188 @@
+/* PSPPIRE - a graphical user interface for PSPP.
+   Copyright (C) 2011  Free Software Foundation
+
+   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
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <config.h>
+
+#include <gtk/gtk.h>
+
+
+#include "paired-dialog.h"
+
+#include "psppire-data-window.h"
+#include "psppire-selector.h"
+#include "psppire-var-view.h"
+
+#include "psppire-dict.h"
+#include "psppire-var-store.h"
+
+#include "dialog-common.h"
+#include "psppire-dialog.h"
+
+#include "psppire-var-ptr.h"
+
+
+#include "helper.h"
+
+
+
+static void
+refresh (struct paired_samples_dialog *tt_d)
+{
+  gtk_list_store_clear (GTK_LIST_STORE (tt_d->list_store));
+
+  if (tt_d->refresh)
+    tt_d->refresh (tt_d->aux);
+}
+
+static gboolean
+dialog_state_valid (gpointer data)
+{
+  struct variable *v = NULL;
+  struct paired_samples_dialog *tt_d = data;
+  GtkTreeIter dest_iter;
+
+  gint n_rows = gtk_tree_model_iter_n_children  (tt_d->list_store, NULL);
+
+  if ( n_rows == 0 )
+    return FALSE;
+
+  /* Get the last row */
+  gtk_tree_model_iter_nth_child (tt_d->list_store, &dest_iter,
+                                NULL, n_rows - 1);
+
+  /* Get the last (2nd) column */
+  gtk_tree_model_get (tt_d->list_store, &dest_iter, 1, &v, -1);
+
+
+  if (v == NULL)
+    return FALSE;
+    
+  if ( NULL == tt_d->valid)
+    return TRUE;
+
+  return tt_d->valid (tt_d->aux);
+}
+
+
+
+static void
+select_as_pair_member (GtkTreeIter source_iter,
+                      GtkWidget *dest,
+                      GtkTreeModel *source_model,
+                      gpointer data)
+{
+  struct variable *v;
+  struct variable *v1;
+  gint n_rows;
+  GtkTreeIter dest_iter;
+  struct paired_samples_dialog *tt_d = data;
+
+
+  gtk_tree_model_get (source_model, &source_iter,
+                     DICT_TVM_COL_VAR, &v, -1);
+
+  n_rows = gtk_tree_model_iter_n_children  (tt_d->list_store, NULL);
+
+  if ( n_rows > 0 )
+    {
+
+      gtk_tree_model_iter_nth_child (tt_d->list_store,
+                                    &dest_iter, NULL, n_rows - 1);
+
+      gtk_tree_model_get (tt_d->list_store, &dest_iter, 1, &v1, -1);
+    }
+  else
+    v1 = NULL;
+
+  if ( n_rows == 0 || v1 != NULL)
+    {
+      gtk_list_store_append (GTK_LIST_STORE (tt_d->list_store), &dest_iter);
+
+      gtk_list_store_set (GTK_LIST_STORE (tt_d->list_store), &dest_iter,
+                         0, v,
+                         1, NULL,
+                         -1);
+    }
+  else
+    {
+      gtk_list_store_set (GTK_LIST_STORE (tt_d->list_store), &dest_iter,
+                         1, v,
+                         -1);
+
+    }
+}
+
+void
+two_sample_dialog_add_widget (struct paired_samples_dialog *psd, GtkWidget *w)
+{
+  GtkWidget *box = get_widget_assert (psd->xml, "vbox3");
+  gtk_box_pack_start (GTK_BOX (box), w, FALSE, FALSE,  5);
+}
+
+void
+two_sample_dialog_destroy (struct paired_samples_dialog *psd)
+{
+  g_object_unref (psd->xml);
+  free (psd);
+}
+
+struct paired_samples_dialog *
+two_sample_dialog_create (PsppireDataWindow *de)
+{
+  struct paired_samples_dialog *tt_d = g_malloc (sizeof *tt_d);
+
+  PsppireVarStore *vs = NULL;
+
+  tt_d->xml = builder_new ("paired-samples.ui");
+
+  GtkWidget *dict_view =
+    get_widget_assert (tt_d->xml, "paired-samples-t-test-treeview1");
+
+  GtkWidget *options_button = get_widget_assert (tt_d->xml, "paired-samples-t-test-options-button");
+
+  GtkWidget *selector = get_widget_assert (tt_d->xml, "psppire-selector3");
+
+  tt_d->dialog = get_widget_assert (tt_d->xml, "t-test-paired-samples-dialog");
+
+  g_object_get (de->data_editor, "var-store", &vs, NULL);
+
+  g_object_get (vs, "dictionary", &tt_d->dict, NULL);
+  tt_d->pairs_treeview =
+   get_widget_assert (tt_d->xml, "paired-samples-t-test-treeview2");
+
+  gtk_window_set_transient_for (GTK_WINDOW (tt_d->dialog), GTK_WINDOW (de));
+
+
+  g_object_set (dict_view, "model", tt_d->dict,
+               "predicate",
+               var_is_numeric, NULL);
+
+  
+  tt_d->list_store = gtk_tree_view_get_model (GTK_TREE_VIEW (tt_d->pairs_treeview));
+
+  psppire_selector_set_select_func (PSPPIRE_SELECTOR (selector),
+                                   select_as_pair_member,
+                                   tt_d);
+
+  g_signal_connect_swapped (tt_d->dialog, "refresh",
+                           G_CALLBACK (refresh),  tt_d);
+
+  psppire_dialog_set_valid_predicate (PSPPIRE_DIALOG (tt_d->dialog),
+                                     dialog_state_valid, tt_d);
+
+  return tt_d;
+}
diff --git a/src/ui/gui/paired-dialog.h b/src/ui/gui/paired-dialog.h
new file mode 100644 (file)
index 0000000..c370f77
--- /dev/null
@@ -0,0 +1,31 @@
+#ifndef PAIRED_DIALOG_H
+#define PAIRED_DIALOG_H 1
+
+#include  "psppire-data-window.h"
+#include  "psppire-dict.h"
+
+#include <gtk/gtk.h>
+
+typedef void refresh_f (void *aux);
+typedef gboolean valid_f (void *aux);
+
+struct paired_samples_dialog
+{
+  PsppireDict *dict;
+  GtkWidget *pairs_treeview;
+  GtkTreeModel *list_store;
+  GtkWidget *dialog;
+  GtkBuilder *xml;
+
+  refresh_f *refresh;
+  valid_f *valid;
+  void *aux;
+};
+
+
+struct paired_samples_dialog *two_sample_dialog_create (PsppireDataWindow *de);
+void two_sample_dialog_destroy (struct paired_samples_dialog *psd);
+void two_sample_dialog_add_widget (struct paired_samples_dialog *psd, GtkWidget *w);
+
+
+#endif
index 1e6f8b559033293438f197fe21e553606eaffb82..593329284ef93fafc883a13283cc83b185154e1a 100644 (file)
@@ -5,7 +5,6 @@
   <!-- interface-naming-policy project-wide -->
   <object class="PsppireDialog" id="t-test-paired-samples-dialog">
     <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-    <property name="title" translatable="yes">Paired Samples T Test</property>
     <property name="modal">True</property>
     <child internal-child="hbox">
       <object class="GtkHBox" id="dialog-hbox6">
         <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
         <property name="spacing">2</property>
         <child>
-          <object class="GtkHBox" id="hbox3">
+          <object class="GtkAlignment" id="alignment1">
             <property name="visible">True</property>
-            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+            <property name="top_padding">5</property>
+            <property name="bottom_padding">5</property>
+            <property name="left_padding">5</property>
             <child>
-              <object class="GtkScrolledWindow" id="scrolledwindow2">
+              <object class="GtkHBox" id="hbox3">
                 <property name="visible">True</property>
-                <property name="can_focus">True</property>
                 <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                <property name="hscrollbar_policy">never</property>
-                <property name="vscrollbar_policy">automatic</property>
-                <property name="shadow_type">etched-in</property>
                 <child>
-                  <object class="PsppireDictView" id="paired-samples-t-test-treeview1">
+                  <object class="GtkScrolledWindow" id="scrolledwindow2">
                     <property name="visible">True</property>
                     <property name="can_focus">True</property>
                     <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                    <property name="headers_visible">False</property>
+                    <property name="hscrollbar_policy">never</property>
+                    <property name="vscrollbar_policy">automatic</property>
+                    <property name="shadow_type">etched-in</property>
+                    <child>
+                      <object class="PsppireDictView" id="paired-samples-t-test-treeview1">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="headers_visible">False</property>
+                        <property name="headers_clickable">False</property>
+                      </object>
+                    </child>
                   </object>
+                  <packing>
+                    <property name="position">0</property>
+                  </packing>
                 </child>
-              </object>
-              <packing>
-                <property name="position">0</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkAlignment" id="alignment5">
-                <property name="visible">True</property>
-                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                <property name="yalign">0.059999998658895493</property>
-                <property name="yscale">0</property>
                 <child>
-                  <object class="PsppireSelector" id="psppire-selector3">
+                  <object class="GtkAlignment" id="alignment5">
                     <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">True</property>
                     <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                    <property name="no_show_all">True</property>
-                    <property name="border_width">5</property>
-                    <property name="source_widget">paired-samples-t-test-treeview1</property>
-                    <property name="dest_widget">paired-samples-t-test-treeview2</property>
+                    <property name="yalign">0.059999998658895493</property>
+                    <property name="yscale">0</property>
+                    <child>
+                      <object class="PsppireSelector" id="psppire-selector3">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="no_show_all">True</property>
+                        <property name="border_width">5</property>
+                        <property name="source_widget">paired-samples-t-test-treeview1</property>
+                        <property name="dest_widget">paired-samples-t-test-treeview2</property>
+                      </object>
+                    </child>
                   </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">1</property>
+                  </packing>
                 </child>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">False</property>
-                <property name="position">1</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkVBox" id="vbox3">
-                <property name="visible">True</property>
-                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                <property name="orientation">vertical</property>
-                <property name="spacing">5</property>
                 <child>
-                  <object class="GtkFrame" id="frame4">
+                  <object class="GtkVBox" id="vbox3">
                     <property name="visible">True</property>
                     <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                    <property name="label_xalign">0</property>
-                    <property name="shadow_type">none</property>
+                    <property name="orientation">vertical</property>
+                    <property name="spacing">5</property>
                     <child>
-                      <object class="GtkAlignment" id="alignment6">
+                      <object class="GtkFrame" id="frame4">
                         <property name="visible">True</property>
                         <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                        <property name="left_padding">12</property>
+                        <property name="label_xalign">0</property>
+                        <property name="shadow_type">none</property>
                         <child>
-                          <object class="GtkScrolledWindow" id="scrolledwindow1">
+                          <object class="GtkAlignment" id="alignment6">
                             <property name="visible">True</property>
-                            <property name="can_focus">True</property>
                             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                            <property name="vscrollbar_policy">automatic</property>
-                            <property name="shadow_type">etched-in</property>
+                            <property name="left_padding">12</property>
                             <child>
-                              <object class="PsppireVarView" id="paired-samples-t-test-treeview2">
+                              <object class="GtkScrolledWindow" id="scrolledwindow1">
                                 <property name="visible">True</property>
                                 <property name="can_focus">True</property>
                                 <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                <property name="enable_search">False</property>
-                                <property name="n_cols">2</property>
+                                <property name="vscrollbar_policy">automatic</property>
+                                <property name="shadow_type">etched-in</property>
+                                <child>
+                                  <object class="PsppireVarView" id="paired-samples-t-test-treeview2">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                    <property name="headers_clickable">False</property>
+                                    <property name="enable_search">False</property>
+                                    <property name="n_cols">2</property>
+                                  </object>
+                                </child>
                               </object>
                             </child>
                           </object>
                         </child>
+                        <child type="label">
+                          <object class="GtkLabel" id="label13">
+                            <property name="visible">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="label" translatable="yes">Test _Pair(s):</property>
+                            <property name="use_markup">True</property>
+                            <property name="use_underline">True</property>
+                            <property name="mnemonic_widget">paired-samples-t-test-treeview2</property>
+                          </object>
+                        </child>
                       </object>
+                      <packing>
+                        <property name="position">0</property>
+                      </packing>
                     </child>
-                    <child type="label">
-                      <object class="GtkLabel" id="label13">
-                        <property name="visible">True</property>
-                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                        <property name="label" translatable="yes">Test Variable(s):</property>
-                        <property name="use_markup">True</property>
-                      </object>
-                    </child>
-                  </object>
-                  <packing>
-                    <property name="position">0</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkVButtonBox" id="vbuttonbox2">
-                    <property name="visible">True</property>
-                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                    <property name="orientation">vertical</property>
                     <child>
-                      <object class="GtkButton" id="paired-samples-t-test-options-button">
-                        <property name="label" translatable="yes">Options...</property>
+                      <object class="GtkVButtonBox" id="vbuttonbox2">
                         <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="receives_default">True</property>
                         <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="orientation">vertical</property>
+                        <child>
+                          <object class="GtkButton" id="paired-samples-t-test-options-button">
+                            <property name="label" translatable="yes">Options...</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
                       </object>
                       <packing>
                         <property name="expand">False</property>
                         <property name="fill">False</property>
-                        <property name="position">0</property>
+                        <property name="pack_type">end</property>
+                        <property name="position">1</property>
                       </packing>
                     </child>
                   </object>
                   <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">False</property>
-                    <property name="position">1</property>
+                    <property name="position">2</property>
                   </packing>
                 </child>
               </object>
-              <packing>
-                <property name="position">2</property>
-              </packing>
             </child>
           </object>
           <packing>
index 21626fe200d04dda783386362ee016f779973e87..86c81853127cf032444cc11f7ad14b3458e00c7b 100644 (file)
@@ -43,6 +43,7 @@
 #include "ui/gui/help-menu.h"
 #include "ui/gui/helper.h"
 #include "ui/gui/k-related-dialog.h"
+#include "ui/gui/npar-two-sample-related.h"
 #include "ui/gui/oneway-anova-dialog.h"
 #include "ui/gui/psppire-data-window.h"
 #include "ui/gui/psppire-syntax-window.h"
@@ -1116,6 +1117,7 @@ psppire_data_window_finish_init (PsppireDataWindow *de,
   connect_action (de, "binomial", G_CALLBACK (binomial_dialog));
 
   connect_action (de, "k-related-samples", G_CALLBACK (k_related_dialog));
+  connect_action (de, "two-related-samples", G_CALLBACK (two_related_dialog));
  
 
   {
index 7e50c8b113d2a2516844eef57e89f4eb1f25200c..5f2d6f22a5f3bf1b9c06483c916e38f16464005e 100644 (file)
@@ -204,6 +204,8 @@ t_test_paired_samples_dialog (PsppireDataWindow *de)
   psppire_dialog_set_valid_predicate (PSPPIRE_DIALOG (dialog),
                                      dialog_state_valid, &tt_d);
 
+  gtk_window_set_title (GTK_WINDOW (dialog), _("Paired Samples T Test"));
+
   response = psppire_dialog_run (PSPPIRE_DIALOG (dialog));
 
   switch (response)