GUI: Move .ui files from goffice resources to glib resources
[gnumeric.git] / src / dialogs / dialog-col-width.c
blob4578684886308d1f425eff2a00c95f007a4ddea0
1 /* vim: set sw=8: -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2 /**
3 * dialog-col-width.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 COL_WIDTH_DIALOG_KEY "col-width-dialog"
43 typedef struct {
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 } ColWidthState;
65 static void
66 dialog_col_width_update_points (ColWidthState *state)
68 gint value = gtk_spin_button_get_value_as_int (state->spin);
69 double size_points = value * 72./gnm_app_display_dpi_get (FALSE);
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_col_width_button_sensitivity (ColWidthState *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_col_width_update_points (state);
99 static void
100 cb_dialog_col_width_cancel_clicked (G_GNUC_UNUSED GtkWidget *button,
101 ColWidthState *state)
103 gtk_widget_destroy (state->dialog);
104 return;
108 static gint
109 dialog_col_width_set_value (gint value, ColWidthState *state)
111 gint adj_value = value/state->sheet->last_zoom_factor_used + 0.5;
112 gtk_spin_button_set_value (state->spin, adj_value);
113 return adj_value;
116 static void
117 dialog_col_width_load_value (ColWidthState *state)
119 GSList *l;
120 gint value = 0;
121 state->orig_is_default = TRUE;
122 state->orig_some_default = FALSE;
123 state->orig_all_equal = TRUE;
125 state->adjusting = TRUE;
126 if (state->set_default_value) {
127 value = sheet_col_get_default_size_pixels (state->sheet);
128 } else {
129 for (l = state->sv->selections; l; l = l->next){
130 GnmRange *ss = l->data;
131 int col;
133 for (col = ss->start.col; col <= ss->end.col; col++){
134 ColRowInfo const *ri = sheet_col_get_info (state->sheet, col);
135 if (ri->hard_size)
136 state->orig_is_default = FALSE;
137 else
138 state->orig_some_default = TRUE;
139 if (value == 0)
140 value = ri->size_pixels;
141 else if (value != ri->size_pixels){
142 /* Values differ, so let the user enter the data */
143 state->orig_all_equal = FALSE;
147 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state->default_check),
148 state->orig_is_default);
150 state->orig_value = dialog_col_width_set_value (value, state);
151 dialog_col_width_button_sensitivity (state);
152 state->adjusting = FALSE;
156 static void
157 cb_dialog_col_width_value_changed (G_GNUC_UNUSED GtkSpinButton *spinbutton,
158 ColWidthState *state)
160 if (!state->adjusting) {
161 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state->default_check), FALSE);
162 dialog_col_width_button_sensitivity (state);
166 static void
167 cb_dialog_col_width_default_check_toggled (GtkToggleButton *togglebutton, ColWidthState *state)
169 if (!state->adjusting) {
170 if (gtk_toggle_button_get_active (togglebutton)) {
171 state->adjusting = TRUE;
172 dialog_col_width_set_value (sheet_col_get_default_size_pixels (state->sheet),
173 state);
174 state->adjusting = FALSE;
176 dialog_col_width_button_sensitivity (state);
180 static void
181 cb_dialog_col_width_apply_clicked (G_GNUC_UNUSED GtkWidget *button,
182 ColWidthState *state)
184 gint value = gtk_spin_button_get_value_as_int (state->spin);
185 int size_pixels = (int)(value * state->sheet->last_zoom_factor_used + 0.5);
186 gboolean use_default = gtk_toggle_button_get_active
187 (GTK_TOGGLE_BUTTON (state->default_check));
189 if (state->set_default_value) {
190 double points = value * 72./gnm_app_display_dpi_get (FALSE);
191 cmd_colrow_std_size (GNM_WBC (state->wbcg),
192 state->sheet, TRUE, points);
193 dialog_col_width_load_value (state);
194 } else {
195 if (use_default)
196 size_pixels = 0;
198 workbook_cmd_resize_selected_colrow (GNM_WBC (state->wbcg),
199 state->sheet, TRUE, size_pixels);
200 dialog_col_width_load_value (state);
203 return;
206 static void
207 cb_dialog_col_width_ok_clicked (GtkWidget *button, ColWidthState *state)
209 cb_dialog_col_width_apply_clicked (button, state);
210 gtk_widget_destroy (state->dialog);
211 return;
215 static void
216 dialog_col_width_set_mode (gboolean set_default, ColWidthState *state)
218 state->set_default_value = set_default;
220 if (set_default) {
221 gtk_widget_hide (state->default_check);
222 gtk_label_set_text (GTK_LABEL (state->description),
223 _("Set standard/default column width"));
224 } else {
225 char *text;
226 char *name = g_markup_escape_text (state->sheet->name_unquoted, -1);
227 gtk_widget_show (state->default_check);
228 text = g_strdup_printf (_("Set column width of selection on "
229 "<span style='italic' weight='bold'>%s</span>"),
230 name);
231 gtk_label_set_markup (GTK_LABEL (state->description), text);
232 g_free (text);
233 g_free (name);
238 void
239 dialog_col_width (WBCGtk *wbcg, gboolean use_default)
241 GtkBuilder *gui;
242 ColWidthState *state;
244 g_return_if_fail (wbcg != NULL);
246 if (gnm_dialog_raise_if_exists (wbcg, COL_WIDTH_DIALOG_KEY))
247 return;
248 gui = gnm_gtk_builder_load ("res:ui/col-width.ui", NULL, GO_CMD_CONTEXT (wbcg));
249 if (gui == NULL)
250 return;
252 state = g_new (ColWidthState, 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->dialog = go_gtk_builder_get_widget (gui, "dialog");
259 state->description = GTK_WIDGET (go_gtk_builder_get_widget (gui, "description"));
260 state->points = GTK_WIDGET (go_gtk_builder_get_widget (gui, "pts-label"));
262 state->spin = GTK_SPIN_BUTTON (go_gtk_builder_get_widget (gui, "spin"));
263 gtk_adjustment_set_lower (gtk_spin_button_get_adjustment (state->spin),
264 GNM_COL_MARGIN + GNM_COL_MARGIN);
265 g_signal_connect (G_OBJECT (state->spin),
266 "value-changed",
267 G_CALLBACK (cb_dialog_col_width_value_changed), state);
269 state->default_check = GTK_WIDGET (go_gtk_builder_get_widget (gui, "default_check"));
270 g_signal_connect (G_OBJECT (state->default_check),
271 "clicked",
272 G_CALLBACK (cb_dialog_col_width_default_check_toggled), state);
274 state->ok_button = go_gtk_builder_get_widget (gui, "ok_button");
275 g_signal_connect (G_OBJECT (state->ok_button),
276 "clicked",
277 G_CALLBACK (cb_dialog_col_width_ok_clicked), state);
278 state->apply_button = go_gtk_builder_get_widget (gui, "apply_button");
279 g_signal_connect (G_OBJECT (state->apply_button),
280 "clicked",
281 G_CALLBACK (cb_dialog_col_width_apply_clicked), state);
283 state->cancel_button = go_gtk_builder_get_widget (gui, "cancel_button");
284 g_signal_connect (G_OBJECT (state->cancel_button),
285 "clicked",
286 G_CALLBACK (cb_dialog_col_width_cancel_clicked), state);
288 gnm_init_help_button (
289 go_gtk_builder_get_widget (gui, "help_button"),
290 GNUMERIC_HELP_LINK_COL_WIDTH);
292 gnm_dialog_setup_destroy_handlers (GTK_DIALOG (state->dialog),
293 state->wbcg,
294 GNM_DIALOG_DESTROY_CURRENT_SHEET_REMOVED);
295 dialog_col_width_set_mode (use_default, state);
296 dialog_col_width_load_value (state);
298 wbc_gtk_attach_guru (state->wbcg, state->dialog);
299 g_object_set_data_full (G_OBJECT (state->dialog),
300 "state", state, (GDestroyNotify)g_free);
302 gnm_keyed_dialog (wbcg, GTK_WINDOW (state->dialog),
303 COL_WIDTH_DIALOG_KEY);
304 gtk_widget_show (state->dialog);
305 g_object_unref (gui);