Applied MC indentation policy.
[midnight-commander.git] / src / option.c
blobca72dcdf506e48e19860a249039fd360e4d616c6
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);