Compilation: don't compile dialogs separately.
[gnumeric.git] / src / dialogs / dialog-row-height.c
blob888ecbc74aece2305f5a6a3c7df0ffdb643954ca
1 /*
2 * dialog-row-height.c: Sets the magnification factor
4 * Author:
5 * Andreas J. Guelzow <aguelzow@taliesin.ca>
7 * (c) Copyright 2002 Andreas J. Guelzow <aguelzow@taliesin.ca>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, see <https://www.gnu.org/licenses/>.
22 #include <gnumeric-config.h>
23 #include <glib/gi18n-lib.h>
24 #include <gnumeric.h>
25 #include "dialogs.h"
26 #include "help.h"
28 #include <gui-util.h>
29 #include <commands.h>
30 #include <workbook-control.h>
31 #include <workbook.h>
32 #include <wbc-gtk.h>
33 #include <sheet.h>
34 #include <sheet-view.h>
35 #include <application.h>
36 #include <workbook-cmd-format.h>
38 #include <gtk/gtk.h>
40 #define ROW_HEIGHT_DIALOG_KEY "row-height-dialog"
42 typedef struct {
43 GtkBuilder *gui;
44 WBCGtk *wbcg;
45 Sheet *sheet;
46 SheetView *sv;
47 GtkWidget *dialog;
48 GtkWidget *ok_button;
49 GtkWidget *apply_button;
50 GtkWidget *cancel_button;
51 GtkWidget *default_check;
52 GtkWidget *description;
53 GtkWidget *points;
54 GtkSpinButton *spin;
56 gboolean set_default_value;
58 gint orig_value;
59 gboolean orig_is_default;
60 gboolean orig_some_default;
61 gboolean orig_all_equal;
62 gboolean adjusting;
63 } RowHeightState;
65 static void
66 dialog_row_height_update_points (RowHeightState *state)
68 gint value = gtk_spin_button_get_value_as_int (state->spin);
69 double size_points = value * 72./gnm_app_display_dpi_get (TRUE);
70 gchar *pts;
72 pts = g_strdup_printf ("%.2f",size_points);
73 gtk_label_set_text (GTK_LABEL (state->points), pts);
74 g_free (pts);
77 static void
78 dialog_row_height_button_sensitivity (RowHeightState *state)
80 gint value = gtk_spin_button_get_value_as_int (state->spin);
81 gboolean use_default = gtk_toggle_button_get_active
82 (GTK_TOGGLE_BUTTON (state->default_check));
83 gboolean changed_info;
85 if (state->set_default_value) {
86 changed_info = (state->orig_value != value);
87 } else {
88 changed_info = (((!state->orig_all_equal || (state->orig_value != value)
89 || state->orig_some_default) && !use_default)
90 || (use_default && !state->orig_is_default));
93 gtk_widget_set_sensitive (state->ok_button, changed_info);
94 gtk_widget_set_sensitive (state->apply_button, changed_info);
96 dialog_row_height_update_points (state);
99 static void
100 cb_dialog_row_height_destroy (RowHeightState *state)
102 if (state->gui != NULL)
103 g_object_unref (state->gui);
104 g_free (state);
107 static void
108 cb_dialog_row_height_cancel_clicked (G_GNUC_UNUSED GtkWidget *button,
109 RowHeightState *state)
111 gtk_widget_destroy (state->dialog);
115 static gint
116 dialog_row_height_set_value (gint value, RowHeightState *state)
118 gint adj_value = value/state->sheet->last_zoom_factor_used + 0.5;
119 gtk_spin_button_set_value (state->spin, adj_value);
120 return adj_value;
123 static void
124 dialog_row_height_load_value (RowHeightState *state)
126 GSList *l;
127 gint value = 0;
128 state->orig_is_default = TRUE;
129 state->orig_some_default = FALSE;
130 state->orig_all_equal = TRUE;
132 state->adjusting = TRUE;
133 if (state->set_default_value) {
134 value = sheet_row_get_default_size_pixels (state->sheet);
135 } else {
136 for (l = state->sv->selections; l; l = l->next){
137 GnmRange *ss = l->data;
138 int row;
140 for (row = ss->start.row; row <= ss->end.row; row++){
141 ColRowInfo const *ri = sheet_row_get_info (state->sheet, row);
142 if (ri->hard_size)
143 state->orig_is_default = FALSE;
144 else
145 state->orig_some_default = TRUE;
146 if (value == 0)
147 value = ri->size_pixels;
148 else if (value != ri->size_pixels){
149 /* Values differ, so let the user enter the data */
150 state->orig_all_equal = FALSE;
154 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state->default_check),
155 state->orig_is_default);
157 state->orig_value = dialog_row_height_set_value (value, state);
158 dialog_row_height_button_sensitivity (state);
159 state->adjusting = FALSE;
162 static void
163 cb_dialog_row_height_value_changed (G_GNUC_UNUSED GtkSpinButton *spinbutton,
164 RowHeightState *state)
166 if (!state->adjusting) {
167 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state->default_check), FALSE);
168 dialog_row_height_button_sensitivity (state);
172 static void
173 cb_dialog_row_height_default_check_toggled (GtkToggleButton *togglebutton, RowHeightState *state)
175 if (!state->adjusting) {
176 if (gtk_toggle_button_get_active (togglebutton)) {
177 state->adjusting = TRUE;
178 dialog_row_height_set_value (sheet_row_get_default_size_pixels (state->sheet),
179 state);
180 state->adjusting = FALSE;
182 dialog_row_height_button_sensitivity (state);
186 static void
187 cb_dialog_row_height_apply_clicked (G_GNUC_UNUSED GtkWidget *button,
188 RowHeightState *state)
190 gint value = gtk_spin_button_get_value_as_int (state->spin);
191 int size_pixels = (int)(value * state->sheet->last_zoom_factor_used + 0.5);
192 gboolean use_default = gtk_toggle_button_get_active
193 (GTK_TOGGLE_BUTTON (state->default_check));
195 if (state->set_default_value) {
196 double points = value * 72./gnm_app_display_dpi_get (TRUE);
197 cmd_colrow_std_size (GNM_WBC (state->wbcg),
198 state->sheet, FALSE, points);
199 dialog_row_height_load_value (state);
200 } else {
201 if (use_default)
202 size_pixels = 0;
204 workbook_cmd_resize_selected_colrow (GNM_WBC (state->wbcg),
205 state->sheet, FALSE, size_pixels);
206 dialog_row_height_load_value (state);
210 static void
211 cb_dialog_row_height_ok_clicked (GtkWidget *button, RowHeightState *state)
213 cb_dialog_row_height_apply_clicked (button, state);
214 gtk_widget_destroy (state->dialog);
218 static void
219 dialog_row_height_set_mode (gboolean set_default, RowHeightState *state)
221 state->set_default_value = set_default;
223 if (set_default) {
224 gtk_widget_hide (state->default_check);
225 gtk_label_set_text (GTK_LABEL (state->description),
226 _("Set standard/default row height"));
227 } else {
228 char *text;
229 char *name = g_markup_escape_text (state->sheet->name_unquoted, -1);
230 gtk_widget_show (state->default_check);
231 text = g_strdup_printf (_("Set row height of selection on "
232 "<span style='italic' weight='bold'>%s</span>"),
233 name);
234 gtk_label_set_markup (GTK_LABEL (state->description), text);
235 g_free (text);
236 g_free (name);
241 void
242 dialog_row_height (WBCGtk *wbcg, gboolean use_default)
244 RowHeightState *state;
246 g_return_if_fail (wbcg != NULL);
248 if (gnm_dialog_raise_if_exists (wbcg, ROW_HEIGHT_DIALOG_KEY))
249 return;
251 state = g_new (RowHeightState, 1);
252 state->wbcg = wbcg;
253 state->sv = wb_control_cur_sheet_view (GNM_WBC (wbcg));
254 state->sheet = sv_sheet (state->sv);
255 state->adjusting = FALSE;
256 state->gui = gnm_gtk_builder_load ("res:ui/row-height.ui", NULL, GO_CMD_CONTEXT (wbcg));
257 g_return_if_fail (state->gui != NULL);
259 state->dialog = go_gtk_builder_get_widget (state->gui, "dialog");
261 state->description = GTK_WIDGET (go_gtk_builder_get_widget (state->gui, "description"));
262 state->points = GTK_WIDGET (go_gtk_builder_get_widget (state->gui, "pts-label"));
264 state->spin = GTK_SPIN_BUTTON (go_gtk_builder_get_widget (state->gui, "spin"));
265 gtk_adjustment_set_lower (gtk_spin_button_get_adjustment (state->spin),
266 GNM_ROW_MARGIN + GNM_ROW_MARGIN + 1);
267 g_signal_connect (G_OBJECT (state->spin),
268 "value-changed",
269 G_CALLBACK (cb_dialog_row_height_value_changed), state);
271 state->default_check = GTK_WIDGET (go_gtk_builder_get_widget (state->gui, "default_check"));
272 g_signal_connect (G_OBJECT (state->default_check),
273 "clicked",
274 G_CALLBACK (cb_dialog_row_height_default_check_toggled), state);
276 state->ok_button = go_gtk_builder_get_widget (state->gui, "ok_button");
277 g_signal_connect (G_OBJECT (state->ok_button),
278 "clicked",
279 G_CALLBACK (cb_dialog_row_height_ok_clicked), state);
280 state->apply_button = go_gtk_builder_get_widget (state->gui, "apply_button");
281 g_signal_connect (G_OBJECT (state->apply_button),
282 "clicked",
283 G_CALLBACK (cb_dialog_row_height_apply_clicked), state);
285 state->cancel_button = go_gtk_builder_get_widget (state->gui, "cancel_button");
286 g_signal_connect (G_OBJECT (state->cancel_button),
287 "clicked",
288 G_CALLBACK (cb_dialog_row_height_cancel_clicked), state);
290 gnm_init_help_button (
291 go_gtk_builder_get_widget (state->gui, "help_button"),
292 GNUMERIC_HELP_LINK_ROW_HEIGHT);
293 g_object_set_data_full (G_OBJECT (state->dialog),
294 "state", state, (GDestroyNotify) cb_dialog_row_height_destroy);
296 gnm_dialog_setup_destroy_handlers (GTK_DIALOG (state->dialog),
297 state->wbcg,
298 GNM_DIALOG_DESTROY_CURRENT_SHEET_REMOVED);
300 dialog_row_height_set_mode (use_default, state);
301 dialog_row_height_load_value (state);
303 wbc_gtk_attach_guru (state->wbcg, state->dialog);
304 gnm_keyed_dialog (wbcg, GTK_WINDOW (state->dialog),
305 ROW_HEIGHT_DIALOG_KEY);
306 gtk_widget_show (state->dialog);