1 /* vim: set sw=8: -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
3 * dialog-fill-series.c: Fill according to a linear or exponential serie.
5 * Authors: Jukka-Pekka Iivonen (jiivonen@hutcs.cs.hut.fi)
6 * Andreas J. Guelzow (aguelzow@taliesin.ca)
8 * Copyright (C) 2003 Jukka-Pekka Iivonen (jiivonen@hutcs.cs.hut.fi)
9 * Copyright (C) Andreas J. Guelzow (aguelzow@taliesin.ca)
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/>.
24 #include <gnumeric-config.h>
25 #include <glib/gi18n-lib.h>
29 #include "dialogs/tool-dialogs.h"
32 #include <selection.h>
35 #include <sheet-view.h>
40 #include <command-context.h>
42 #include <selection.h>
43 #include <rendered-value.h>
45 #include <widgets/gnm-dao.h>
47 #include <dialogs/dao-gui-utils.h>
50 #include "fill-series.h"
52 #define FILL_SERIES_KEY "fill-series-dialog"
55 GnmGenericToolState base
;
56 GtkWidget
*start_entry
;
57 GtkWidget
*stop_entry
;
58 GtkWidget
*step_entry
;
59 GtkWidget
*date_steps_type
;
63 cb_fill_series_update_sensitivity (G_GNUC_UNUSED GtkWidget
*dummy
,
64 FillSeriesState
*state
)
70 step
= !entry_to_float (GTK_ENTRY (state
->step_entry
),
72 stop
= !entry_to_float (GTK_ENTRY (state
->stop_entry
),
75 ready
= gnm_dao_is_ready (GNM_DAO (state
->base
.gdao
)) &&
76 !entry_to_float (GTK_ENTRY (state
->start_entry
),
79 ((gnm_dao_is_finite (GNM_DAO (state
->base
.gdao
))
83 gtk_widget_set_sensitive (state
->base
.ok_button
, ready
);
87 cb_fill_series_ok_clicked (G_GNUC_UNUSED GtkWidget
*button
,
88 FillSeriesState
*state
)
92 data_analysis_output_t
*dao
;
94 fs
= g_new0 (fill_series_t
, 1);
95 dao
= parse_output ((GnmGenericToolState
*)state
, NULL
);
97 /* Read the `Series in' radio buttons. */
98 radio
= go_gtk_builder_get_widget (state
->base
.gui
, "series_in_rows");
99 fs
->series_in_rows
= ! gnm_gtk_radio_group_get_selected
100 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio
)));
102 /* Read the `Type' radio buttons. */
103 radio
= go_gtk_builder_get_widget (state
->base
.gui
, "type_linear");
104 fs
->type
= gnm_gtk_radio_group_get_selected
105 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio
)));
107 /* Read the `Date unit' radio buttons. */
108 radio
= go_gtk_builder_get_widget (state
->base
.gui
, "unit_day");
109 fs
->date_unit
= gnm_gtk_radio_group_get_selected
110 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio
)));
112 fs
->is_step_set
= ! entry_to_float (GTK_ENTRY (state
->step_entry
),
113 &fs
->step_value
, TRUE
);
114 fs
->is_stop_set
= ! entry_to_float (GTK_ENTRY (state
->stop_entry
),
115 &fs
->stop_value
, TRUE
);
116 entry_to_float (GTK_ENTRY (state
->start_entry
),
117 &fs
->start_value
, TRUE
);
119 if (!cmd_analysis_tool (GNM_WBC (state
->base
.wbcg
),
121 dao
, fs
, fill_series_engine
, TRUE
))
122 gtk_widget_destroy (state
->base
.dialog
);
126 cb_type_button_clicked (G_GNUC_UNUSED GtkWidget
*button
,
127 FillSeriesState
*state
)
130 fill_series_type_t type
;
133 /* Read the `Type' radio buttons. */
134 radio
= go_gtk_builder_get_widget (state
->base
.gui
, "type_linear");
135 type
= gnm_gtk_radio_group_get_selected (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio
)));
137 if (type
== FillSeriesTypeDate
)
138 gtk_widget_set_sensitive (state
->date_steps_type
, TRUE
);
140 gtk_widget_set_sensitive (state
->date_steps_type
, FALSE
);
144 * dialog_fill_series_tool_init:
147 * Create the dialog (guru).
151 dialog_fill_series_tool_init (FillSeriesState
*state
)
156 gboolean prefer_rows
= FALSE
;
158 sel
= selection_first_range (state
->base
.sv
, NULL
, NULL
);
160 /* Set the sensitivity of Unit day. */
161 radio
= go_gtk_builder_get_widget (state
->base
.gui
,
163 g_signal_connect (G_OBJECT (radio
), "clicked",
164 G_CALLBACK (cb_type_button_clicked
), state
);
166 state
->stop_entry
= go_gtk_builder_get_widget (state
->base
.gui
, "stop_entry");
167 g_signal_connect_after (G_OBJECT (state
->stop_entry
),
169 G_CALLBACK (cb_fill_series_update_sensitivity
), state
);
170 state
->step_entry
= go_gtk_builder_get_widget (state
->base
.gui
, "step_entry");
171 g_signal_connect_after (G_OBJECT (state
->step_entry
),
173 G_CALLBACK (cb_fill_series_update_sensitivity
), state
);
174 state
->start_entry
= go_gtk_builder_get_widget (state
->base
.gui
, "start_entry");
175 g_signal_connect_after (G_OBJECT (state
->start_entry
),
177 G_CALLBACK (cb_fill_series_update_sensitivity
), state
);
180 state
->date_steps_type
= go_gtk_builder_get_widget (state
->base
.gui
,
182 gtk_widget_set_sensitive (state
->date_steps_type
, FALSE
);
184 button
= (sel
== NULL
||
186 (range_width (sel
) >= range_height (sel
))))
189 radio
= go_gtk_builder_get_widget (state
->base
.gui
, button
);
190 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio
), TRUE
);
196 dialog_tool_preset_to_range (&state
->base
);
198 cell_start
= sheet_cell_get (state
->base
.sheet
,
199 sel
->start
.col
, sel
->start
.row
);
201 char *content
= gnm_cell_get_rendered_text (cell_start
);
203 gtk_entry_set_text (GTK_ENTRY (state
->start_entry
),
208 cell_end
= prefer_rows
?
209 sheet_cell_get (state
->base
.sheet
,
210 sel
->end
.col
, sel
->start
.row
) :
211 sheet_cell_get (state
->base
.sheet
,
212 sel
->start
.col
, sel
->end
.row
);
214 char *content
= gnm_cell_get_rendered_text (cell_end
);
216 gtk_entry_set_text (GTK_ENTRY (state
->stop_entry
),
221 if (cell_start
&& cell_end
) {
222 float_to_entry (GTK_ENTRY(state
->step_entry
),
223 (value_get_as_float(cell_end
->value
) -
224 value_get_as_float(cell_start
->value
))
226 (sel
->end
.col
-sel
->start
.col
) :
227 (sel
->end
.row
-sel
->start
.row
)));
231 cb_fill_series_update_sensitivity (NULL
, state
);
235 dialog_fill_series (WBCGtk
*wbcg
)
237 FillSeriesState
*state
;
238 WorkbookControl
*wbc
= GNM_WBC (wbcg
);
239 SheetView
*sv
= wb_control_cur_sheet_view (wbc
);
241 g_return_if_fail (wbcg
!= NULL
);
243 /* Only pop up one copy per workbook */
244 if (gnm_dialog_raise_if_exists (wbcg
, FILL_SERIES_KEY
)) {
248 state
= g_new (FillSeriesState
, 1);
250 if (dialog_tool_init ((GnmGenericToolState
*)state
, wbcg
, sv_sheet (sv
),
251 GNUMERIC_HELP_LINK_FILL_SERIES
,
252 "res:ui/fill-series.ui", "Fill_series",
253 _("Could not create the Fill Series dialog."),
255 G_CALLBACK (cb_fill_series_ok_clicked
), NULL
,
256 G_CALLBACK (cb_fill_series_update_sensitivity
),
260 gnm_dao_set_put (GNM_DAO (state
->base
.gdao
), FALSE
, FALSE
);
261 dialog_fill_series_tool_init (state
);
262 gtk_widget_show (state
->base
.dialog
);