1 /* vim: set sw=8: -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
3 * dialog-analysis-tools.c:
6 * Jukka-Pekka Iivonen <jiivonen@hutcs.cs.hut.fi>
7 * Andreas J. Guelzow <aguelzow@taliesin.ca>
9 * (C) Copyright 2000, 2001 by Jukka-Pekka Iivonen <jiivonen@hutcs.cs.hut.fi>
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, see <https://www.gnu.org/licenses/>.
25 #include <gnumeric-config.h>
26 #include <glib/gi18n-lib.h>
29 #include "analysis-tools.h"
30 #include "analysis-anova.h"
31 #include "analysis-histogram.h"
32 #include "analysis-exp-smoothing.h"
35 #include <workbook-control.h>
37 #include <workbook-view.h>
39 #include <parse-util.h>
40 #include <gnm-format.h>
41 #include <tool-dialogs.h>
42 #include <dao-gui-utils.h>
45 #include <number-match.h>
47 #include <selection.h>
52 #include <widgets/gnm-dao.h>
53 #include <widgets/gnumeric-expr-entry.h>
58 /**********************************************/
59 /* Generic guru items */
60 /**********************************************/
64 #define CORRELATION_KEY "analysistools-correlation-dialog"
65 #define COVARIANCE_KEY "analysistools-covariance-dialog"
66 #define DESCRIPTIVE_STATS_KEY "analysistools-descriptive-stats-dialog"
67 #define RANK_PERCENTILE_KEY "analysistools-rank-percentile-dialog"
68 #define TTEST_KEY "analysistools-ttest-dialog"
69 #define FTEST_KEY "analysistools-ftest-dialog"
70 #define SAMPLING_KEY "analysistools-sampling-dialog"
71 #define HISTOGRAM_KEY "analysistools-histogram-dialog"
72 #define FOURIER_KEY "analysistools-fourier-dialog"
73 #define AVERAGE_KEY "analysistools-moving-average-dialog"
74 #define EXP_SMOOTHING_KEY "analysistools-exp-smoothing-dialog"
75 #define REGRESSION_KEY "analysistools-regression-dialog"
76 #define ANOVA_TWO_FACTOR_KEY "analysistools-anova-two-factor-dialog"
77 #define ANOVA_SINGLE_KEY "analysistools-anova-single-factor-dialog"
80 static char const * const grouped_by_group
[] = {
88 GenericToolState base
;
89 GtkWidget
*predetermined_button
;
90 GtkWidget
*calculated_button
;
96 static char const * const bin_type_group
[] = {
97 "bintype_no_inf_lower",
98 "bintype_no_inf_upper",
99 "bintype_p_inf_lower",
100 "bintype_p_inf_upper",
101 "bintype_m_inf_lower",
102 "bintype_m_inf_upper",
103 "bintype_pm_inf_lower",
104 "bintype_pm_inf_upper",
108 static char const * const chart_group
[] = {
112 "columnchart-button",
116 static char const * const n_group
[] = {
124 /* Note: the items in this group need to match */
125 /* moving_average_type_t except that */
126 /* moving_average_type_central_sma is a */
127 /* subtype of moving_average_type_sma. */
128 static char const * const moving_average_group
[] = {
136 static char const * const exp_smoothing_group
[] = {
148 GenericToolState base
;
149 GtkWidget
*summary_stats_button
;
150 GtkWidget
*mean_stats_button
;
151 GtkWidget
*kth_largest_button
;
152 GtkWidget
*kth_smallest_button
;
153 GtkWidget
*ss_button
;
157 } DescriptiveStatState
;
160 GenericToolState base
;
161 GtkWidget
*paired_button
;
162 GtkWidget
*unpaired_button
;
163 GtkWidget
*known_button
;
164 GtkWidget
*unknown_button
;
165 GtkWidget
*equal_button
;
166 GtkWidget
*unequal_button
;
167 GtkWidget
*variablespaired_label
;
168 GtkWidget
*varianceknown_label
;
169 GtkWidget
*varianceequal_label
;
170 GtkWidget
*var1_variance_label
;
171 GtkWidget
*var2_variance_label
;
172 GtkWidget
*var1_variance
;
173 GtkWidget
*var2_variance
;
174 GtkWidget
*options_grid
;
175 GtkWidget
*mean_diff_entry
;
176 GtkWidget
*alpha_entry
;
177 ttest_type invocation
;
181 GenericToolState base
;
182 GtkWidget
*options_grid
;
183 GtkWidget
*method_label
;
184 GtkWidget
*periodic_button
;
185 GtkWidget
*random_button
;
186 GtkWidget
*period_label
;
187 GtkWidget
*random_label
;
188 GtkWidget
*period_entry
;
189 GtkWidget
*random_entry
;
190 GtkWidget
*number_entry
;
191 GtkWidget
*offset_label
;
192 GtkWidget
*offset_entry
;
193 GtkWidget
*major_label
;
194 GtkWidget
*row_major_button
;
195 GtkWidget
*col_major_button
;
199 GenericToolState base
;
200 GtkWidget
*interval_entry
;
201 GtkWidget
*show_std_errors
;
203 GtkWidget
*nm1_button
;
204 GtkWidget
*nm2_button
;
205 GtkWidget
*prior_button
;
206 GtkWidget
*central_button
;
207 GtkWidget
*offset_button
;
208 GtkWidget
*offset_spin
;
209 GtkWidget
*graph_button
;
210 GtkWidget
*sma_button
;
211 GtkWidget
*cma_button
;
212 GtkWidget
*wma_button
;
213 GtkWidget
*spencer_button
;
217 GenericToolState base
;
218 GtkWidget
*damping_fact_entry
;
219 GtkWidget
*g_damping_fact_entry
;
220 GtkWidget
*s_damping_fact_entry
;
221 GtkWidget
*s_period_entry
;
222 GtkWidget
*show_std_errors
;
224 GtkWidget
*nm1_button
;
225 GtkWidget
*nm2_button
;
226 GtkWidget
*nm3_button
;
227 GtkWidget
*graph_button
;
228 GtkWidget
*ses_h_button
;
229 GtkWidget
*ses_r_button
;
230 GtkWidget
*des_button
;
231 GtkWidget
*ates_button
;
232 GtkWidget
*mtes_button
;
233 } ExpSmoothToolState
;
236 GenericToolState base
;
237 GtkWidget
*confidence_entry
;
238 GtkWidget
*simple_linear_regression_radio
;
239 GtkWidget
*switch_variables_check
;
240 GtkWidget
*residuals_check
;
241 } RegressionToolState
;
244 GenericToolState base
;
245 GtkWidget
*alpha_entry
;
246 } AnovaSingleToolState
;
249 GenericToolState base
;
250 GtkWidget
*alpha_entry
;
251 GtkWidget
*replication_entry
;
252 } AnovaTwoFactorToolState
;
255 GenericToolState base
;
256 GtkWidget
*alpha_entry
;
260 /**********************************************/
261 /* Generic functions for the analysis tools. */
262 /* Functions in this section are being used */
263 /* by virtually all tools. */
264 /**********************************************/
274 * Show an error dialog and select corresponding entry
277 error_in_entry (GenericToolState
*state
, GtkWidget
*entry
, char const *err_str
)
279 go_gtk_notice_nonmodal_dialog ((GtkWindow
*) state
->dialog
,
280 &(state
->warning_dialog
),
284 if (GNM_EXPR_ENTRY_IS (entry
))
285 gnm_expr_entry_grab_focus (GNM_EXPR_ENTRY (entry
), TRUE
);
287 focus_on_entry (GTK_ENTRY (entry
));
291 cb_tool_destroy (GenericToolState
*state
)
293 if (state
->gui
!= NULL
)
294 g_object_unref (state
->gui
);
295 wbcg_edit_finish (state
->wbcg
, WBC_EDIT_REJECT
, NULL
);
296 if (state
->state_destroy
)
297 state
->state_destroy (state
);
302 * cb_tool_cancel_clicked:
306 * Close (destroy) the dialog
309 cb_tool_cancel_clicked (G_GNUC_UNUSED GtkWidget
*button
,
310 GenericToolState
*state
)
312 gtk_widget_destroy (state
->dialog
);
319 * dialog_tool_init_buttons:
327 dialog_tool_init_buttons (GenericToolState
*state
,
328 GCallback ok_function
,
329 GCallback close_function
)
331 state
->ok_button
= go_gtk_builder_get_widget (state
->gui
, "okbutton");
332 g_signal_connect (G_OBJECT (state
->ok_button
),
334 G_CALLBACK (ok_function
), state
);
336 state
->cancel_button
= go_gtk_builder_get_widget (state
->gui
,
338 if (close_function
== NULL
)
339 g_signal_connect (G_OBJECT (state
->cancel_button
),
341 G_CALLBACK (cb_tool_cancel_clicked
), state
);
343 g_signal_connect (G_OBJECT (state
->cancel_button
),
345 G_CALLBACK (close_function
), state
);
347 state
->apply_button
= go_gtk_builder_get_widget (state
->gui
, "applybutton");
348 if (state
->apply_button
!= NULL
)
349 g_signal_connect (G_OBJECT (state
->apply_button
),
351 G_CALLBACK (ok_function
), state
);
352 state
->help_button
= go_gtk_builder_get_widget (state
->gui
, "helpbutton");
353 if (state
->help_button
!= NULL
)
354 gnm_init_help_button (state
->help_button
,
367 * Create the dialog (guru).
371 dialog_tool_init (GenericToolState
*state
,
374 char const *help_file
,
375 char const *gui_name
,
376 char const *dialog_name
,
377 char const *error_str
,
379 GCallback ok_function
,
380 GCallback close_function
,
381 GCallback sensitivity_cb
,
382 GnmExprEntryFlags flags
)
388 state
->wb
= wb_control_get_workbook (GNM_WBC (wbcg
));
389 state
->sheet
= sheet
;
390 state
->sv
= wb_control_cur_sheet_view (GNM_WBC (wbcg
));
391 state
->warning_dialog
= NULL
;
392 state
->help_link
= help_file
;
393 state
->state_destroy
= NULL
;
395 state
->gui
= gnm_gtk_builder_load (gui_name
, NULL
, GO_CMD_CONTEXT (wbcg
));
396 if (state
->gui
== NULL
)
397 goto dialog_tool_init_error
;
399 state
->dialog
= go_gtk_builder_get_widget (state
->gui
, dialog_name
);
400 if (state
->dialog
== NULL
)
401 goto dialog_tool_init_error
;
404 dialog_tool_init_buttons (state
, ok_function
, close_function
);
406 widget
= go_gtk_builder_get_widget (state
->gui
, "var1-label");
407 if (widget
== NULL
) {
408 state
->input_entry
= NULL
;
410 guint left_attach
, top_attach
, width
, height
;
412 grid
= GTK_GRID (gtk_widget_get_parent (widget
));
413 state
->input_entry
= gnm_expr_entry_new (state
->wbcg
, TRUE
);
414 g_object_set (G_OBJECT (state
->input_entry
), "hexpand", TRUE
, NULL
);
415 gnm_expr_entry_disable_tips (state
->input_entry
);
416 gnm_expr_entry_set_flags (state
->input_entry
,
417 flags
| GNM_EE_FORCE_ABS_REF
,
420 gtk_container_child_get (GTK_CONTAINER (grid
), widget
,
421 "left-attach", &left_attach
,
422 "top-attach", &top_attach
,
427 gtk_grid_attach (grid
, GTK_WIDGET (state
->input_entry
),
428 left_attach
+ width
, top_attach
,
430 g_signal_connect_after (G_OBJECT (state
->input_entry
),
432 G_CALLBACK (sensitivity_cb
), state
);
433 gnm_editable_enters (GTK_WINDOW (state
->dialog
),
434 GTK_WIDGET (state
->input_entry
));
435 gtk_label_set_mnemonic_widget (GTK_LABEL (widget
),
436 GTK_WIDGET (state
->input_entry
));
437 go_atk_setup_label (widget
, GTK_WIDGET (state
->input_entry
));
438 gtk_widget_show (GTK_WIDGET (state
->input_entry
));
443 /* If there is a var2-label, we need a second input field */
445 widget
= go_gtk_builder_get_widget (state
->gui
, "var2-label");
446 if (widget
== NULL
) {
447 state
->input_entry_2
= NULL
;
449 guint left_attach
, top_attach
, width
, height
;
451 state
->input_entry_2
= gnm_expr_entry_new (state
->wbcg
, TRUE
);
452 g_object_set (G_OBJECT (state
->input_entry_2
), "hexpand", TRUE
, NULL
);
453 gnm_expr_entry_disable_tips (state
->input_entry_2
);
454 gnm_expr_entry_set_flags (state
->input_entry_2
,
455 GNM_EE_SINGLE_RANGE
| GNM_EE_FORCE_ABS_REF
, GNM_EE_MASK
);
456 grid
= GTK_GRID (gtk_widget_get_parent (widget
));
458 gtk_container_child_get (GTK_CONTAINER (grid
), widget
,
459 "left-attach", &left_attach
,
460 "top-attach", &top_attach
,
465 gtk_grid_attach (grid
, GTK_WIDGET (state
->input_entry_2
),
466 left_attach
+ width
, top_attach
,
468 g_signal_connect_after (G_OBJECT (state
->input_entry_2
),
470 G_CALLBACK (sensitivity_cb
), state
);
471 gnm_editable_enters (GTK_WINDOW (state
->dialog
),
472 GTK_WIDGET (state
->input_entry_2
));
473 gtk_label_set_mnemonic_widget (GTK_LABEL (widget
),
474 GTK_WIDGET (state
->input_entry_2
));
475 go_atk_setup_label (widget
, GTK_WIDGET (state
->input_entry_2
));
476 gtk_widget_show (GTK_WIDGET (state
->input_entry_2
));
479 state
->warning
= go_gtk_builder_get_widget (state
->gui
, "warnings");
480 wbc_gtk_attach_guru (state
->wbcg
, state
->dialog
);
481 g_object_set_data_full (G_OBJECT (state
->dialog
),
482 "state", state
, (GDestroyNotify
) cb_tool_destroy
);
484 dialog_tool_init_outputs (state
, sensitivity_cb
);
486 gnm_keyed_dialog (wbcg
, GTK_WINDOW (state
->dialog
), key
);
488 gnm_dialog_setup_destroy_handlers (GTK_DIALOG (state
->dialog
),
490 GNM_DIALOG_DESTROY_SHEET_REMOVED
|
491 GNM_DIALOG_DESTROY_SHEET_RENAMED
);
495 dialog_tool_init_error
:
496 go_gtk_notice_dialog (wbcg_toplevel (wbcg
),
504 * tool_load_selection:
507 * load the current selection in the output and input entries
508 * show the dialog and focus the input_entry
512 tool_load_selection (GenericToolState
*state
, gboolean allow_multiple
)
514 GnmRange
const *first
= selection_first_range (state
->sv
, NULL
, NULL
);
517 if (allow_multiple
) {
518 char *text
= selection_to_string (state
->sv
, TRUE
);
519 gnm_expr_entry_load_from_text (state
->input_entry
,
523 gnm_expr_entry_load_from_range (state
->input_entry
,
524 state
->sheet
, first
);
525 if (state
->gdao
!= NULL
)
526 gnm_dao_load_range (GNM_DAO (state
->gdao
), first
);
529 gtk_widget_show (state
->dialog
);
530 gnm_expr_entry_grab_focus (GNM_EXPR_ENTRY (state
->input_entry
),
537 tool_setup_update (GenericToolState
* state
, char const *name
, GCallback cb
,
540 GtkWidget
*w
= go_gtk_builder_get_widget (state
->gui
, name
);
541 if (GTK_IS_SPIN_BUTTON (w
)) {
542 g_signal_connect_after (w
, "value-changed", cb
, closure
);
543 gnm_editable_enters (GTK_WINDOW (state
->dialog
), w
);
544 } else if (GTK_IS_ENTRY (w
)) {
545 g_signal_connect_after (w
, "changed", cb
, closure
);
546 gnm_editable_enters (GTK_WINDOW (state
->dialog
), w
);
547 } else if (GTK_IS_TOGGLE_BUTTON (w
))
548 g_signal_connect_after (w
, "toggled", cb
, closure
);
550 g_warning ("tool_setup_update called with unknown type");
557 /**********************************************/
558 /* Generic functions for the analysis tools */
559 /* Functions in this section are being used */
561 /**********************************************/
564 * tool_update_sensitivity_cb:
568 * Update the dialog widgets sensitivity if the only items of interest
569 * are one or two standard input and one output item, permitting multiple
570 * areas as first input.
580 tool_update_sensitivity_cb (G_GNUC_UNUSED GtkWidget
*dummy
,
581 GenericToolState
*state
)
585 /* Checking Input Range */
586 input_range
= gnm_expr_entry_parse_as_list (
587 GNM_EXPR_ENTRY (state
->input_entry
), state
->sheet
);
588 if (input_range
== NULL
) {
589 gtk_label_set_text (GTK_LABEL (state
->warning
),
590 _("The input range is invalid."));
591 gtk_widget_set_sensitive (state
->ok_button
, FALSE
);
594 range_list_destroy (input_range
);
596 /* Checking Output Page */
597 if (!gnm_dao_is_ready (GNM_DAO (state
->gdao
))) {
598 gtk_label_set_text (GTK_LABEL (state
->warning
),
599 _("The output specification "
601 gtk_widget_set_sensitive (state
->ok_button
, FALSE
);
605 gtk_label_set_text (GTK_LABEL (state
->warning
), "");
606 gtk_widget_set_sensitive (state
->ok_button
, TRUE
);
611 /**********************************************/
612 /* Begin of correlation tool code */
613 /**********************************************/
617 * corr_tool_ok_clicked_cb:
621 * Retrieve the information from the dialog and call the correlation_tool.
622 * Note that we assume that the ok_button is only active if the entry fields
623 * contain sensible data.
626 corr_tool_ok_clicked_cb (G_GNUC_UNUSED GtkWidget
*button
,
627 GenericToolState
*state
)
629 data_analysis_output_t
*dao
;
630 analysis_tools_data_generic_t
*data
;
635 if (state
->warning_dialog
!= NULL
)
636 gtk_widget_destroy (state
->warning_dialog
);
638 data
= g_new0 (analysis_tools_data_generic_t
, 1);
639 dao
= parse_output (state
, NULL
);
641 data
->input
= gnm_expr_entry_parse_as_list (
642 GNM_EXPR_ENTRY (state
->input_entry
), state
->sheet
);
643 data
->group_by
= gnm_gui_group_value (state
->gui
, grouped_by_group
);
645 w
= go_gtk_builder_get_widget (state
->gui
, "labels_button");
646 data
->labels
= gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w
));
648 if (cmd_analysis_tool (GNM_WBC (state
->wbcg
), state
->sheet
,
649 dao
, data
, analysis_tool_correlation_engine
, FALSE
)) {
651 switch (data
->err
- 1) {
653 error_in_entry ((GenericToolState
*) state
,
654 GTK_WIDGET (state
->input_entry
),
655 _("The selected input rows must have equal size!"));
658 error_in_entry ((GenericToolState
*) state
,
659 GTK_WIDGET (state
->input_entry
),
660 _("The selected input columns must have equal size!"));
662 case GROUPED_BY_AREA
:
663 error_in_entry ((GenericToolState
*) state
,
664 GTK_WIDGET (state
->input_entry
),
665 _("The selected input areas must have equal size!"));
668 text
= g_strdup_printf (
669 _("An unexpected error has occurred: %d."), data
->err
);
670 error_in_entry ((GenericToolState
*) state
,
671 GTK_WIDGET (state
->input_entry
), text
);
675 range_list_destroy (data
->input
);
679 gtk_widget_destroy (state
->dialog
);
686 * dialog_correlation_tool:
690 * Show the dialog (guru).
694 dialog_correlation_tool (WBCGtk
*wbcg
, Sheet
*sheet
)
696 GenericToolState
*state
;
697 char const * plugins
[] = { "Gnumeric_fnstat",
700 if ((wbcg
== NULL
) ||
701 gnm_check_for_plugins_missing (plugins
, wbcg_toplevel (wbcg
)))
704 /* Only pop up one copy per workbook */
705 if (gnm_dialog_raise_if_exists (wbcg
, CORRELATION_KEY
))
708 state
= g_new0 (GenericToolState
, 1);
710 if (dialog_tool_init (state
, wbcg
, sheet
,
711 GNUMERIC_HELP_LINK_CORRELATION
,
712 "res:ui/correlation.ui", "Correlation",
713 _("Could not create the Correlation Tool dialog."),
715 G_CALLBACK (corr_tool_ok_clicked_cb
), NULL
,
716 G_CALLBACK (tool_update_sensitivity_cb
),
720 gnm_dao_set_put (GNM_DAO (state
->gdao
), TRUE
, TRUE
);
721 tool_update_sensitivity_cb (NULL
, state
);
722 tool_load_selection ((GenericToolState
*)state
, TRUE
);
727 /**********************************************/
728 /* End of correlation tool code */
729 /**********************************************/
731 /**********************************************/
732 /* Begin of covariance tool code */
733 /**********************************************/
737 * cov_tool_ok_clicked_cb:
741 * Retrieve the information from the dialog and call the covariance_tool.
742 * Note that we assume that the ok_button is only active if the entry fields
743 * contain sensible data.
746 cov_tool_ok_clicked_cb (G_GNUC_UNUSED GtkWidget
*button
,
747 GenericToolState
*state
)
749 data_analysis_output_t
*dao
;
750 analysis_tools_data_generic_t
*data
;
755 if (state
->warning_dialog
!= NULL
)
756 gtk_widget_destroy (state
->warning_dialog
);
758 data
= g_new0 (analysis_tools_data_generic_t
, 1);
759 dao
= parse_output (state
, NULL
);
761 data
->input
= gnm_expr_entry_parse_as_list (
762 GNM_EXPR_ENTRY (state
->input_entry
), state
->sheet
);
763 data
->group_by
= gnm_gui_group_value (state
->gui
, grouped_by_group
);
765 w
= go_gtk_builder_get_widget (state
->gui
, "labels_button");
766 data
->labels
= gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w
));
768 if (cmd_analysis_tool (GNM_WBC (state
->wbcg
), state
->sheet
,
769 dao
, data
, analysis_tool_covariance_engine
, FALSE
)) {
771 switch (data
->err
- 1) {
773 error_in_entry ((GenericToolState
*) state
,
774 GTK_WIDGET (state
->input_entry
),
775 _("The selected input rows must have equal size!"));
778 error_in_entry ((GenericToolState
*) state
,
779 GTK_WIDGET (state
->input_entry
),
780 _("The selected input columns must have equal size!"));
782 case GROUPED_BY_AREA
:
783 error_in_entry ((GenericToolState
*) state
,
784 GTK_WIDGET (state
->input_entry
),
785 _("The selected input areas must have equal size!"));
788 text
= g_strdup_printf (
789 _("An unexpected error has occurred: %d."), data
->err
);
790 error_in_entry ((GenericToolState
*) state
,
791 GTK_WIDGET (state
->input_entry
), text
);
795 range_list_destroy (data
->input
);
799 gtk_widget_destroy (state
->dialog
);
806 * dialog_covariance_tool:
810 * Show the dialog (guru).
814 dialog_covariance_tool (WBCGtk
*wbcg
, Sheet
*sheet
)
816 GenericToolState
*state
;
817 char const * plugins
[] = { "Gnumeric_fnstat",
820 if ((wbcg
== NULL
) ||
821 gnm_check_for_plugins_missing (plugins
, wbcg_toplevel (wbcg
)))
824 /* Only pop up one copy per workbook */
825 if (gnm_dialog_raise_if_exists (wbcg
, COVARIANCE_KEY
))
828 state
= g_new0 (GenericToolState
, 1);
830 if (dialog_tool_init (state
, wbcg
, sheet
,
831 GNUMERIC_HELP_LINK_COVARIANCE
,
832 "res:ui/covariance.ui", "Covariance",
833 _("Could not create the Covariance Tool dialog."),
835 G_CALLBACK (cov_tool_ok_clicked_cb
), NULL
,
836 G_CALLBACK (tool_update_sensitivity_cb
),
840 gnm_dao_set_put (GNM_DAO (state
->gdao
), TRUE
, TRUE
);
841 tool_update_sensitivity_cb (NULL
, state
);
842 tool_load_selection ((GenericToolState
*)state
, TRUE
);
847 /**********************************************/
848 /* End of covariance tool code */
849 /**********************************************/
851 /**********************************************/
852 /* Begin of rank and percentile tool code */
853 /**********************************************/
857 * rank_tool_ok_clicked_cb:
861 * Retrieve the information from the dialog and call the ranking_tool.
862 * Note that we assume that the ok_button is only active if the entry fields
863 * contain sensible data.
866 rank_tool_ok_clicked_cb (G_GNUC_UNUSED GtkWidget
*button
,
867 GenericToolState
*state
)
869 data_analysis_output_t
*dao
;
870 analysis_tools_data_ranking_t
*data
;
874 data
= g_new0 (analysis_tools_data_ranking_t
, 1);
875 dao
= parse_output (state
, NULL
);
877 data
->base
.input
= gnm_expr_entry_parse_as_list (
878 GNM_EXPR_ENTRY (state
->input_entry
), state
->sheet
);
879 data
->base
.group_by
= gnm_gui_group_value (state
->gui
, grouped_by_group
);
881 w
= go_gtk_builder_get_widget (state
->gui
, "labels_button");
882 data
->base
.labels
= gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w
));
884 w
= go_gtk_builder_get_widget (state
->gui
, "rank_button");
885 data
->av_ties
= gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w
));
888 if (!cmd_analysis_tool (GNM_WBC (state
->wbcg
), state
->sheet
,
889 dao
, data
, analysis_tool_ranking_engine
, TRUE
))
890 gtk_widget_destroy (state
->dialog
);
897 * dialog_ranking_tool:
901 * Show the dialog (guru).
905 dialog_ranking_tool (WBCGtk
*wbcg
, Sheet
*sheet
)
907 GenericToolState
*state
;
908 char const * plugins
[] = { "Gnumeric_fnstat",
912 if ((wbcg
== NULL
) ||
913 gnm_check_for_plugins_missing (plugins
, wbcg_toplevel (wbcg
)))
916 /* Only pop up one copy per workbook */
917 if (gnm_dialog_raise_if_exists (wbcg
, RANK_PERCENTILE_KEY
))
920 state
= g_new0 (GenericToolState
, 1);
922 if (dialog_tool_init (state
, wbcg
, sheet
,
923 GNUMERIC_HELP_LINK_RANKING
,
924 "res:ui/rank.ui", "RankPercentile",
925 _("Could not create the Rank and Percentile "
928 G_CALLBACK (rank_tool_ok_clicked_cb
), NULL
,
929 G_CALLBACK (tool_update_sensitivity_cb
),
933 gnm_dao_set_put (GNM_DAO (state
->gdao
), TRUE
, TRUE
);
934 tool_update_sensitivity_cb (NULL
, state
);
935 tool_load_selection ((GenericToolState
*)state
, TRUE
);
940 /**********************************************/
941 /* End of rank and percentile tool code */
942 /**********************************************/
944 /**********************************************/
945 /* Begin of Fourier analysis tool code */
946 /**********************************************/
949 * fourier_tool_ok_clicked_cb:
953 * Retrieve the information from the dialog and call the fourier_tool.
954 * Note that we assume that the ok_button is only active if the entry fields
955 * contain sensible data.
958 fourier_tool_ok_clicked_cb (G_GNUC_UNUSED GtkWidget
*button
,
959 GenericToolState
*state
)
961 data_analysis_output_t
*dao
;
962 analysis_tools_data_fourier_t
*data
;
966 data
= g_new0 (analysis_tools_data_fourier_t
, 1);
967 dao
= parse_output (state
, NULL
);
969 data
->base
.wbc
= GNM_WBC (state
->wbcg
);
970 data
->base
.input
= gnm_expr_entry_parse_as_list (
971 GNM_EXPR_ENTRY (state
->input_entry
), state
->sheet
);
972 data
->base
.group_by
= gnm_gui_group_value (state
->gui
, grouped_by_group
);
974 w
= go_gtk_builder_get_widget (state
->gui
, "labels_button");
975 data
->base
.labels
= gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w
));
977 w
= go_gtk_builder_get_widget (state
->gui
, "inverse_button");
978 data
->inverse
= gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w
)) != 0;
980 if (!cmd_analysis_tool (GNM_WBC (state
->wbcg
), state
->sheet
,
981 dao
, data
, analysis_tool_fourier_engine
, TRUE
))
982 gtk_widget_destroy (state
->dialog
);
990 * dialog_fourier_tool:
994 * Show the dialog (guru).
998 dialog_fourier_tool (WBCGtk
*wbcg
, Sheet
*sheet
)
1000 GenericToolState
*state
;
1001 char const * plugins
[] = { "Gnumeric_fnTimeSeriesAnalysis",
1002 "Gnumeric_fncomplex",
1005 if ((wbcg
== NULL
) ||
1006 gnm_check_for_plugins_missing (plugins
, wbcg_toplevel (wbcg
)))
1009 /* Only pop up one copy per workbook */
1010 if (gnm_dialog_raise_if_exists (wbcg
, FOURIER_KEY
))
1013 state
= g_new0 (GenericToolState
, 1);
1015 if (dialog_tool_init (state
, wbcg
, sheet
,
1016 GNUMERIC_HELP_LINK_FOURIER_ANALYSIS
,
1017 "res:ui/fourier-analysis.ui", "FourierAnalysis",
1018 _("Could not create the Fourier Analysis Tool "
1021 G_CALLBACK (fourier_tool_ok_clicked_cb
), NULL
,
1022 G_CALLBACK (tool_update_sensitivity_cb
),
1026 gnm_dao_set_put (GNM_DAO (state
->gdao
), TRUE
, TRUE
);
1027 tool_update_sensitivity_cb (NULL
, state
);
1028 tool_load_selection ((GenericToolState
*)state
, TRUE
);
1033 /**********************************************/
1034 /* End of Fourier analysis tool code */
1035 /**********************************************/
1037 /**********************************************/
1038 /* Begin of descriptive statistics tool code */
1039 /**********************************************/
1042 * cb_desc_stat_tool_ok_clicked:
1046 * Retrieve the information from the dialog and call the descriptive_stat_tool.
1047 * Note that we assume that the ok_button is only active if the entry fields
1048 * contain sensible data.
1051 cb_desc_stat_tool_ok_clicked (G_GNUC_UNUSED GtkWidget
*button
,
1052 DescriptiveStatState
*state
)
1054 data_analysis_output_t
*dao
;
1055 analysis_tools_data_descriptive_t
*data
;
1059 data
= g_new0 (analysis_tools_data_descriptive_t
, 1);
1060 dao
= parse_output ((GenericToolState
*)state
, NULL
);
1062 data
->base
.input
= gnm_expr_entry_parse_as_list (
1063 GNM_EXPR_ENTRY (state
->base
.input_entry
), state
->base
.sheet
);
1064 data
->base
.group_by
= gnm_gui_group_value (state
->base
.gui
, grouped_by_group
);
1066 data
->summary_statistics
= gtk_toggle_button_get_active (
1067 GTK_TOGGLE_BUTTON (state
->summary_stats_button
));
1068 data
->confidence_level
= gtk_toggle_button_get_active (
1069 GTK_TOGGLE_BUTTON (state
->mean_stats_button
));
1070 data
->kth_largest
= gtk_toggle_button_get_active (
1071 GTK_TOGGLE_BUTTON (state
->kth_largest_button
));
1072 data
->kth_smallest
= gtk_toggle_button_get_active (
1073 GTK_TOGGLE_BUTTON (state
->kth_smallest_button
));
1074 data
->use_ssmedian
= gtk_toggle_button_get_active (
1075 GTK_TOGGLE_BUTTON (state
->ss_button
));
1077 if (data
->confidence_level
== 1)
1078 data
->c_level
= gtk_spin_button_get_value
1079 (GTK_SPIN_BUTTON (state
->c_entry
));
1081 if (data
->kth_largest
== 1)
1082 entry_to_int (GTK_ENTRY (state
->l_entry
), &data
->k_largest
, TRUE
);
1083 if (data
->kth_smallest
== 1)
1084 entry_to_int (GTK_ENTRY (state
->s_entry
), &data
->k_smallest
, TRUE
);
1086 w
= go_gtk_builder_get_widget (state
->base
.gui
, "labels_button");
1087 data
->base
.labels
= gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w
));
1089 if (!cmd_analysis_tool (GNM_WBC (state
->base
.wbcg
), state
->base
.sheet
,
1090 dao
, data
, analysis_tool_descriptive_engine
, TRUE
))
1091 gtk_widget_destroy (state
->base
.dialog
);
1096 * desc_stat_tool_update_sensitivity_cb:
1099 * Update the dialog widgets sensitivity.
1100 * We cannot use tool_update_sensitivity_cb
1101 * since we are also considering whether in fact
1102 * a statistic is selected.
1105 desc_stat_tool_update_sensitivity_cb (G_GNUC_UNUSED GtkWidget
*dummy
,
1106 DescriptiveStatState
*state
)
1108 gboolean stats_button
, ci_button
, largest_button
, smallest_button
;
1109 GSList
*input_range
;
1111 /* Part 1: set the buttons on the statistics page. */
1113 stats_button
= gtk_toggle_button_get_active
1114 (GTK_TOGGLE_BUTTON (state
->summary_stats_button
));
1115 gtk_widget_set_sensitive (state
->ss_button
, stats_button
);
1117 ci_button
= gtk_toggle_button_get_active
1118 (GTK_TOGGLE_BUTTON (state
->mean_stats_button
));
1119 gtk_widget_set_sensitive (state
->c_entry
, ci_button
);
1121 largest_button
= gtk_toggle_button_get_active
1122 (GTK_TOGGLE_BUTTON (state
->kth_largest_button
));
1123 gtk_widget_set_sensitive (state
->l_entry
, largest_button
);
1125 smallest_button
= gtk_toggle_button_get_active
1126 (GTK_TOGGLE_BUTTON (state
->kth_smallest_button
));
1127 gtk_widget_set_sensitive (state
->s_entry
, smallest_button
);
1129 /* Part 2: set the okay button */
1131 /* Checking Input Page */
1132 input_range
= gnm_expr_entry_parse_as_list (
1133 GNM_EXPR_ENTRY (state
->base
.input_entry
),
1135 if (input_range
== NULL
) {
1136 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
1137 _("The input range is invalid."));
1138 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
1141 range_list_destroy (input_range
);
1143 /* Checking Statistics Page */
1144 if (!(stats_button
|| ci_button
|| largest_button
|| smallest_button
)) {
1145 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
1146 _("No statistics are selected."));
1147 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
1152 gdouble c_level
= gtk_spin_button_get_value
1153 (GTK_SPIN_BUTTON (state
->c_entry
));
1154 if (!(c_level
> 0 && c_level
<1)) {
1155 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
1156 _("The confidence level should be "
1157 "between 0 and 1."));
1158 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
1163 if (largest_button
) {
1165 if ((0 != entry_to_int (GTK_ENTRY (state
->l_entry
), &k
, FALSE
))
1167 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
1168 _("K must be a positive integer."));
1169 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
1174 if (smallest_button
) {
1176 if ((0 != entry_to_int (GTK_ENTRY (state
->s_entry
), &k
, FALSE
))
1178 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
1179 _("K must be a positive integer."));
1180 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
1185 /* Checking Output Page */
1186 if (!gnm_dao_is_ready (GNM_DAO (state
->base
.gdao
))) {
1187 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
1188 _("The output specification "
1190 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
1194 gtk_label_set_text (GTK_LABEL (state
->base
.warning
), "");
1195 gtk_widget_set_sensitive (state
->base
.ok_button
, TRUE
);
1202 * dialog_descriptive_stat_tool:
1206 * Show the dialog (guru).
1210 dialog_descriptive_stat_tool (WBCGtk
*wbcg
, Sheet
*sheet
)
1212 DescriptiveStatState
*state
;
1213 char const * plugins
[] = {"Gnumeric_fnstat",
1217 if ((wbcg
== NULL
) ||
1218 gnm_check_for_plugins_missing (plugins
, wbcg_toplevel (wbcg
)))
1221 /* Only pop up one copy per workbook */
1222 if (gnm_dialog_raise_if_exists (wbcg
, DESCRIPTIVE_STATS_KEY
))
1225 state
= g_new0 (DescriptiveStatState
, 1);
1227 if (dialog_tool_init (&state
->base
, wbcg
, sheet
,
1228 GNUMERIC_HELP_LINK_DESCRIPTIVE_STATS
,
1229 "res:ui/descriptive-stats.ui", "DescStats",
1230 _("Could not create the Descriptive Statistics "
1232 DESCRIPTIVE_STATS_KEY
,
1233 G_CALLBACK (cb_desc_stat_tool_ok_clicked
), NULL
,
1234 G_CALLBACK (desc_stat_tool_update_sensitivity_cb
),
1241 state
->summary_stats_button
= go_gtk_builder_get_widget
1242 (state
->base
.gui
, "summary_stats_button");
1243 state
->ss_button
= go_gtk_builder_get_widget
1244 (state
->base
.gui
, "ss_button");
1245 state
->mean_stats_button
= go_gtk_builder_get_widget
1246 (state
->base
.gui
, "mean_stats_button");
1247 state
->kth_largest_button
= go_gtk_builder_get_widget
1248 (state
->base
.gui
, "kth_largest_button");
1249 state
->kth_smallest_button
= go_gtk_builder_get_widget
1250 (state
->base
.gui
, "kth_smallest_button");
1251 state
->c_entry
= go_gtk_builder_get_widget (state
->base
.gui
, "c_entry");
1252 gtk_spin_button_set_value (GTK_SPIN_BUTTON (state
->c_entry
), 0.95);
1253 state
->l_entry
= go_gtk_builder_get_widget (state
->base
.gui
, "l_entry");
1254 int_to_entry (GTK_ENTRY (state
->l_entry
), 1);
1255 state
->s_entry
= go_gtk_builder_get_widget (state
->base
.gui
, "s_entry");
1256 int_to_entry (GTK_ENTRY (state
->s_entry
), 1);
1259 g_signal_connect_after (G_OBJECT (state
->summary_stats_button
),
1261 G_CALLBACK (desc_stat_tool_update_sensitivity_cb
), state
);
1262 g_signal_connect_after (G_OBJECT (state
->mean_stats_button
),
1264 G_CALLBACK (desc_stat_tool_update_sensitivity_cb
), state
);
1265 g_signal_connect_after (G_OBJECT (state
->kth_largest_button
),
1267 G_CALLBACK (desc_stat_tool_update_sensitivity_cb
), state
);
1268 g_signal_connect_after (G_OBJECT (state
->kth_smallest_button
),
1270 G_CALLBACK (desc_stat_tool_update_sensitivity_cb
), state
);
1271 g_signal_connect_after (G_OBJECT (state
->c_entry
),
1273 G_CALLBACK (desc_stat_tool_update_sensitivity_cb
), state
);
1274 g_signal_connect_after (G_OBJECT (state
->l_entry
),
1276 G_CALLBACK (desc_stat_tool_update_sensitivity_cb
), state
);
1277 g_signal_connect_after (G_OBJECT (state
->s_entry
),
1279 G_CALLBACK (desc_stat_tool_update_sensitivity_cb
), state
);
1280 gnm_editable_enters (GTK_WINDOW (state
->base
.dialog
),
1281 GTK_WIDGET (state
->c_entry
));
1282 gnm_editable_enters (GTK_WINDOW (state
->base
.dialog
),
1283 GTK_WIDGET (state
->l_entry
));
1284 gnm_editable_enters (GTK_WINDOW (state
->base
.dialog
),
1285 GTK_WIDGET (state
->s_entry
));
1287 gnm_dao_set_put (GNM_DAO (state
->base
.gdao
), TRUE
, TRUE
);
1288 desc_stat_tool_update_sensitivity_cb (NULL
, state
);
1289 tool_load_selection ((GenericToolState
*)state
, TRUE
);
1295 /**********************************************/
1296 /* End of descriptive statistics tool code */
1297 /**********************************************/
1300 /**********************************************/
1301 /* Begin of ttest tool code */
1302 /**********************************************/
1305 * ttest_tool_ok_clicked_cb:
1309 * Retrieve the information from the dialog and call the appropriate tool.
1310 * Note that we assume that the ok_button is only active if the entry fields
1311 * contain sensible data.
1314 ttest_tool_ok_clicked_cb (G_GNUC_UNUSED GtkWidget
*button
,
1317 data_analysis_output_t
*dao
;
1318 analysis_tools_data_ttests_t
*data
;
1323 data
= g_new0 (analysis_tools_data_ttests_t
, 1);
1324 dao
= parse_output ((GenericToolState
*)state
, NULL
);
1326 data
->base
.wbc
= GNM_WBC (state
->base
.wbcg
);
1328 if (state
->base
.warning_dialog
!= NULL
)
1329 gtk_widget_destroy (state
->base
.warning_dialog
);
1331 data
->base
.range_1
= gnm_expr_entry_parse_as_value
1332 (GNM_EXPR_ENTRY (state
->base
.input_entry
), state
->base
.sheet
);
1334 data
->base
.range_2
= gnm_expr_entry_parse_as_value
1335 (GNM_EXPR_ENTRY (state
->base
.input_entry_2
), state
->base
.sheet
);
1337 w
= go_gtk_builder_get_widget (state
->base
.gui
, "labels_button");
1338 data
->base
.labels
= gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w
));
1340 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (state
->paired_button
)) == 1) {
1341 state
->invocation
= TTEST_PAIRED
;
1343 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (state
->known_button
)) == 1) {
1344 state
->invocation
= TTEST_ZTEST
;
1346 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
1347 (state
->equal_button
)) == 1) {
1348 state
->invocation
= TTEST_UNPAIRED_EQUALVARIANCES
;
1350 state
->invocation
= TTEST_UNPAIRED_UNEQUALVARIANCES
;
1355 err
= entry_to_float (GTK_ENTRY (state
->mean_diff_entry
), &data
->mean_diff
, TRUE
);
1356 err
= entry_to_float (GTK_ENTRY (state
->alpha_entry
), &data
->base
.alpha
, TRUE
);
1358 switch (state
->invocation
) {
1360 if (!cmd_analysis_tool (GNM_WBC (state
->base
.wbcg
),
1362 dao
, data
, analysis_tool_ttest_paired_engine
,
1364 gtk_widget_destroy (state
->base
.dialog
);
1366 case TTEST_UNPAIRED_EQUALVARIANCES
:
1367 if (!cmd_analysis_tool (GNM_WBC (state
->base
.wbcg
), state
->base
.sheet
,
1368 dao
, data
, analysis_tool_ttest_eqvar_engine
, TRUE
))
1369 gtk_widget_destroy (state
->base
.dialog
);
1371 case TTEST_UNPAIRED_UNEQUALVARIANCES
:
1372 if (!cmd_analysis_tool (GNM_WBC (state
->base
.wbcg
), state
->base
.sheet
,
1373 dao
, data
, analysis_tool_ttest_neqvar_engine
, TRUE
))
1374 gtk_widget_destroy (state
->base
.dialog
);
1377 err
= entry_to_float (GTK_ENTRY (state
->var1_variance
), &data
->var1
, TRUE
);
1378 if (err
!= 0 || data
->var1
<= 0.0) {
1379 error_in_entry ((GenericToolState
*) state
, GTK_WIDGET (state
->var1_variance
),
1380 _("Please enter a valid\n"
1381 "population variance for variable 1."));
1386 err
= entry_to_float (GTK_ENTRY (state
->var2_variance
), &data
->var2
, TRUE
);
1387 if (err
!= 0 || data
->var2
<= 0.0) {
1388 error_in_entry ((GenericToolState
*) state
, GTK_WIDGET (state
->var2_variance
),
1389 _("Please enter a valid\n"
1390 "population variance for variable 2."));
1396 if (!cmd_analysis_tool (GNM_WBC (state
->base
.wbcg
), state
->base
.sheet
,
1397 dao
, data
, analysis_tool_ztest_engine
, TRUE
))
1398 gtk_widget_destroy (state
->base
.dialog
);
1406 * ttest_update_sensitivity_cb:
1410 * Update the dialog widgets sensitivity if the only items of interest
1411 * are the standard input (one or two ranges) and output items.
1414 ttest_update_sensitivity_cb (G_GNUC_UNUSED GtkWidget
*dummy
,
1417 gboolean ready
= FALSE
;
1418 gboolean input_1_ready
= FALSE
;
1419 gboolean input_2_ready
= FALSE
;
1420 gboolean output_ready
= FALSE
;
1421 gboolean mean_diff_ready
= FALSE
;
1422 gboolean alpha_ready
= FALSE
;
1424 gnm_float mean_diff
, alpha
;
1425 GnmValue
*input_range
;
1426 GnmValue
*input_range_2
;
1428 input_range
= gnm_expr_entry_parse_as_value
1429 (GNM_EXPR_ENTRY (state
->base
.input_entry
), state
->base
.sheet
);
1430 input_range_2
= gnm_expr_entry_parse_as_value
1431 (GNM_EXPR_ENTRY (state
->base
.input_entry_2
), state
->base
.sheet
);
1433 err
= entry_to_float (GTK_ENTRY (state
->mean_diff_entry
), &mean_diff
, FALSE
);
1434 mean_diff_ready
= (err
== 0);
1435 err
= entry_to_float (GTK_ENTRY (state
->alpha_entry
), &alpha
, FALSE
);
1436 alpha_ready
= (err
== 0 && alpha
> 0.0 && alpha
< 1.0);
1437 input_1_ready
= (input_range
!= NULL
);
1438 input_2_ready
= ((state
->base
.input_entry_2
== NULL
) || (input_range_2
!= NULL
));
1439 output_ready
= gnm_dao_is_ready (GNM_DAO (state
->base
.gdao
));
1441 value_release (input_range
);
1442 value_release (input_range_2
);
1444 ready
= input_1_ready
&& input_2_ready
&& output_ready
&& alpha_ready
&& mean_diff_ready
;
1445 gtk_widget_set_sensitive (state
->base
.ok_button
, ready
);
1451 * ttest_known_toggled_cb:
1455 * The paired/unpaired variables status has changed.
1459 ttest_known_toggled_cb (GtkWidget
*button
, TTestState
*state
)
1461 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button
)) == 1) {
1462 gtk_widget_hide (state
->equal_button
);
1463 gtk_widget_hide (state
->unequal_button
);
1464 gtk_widget_hide (state
->varianceequal_label
);
1465 gtk_widget_show (state
->var2_variance_label
);
1466 gtk_widget_show (state
->var2_variance
);
1467 gtk_widget_show (state
->var1_variance_label
);
1468 gtk_widget_show (state
->var1_variance
);
1470 gtk_widget_hide (state
->var2_variance_label
);
1471 gtk_widget_hide (state
->var2_variance
);
1472 gtk_widget_hide (state
->var1_variance_label
);
1473 gtk_widget_hide (state
->var1_variance
);
1474 gtk_widget_show (state
->equal_button
);
1475 gtk_widget_show (state
->unequal_button
);
1476 gtk_widget_show (state
->varianceequal_label
);
1480 * ttest_paired_toggled_cb:
1484 * The paired/unpaired variables status has changed.
1488 ttest_paired_toggled_cb (GtkWidget
*button
, TTestState
*state
)
1490 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button
)) == 1) {
1491 gtk_widget_hide (state
->var2_variance_label
);
1492 gtk_widget_hide (state
->var2_variance
);
1493 gtk_widget_hide (state
->var1_variance_label
);
1494 gtk_widget_hide (state
->var1_variance
);
1495 gtk_widget_hide (state
->equal_button
);
1496 gtk_widget_hide (state
->unequal_button
);
1497 gtk_widget_hide (state
->varianceequal_label
);
1498 gtk_widget_hide (state
->known_button
);
1499 gtk_widget_hide (state
->unknown_button
);
1500 gtk_widget_hide (state
->varianceknown_label
);
1502 gtk_widget_show (state
->known_button
);
1503 gtk_widget_show (state
->unknown_button
);
1504 gtk_widget_show (state
->varianceknown_label
);
1505 ttest_known_toggled_cb (GTK_WIDGET (state
->known_button
), state
);
1510 * dialog_ttest_adjust_to_invocation:
1513 * Set the options to match the invocation.
1517 dialog_ttest_adjust_to_invocation (TTestState
*state
)
1519 switch (state
->invocation
) {
1521 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state
->paired_button
), TRUE
);
1523 case TTEST_UNPAIRED_EQUALVARIANCES
:
1524 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state
->equal_button
), TRUE
);
1525 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state
->unknown_button
), TRUE
);
1526 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state
->unpaired_button
), TRUE
);
1528 case TTEST_UNPAIRED_UNEQUALVARIANCES
:
1529 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state
->unequal_button
), TRUE
);
1530 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state
->unknown_button
), TRUE
);
1531 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state
->unpaired_button
), TRUE
);
1534 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state
->known_button
), TRUE
);
1535 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state
->unpaired_button
), TRUE
);
1544 * dialog_ttest_realized:
1548 * Fix the size of the options table.
1552 dialog_ttest_realized (G_GNUC_UNUSED GtkWidget
*widget
,
1555 GtkAllocation alloc
;
1557 gtk_widget_get_allocation (state
->options_grid
, &alloc
);
1558 gtk_widget_set_size_request (state
->options_grid
,
1559 alloc
.width
, alloc
.height
);
1561 gtk_widget_get_allocation (state
->paired_button
, &alloc
);
1562 gtk_widget_set_size_request (state
->paired_button
,
1563 alloc
.width
, alloc
.height
);
1565 gtk_widget_get_allocation (state
->unpaired_button
, &alloc
);
1566 gtk_widget_set_size_request (state
->unpaired_button
,
1567 alloc
.width
, alloc
.height
);
1569 gtk_widget_get_allocation (state
->variablespaired_label
, &alloc
);
1570 gtk_widget_set_size_request (state
->variablespaired_label
,
1571 alloc
.width
, alloc
.height
);
1573 ttest_paired_toggled_cb (state
->paired_button
, state
);
1574 dialog_ttest_adjust_to_invocation (state
);
1578 * dialog_ttest_tool:
1583 * Show the dialog (guru).
1587 dialog_ttest_tool (WBCGtk
*wbcg
, Sheet
*sheet
, ttest_type test
)
1591 char const * plugins
[] = {"Gnumeric_fnstat",
1594 "Gnumeric_fnlogical",
1597 if ((wbcg
== NULL
) ||
1598 gnm_check_for_plugins_missing (plugins
, wbcg_toplevel (wbcg
)))
1601 /* Only pop up one copy per workbook */
1602 dialog
= gnm_dialog_raise_if_exists (wbcg
, TTEST_KEY
);
1604 state
= g_object_get_data (G_OBJECT (dialog
), "state");
1605 state
->invocation
= test
;
1606 dialog_ttest_adjust_to_invocation (state
);
1610 state
= g_new0 (TTestState
, 1);
1611 state
->invocation
= test
;
1613 if (dialog_tool_init (&state
->base
, wbcg
, sheet
,
1614 GNUMERIC_HELP_LINK_MEAN_TESTS
,
1615 "res:ui/mean-tests.ui", "MeanTests",
1616 _("Could not create the Mean Tests Tool dialog."),
1618 G_CALLBACK (ttest_tool_ok_clicked_cb
), NULL
,
1619 G_CALLBACK (ttest_update_sensitivity_cb
),
1620 GNM_EE_SINGLE_RANGE
))
1626 state
->paired_button
= go_gtk_builder_get_widget (state
->base
.gui
, "paired-button");
1627 state
->unpaired_button
= go_gtk_builder_get_widget (state
->base
.gui
, "unpaired-button");
1628 state
->variablespaired_label
= go_gtk_builder_get_widget (state
->base
.gui
, "variablespaired-label");
1629 state
->known_button
= go_gtk_builder_get_widget (state
->base
.gui
, "known-button");
1630 state
->unknown_button
= go_gtk_builder_get_widget (state
->base
.gui
, "unknown-button");
1631 state
->varianceknown_label
= go_gtk_builder_get_widget (state
->base
.gui
, "varianceknown-label");
1632 state
->equal_button
= go_gtk_builder_get_widget (state
->base
.gui
, "equal-button");
1633 state
->unequal_button
= go_gtk_builder_get_widget (state
->base
.gui
, "unequal-button");
1634 state
->varianceequal_label
= go_gtk_builder_get_widget (state
->base
.gui
, "varianceequal-label");
1635 state
->options_grid
= go_gtk_builder_get_widget (state
->base
.gui
, "options-grid");
1636 state
->var1_variance_label
= go_gtk_builder_get_widget (state
->base
.gui
, "var1_variance-label");
1637 state
->var1_variance
= go_gtk_builder_get_widget (state
->base
.gui
, "var1-variance");
1638 state
->var2_variance_label
= go_gtk_builder_get_widget (state
->base
.gui
, "var2_variance-label");
1639 state
->var2_variance
= go_gtk_builder_get_widget (state
->base
.gui
, "var2-variance");
1640 state
->mean_diff_entry
= go_gtk_builder_get_widget (state
->base
.gui
, "meandiff");
1641 float_to_entry (GTK_ENTRY (state
->mean_diff_entry
), 0);
1642 state
->alpha_entry
= go_gtk_builder_get_widget (state
->base
.gui
, "one_alpha");
1643 float_to_entry (GTK_ENTRY (state
->alpha_entry
), 0.05);
1645 g_signal_connect_after (G_OBJECT (state
->paired_button
),
1647 G_CALLBACK (ttest_update_sensitivity_cb
), state
);
1648 g_signal_connect (G_OBJECT (state
->paired_button
),
1650 G_CALLBACK (ttest_paired_toggled_cb
), state
);
1651 g_signal_connect_after (G_OBJECT (state
->known_button
),
1653 G_CALLBACK (ttest_update_sensitivity_cb
), state
);
1654 g_signal_connect_after (G_OBJECT (state
->mean_diff_entry
),
1656 G_CALLBACK (ttest_update_sensitivity_cb
), state
);
1657 g_signal_connect_after (G_OBJECT (state
->alpha_entry
),
1659 G_CALLBACK (ttest_update_sensitivity_cb
), state
);
1660 g_signal_connect (G_OBJECT (state
->known_button
),
1662 G_CALLBACK (ttest_known_toggled_cb
), state
);
1663 g_signal_connect (G_OBJECT (state
->base
.dialog
),
1665 G_CALLBACK (dialog_ttest_realized
), state
);
1666 gnm_editable_enters (GTK_WINDOW (state
->base
.dialog
),
1667 GTK_WIDGET (state
->var1_variance
));
1668 gnm_editable_enters (GTK_WINDOW (state
->base
.dialog
),
1669 GTK_WIDGET (state
->var2_variance
));
1670 gnm_editable_enters (GTK_WINDOW (state
->base
.dialog
),
1671 GTK_WIDGET (state
->mean_diff_entry
));
1672 gnm_editable_enters (GTK_WINDOW (state
->base
.dialog
),
1673 GTK_WIDGET (state
->alpha_entry
));
1675 gnm_dao_set_put (GNM_DAO (state
->base
.gdao
), TRUE
, TRUE
);
1676 ttest_update_sensitivity_cb (NULL
, state
);
1677 tool_load_selection ((GenericToolState
*)state
, FALSE
);
1682 /**********************************************/
1683 /* End of ttest tool code */
1684 /**********************************************/
1687 /**********************************************/
1688 /* Begin of ftest tool code */
1689 /**********************************************/
1693 * ftest_tool_ok_clicked_cb:
1697 * Retrieve the information from the dialog and call the correlation_tool.
1698 * Note that we assume that the ok_button is only active if the entry fields
1699 * contain sensible data.
1702 ftest_tool_ok_clicked_cb (G_GNUC_UNUSED GtkWidget
*button
,
1703 FTestToolState
*state
)
1705 data_analysis_output_t
*dao
;
1706 analysis_tools_data_generic_b_t
*data
;
1710 data
= g_new0 (analysis_tools_data_generic_b_t
, 1);
1711 dao
= parse_output ((GenericToolState
*)state
, NULL
);
1713 data
->wbc
= GNM_WBC (state
->base
.wbcg
);
1715 if (state
->base
.warning_dialog
!= NULL
)
1716 gtk_widget_destroy (state
->base
.warning_dialog
);
1718 data
->range_1
= gnm_expr_entry_parse_as_value
1719 (GNM_EXPR_ENTRY (state
->base
.input_entry
), state
->base
.sheet
);
1721 data
->range_2
= gnm_expr_entry_parse_as_value
1722 (GNM_EXPR_ENTRY (state
->base
.input_entry_2
), state
->base
.sheet
);
1724 w
= go_gtk_builder_get_widget (state
->base
.gui
, "labels_button");
1725 data
->labels
= gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w
));
1727 entry_to_float (GTK_ENTRY (state
->alpha_entry
), &data
->alpha
, TRUE
);
1729 if (!cmd_analysis_tool (GNM_WBC (state
->base
.wbcg
), state
->base
.sheet
,
1730 dao
, data
, analysis_tool_ftest_engine
, TRUE
))
1731 gtk_widget_destroy (state
->base
.dialog
);
1737 * ftest_update_sensitivity_cb:
1741 * Update the dialog widgets sensitivity if the only items of interest
1742 * are the standard input (one or two ranges) and output items.
1745 ftest_update_sensitivity_cb (G_GNUC_UNUSED GtkWidget
*dummy
,
1746 FTestToolState
*state
)
1748 gboolean ready
= FALSE
;
1749 gboolean input_1_ready
= FALSE
;
1750 gboolean input_2_ready
= FALSE
;
1751 gboolean output_ready
= FALSE
;
1752 gboolean alpha_ready
= FALSE
;
1755 GnmValue
*input_range
;
1756 GnmValue
*input_range_2
;
1758 input_range
= gnm_expr_entry_parse_as_value
1759 (GNM_EXPR_ENTRY (state
->base
.input_entry
), state
->base
.sheet
);
1760 input_range_2
= gnm_expr_entry_parse_as_value
1761 (GNM_EXPR_ENTRY (state
->base
.input_entry_2
), state
->base
.sheet
);
1763 err
= entry_to_float (GTK_ENTRY (state
->alpha_entry
), &alpha
, FALSE
);
1764 alpha_ready
= (err
== 0 && alpha
> 0.0 && alpha
< 1.0);
1765 input_1_ready
= (input_range
!= NULL
);
1766 input_2_ready
= ((state
->base
.input_entry_2
== NULL
) || (input_range_2
!= NULL
));
1767 output_ready
= gnm_dao_is_ready (GNM_DAO (state
->base
.gdao
));
1769 value_release (input_range
);
1770 value_release (input_range_2
);
1772 ready
= input_1_ready
&& input_2_ready
&& output_ready
&& alpha_ready
;
1773 gtk_widget_set_sensitive (state
->base
.ok_button
, ready
);
1779 * dialog_ftest_tool:
1783 * Show the dialog (guru).
1787 dialog_ftest_tool (WBCGtk
*wbcg
, Sheet
*sheet
)
1789 FTestToolState
*state
;
1790 char const * plugins
[] = { "Gnumeric_fnstat",
1793 if ((wbcg
== NULL
) ||
1794 gnm_check_for_plugins_missing (plugins
, wbcg_toplevel (wbcg
)))
1797 /* Only pop up one copy per workbook */
1798 if (gnm_dialog_raise_if_exists (wbcg
, FTEST_KEY
))
1801 state
= g_new0 (FTestToolState
, 1);
1803 if (dialog_tool_init (&state
->base
, wbcg
, sheet
,
1804 GNUMERIC_HELP_LINK_F_TEST_TWO_SAMPLE
,
1805 "res:ui/variance-tests.ui", "VarianceTests",
1806 _("Could not create the FTest Tool dialog."),
1808 G_CALLBACK (ftest_tool_ok_clicked_cb
), NULL
,
1809 G_CALLBACK (ftest_update_sensitivity_cb
),
1810 GNM_EE_SINGLE_RANGE
))
1816 state
->alpha_entry
= go_gtk_builder_get_widget (state
->base
.gui
, "one_alpha");
1817 float_to_entry (GTK_ENTRY (state
->alpha_entry
), 0.05);
1818 gnm_editable_enters (GTK_WINDOW (state
->base
.dialog
),
1819 GTK_WIDGET (state
->alpha_entry
));
1820 g_signal_connect_after (G_OBJECT (state
->alpha_entry
),
1822 G_CALLBACK (ftest_update_sensitivity_cb
), state
);
1824 gnm_dao_set_put (GNM_DAO (state
->base
.gdao
), TRUE
, TRUE
);
1825 ftest_update_sensitivity_cb (NULL
, state
);
1826 tool_load_selection ((GenericToolState
*)state
, FALSE
);
1831 /**********************************************/
1832 /* End of ftest tool code */
1833 /**********************************************/
1835 /**********************************************/
1836 /* Begin of sampling tool code */
1837 /**********************************************/
1840 * sampling_tool_update_sensitivity:
1844 * Update the dialog widgets sensitivity if the only items of interest
1845 * are the standard input (one range) and output items.
1848 sampling_tool_update_sensitivity_cb (G_GNUC_UNUSED GtkWidget
*dummy
,
1849 SamplingState
*state
)
1851 int periodic
, size
, number
, err
;
1852 GSList
*input_range
;
1854 input_range
= gnm_expr_entry_parse_as_list (
1855 GNM_EXPR_ENTRY (state
->base
.input_entry
), state
->base
.sheet
);
1857 if (input_range
== NULL
) {
1858 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
1859 _("The input range is invalid."));
1860 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
1863 range_list_destroy (input_range
);
1865 err
= entry_to_int (GTK_ENTRY (state
->number_entry
), &number
, FALSE
);
1867 if (err
!= 0 || number
< 1) {
1868 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
1869 _("The requested number of samples is invalid."));
1870 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
1874 periodic
= gtk_toggle_button_get_active
1875 (GTK_TOGGLE_BUTTON (state
->periodic_button
));
1879 (GTK_ENTRY (state
->period_entry
), &size
, FALSE
);
1880 if (err
!= 0 || size
< 1) {
1881 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
1882 _("The requested period is invalid."));
1883 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
1887 (GTK_ENTRY (state
->offset_entry
), &number
, FALSE
);
1888 if (err
!= 0 || number
< 0) {
1889 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
1890 _("The requested offset is invalid."));
1891 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
1896 (GTK_ENTRY (state
->random_entry
), &size
, FALSE
);
1897 if (err
!= 0 || size
< 1) {
1898 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
1899 _("The requested sample size is invalid."));
1900 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
1905 if (!gnm_dao_is_ready (GNM_DAO (state
->base
.gdao
))) {
1906 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
1907 _("The output specification "
1909 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
1913 gtk_label_set_text (GTK_LABEL (state
->base
.warning
), "");
1914 gtk_widget_set_sensitive (state
->base
.ok_button
, TRUE
);
1918 * sampling_tool_ok_clicked_cb:
1922 * Retrieve the information from the dialog and call the appropriate tool.
1923 * Note that we assume that the ok_button is only active if the entry fields
1924 * contain sensible data.
1927 sampling_tool_ok_clicked_cb (G_GNUC_UNUSED GtkWidget
*button
,
1928 SamplingState
*state
)
1930 data_analysis_output_t
*dao
;
1931 analysis_tools_data_sampling_t
*data
;
1935 data
= g_new0 (analysis_tools_data_sampling_t
, 1);
1936 dao
= parse_output ((GenericToolState
*)state
, NULL
);
1938 data
->base
.wbc
= GNM_WBC (state
->base
.wbcg
);
1940 data
->base
.input
= gnm_expr_entry_parse_as_list (
1941 GNM_EXPR_ENTRY (state
->base
.input_entry
), state
->base
.sheet
);
1942 data
->base
.group_by
= gnm_gui_group_value (state
->base
.gui
, grouped_by_group
);
1944 w
= go_gtk_builder_get_widget (state
->base
.gui
, "labels_button");
1945 data
->base
.labels
= gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w
));
1947 data
->periodic
= gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (state
->periodic_button
));
1949 if (data
->periodic
) {
1950 entry_to_int (GTK_ENTRY (state
->period_entry
), &data
->period
, TRUE
);
1951 entry_to_int (GTK_ENTRY (state
->offset_entry
), &data
->offset
, TRUE
);
1952 data
->row_major
= gtk_toggle_button_get_active
1953 (GTK_TOGGLE_BUTTON (state
->row_major_button
));
1955 entry_to_int (GTK_ENTRY (state
->random_entry
), &data
->size
, TRUE
);
1957 entry_to_int (GTK_ENTRY (state
->number_entry
), &data
->number
, TRUE
);
1959 if (!cmd_analysis_tool (GNM_WBC (state
->base
.wbcg
), state
->base
.sheet
,
1960 dao
, data
, analysis_tool_sampling_engine
, TRUE
))
1961 gtk_widget_destroy (state
->base
.dialog
);
1966 * sampling_method_toggled_cb:
1970 * The method status has changed.
1974 sampling_method_toggled_cb (GtkWidget
*button
, SamplingState
*state
)
1976 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button
)) == 1) {
1977 gtk_widget_hide (state
->random_label
);
1978 gtk_widget_hide (state
->random_entry
);
1979 gtk_widget_show (state
->period_label
);
1980 gtk_widget_show (state
->period_entry
);
1981 gtk_widget_show (state
->offset_label
);
1982 gtk_widget_show (state
->offset_entry
);
1983 gtk_widget_show (state
->major_label
);
1984 gtk_widget_show (state
->row_major_button
);
1985 gtk_widget_show (state
->col_major_button
);
1987 gtk_widget_hide (state
->period_label
);
1988 gtk_widget_hide (state
->period_entry
);
1989 gtk_widget_hide (state
->period_entry
);
1990 gtk_widget_hide (state
->offset_label
);
1991 gtk_widget_hide (state
->offset_entry
);
1992 gtk_widget_hide (state
->major_label
);
1993 gtk_widget_hide (state
->row_major_button
);
1994 gtk_widget_hide (state
->col_major_button
);
1995 gtk_widget_show (state
->random_label
);
1996 gtk_widget_show (state
->random_entry
);
2002 * dialog_sampling_realized:
2006 * Fix the size of the options table.
2010 dialog_sampling_realized (G_GNUC_UNUSED GtkWidget
*widget
,
2011 SamplingState
*state
)
2013 GtkAllocation alloc
;
2015 gtk_widget_get_allocation (state
->options_grid
, &alloc
);
2016 gtk_widget_set_size_request (state
->options_grid
,
2017 alloc
.width
, alloc
.height
);
2019 gtk_widget_get_allocation (state
->random_button
, &alloc
);
2020 gtk_widget_set_size_request (state
->random_button
,
2021 alloc
.width
, alloc
.height
);
2023 gtk_widget_get_allocation (state
->periodic_button
, &alloc
);
2024 gtk_widget_set_size_request (state
->periodic_button
,
2025 alloc
.width
, alloc
.height
);
2027 gtk_widget_get_allocation (state
->method_label
, &alloc
);
2028 gtk_widget_set_size_request (state
->method_label
,
2029 alloc
.width
, alloc
.height
);
2031 sampling_method_toggled_cb (state
->periodic_button
, state
);
2035 * dialog_sampling_tool:
2039 * Show the dialog (guru).
2043 dialog_sampling_tool (WBCGtk
*wbcg
, Sheet
*sheet
)
2045 SamplingState
*state
;
2046 char const * plugins
[] = { "Gnumeric_fnlookup",
2047 "Gnumeric_fnrandom",
2050 if ((wbcg
== NULL
) ||
2051 gnm_check_for_plugins_missing (plugins
, wbcg_toplevel (wbcg
)))
2054 /* Only pop up one copy per workbook */
2055 if (gnm_dialog_raise_if_exists (wbcg
, SAMPLING_KEY
)) {
2059 state
= g_new0 (SamplingState
, 1);
2061 if (dialog_tool_init (&state
->base
, wbcg
, sheet
,
2062 GNUMERIC_HELP_LINK_SAMPLING
,
2063 "res:ui/sampling.ui", "Sampling",
2064 _("Could not create the Sampling Tool dialog."),
2066 G_CALLBACK (sampling_tool_ok_clicked_cb
), NULL
,
2067 G_CALLBACK (sampling_tool_update_sensitivity_cb
),
2074 state
->periodic_button
= go_gtk_builder_get_widget (state
->base
.gui
, "periodic-button");
2075 state
->random_button
= go_gtk_builder_get_widget (state
->base
.gui
, "random-button");
2076 state
->method_label
= go_gtk_builder_get_widget (state
->base
.gui
, "method-label");
2077 state
->options_grid
= go_gtk_builder_get_widget (state
->base
.gui
, "options-grid");
2078 state
->period_label
= go_gtk_builder_get_widget (state
->base
.gui
, "period-label");
2079 state
->random_label
= go_gtk_builder_get_widget (state
->base
.gui
, "random-label");
2080 state
->period_entry
= go_gtk_builder_get_widget (state
->base
.gui
, "period-entry");
2081 state
->random_entry
= go_gtk_builder_get_widget (state
->base
.gui
, "random-entry");
2082 state
->number_entry
= go_gtk_builder_get_widget (state
->base
.gui
, "number-entry");
2083 state
->offset_label
= go_gtk_builder_get_widget (state
->base
.gui
, "offset-label");
2084 state
->offset_entry
= go_gtk_builder_get_widget (state
->base
.gui
, "offset-entry");
2085 state
->major_label
= go_gtk_builder_get_widget (state
->base
.gui
, "pdir-label");
2086 state
->row_major_button
= go_gtk_builder_get_widget (state
->base
.gui
, "row-major-button");
2087 state
->col_major_button
= go_gtk_builder_get_widget (state
->base
.gui
, "col-major-button");
2089 int_to_entry (GTK_ENTRY (state
->number_entry
), 1);
2090 int_to_entry (GTK_ENTRY (state
->offset_entry
), 0);
2092 g_signal_connect_after (G_OBJECT (state
->periodic_button
),
2094 G_CALLBACK (sampling_tool_update_sensitivity_cb
), state
);
2095 g_signal_connect (G_OBJECT (state
->periodic_button
),
2097 G_CALLBACK (sampling_method_toggled_cb
), state
);
2098 g_signal_connect (G_OBJECT (state
->base
.dialog
),
2100 G_CALLBACK (dialog_sampling_realized
), state
);
2101 g_signal_connect_after (G_OBJECT (state
->period_entry
),
2103 G_CALLBACK (sampling_tool_update_sensitivity_cb
), state
);
2104 g_signal_connect_after (G_OBJECT (state
->random_entry
),
2106 G_CALLBACK (sampling_tool_update_sensitivity_cb
), state
);
2107 g_signal_connect_after (G_OBJECT (state
->number_entry
),
2109 G_CALLBACK (sampling_tool_update_sensitivity_cb
), state
);
2110 gnm_editable_enters (GTK_WINDOW (state
->base
.dialog
),
2111 GTK_WIDGET (state
->period_entry
));
2112 gnm_editable_enters (GTK_WINDOW (state
->base
.dialog
),
2113 GTK_WIDGET (state
->random_entry
));
2114 gnm_editable_enters (GTK_WINDOW (state
->base
.dialog
),
2115 GTK_WIDGET (state
->number_entry
));
2117 gnm_dao_set_put (GNM_DAO (state
->base
.gdao
), TRUE
, TRUE
);
2118 sampling_tool_update_sensitivity_cb (NULL
, state
);
2119 tool_load_selection ((GenericToolState
*)state
, TRUE
);
2123 /**********************************************/
2124 /* End of sampling tool code */
2125 /**********************************************/
2127 /**********************************************/
2128 /* Begin of Regression tool code */
2129 /**********************************************/
2132 regression_tool_calc_height (GnmValue
*val
)
2136 if (NULL
== range_init_value (&r
, val
))
2138 return range_height (&r
);
2142 regression_tool_calc_width (GnmValue
*val
)
2146 if (NULL
== range_init_value (&r
, val
))
2148 return range_width (&r
);
2153 * regression_tool_ok_clicked_cb:
2157 * Retrieve the information from the dialog and call the regression_tool.
2158 * Note that we assume that the ok_button is only active if the entry fields
2159 * contain sensible data.
2162 regression_tool_ok_clicked_cb (G_GNUC_UNUSED GtkWidget
*button
,
2163 RegressionToolState
*state
)
2165 data_analysis_output_t
*dao
;
2166 analysis_tools_data_regression_t
*data
;
2169 gnm_float confidence
;
2172 if (state
->base
.warning_dialog
!= NULL
)
2173 gtk_widget_destroy (state
->base
.warning_dialog
);
2175 data
= g_new0 (analysis_tools_data_regression_t
, 1);
2176 dao
= parse_output ((GenericToolState
*)state
, NULL
);
2178 data
->base
.wbc
= GNM_WBC (state
->base
.wbcg
);
2180 data
->base
.range_1
= gnm_expr_entry_parse_as_value (
2181 GNM_EXPR_ENTRY (state
->base
.input_entry
), state
->base
.sheet
);
2182 data
->base
.range_2
= gnm_expr_entry_parse_as_value
2183 (GNM_EXPR_ENTRY (state
->base
.input_entry_2
), state
->base
.sheet
);
2185 y_h
= regression_tool_calc_height(data
->base
.range_2
);
2187 data
->group_by
= (y_h
== 1) ? GROUPED_BY_ROW
: GROUPED_BY_COL
;
2189 w
= go_gtk_builder_get_widget (state
->base
.gui
, "labels_button");
2190 data
->base
.labels
= gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w
));
2192 entry_to_float (GTK_ENTRY (state
->confidence_entry
), &confidence
, TRUE
);
2193 data
->base
.alpha
= 1 - confidence
;
2195 w
= go_gtk_builder_get_widget (state
->base
.gui
, "intercept-button");
2196 data
->intercept
= !gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w
));
2198 data
->residual
= gtk_toggle_button_get_active
2199 (GTK_TOGGLE_BUTTON (state
->residuals_check
));
2201 data
->multiple_regression
2202 = !gtk_toggle_button_get_active
2203 (GTK_TOGGLE_BUTTON (state
->simple_linear_regression_radio
));
2205 data
->multiple_y
= gtk_toggle_button_get_active
2206 (GTK_TOGGLE_BUTTON (state
->switch_variables_check
));
2208 if (cmd_analysis_tool (GNM_WBC (state
->base
.wbcg
), state
->base
.sheet
,
2209 dao
, data
, analysis_tool_regression_engine
, FALSE
)) {
2212 text
= g_strdup_printf (
2213 _("An unexpected error has occurred: %d."), data
->base
.err
);
2214 error_in_entry ((GenericToolState
*) state
,
2215 GTK_WIDGET (state
->base
.input_entry
), text
);
2218 value_release (data
->base
.range_1
);
2219 value_release (data
->base
.range_2
);
2223 gtk_widget_destroy (state
->base
.dialog
);
2228 * regression_tool_update_sensitivity_cb:
2231 * Update the dialog widgets sensitivity.
2232 * We cannot use tool_update_sensitivity_cb
2233 * since we are also considering whether in fact
2234 * an interval is given.
2237 regression_tool_update_sensitivity_cb (G_GNUC_UNUSED GtkWidget
*dummy
,
2238 RegressionToolState
*state
)
2241 gnm_float confidence
;
2242 GnmValue
*input_range
;
2243 GnmValue
*input_range_2
;
2248 switch_v
= gtk_toggle_button_get_active
2249 (GTK_TOGGLE_BUTTON (state
->switch_variables_check
));
2251 /* Checking Input Range */
2252 input_range_2
= gnm_expr_entry_parse_as_value (
2253 GNM_EXPR_ENTRY (state
->base
.input_entry_2
), state
->base
.sheet
);
2254 if (input_range_2
== NULL
) {
2255 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
2257 _("The x variable range is invalid.") :
2258 _("The y variable range is invalid.") );
2259 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
2263 y_h
= regression_tool_calc_height(input_range_2
);
2264 y_w
= regression_tool_calc_width (input_range_2
);
2265 value_release (input_range_2
);
2267 if (y_h
== 0 || y_w
== 0) {
2268 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
2270 _("The x variable range is invalid.") :
2271 _("The y variable range is invalid."));
2272 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
2275 if (y_h
!= 1 && y_w
!= 1) {
2276 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
2278 _("The x variable range must be a vector (n by 1 or 1 by n).") :
2279 _("The y variable range must be a vector (n by 1 or 1 by n)."));
2280 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
2283 if (y_h
<= 2 && y_w
<= 2) {
2284 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
2286 _("The x variable range is too small") :
2287 _("The y variable range is too small"));
2288 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
2292 input_range
= gnm_expr_entry_parse_as_value
2293 (GNM_EXPR_ENTRY (state
->base
.input_entry
), state
->base
.sheet
);
2294 if (input_range
== NULL
) {
2295 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
2297 _("The y variables range is invalid.") :
2298 _("The x variables range is invalid."));
2299 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
2303 x_h
= regression_tool_calc_height(input_range
);
2304 x_w
= regression_tool_calc_width (input_range
);
2305 value_release (input_range
);
2307 if (x_h
== 0 || x_w
== 0) {
2308 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
2310 _("The y variables range is invalid.") :
2311 _("The x variables range is invalid."));
2312 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
2316 if ((y_h
== 1 && y_w
!= x_w
) || (y_w
== 1 && y_h
!= x_h
)) {
2317 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
2319 _("The sizes of the y variable and x variables ranges do not match.") :
2320 _("The sizes of the x variable and y variables ranges do not match."));
2321 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
2325 err
= entry_to_float (GTK_ENTRY (state
->confidence_entry
), &confidence
, FALSE
);
2327 if (err
!= 0 || (1 < confidence
|| confidence
< 0)) {
2328 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
2329 _("The confidence level is invalid."));
2330 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
2334 if (!gnm_dao_is_ready (GNM_DAO (state
->base
.gdao
))) {
2335 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
2336 _("The output specification "
2338 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
2342 gtk_label_set_text (GTK_LABEL (state
->base
.warning
), "");
2343 gtk_widget_set_sensitive (state
->base
.ok_button
, TRUE
);
2347 regression_tool_regression_radio_toggled_cb (G_GNUC_UNUSED
2348 GtkToggleButton
*togglebutton
,
2349 RegressionToolState
*state
)
2351 gboolean simple
= gtk_toggle_button_get_active
2352 (GTK_TOGGLE_BUTTON (state
->simple_linear_regression_radio
));
2354 gtk_toggle_button_set_active
2355 (GTK_TOGGLE_BUTTON (state
->switch_variables_check
),
2358 gtk_toggle_button_set_active
2359 (GTK_TOGGLE_BUTTON (state
->residuals_check
), !simple
);
2360 gtk_widget_set_sensitive (state
->residuals_check
, !simple
);
2365 regression_tool_regression_check_toggled_cb (G_GNUC_UNUSED
2366 GtkToggleButton
*togglebutton
,
2367 RegressionToolState
*state
)
2371 w1
= go_gtk_builder_get_widget (state
->base
.gui
, "var1-label");
2372 w2
= go_gtk_builder_get_widget (state
->base
.gui
, "var2-label");
2374 if (gtk_toggle_button_get_active
2375 (GTK_TOGGLE_BUTTON (state
->switch_variables_check
))) {
2376 gtk_toggle_button_set_active
2378 (state
->simple_linear_regression_radio
),
2380 gtk_label_set_markup_with_mnemonic (GTK_LABEL (w1
),
2381 _("_Y variables:"));
2382 gtk_label_set_markup_with_mnemonic (GTK_LABEL (w2
),
2385 gtk_label_set_markup_with_mnemonic (GTK_LABEL (w1
),
2386 _("_X variables:"));
2387 gtk_label_set_markup_with_mnemonic (GTK_LABEL (w2
),
2390 regression_tool_update_sensitivity_cb (NULL
, state
);
2395 * dialog_regression_tool:
2399 * Show the dialog (guru).
2403 dialog_regression_tool (WBCGtk
*wbcg
, Sheet
*sheet
)
2405 RegressionToolState
*state
;
2406 char const * plugins
[] = { "Gnumeric_fnstat",
2407 "Gnumeric_fnlookup",
2410 "Gnumeric_fnstring",
2413 if ((wbcg
== NULL
) ||
2414 gnm_check_for_plugins_missing (plugins
, wbcg_toplevel (wbcg
)))
2417 /* Only pop up one copy per workbook */
2418 if (gnm_dialog_raise_if_exists (wbcg
, REGRESSION_KEY
))
2421 state
= g_new0 (RegressionToolState
, 1);
2423 if (dialog_tool_init (&state
->base
, wbcg
, sheet
,
2424 GNUMERIC_HELP_LINK_REGRESSION
,
2425 "res:ui/regression.ui", "Regression",
2426 _("Could not create the Regression Tool dialog."),
2428 G_CALLBACK (regression_tool_ok_clicked_cb
), NULL
,
2429 G_CALLBACK (regression_tool_update_sensitivity_cb
),
2430 GNM_EE_SINGLE_RANGE
))
2436 state
->confidence_entry
= go_gtk_builder_get_widget (state
->base
.gui
, "confidence-entry");
2437 float_to_entry (GTK_ENTRY (state
->confidence_entry
), 0.95);
2438 g_signal_connect_after (G_OBJECT (state
->confidence_entry
),
2440 G_CALLBACK (regression_tool_update_sensitivity_cb
), state
);
2441 gnm_editable_enters (GTK_WINDOW (state
->base
.dialog
),
2442 GTK_WIDGET (state
->confidence_entry
));
2444 state
->simple_linear_regression_radio
2445 = go_gtk_builder_get_widget
2446 (state
->base
.gui
, "simple-regression-button");
2447 state
->switch_variables_check
2448 = go_gtk_builder_get_widget
2449 (state
->base
.gui
, "multiple-independent-check");
2450 state
->residuals_check
2451 = go_gtk_builder_get_widget
2452 (state
->base
.gui
, "residuals-button");
2453 gtk_toggle_button_set_active
2454 (GTK_TOGGLE_BUTTON (state
->simple_linear_regression_radio
),
2456 gtk_toggle_button_set_active
2457 (GTK_TOGGLE_BUTTON (state
->switch_variables_check
),
2459 gtk_toggle_button_set_active
2460 (GTK_TOGGLE_BUTTON (state
->residuals_check
),
2463 (G_OBJECT (state
->simple_linear_regression_radio
),
2465 G_CALLBACK (regression_tool_regression_radio_toggled_cb
),
2468 (G_OBJECT (state
->switch_variables_check
),
2470 G_CALLBACK (regression_tool_regression_check_toggled_cb
),
2475 gnm_dao_set_put (GNM_DAO (state
->base
.gdao
), TRUE
, TRUE
);
2476 regression_tool_update_sensitivity_cb (NULL
, state
);
2477 tool_load_selection ((GenericToolState
*)state
, TRUE
);
2482 /**********************************************/
2483 /* End of Regression tool code */
2484 /**********************************************/
2486 /**********************************************/
2487 /* Begin of Exponential smoothing tool code */
2488 /**********************************************/
2492 * exp_smoothing_tool_ok_clicked_cb:
2498 exp_smoothing_tool_ok_clicked_cb (G_GNUC_UNUSED GtkWidget
*button
,
2499 ExpSmoothToolState
*state
)
2501 data_analysis_output_t
*dao
;
2502 analysis_tools_data_exponential_smoothing_t
*data
;
2506 data
= g_new0 (analysis_tools_data_exponential_smoothing_t
, 1);
2507 dao
= parse_output ((GenericToolState
*)state
, NULL
);
2509 data
->base
.input
= gnm_expr_entry_parse_as_list (
2510 GNM_EXPR_ENTRY (state
->base
.input_entry
), state
->base
.sheet
);
2511 data
->base
.group_by
= gnm_gui_group_value (state
->base
.gui
, grouped_by_group
);
2513 w
= go_gtk_builder_get_widget (state
->base
.gui
, "labels_button");
2514 data
->base
.labels
= gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w
));
2516 entry_to_float (GTK_ENTRY (state
->damping_fact_entry
),
2517 &data
->damp_fact
, TRUE
);
2518 entry_to_float (GTK_ENTRY (state
->g_damping_fact_entry
),
2519 &data
->g_damp_fact
, TRUE
);
2520 entry_to_float (GTK_ENTRY (state
->s_damping_fact_entry
),
2521 &data
->s_damp_fact
, TRUE
);
2522 entry_to_int (GTK_ENTRY (state
->s_period_entry
),
2523 &data
->s_period
, TRUE
);
2525 data
->std_error_flag
= gtk_toggle_button_get_active
2526 (GTK_TOGGLE_BUTTON (state
->show_std_errors
));
2527 data
->show_graph
= gtk_toggle_button_get_active
2528 (GTK_TOGGLE_BUTTON (state
->graph_button
));
2529 data
->df
= gnm_gui_group_value (state
->base
.gui
, n_group
);
2531 data
->es_type
= gnm_gui_group_value (state
->base
.gui
, exp_smoothing_group
);
2533 if (!cmd_analysis_tool (GNM_WBC (state
->base
.wbcg
), state
->base
.sheet
,
2534 dao
, data
, analysis_tool_exponential_smoothing_engine
,
2536 gtk_widget_destroy (state
->base
.dialog
);
2542 * exp_smoothing_tool_update_sensitivity_cb:
2545 * Update the dialog widgets sensitivity.
2546 * We cannot use tool_update_sensitivity_cb
2547 * since we are also considering whether in fact
2548 * a damping factor is given.
2551 exp_smoothing_tool_update_sensitivity_cb (G_GNUC_UNUSED GtkWidget
*dummy
,
2552 ExpSmoothToolState
*state
)
2555 gnm_float damp_fact
;
2556 GSList
*input_range
;
2558 input_range
= gnm_expr_entry_parse_as_list (
2559 GNM_EXPR_ENTRY (state
->base
.input_entry
), state
->base
.sheet
);
2560 if (input_range
== NULL
) {
2561 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
2562 _("The input range is invalid."));
2563 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
2566 range_list_destroy (input_range
);
2568 switch (gnm_gui_group_value (state
->base
.gui
, exp_smoothing_group
)) {
2569 case exp_smoothing_type_mtes
:
2570 case exp_smoothing_type_ates
:
2571 err
= entry_to_float (GTK_ENTRY (state
->s_damping_fact_entry
),
2573 if (err
!= 0 || damp_fact
< 0 || damp_fact
> 1) {
2574 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
2575 _("The given seasonal damping "
2576 "factor is invalid."));
2577 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
2580 err
= entry_to_int (GTK_ENTRY (state
->s_period_entry
),
2582 if (err
!= 0 || period
< 2) {
2583 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
2584 _("The given seasonal period "
2586 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
2590 case exp_smoothing_type_des
:
2591 err
= entry_to_float (GTK_ENTRY (state
->g_damping_fact_entry
),
2593 if (err
!= 0 || damp_fact
< 0 || damp_fact
> 1) {
2594 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
2595 _("The given growth "
2596 "damping factor is invalid."));
2597 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
2601 case exp_smoothing_type_ses_r
:
2602 case exp_smoothing_type_ses_h
:
2603 err
= entry_to_float (GTK_ENTRY (state
->damping_fact_entry
),
2605 if (err
!= 0 || damp_fact
< 0 || damp_fact
> 1) {
2606 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
2607 _("The given damping factor is invalid."));
2608 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
2614 if (!gnm_dao_is_ready (GNM_DAO (state
->base
.gdao
))) {
2615 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
2616 _("The output specification "
2618 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
2622 gtk_label_set_text (GTK_LABEL (state
->base
.warning
), "");
2623 gtk_widget_set_sensitive (state
->base
.ok_button
, TRUE
);
2627 exp_smoothing_tool_check_error_cb (G_GNUC_UNUSED GtkToggleButton
*togglebutton
, gpointer user_data
)
2629 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (user_data
), TRUE
);
2634 exp_smoothing_ses_h_cb (GtkToggleButton
*togglebutton
, gpointer user_data
)
2636 ExpSmoothToolState
*state
= (ExpSmoothToolState
*)user_data
;
2639 if (!gtk_toggle_button_get_active (togglebutton
))
2642 gtk_widget_set_sensitive (state
->g_damping_fact_entry
, FALSE
);
2643 gtk_widget_set_sensitive (state
->s_damping_fact_entry
, FALSE
);
2644 gtk_widget_set_sensitive (state
->s_period_entry
, FALSE
);
2646 std_error
= gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (state
->show_std_errors
));
2647 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state
->n_button
), TRUE
);
2648 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state
->show_std_errors
), std_error
);
2652 exp_smoothing_ses_r_cb (GtkToggleButton
*togglebutton
, gpointer user_data
)
2654 ExpSmoothToolState
*state
= (ExpSmoothToolState
*)user_data
;
2657 if (!gtk_toggle_button_get_active (togglebutton
))
2660 gtk_widget_set_sensitive (state
->g_damping_fact_entry
, FALSE
);
2661 gtk_widget_set_sensitive (state
->s_damping_fact_entry
, FALSE
);
2662 gtk_widget_set_sensitive (state
->s_period_entry
, FALSE
);
2664 std_error
= gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (state
->show_std_errors
));
2665 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state
->nm1_button
), TRUE
);
2666 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state
->show_std_errors
), std_error
);
2670 exp_smoothing_des_cb (GtkToggleButton
*togglebutton
, gpointer user_data
)
2672 ExpSmoothToolState
*state
= (ExpSmoothToolState
*)user_data
;
2675 if (!gtk_toggle_button_get_active (togglebutton
))
2678 gtk_widget_set_sensitive (state
->g_damping_fact_entry
, TRUE
);
2679 gtk_widget_set_sensitive (state
->s_damping_fact_entry
, FALSE
);
2680 gtk_widget_set_sensitive (state
->s_period_entry
, FALSE
);
2682 std_error
= gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (state
->show_std_errors
));
2683 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state
->nm2_button
), TRUE
);
2684 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state
->show_std_errors
), std_error
);
2688 exp_smoothing_tes_cb (GtkToggleButton
*togglebutton
, gpointer user_data
)
2690 ExpSmoothToolState
*state
= (ExpSmoothToolState
*)user_data
;
2693 if (!gtk_toggle_button_get_active (togglebutton
))
2696 gtk_widget_set_sensitive (state
->g_damping_fact_entry
, TRUE
);
2697 gtk_widget_set_sensitive (state
->s_damping_fact_entry
, TRUE
);
2698 gtk_widget_set_sensitive (state
->s_period_entry
, TRUE
);
2700 std_error
= gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (state
->show_std_errors
));
2701 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state
->nm3_button
), TRUE
);
2702 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state
->show_std_errors
), std_error
);
2706 * dialog_exp_smoothing_tool:
2710 * Show the dialog (guru).
2714 dialog_exp_smoothing_tool (WBCGtk
*wbcg
, Sheet
*sheet
)
2716 ExpSmoothToolState
*state
;
2717 char const * plugins
[] = { "Gnumeric_fnstat",
2718 "Gnumeric_fnlookup",
2720 "Gnumeric_fnlogical",
2723 if ((wbcg
== NULL
) ||
2724 gnm_check_for_plugins_missing (plugins
, wbcg_toplevel (wbcg
)))
2727 /* Only pop up one copy per workbook */
2728 if (gnm_dialog_raise_if_exists (wbcg
, EXP_SMOOTHING_KEY
))
2731 state
= g_new0 (ExpSmoothToolState
, 1);
2733 if (dialog_tool_init (&state
->base
, wbcg
, sheet
,
2734 GNUMERIC_HELP_LINK_EXP_SMOOTHING
,
2735 "res:ui/exp-smoothing.ui",
2737 _("Could not create the Exponential Smoothing "
2740 G_CALLBACK (exp_smoothing_tool_ok_clicked_cb
),
2742 G_CALLBACK (exp_smoothing_tool_update_sensitivity_cb
),
2749 state
->damping_fact_entry
= go_gtk_builder_get_widget (state
->base
.gui
,
2750 "damping-fact-spin");
2751 gtk_spin_button_set_value (GTK_SPIN_BUTTON (state
->damping_fact_entry
), 0.2);
2752 float_to_entry (GTK_ENTRY (state
->damping_fact_entry
), 0.2);
2753 state
->g_damping_fact_entry
= go_gtk_builder_get_widget (state
->base
.gui
,
2754 "g-damping-fact-spin");
2755 gtk_spin_button_set_value (GTK_SPIN_BUTTON (state
->g_damping_fact_entry
), 0.25);
2756 state
->s_damping_fact_entry
= go_gtk_builder_get_widget (state
->base
.gui
,
2757 "s-damping-fact-spin");
2758 gtk_spin_button_set_value (GTK_SPIN_BUTTON (state
->s_damping_fact_entry
), 0.3);
2759 state
->s_period_entry
= go_gtk_builder_get_widget (state
->base
.gui
,
2761 gtk_spin_button_set_value (GTK_SPIN_BUTTON (state
->s_period_entry
), 12.);
2764 state
->n_button
= go_gtk_builder_get_widget (state
->base
.gui
, "n-button");
2765 state
->nm1_button
= go_gtk_builder_get_widget (state
->base
.gui
, "nm1-button");
2766 state
->nm2_button
= go_gtk_builder_get_widget (state
->base
.gui
, "nm2-button");
2767 state
->nm3_button
= go_gtk_builder_get_widget (state
->base
.gui
, "nm3-button");
2769 state
->show_std_errors
= go_gtk_builder_get_widget (state
->base
.gui
, "std-errors-button");
2770 state
->graph_button
= go_gtk_builder_get_widget (state
->base
.gui
, "graph-check");
2772 state
->ses_h_button
= go_gtk_builder_get_widget (state
->base
.gui
, "ses-h-button");
2773 state
->ses_r_button
= go_gtk_builder_get_widget (state
->base
.gui
, "ses-r-button");
2774 state
->des_button
= go_gtk_builder_get_widget (state
->base
.gui
, "des-button");
2775 state
->ates_button
= go_gtk_builder_get_widget (state
->base
.gui
, "ates-button");
2776 state
->mtes_button
= go_gtk_builder_get_widget (state
->base
.gui
, "mtes-button");
2778 g_signal_connect_after (G_OBJECT (state
->n_button
),
2780 G_CALLBACK (exp_smoothing_tool_check_error_cb
), state
->show_std_errors
);
2781 g_signal_connect_after (G_OBJECT (state
->nm1_button
),
2783 G_CALLBACK (exp_smoothing_tool_check_error_cb
), state
->show_std_errors
);
2784 g_signal_connect_after (G_OBJECT (state
->nm2_button
),
2786 G_CALLBACK (exp_smoothing_tool_check_error_cb
), state
->show_std_errors
);
2787 g_signal_connect_after (G_OBJECT (state
->nm3_button
),
2789 G_CALLBACK (exp_smoothing_tool_check_error_cb
), state
->show_std_errors
);
2790 g_signal_connect_after (G_OBJECT (state
->damping_fact_entry
),
2792 G_CALLBACK (exp_smoothing_tool_update_sensitivity_cb
), state
);
2794 g_signal_connect_after (G_OBJECT (state
->ses_h_button
),
2796 G_CALLBACK (exp_smoothing_ses_h_cb
), state
);
2797 g_signal_connect_after (G_OBJECT (state
->ses_r_button
),
2799 G_CALLBACK (exp_smoothing_ses_r_cb
), state
);
2800 g_signal_connect_after (G_OBJECT (state
->des_button
),
2802 G_CALLBACK (exp_smoothing_des_cb
), state
);
2803 g_signal_connect_after (G_OBJECT (state
->ates_button
),
2805 G_CALLBACK (exp_smoothing_tes_cb
), state
);
2806 g_signal_connect_after (G_OBJECT (state
->mtes_button
),
2808 G_CALLBACK (exp_smoothing_tes_cb
), state
);
2810 gnm_editable_enters (GTK_WINDOW (state
->base
.dialog
),
2811 GTK_WIDGET (state
->damping_fact_entry
));
2812 gnm_editable_enters (GTK_WINDOW (state
->base
.dialog
),
2813 GTK_WIDGET (state
->g_damping_fact_entry
));
2814 gnm_editable_enters (GTK_WINDOW (state
->base
.dialog
),
2815 GTK_WIDGET (state
->s_damping_fact_entry
));
2817 gnm_dao_set_put (GNM_DAO (state
->base
.gdao
), TRUE
, TRUE
);
2818 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state
->ses_h_button
), TRUE
);
2819 exp_smoothing_ses_h_cb (GTK_TOGGLE_BUTTON (state
->ses_h_button
), state
);
2820 exp_smoothing_tool_update_sensitivity_cb (NULL
, state
);
2821 tool_load_selection ((GenericToolState
*)state
, TRUE
);
2826 /**********************************************/
2827 /* End of Exponential Smoothing tool code */
2828 /**********************************************/
2830 /**********************************************/
2831 /* Begin of Moving Averages tool code */
2832 /**********************************************/
2836 * average_tool_ok_clicked_cb:
2840 * Retrieve the information from the dialog and call the average_tool.
2841 * Note that we assume that the ok_button is only active if the entry fields
2842 * contain sensible data.
2845 average_tool_ok_clicked_cb (G_GNUC_UNUSED GtkWidget
*button
,
2846 AverageToolState
*state
)
2848 data_analysis_output_t
*dao
;
2849 analysis_tools_data_moving_average_t
*data
;
2853 data
= g_new0 (analysis_tools_data_moving_average_t
, 1);
2854 dao
= parse_output ((GenericToolState
*)state
, NULL
);
2856 data
->base
.input
= gnm_expr_entry_parse_as_list (
2857 GNM_EXPR_ENTRY (state
->base
.input_entry
), state
->base
.sheet
);
2858 data
->base
.group_by
= gnm_gui_group_value (state
->base
.gui
, grouped_by_group
);
2860 w
= go_gtk_builder_get_widget (state
->base
.gui
, "labels_button");
2861 data
->base
.labels
= gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w
));
2863 entry_to_int (GTK_ENTRY (state
->interval_entry
), &data
->interval
, TRUE
);
2864 entry_to_int (GTK_ENTRY (state
->offset_spin
), &data
->offset
, TRUE
);
2866 data
->std_error_flag
= gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (state
->show_std_errors
));
2867 data
->show_graph
= gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (state
->graph_button
));
2869 data
->df
= gnm_gui_group_value (state
->base
.gui
, n_group
);
2871 data
->ma_type
= gnm_gui_group_value (state
->base
.gui
, moving_average_group
);
2873 switch (data
->ma_type
) {
2874 case moving_average_type_sma
:
2875 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (state
->central_button
))
2876 && (data
->interval
% 2 == 0))
2877 data
->ma_type
= moving_average_type_central_sma
;
2879 case moving_average_type_cma
:
2883 case moving_average_type_spencer_ma
:
2884 data
->interval
= 15;
2887 case moving_average_type_wma
:
2894 if (!cmd_analysis_tool (GNM_WBC (state
->base
.wbcg
), state
->base
.sheet
,
2895 dao
, data
, analysis_tool_moving_average_engine
, TRUE
))
2896 gtk_widget_destroy (state
->base
.dialog
);
2902 * average_tool_update_sensitivity_cb:
2905 * Update the dialog widgets sensitivity.
2906 * We cannot use tool_update_sensitivity_cb
2907 * since we are also considering whether in fact
2908 * an interval is given.
2911 average_tool_update_sensitivity_cb (G_GNUC_UNUSED GtkWidget
*dummy
,
2912 AverageToolState
*state
)
2914 int interval
, err
, offset
;
2915 GSList
*input_range
;
2916 moving_average_type_t type
;
2919 input_range
= gnm_expr_entry_parse_as_list (
2920 GNM_EXPR_ENTRY (state
->base
.input_entry
), state
->base
.sheet
);
2921 if (input_range
== NULL
) {
2922 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
2923 _("The input range is invalid."));
2924 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
2927 range_list_destroy (input_range
);
2929 type
= gnm_gui_group_value (state
->base
.gui
, moving_average_group
);
2931 if ((type
== moving_average_type_sma
) || (type
== moving_average_type_wma
)) {
2932 err
= entry_to_int (GTK_ENTRY (state
->interval_entry
),
2934 if (err
!= 0 || interval
<= 0) {
2935 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
2936 _("The given interval is invalid."));
2937 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
2942 if (type
== moving_average_type_sma
) {
2943 err
= entry_to_int (GTK_ENTRY (state
->offset_spin
), &offset
, FALSE
);
2944 if (err
!= 0 || offset
< 0 || offset
> interval
) {
2945 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
2946 _("The given offset is invalid."));
2947 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
2952 if (!gnm_dao_is_ready (GNM_DAO (state
->base
.gdao
))) {
2953 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
2954 _("The output specification "
2956 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
2960 gtk_label_set_text (GTK_LABEL (state
->base
.warning
), "");
2961 gtk_widget_set_sensitive (state
->base
.ok_button
, TRUE
);
2965 average_tool_check_error_cb (G_GNUC_UNUSED GtkToggleButton
*togglebutton
, gpointer user_data
)
2967 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (user_data
), TRUE
);
2971 average_tool_central_cb (GtkToggleButton
*togglebutton
, gpointer user_data
)
2973 AverageToolState
*state
= (AverageToolState
*)user_data
;
2977 if (gtk_toggle_button_get_active (togglebutton
)) {
2978 err
= entry_to_int (GTK_ENTRY (state
->interval_entry
), &interval
, TRUE
);
2980 gtk_spin_button_set_value (GTK_SPIN_BUTTON (state
->offset_spin
), (interval
/2));
2985 average_tool_prior_cb (GtkToggleButton
*togglebutton
, gpointer user_data
)
2987 AverageToolState
*state
= (AverageToolState
*)user_data
;
2989 if (gtk_toggle_button_get_active (togglebutton
))
2990 gtk_spin_button_set_value (GTK_SPIN_BUTTON (state
->offset_spin
), 0.0);
2994 average_tool_interval_cb (G_GNUC_UNUSED GtkWidget
*dummy
, AverageToolState
*state
)
2999 err
= entry_to_int (GTK_ENTRY (state
->interval_entry
), &interval
, TRUE
);
3002 gtk_spin_button_set_range (GTK_SPIN_BUTTON (state
->offset_spin
),
3004 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (state
->central_button
)))
3005 gtk_spin_button_set_value (GTK_SPIN_BUTTON (state
->offset_spin
), interval
/2);
3009 average_tool_offset_cb (GtkToggleButton
*togglebutton
, gpointer user_data
)
3011 AverageToolState
*state
= (AverageToolState
*)user_data
;
3013 gtk_widget_set_sensitive (state
->offset_spin
, gtk_toggle_button_get_active (togglebutton
));
3018 average_tool_sma_cb (GtkToggleButton
*togglebutton
, gpointer user_data
)
3020 AverageToolState
*state
= (AverageToolState
*)user_data
;
3022 if (!gtk_toggle_button_get_active (togglebutton
))
3025 gtk_widget_set_sensitive (state
->prior_button
, TRUE
);
3026 gtk_widget_set_sensitive (state
->central_button
, TRUE
);
3027 gtk_widget_set_sensitive (state
->offset_button
, TRUE
);
3028 gtk_widget_set_sensitive (state
->interval_entry
, TRUE
);
3029 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state
->prior_button
), TRUE
);
3030 average_tool_update_sensitivity_cb (NULL
, state
);
3034 average_tool_cma_cb (GtkToggleButton
*togglebutton
, gpointer user_data
)
3036 AverageToolState
*state
= (AverageToolState
*)user_data
;
3038 if (!gtk_toggle_button_get_active (togglebutton
))
3041 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state
->prior_button
), TRUE
);
3042 gtk_widget_set_sensitive (state
->prior_button
, FALSE
);
3043 gtk_widget_set_sensitive (state
->central_button
, FALSE
);
3044 gtk_widget_set_sensitive (state
->offset_button
, FALSE
);
3045 gtk_widget_set_sensitive (state
->interval_entry
, FALSE
);
3046 average_tool_update_sensitivity_cb (NULL
, state
);
3050 average_tool_wma_cb (GtkToggleButton
*togglebutton
, gpointer user_data
)
3052 AverageToolState
*state
= (AverageToolState
*)user_data
;
3054 if (!gtk_toggle_button_get_active (togglebutton
))
3056 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state
->prior_button
), TRUE
);
3057 gtk_widget_set_sensitive (state
->prior_button
, FALSE
);
3058 gtk_widget_set_sensitive (state
->central_button
, FALSE
);
3059 gtk_widget_set_sensitive (state
->offset_button
, FALSE
);
3060 gtk_widget_set_sensitive (state
->interval_entry
, TRUE
);
3061 average_tool_update_sensitivity_cb (NULL
, state
);
3065 average_tool_spencer_cb (GtkToggleButton
*togglebutton
, gpointer user_data
)
3067 AverageToolState
*state
= (AverageToolState
*)user_data
;
3069 if (!gtk_toggle_button_get_active (togglebutton
))
3071 int_to_entry (GTK_ENTRY (state
->interval_entry
), 15);
3072 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state
->central_button
), TRUE
);
3073 gtk_widget_set_sensitive (state
->prior_button
, FALSE
);
3074 gtk_widget_set_sensitive (state
->central_button
, FALSE
);
3075 gtk_widget_set_sensitive (state
->offset_button
, FALSE
);
3076 gtk_widget_set_sensitive (state
->interval_entry
, FALSE
);
3077 average_tool_update_sensitivity_cb (NULL
, state
);
3081 * dialog_average_tool:
3085 * Show the dialog (guru).
3089 dialog_average_tool (WBCGtk
*wbcg
, Sheet
*sheet
)
3091 AverageToolState
*state
;
3092 char const * plugins
[] = { "Gnumeric_fnstat",
3093 "Gnumeric_fnlookup",
3097 if ((wbcg
== NULL
) ||
3098 gnm_check_for_plugins_missing (plugins
, wbcg_toplevel (wbcg
)))
3101 /* Only pop up one copy per workbook */
3102 if (gnm_dialog_raise_if_exists (wbcg
, AVERAGE_KEY
))
3105 state
= g_new0 (AverageToolState
, 1);
3107 if (dialog_tool_init (&state
->base
, wbcg
, sheet
,
3108 GNUMERIC_HELP_LINK_MOVING_AVERAGES
,
3109 "res:ui/moving-averages.ui",
3111 _("Could not create the Moving Average Tool "
3114 G_CALLBACK (average_tool_ok_clicked_cb
), NULL
,
3115 G_CALLBACK (average_tool_update_sensitivity_cb
),
3122 state
->interval_entry
= go_gtk_builder_get_widget (state
->base
.gui
, "interval-entry");
3123 int_to_entry (GTK_ENTRY (state
->interval_entry
), 3);
3124 state
->n_button
= go_gtk_builder_get_widget (state
->base
.gui
, "n-button");
3125 state
->nm1_button
= go_gtk_builder_get_widget (state
->base
.gui
, "nm1-button");
3126 state
->nm2_button
= go_gtk_builder_get_widget (state
->base
.gui
, "nm2-button");
3127 state
->prior_button
= go_gtk_builder_get_widget (state
->base
.gui
, "prior-button");
3128 state
->central_button
= go_gtk_builder_get_widget (state
->base
.gui
, "central-button");
3129 state
->offset_button
= go_gtk_builder_get_widget (state
->base
.gui
, "offset-button");
3130 state
->offset_spin
= go_gtk_builder_get_widget (state
->base
.gui
, "offset-spinbutton");
3131 state
->show_std_errors
= go_gtk_builder_get_widget (state
->base
.gui
, "std-errors-button");
3132 state
->graph_button
= go_gtk_builder_get_widget (state
->base
.gui
, "graph-check");
3133 state
->sma_button
= go_gtk_builder_get_widget (state
->base
.gui
, "sma-button");
3134 state
->cma_button
= go_gtk_builder_get_widget (state
->base
.gui
, "cma-button");
3135 state
->wma_button
= go_gtk_builder_get_widget (state
->base
.gui
, "wma-button");
3136 state
->spencer_button
= go_gtk_builder_get_widget (state
->base
.gui
, "spencer-ma-button");
3139 g_signal_connect_after (G_OBJECT (state
->n_button
),
3141 G_CALLBACK (average_tool_check_error_cb
), state
->show_std_errors
);
3142 g_signal_connect_after (G_OBJECT (state
->nm1_button
),
3144 G_CALLBACK (average_tool_check_error_cb
), state
->show_std_errors
);
3145 g_signal_connect_after (G_OBJECT (state
->nm2_button
),
3147 G_CALLBACK (average_tool_check_error_cb
), state
->show_std_errors
);
3149 g_signal_connect_after (G_OBJECT (state
->prior_button
),
3151 G_CALLBACK (average_tool_prior_cb
), state
);
3152 g_signal_connect_after (G_OBJECT (state
->central_button
),
3154 G_CALLBACK (average_tool_central_cb
), state
);
3155 g_signal_connect_after (G_OBJECT (state
->offset_button
),
3157 G_CALLBACK (average_tool_offset_cb
), state
);
3159 g_signal_connect_after (G_OBJECT (state
->sma_button
),
3161 G_CALLBACK (average_tool_sma_cb
), state
);
3162 g_signal_connect_after (G_OBJECT (state
->cma_button
),
3164 G_CALLBACK (average_tool_cma_cb
), state
);
3165 g_signal_connect_after (G_OBJECT (state
->wma_button
),
3167 G_CALLBACK (average_tool_wma_cb
), state
);
3168 g_signal_connect_after (G_OBJECT (state
->spencer_button
),
3170 G_CALLBACK (average_tool_spencer_cb
), state
);
3173 g_signal_connect_after (G_OBJECT (state
->interval_entry
),
3175 G_CALLBACK (average_tool_update_sensitivity_cb
), state
);
3176 g_signal_connect_after (G_OBJECT (state
->interval_entry
),
3178 G_CALLBACK (average_tool_interval_cb
), state
);
3180 gnm_editable_enters (GTK_WINDOW (state
->base
.dialog
),
3181 GTK_WIDGET (state
->interval_entry
));
3183 gnm_dao_set_put (GNM_DAO (state
->base
.gdao
), TRUE
, TRUE
);
3184 average_tool_update_sensitivity_cb (NULL
, state
);
3185 tool_load_selection ((GenericToolState
*)state
, TRUE
);
3190 /**********************************************/
3191 /* End of Moving Averages tool code */
3192 /**********************************************/
3194 /**********************************************/
3195 /* Begin of histogram tool code */
3196 /**********************************************/
3199 * histogram_tool_update_sensitivity_cb:
3203 * Update the dialog widgets sensitivity
3206 histogram_tool_update_sensitivity_cb (G_GNUC_UNUSED GtkWidget
*dummy
,
3207 HistogramToolState
*state
)
3210 gboolean predetermined_bins
;
3211 GSList
*input_range
;
3212 GnmValue
*input_range_2
= NULL
;
3214 input_range
= gnm_expr_entry_parse_as_list
3215 (GNM_EXPR_ENTRY (state
->base
.input_entry
), state
->base
.sheet
);
3216 if (input_range
== NULL
) {
3217 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
3218 _("The input range is invalid."));
3219 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
3223 range_list_destroy (input_range
);
3225 predetermined_bins
= gtk_toggle_button_get_active (
3226 GTK_TOGGLE_BUTTON (state
->predetermined_button
));
3227 if (predetermined_bins
) {
3228 input_range_2
= gnm_expr_entry_parse_as_value
3229 (GNM_EXPR_ENTRY (state
->base
.input_entry_2
), state
->base
.sheet
);
3230 if (input_range_2
== NULL
) {
3231 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
3232 _("The cutoff range is not valid."));
3233 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
3236 value_release (input_range_2
);
3237 } else if (entry_to_int(state
->n_entry
, &the_n
,FALSE
) != 0 || the_n
<= 0) {
3238 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
3239 _("The number of to be calculated cutoffs is invalid."));
3240 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
3244 if (!gnm_dao_is_ready (GNM_DAO (state
->base
.gdao
))) {
3245 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
3246 _("The output specification "
3248 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
3252 gtk_label_set_text (GTK_LABEL (state
->base
.warning
), "");
3253 gtk_widget_set_sensitive (state
->base
.ok_button
, TRUE
);
3259 * histogram_tool_ok_clicked_cb:
3263 * Retrieve the information from the dialog and call the histogram_tool.
3264 * Note that we assume that the ok_button is only active if the entry fields
3265 * contain sensible data.
3268 histogram_tool_ok_clicked_cb (G_GNUC_UNUSED GtkWidget
*button
,
3269 HistogramToolState
*state
)
3271 data_analysis_output_t
*dao
;
3272 analysis_tools_data_histogram_t
*data
;
3276 data
= g_new0 (analysis_tools_data_histogram_t
, 1);
3277 dao
= parse_output ((GenericToolState
*)state
, NULL
);
3279 data
->base
.input
= gnm_expr_entry_parse_as_list (
3280 GNM_EXPR_ENTRY (state
->base
.input_entry
), state
->base
.sheet
);
3281 data
->base
.group_by
= gnm_gui_group_value (state
->base
.gui
, grouped_by_group
);
3283 data
->predetermined
= gtk_toggle_button_get_active (
3284 GTK_TOGGLE_BUTTON (state
->predetermined_button
));
3285 if (data
->predetermined
) {
3286 w
= go_gtk_builder_get_widget (state
->base
.gui
, "labels_2_button");
3287 data
->bin
= gnm_expr_entry_parse_as_value
3288 (GNM_EXPR_ENTRY (state
->base
.input_entry_2
),
3291 entry_to_int(state
->n_entry
, &data
->n
,TRUE
);
3292 data
->max_given
= (0 == entry_to_float (state
->max_entry
,
3293 &data
->max
, TRUE
));
3294 data
->min_given
= (0 == entry_to_float (state
->min_entry
,
3295 &data
->min
, TRUE
));
3299 data
->bin_type
= gnm_gui_group_value (state
->base
.gui
, bin_type_group
);
3300 data
->chart
= gnm_gui_group_value (state
->base
.gui
, chart_group
);
3302 w
= go_gtk_builder_get_widget (state
->base
.gui
, "labels_button");
3303 data
->base
.labels
= gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w
));
3304 w
= go_gtk_builder_get_widget (state
->base
.gui
, "percentage-button");
3305 data
->percentage
= gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w
));
3306 w
= go_gtk_builder_get_widget (state
->base
.gui
, "cum-button");
3307 data
->cumulative
= gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w
));
3308 w
= go_gtk_builder_get_widget (state
->base
.gui
, "only-num-button");
3309 data
->only_numbers
= gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w
));
3311 if (!cmd_analysis_tool (GNM_WBC (state
->base
.wbcg
), state
->base
.sheet
,
3312 dao
, data
, analysis_tool_histogram_engine
, TRUE
))
3313 gtk_widget_destroy (state
->base
.dialog
);
3319 * histogram_tool_set_predetermined:
3324 * Output range entry was focused. Switch to output range.
3328 histogram_tool_set_predetermined (G_GNUC_UNUSED GtkWidget
*widget
,
3329 G_GNUC_UNUSED GdkEventFocus
*event
,
3330 HistogramToolState
*state
)
3332 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state
->predetermined_button
), TRUE
);
3337 * histogram_tool_set_calculated:
3344 histogram_tool_set_calculated (G_GNUC_UNUSED GtkWidget
*widget
,
3345 G_GNUC_UNUSED GdkEventFocus
*event
,
3346 HistogramToolState
*state
)
3348 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state
->calculated_button
), TRUE
);
3353 * dialog_histogram_tool:
3357 * Show the dialog (guru).
3361 dialog_histogram_tool (WBCGtk
*wbcg
, Sheet
*sheet
)
3363 HistogramToolState
*state
;
3364 char const * plugins
[] = {"Gnumeric_fnlogical",
3366 "Gnumeric_fnlookup",
3369 if ((wbcg
== NULL
) ||
3370 gnm_check_for_plugins_missing (plugins
, wbcg_toplevel (wbcg
)))
3373 /* Only pop up one copy per workbook */
3374 if (gnm_dialog_raise_if_exists (wbcg
, HISTOGRAM_KEY
))
3377 state
= g_new0 (HistogramToolState
, 1);
3379 if (dialog_tool_init (&state
->base
, wbcg
, sheet
,
3380 GNUMERIC_HELP_LINK_HISTOGRAM
,
3381 "res:ui/histogram.ui", "Histogram",
3382 _("Could not create the Histogram Tool dialog."),
3384 G_CALLBACK (histogram_tool_ok_clicked_cb
), NULL
,
3385 G_CALLBACK (histogram_tool_update_sensitivity_cb
),
3392 state
->predetermined_button
= GTK_WIDGET (go_gtk_builder_get_widget
3394 "pre_determined_button"));
3395 state
->calculated_button
= GTK_WIDGET (go_gtk_builder_get_widget
3397 "calculated_button"));
3398 state
->n_entry
= GTK_ENTRY(go_gtk_builder_get_widget (state
->base
.gui
,
3400 state
->max_entry
= GTK_ENTRY(go_gtk_builder_get_widget (state
->base
.gui
,
3402 state
->min_entry
= GTK_ENTRY(go_gtk_builder_get_widget (state
->base
.gui
,
3405 g_signal_connect_after (G_OBJECT (state
->predetermined_button
),
3407 G_CALLBACK (histogram_tool_update_sensitivity_cb
), state
);
3408 g_signal_connect_after (G_OBJECT (state
->calculated_button
),
3410 G_CALLBACK (histogram_tool_update_sensitivity_cb
), state
);
3411 g_signal_connect_after (G_OBJECT (state
->n_entry
),
3413 G_CALLBACK (histogram_tool_update_sensitivity_cb
), state
);
3414 g_signal_connect (G_OBJECT (state
->n_entry
),
3416 G_CALLBACK (histogram_tool_set_calculated
), state
);
3417 g_signal_connect (G_OBJECT (state
->min_entry
),
3419 G_CALLBACK (histogram_tool_set_calculated
), state
);
3420 g_signal_connect (G_OBJECT (state
->max_entry
),
3422 G_CALLBACK (histogram_tool_set_calculated
), state
);
3423 g_signal_connect (G_OBJECT
3424 (gnm_expr_entry_get_entry (
3425 GNM_EXPR_ENTRY (state
->base
.input_entry_2
))),
3427 G_CALLBACK (histogram_tool_set_predetermined
), state
);
3429 gnm_dao_set_put (GNM_DAO (state
->base
.gdao
), TRUE
, TRUE
);
3430 histogram_tool_update_sensitivity_cb (NULL
, state
);
3431 tool_load_selection ((GenericToolState
*)state
, TRUE
);
3433 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state
->calculated_button
), TRUE
);
3434 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (go_gtk_builder_get_widget (state
->base
.gui
,"histogram-button")), TRUE
);
3435 gtk_entry_set_text (GTK_ENTRY (state
->n_entry
), "12");
3440 /**********************************************/
3441 /* End of histogram tool code */
3442 /**********************************************/
3444 /**********************************************/
3445 /* Begin of ANOVA (single factor) tool code */
3446 /**********************************************/
3450 * anova_single_tool_ok_clicked_cb:
3454 * Retrieve the information from the dialog and call the fourier_tool.
3455 * Note that we assume that the ok_button is only active if the entry fields
3456 * contain sensible data.
3459 anova_single_tool_ok_clicked_cb (G_GNUC_UNUSED GtkWidget
*button
,
3460 AnovaSingleToolState
*state
)
3462 data_analysis_output_t
*dao
;
3464 analysis_tools_data_anova_single_t
*data
;
3466 data
= g_new0 (analysis_tools_data_anova_single_t
, 1);
3467 dao
= parse_output ((GenericToolState
*)state
, NULL
);
3469 data
->base
.input
= gnm_expr_entry_parse_as_list (
3470 GNM_EXPR_ENTRY (state
->base
.input_entry
), state
->base
.sheet
);
3471 data
->base
.group_by
= gnm_gui_group_value (state
->base
.gui
, grouped_by_group
);
3473 w
= go_gtk_builder_get_widget (state
->base
.gui
, "labels_button");
3474 data
->base
.labels
= gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w
));
3475 data
->alpha
= gtk_spin_button_get_value
3476 (GTK_SPIN_BUTTON (state
->alpha_entry
));
3478 if (!cmd_analysis_tool (GNM_WBC (state
->base
.wbcg
), state
->base
.sheet
,
3479 dao
, data
, analysis_tool_anova_single_engine
, TRUE
))
3480 gtk_widget_destroy (state
->base
.dialog
);
3486 * anova_single_tool_update_sensitivity_cb:
3489 * Update the dialog widgets sensitivity.
3490 * We cannot use tool_update_sensitivity_cb
3491 * since we are also considering whether in fact
3492 * an alpha is given.
3495 anova_single_tool_update_sensitivity_cb (G_GNUC_UNUSED GtkWidget
*dummy
,
3496 AnovaSingleToolState
*state
)
3499 GSList
*input_range
;
3501 input_range
= gnm_expr_entry_parse_as_list (
3502 GNM_EXPR_ENTRY (state
->base
.input_entry
),
3504 if (input_range
== NULL
) {
3505 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
3506 _("The input range is invalid."));
3507 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
3510 range_list_destroy (input_range
);
3513 alpha
= gtk_spin_button_get_value
3514 (GTK_SPIN_BUTTON (state
->alpha_entry
));
3515 if (!(alpha
> 0 && alpha
< 1)) {
3516 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
3517 _("The alpha value should "
3518 "be a number between 0 and 1."));
3519 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
3523 /* Checking Output Page */
3524 if (!gnm_dao_is_ready (GNM_DAO (state
->base
.gdao
))) {
3525 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
3526 _("The output specification "
3528 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
3532 gtk_label_set_text (GTK_LABEL (state
->base
.warning
), "");
3533 gtk_widget_set_sensitive (state
->base
.ok_button
, TRUE
);
3539 * dialog_anova_single_tool:
3543 * Show the dialog (guru).
3547 dialog_anova_single_factor_tool (WBCGtk
*wbcg
, Sheet
*sheet
)
3549 AnovaSingleToolState
*state
;
3550 char const * plugins
[] = { "Gnumeric_fnstat",
3553 if ((wbcg
== NULL
) ||
3554 gnm_check_for_plugins_missing (plugins
, wbcg_toplevel (wbcg
)))
3557 /* Only pop up one copy per workbook */
3558 if (gnm_dialog_raise_if_exists (wbcg
, ANOVA_SINGLE_KEY
))
3561 state
= g_new0 (AnovaSingleToolState
, 1);
3563 if (dialog_tool_init (&state
->base
, wbcg
, sheet
,
3564 GNUMERIC_HELP_LINK_ANOVA_SINGLE_FACTOR
,
3565 "res:ui/anova-one.ui", "ANOVA",
3566 _("Could not create the ANOVA (single factor) "
3569 G_CALLBACK (anova_single_tool_ok_clicked_cb
),
3571 G_CALLBACK (anova_single_tool_update_sensitivity_cb
),
3578 state
->alpha_entry
= go_gtk_builder_get_widget (state
->base
.gui
,
3580 float_to_entry (GTK_ENTRY (state
->alpha_entry
), 0.05);
3581 g_signal_connect_after (G_OBJECT (state
->alpha_entry
),
3583 G_CALLBACK (anova_single_tool_update_sensitivity_cb
), state
);
3584 gnm_editable_enters (GTK_WINDOW (state
->base
.dialog
),
3585 GTK_WIDGET (state
->alpha_entry
));
3587 gnm_dao_set_put (GNM_DAO (state
->base
.gdao
), TRUE
, TRUE
);
3588 anova_single_tool_update_sensitivity_cb (NULL
, state
);
3589 tool_load_selection ((GenericToolState
*)state
, TRUE
);
3594 /**********************************************/
3595 /* End of ANOVA (Single Factor) tool code */
3596 /**********************************************/
3598 /**********************************************/
3599 /* Begin of ANOVA (two factor) tool code */
3600 /**********************************************/
3604 * anova_two_factor_tool_ok_clicked_cb:
3608 * Retrieve the information from the dialog and call the fourier_tool.
3609 * Note that we assume that the ok_button is only active if the entry fields
3610 * contain sensible data.
3613 anova_two_factor_tool_ok_clicked_cb (G_GNUC_UNUSED GtkWidget
*button
,
3614 AnovaTwoFactorToolState
*state
)
3616 data_analysis_output_t
*dao
;
3618 analysis_tools_data_anova_two_factor_t
*data
;
3621 if (state
->base
.warning_dialog
!= NULL
)
3622 gtk_widget_destroy (state
->base
.warning_dialog
);
3624 data
= g_new0 (analysis_tools_data_anova_two_factor_t
, 1);
3625 dao
= parse_output ((GenericToolState
*)state
, NULL
);
3627 data
->input
= gnm_expr_entry_parse_as_value
3628 (GNM_EXPR_ENTRY (state
->base
.input_entry
),
3630 data
->err
= analysis_tools_noerr
;
3631 data
->wbc
= GNM_WBC (state
->base
.wbcg
);
3633 w
= go_gtk_builder_get_widget (state
->base
.gui
, "labels_button");
3634 data
->labels
= gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w
));
3636 data
->alpha
= gtk_spin_button_get_value
3637 (GTK_SPIN_BUTTON (state
->alpha_entry
));
3638 entry_to_int (GTK_ENTRY (state
->replication_entry
),
3639 &data
->replication
, TRUE
);
3641 if (cmd_analysis_tool (GNM_WBC (state
->base
.wbcg
),
3643 dao
, data
, analysis_tool_anova_two_factor_engine
, FALSE
)) {
3644 switch (data
->err
) {
3645 case analysis_tools_missing_data
:
3646 error_in_entry ((GenericToolState
*) state
,
3647 GTK_WIDGET (state
->base
.input_entry
),
3648 data
->labels
? _("The given input range should contain at "
3649 "least two columns and two rows of data and the "
3651 _("The given input range should contain at "
3652 "least two columns and two rows of data."));
3654 case analysis_tools_too_few_cols
:
3655 error_in_entry ((GenericToolState
*) state
,
3656 GTK_WIDGET (state
->base
.input_entry
),
3657 data
->labels
? _("The given input range should contain at "
3658 "least two columns of data and the "
3660 _("The given input range should contain at "
3661 "least two columns of data."));
3663 case analysis_tools_too_few_rows
:
3664 error_in_entry ((GenericToolState
*) state
,
3665 GTK_WIDGET (state
->base
.input_entry
),
3666 data
->labels
? _("The given input range should contain at "
3667 "least two rows of data and the "
3669 _("The given input range should "
3670 "contain at least two rows of "
3673 case analysis_tools_replication_invalid
:
3674 error_in_entry ((GenericToolState
*) state
,
3675 GTK_WIDGET (state
->base
.input_entry
),
3676 _("The number of data rows must be a "
3677 "multiple of the replication "
3681 text
= g_strdup_printf (
3682 _("An unexpected error has occurred: %d."),
3684 error_in_entry ((GenericToolState
*) state
,
3685 GTK_WIDGET (state
->base
.input_entry
),
3690 value_release (data
->input
);
3694 gtk_widget_destroy (state
->base
.dialog
);
3700 * anova_two_factor_tool_update_sensitivity_cb:
3703 * Update the dialog widgets sensitivity.
3704 * We cannot use tool_update_sensitivity_cb
3705 * since we are also considering whether in fact
3706 * an alpha and a replication is given.
3709 anova_two_factor_tool_update_sensitivity_cb (G_GNUC_UNUSED GtkWidget
*dummy
,
3710 AnovaTwoFactorToolState
*state
)
3712 int replication
, err_replication
;
3714 GnmValue
*input_range
;
3716 /* Checking Input Range */
3717 input_range
= gnm_expr_entry_parse_as_value
3718 (GNM_EXPR_ENTRY (state
->base
.input_entry
),
3720 if (input_range
== NULL
) {
3721 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
3722 _("The input range is invalid."));
3723 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
3726 value_release (input_range
);
3729 alpha
= gtk_spin_button_get_value
3730 (GTK_SPIN_BUTTON (state
->alpha_entry
));
3731 if (!(alpha
> 0 && alpha
< 1)) {
3732 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
3733 _("The alpha value should "
3734 "be a number between 0 and 1."));
3735 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
3740 /* Checking Replication*/
3741 err_replication
= entry_to_int (GTK_ENTRY (state
->replication_entry
),
3742 &replication
, FALSE
);
3743 if (!(err_replication
== 0 && replication
> 0)) {
3744 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
3745 _("The number of rows per sample "
3746 "should be a positive integer."));
3747 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
3751 /* Checking Output Page */
3752 if (!gnm_dao_is_ready (GNM_DAO (state
->base
.gdao
))) {
3753 gtk_label_set_text (GTK_LABEL (state
->base
.warning
),
3754 _("The output specification "
3756 gtk_widget_set_sensitive (state
->base
.ok_button
, FALSE
);
3760 gtk_label_set_text (GTK_LABEL (state
->base
.warning
), "");
3761 gtk_widget_set_sensitive (state
->base
.ok_button
, TRUE
);
3767 * dialog_anova_two_factor_tool:
3771 * Show the dialog (guru).
3775 dialog_anova_two_factor_tool (WBCGtk
*wbcg
, Sheet
*sheet
)
3777 AnovaTwoFactorToolState
*state
;
3778 char const * plugins
[] = { "Gnumeric_fnstat",
3779 "Gnumeric_fnlookup",
3782 "Gnumeric_fnlogical",
3785 if ((wbcg
== NULL
) ||
3786 gnm_check_for_plugins_missing (plugins
, wbcg_toplevel (wbcg
)))
3789 /* Only pop up one copy per workbook */
3790 if (gnm_dialog_raise_if_exists (wbcg
, ANOVA_TWO_FACTOR_KEY
))
3793 state
= g_new0 (AnovaTwoFactorToolState
, 1);
3795 if (dialog_tool_init (&state
->base
, wbcg
, sheet
,
3796 GNUMERIC_HELP_LINK_ANOVA_TWO_FACTOR
,
3797 "res:ui/anova-two.ui", "ANOVA",
3798 _("Could not create the ANOVA (two factor) "
3800 ANOVA_TWO_FACTOR_KEY
,
3801 G_CALLBACK (anova_two_factor_tool_ok_clicked_cb
),
3803 G_CALLBACK (anova_two_factor_tool_update_sensitivity_cb
),
3804 GNM_EE_SINGLE_RANGE
))
3810 state
->alpha_entry
= go_gtk_builder_get_widget (state
->base
.gui
,
3812 float_to_entry (GTK_ENTRY(state
->alpha_entry
), 0.05);
3813 state
->replication_entry
= go_gtk_builder_get_widget (state
->base
.gui
,
3814 "replication-entry");
3815 int_to_entry (GTK_ENTRY(state
->replication_entry
), 1);
3817 g_signal_connect_after (G_OBJECT (state
->alpha_entry
),
3819 G_CALLBACK (anova_two_factor_tool_update_sensitivity_cb
),
3821 g_signal_connect_after (G_OBJECT (state
->replication_entry
),
3823 G_CALLBACK (anova_two_factor_tool_update_sensitivity_cb
),
3825 gnm_editable_enters (GTK_WINDOW (state
->base
.dialog
),
3826 GTK_WIDGET (state
->alpha_entry
));
3827 gnm_editable_enters (GTK_WINDOW (state
->base
.dialog
),
3828 GTK_WIDGET (state
->replication_entry
));
3830 gnm_dao_set_put (GNM_DAO (state
->base
.gdao
), TRUE
, TRUE
);
3831 anova_two_factor_tool_update_sensitivity_cb (NULL
, state
);
3832 tool_load_selection ((GenericToolState
*)state
, FALSE
);
3837 /**********************************************/
3838 /* End of ANOVA (Two Factor) tool code */
3839 /**********************************************/