1 /* Configure box module for the Midnight Commander
2 Copyright (C) 1994, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
3 2007, 2009 Free Software Foundation, Inc.
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21 * \brief Source: configure box module
29 #include <sys/types.h>
33 #include "lib/global.h"
34 #include "lib/tty/tty.h"
35 #include "lib/mcconfig/mcconfig.h" /* For mc_config_save_file */
36 #include "lib/strutil.h"
40 #include "setup.h" /* For save_setup() */
42 #include "panel.h" /* Needed for the externs */
43 #include "file.h" /* safe_delete */
44 #include "layout.h" /* For nice_rotating_dash */
47 static Dlg_head
*conf_dlg
;
49 #define TOGGLE_VARIABLE 0
51 static int first_width
, second_width
;
56 void (*toggle_function
)(void);
58 } check_options
[] = {
60 {N_("safe de&Lete"), &safe_delete
, TOGGLE_VARIABLE
, 0 },
61 {N_("cd follows lin&Ks"), &cd_symlinks
, TOGGLE_VARIABLE
, 0 },
62 {N_("L&ynx-like motion"), &navigate_with_arrows
,TOGGLE_VARIABLE
, 0 },
63 {N_("rotatin&G dash"), &nice_rotating_dash
,TOGGLE_VARIABLE
, 0 },
64 {N_("co&Mplete: show all"),&show_all_if_ambiguous
,TOGGLE_VARIABLE
, 0 },
65 {N_("&Use internal view"), &use_internal_view
, TOGGLE_VARIABLE
, 0 },
66 {N_("use internal ed&It"), &use_internal_edit
, TOGGLE_VARIABLE
, 0 },
67 {N_("auto m&Enus"), &auto_menu
, TOGGLE_VARIABLE
, 0 },
68 {N_("&Auto save setup"), &auto_save_setup
, TOGGLE_VARIABLE
, 0 },
69 {N_("shell &Patterns"), &easy_patterns
, TOGGLE_VARIABLE
, 0 },
70 {N_("Compute &Totals"), &file_op_compute_totals
, TOGGLE_VARIABLE
, 0 },
71 {N_("&Verbose operation"), &verbose
, TOGGLE_VARIABLE
, 0 },
72 {N_("Mkdir autoname"), &auto_fill_mkdir_name
, TOGGLE_VARIABLE
, 0 },
74 {N_("&Fast dir reload"), &fast_reload
, toggle_fast_reload
, 0 },
75 {N_("mi&X all files"), &mix_all_files
, toggle_mix_all_files
, 0 },
76 {N_("&Drop down menus"), &drop_menus
, TOGGLE_VARIABLE
, 0 },
77 {N_("ma&Rk moves down"), &mark_moves_down
, TOGGLE_VARIABLE
, 0 },
78 {N_("show &Hidden files"), &show_dot_files
, toggle_show_hidden
, 0 },
79 {N_("show &Backup files"), &show_backups
, toggle_show_backup
, 0 },
80 {N_("Use SI si&ze units"), &kilobyte_si
, toggle_kilobyte_si
, 0 },
84 /* Make sure this corresponds to the check_options structure */
85 #define OTHER_OPTIONS 13
86 #define PANEL_OPTIONS 7
88 static WRadio
*pause_radio
;
90 static const char *pause_options
[3] = {
92 N_("on dumb &Terminals"),
95 #define PAUSE_OPTIONS (sizeof(pause_options) / sizeof(pause_options[0]))
97 /* Heights of the panes */
100 /* Align bottoms of "pause after run" and "other options" */
101 #define RY (OTHER_OPTIONS - PAUSE_OPTIONS + OY)
102 #define DLG_Y (OTHER_OPTIONS + 9)
103 #define BY (DLG_Y - 3)
105 /* Horizontal dimensions */
110 #define OX (first_width + X_MARGIN + X_PANE_GAP)
112 /* Create the "Configure options" dialog */
114 init_configure (void)
117 static int i18n_config_flag
= 0;
118 static int b1
, b2
, b3
;
119 const char *ok_button
= _("&OK");
120 const char *cancel_button
= _("&Cancel");
121 const char *save_button
= _("&Save");
122 static const char *title1
, *title2
, *title3
;
124 if (!i18n_config_flag
) {
127 /* Similar code is in layout.c (init_layout()) */
129 title1
= _(" Panel options ");
130 title2
= _(" Pause after run... ");
131 title3
= _(" Other options ");
133 first_width
= str_term_width1 (title1
) + 1;
134 second_width
= str_term_width1 (title3
) + 1;
136 for (i
= 0; check_options
[i
].text
; i
++) {
137 check_options
[i
].text
= _(check_options
[i
].text
);
138 l1
= str_term_width1 (check_options
[i
].text
) + 7;
139 if (i
>= OTHER_OPTIONS
) {
140 if (l1
> first_width
)
143 if (l1
> second_width
)
150 pause_options
[i
] = _(pause_options
[i
]);
151 l1
= str_term_width1 (pause_options
[i
]) + 7;
152 if (l1
> first_width
)
156 l1
= str_term_width1 (title2
) + 1;
157 if (l1
> first_width
)
160 l1
= 11 + str_term_width1 (ok_button
)
161 + str_term_width1 (save_button
)
162 + str_term_width1 (cancel_button
);
164 i
= (first_width
+ second_width
- l1
) / 4;
166 b2
= b1
+ str_term_width1 (ok_button
) + i
+ 6;
167 b3
= b2
+ str_term_width1 (save_button
) + i
+ 4;
169 i18n_config_flag
= 1;
173 create_dlg (0, 0, DLG_Y
,
174 first_width
+ second_width
+ 2 * X_MARGIN
+ X_PANE_GAP
,
175 dialog_colors
, NULL
, "[Configuration]",
176 _("Configure options"), DLG_CENTER
| DLG_REVERSE
);
178 add_widget (conf_dlg
,
179 groupbox_new (PY
, PX
, PANEL_OPTIONS
+ 2, first_width
, title1
));
181 add_widget (conf_dlg
,
182 groupbox_new (RY
, RX
, PAUSE_OPTIONS
+ 2, first_width
, title2
));
184 add_widget (conf_dlg
,
185 groupbox_new (OY
, OX
, OTHER_OPTIONS
+ 2, second_width
, title3
));
187 add_widget (conf_dlg
,
188 button_new (BY
, b3
, B_CANCEL
, NORMAL_BUTTON
,
191 add_widget (conf_dlg
,
192 button_new (BY
, b2
, B_EXIT
, NORMAL_BUTTON
,
195 add_widget (conf_dlg
,
196 button_new (BY
, b1
, B_ENTER
, DEFPUSH_BUTTON
,
199 #define XTRACT(i) *check_options[i].variable, check_options[i].text
201 /* Add checkboxes for "other options" */
202 for (i
= 0; i
< OTHER_OPTIONS
; i
++) {
203 check_options
[i
].widget
=
204 check_new (OY
+ (OTHER_OPTIONS
- i
), OX
+ 2, XTRACT (i
));
205 add_widget (conf_dlg
, check_options
[i
].widget
);
209 radio_new (RY
+ 1, RX
+ 2, 3, pause_options
);
210 pause_radio
->sel
= pause_after_run
;
211 add_widget (conf_dlg
, pause_radio
);
213 /* Add checkboxes for "panel options" */
214 for (i
= 0; i
< PANEL_OPTIONS
; i
++) {
215 check_options
[i
+ OTHER_OPTIONS
].widget
=
216 check_new (PY
+ (PANEL_OPTIONS
- i
), PX
+ 2,
217 XTRACT (i
+ OTHER_OPTIONS
));
218 add_widget (conf_dlg
, check_options
[i
+ OTHER_OPTIONS
].widget
);
223 void configure_box (void)
230 result
= conf_dlg
->ret_value
;
231 if (result
== B_ENTER
|| result
== B_EXIT
){
232 for (i
= 0; check_options
[i
].text
; i
++)
233 if (check_options
[i
].widget
->state
& C_CHANGE
){
234 if (check_options
[i
].toggle_function
)
235 (*check_options
[i
].toggle_function
)();
237 *check_options
[i
].variable
=
238 !(*check_options
[i
].variable
);
240 pause_after_run
= pause_radio
->sel
;
243 /* If they pressed the save button */
244 if (result
== B_EXIT
){
246 mc_config_save_file (mc_main_config
, NULL
);
249 destroy_dlg (conf_dlg
);