Merge branch '2161_del_clear_dialog_field'
[midnight-commander.git] / src / option.c
blob95d991518035fecd79b1d3c6a158d861dbdc7e9b
1 /* Configure box module for the Midnight Commander
2 Copyright (C) 1994, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
3 2007, 2009, 2010 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.
20 /** \file option.c
21 * \brief Source: configure boxes module
24 #include <config.h>
26 #include <stdlib.h> /* atoi() */
27 #include <stdio.h>
28 #include <string.h>
30 #include <sys/types.h>
31 #include <sys/stat.h>
32 #include <unistd.h>
34 #include "lib/global.h"
35 #include "lib/mcconfig.h" /* mc_config_save_file() */
36 #include "lib/strutil.h" /* str_term_width1() */
37 #include "lib/tty/key.h" /* old_esc_mode_timeout */
39 #include "dialog.h" /* B_ constants */
40 #include "setup.h" /* panels_options */
41 #include "main.h"
42 #include "file.h" /* file_op_compute_totals */
43 #include "layout.h" /* nice_rotating_dash */
44 #include "wtools.h" /* QuickDialog */
45 #include "history.h" /* MC_HISTORY_ESC_TIMEOUT */
47 #include "option.h"
50 void
51 configure_box (void)
53 int dlg_width = 60;
54 int dlg_height = 20;
56 char time_out[BUF_TINY] = "";
57 char *time_out_new;
59 const char *pause_options[] = {
60 N_("&Never"),
61 N_("On dum&b terminals"),
62 N_("Alwa&ys")
65 int pause_options_num = sizeof (pause_options) / sizeof (pause_options[0]);
67 QuickWidget quick_widgets[] = {
68 /* buttons */
69 QUICK_BUTTON (38, dlg_width, dlg_height - 3, dlg_height, N_("&Cancel"), B_CANCEL, NULL),
70 QUICK_BUTTON (26, dlg_width, dlg_height - 3, dlg_height, N_("&Save"), B_EXIT, NULL),
71 QUICK_BUTTON (14, dlg_width, dlg_height - 3, dlg_height, N_("&OK"), B_ENTER, NULL),
72 /* other options */
73 QUICK_CHECKBOX (dlg_width / 2 + 2, dlg_width, 12, dlg_height, N_("A&uto save setup"),
74 &auto_save_setup),
75 QUICK_CHECKBOX (dlg_width / 2 + 2, dlg_width, 11, dlg_height, N_("Sa&fe delete"),
76 &safe_delete),
77 QUICK_CHECKBOX (dlg_width / 2 + 2, dlg_width, 10, dlg_height, N_("Cd follows lin&ks"),
78 &cd_symlinks),
79 QUICK_CHECKBOX (dlg_width / 2 + 2, dlg_width, 9, dlg_height, N_("Rotating d&ash"),
80 &nice_rotating_dash),
81 QUICK_CHECKBOX (dlg_width / 2 + 2, dlg_width, 8, dlg_height, N_("Co&mplete: show all"),
82 &show_all_if_ambiguous),
83 QUICK_CHECKBOX (dlg_width / 2 + 2, dlg_width, 7, dlg_height, N_("Shell &patterns"),
84 &easy_patterns),
85 QUICK_CHECKBOX (dlg_width / 2 + 2, dlg_width, 6, dlg_height, N_("&Drop down menus"),
86 &drop_menus),
87 QUICK_CHECKBOX (dlg_width / 2 + 2, dlg_width, 5, dlg_height, N_("Auto m&enus"), &auto_menu),
88 QUICK_CHECKBOX (dlg_width / 2 + 2, dlg_width, 4, dlg_height, N_("Use internal vie&w"),
89 &use_internal_view),
90 QUICK_CHECKBOX (dlg_width / 2 + 2, dlg_width, 3, dlg_height, N_("Use internal edi&t"),
91 &use_internal_edit),
92 QUICK_GROUPBOX (dlg_width / 2, dlg_width, 2, dlg_height, dlg_width / 2 - 4, 15,
93 N_("Other options")),
94 /* pause options */
95 QUICK_RADIO (5, dlg_width, 13, dlg_height, pause_options_num, pause_options,
96 &pause_after_run),
97 QUICK_GROUPBOX (3, dlg_width, 12, dlg_height, dlg_width / 2 - 4, 5, N_("Pause after run")),
99 /* Esc key mode */
100 QUICK_INPUT (10, dlg_width, 10, dlg_height, (const char *) time_out, 8, 0,
101 MC_HISTORY_ESC_TIMEOUT, &time_out_new),
102 QUICK_LABEL (5, dlg_width, 10, dlg_height, N_("Timeout:")),
103 QUICK_CHECKBOX (5, dlg_width, 9, dlg_height, N_("S&ingle press"), &old_esc_mode),
104 QUICK_GROUPBOX (3, dlg_width, 8, dlg_height, dlg_width / 2 - 4, 4, N_("Esc key mode")),
106 /* file operation options */
107 QUICK_CHECKBOX (5, dlg_width, 6, dlg_height, N_("Mkdi&r autoname"), &auto_fill_mkdir_name),
108 QUICK_CHECKBOX (5, dlg_width, 5, dlg_height, N_("Classic pro&gressbar"), &classic_progressbar),
109 QUICK_CHECKBOX (5, dlg_width, 4, dlg_height, N_("Compute tota&ls"),
110 &file_op_compute_totals),
111 QUICK_CHECKBOX (5, dlg_width, 3, dlg_height, N_("&Verbose operation"), &verbose),
112 QUICK_GROUPBOX (3, dlg_width, 2, dlg_height, dlg_width / 2 - 4, 6,
113 N_("File operation options")),
114 QUICK_END
117 const size_t qw_num = sizeof (quick_widgets) / sizeof (quick_widgets[0]) - 1;
119 QuickDialog Quick_input = {
120 dlg_width, dlg_height, -1, -1,
121 N_("Configure options"), "[Configuration]",
122 quick_widgets, TRUE
125 int qd_result;
127 int b0_len, b1_len, b2_len;
128 int b_len, c_len, g_len, l_len;
129 size_t i;
131 #ifdef ENABLE_NLS
133 for (i = 0; i < qw_num; i++)
134 if (i < 3)
135 /* buttons */
136 quick_widgets[i].u.button.text = _(quick_widgets[i].u.button.text);
137 else if ((i == 13) || (i == 15) || (i == 19) || (i == 24))
138 /* groupboxes */
139 quick_widgets[i].u.groupbox.title = _(quick_widgets[i].u.groupbox.title);
140 else if (i == 14)
142 /* radio button */
143 size_t j;
144 for (j = 0; j < (size_t) pause_options_num; j++)
145 pause_options[j] = _(pause_options[j]);
147 else if (i == 17)
148 /* label */
149 quick_widgets[i].u.label.text = _(quick_widgets[i].u.label.text);
150 else if (i != 16)
151 /* checkboxes */
152 quick_widgets[i].u.checkbox.text = _(quick_widgets[i].u.checkbox.text);
154 Quick_input.title = _(Quick_input.title);
156 #endif /* ENABLE_NLS */
158 /* calculate widget and dialog widths */
159 /* dialog title */
160 dlg_width = max (dlg_width, str_term_width1 (Quick_input.title) + 4);
161 /* buttons */
162 b0_len = str_term_width1 (quick_widgets[0].u.button.text) + 3;
163 b1_len = str_term_width1 (quick_widgets[1].u.button.text) + 3;
164 b2_len = str_term_width1 (quick_widgets[2].u.button.text) + 5;
165 b_len = b0_len + b1_len + b2_len + 2;
167 /* checkboxes within groupboxes */
168 c_len = 0;
169 for (i = 3; i < 24; i++)
170 if ((i < 13) || (i == 18) || (i > 19))
171 c_len = max (c_len, str_term_width1 (quick_widgets[i].u.checkbox.text) + 3);
172 /* radiobuttons */
173 for (i = 0; i < (size_t) pause_options_num; i++)
174 c_len = max (c_len, str_term_width1 (pause_options[i]) + 3);
175 /* label + input */
176 l_len = str_term_width1 (quick_widgets[17].u.label.text);
177 c_len = max (c_len, l_len + 1 + 8);
178 /* groupboxes */
179 g_len = max (c_len + 2, str_term_width1 (quick_widgets[24].u.groupbox.title) + 4);
180 g_len = max (g_len, str_term_width1 (quick_widgets[19].u.groupbox.title) + 4);
181 g_len = max (g_len, str_term_width1 (quick_widgets[15].u.groupbox.title) + 4);
182 g_len = max (g_len, str_term_width1 (quick_widgets[13].u.groupbox.title) + 4);
183 /* dialog width */
184 Quick_input.xlen = max (dlg_width, g_len * 2 + 9);
185 Quick_input.xlen = max (Quick_input.xlen, b_len + 2);
186 if ((Quick_input.xlen & 1) != 0)
187 Quick_input.xlen++;
189 /* fix widget parameters */
190 for (i = 0; i < qw_num; i++)
191 quick_widgets[i].x_divisions = Quick_input.xlen;
193 /* groupboxes */
194 quick_widgets[15].u.groupbox.width =
195 quick_widgets[19].u.groupbox.width =
196 quick_widgets[24].u.groupbox.width = Quick_input.xlen / 2 - 4;
197 quick_widgets[13].u.groupbox.width = Quick_input.xlen / 2 - 3;
199 /* input */
200 quick_widgets[16].relative_x = quick_widgets[17].relative_x + l_len + 1;
201 quick_widgets[16].u.input.len = quick_widgets[19].u.groupbox.width - l_len - 4;
203 /* right column */
204 quick_widgets[13].relative_x = Quick_input.xlen / 2;
205 for (i = 3; i < 13; i++)
206 quick_widgets[i].relative_x = quick_widgets[13].relative_x + 2;
208 /* buttons */
209 quick_widgets[2].relative_x = (Quick_input.xlen - b_len) / 2;
210 quick_widgets[1].relative_x = quick_widgets[2].relative_x + b2_len + 1;
211 quick_widgets[0].relative_x = quick_widgets[1].relative_x + b1_len + 1;
213 g_snprintf (time_out, sizeof (time_out), "%d", old_esc_mode_timeout);
215 qd_result = quick_dialog (&Quick_input);
217 if ((qd_result == B_ENTER) || (qd_result == B_EXIT))
218 old_esc_mode_timeout = atoi (time_out_new);
220 g_free (time_out_new);
222 /* Save button */
223 if (qd_result == B_EXIT)
225 save_config ();
226 mc_config_save_file (mc_main_config, NULL);
230 void
231 panel_options_box (void)
233 int dlg_width = 60;
234 int dlg_height = 19;
236 const char *qsearch_options[] = {
237 N_("Case &insensitive"),
238 N_("Case s&ensitive"),
239 N_("Use panel sort mo&de")
242 QuickWidget quick_widgets[] = {
243 /* buttons */
244 QUICK_BUTTON (38, dlg_width, dlg_height - 3, dlg_height, N_("&Cancel"), B_CANCEL, NULL),
245 QUICK_BUTTON (26, dlg_width, dlg_height - 3, dlg_height, N_("&Save"), B_EXIT, NULL),
246 QUICK_BUTTON (14, dlg_width, dlg_height - 3, dlg_height, N_("&OK"), B_ENTER, NULL),
247 /* quick search */
248 QUICK_RADIO (dlg_width / 2 + 2, dlg_width, 12, dlg_height, QSEARCH_NUM, qsearch_options,
249 (int *) &panels_options.qsearch_mode),
250 QUICK_GROUPBOX (dlg_width / 2, dlg_width, 11, dlg_height, dlg_width / 2 - 4, QSEARCH_NUM + 2,
251 N_("Quick search")),
252 /* file highlighting */
253 QUICK_CHECKBOX (dlg_width / 2 + 2, dlg_width, 9, dlg_height, N_("&Permissions"),
254 &panels_options.permission_mode),
255 QUICK_CHECKBOX (dlg_width / 2 + 2, dlg_width, 8, dlg_height, N_("File &types"),
256 &panels_options.filetype_mode),
257 QUICK_GROUPBOX (dlg_width / 2, dlg_width, 7, dlg_height, dlg_width / 2 - 4, 4,
258 N_("File highlight")),
259 /* navigation */
260 QUICK_CHECKBOX (dlg_width / 2 + 2, dlg_width, 5, dlg_height, N_("&Mouse page scrolling"),
261 &panels_options.mouse_move_pages),
262 QUICK_CHECKBOX (dlg_width / 2 + 2, dlg_width, 4, dlg_height, N_("Pa&ge scrolling"),
263 &panels_options.scroll_pages),
264 QUICK_CHECKBOX (dlg_width / 2 + 2, dlg_width, 3, dlg_height, N_("L&ynx-like motion"),
265 &panels_options.navigate_with_arrows),
266 QUICK_GROUPBOX (dlg_width / 2, dlg_width, 2, dlg_height, dlg_width / 2 - 4, 5,
267 N_("Navigation")),
268 /* main panel options */
269 QUICK_CHECKBOX (5, dlg_width, 10, dlg_height, N_("A&uto save panels setup"),
270 &panels_options.auto_save_setup),
271 QUICK_CHECKBOX (5, dlg_width, 9, dlg_height, N_("Re&verse files only"),
272 &panels_options.reverse_files_only),
273 QUICK_CHECKBOX (5, dlg_width, 8, dlg_height, N_("Ma&rk moves down"),
274 &panels_options.mark_moves_down),
275 QUICK_CHECKBOX (5, dlg_width, 7, dlg_height, N_("&Fast dir reload"),
276 &panels_options.fast_reload),
277 QUICK_CHECKBOX (5, dlg_width, 6, dlg_height, N_("Show &hidden files"),
278 &panels_options.show_dot_files),
279 QUICK_CHECKBOX (5, dlg_width, 5, dlg_height, N_("Show &backup files"),
280 &panels_options.show_backups),
281 QUICK_CHECKBOX (5, dlg_width, 4, dlg_height, N_("Mi&x all files"),
282 &panels_options.mix_all_files),
283 QUICK_CHECKBOX (5, dlg_width, 3, dlg_height, N_("Use SI si&ze units"),
284 &panels_options.kilobyte_si),
285 QUICK_GROUPBOX (3, dlg_width, 2, dlg_height, dlg_width / 2 - 4, 14, N_("Main panel options")),
286 QUICK_END
289 const size_t qw_num = sizeof (quick_widgets) / sizeof (quick_widgets[0]) - 1;
291 QuickDialog Quick_input = {
292 dlg_width, dlg_height, -1, -1,
293 N_("Panel options"), "[Panel options]",
294 quick_widgets, TRUE
297 int qd_result;
299 int b0_len, b1_len, b2_len;
300 int b_len, c_len, g_len;
301 size_t i;
303 #ifdef ENABLE_NLS
305 for (i = 0; i < qw_num; i++)
306 if (i < 3)
307 /* buttons */
308 quick_widgets[i].u.button.text = _(quick_widgets[i].u.button.text);
309 else if (i == 3)
311 /* radio button */
312 size_t j;
313 for (j = 0; j < QSEARCH_NUM; j++)
314 qsearch_options[j] = _(qsearch_options[j]);
316 else if ((i == 4) || (i == 7) || (i == 11) || (i == 20))
317 /* groupboxes */
318 quick_widgets[i].u.groupbox.title = _(quick_widgets[i].u.groupbox.title);
319 else
320 /* checkboxes */
321 quick_widgets[i].u.checkbox.text = _(quick_widgets[i].u.checkbox.text);
323 Quick_input.title = _(Quick_input.title);
325 #endif /* ENABLE_NLS */
327 /* calculate widget and dialog widths */
328 /* dialog title */
329 dlg_width = max (dlg_width, str_term_width1 (Quick_input.title) + 4);
330 /* buttons */
331 b0_len = str_term_width1 (quick_widgets[0].u.button.text) + 3;
332 b1_len = str_term_width1 (quick_widgets[1].u.button.text) + 3;
333 b2_len = str_term_width1 (quick_widgets[2].u.button.text) + 5;
334 b_len = b0_len + b1_len + b2_len + 2;
336 /* checkboxes within groupboxes */
337 c_len = 0;
338 for (i = 5; i < 20; i++)
339 if ((i != 7) && (i != 11))
340 c_len = max (c_len, str_term_width1 (quick_widgets[i].u.checkbox.text) + 4);
342 /* radiobuttons */
343 for (i = 0; i < QSEARCH_NUM; i++)
344 c_len = max (c_len, str_term_width1 (qsearch_options[i]) + 3);
345 /* groupboxes */
346 g_len = max (c_len + 2, str_term_width1 (quick_widgets[4].u.groupbox.title) + 4);
347 g_len = max (g_len, str_term_width1 (quick_widgets[ 7].u.groupbox.title) + 4);
348 g_len = max (g_len, str_term_width1 (quick_widgets[11].u.groupbox.title) + 4);
349 g_len = max (g_len, str_term_width1 (quick_widgets[20].u.groupbox.title) + 4);
350 /* dialog width */
351 Quick_input.xlen = max (dlg_width, g_len * 2 + 9);
352 Quick_input.xlen = max (Quick_input.xlen, b_len + 2);
353 if ((Quick_input.xlen & 1) != 0)
354 Quick_input.xlen++;
356 /* fix widget parameters */
357 for (i = 0; i < qw_num; i++)
358 quick_widgets[i].x_divisions = Quick_input.xlen;
360 /* groupboxes */
361 quick_widgets[4].u.groupbox.width =
362 quick_widgets[ 7].u.groupbox.width =
363 quick_widgets[11].u.groupbox.width = Quick_input.xlen / 2 - 3;
364 quick_widgets[20].u.groupbox.width = Quick_input.xlen / 2 - 4;
366 /* right column */
367 quick_widgets[4].relative_x =
368 quick_widgets[ 7].relative_x =
369 quick_widgets[11].relative_x = Quick_input.xlen / 2;
370 for (i = 3; i < 11; i++)
371 if ((i != 4) && (i != 7))
372 quick_widgets[i].relative_x = quick_widgets[4].relative_x + 2;
374 /* buttons */
375 quick_widgets[2].relative_x = (Quick_input.xlen - b_len) / 2;
376 quick_widgets[1].relative_x = quick_widgets[2].relative_x + b2_len + 1;
377 quick_widgets[0].relative_x = quick_widgets[1].relative_x + b1_len + 1;
379 qd_result = quick_dialog (&Quick_input);
381 if ((qd_result == B_ENTER) || (qd_result == B_EXIT))
383 if (!panels_options.fast_reload_msg_shown && panels_options.fast_reload)
385 message (D_NORMAL, _("Information"),
386 _(" Using the fast reload option may not reflect the exact \n"
387 " directory contents. In this case you'll need to do a \n"
388 " manual reload of the directory. See the man page for \n"
389 " the details. "));
390 panels_options.fast_reload_msg_shown = TRUE;
392 update_panels (UP_RELOAD, UP_KEEPSEL);
395 if (qd_result == B_EXIT)
397 /* save panel options */
398 panels_save_options ();
399 mc_config_save_file (mc_main_config, NULL);