X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-dialog-action-logistic.c;h=252bf9797aa3af6eb74691c72bc85667f250867c;hb=refs%2Fheads%2Fctables7;hp=2eec4c6b8118dae9afb37ebbe124d8033a78f966;hpb=14f4522a17db23e67a6fa17876633cc6260cb42b;p=pspp diff --git a/src/ui/gui/psppire-dialog-action-logistic.c b/src/ui/gui/psppire-dialog-action-logistic.c index 2eec4c6b81..252bf9797a 100644 --- a/src/ui/gui/psppire-dialog-action-logistic.c +++ b/src/ui/gui/psppire-dialog-action-logistic.c @@ -1,5 +1,5 @@ /* PSPPIRE - a graphical user interface for PSPP. - Copyright (C) 2008, 2010, 2011, 2012, 2014 Free Software Foundation + Copyright (C) 2008, 2010, 2011, 2012, 2016 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 @@ -20,8 +20,6 @@ #include "psppire-dialog-action-logistic.h" #include "psppire-value-entry.h" -#include - #include "dialog-common.h" #include "helper.h" #include @@ -81,14 +79,14 @@ on_opts_clicked (PsppireDialogActionLogistic *act) gtk_spin_button_set_value (GTK_SPIN_BUTTON (act->cut_point_entry), act->cut_point); gtk_spin_button_set_value (GTK_SPIN_BUTTON (act->iterations_entry), act->max_iterations); - + ret = psppire_dialog_run (PSPPIRE_DIALOG (act->opts_dialog)); - if ( ret == PSPPIRE_RESPONSE_CONTINUE ) + if (ret == PSPPIRE_RESPONSE_CONTINUE) { act->conf = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(act->conf_checkbox)); act->conf_level = gtk_spin_button_get_value (GTK_SPIN_BUTTON (act->conf_entry)); - + act->constant = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(act->const_checkbox)); act->cut_point = gtk_spin_button_get_value (GTK_SPIN_BUTTON (act->cut_point_entry)); @@ -97,8 +95,8 @@ on_opts_clicked (PsppireDialogActionLogistic *act) } -static void -psppire_dialog_action_logistic_activate (GtkAction *a) +static GtkBuilder * +psppire_dialog_action_logistic_activate (PsppireDialogAction *a, GVariant *param) { PsppireDialogActionLogistic *act = PSPPIRE_DIALOG_ACTION_LOGISTIC (a); PsppireDialogAction *pda = PSPPIRE_DIALOG_ACTION (a); @@ -130,63 +128,92 @@ psppire_dialog_action_logistic_activate (GtkAction *a) G_CALLBACK (on_opts_clicked), act); g_signal_connect (act->conf_checkbox, "toggled", - G_CALLBACK (set_sensitivity_from_toggle), + G_CALLBACK (set_sensitivity_from_toggle), act->conf_entry); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(act->conf_checkbox), TRUE); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(act->conf_checkbox), FALSE); - g_object_unref (xml); - psppire_dialog_action_set_refresh (pda, refresh); psppire_dialog_action_set_valid_predicate (pda, dialog_state_valid); - if (PSPPIRE_DIALOG_ACTION_CLASS (psppire_dialog_action_logistic_parent_class)->activate) - PSPPIRE_DIALOG_ACTION_CLASS (psppire_dialog_action_logistic_parent_class)->activate (pda); + return xml; } static char * -generate_syntax (PsppireDialogAction *a) +generate_syntax (const PsppireDialogAction *a) { PsppireDialogActionLogistic *rd = PSPPIRE_DIALOG_ACTION_LOGISTIC (a); gchar *text = NULL; - struct string str; + const gchar *dep = gtk_entry_get_text (GTK_ENTRY (rd->dep_var)); - ds_init_cstr (&str, "LOGISTIC REGRESSION "); + GString *strx = g_string_new ("LOGISTIC REGRESSION "); + + g_string_append (strx, dep); - ds_put_cstr (&str, dep); + g_string_append (strx, " WITH"); - ds_put_cstr (&str, " WITH "); + GSList *vars = psppire_var_view_list_names (PSPPIRE_VAR_VIEW (rd->indep_vars), 0); + GSList *node = vars; - psppire_var_view_append_names_str (PSPPIRE_VAR_VIEW (rd->indep_vars), 0, &str); + GString *var_names = g_string_new (""); + while (node) + { + g_string_prepend (var_names, var_get_name (node->data)); + g_string_prepend (var_names, " "); + node = node->next; + } - ds_put_cstr (&str, "\n\t/CRITERIA ="); + g_string_append (strx, var_names->str); + g_string_free (var_names, TRUE); - syntax_gen_pspp (&str, " CUT(%.*g)", DBL_DIG + 1, rd->cut_point); - syntax_gen_pspp (&str, " ITERATE(%d)", rd->max_iterations); + GString *categoricals = g_string_new (""); + for (node = vars; node; node = node->next) + { + const struct variable *v = node->data; + enum measure m = var_get_measure (v); + + if (m == MEASURE_NOMINAL || m == MEASURE_ORDINAL || var_is_alpha (v)) + { + g_string_prepend (categoricals, var_get_name (v)); + g_string_prepend (categoricals, " "); + } + } + if (0 != strcmp (categoricals->str, "")) + g_string_prepend (categoricals, "\n\t/CATEGORICAL ="); + + g_string_append (strx, categoricals->str); + g_string_free (categoricals, TRUE); + g_slist_free (vars); + + struct string opt_str; + ds_init_cstr (&opt_str, "\n\t/CRITERIA ="); + syntax_gen_pspp (&opt_str, " CUT(%g)", rd->cut_point); + syntax_gen_pspp (&opt_str, " ITERATE(%d)", rd->max_iterations); + g_string_append (strx, ds_cstr (&opt_str)); + ds_destroy (&opt_str); if (rd->conf) { - syntax_gen_pspp (&str, "\n\t/PRINT = CI(%.*g)", - DBL_DIG + 1, rd->conf_level); + g_string_append_printf (strx, "\n\t/PRINT = CI(%g)", rd->conf_level); } - if (rd->constant) - ds_put_cstr (&str, "\n\t/NOORIGIN"); + if (rd->constant) + g_string_append (strx, "\n\t/NOORIGIN"); else - ds_put_cstr (&str, "\n\t/ORIGIN"); + g_string_append (strx, "\n\t/ORIGIN"); - ds_put_cstr (&str, ".\n"); + g_string_append (strx, ".\n"); - text = ds_steal_cstr (&str); + text = strx->str; - ds_destroy (&str); + g_string_free (strx, FALSE); return text; } @@ -194,9 +221,7 @@ generate_syntax (PsppireDialogAction *a) static void psppire_dialog_action_logistic_class_init (PsppireDialogActionLogisticClass *class) { - GtkActionClass *action_class = GTK_ACTION_CLASS (class); - - action_class->activate = psppire_dialog_action_logistic_activate; + PSPPIRE_DIALOG_ACTION_CLASS (class)->initial_activate = psppire_dialog_action_logistic_activate; PSPPIRE_DIALOG_ACTION_CLASS (class)->generate_syntax = generate_syntax; }