Update Spanish translation
[gnumeric.git] / src / dialogs / dialog-fill-series.c
blob3af06d5fb072ae936779c1441f02be436c1fe9aa
1 /*
2 * dialog-fill-series.c: Fill according to a linear or exponential serie.
4 * Authors: Jukka-Pekka Iivonen (jiivonen@hutcs.cs.hut.fi)
5 * Andreas J. Guelzow (aguelzow@taliesin.ca)
7 * Copyright (C) 2003 Jukka-Pekka Iivonen (jiivonen@hutcs.cs.hut.fi)
8 * Copyright (C) Andreas J. Guelzow (aguelzow@taliesin.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/>.
23 #include <gnumeric-config.h>
24 #include <glib/gi18n-lib.h>
25 #include <gnumeric.h>
26 #include <dialogs/dialogs.h>
27 #include <dialogs/help.h>
28 #include <dialogs/tool-dialogs.h>
30 #include <gui-util.h>
31 #include <selection.h>
32 #include <workbook.h>
33 #include <sheet.h>
34 #include <sheet-view.h>
35 #include <commands.h>
36 #include <ranges.h>
37 #include <cmd-edit.h>
38 #include <wbc-gtk.h>
39 #include <command-context.h>
40 #include <value.h>
41 #include <selection.h>
42 #include <rendered-value.h>
43 #include <cell.h>
44 #include <widgets/gnm-dao.h>
46 #include <dialogs/dao-gui-utils.h>
48 #include <tools/fill-series.h>
50 #define FILL_SERIES_KEY "fill-series-dialog"
52 typedef struct {
53 GnmGenericToolState base;
54 GtkWidget *start_entry;
55 GtkWidget *stop_entry;
56 GtkWidget *step_entry;
57 GtkWidget *date_steps_type;
58 } FillSeriesState;
60 static void
61 cb_fill_series_update_sensitivity (G_GNUC_UNUSED GtkWidget *dummy,
62 FillSeriesState *state)
64 gboolean ready;
65 gboolean step, stop;
66 gnm_float a_float;
68 step = !entry_to_float (GTK_ENTRY (state->step_entry),
69 &a_float, FALSE);
70 stop = !entry_to_float (GTK_ENTRY (state->stop_entry),
71 &a_float,FALSE);
73 ready = gnm_dao_is_ready (GNM_DAO (state->base.gdao)) &&
74 !entry_to_float (GTK_ENTRY (state->start_entry),
75 &a_float,
76 FALSE) &&
77 ((gnm_dao_is_finite (GNM_DAO (state->base.gdao))
78 && (step || stop)) ||
79 (step && stop));
81 gtk_widget_set_sensitive (state->base.ok_button, ready);
84 static void
85 cb_fill_series_ok_clicked (G_GNUC_UNUSED GtkWidget *button,
86 FillSeriesState *state)
88 GtkWidget *radio;
89 fill_series_t *fs;
90 data_analysis_output_t *dao;
92 fs = g_new0 (fill_series_t, 1);
93 dao = parse_output ((GnmGenericToolState *)state, NULL);
95 /* Read the `Series in' radio buttons. */
96 radio = go_gtk_builder_get_widget (state->base.gui, "series_in_rows");
97 fs->series_in_rows = ! gnm_gtk_radio_group_get_selected
98 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio)));
100 /* Read the `Type' radio buttons. */
101 radio = go_gtk_builder_get_widget (state->base.gui, "type_linear");
102 fs->type = gnm_gtk_radio_group_get_selected
103 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio)));
105 /* Read the `Date unit' radio buttons. */
106 radio = go_gtk_builder_get_widget (state->base.gui, "unit_day");
107 fs->date_unit = gnm_gtk_radio_group_get_selected
108 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio)));
110 fs->is_step_set = ! entry_to_float (GTK_ENTRY (state->step_entry),
111 &fs->step_value, TRUE);
112 fs->is_stop_set = ! entry_to_float (GTK_ENTRY (state->stop_entry),
113 &fs->stop_value, TRUE);
114 entry_to_float (GTK_ENTRY (state->start_entry),
115 &fs->start_value, TRUE);
117 if (!cmd_analysis_tool (GNM_WBC (state->base.wbcg),
118 state->base.sheet,
119 dao, fs, fill_series_engine, TRUE))
120 gtk_widget_destroy (state->base.dialog);
123 static void
124 cb_type_button_clicked (G_GNUC_UNUSED GtkWidget *button,
125 FillSeriesState *state)
127 GtkWidget *radio;
128 fill_series_type_t type;
131 /* Read the `Type' radio buttons. */
132 radio = go_gtk_builder_get_widget (state->base.gui, "type_linear");
133 type = gnm_gtk_radio_group_get_selected (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio)));
135 if (type == FillSeriesTypeDate)
136 gtk_widget_set_sensitive (state->date_steps_type, TRUE);
137 else
138 gtk_widget_set_sensitive (state->date_steps_type, FALSE);
142 * dialog_fill_series_tool_init:
143 * @state:
145 * Create the dialog (guru).
148 static void
149 dialog_fill_series_tool_init (FillSeriesState *state)
151 GtkWidget *radio;
152 char const *button;
153 GnmRange const *sel;
154 gboolean prefer_rows = FALSE;
156 sel = selection_first_range (state->base.sv, NULL, NULL);
158 /* Set the sensitivity of Unit day. */
159 radio = go_gtk_builder_get_widget (state->base.gui,
160 "type_date");
161 g_signal_connect (G_OBJECT (radio), "clicked",
162 G_CALLBACK (cb_type_button_clicked), state);
164 state->stop_entry = go_gtk_builder_get_widget (state->base.gui, "stop_entry");
165 g_signal_connect_after (G_OBJECT (state->stop_entry),
166 "changed",
167 G_CALLBACK (cb_fill_series_update_sensitivity), state);
168 state->step_entry = go_gtk_builder_get_widget (state->base.gui, "step_entry");
169 g_signal_connect_after (G_OBJECT (state->step_entry),
170 "changed",
171 G_CALLBACK (cb_fill_series_update_sensitivity), state);
172 state->start_entry = go_gtk_builder_get_widget (state->base.gui, "start_entry");
173 g_signal_connect_after (G_OBJECT (state->start_entry),
174 "changed",
175 G_CALLBACK (cb_fill_series_update_sensitivity), state);
178 state->date_steps_type = go_gtk_builder_get_widget (state->base.gui,
179 "table-date-unit");
180 gtk_widget_set_sensitive (state->date_steps_type, FALSE);
182 button = (sel == NULL ||
183 (prefer_rows =
184 (range_width (sel) >= range_height (sel))))
185 ? "series_in_rows"
186 : "series_in_cols";
187 radio = go_gtk_builder_get_widget (state->base.gui, button);
188 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio), TRUE);
190 if (sel != NULL) {
191 GnmCell *cell_start;
192 GnmCell *cell_end;
194 dialog_tool_preset_to_range (&state->base);
196 cell_start = sheet_cell_get (state->base.sheet,
197 sel->start.col, sel->start.row);
198 if (cell_start) {
199 char *content = gnm_cell_get_rendered_text (cell_start);
200 if (content) {
201 gtk_entry_set_text (GTK_ENTRY (state->start_entry),
202 content);
203 g_free (content);
206 cell_end = prefer_rows ?
207 sheet_cell_get (state->base.sheet,
208 sel->end.col, sel->start.row) :
209 sheet_cell_get (state->base.sheet,
210 sel->start.col, sel->end.row);
211 if (cell_end) {
212 char *content = gnm_cell_get_rendered_text (cell_end);
213 if (content) {
214 gtk_entry_set_text (GTK_ENTRY (state->stop_entry),
215 content);
216 g_free (content);
219 if (cell_start && cell_end) {
220 float_to_entry (GTK_ENTRY(state->step_entry),
221 (value_get_as_float(cell_end->value) -
222 value_get_as_float(cell_start->value))
223 / (prefer_rows ?
224 (sel->end.col-sel->start.col) :
225 (sel->end.row-sel->start.row)));
229 cb_fill_series_update_sensitivity (NULL, state);
232 void
233 dialog_fill_series (WBCGtk *wbcg)
235 FillSeriesState *state;
236 WorkbookControl *wbc = GNM_WBC (wbcg);
237 SheetView *sv = wb_control_cur_sheet_view (wbc);
239 g_return_if_fail (wbcg != NULL);
241 /* Only pop up one copy per workbook */
242 if (gnm_dialog_raise_if_exists (wbcg, FILL_SERIES_KEY)) {
243 return;
246 state = g_new (FillSeriesState, 1);
248 if (dialog_tool_init ((GnmGenericToolState *)state, wbcg, sv_sheet (sv),
249 GNUMERIC_HELP_LINK_FILL_SERIES,
250 "res:ui/fill-series.ui", "Fill_series",
251 _("Could not create the Fill Series dialog."),
252 FILL_SERIES_KEY,
253 G_CALLBACK (cb_fill_series_ok_clicked), NULL,
254 G_CALLBACK (cb_fill_series_update_sensitivity),
256 return;
258 gnm_dao_set_put (GNM_DAO (state->base.gdao), FALSE, FALSE);
259 dialog_fill_series_tool_init (state);
260 gtk_widget_show (state->base.dialog);
262 return;