1 /* vim: set sw=8: -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
3 * dialog-col-width.c: Sets the magnification factor
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>
31 #include <workbook-control.h>
35 #include <sheet-view.h>
36 #include <application.h>
37 #include <workbook-cmd-format.h>
41 #define COL_WIDTH_DIALOG_KEY "col-width-dialog"
49 GtkWidget
*apply_button
;
50 GtkWidget
*cancel_button
;
51 GtkWidget
*default_check
;
52 GtkWidget
*description
;
56 gboolean set_default_value
;
59 gboolean orig_is_default
;
60 gboolean orig_some_default
;
61 gboolean orig_all_equal
;
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
);
72 pts
= g_strdup_printf ("%.2f",size_points
);
73 gtk_label_set_text (GTK_LABEL (state
->points
), pts
);
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
);
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
);
100 cb_dialog_col_width_cancel_clicked (G_GNUC_UNUSED GtkWidget
*button
,
101 ColWidthState
*state
)
103 gtk_widget_destroy (state
->dialog
);
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
);
117 dialog_col_width_load_value (ColWidthState
*state
)
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
);
129 for (l
= state
->sv
->selections
; l
; l
= l
->next
){
130 GnmRange
*ss
= l
->data
;
133 for (col
= ss
->start
.col
; col
<= ss
->end
.col
; col
++){
134 ColRowInfo
const *ri
= sheet_col_get_info (state
->sheet
, col
);
136 state
->orig_is_default
= FALSE
;
138 state
->orig_some_default
= TRUE
;
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
;
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
);
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
),
174 state
->adjusting
= FALSE
;
176 dialog_col_width_button_sensitivity (state
);
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
);
198 workbook_cmd_resize_selected_colrow (GNM_WBC (state
->wbcg
),
199 state
->sheet
, TRUE
, size_pixels
);
200 dialog_col_width_load_value (state
);
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
);
216 dialog_col_width_set_mode (gboolean set_default
, ColWidthState
*state
)
218 state
->set_default_value
= set_default
;
221 gtk_widget_hide (state
->default_check
);
222 gtk_label_set_text (GTK_LABEL (state
->description
),
223 _("Set standard/default column width"));
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>"),
231 gtk_label_set_markup (GTK_LABEL (state
->description
), text
);
239 dialog_col_width (WBCGtk
*wbcg
, gboolean use_default
)
242 ColWidthState
*state
;
244 g_return_if_fail (wbcg
!= NULL
);
246 if (gnm_dialog_raise_if_exists (wbcg
, COL_WIDTH_DIALOG_KEY
))
248 gui
= gnm_gtk_builder_load ("res:ui/col-width.ui", NULL
, GO_CMD_CONTEXT (wbcg
));
252 state
= g_new (ColWidthState
, 1);
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
),
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
),
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
),
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
),
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
),
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
),
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
);