2 * dialog-col-width.c: Sets the magnification factor
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>
25 #include <dialogs/dialogs.h>
26 #include <dialogs/help.h>
30 #include <workbook-control.h>
34 #include <sheet-view.h>
35 #include <application.h>
36 #include <workbook-cmd-format.h>
39 #define COL_WIDTH_DIALOG_KEY "col-width-dialog"
47 GtkWidget
*apply_button
;
48 GtkWidget
*cancel_button
;
49 GtkWidget
*default_check
;
50 GtkWidget
*description
;
54 gboolean set_default_value
;
57 gboolean orig_is_default
;
58 gboolean orig_some_default
;
59 gboolean orig_all_equal
;
64 dialog_col_width_update_points (ColWidthState
*state
)
66 gint value
= gtk_spin_button_get_value_as_int (state
->spin
);
67 double size_points
= value
* 72./gnm_app_display_dpi_get (FALSE
);
70 pts
= g_strdup_printf ("%.2f",size_points
);
71 gtk_label_set_text (GTK_LABEL (state
->points
), pts
);
76 dialog_col_width_button_sensitivity (ColWidthState
*state
)
78 gint value
= gtk_spin_button_get_value_as_int (state
->spin
);
79 gboolean use_default
= gtk_toggle_button_get_active
80 (GTK_TOGGLE_BUTTON (state
->default_check
));
81 gboolean changed_info
;
83 if (state
->set_default_value
) {
84 changed_info
= (state
->orig_value
!= value
);
86 changed_info
= (((!state
->orig_all_equal
|| (state
->orig_value
!= value
)
87 || state
->orig_some_default
) && !use_default
)
88 || (use_default
&& !state
->orig_is_default
));
91 gtk_widget_set_sensitive (state
->ok_button
, changed_info
);
92 gtk_widget_set_sensitive (state
->apply_button
, changed_info
);
94 dialog_col_width_update_points (state
);
98 cb_dialog_col_width_cancel_clicked (G_GNUC_UNUSED GtkWidget
*button
,
101 gtk_widget_destroy (state
->dialog
);
107 dialog_col_width_set_value (gint value
, ColWidthState
*state
)
109 gint adj_value
= value
/state
->sheet
->last_zoom_factor_used
+ 0.5;
110 gtk_spin_button_set_value (state
->spin
, adj_value
);
115 dialog_col_width_load_value (ColWidthState
*state
)
119 state
->orig_is_default
= TRUE
;
120 state
->orig_some_default
= FALSE
;
121 state
->orig_all_equal
= TRUE
;
123 state
->adjusting
= TRUE
;
124 if (state
->set_default_value
) {
125 value
= sheet_col_get_default_size_pixels (state
->sheet
);
127 for (l
= state
->sv
->selections
; l
; l
= l
->next
){
128 GnmRange
*ss
= l
->data
;
131 for (col
= ss
->start
.col
; col
<= ss
->end
.col
; col
++){
132 ColRowInfo
const *ri
= sheet_col_get_info (state
->sheet
, col
);
134 state
->orig_is_default
= FALSE
;
136 state
->orig_some_default
= TRUE
;
138 value
= ri
->size_pixels
;
139 else if (value
!= ri
->size_pixels
){
140 /* Values differ, so let the user enter the data */
141 state
->orig_all_equal
= FALSE
;
145 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state
->default_check
),
146 state
->orig_is_default
);
148 state
->orig_value
= dialog_col_width_set_value (value
, state
);
149 dialog_col_width_button_sensitivity (state
);
150 state
->adjusting
= FALSE
;
155 cb_dialog_col_width_value_changed (G_GNUC_UNUSED GtkSpinButton
*spinbutton
,
156 ColWidthState
*state
)
158 if (!state
->adjusting
) {
159 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state
->default_check
), FALSE
);
160 dialog_col_width_button_sensitivity (state
);
165 cb_dialog_col_width_default_check_toggled (GtkToggleButton
*togglebutton
, ColWidthState
*state
)
167 if (!state
->adjusting
) {
168 if (gtk_toggle_button_get_active (togglebutton
)) {
169 state
->adjusting
= TRUE
;
170 dialog_col_width_set_value (sheet_col_get_default_size_pixels (state
->sheet
),
172 state
->adjusting
= FALSE
;
174 dialog_col_width_button_sensitivity (state
);
179 cb_dialog_col_width_apply_clicked (G_GNUC_UNUSED GtkWidget
*button
,
180 ColWidthState
*state
)
182 gint value
= gtk_spin_button_get_value_as_int (state
->spin
);
183 int size_pixels
= (int)(value
* state
->sheet
->last_zoom_factor_used
+ 0.5);
184 gboolean use_default
= gtk_toggle_button_get_active
185 (GTK_TOGGLE_BUTTON (state
->default_check
));
187 if (state
->set_default_value
) {
188 double points
= value
* 72./gnm_app_display_dpi_get (FALSE
);
189 cmd_colrow_std_size (GNM_WBC (state
->wbcg
),
190 state
->sheet
, TRUE
, points
);
191 dialog_col_width_load_value (state
);
196 workbook_cmd_resize_selected_colrow (GNM_WBC (state
->wbcg
),
197 state
->sheet
, TRUE
, size_pixels
);
198 dialog_col_width_load_value (state
);
205 cb_dialog_col_width_ok_clicked (GtkWidget
*button
, ColWidthState
*state
)
207 cb_dialog_col_width_apply_clicked (button
, state
);
208 gtk_widget_destroy (state
->dialog
);
214 dialog_col_width_set_mode (gboolean set_default
, ColWidthState
*state
)
216 state
->set_default_value
= set_default
;
219 gtk_widget_hide (state
->default_check
);
220 gtk_label_set_text (GTK_LABEL (state
->description
),
221 _("Set standard/default column width"));
224 char *name
= g_markup_escape_text (state
->sheet
->name_unquoted
, -1);
225 gtk_widget_show (state
->default_check
);
226 text
= g_strdup_printf (_("Set column width of selection on "
227 "<span style='italic' weight='bold'>%s</span>"),
229 gtk_label_set_markup (GTK_LABEL (state
->description
), text
);
237 dialog_col_width (WBCGtk
*wbcg
, gboolean use_default
)
240 ColWidthState
*state
;
242 g_return_if_fail (wbcg
!= NULL
);
244 if (gnm_dialog_raise_if_exists (wbcg
, COL_WIDTH_DIALOG_KEY
))
246 gui
= gnm_gtk_builder_load ("res:ui/col-width.ui", NULL
, GO_CMD_CONTEXT (wbcg
));
250 state
= g_new (ColWidthState
, 1);
252 state
->sv
= wb_control_cur_sheet_view (GNM_WBC (wbcg
));
253 state
->sheet
= sv_sheet (state
->sv
);
254 state
->adjusting
= FALSE
;
255 state
->dialog
= go_gtk_builder_get_widget (gui
, "dialog");
257 state
->description
= GTK_WIDGET (go_gtk_builder_get_widget (gui
, "description"));
258 state
->points
= GTK_WIDGET (go_gtk_builder_get_widget (gui
, "pts-label"));
260 state
->spin
= GTK_SPIN_BUTTON (go_gtk_builder_get_widget (gui
, "spin"));
261 gtk_adjustment_set_lower (gtk_spin_button_get_adjustment (state
->spin
),
262 GNM_COL_MARGIN
+ GNM_COL_MARGIN
);
263 g_signal_connect (G_OBJECT (state
->spin
),
265 G_CALLBACK (cb_dialog_col_width_value_changed
), state
);
267 state
->default_check
= GTK_WIDGET (go_gtk_builder_get_widget (gui
, "default_check"));
268 g_signal_connect (G_OBJECT (state
->default_check
),
270 G_CALLBACK (cb_dialog_col_width_default_check_toggled
), state
);
272 state
->ok_button
= go_gtk_builder_get_widget (gui
, "ok_button");
273 g_signal_connect (G_OBJECT (state
->ok_button
),
275 G_CALLBACK (cb_dialog_col_width_ok_clicked
), state
);
276 state
->apply_button
= go_gtk_builder_get_widget (gui
, "apply_button");
277 g_signal_connect (G_OBJECT (state
->apply_button
),
279 G_CALLBACK (cb_dialog_col_width_apply_clicked
), state
);
281 state
->cancel_button
= go_gtk_builder_get_widget (gui
, "cancel_button");
282 g_signal_connect (G_OBJECT (state
->cancel_button
),
284 G_CALLBACK (cb_dialog_col_width_cancel_clicked
), state
);
286 gnm_init_help_button (
287 go_gtk_builder_get_widget (gui
, "help_button"),
288 GNUMERIC_HELP_LINK_COL_WIDTH
);
290 gnm_dialog_setup_destroy_handlers (GTK_DIALOG (state
->dialog
),
292 GNM_DIALOG_DESTROY_CURRENT_SHEET_REMOVED
);
293 dialog_col_width_set_mode (use_default
, state
);
294 dialog_col_width_load_value (state
);
296 wbc_gtk_attach_guru (state
->wbcg
, state
->dialog
);
297 g_object_set_data_full (G_OBJECT (state
->dialog
),
298 "state", state
, (GDestroyNotify
)g_free
);
300 gnm_keyed_dialog (wbcg
, GTK_WINDOW (state
->dialog
),
301 COL_WIDTH_DIALOG_KEY
);
302 gtk_widget_show (state
->dialog
);
303 g_object_unref (gui
);