Concretize the usage of autocompliting in different input fields.
[midnight-commander.git] / src / filemanager / boxes.c
blob1b152672caf10fcb51be3f3585c8ae81f516cd56
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, MC_HISTORY_ESC_TIMEOUT,
468 &time_out_new, &configure_time_out_id, FALSE, FALSE,
469 INPUT_COMPLETE_NONE),
470 QUICK_STOP_GROUPBOX,
471 QUICK_START_GROUPBOX (N_("Pause after run")),
472 QUICK_RADIO (pause_options_num, pause_options, &pause_after_run, NULL),
473 QUICK_STOP_GROUPBOX,
474 QUICK_NEXT_COLUMN,
475 QUICK_START_GROUPBOX (N_("Other options")),
476 QUICK_CHECKBOX (N_("Use internal edi&t"), &use_internal_edit, NULL),
477 QUICK_CHECKBOX (N_("Use internal vie&w"), &use_internal_view, NULL),
478 QUICK_CHECKBOX (N_("A&sk new file name"),
479 &editor_ask_filename_before_edit, NULL),
480 QUICK_CHECKBOX (N_("Auto m&enus"), &auto_menu, NULL),
481 QUICK_CHECKBOX (N_("&Drop down menus"), &drop_menus, NULL),
482 QUICK_CHECKBOX (N_("S&hell patterns"), &easy_patterns, NULL),
483 QUICK_CHECKBOX (N_("Co&mplete: show all"),
484 &mc_global.widget.show_all_if_ambiguous, NULL),
485 QUICK_CHECKBOX (N_("Rotating d&ash"), &nice_rotating_dash, NULL),
486 QUICK_CHECKBOX (N_("Cd follows lin&ks"), &mc_global.vfs.cd_symlinks, NULL),
487 QUICK_CHECKBOX (N_("Sa&fe delete"), &safe_delete, NULL),
488 QUICK_CHECKBOX (N_("A&uto save setup"), &auto_save_setup, NULL),
489 QUICK_SEPARATOR (FALSE),
490 QUICK_SEPARATOR (FALSE),
491 QUICK_SEPARATOR (FALSE),
492 QUICK_STOP_GROUPBOX,
493 QUICK_STOP_COLUMNS,
494 QUICK_BUTTONS_OK_CANCEL,
495 QUICK_END
496 /* *INDENT-ON* */
499 quick_dialog_t qdlg = {
500 -1, -1, 60,
501 N_("Configure options"), "[Configuration]",
502 quick_widgets, configure_callback, NULL
505 g_snprintf (time_out, sizeof (time_out), "%d", old_esc_mode_timeout);
507 #ifndef USE_INTERNAL_EDIT
508 quick_widgets[17].options = W_DISABLED;
509 #endif
511 if (!old_esc_mode)
512 quick_widgets[10].options = quick_widgets[11].options = W_DISABLED;
514 #ifndef HAVE_POSIX_FALLOCATE
515 mc_global.vfs.preallocate_space = FALSE;
516 quick_widgets[7].options = W_DISABLED;
517 #endif
519 if (quick_dialog (&qdlg) == B_ENTER)
520 old_esc_mode_timeout = atoi (time_out_new);
522 g_free (time_out_new);
526 /* --------------------------------------------------------------------------------------------- */
528 void
529 panel_options_box (void)
531 const char *qsearch_options[] = {
532 N_("Case &insensitive"),
533 N_("Cas&e sensitive"),
534 N_("Use panel sort mo&de")
537 int simple_swap;
539 simple_swap = mc_config_get_bool (mc_main_config, CONFIG_PANELS_SECTION,
540 "simple_swap", FALSE) ? 1 : 0;
543 quick_widget_t quick_widgets[] = {
544 /* *INDENT-OFF* */
545 QUICK_START_COLUMNS,
546 QUICK_START_GROUPBOX (N_("Main options")),
547 QUICK_CHECKBOX (N_("Show mi&ni-status"), &panels_options.show_mini_info, NULL),
548 QUICK_CHECKBOX (N_("Use SI si&ze units"), &panels_options.kilobyte_si, NULL),
549 QUICK_CHECKBOX (N_("Mi&x all files"), &panels_options.mix_all_files, NULL),
550 QUICK_CHECKBOX (N_("Show &backup files"), &panels_options.show_backups, NULL),
551 QUICK_CHECKBOX (N_("Show &hidden files"), &panels_options.show_dot_files, NULL),
552 QUICK_CHECKBOX (N_("&Fast dir reload"), &panels_options.fast_reload, NULL),
553 QUICK_CHECKBOX (N_("Ma&rk moves down"), &panels_options.mark_moves_down, NULL),
554 QUICK_CHECKBOX (N_("Re&verse files only"), &panels_options.reverse_files_only,
555 NULL),
556 QUICK_CHECKBOX (N_("Simple s&wap"), &simple_swap, NULL),
557 QUICK_CHECKBOX (N_("A&uto save panels setup"), &panels_options.auto_save_setup,
558 NULL),
559 QUICK_SEPARATOR (FALSE),
560 QUICK_SEPARATOR (FALSE),
561 QUICK_STOP_GROUPBOX,
562 QUICK_NEXT_COLUMN,
563 QUICK_START_GROUPBOX (N_("Navigation")),
564 QUICK_CHECKBOX (N_("L&ynx-like motion"), &panels_options.navigate_with_arrows,
565 NULL),
566 QUICK_CHECKBOX (N_("Pa&ge scrolling"), &panels_options.scroll_pages, NULL),
567 QUICK_CHECKBOX (N_("&Mouse page scrolling"), &panels_options.mouse_move_pages,
568 NULL),
569 QUICK_STOP_GROUPBOX,
570 QUICK_START_GROUPBOX (N_("File highlight")),
571 QUICK_CHECKBOX (N_("File &types"), &panels_options.filetype_mode, NULL),
572 QUICK_CHECKBOX (N_("&Permissions"), &panels_options.permission_mode, NULL),
573 QUICK_STOP_GROUPBOX,
574 QUICK_START_GROUPBOX (N_("Quick search")),
575 QUICK_RADIO (QSEARCH_NUM, qsearch_options, (int *) &panels_options.qsearch_mode,
576 NULL),
577 QUICK_STOP_GROUPBOX,
578 QUICK_STOP_COLUMNS,
579 QUICK_BUTTONS_OK_CANCEL,
580 QUICK_END
581 /* *INDENT-ON* */
584 quick_dialog_t qdlg = {
585 -1, -1, 60,
586 N_("Panel options"), "[Panel options]",
587 quick_widgets, NULL, NULL
590 if (quick_dialog (&qdlg) != B_ENTER)
591 return;
594 mc_config_set_bool (mc_main_config, CONFIG_PANELS_SECTION,
595 "simple_swap", (gboolean) (simple_swap & C_BOOL));
597 if (!panels_options.fast_reload_msg_shown && panels_options.fast_reload)
599 message (D_NORMAL, _("Information"),
600 _("Using the fast reload option may not reflect the exact\n"
601 "directory contents. In this case you'll need to do a\n"
602 "manual reload of the directory. See the man page for\n" "the details."));
603 panels_options.fast_reload_msg_shown = TRUE;
606 update_panels (UP_RELOAD, UP_KEEPSEL);
609 /* --------------------------------------------------------------------------------------------- */
611 /* return list type */
613 panel_listing_box (WPanel * panel, char **userp, char **minip, int *use_msformat, int num)
615 int result = -1;
616 char *section = NULL;
618 if (panel == NULL)
620 const char *p;
621 size_t i;
623 p = get_nth_panel_name (num);
624 panel = g_new (WPanel, 1);
625 panel->list_type = list_full;
626 panel->user_format = g_strdup (DEFAULT_USER_FORMAT);
627 panel->user_mini_status = 0;
628 for (i = 0; i < LIST_TYPES; i++)
629 panel->user_status_format[i] = g_strdup (DEFAULT_USER_FORMAT);
630 section = g_strconcat ("Temporal:", p, (char *) NULL);
631 if (!mc_config_has_group (mc_main_config, section))
633 g_free (section);
634 section = g_strdup (p);
636 panel_load_setup (panel, section);
637 g_free (section);
641 int mini_user_status;
642 char *panel_user_format;
643 char *mini_user_format;
644 const char *cp;
646 /* Controls whether the array strings have been translated */
647 const char *list_types[LIST_TYPES] = {
648 N_("&Full file list"),
649 N_("&Brief file list"),
650 N_("&Long file list"),
651 N_("&User defined:")
654 quick_widget_t quick_widgets[] = {
655 /* *INDENT-OFF* */
656 QUICK_RADIO (LIST_TYPES, list_types, &result, &panel_listing_types_id),
657 QUICK_INPUT (panel->user_format, "user-fmt-input", &panel_user_format,
658 &panel_user_format_id, FALSE, FALSE, INPUT_COMPLETE_NONE),
659 QUICK_SEPARATOR (TRUE),
660 QUICK_CHECKBOX (N_("User &mini status"), &mini_user_status, &mini_user_status_id),
661 QUICK_INPUT (panel->user_status_format[panel->list_type], "mini_input",
662 &mini_user_format, &mini_user_format_id, FALSE, FALSE, INPUT_COMPLETE_NONE),
663 QUICK_BUTTONS_OK_CANCEL,
664 QUICK_END
665 /* *INDENT-ON* */
668 quick_dialog_t qdlg = {
669 -1, -1, 48,
670 N_("Listing mode"), "[Listing Mode...]",
671 quick_widgets, panel_listing_callback, NULL
674 /* get hotkey of user-defined format string */
675 cp = strchr (_(list_types[panel_listing_user_idx]), '&');
676 if (cp != NULL && *++cp != '\0')
677 listing_user_hotkey = g_ascii_tolower (*cp);
679 mini_user_status = panel->user_mini_status;
680 result = panel->list_type;
681 status_format = panel->user_status_format;
683 if (panel->list_type != panel_listing_user_idx)
684 quick_widgets[1].options = W_DISABLED;
686 if (!mini_user_status)
687 quick_widgets[4].options = W_DISABLED;
689 if (quick_dialog (&qdlg) == B_CANCEL)
690 result = -1;
691 else
693 *userp = panel_user_format;
694 *minip = mini_user_format;
695 *use_msformat = mini_user_status;
699 if (section != NULL)
701 int i;
703 g_free (panel->user_format);
704 for (i = 0; i < LIST_TYPES; i++)
705 g_free (panel->user_status_format[i]);
706 g_free (panel);
709 return result;
712 /* --------------------------------------------------------------------------------------------- */
714 const panel_field_t *
715 sort_box (panel_sort_info_t * info)
717 const char **sort_orders_names;
718 gsize sort_names_num, i;
719 int sort_idx = 0;
720 const panel_field_t *result = info->sort_field;
722 sort_orders_names = panel_get_sortable_fields (&sort_names_num);
724 for (i = 0; i < sort_names_num; i++)
725 if (strcmp (sort_orders_names[i], _(info->sort_field->title_hotkey)) == 0)
727 sort_idx = i;
728 break;
732 quick_widget_t quick_widgets[] = {
733 /* *INDENT-OFF* */
734 QUICK_START_COLUMNS,
735 QUICK_RADIO (sort_names_num, sort_orders_names, &sort_idx, NULL),
736 QUICK_NEXT_COLUMN,
737 QUICK_CHECKBOX (N_("Executable &first"), &info->exec_first, NULL),
738 QUICK_CHECKBOX (N_("Cas&e sensitive"), &info->case_sensitive, NULL),
739 QUICK_CHECKBOX (N_("&Reverse"), &info->reverse, NULL),
740 QUICK_STOP_COLUMNS,
741 QUICK_BUTTONS_OK_CANCEL,
742 QUICK_END
743 /* *INDENT-ON* */
746 quick_dialog_t qdlg = {
747 -1, -1, 40,
748 N_("Sort order"), "[Sort Order...]",
749 quick_widgets, NULL, NULL
752 if (quick_dialog (&qdlg) != B_CANCEL)
753 result = panel_get_field_by_title_hotkey (sort_orders_names[sort_idx]);
755 if (result == NULL)
756 result = info->sort_field;
759 g_strfreev ((gchar **) sort_orders_names);
761 return result;
764 /* --------------------------------------------------------------------------------------------- */
766 void
767 confirm_box (void)
769 quick_widget_t quick_widgets[] = {
770 /* *INDENT-OFF* */
771 /* TRANSLATORS: no need to translate 'Confirmation', it's just a context prefix */
772 QUICK_CHECKBOX (N_("Confirmation|&Delete"), &confirm_delete, NULL),
773 QUICK_CHECKBOX (N_("Confirmation|O&verwrite"), &confirm_overwrite, NULL),
774 QUICK_CHECKBOX (N_("Confirmation|&Execute"), &confirm_execute, NULL),
775 QUICK_CHECKBOX (N_("Confirmation|E&xit"), &confirm_exit, NULL),
776 QUICK_CHECKBOX (N_("Confirmation|Di&rectory hotlist delete"),
777 &confirm_directory_hotlist_delete, NULL),
778 QUICK_CHECKBOX (N_("Confirmation|&History cleanup"),
779 &mc_global.widget.confirm_history_cleanup, NULL),
780 QUICK_BUTTONS_OK_CANCEL,
781 QUICK_END
782 /* *INDENT-ON* */
785 quick_dialog_t qdlg = {
786 -1, -1, 46,
787 N_("Confirmation"), "[Confirmation]",
788 quick_widgets, NULL, NULL
791 (void) quick_dialog (&qdlg);
794 /* --------------------------------------------------------------------------------------------- */
796 #ifndef HAVE_CHARSET
797 void
798 display_bits_box (void)
800 int new_meta;
801 int current_mode;
803 const char *display_bits_str[] = {
804 N_("&UTF-8 output"),
805 N_("&Full 8 bits output"),
806 N_("&ISO 8859-1"),
807 N_("7 &bits")
810 quick_widget_t quick_widgets[] = {
811 /* *INDENT-OFF* */
812 QUICK_RADIO (4, display_bits_str, &current_mode, NULL),
813 QUICK_SEPARATOR (TRUE),
814 QUICK_CHECKBOX (N_("F&ull 8 bits input"), &new_meta, NULL),
815 QUICK_BUTTONS_OK_CANCEL,
816 QUICK_END
817 /* *INDENT-ON* */
820 quick_dialog_t qdlg = {
821 -1, -1, 46,
822 _("Display bits"), "[Display bits]",
823 quick_widgets, NULL, NULL
826 if (mc_global.full_eight_bits)
827 current_mode = 0;
828 else if (mc_global.eight_bit_clean)
829 current_mode = 1;
830 else
831 current_mode = 2;
833 new_meta = !use_8th_bit_as_meta;
835 if (quick_dialog (&qdlg) != B_CANCEL)
837 mc_global.eight_bit_clean = current_mode < 3;
838 mc_global.full_eight_bits = current_mode < 2;
839 #ifndef HAVE_SLANG
840 meta (stdscr, mc_global.eight_bit_clean);
841 #else
842 SLsmg_Display_Eight_Bit = mc_global.full_eight_bits ? 128 : 160;
843 #endif
844 use_8th_bit_as_meta = !new_meta;
848 /* --------------------------------------------------------------------------------------------- */
849 #else /* HAVE_CHARSET */
851 void
852 display_bits_box (void)
854 const char *cpname;
856 cpname = (new_display_codepage < 0) ? _("Other 8 bit")
857 : ((codepage_desc *) g_ptr_array_index (codepages, new_display_codepage))->name;
859 new_display_codepage = mc_global.display_codepage;
862 int new_meta;
864 quick_widget_t quick_widgets[] = {
865 /* *INDENT-OFF* */
866 QUICK_START_COLUMNS,
867 QUICK_LABEL (N_("Input / display codepage:"), NULL),
868 QUICK_NEXT_COLUMN,
869 QUICK_STOP_COLUMNS,
870 QUICK_START_COLUMNS,
871 QUICK_LABEL (cpname, &disp_bits_name_id),
872 QUICK_NEXT_COLUMN,
873 QUICK_BUTTON (N_("&Select"), B_USER, sel_charset_button, NULL),
874 QUICK_STOP_COLUMNS,
875 QUICK_SEPARATOR (TRUE),
876 QUICK_CHECKBOX (N_("F&ull 8 bits input"), &new_meta, NULL),
877 QUICK_BUTTONS_OK_CANCEL,
878 QUICK_END
879 /* *INDENT-ON* */
882 quick_dialog_t qdlg = {
883 -1, -1, 46,
884 N_("Display bits"), "[Display bits]",
885 quick_widgets, NULL, NULL
888 new_meta = !use_8th_bit_as_meta;
889 application_keypad_mode ();
891 if (quick_dialog (&qdlg) == B_ENTER)
893 char *errmsg;
895 mc_global.display_codepage = new_display_codepage;
897 errmsg = init_translation_table (mc_global.source_codepage, mc_global.display_codepage);
898 if (errmsg != NULL)
900 message (D_ERROR, MSG_ERROR, "%s", errmsg);
901 g_free (errmsg);
904 #ifdef HAVE_SLANG
905 tty_display_8bit (mc_global.display_codepage != 0 && mc_global.display_codepage != 1);
906 #else
907 tty_display_8bit (mc_global.display_codepage != 0);
908 #endif
909 use_8th_bit_as_meta = !new_meta;
911 repaint_screen ();
915 #endif /* HAVE_CHARSET */
917 /* --------------------------------------------------------------------------------------------- */
918 /** Show tree in a box, not on a panel */
920 char *
921 tree_box (const char *current_dir)
923 WTree *mytree;
924 WDialog *dlg;
925 Widget *wd;
926 char *val = NULL;
927 WButtonBar *bar;
929 (void) current_dir;
931 /* Create the components */
932 dlg = create_dlg (TRUE, 0, 0, LINES - 9, COLS - 20, dialog_colors, tree_callback, NULL,
933 "[Directory Tree]", _("Directory tree"), DLG_CENTER);
934 wd = WIDGET (dlg);
936 mytree = tree_new (2, 2, wd->lines - 6, wd->cols - 5, FALSE);
937 add_widget_autopos (dlg, mytree, WPOS_KEEP_ALL, NULL);
938 add_widget_autopos (dlg, hline_new (wd->lines - 4, 1, -1), WPOS_KEEP_BOTTOM, NULL);
939 bar = buttonbar_new (TRUE);
940 add_widget (dlg, bar);
941 /* restore ButtonBar coordinates after add_widget() */
942 WIDGET (bar)->x = 0;
943 WIDGET (bar)->y = LINES - 1;
945 if (run_dlg (dlg) == B_ENTER)
946 val = vfs_path_to_str (tree_selected_name (mytree));
948 destroy_dlg (dlg);
949 return val;
952 /* --------------------------------------------------------------------------------------------- */
954 #ifdef ENABLE_VFS
955 void
956 configure_vfs (void)
958 char buffer2[BUF_TINY];
959 #ifdef ENABLE_VFS_FTP
960 char buffer3[BUF_TINY];
962 g_snprintf (buffer3, sizeof (buffer3), "%i", ftpfs_directory_timeout);
963 #endif
965 g_snprintf (buffer2, sizeof (buffer2), "%i", vfs_timeout);
968 char *ret_timeout;
969 #ifdef ENABLE_VFS_FTP
970 char *ret_passwd;
971 char *ret_ftp_proxy;
972 char *ret_directory_timeout;
973 #endif /* ENABLE_VFS_FTP */
975 quick_widget_t quick_widgets[] = {
976 /* *INDENT-OFF* */
977 QUICK_LABELED_INPUT (N_("Timeout for freeing VFSs (sec):"), input_label_left,
978 buffer2, "input-timo-vfs", &ret_timeout, NULL, FALSE, FALSE,
979 INPUT_COMPLETE_NONE),
980 #ifdef ENABLE_VFS_FTP
981 QUICK_SEPARATOR (TRUE),
982 QUICK_LABELED_INPUT (N_("FTP anonymous password:"), input_label_left,
983 ftpfs_anonymous_passwd, "input-passwd", &ret_passwd, NULL,
984 FALSE, FALSE, INPUT_COMPLETE_NONE),
985 QUICK_LABELED_INPUT (N_("FTP directory cache timeout (sec):"), input_label_left,
986 buffer3, "input-timeout", &ret_directory_timeout, NULL,
987 FALSE, FALSE, INPUT_COMPLETE_NONE),
988 QUICK_CHECKBOX (N_("&Always use ftp proxy:"), &ftpfs_always_use_proxy,
989 &ftpfs_always_use_proxy_id),
990 QUICK_INPUT (ftpfs_proxy_host, "input-ftp-proxy", &ret_ftp_proxy,
991 &ftpfs_proxy_host_id, FALSE, FALSE, INPUT_COMPLETE_HOSTNAMES),
992 QUICK_CHECKBOX (N_("&Use ~/.netrc"), &ftpfs_use_netrc, NULL),
993 QUICK_CHECKBOX (N_("Use &passive mode"), &ftpfs_use_passive_connections, NULL),
994 QUICK_CHECKBOX (N_("Use passive mode over pro&xy"),
995 &ftpfs_use_passive_connections_over_proxy, NULL),
996 #endif /* ENABLE_VFS_FTP */
997 QUICK_BUTTONS_OK_CANCEL,
998 QUICK_END
999 /* *INDENT-ON* */
1002 quick_dialog_t qdlg = {
1003 -1, -1, 56,
1004 N_("Virtual File System Setting"), "[Virtual FS]",
1005 quick_widgets,
1006 #ifdef ENABLE_VFS_FTP
1007 confvfs_callback,
1008 #else
1009 NULL,
1010 #endif
1011 NULL,
1014 #ifdef ENABLE_VFS_FTP
1015 if (!ftpfs_always_use_proxy)
1016 quick_widgets[5].options = W_DISABLED;
1017 #endif
1019 if (quick_dialog (&qdlg) != B_CANCEL)
1021 vfs_timeout = atoi (ret_timeout);
1022 g_free (ret_timeout);
1024 if (vfs_timeout < 0 || vfs_timeout > 10000)
1025 vfs_timeout = 10;
1026 #ifdef ENABLE_VFS_FTP
1027 g_free (ftpfs_anonymous_passwd);
1028 ftpfs_anonymous_passwd = ret_passwd;
1029 g_free (ftpfs_proxy_host);
1030 ftpfs_proxy_host = ret_ftp_proxy;
1031 ftpfs_directory_timeout = atoi (ret_directory_timeout);
1032 g_free (ret_directory_timeout);
1033 #endif
1038 #endif /* ENABLE_VFS */
1040 /* --------------------------------------------------------------------------------------------- */
1042 char *
1043 cd_dialog (void)
1045 const Widget *w = WIDGET (current_panel);
1046 char *my_str;
1048 quick_widget_t quick_widgets[] = {
1049 QUICK_LABELED_INPUT (N_("cd"), input_label_left, "", "input", &my_str, NULL, FALSE, TRUE,
1050 INPUT_COMPLETE_FILENAMES | INPUT_COMPLETE_CD),
1051 QUICK_END
1054 quick_dialog_t qdlg = {
1055 w->y + w->lines - 6, w->x, w->cols,
1056 N_("Quick cd"), "[Quick cd]",
1057 quick_widgets, NULL, NULL
1060 return (quick_dialog (&qdlg) != B_CANCEL) ? my_str : NULL;
1063 /* --------------------------------------------------------------------------------------------- */
1065 void
1066 symlink_dialog (const vfs_path_t * existing_vpath, const vfs_path_t * new_vpath,
1067 char **ret_existing, char **ret_new)
1069 char *existing;
1070 char *new;
1072 existing = vfs_path_to_str (existing_vpath);
1073 new = vfs_path_to_str (new_vpath);
1076 quick_widget_t quick_widgets[] = {
1077 /* *INDENT-OFF* */
1078 QUICK_LABELED_INPUT (N_("Existing filename (filename symlink will point to):"),
1079 input_label_above,
1080 existing, "input-2", ret_existing, NULL, FALSE, FALSE, INPUT_COMPLETE_FILENAMES),
1081 QUICK_SEPARATOR (FALSE),
1082 QUICK_LABELED_INPUT (N_("Symbolic link filename:"), input_label_above,
1083 new, "input-1", ret_new, NULL, FALSE, FALSE, INPUT_COMPLETE_FILENAMES),
1084 QUICK_BUTTONS_OK_CANCEL,
1085 QUICK_END
1086 /* *INDENT-ON* */
1089 quick_dialog_t qdlg = {
1090 -1, -1, 64,
1091 N_("Symbolic link"), "[File Menu]",
1092 quick_widgets, NULL, NULL
1095 if (quick_dialog (&qdlg) == B_CANCEL)
1097 *ret_new = NULL;
1098 *ret_existing = NULL;
1102 g_free (existing);
1103 g_free (new);
1106 /* --------------------------------------------------------------------------------------------- */
1108 #ifdef ENABLE_BACKGROUND
1109 void
1110 jobs_cmd (void)
1112 struct
1114 const char *name;
1115 int flags;
1116 int value;
1117 int len;
1118 bcback_fn callback;
1120 job_but[] =
1122 /* *INDENT-OFF* */
1123 { N_("&Stop"), NORMAL_BUTTON, B_STOP, 0, task_cb },
1124 { N_("&Resume"), NORMAL_BUTTON, B_RESUME, 0, task_cb },
1125 { N_("&Kill"), NORMAL_BUTTON, B_KILL, 0, task_cb },
1126 { N_("&OK"), DEFPUSH_BUTTON, B_CANCEL, 0, NULL }
1127 /* *INDENT-ON* */
1130 size_t i;
1131 const size_t n_but = G_N_ELEMENTS (job_but);
1133 WDialog *jobs_dlg;
1134 int cols = 60;
1135 int lines = 15;
1136 int x = 0;
1138 for (i = 0; i < n_but; i++)
1140 #ifdef ENABLE_NLS
1141 job_but[i].name = _(job_but[i].name);
1142 #endif /* ENABLE_NLS */
1144 job_but[i].len = str_term_width1 (job_but[i].name) + 3;
1145 if (job_but[i].flags == DEFPUSH_BUTTON)
1146 job_but[i].len += 2;
1147 x += job_but[i].len;
1150 x += (int) n_but - 1;
1151 cols = max (cols, x + 6);
1153 jobs_dlg = create_dlg (TRUE, 0, 0, lines, cols, dialog_colors, NULL, NULL,
1154 "[Background jobs]", _("Background jobs"), DLG_CENTER);
1156 bg_list = listbox_new (2, 2, lines - 6, cols - 6, FALSE, NULL);
1157 jobs_fill_listbox (bg_list);
1158 add_widget (jobs_dlg, bg_list);
1160 add_widget (jobs_dlg, hline_new (lines - 4, -1, -1));
1162 x = (cols - x) / 2;
1163 for (i = 0; i < n_but; i++)
1165 add_widget (jobs_dlg,
1166 button_new (lines - 3, x, job_but[i].value, job_but[i].flags, job_but[i].name,
1167 job_but[i].callback));
1168 x += job_but[i].len + 1;
1171 (void) run_dlg (jobs_dlg);
1172 destroy_dlg (jobs_dlg);
1174 #endif /* ENABLE_BACKGROUND */
1176 /* --------------------------------------------------------------------------------------------- */
1178 #ifdef ENABLE_VFS_SMB
1179 struct smb_authinfo *
1180 vfs_smb_get_authinfo (const char *host, const char *share, const char *domain, const char *user)
1182 char *label;
1183 struct smb_authinfo *return_value = NULL;
1185 if (domain == NULL)
1186 domain = "";
1187 if (user == NULL)
1188 user = "";
1190 label = g_strdup_printf (_("Password for \\\\%s\\%s"), host, share);
1193 char *ret_domain, *ret_user, *ret_password;
1195 quick_widget_t quick_widgets[] = {
1196 /* *INDENT-OFF* */
1197 QUICK_LABEL (label, NULL),
1198 QUICK_SEPARATOR (TRUE),
1199 QUICK_START_COLUMNS,
1200 QUICK_LABEL (N_("Domain:"), NULL),
1201 QUICK_SEPARATOR (FALSE),
1202 QUICK_LABEL (N_("Username:"), NULL),
1203 QUICK_SEPARATOR (FALSE),
1204 QUICK_LABEL (N_("Password:"), NULL),
1205 QUICK_NEXT_COLUMN,
1206 QUICK_INPUT (domain, "auth_domain", &ret_domain, NULL, FALSE, FALSE, INPUT_COMPLETE_HOSTNAMES),
1207 QUICK_SEPARATOR (FALSE),
1208 QUICK_INPUT (user, "auth_name", &ret_user, NULL, FALSE, FALSE, INPUT_COMPLETE_USERNAMES),
1209 QUICK_SEPARATOR (FALSE),
1210 QUICK_INPUT ("", "auth_password", &ret_password, NULL, TRUE, FALSE, INPUT_COMPLETE_NONE),
1211 QUICK_STOP_COLUMNS,
1212 QUICK_BUTTONS_OK_CANCEL,
1213 QUICK_END
1214 /* *INDENT-ON* */
1217 quick_dialog_t qdlg = {
1218 -1, -1, 40,
1219 N_("SMB authentication"), "[Smb Authinfo]",
1220 quick_widgets, NULL, NULL
1223 if (quick_dialog (&qdlg) != B_CANCEL)
1225 return_value = vfs_smb_authinfo_new (host, share, ret_domain, ret_user, ret_password);
1227 g_free (ret_domain);
1228 g_free (ret_user);
1229 g_free (ret_password);
1233 g_free (label);
1235 return return_value;
1237 #endif /* ENABLE_VFS_SMB */
1239 /* --------------------------------------------------------------------------------------------- */