Clarify usage of use_internal_edit variable
[midnight-commander.git] / src / filemanager / boxes.c
blobdb01587f62219123b9618cfc67224beeb5c9cd86
1 /*
2 Some misc dialog boxes for the program.
4 Copyright (C) 1994, 1995, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
5 2005, 2006, 2009, 2010, 2011, 2012, 2013
6 The Free Software Foundation, Inc.
8 Written by:
9 Miguel de Icaza, 1994, 1995
10 Jakub Jelinek, 1995
11 Andrew Borodin <aborodin@vmail.ru>, 2009, 2010, 2011, 2012, 2013
13 This file is part of the Midnight Commander.
15 The Midnight Commander is free software: you can redistribute it
16 and/or modify it under the terms of the GNU General Public License as
17 published by the Free Software Foundation, either version 3 of the License,
18 or (at your option) any later version.
20 The Midnight Commander is distributed in the hope that it will be useful,
21 but WITHOUT ANY WARRANTY; without even the implied warranty of
22 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 GNU General Public License for more details.
25 You should have received a copy of the GNU General Public License
26 along with this program. If not, see <http://www.gnu.org/licenses/>.
29 /** \file boxes.c
30 * \brief Source: Some misc dialog boxes for the program
33 #include <config.h>
35 #include <ctype.h>
36 #include <signal.h>
37 #include <stdio.h>
38 #include <stdlib.h>
39 #include <string.h>
40 #include <sys/types.h>
41 #include <sys/stat.h>
43 #include "lib/global.h"
45 #include "lib/tty/tty.h"
46 #include "lib/tty/key.h" /* XCTRL and ALT macros */
47 #include "lib/skin.h" /* INPUT_COLOR */
48 #include "lib/mcconfig.h" /* Load/save user formats */
49 #include "lib/strutil.h"
51 #include "lib/vfs/vfs.h"
52 #ifdef ENABLE_VFS_FTP
53 #include "src/vfs/ftpfs/ftpfs.h"
54 #endif /* ENABLE_VFS_FTP */
55 #ifdef ENABLE_VFS_SMB
56 #include "src/vfs/smbfs/smbfs.h"
57 #endif /* ENABLE_VFS_SMB */
59 #include "lib/util.h" /* Q_() */
60 #include "lib/widget.h"
62 #include "src/setup.h" /* For profile_name */
63 #include "src/history.h" /* MC_HISTORY_ESC_TIMEOUT */
64 #include "src/execute.h" /* pause_after_run */
65 #ifdef ENABLE_BACKGROUND
66 #include "src/background.h" /* task_list */
67 #endif
69 #ifdef HAVE_CHARSET
70 #include "lib/charsets.h"
71 #include "src/selcodepage.h"
72 #endif
74 #include "command.h" /* For cmdline */
75 #include "dir.h"
76 #include "panel.h" /* LIST_TYPES */
77 #include "tree.h"
78 #include "layout.h" /* for get_nth_panel_name proto */
79 #include "midnight.h" /* current_panel */
81 #include "boxes.h"
83 /*** global variables ****************************************************************************/
85 /*** file scope macro definitions ****************************************************************/
87 #ifdef ENABLE_BACKGROUND
88 #define B_STOP (B_USER+1)
89 #define B_RESUME (B_USER+2)
90 #define B_KILL (B_USER+3)
91 #endif /* ENABLE_BACKGROUND */
93 /*** file scope type declarations ****************************************************************/
95 /*** file scope variables ************************************************************************/
97 unsigned long configure_old_esc_mode_id, configure_time_out_id;
99 /* Index in list_types[] for "user defined" */
100 static const int panel_listing_user_idx = 3;
102 static char **status_format;
103 static int listing_user_hotkey = 'u';
104 static unsigned long panel_listing_types_id, panel_user_format_id;
105 static unsigned long mini_user_status_id, mini_user_format_id;
107 #ifdef HAVE_CHARSET
108 static int new_display_codepage;
109 static unsigned long disp_bits_name_id;
110 #endif /* HAVE_CHARSET */
112 #if defined(ENABLE_VFS) && defined(ENABLE_VFS_FTP)
113 static unsigned long ftpfs_always_use_proxy_id, ftpfs_proxy_host_id;
114 #endif /* ENABLE_VFS && ENABLE_VFS_FTP */
116 #ifdef ENABLE_BACKGROUND
117 static WListbox *bg_list = NULL;
118 #endif /* ENABLE_BACKGROUND */
120 /* --------------------------------------------------------------------------------------------- */
121 /*** file scope functions ************************************************************************/
122 /* --------------------------------------------------------------------------------------------- */
124 static cb_ret_t
125 configure_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data)
127 switch (msg)
129 case MSG_ACTION:
130 /* message from "Single press" checkbutton */
131 if (sender != NULL && sender->id == configure_old_esc_mode_id)
133 const gboolean not_single = !(CHECK (sender)->state & C_BOOL);
134 Widget *ww;
136 /* input line */
137 ww = dlg_find_by_id (DIALOG (w), configure_time_out_id);
138 widget_disable (ww, not_single);
140 return MSG_HANDLED;
142 return MSG_NOT_HANDLED;
144 default:
145 return dlg_default_callback (w, sender, msg, parm, data);
149 /* --------------------------------------------------------------------------------------------- */
151 static cb_ret_t
152 panel_listing_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data)
154 WDialog *h = DIALOG (w);
156 switch (msg)
158 case MSG_KEY:
159 if (parm == '\n')
161 Widget *wi;
163 wi = dlg_find_by_id (h, panel_listing_types_id);
164 if (dlg_widget_active (wi))
166 WInput *in;
168 in = INPUT (dlg_find_by_id (h, mini_user_format_id));
169 input_assign_text (in, status_format[RADIO (wi)->sel]);
170 dlg_stop (h);
171 return MSG_HANDLED;
174 wi = dlg_find_by_id (h, panel_user_format_id);
175 if (dlg_widget_active (wi))
177 h->ret_value = B_USER + 6;
178 dlg_stop (h);
179 return MSG_HANDLED;
182 wi = dlg_find_by_id (h, mini_user_format_id);
183 if (dlg_widget_active (wi))
185 h->ret_value = B_USER + 7;
186 dlg_stop (h);
187 return MSG_HANDLED;
191 if (g_ascii_tolower (parm) == listing_user_hotkey)
193 Widget *wi;
195 wi = dlg_find_by_id (h, panel_user_format_id);
196 if (dlg_widget_active (wi))
198 wi = dlg_find_by_id (h, mini_user_format_id);
199 if (dlg_widget_active (wi))
201 WRadio *r;
203 r = RADIO (dlg_find_by_id (h, panel_listing_types_id));
204 r->pos = r->sel = panel_listing_user_idx;
205 dlg_select_widget (WIDGET (r)); /* force redraw */
206 send_message (h, r, MSG_ACTION, 0, NULL);
207 return MSG_HANDLED;
211 return MSG_NOT_HANDLED;
213 case MSG_ACTION:
214 if (sender != NULL && sender->id == panel_listing_types_id)
216 WCheck *ch;
217 WInput *in1, *in2;
219 in1 = INPUT (dlg_find_by_id (h, panel_user_format_id));
220 ch = CHECK (dlg_find_by_id (h, mini_user_status_id));
221 in2 = INPUT (dlg_find_by_id (h, mini_user_format_id));
223 if (!(ch->state & C_BOOL))
224 input_assign_text (in2, status_format[RADIO (sender)->sel]);
225 input_update (in2, FALSE);
226 input_update (in1, FALSE);
227 widget_disable (WIDGET (in1), RADIO (sender)->sel != panel_listing_user_idx);
228 return MSG_HANDLED;
231 if (sender != NULL && sender->id == mini_user_status_id)
233 WInput *in;
235 in = INPUT (dlg_find_by_id (h, mini_user_format_id));
237 if (CHECK (sender)->state & C_BOOL)
239 widget_disable (WIDGET (in), FALSE);
240 input_assign_text (in, status_format[3]);
242 else
244 WRadio *r;
246 r = RADIO (dlg_find_by_id (h, panel_listing_types_id));
247 widget_disable (WIDGET (in), TRUE);
248 input_assign_text (in, status_format[r->sel]);
250 /* input_update (in, FALSE); */
251 return MSG_HANDLED;
254 return MSG_NOT_HANDLED;
256 default:
257 return dlg_default_callback (w, sender, msg, parm, data);
261 /* --------------------------------------------------------------------------------------------- */
263 #ifdef HAVE_CHARSET
264 static int
265 sel_charset_button (WButton * button, int action)
267 int new_dcp;
269 (void) action;
271 new_dcp = select_charset (-1, -1, new_display_codepage, TRUE);
273 if (new_dcp != SELECT_CHARSET_CANCEL)
275 const char *cpname;
276 char buf[BUF_TINY];
277 Widget *w;
279 new_display_codepage = new_dcp;
280 cpname = (new_display_codepage == SELECT_CHARSET_OTHER_8BIT) ?
281 _("Other 8 bit") :
282 ((codepage_desc *) g_ptr_array_index (codepages, new_display_codepage))->name;
283 if (cpname != NULL)
284 mc_global.utf8_display = str_isutf8 (cpname);
285 /* avoid strange bug with label repainting */
286 g_snprintf (buf, sizeof (buf), "%-27s", cpname);
287 w = dlg_find_by_id (WIDGET (button)->owner, disp_bits_name_id);
288 label_set_text (LABEL (w), buf);
291 return 0;
293 #endif /* HAVE_CHARSET */
295 /* --------------------------------------------------------------------------------------------- */
297 static cb_ret_t
298 tree_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data)
300 WDialog *h = DIALOG (w);
302 switch (msg)
304 case MSG_POST_KEY:
305 /* The enter key will be processed by the tree widget */
306 if (parm == '\n')
308 h->ret_value = B_ENTER;
309 dlg_stop (h);
311 return MSG_HANDLED;
313 case MSG_RESIZE:
315 Widget *bar;
317 /* simply call dlg_set_size() with new size */
318 dlg_set_size (h, LINES - 9, COLS - 20);
319 bar = WIDGET (find_buttonbar (h));
320 bar->x = 0;
321 bar->y = LINES - 1;
322 return MSG_HANDLED;
325 case MSG_ACTION:
326 return send_message (find_tree (h), NULL, MSG_ACTION, parm, NULL);
328 default:
329 return dlg_default_callback (w, sender, msg, parm, data);
333 /* --------------------------------------------------------------------------------------------- */
335 #if defined(ENABLE_VFS) && defined (ENABLE_VFS_FTP)
336 static cb_ret_t
337 confvfs_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data)
339 switch (msg)
341 case MSG_ACTION:
342 /* message from "Always use ftp proxy" checkbutton */
343 if (sender != NULL && sender->id == ftpfs_always_use_proxy_id)
345 const gboolean not_use = !(CHECK (sender)->state & C_BOOL);
346 Widget *wi;
348 /* input */
349 wi = dlg_find_by_id (DIALOG (w), ftpfs_proxy_host_id);
350 widget_disable (wi, not_use);
351 return MSG_HANDLED;
353 return MSG_NOT_HANDLED;
355 default:
356 return dlg_default_callback (w, sender, msg, parm, data);
359 #endif /* ENABLE_VFS && ENABLE_VFS_FTP */
361 /* --------------------------------------------------------------------------------------------- */
363 #ifdef ENABLE_BACKGROUND
364 static void
365 jobs_fill_listbox (WListbox * list)
367 static const char *state_str[2] = { "", "" };
368 TaskList *tl;
370 if (state_str[0] == '\0')
372 state_str[0] = _("Running");
373 state_str[1] = _("Stopped");
376 for (tl = task_list; tl != NULL; tl = tl->next)
378 char *s;
380 s = g_strconcat (state_str[tl->state], " ", tl->info, (char *) NULL);
381 listbox_add_item (list, LISTBOX_APPEND_AT_END, 0, s, (void *) tl);
382 g_free (s);
386 /* --------------------------------------------------------------------------------------------- */
388 static int
389 task_cb (WButton * button, int action)
391 TaskList *tl;
392 int sig = 0;
394 (void) button;
396 if (bg_list->list == NULL)
397 return 0;
399 /* Get this instance information */
400 listbox_get_current (bg_list, NULL, (void **) &tl);
402 #ifdef SIGTSTP
403 if (action == B_STOP)
405 sig = SIGSTOP;
406 tl->state = Task_Stopped;
408 else if (action == B_RESUME)
410 sig = SIGCONT;
411 tl->state = Task_Running;
413 else
414 #endif
415 if (action == B_KILL)
416 sig = SIGKILL;
418 if (sig == SIGKILL)
419 unregister_task_running (tl->pid, tl->fd);
421 kill (tl->pid, sig);
422 listbox_remove_list (bg_list);
423 jobs_fill_listbox (bg_list);
425 /* This can be optimized to just redraw this widget :-) */
426 dlg_redraw (WIDGET (button)->owner);
428 return 0;
430 #endif /* ENABLE_BACKGROUND */
432 /* --------------------------------------------------------------------------------------------- */
433 /*** public functions ****************************************************************************/
434 /* --------------------------------------------------------------------------------------------- */
436 void
437 configure_box (void)
439 const char *pause_options[] = {
440 N_("&Never"),
441 N_("On dum&b terminals"),
442 N_("Alwa&ys")
445 int pause_options_num;
447 pause_options_num = G_N_ELEMENTS (pause_options);
450 char time_out[BUF_TINY] = "";
451 char *time_out_new;
453 quick_widget_t quick_widgets[] = {
454 /* *INDENT-OFF* */
455 QUICK_START_COLUMNS,
456 QUICK_START_GROUPBOX (N_("File operations")),
457 QUICK_CHECKBOX (N_("&Verbose operation"), &verbose, NULL),
458 QUICK_CHECKBOX (N_("Compute tota&ls"), &file_op_compute_totals, NULL),
459 QUICK_CHECKBOX (N_("Classic pro&gressbar"), &classic_progressbar, NULL),
460 QUICK_CHECKBOX (N_("Mkdi&r autoname"), &auto_fill_mkdir_name, NULL),
461 QUICK_CHECKBOX (N_("Preallocate &space"), &mc_global.vfs.preallocate_space,
462 NULL),
463 QUICK_STOP_GROUPBOX,
464 QUICK_START_GROUPBOX (N_("Esc key mode")),
465 QUICK_CHECKBOX (N_("S&ingle press"), &old_esc_mode, &configure_old_esc_mode_id),
466 QUICK_LABELED_INPUT (N_("Timeout:"), input_label_left,
467 (const char *) time_out, 0, MC_HISTORY_ESC_TIMEOUT,
468 &time_out_new, &configure_time_out_id),
469 QUICK_STOP_GROUPBOX,
470 QUICK_START_GROUPBOX (N_("Pause after run")),
471 QUICK_RADIO (pause_options_num, pause_options, &pause_after_run, NULL),
472 QUICK_STOP_GROUPBOX,
473 QUICK_NEXT_COLUMN,
474 QUICK_START_GROUPBOX (N_("Other options")),
475 QUICK_CHECKBOX (N_("Use internal edi&t"), &use_internal_edit, NULL),
476 QUICK_CHECKBOX (N_("Use internal vie&w"), &use_internal_view, NULL),
477 QUICK_CHECKBOX (N_("Auto m&enus"), &auto_menu, NULL),
478 QUICK_CHECKBOX (N_("&Drop down menus"), &drop_menus, NULL),
479 QUICK_CHECKBOX (N_("Shell &patterns"), &easy_patterns, NULL),
480 QUICK_CHECKBOX (N_("Co&mplete: show all"),
481 &mc_global.widget.show_all_if_ambiguous, NULL),
482 QUICK_CHECKBOX (N_("Rotating d&ash"), &nice_rotating_dash, NULL),
483 QUICK_CHECKBOX (N_("Cd follows lin&ks"), &mc_global.vfs.cd_symlinks, NULL),
484 QUICK_CHECKBOX (N_("Sa&fe delete"), &safe_delete, NULL),
485 QUICK_CHECKBOX (N_("A&uto save setup"), &auto_save_setup, NULL),
486 QUICK_SEPARATOR (FALSE),
487 QUICK_SEPARATOR (FALSE),
488 QUICK_SEPARATOR (FALSE),
489 QUICK_SEPARATOR (FALSE),
490 QUICK_STOP_GROUPBOX,
491 QUICK_STOP_COLUMNS,
492 QUICK_BUTTONS_OK_CANCEL,
493 QUICK_END
494 /* *INDENT-ON* */
497 quick_dialog_t qdlg = {
498 -1, -1, 60,
499 N_("Configure options"), "[Configuration]",
500 quick_widgets, configure_callback, NULL
503 g_snprintf (time_out, sizeof (time_out), "%d", old_esc_mode_timeout);
505 #ifndef USE_INTERNAL_EDIT
506 quick_widgets[17].options = W_DISABLED;
507 #endif
509 if (!old_esc_mode)
510 quick_widgets[10].options = quick_widgets[11].options = W_DISABLED;
512 #ifndef HAVE_POSIX_FALLOCATE
513 mc_global.vfs.preallocate_space = FALSE;
514 quick_widgets[7].options = W_DISABLED;
515 #endif
517 if (quick_dialog (&qdlg) == B_ENTER)
518 old_esc_mode_timeout = atoi (time_out_new);
520 g_free (time_out_new);
524 /* --------------------------------------------------------------------------------------------- */
526 void
527 panel_options_box (void)
529 const char *qsearch_options[] = {
530 N_("Case &insensitive"),
531 N_("Cas&e sensitive"),
532 N_("Use panel sort mo&de")
535 int simple_swap;
537 simple_swap = mc_config_get_bool (mc_main_config, CONFIG_PANELS_SECTION,
538 "simple_swap", FALSE) ? 1 : 0;
541 quick_widget_t quick_widgets[] = {
542 /* *INDENT-OFF* */
543 QUICK_START_COLUMNS,
544 QUICK_START_GROUPBOX (N_("Main options")),
545 QUICK_CHECKBOX (N_("Show mi&ni-status"), &panels_options.show_mini_info, NULL),
546 QUICK_CHECKBOX (N_("Use SI si&ze units"), &panels_options.kilobyte_si, NULL),
547 QUICK_CHECKBOX (N_("Mi&x all files"), &panels_options.mix_all_files, NULL),
548 QUICK_CHECKBOX (N_("Show &backup files"), &panels_options.show_backups, NULL),
549 QUICK_CHECKBOX (N_("Show &hidden files"), &panels_options.show_dot_files, NULL),
550 QUICK_CHECKBOX (N_("&Fast dir reload"), &panels_options.fast_reload, NULL),
551 QUICK_CHECKBOX (N_("Ma&rk moves down"), &panels_options.mark_moves_down, NULL),
552 QUICK_CHECKBOX (N_("Re&verse files only"), &panels_options.reverse_files_only,
553 NULL),
554 QUICK_CHECKBOX (N_("Simple s&wap"), &simple_swap, NULL),
555 QUICK_CHECKBOX (N_("A&uto save panels setup"), &panels_options.auto_save_setup,
556 NULL),
557 QUICK_SEPARATOR (FALSE),
558 QUICK_SEPARATOR (FALSE),
559 QUICK_STOP_GROUPBOX,
560 QUICK_NEXT_COLUMN,
561 QUICK_START_GROUPBOX (N_("Navigation")),
562 QUICK_CHECKBOX (N_("L&ynx-like motion"), &panels_options.navigate_with_arrows,
563 NULL),
564 QUICK_CHECKBOX (N_("Pa&ge scrolling"), &panels_options.scroll_pages, NULL),
565 QUICK_CHECKBOX (N_("&Mouse page scrolling"), &panels_options.mouse_move_pages,
566 NULL),
567 QUICK_STOP_GROUPBOX,
568 QUICK_START_GROUPBOX (N_("File highlight")),
569 QUICK_CHECKBOX (N_("File &types"), &panels_options.filetype_mode, NULL),
570 QUICK_CHECKBOX (N_("&Permissions"), &panels_options.permission_mode, NULL),
571 QUICK_STOP_GROUPBOX,
572 QUICK_START_GROUPBOX (N_("Quick search")),
573 QUICK_RADIO (QSEARCH_NUM, qsearch_options, (int *) &panels_options.qsearch_mode,
574 NULL),
575 QUICK_STOP_GROUPBOX,
576 QUICK_STOP_COLUMNS,
577 QUICK_BUTTONS_OK_CANCEL,
578 QUICK_END
579 /* *INDENT-ON* */
582 quick_dialog_t qdlg = {
583 -1, -1, 60,
584 N_("Panel options"), "[Panel options]",
585 quick_widgets, NULL, NULL
588 if (quick_dialog (&qdlg) != B_ENTER)
589 return;
592 mc_config_set_bool (mc_main_config, CONFIG_PANELS_SECTION,
593 "simple_swap", (gboolean) (simple_swap & C_BOOL));
595 if (!panels_options.fast_reload_msg_shown && panels_options.fast_reload)
597 message (D_NORMAL, _("Information"),
598 _("Using the fast reload option may not reflect the exact\n"
599 "directory contents. In this case you'll need to do a\n"
600 "manual reload of the directory. See the man page for\n" "the details."));
601 panels_options.fast_reload_msg_shown = TRUE;
604 update_panels (UP_RELOAD, UP_KEEPSEL);
607 /* --------------------------------------------------------------------------------------------- */
609 /* return list type */
611 panel_listing_box (WPanel * panel, char **userp, char **minip, int *use_msformat, int num)
613 int result = -1;
614 char *section = NULL;
616 if (panel == NULL)
618 const char *p;
619 size_t i;
621 p = get_nth_panel_name (num);
622 panel = g_new (WPanel, 1);
623 panel->list_type = list_full;
624 panel->user_format = g_strdup (DEFAULT_USER_FORMAT);
625 panel->user_mini_status = 0;
626 for (i = 0; i < LIST_TYPES; i++)
627 panel->user_status_format[i] = g_strdup (DEFAULT_USER_FORMAT);
628 section = g_strconcat ("Temporal:", p, (char *) NULL);
629 if (!mc_config_has_group (mc_main_config, section))
631 g_free (section);
632 section = g_strdup (p);
634 panel_load_setup (panel, section);
635 g_free (section);
639 int mini_user_status;
640 char *panel_user_format;
641 char *mini_user_format;
642 const char *cp;
644 /* Controls whether the array strings have been translated */
645 const char *list_types[LIST_TYPES] = {
646 N_("&Full file list"),
647 N_("&Brief file list"),
648 N_("&Long file list"),
649 N_("&User defined:")
652 quick_widget_t quick_widgets[] = {
653 /* *INDENT-OFF* */
654 QUICK_RADIO (LIST_TYPES, list_types, &result, &panel_listing_types_id),
655 QUICK_INPUT (panel->user_format, INPUT_COMPLETE_DEFAULT, "user-fmt-input",
656 &panel_user_format, &panel_user_format_id),
657 QUICK_SEPARATOR (TRUE),
658 QUICK_CHECKBOX (N_("User &mini status"), &mini_user_status, &mini_user_status_id),
659 QUICK_INPUT (panel->user_status_format[panel->list_type], INPUT_COMPLETE_DEFAULT,
660 "mini_input", &mini_user_format, &mini_user_format_id),
661 QUICK_BUTTONS_OK_CANCEL,
662 QUICK_END
663 /* *INDENT-ON* */
666 quick_dialog_t qdlg = {
667 -1, -1, 48,
668 N_("Listing mode"), "[Listing Mode...]",
669 quick_widgets, panel_listing_callback, NULL
672 /* get hotkey of user-defined format string */
673 cp = strchr (_(list_types[panel_listing_user_idx]), '&');
674 if (cp != NULL && *++cp != '\0')
675 listing_user_hotkey = g_ascii_tolower (*cp);
677 mini_user_status = panel->user_mini_status;
678 result = panel->list_type;
679 status_format = panel->user_status_format;
681 if (panel->list_type != panel_listing_user_idx)
682 quick_widgets[1].options = W_DISABLED;
684 if (!mini_user_status)
685 quick_widgets[4].options = W_DISABLED;
687 if (quick_dialog (&qdlg) == B_CANCEL)
688 result = -1;
689 else
691 *userp = panel_user_format;
692 *minip = mini_user_format;
693 *use_msformat = mini_user_status;
697 if (section != NULL)
699 int i;
701 g_free (panel->user_format);
702 for (i = 0; i < LIST_TYPES; i++)
703 g_free (panel->user_status_format[i]);
704 g_free (panel);
707 return result;
710 /* --------------------------------------------------------------------------------------------- */
712 const panel_field_t *
713 sort_box (panel_sort_info_t * info)
715 const char **sort_orders_names;
716 gsize sort_names_num, i;
717 int sort_idx = 0;
718 const panel_field_t *result = info->sort_field;
720 sort_orders_names = panel_get_sortable_fields (&sort_names_num);
722 for (i = 0; i < sort_names_num; i++)
723 if (strcmp (sort_orders_names[i], _(info->sort_field->title_hotkey)) == 0)
725 sort_idx = i;
726 break;
730 quick_widget_t quick_widgets[] = {
731 /* *INDENT-OFF* */
732 QUICK_START_COLUMNS,
733 QUICK_RADIO (sort_names_num, sort_orders_names, &sort_idx, NULL),
734 QUICK_NEXT_COLUMN,
735 QUICK_CHECKBOX (N_("Executable &first"), &info->exec_first, NULL),
736 QUICK_CHECKBOX (N_("Cas&e sensitive"), &info->case_sensitive, NULL),
737 QUICK_CHECKBOX (N_("&Reverse"), &info->reverse, NULL),
738 QUICK_STOP_COLUMNS,
739 QUICK_BUTTONS_OK_CANCEL,
740 QUICK_END
741 /* *INDENT-ON* */
744 quick_dialog_t qdlg = {
745 -1, -1, 40,
746 N_("Sort order"), "[Sort Order...]",
747 quick_widgets, NULL, NULL
750 if (quick_dialog (&qdlg) != B_CANCEL)
751 result = panel_get_field_by_title_hotkey (sort_orders_names[sort_idx]);
753 if (result == NULL)
754 result = info->sort_field;
757 g_strfreev ((gchar **) sort_orders_names);
759 return result;
762 /* --------------------------------------------------------------------------------------------- */
764 void
765 confirm_box (void)
767 quick_widget_t quick_widgets[] = {
768 /* *INDENT-OFF* */
769 /* TRANSLATORS: no need to translate 'Confirmation', it's just a context prefix */
770 QUICK_CHECKBOX (N_("Confirmation|&Delete"), &confirm_delete, NULL),
771 QUICK_CHECKBOX (N_("Confirmation|O&verwrite"), &confirm_overwrite, NULL),
772 QUICK_CHECKBOX (N_("Confirmation|&Execute"), &confirm_execute, NULL),
773 QUICK_CHECKBOX (N_("Confirmation|E&xit"), &confirm_exit, NULL),
774 QUICK_CHECKBOX (N_("Confirmation|Di&rectory hotlist delete"),
775 &confirm_directory_hotlist_delete, NULL),
776 QUICK_CHECKBOX (N_("Confirmation|&History cleanup"),
777 &mc_global.widget.confirm_history_cleanup, NULL),
778 QUICK_BUTTONS_OK_CANCEL,
779 QUICK_END
780 /* *INDENT-ON* */
783 quick_dialog_t qdlg = {
784 -1, -1, 46,
785 N_("Confirmation"), "[Confirmation]",
786 quick_widgets, NULL, NULL
789 (void) quick_dialog (&qdlg);
792 /* --------------------------------------------------------------------------------------------- */
794 #ifndef HAVE_CHARSET
795 void
796 display_bits_box (void)
798 int new_meta;
799 int current_mode;
801 const char *display_bits_str[] = {
802 N_("&UTF-8 output"),
803 N_("&Full 8 bits output"),
804 N_("&ISO 8859-1"),
805 N_("7 &bits")
808 quick_widget_t quick_widgets[] = {
809 /* *INDENT-OFF* */
810 QUICK_RADIO (4, display_bits_str, &current_mode, NULL),
811 QUICK_SEPARATOR (TRUE),
812 QUICK_CHECKBOX (N_("F&ull 8 bits input"), &new_meta, NULL),
813 QUICK_BUTTONS_OK_CANCEL,
814 QUICK_END
815 /* *INDENT-ON* */
818 quick_dialog_t qdlg = {
819 -1, -1, 46,
820 _("Display bits"), "[Display bits]",
821 quick_widgets, NULL, NULL
824 if (mc_global.full_eight_bits)
825 current_mode = 0;
826 else if (mc_global.eight_bit_clean)
827 current_mode = 1;
828 else
829 current_mode = 2;
831 new_meta = !use_8th_bit_as_meta;
833 if (quick_dialog (&qdlg) != B_CANCEL)
835 mc_global.eight_bit_clean = current_mode < 3;
836 mc_global.full_eight_bits = current_mode < 2;
837 #ifndef HAVE_SLANG
838 meta (stdscr, mc_global.eight_bit_clean);
839 #else
840 SLsmg_Display_Eight_Bit = mc_global.full_eight_bits ? 128 : 160;
841 #endif
842 use_8th_bit_as_meta = !new_meta;
846 /* --------------------------------------------------------------------------------------------- */
847 #else /* HAVE_CHARSET */
849 void
850 display_bits_box (void)
852 const char *cpname;
854 cpname = (new_display_codepage < 0) ? _("Other 8 bit")
855 : ((codepage_desc *) g_ptr_array_index (codepages, new_display_codepage))->name;
857 new_display_codepage = mc_global.display_codepage;
860 int new_meta;
862 quick_widget_t quick_widgets[] = {
863 /* *INDENT-OFF* */
864 QUICK_START_COLUMNS,
865 QUICK_LABEL (N_("Input / display codepage:"), NULL),
866 QUICK_NEXT_COLUMN,
867 QUICK_STOP_COLUMNS,
868 QUICK_START_COLUMNS,
869 QUICK_LABEL (cpname, &disp_bits_name_id),
870 QUICK_NEXT_COLUMN,
871 QUICK_BUTTON (N_("&Select"), B_USER, sel_charset_button, NULL),
872 QUICK_STOP_COLUMNS,
873 QUICK_SEPARATOR (TRUE),
874 QUICK_CHECKBOX (N_("F&ull 8 bits input"), &new_meta, NULL),
875 QUICK_BUTTONS_OK_CANCEL,
876 QUICK_END
877 /* *INDENT-ON* */
880 quick_dialog_t qdlg = {
881 -1, -1, 46,
882 N_("Display bits"), "[Display bits]",
883 quick_widgets, NULL, NULL
886 new_meta = !use_8th_bit_as_meta;
887 application_keypad_mode ();
889 if (quick_dialog (&qdlg) == B_ENTER)
891 char *errmsg;
893 mc_global.display_codepage = new_display_codepage;
895 errmsg = init_translation_table (mc_global.source_codepage, mc_global.display_codepage);
896 if (errmsg != NULL)
898 message (D_ERROR, MSG_ERROR, "%s", errmsg);
899 g_free (errmsg);
902 #ifdef HAVE_SLANG
903 tty_display_8bit (mc_global.display_codepage != 0 && mc_global.display_codepage != 1);
904 #else
905 tty_display_8bit (mc_global.display_codepage != 0);
906 #endif
907 use_8th_bit_as_meta = !new_meta;
909 repaint_screen ();
913 #endif /* HAVE_CHARSET */
915 /* --------------------------------------------------------------------------------------------- */
916 /** Show tree in a box, not on a panel */
918 char *
919 tree_box (const char *current_dir)
921 WTree *mytree;
922 WDialog *dlg;
923 Widget *wd;
924 char *val = NULL;
925 WButtonBar *bar;
927 (void) current_dir;
929 /* Create the components */
930 dlg = create_dlg (TRUE, 0, 0, LINES - 9, COLS - 20, dialog_colors, tree_callback, NULL,
931 "[Directory Tree]", _("Directory tree"), DLG_CENTER);
932 wd = WIDGET (dlg);
934 mytree = tree_new (2, 2, wd->lines - 6, wd->cols - 5, FALSE);
935 add_widget_autopos (dlg, mytree, WPOS_KEEP_ALL, NULL);
936 add_widget_autopos (dlg, hline_new (wd->lines - 4, 1, -1), WPOS_KEEP_BOTTOM, NULL);
937 bar = buttonbar_new (TRUE);
938 add_widget (dlg, bar);
939 /* restore ButtonBar coordinates after add_widget() */
940 WIDGET (bar)->x = 0;
941 WIDGET (bar)->y = LINES - 1;
943 if (run_dlg (dlg) == B_ENTER)
944 val = vfs_path_to_str (tree_selected_name (mytree));
946 destroy_dlg (dlg);
947 return val;
950 /* --------------------------------------------------------------------------------------------- */
952 #ifdef ENABLE_VFS
953 void
954 configure_vfs (void)
956 char buffer2[BUF_TINY];
957 #ifdef ENABLE_VFS_FTP
958 char buffer3[BUF_TINY];
960 g_snprintf (buffer3, sizeof (buffer3), "%i", ftpfs_directory_timeout);
961 #endif
963 g_snprintf (buffer2, sizeof (buffer2), "%i", vfs_timeout);
966 char *ret_timeout;
967 #ifdef ENABLE_VFS_FTP
968 char *ret_passwd;
969 char *ret_ftp_proxy;
970 char *ret_directory_timeout;
971 #endif /* ENABLE_VFS_FTP */
973 quick_widget_t quick_widgets[] = {
974 /* *INDENT-OFF* */
975 QUICK_LABELED_INPUT (N_("Timeout for freeing VFSs (sec):"), input_label_left,
976 buffer2, 0, "input-timo-vfs", &ret_timeout, NULL),
977 #ifdef ENABLE_VFS_FTP
978 QUICK_SEPARATOR (TRUE),
979 QUICK_LABELED_INPUT (N_("FTP anonymous password:"), input_label_left,
980 ftpfs_anonymous_passwd, 0, "input-passwd", &ret_passwd, NULL),
981 QUICK_LABELED_INPUT (N_("FTP directory cache timeout (sec):"), input_label_left,
982 buffer3, 0, "input-timeout", &ret_directory_timeout, NULL),
983 QUICK_CHECKBOX (N_("&Always use ftp proxy:"), &ftpfs_always_use_proxy,
984 &ftpfs_always_use_proxy_id),
985 QUICK_INPUT (ftpfs_proxy_host, 0, "input-ftp-proxy", &ret_ftp_proxy,
986 &ftpfs_proxy_host_id),
987 QUICK_CHECKBOX (N_("&Use ~/.netrc"), &ftpfs_use_netrc, NULL),
988 QUICK_CHECKBOX (N_("Use &passive mode"), &ftpfs_use_passive_connections, NULL),
989 QUICK_CHECKBOX (N_("Use passive mode over pro&xy"),
990 &ftpfs_use_passive_connections_over_proxy, NULL),
991 #endif /* ENABLE_VFS_FTP */
992 QUICK_BUTTONS_OK_CANCEL,
993 QUICK_END
994 /* *INDENT-ON* */
997 quick_dialog_t qdlg = {
998 -1, -1, 56,
999 N_("Virtual File System Setting"), "[Virtual FS]",
1000 quick_widgets,
1001 #ifdef ENABLE_VFS_FTP
1002 confvfs_callback,
1003 #else
1004 NULL,
1005 #endif
1006 NULL,
1009 #ifdef ENABLE_VFS_FTP
1010 if (!ftpfs_always_use_proxy)
1011 quick_widgets[5].options = W_DISABLED;
1012 #endif
1014 if (quick_dialog (&qdlg) != B_CANCEL)
1016 vfs_timeout = atoi (ret_timeout);
1017 g_free (ret_timeout);
1019 if (vfs_timeout < 0 || vfs_timeout > 10000)
1020 vfs_timeout = 10;
1021 #ifdef ENABLE_VFS_FTP
1022 g_free (ftpfs_anonymous_passwd);
1023 ftpfs_anonymous_passwd = ret_passwd;
1024 g_free (ftpfs_proxy_host);
1025 ftpfs_proxy_host = ret_ftp_proxy;
1026 ftpfs_directory_timeout = atoi (ret_directory_timeout);
1027 g_free (ret_directory_timeout);
1028 #endif
1033 #endif /* ENABLE_VFS */
1035 /* --------------------------------------------------------------------------------------------- */
1037 char *
1038 cd_dialog (void)
1040 const Widget *w = WIDGET (current_panel);
1041 char *my_str;
1043 quick_widget_t quick_widgets[] = {
1044 QUICK_LABELED_INPUT (N_("cd"), input_label_left, "", 2, "input", &my_str, NULL),
1045 QUICK_END
1048 quick_dialog_t qdlg = {
1049 w->y + w->lines - 6, w->x, w->cols,
1050 N_("Quick cd"), "[Quick cd]",
1051 quick_widgets, NULL, NULL
1054 return (quick_dialog (&qdlg) != B_CANCEL) ? my_str : NULL;
1057 /* --------------------------------------------------------------------------------------------- */
1059 void
1060 symlink_dialog (const vfs_path_t * existing_vpath, const vfs_path_t * new_vpath,
1061 char **ret_existing, char **ret_new)
1063 char *existing;
1064 char *new;
1066 existing = vfs_path_to_str (existing_vpath);
1067 new = vfs_path_to_str (new_vpath);
1070 quick_widget_t quick_widgets[] = {
1071 /* *INDENT-OFF* */
1072 QUICK_LABELED_INPUT (N_("Existing filename (filename symlink will point to):"),
1073 input_label_above,
1074 existing, 0, "input-2", ret_existing, NULL),
1075 QUICK_SEPARATOR (FALSE),
1076 QUICK_LABELED_INPUT (N_("Symbolic link filename:"), input_label_above,
1077 new, 0, "input-1", ret_new, NULL),
1078 QUICK_BUTTONS_OK_CANCEL,
1079 QUICK_END
1080 /* *INDENT-ON* */
1083 quick_dialog_t qdlg = {
1084 -1, -1, 64,
1085 N_("Symbolic link"), "[File Menu]",
1086 quick_widgets, NULL, NULL
1089 if (quick_dialog (&qdlg) == B_CANCEL)
1091 *ret_new = NULL;
1092 *ret_existing = NULL;
1096 g_free (existing);
1097 g_free (new);
1100 /* --------------------------------------------------------------------------------------------- */
1102 #ifdef ENABLE_BACKGROUND
1103 void
1104 jobs_cmd (void)
1106 struct
1108 const char *name;
1109 int flags;
1110 int value;
1111 int len;
1112 bcback_fn callback;
1114 job_but[] =
1116 /* *INDENT-OFF* */
1117 { N_("&Stop"), NORMAL_BUTTON, B_STOP, 0, task_cb },
1118 { N_("&Resume"), NORMAL_BUTTON, B_RESUME, 0, task_cb },
1119 { N_("&Kill"), NORMAL_BUTTON, B_KILL, 0, task_cb },
1120 { N_("&OK"), DEFPUSH_BUTTON, B_CANCEL, 0, NULL }
1121 /* *INDENT-ON* */
1124 size_t i;
1125 const size_t n_but = G_N_ELEMENTS (job_but);
1127 WDialog *jobs_dlg;
1128 int cols = 60;
1129 int lines = 15;
1130 int x = 0;
1132 for (i = 0; i < n_but; i++)
1134 #ifdef ENABLE_NLS
1135 job_but[i].name = _(job_but[i].name);
1136 #endif /* ENABLE_NLS */
1138 job_but[i].len = str_term_width1 (job_but[i].name) + 3;
1139 if (job_but[i].flags == DEFPUSH_BUTTON)
1140 job_but[i].len += 2;
1141 x += job_but[i].len;
1144 x += (int) n_but - 1;
1145 cols = max (cols, x + 6);
1147 jobs_dlg = create_dlg (TRUE, 0, 0, lines, cols, dialog_colors, NULL, NULL,
1148 "[Background jobs]", _("Background jobs"), DLG_CENTER);
1150 bg_list = listbox_new (2, 2, lines - 6, cols - 6, FALSE, NULL);
1151 jobs_fill_listbox (bg_list);
1152 add_widget (jobs_dlg, bg_list);
1154 add_widget (jobs_dlg, hline_new (lines - 4, -1, -1));
1156 x = (cols - x) / 2;
1157 for (i = 0; i < n_but; i++)
1159 add_widget (jobs_dlg,
1160 button_new (lines - 3, x, job_but[i].value, job_but[i].flags, job_but[i].name,
1161 job_but[i].callback));
1162 x += job_but[i].len + 1;
1165 (void) run_dlg (jobs_dlg);
1166 destroy_dlg (jobs_dlg);
1168 #endif /* ENABLE_BACKGROUND */
1170 /* --------------------------------------------------------------------------------------------- */
1172 #ifdef ENABLE_VFS_SMB
1173 struct smb_authinfo *
1174 vfs_smb_get_authinfo (const char *host, const char *share, const char *domain, const char *user)
1176 char *label;
1177 struct smb_authinfo *return_value = NULL;
1179 if (domain == NULL)
1180 domain = "";
1181 if (user == NULL)
1182 user = "";
1184 label = g_strdup_printf (_("Password for \\\\%s\\%s"), host, share);
1187 char *ret_domain, *ret_user, *ret_password;
1189 quick_widget_t quick_widgets[] = {
1190 /* *INDENT-OFF* */
1191 QUICK_LABEL (label, NULL),
1192 QUICK_SEPARATOR (TRUE),
1193 QUICK_START_COLUMNS,
1194 QUICK_LABEL (N_("Domain:"), NULL),
1195 QUICK_SEPARATOR (FALSE),
1196 QUICK_LABEL (N_("Username:"), NULL),
1197 QUICK_SEPARATOR (FALSE),
1198 QUICK_LABEL (N_("Password:"), NULL),
1199 QUICK_NEXT_COLUMN,
1200 QUICK_INPUT (domain, 0, "auth_domain", &ret_domain, NULL),
1201 QUICK_SEPARATOR (FALSE),
1202 QUICK_INPUT (user, 0, "auth_name", &ret_user, NULL),
1203 QUICK_SEPARATOR (FALSE),
1204 QUICK_INPUT ("", 1, "auth_password", &ret_password, NULL),
1205 QUICK_STOP_COLUMNS,
1206 QUICK_BUTTONS_OK_CANCEL,
1207 QUICK_END
1208 /* *INDENT-ON* */
1211 quick_dialog_t qdlg = {
1212 -1, -1, 40,
1213 N_("SMB authentication"), "[Smb Authinfo]",
1214 quick_widgets, NULL, NULL
1217 if (quick_dialog (&qdlg) != B_CANCEL)
1219 return_value = vfs_smb_authinfo_new (host, share, ret_domain, ret_user, ret_password);
1221 g_free (ret_domain);
1222 g_free (ret_user);
1223 g_free (ret_password);
1227 g_free (label);
1229 return return_value;
1231 #endif /* ENABLE_VFS_SMB */
1233 /* --------------------------------------------------------------------------------------------- */