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>
26 #include <dialogs/dialogs.h>
27 #include <dialogs/help.h>
28 #include <dialogs/tool-dialogs.h>
31 #include <selection.h>
34 #include <sheet-view.h>
39 #include <command-context.h>
41 #include <selection.h>
42 #include <rendered-value.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"
53 GnmGenericToolState base
;
54 GtkWidget
*start_entry
;
55 GtkWidget
*stop_entry
;
56 GtkWidget
*step_entry
;
57 GtkWidget
*date_steps_type
;
61 cb_fill_series_update_sensitivity (G_GNUC_UNUSED GtkWidget
*dummy
,
62 FillSeriesState
*state
)
68 step
= !entry_to_float (GTK_ENTRY (state
->step_entry
),
70 stop
= !entry_to_float (GTK_ENTRY (state
->stop_entry
),
73 ready
= gnm_dao_is_ready (GNM_DAO (state
->base
.gdao
)) &&
74 !entry_to_float (GTK_ENTRY (state
->start_entry
),
77 ((gnm_dao_is_finite (GNM_DAO (state
->base
.gdao
))
81 gtk_widget_set_sensitive (state
->base
.ok_button
, ready
);
85 cb_fill_series_ok_clicked (G_GNUC_UNUSED GtkWidget
*button
,
86 FillSeriesState
*state
)
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
),
119 dao
, fs
, fill_series_engine
, TRUE
))
120 gtk_widget_destroy (state
->base
.dialog
);
124 cb_type_button_clicked (G_GNUC_UNUSED GtkWidget
*button
,
125 FillSeriesState
*state
)
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
);
138 gtk_widget_set_sensitive (state
->date_steps_type
, FALSE
);
142 * dialog_fill_series_tool_init:
145 * Create the dialog (guru).
149 dialog_fill_series_tool_init (FillSeriesState
*state
)
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
,
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
),
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
),
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
),
175 G_CALLBACK (cb_fill_series_update_sensitivity
), state
);
178 state
->date_steps_type
= go_gtk_builder_get_widget (state
->base
.gui
,
180 gtk_widget_set_sensitive (state
->date_steps_type
, FALSE
);
182 button
= (sel
== NULL
||
184 (range_width (sel
) >= range_height (sel
))))
187 radio
= go_gtk_builder_get_widget (state
->base
.gui
, button
);
188 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio
), TRUE
);
194 dialog_tool_preset_to_range (&state
->base
);
196 cell_start
= sheet_cell_get (state
->base
.sheet
,
197 sel
->start
.col
, sel
->start
.row
);
199 char *content
= gnm_cell_get_rendered_text (cell_start
);
201 gtk_entry_set_text (GTK_ENTRY (state
->start_entry
),
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
);
212 char *content
= gnm_cell_get_rendered_text (cell_end
);
214 gtk_entry_set_text (GTK_ENTRY (state
->stop_entry
),
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
))
224 (sel
->end
.col
-sel
->start
.col
) :
225 (sel
->end
.row
-sel
->start
.row
)));
229 cb_fill_series_update_sensitivity (NULL
, state
);
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
)) {
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."),
253 G_CALLBACK (cb_fill_series_ok_clicked
), NULL
,
254 G_CALLBACK (cb_fill_series_update_sensitivity
),
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
);