GUI: Move .ui files from goffice resources to glib resources
[gnumeric.git] / src / dialogs / dialog-analysis-tool-frequency.c
blob5c0eb553b9856463ab4056660c1e5da8775b95d2
1 /* vim: set sw=8: -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2 /*
3 * dialog-analysis-tool-frequency.c:
5 * Authors:
6 * Andreas J. Guelzow <aguelzow@taliesin.ca>
8 * (C) Copyright 2008 by Andreas J. Guelzow <aguelzow@pyrshep.ca>
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, see <https://www.gnu.org/licenses/>.
24 #include <gnumeric-config.h>
25 #include <glib/gi18n-lib.h>
26 #include <gnumeric.h>
27 #include "dialogs.h"
28 #include "analysis-frequency.h"
29 #include "analysis-tools.h"
31 #include <workbook.h>
32 #include <workbook-control.h>
33 #include <wbc-gtk.h>
34 #include <workbook-view.h>
35 #include <gui-util.h>
36 #include <parse-util.h>
37 #include <gnm-format.h>
38 #include <tool-dialogs.h>
39 #include <dao-gui-utils.h>
40 #include <sheet.h>
41 #include <expr.h>
42 #include <number-match.h>
43 #include <ranges.h>
44 #include <selection.h>
45 #include <value.h>
46 #include <commands.h>
47 #include "help.h"
49 #include <widgets/gnm-dao.h>
50 #include <widgets/gnumeric-expr-entry.h>
52 #include <string.h>
53 #include <gtk/gtk.h>
55 #define FREQUENCY_KEY "analysistools-frequency-dialog"
57 static char const * const grouped_by_group[] = {
58 "grouped_by_row",
59 "grouped_by_col",
60 NULL
63 static char const * const chart_group[] = {
64 "nochart-button",
65 "barchart-button",
66 "columnchart-button",
67 NULL
70 typedef struct {
71 GenericToolState base;
72 GtkWidget *predetermined_button;
73 GtkWidget *calculated_button;
74 GtkEntry *n_entry;
75 } FrequencyToolState;
78 /**
79 * frequency_tool_update_sensitivity_cb:
80 * @dummy:
81 * @state:
83 * Update the dialog widgets sensitivity
84 **/
85 static void
86 frequency_tool_update_sensitivity_cb (G_GNUC_UNUSED GtkWidget *dummy,
87 FrequencyToolState *state)
89 int the_n;
90 gboolean predetermined_bins;
91 GSList *input_range;
92 GnmValue *input_range_2 = NULL;
94 input_range = gnm_expr_entry_parse_as_list
95 (GNM_EXPR_ENTRY (state->base.input_entry), state->base.sheet);
96 if (input_range == NULL) {
97 gtk_label_set_text (GTK_LABEL (state->base.warning),
98 _("The input range is invalid."));
99 gtk_widget_set_sensitive (state->base.ok_button, FALSE);
100 return;
103 range_list_destroy (input_range);
105 predetermined_bins = gtk_toggle_button_get_active (
106 GTK_TOGGLE_BUTTON (state->predetermined_button));
107 if (predetermined_bins) {
108 input_range_2 = gnm_expr_entry_parse_as_value
109 (GNM_EXPR_ENTRY (state->base.input_entry_2), state->base.sheet);
110 if (input_range_2 == NULL) {
111 gtk_label_set_text (GTK_LABEL (state->base.warning),
112 _("The categories range is not valid."));
113 gtk_widget_set_sensitive (state->base.ok_button, FALSE);
114 return;
116 value_release (input_range_2);
117 } else if (entry_to_int(state->n_entry, &the_n,FALSE) != 0 || the_n <= 0) {
118 gtk_label_set_text (GTK_LABEL (state->base.warning),
119 _("The number of categories is invalid."));
120 gtk_widget_set_sensitive (state->base.ok_button, FALSE);
121 return;
124 if (!gnm_dao_is_ready (GNM_DAO (state->base.gdao))) {
125 gtk_label_set_text (GTK_LABEL (state->base.warning),
126 _("The output specification "
127 "is invalid."));
128 gtk_widget_set_sensitive (state->base.ok_button, FALSE);
129 return;
132 gtk_label_set_text (GTK_LABEL (state->base.warning), "");
133 gtk_widget_set_sensitive (state->base.ok_button, TRUE);
135 return;
139 * frequency_tool_ok_clicked_cb:
140 * @button:
141 * @state:
143 * Retrieve the information from the dialog and call the frequency_tool.
144 * Note that we assume that the ok_button is only active if the entry fields
145 * contain sensible data.
147 static void
148 frequency_tool_ok_clicked_cb (G_GNUC_UNUSED GtkWidget *button,
149 FrequencyToolState *state)
151 data_analysis_output_t *dao;
152 analysis_tools_data_frequency_t *data;
154 GtkWidget *w;
156 data = g_new0 (analysis_tools_data_frequency_t, 1);
157 dao = parse_output ((GenericToolState *)state, NULL);
159 data->base.input = gnm_expr_entry_parse_as_list (
160 GNM_EXPR_ENTRY (state->base.input_entry), state->base.sheet);
161 data->base.group_by = gnm_gui_group_value (state->base.gui, grouped_by_group);
163 data->predetermined = gtk_toggle_button_get_active (
164 GTK_TOGGLE_BUTTON (state->predetermined_button));
165 if (data->predetermined) {
166 w = go_gtk_builder_get_widget (state->base.gui, "labels_2_button");
167 data->bin = gnm_expr_entry_parse_as_value
168 (GNM_EXPR_ENTRY (state->base.input_entry_2),
169 state->base.sheet);
170 } else {
171 entry_to_int(state->n_entry, &data->n,TRUE);
172 data->bin = NULL;
175 data->chart = gnm_gui_group_value (state->base.gui, chart_group);
177 w = go_gtk_builder_get_widget (state->base.gui, "labels_button");
178 data->base.labels = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w));
179 w = go_gtk_builder_get_widget (state->base.gui, "percentage-button");
180 data->percentage = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w));
181 w = go_gtk_builder_get_widget (state->base.gui, "exact-button");
182 data->exact = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w));
184 if (!cmd_analysis_tool (GNM_WBC (state->base.wbcg),
185 state->base.sheet,
186 dao, data, analysis_tool_frequency_engine,
187 TRUE))
188 gtk_widget_destroy (state->base.dialog);
190 return;
194 * frequency_tool_set_predetermined:
195 * @widget:
196 * @focus_widget:
197 * @state:
199 * Output range entry was focused. Switch to output range.
202 static gboolean
203 frequency_tool_set_predetermined (G_GNUC_UNUSED GtkWidget *widget,
204 G_GNUC_UNUSED GdkEventFocus *event,
205 FrequencyToolState *state)
207 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state->predetermined_button), TRUE);
208 return FALSE;
212 * frequency_tool_set_calculated:
213 * @widget:
214 * @event:
215 * @state:
218 static gboolean
219 frequency_tool_set_calculated (G_GNUC_UNUSED GtkWidget *widget,
220 G_GNUC_UNUSED GdkEventFocus *event,
221 FrequencyToolState *state)
223 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state->calculated_button), TRUE);
224 return FALSE;
228 * dialog_frequency_tool:
229 * @wbcg:
230 * @sheet:
232 * Show the dialog (guru).
236 dialog_frequency_tool (WBCGtk *wbcg, Sheet *sheet)
238 FrequencyToolState *state;
239 char const * plugins[] = { "Gnumeric_fnlookup",
240 "Gnumeric_fninfo",
241 "Gnumeric_fnstring",
242 "Gnumeric_fnlogical",
243 NULL};
245 if ((wbcg == NULL) ||
246 gnm_check_for_plugins_missing (plugins, wbcg_toplevel (wbcg)))
247 return 1;
249 /* Only pop up one copy per workbook */
250 if (gnm_dialog_raise_if_exists (wbcg, FREQUENCY_KEY))
251 return 0;
253 state = g_new0 (FrequencyToolState, 1);
255 if (dialog_tool_init (&state->base, wbcg, sheet,
256 GNUMERIC_HELP_LINK_FREQUENCY,
257 "res:ui/frequency.ui", "Frequency",
258 _("Could not create the Frequency Tool dialog."),
259 FREQUENCY_KEY,
260 G_CALLBACK (frequency_tool_ok_clicked_cb), NULL,
261 G_CALLBACK (frequency_tool_update_sensitivity_cb),
264 g_free(state);
265 return 0;
268 state->predetermined_button = tool_setup_update
269 (&state->base, "pre_determined_button",
270 G_CALLBACK (frequency_tool_update_sensitivity_cb),
271 state);
273 state->calculated_button = tool_setup_update
274 (&state->base, "calculated_button",
275 G_CALLBACK (frequency_tool_update_sensitivity_cb),
276 state);
278 state->n_entry =
279 GTK_ENTRY(tool_setup_update
280 (&state->base, "n_entry",
281 G_CALLBACK (frequency_tool_update_sensitivity_cb),
282 state));
283 g_signal_connect (G_OBJECT (state->n_entry),
284 "key-press-event",
285 G_CALLBACK (frequency_tool_set_calculated), state);
286 g_signal_connect (G_OBJECT
287 (gnm_expr_entry_get_entry (
288 GNM_EXPR_ENTRY (state->base.input_entry_2))),
289 "focus-in-event",
290 G_CALLBACK (frequency_tool_set_predetermined), state);
292 gnm_dao_set_put (GNM_DAO (state->base.gdao), TRUE, TRUE);
293 frequency_tool_update_sensitivity_cb (NULL, state);
294 tool_load_selection ((GenericToolState *)state, TRUE);
296 gtk_widget_set_sensitive (GTK_WIDGET (state->n_entry), FALSE);
297 gtk_widget_set_sensitive (state->calculated_button, FALSE);
299 return 0;