Changes for build after moving strutil into lib
[midnight-commander/osp/lisovros.git] / src / option.c
blob8419339175b031d39666e62a4445d8a20d70b2b7
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.
20 /** \file option.c
21 * \brief Source: configure box module
24 #include <config.h>
26 #include <stdio.h>
27 #include <string.h>
29 #include <sys/types.h>
30 #include <sys/stat.h>
31 #include <unistd.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"
38 #include "dialog.h"
39 #include "widget.h"
40 #include "setup.h" /* For save_setup() */
41 #include "main.h"
42 #include "panel.h" /* Needed for the externs */
43 #include "file.h" /* safe_delete */
44 #include "layout.h" /* For nice_rotating_dash */
45 #include "option.h"
47 static Dlg_head *conf_dlg;
49 #define TOGGLE_VARIABLE 0
51 static int first_width, second_width;
53 static struct {
54 const char *text;
55 int *variable;
56 void (*toggle_function)(void);
57 WCheck *widget;
58 } check_options [] = {
59 /* other 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 },
73 /* panel options */
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 },
81 { 0, 0, 0, 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] = {
91 N_("&Never"),
92 N_("on dumb &Terminals"),
93 N_("Alwa&ys") };
95 #define PAUSE_OPTIONS (sizeof(pause_options) / sizeof(pause_options[0]))
97 /* Heights of the panes */
98 #define PY 3
99 #define OY PY
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 */
106 #define X_MARGIN 3
107 #define X_PANE_GAP 1
108 #define PX X_MARGIN
109 #define RX X_MARGIN
110 #define OX (first_width + X_MARGIN + X_PANE_GAP)
112 /* Create the "Configure options" dialog */
113 static void
114 init_configure (void)
116 int i;
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) {
125 register int l1;
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)
141 first_width = l1;
142 } else {
143 if (l1 > second_width)
144 second_width = l1;
148 i = PAUSE_OPTIONS;
149 while (i--) {
150 pause_options[i] = _(pause_options[i]);
151 l1 = str_term_width1 (pause_options[i]) + 7;
152 if (l1 > first_width)
153 first_width = l1;
156 l1 = str_term_width1 (title2) + 1;
157 if (l1 > first_width)
158 first_width = l1;
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;
165 b1 = 5 + i;
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;
172 conf_dlg =
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,
189 cancel_button, 0));
191 add_widget (conf_dlg,
192 button_new (BY, b2, B_EXIT, NORMAL_BUTTON,
193 save_button, 0));
195 add_widget (conf_dlg,
196 button_new (BY, b1, B_ENTER, DEFPUSH_BUTTON,
197 ok_button, 0));
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);
208 pause_radio =
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)
225 int result, i;
227 init_configure ();
228 run_dlg (conf_dlg);
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)();
236 else
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){
245 save_configure ();
246 mc_config_save_file (mc_main_config, NULL);
249 destroy_dlg (conf_dlg);