GUI: Move .ui files from goffice resources to glib resources
[gnumeric.git] / src / dialogs / dialog-row-height.c
blobb7b480adedf055f528ae3de80207e3c3c3a4d16a
1 /* vim: set sw=8: -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2 /**
3 * dialog-row-height.c: Sets the magnification factor
5 * Author:
6 * Andreas J. Guelzow <aguelzow@taliesin.ca>
8 * (c) Copyright 2002 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.h"
27 #include "help.h"
29 #include <gui-util.h>
30 #include <commands.h>
31 #include <workbook-control.h>
32 #include <workbook.h>
33 #include <wbc-gtk.h>
34 #include <sheet.h>
35 #include <sheet-view.h>
36 #include <application.h>
37 #include <workbook-cmd-format.h>
39 #include <gtk/gtk.h>
41 #define ROW_HEIGHT_DIALOG_KEY "row-height-dialog"
43 typedef struct {
44 GtkBuilder *gui;
45 WBCGtk *wbcg;
46 Sheet *sheet;
47 SheetView *sv;
48 GtkWidget *dialog;
49 GtkWidget *ok_button;
50 GtkWidget *apply_button;
51 GtkWidget *cancel_button;
52 GtkWidget *default_check;
53 GtkWidget *description;
54 GtkWidget *points;
55 GtkSpinButton *spin;
57 gboolean set_default_value;
59 gint orig_value;
60 gboolean orig_is_default;
61 gboolean orig_some_default;
62 gboolean orig_all_equal;
63 gboolean adjusting;
64 } RowHeightState;
66 static void
67 dialog_row_height_update_points (RowHeightState *state)
69 gint value = gtk_spin_button_get_value_as_int (state->spin);
70 double size_points = value * 72./gnm_app_display_dpi_get (TRUE);
71 gchar *pts;
73 pts = g_strdup_printf ("%.2f",size_points);
74 gtk_label_set_text (GTK_LABEL (state->points), pts);
75 g_free (pts);
78 static void
79 dialog_row_height_button_sensitivity (RowHeightState *state)
81 gint value = gtk_spin_button_get_value_as_int (state->spin);
82 gboolean use_default = gtk_toggle_button_get_active
83 (GTK_TOGGLE_BUTTON (state->default_check));
84 gboolean changed_info;
86 if (state->set_default_value) {
87 changed_info = (state->orig_value != value);
88 } else {
89 changed_info = (((!state->orig_all_equal || (state->orig_value != value)
90 || state->orig_some_default) && !use_default)
91 || (use_default && !state->orig_is_default));
94 gtk_widget_set_sensitive (state->ok_button, changed_info);
95 gtk_widget_set_sensitive (state->apply_button, changed_info);
97 dialog_row_height_update_points (state);
100 static void
101 cb_dialog_row_height_destroy (RowHeightState *state)
103 if (state->gui != NULL)
104 g_object_unref (state->gui);
105 g_free (state);
108 static void
109 cb_dialog_row_height_cancel_clicked (G_GNUC_UNUSED GtkWidget *button,
110 RowHeightState *state)
112 gtk_widget_destroy (state->dialog);
116 static gint
117 dialog_row_height_set_value (gint value, RowHeightState *state)
119 gint adj_value = value/state->sheet->last_zoom_factor_used + 0.5;
120 gtk_spin_button_set_value (state->spin, adj_value);
121 return adj_value;
124 static void
125 dialog_row_height_load_value (RowHeightState *state)
127 GSList *l;
128 gint value = 0;
129 state->orig_is_default = TRUE;
130 state->orig_some_default = FALSE;
131 state->orig_all_equal = TRUE;
133 state->adjusting = TRUE;
134 if (state->set_default_value) {
135 value = sheet_row_get_default_size_pixels (state->sheet);
136 } else {
137 for (l = state->sv->selections; l; l = l->next){
138 GnmRange *ss = l->data;
139 int row;
141 for (row = ss->start.row; row <= ss->end.row; row++){
142 ColRowInfo const *ri = sheet_row_get_info (state->sheet, row);
143 if (ri->hard_size)
144 state->orig_is_default = FALSE;
145 else
146 state->orig_some_default = TRUE;
147 if (value == 0)
148 value = ri->size_pixels;
149 else if (value != ri->size_pixels){
150 /* Values differ, so let the user enter the data */
151 state->orig_all_equal = FALSE;
155 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state->default_check),
156 state->orig_is_default);
158 state->orig_value = dialog_row_height_set_value (value, state);
159 dialog_row_height_button_sensitivity (state);
160 state->adjusting = FALSE;
163 static void
164 cb_dialog_row_height_value_changed (G_GNUC_UNUSED GtkSpinButton *spinbutton,
165 RowHeightState *state)
167 if (!state->adjusting) {
168 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state->default_check), FALSE);
169 dialog_row_height_button_sensitivity (state);
173 static void
174 cb_dialog_row_height_default_check_toggled (GtkToggleButton *togglebutton, RowHeightState *state)
176 if (!state->adjusting) {
177 if (gtk_toggle_button_get_active (togglebutton)) {
178 state->adjusting = TRUE;
179 dialog_row_height_set_value (sheet_row_get_default_size_pixels (state->sheet),
180 state);
181 state->adjusting = FALSE;
183 dialog_row_height_button_sensitivity (state);
187 static void
188 cb_dialog_row_height_apply_clicked (G_GNUC_UNUSED GtkWidget *button,
189 RowHeightState *state)
191 gint value = gtk_spin_button_get_value_as_int (state->spin);
192 int size_pixels = (int)(value * state->sheet->last_zoom_factor_used + 0.5);
193 gboolean use_default = gtk_toggle_button_get_active
194 (GTK_TOGGLE_BUTTON (state->default_check));
196 if (state->set_default_value) {
197 double points = value * 72./gnm_app_display_dpi_get (TRUE);
198 cmd_colrow_std_size (GNM_WBC (state->wbcg),
199 state->sheet, FALSE, points);
200 dialog_row_height_load_value (state);
201 } else {
202 if (use_default)
203 size_pixels = 0;
205 workbook_cmd_resize_selected_colrow (GNM_WBC (state->wbcg),
206 state->sheet, FALSE, size_pixels);
207 dialog_row_height_load_value (state);
211 static void
212 cb_dialog_row_height_ok_clicked (GtkWidget *button, RowHeightState *state)
214 cb_dialog_row_height_apply_clicked (button, state);
215 gtk_widget_destroy (state->dialog);
219 static void
220 dialog_row_height_set_mode (gboolean set_default, RowHeightState *state)
222 state->set_default_value = set_default;
224 if (set_default) {
225 gtk_widget_hide (state->default_check);
226 gtk_label_set_text (GTK_LABEL (state->description),
227 _("Set standard/default row height"));
228 } else {
229 char *text;
230 char *name = g_markup_escape_text (state->sheet->name_unquoted, -1);
231 gtk_widget_show (state->default_check);
232 text = g_strdup_printf (_("Set row height of selection on "
233 "<span style='italic' weight='bold'>%s</span>"),
234 name);
235 gtk_label_set_markup (GTK_LABEL (state->description), text);
236 g_free (text);
237 g_free (name);
242 void
243 dialog_row_height (WBCGtk *wbcg, gboolean use_default)
245 RowHeightState *state;
247 g_return_if_fail (wbcg != NULL);
249 if (gnm_dialog_raise_if_exists (wbcg, ROW_HEIGHT_DIALOG_KEY))
250 return;
252 state = g_new (RowHeightState, 1);
253 state->wbcg = wbcg;
254 state->sv = wb_control_cur_sheet_view (GNM_WBC (wbcg));
255 state->sheet = sv_sheet (state->sv);
256 state->adjusting = FALSE;
257 state->gui = gnm_gtk_builder_load ("res:ui/row-height.ui", NULL, GO_CMD_CONTEXT (wbcg));
258 g_return_if_fail (state->gui != NULL);
260 state->dialog = go_gtk_builder_get_widget (state->gui, "dialog");
262 state->description = GTK_WIDGET (go_gtk_builder_get_widget (state->gui, "description"));
263 state->points = GTK_WIDGET (go_gtk_builder_get_widget (state->gui, "pts-label"));
265 state->spin = GTK_SPIN_BUTTON (go_gtk_builder_get_widget (state->gui, "spin"));
266 gtk_adjustment_set_lower (gtk_spin_button_get_adjustment (state->spin),
267 GNM_ROW_MARGIN + GNM_ROW_MARGIN + 1);
268 g_signal_connect (G_OBJECT (state->spin),
269 "value-changed",
270 G_CALLBACK (cb_dialog_row_height_value_changed), state);
272 state->default_check = GTK_WIDGET (go_gtk_builder_get_widget (state->gui, "default_check"));
273 g_signal_connect (G_OBJECT (state->default_check),
274 "clicked",
275 G_CALLBACK (cb_dialog_row_height_default_check_toggled), state);
277 state->ok_button = go_gtk_builder_get_widget (state->gui, "ok_button");
278 g_signal_connect (G_OBJECT (state->ok_button),
279 "clicked",
280 G_CALLBACK (cb_dialog_row_height_ok_clicked), state);
281 state->apply_button = go_gtk_builder_get_widget (state->gui, "apply_button");
282 g_signal_connect (G_OBJECT (state->apply_button),
283 "clicked",
284 G_CALLBACK (cb_dialog_row_height_apply_clicked), state);
286 state->cancel_button = go_gtk_builder_get_widget (state->gui, "cancel_button");
287 g_signal_connect (G_OBJECT (state->cancel_button),
288 "clicked",
289 G_CALLBACK (cb_dialog_row_height_cancel_clicked), state);
291 gnm_init_help_button (
292 go_gtk_builder_get_widget (state->gui, "help_button"),
293 GNUMERIC_HELP_LINK_ROW_HEIGHT);
294 g_object_set_data_full (G_OBJECT (state->dialog),
295 "state", state, (GDestroyNotify) cb_dialog_row_height_destroy);
297 gnm_dialog_setup_destroy_handlers (GTK_DIALOG (state->dialog),
298 state->wbcg,
299 GNM_DIALOG_DESTROY_CURRENT_SHEET_REMOVED);
301 dialog_row_height_set_mode (use_default, state);
302 dialog_row_height_load_value (state);
304 wbc_gtk_attach_guru (state->wbcg, state->dialog);
305 gnm_keyed_dialog (wbcg, GTK_WINDOW (state->dialog),
306 ROW_HEIGHT_DIALOG_KEY);
307 gtk_widget_show (state->dialog);