From ebd6c95e838a5adbd3f08061f2ca8a26924ffa31 Mon Sep 17 00:00:00 2001 From: Andrew Borodin Date: Sat, 6 Feb 2016 18:00:11 +0300 Subject: [PATCH 1/3] Ticket #3593: Find file: empty file name matches any file name. Signed-off-by: Andrew Borodin --- src/filemanager/find.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/filemanager/find.c b/src/filemanager/find.c index e0956d00e..c06be6dda 100644 --- a/src/filemanager/find.c +++ b/src/filemanager/find.c @@ -772,8 +772,11 @@ find_parameters (char **start_dir, ssize_t * start_dir_len, *content = (options.content_use && in_with->buffer[0] != '\0') ? g_strdup (in_with->buffer) : NULL; + if (in_name->buffer[0] != '\0') + *pattern = g_strdup (in_name->buffer); + else + *pattern = g_strdup (options.file_pattern ? "*" : ".*"); *start_dir = in_start->buffer[0] != '\0' ? in_start->buffer : (char *) "."; - *pattern = g_strdup (in_name->buffer); if (in_start_dir != INPUT_LAST_TEXT) g_free (in_start_dir); in_start_dir = g_strdup (*start_dir); From 0e9a3fa57afc4a164ada945d28f48f35e6f2cb83 Mon Sep 17 00:00:00 2001 From: Andrew Borodin Date: Mon, 8 Feb 2016 10:44:33 +0300 Subject: [PATCH 2/3] Find file: describe "File name" input field. Signed-off-by: Andrew Borodin --- doc/man/mc.1.in | 7 ++++++- doc/man/ru/mc.1.in | 13 +++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/doc/man/mc.1.in b/doc/man/mc.1.in index 4ea7a4b64..7d43301d3 100644 --- a/doc/man/mc.1.in +++ b/doc/man/mc.1.in @@ -1414,7 +1414,12 @@ directory tree .\"Directory Tree" figure. .PP -Option \"Whole words\" allows select only those files containing matches that +The "File name" input field contains a filename pattern to be searched +for. It is interpeted as a shell pattern or as a regular expression +depending on the state of the "Using shell patterns" checkbox. An empty +value is valid and matches any file name. +.PP +Option "Whole words" allows select only those files containing matches that form whole words. Like grep \-w. .PP You can start the search by pressing the OK button. diff --git a/doc/man/ru/mc.1.in b/doc/man/ru/mc.1.in index ee5d0d90c..5ec60c88c 100644 --- a/doc/man/ru/mc.1.in +++ b/doc/man/ru/mc.1.in @@ -1500,9 +1500,14 @@ Midnight Commander создает дерево путем просмотра т дерева каталогов\&. .\"Directory Tree" .PP -Опция \"Только целые слова\" устанавливает, что шаблон поиска -соответствует только целым словам (например, если указано \"foo\", -не будет найдено слово \"foobar\"). +Поле "Шаблон имени" содержит маску имени файла, по которой происходит поиск. +В зависимости от опции "Метасимволы shell" маска интерпретируется либо по тем же +правилам, что и в командной оболочке, либо как регулярное выражение. Пустое +поле также допустимо и соответствует любому имени. +.PP +Опция "Только целые слова" устанавливает, что шаблон поиска +соответствует только целым словам (например, если указано "foo", +не будет найдено слово "foobar"). .PP Для того, чтобы начать поиск, нажмите экранную кнопку <Дальше>. Во время поиска его можно приостановить кнопкой <Приостановить> @@ -1521,7 +1526,7 @@ Midnight Commander создает дерево путем просмотра т .B C\-r для возврата к обычному списку файлов. .PP -Опция \"Разрешить игнорирование каталогов\" совместно с расположенным ниже +Опция "Разрешить игнорирование каталогов" совместно с расположенным ниже полем ввода позволяет задать список каталогов, которые нужно пропускать при поиске (например, вы знаете, что искомого файла нет на CDROM или не хотите искать в каталогах, подключенных через NFS по очень медленному каналу). From 3e8d61bbd5b3b5d26becfbe436d356368b8647cf Mon Sep 17 00:00:00 2001 From: Andrew Borodin Date: Thu, 11 Feb 2016 10:07:28 +0300 Subject: [PATCH 3/3] Disable some filename related checkboxes if filename is empty. Signed-off-by: Andrew Borodin --- src/filemanager/find.c | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/src/filemanager/find.c b/src/filemanager/find.c index c06be6dda..3d30a4984 100644 --- a/src/filemanager/find.c +++ b/src/filemanager/find.c @@ -415,6 +415,20 @@ find_check_regexp (const char *r) return regexp_ok; } +/* --------------------------------------------------------------------------------------------- */ + +static void +find_toggle_enable_params (void) +{ + gboolean disable = in_name->buffer[0] == '\0'; + + widget_disable (WIDGET (file_pattern_cbox), disable); + widget_disable (WIDGET (file_case_sens_cbox), disable); +#ifdef HAVE_CHARSET + widget_disable (WIDGET (file_all_charsets_cbox), disable); +#endif +} + /* --------------------------------------------------------------------------------------------- */ /** * Callback for the parameter dialog. @@ -424,10 +438,21 @@ find_check_regexp (const char *r) static cb_ret_t find_parm_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data) { + /* FIXME: HACK: use first draw of dialog to resolve widget state dependencies. + * Use this time moment to check input field content. We can't do that in MSG_INIT + * because history is not loaded yet. + * Probably, we want new MSG_ACTIVATE message as complement to MSG_VALIDATE one. + */ + static gboolean first_draw = TRUE; + WDialog *h = DIALOG (w); switch (msg) { + case MSG_INIT: + first_draw = TRUE; + return MSG_HANDLED; + case MSG_ACTION: if (sender == WIDGET (content_use_cbox)) { @@ -456,7 +481,6 @@ find_parm_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, voi return MSG_NOT_HANDLED; - case MSG_VALIDATE: if (h->ret_value != B_ENTER) return MSG_HANDLED; @@ -483,6 +507,18 @@ find_parm_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, voi return MSG_HANDLED; + case MSG_POST_KEY: + if (h->current->data == in_name) + find_toggle_enable_params (); + return MSG_HANDLED; + + case MSG_DRAW: + if (first_draw) + find_toggle_enable_params (); + + first_draw = FALSE; + /* fall through to call MSG_DRAW default handler */ + default: return dlg_default_callback (w, sender, msg, parm, data); }