X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-dialog-action-oneway.c;h=71d4873cd2ab54797020c0b0c0dd71ed4c6d02d2;hb=refs%2Fheads%2Fctables7;hp=66b80f6417e901b8b908102e573f33d0aaf557de;hpb=e2da62d735c597afeef2e0e9b36e5a4a83d7da94;p=pspp diff --git a/src/ui/gui/psppire-dialog-action-oneway.c b/src/ui/gui/psppire-dialog-action-oneway.c index 66b80f6417..71d4873cd2 100644 --- a/src/ui/gui/psppire-dialog-action-oneway.c +++ b/src/ui/gui/psppire-dialog-action-oneway.c @@ -1,5 +1,5 @@ /* PSPPIRE - a graphical user interface for PSPP. - Copyright (C) 2012, 2013 Free Software Foundation + Copyright (C) 2012, 2013, 2014, 2019 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 @@ -19,6 +19,8 @@ #include "psppire-dialog-action-oneway.h" +#include + #include "psppire-var-view.h" #include "psppire-acr.h" @@ -31,9 +33,16 @@ #define _(msgid) gettext (msgid) #define N_(msgid) msgid +#define POSTHOC_BONFERRONI 0x01 +#define POSTHOC_GH 0x02 +#define POSTHOC_LSD 0x04 +#define POSTHOC_SCHEFFE 0x08 +#define POSTHOC_SIDAK 0x10 +#define POSTHOC_TUKEY 0x20 static void next (GtkWidget *widget, PsppireDialogActionOneway *); static void prev (GtkWidget *widget, PsppireDialogActionOneway *); +static void run_posthoc_dialog (PsppireDialogActionOneway *ow); static void run_contrasts_dialog (PsppireDialogActionOneway *csd); static void push_new_store (GArray *contrast_stack, PsppireDialogActionOneway *csd); @@ -45,7 +54,7 @@ G_DEFINE_TYPE (PsppireDialogActionOneway, psppire_dialog_action_oneway, PSPPIRE_ static char * -generate_syntax (PsppireDialogAction *act) +generate_syntax (const PsppireDialogAction *act) { PsppireDialogActionOneway *ow = PSPPIRE_DIALOG_ACTION_ONEWAY (act); gchar *text; @@ -63,7 +72,7 @@ generate_syntax (PsppireDialogAction *act) ds_put_cstr (&dss, gtk_entry_get_text (GTK_ENTRY (ow->factor_entry))); - if (descriptives || homogeneity ) + if (descriptives || homogeneity) { ds_put_cstr (&dss, "\n\t/STATISTICS="); if (descriptives) @@ -71,8 +80,23 @@ generate_syntax (PsppireDialogAction *act) if (homogeneity) ds_put_cstr (&dss, "HOMOGENEITY "); } - - for (i = 0 ; i < ow->contrasts_array->len ; ++i ) + if (ow->posthoc) + { + ds_put_cstr (&dss, "\n\t/POSTHOC="); + if (ow->posthoc & POSTHOC_BONFERRONI) + ds_put_cstr (&dss, "BONFERRONI "); + if (ow->posthoc & POSTHOC_GH) + ds_put_cstr (&dss, "GH "); + if (ow->posthoc & POSTHOC_LSD) + ds_put_cstr (&dss, "LSD "); + if (ow->posthoc & POSTHOC_SCHEFFE) + ds_put_cstr (&dss, "SCHEFFE "); + if (ow->posthoc & POSTHOC_SIDAK) + ds_put_cstr (&dss, "SIDAK "); + if (ow->posthoc & POSTHOC_TUKEY) + ds_put_cstr (&dss, "TUKEY "); + } + for (i = 0 ; i < ow->contrasts_array->len ; ++i) { GtkListStore *ls = g_array_index (ow->contrasts_array, GtkListStore*, i); GtkTreeIter iter; @@ -89,7 +113,7 @@ generate_syntax (PsppireDialogAction *act) gtk_tree_model_get (GTK_TREE_MODEL (ls), &iter, 0, &v, -1); - ds_put_c_format (&dss, " %g", v); + ds_put_c_format (&dss, " %.*g", DBL_DIG + 1, v); } } @@ -112,10 +136,10 @@ dialog_state_valid (gpointer data) GtkTreeIter notused; - if ( !gtk_tree_model_get_iter_first (vars, ¬used) ) + if (!gtk_tree_model_get_iter_first (vars, ¬used)) return FALSE; - if ( 0 == strcmp ("", gtk_entry_get_text (GTK_ENTRY (ow->factor_entry)))) + if (0 == strcmp ("", gtk_entry_get_text (GTK_ENTRY (ow->factor_entry)))) return FALSE; @@ -157,7 +181,7 @@ list_store_changed (PsppireDialogActionOneway *csd) gtk_widget_set_sensitive (csd->prev, csd->c > 1); - if ( csd->c > 0 ) + if (csd->c > 0) ls = g_array_index (csd->temp_contrasts, GtkTreeModel*, csd->c - 1); psppire_acr_set_model (PSPPIRE_ACR (csd->acr), GTK_LIST_STORE (ls)); @@ -170,14 +194,14 @@ list_store_changed (PsppireDialogActionOneway *csd) for (ok = gtk_tree_model_get_iter_first (ls, &iter); ok; ok = gtk_tree_model_iter_next (ls, &iter) - ) +) { gdouble v; gtk_tree_model_get (ls, &iter, 0, &v, -1); total += v; } - text = g_strdup_printf ("%g", total); + text = g_strdup_printf ("%.*g", DBL_DIG + 1, total); gtk_entry_set_text (GTK_ENTRY (csd->ctotal), text); @@ -195,7 +219,7 @@ clone_contrasts_array (GArray *src_array) g_array_sized_new (FALSE, FALSE, sizeof (GtkListStore *), src_array->len); - for (i = 0 ; i < src_array->len ; ++i ) + for (i = 0 ; i < src_array->len ; ++i) { GtkTreeIter src_iter; @@ -216,17 +240,17 @@ clone_contrasts_array (GArray *src_array) } - - -static void -psppire_dialog_action_oneway_activate (GtkAction *a) +static GtkBuilder * +psppire_dialog_action_oneway_activate (PsppireDialogAction *a, GVariant *param) { PsppireDialogAction *pda = PSPPIRE_DIALOG_ACTION (a); PsppireDialogActionOneway *act = PSPPIRE_DIALOG_ACTION_ONEWAY (a); GtkBuilder *xml = builder_new ("oneway.ui"); - GtkWidget *contrasts_button = - get_widget_assert (xml, "contrasts-button"); + + GtkWidget *contrasts_button = get_widget_assert (xml, "contrasts-button"); +/* Posthoc button */ + GtkWidget *posthoc_button= get_widget_assert (xml, "posthoc-button"); GtkEntry *entry = GTK_ENTRY (get_widget_assert (xml, "entry1")); pda->dialog = get_widget_assert (xml, "oneway-anova-dialog"); @@ -238,8 +262,22 @@ psppire_dialog_action_oneway_activate (GtkAction *a) act->descriptives = get_widget_assert (xml, "checkbutton1"); act->homogeneity = get_widget_assert (xml, "checkbutton2"); +/* Posthoc tests dialog */ + act->posthoc_dialog = get_widget_assert (xml, "posthoc-dialog"); + + act->bonferroni_button = get_widget_assert (xml, "bonferroni-button"); + act->gh_button = get_widget_assert (xml, "gh-button"); + act->lsd_button = get_widget_assert (xml, "lsd-button"); + act->scheffe_button = get_widget_assert (xml, "scheffe-button"); + act->sidak_button = get_widget_assert (xml, "sidak-button"); + act->tukey_button = get_widget_assert (xml, "tukey-button"); + + g_signal_connect_swapped (posthoc_button, "clicked", + G_CALLBACK (run_posthoc_dialog), act); + +/* Contrast dialog */ act->contrasts_dialog = get_widget_assert (xml, "contrasts-dialog"); - + act->next = get_widget_assert (xml, "next-button"); act->prev = get_widget_assert (xml, "prev-button"); act->ctotal = get_widget_assert (xml, "entry2"); @@ -263,19 +301,13 @@ psppire_dialog_action_oneway_activate (GtkAction *a) psppire_dialog_action_set_valid_predicate (pda, dialog_state_valid); psppire_dialog_action_set_refresh (pda, refresh); - - g_object_unref (xml); - - if (PSPPIRE_DIALOG_ACTION_CLASS (psppire_dialog_action_oneway_parent_class)->activate) - PSPPIRE_DIALOG_ACTION_CLASS (psppire_dialog_action_oneway_parent_class)->activate (pda); + return xml; } static void psppire_dialog_action_oneway_class_init (PsppireDialogActionOnewayClass *class) { - GtkActionClass *action_class = GTK_ACTION_CLASS (class); - - action_class->activate = psppire_dialog_action_oneway_activate; + PSPPIRE_DIALOG_ACTION_CLASS (class)->initial_activate = psppire_dialog_action_oneway_activate; PSPPIRE_DIALOG_ACTION_CLASS (class)->generate_syntax = generate_syntax; } @@ -285,11 +317,56 @@ psppire_dialog_action_oneway_init (PsppireDialogActionOneway *act) { act->contrasts_array = NULL; act->c = -1; - + act->posthoc = 0; } +/* Posthoc dialog */ +static void +run_posthoc_dialog (PsppireDialogActionOneway *ow) +{ + gint response; + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ow->bonferroni_button), + ow->posthoc & POSTHOC_BONFERRONI); + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ow->gh_button), + ow->posthoc & POSTHOC_GH); + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ow->lsd_button), + ow->posthoc & POSTHOC_LSD); + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ow->scheffe_button), + ow->posthoc & POSTHOC_SCHEFFE); + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ow->sidak_button), + ow->posthoc & POSTHOC_SIDAK); + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ow->tukey_button), + ow->posthoc & POSTHOC_TUKEY); + response = psppire_dialog_run (PSPPIRE_DIALOG (ow->posthoc_dialog)); - + if (response == PSPPIRE_RESPONSE_CONTINUE) + { + ow->posthoc= 0; + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (ow->bonferroni_button))) + ow->posthoc |= POSTHOC_BONFERRONI; + + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (ow->gh_button))) + ow->posthoc |= POSTHOC_GH; + + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (ow->lsd_button))) + ow->posthoc |= POSTHOC_LSD; + + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (ow->scheffe_button))) + ow->posthoc |= POSTHOC_SCHEFFE; + + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (ow->sidak_button))) + ow->posthoc |= POSTHOC_SIDAK; + + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (ow->tukey_button))) + ow->posthoc |= POSTHOC_TUKEY; + } +} static void run_contrasts_dialog (PsppireDialogActionOneway *csd) @@ -304,7 +381,7 @@ run_contrasts_dialog (PsppireDialogActionOneway *csd) response = psppire_dialog_run (PSPPIRE_DIALOG (csd->contrasts_dialog)); - if ( response == PSPPIRE_RESPONSE_CONTINUE ) + if (response == PSPPIRE_RESPONSE_CONTINUE) { csd->contrasts_array = clone_contrasts_array (csd->temp_contrasts); } @@ -343,7 +420,7 @@ next (GtkWidget *widget, PsppireDialogActionOneway *csd) static void prev (GtkWidget *widget, PsppireDialogActionOneway *csd) { - if ( csd->c > 0 ) + if (csd->c > 0) --csd->c; list_store_changed (csd);