mirror of
https://github.com/MidnightCommander/mc
synced 2025-04-10 00:52:53 +03:00
Reimplemented search engine in editor.
Now search engines of editor and viewer use the identical algorithm. Signed-off-by: Andrew Borodin <aborodin@vmail.ru>
This commit is contained in:
parent
a80c9edb93
commit
9a8ae90a49
@ -225,6 +225,7 @@ void edit_set_markers (WEdit * edit, long m1, long m2, int c1, int c2);
|
|||||||
void edit_push_markers (WEdit * edit);
|
void edit_push_markers (WEdit * edit);
|
||||||
void edit_replace_cmd (WEdit * edit, int again);
|
void edit_replace_cmd (WEdit * edit, int again);
|
||||||
void edit_search_cmd (WEdit * edit, gboolean again);
|
void edit_search_cmd (WEdit * edit, gboolean again);
|
||||||
|
int edit_search_cmd_callback (const void *user_data, gsize char_offset);
|
||||||
void edit_complete_word_cmd (WEdit * edit);
|
void edit_complete_word_cmd (WEdit * edit);
|
||||||
void edit_get_match_keyword_cmd (WEdit * edit);
|
void edit_get_match_keyword_cmd (WEdit * edit);
|
||||||
int edit_save_block (WEdit * edit, const char *filename, long start, long finish);
|
int edit_save_block (WEdit * edit, const char *filename, long start, long finish);
|
||||||
|
@ -55,6 +55,7 @@ struct WEdit
|
|||||||
mc_search_t *search;
|
mc_search_t *search;
|
||||||
int replace_mode;
|
int replace_mode;
|
||||||
|
|
||||||
|
char *last_search_string; /* String that have been searched */
|
||||||
long search_start; /* First character to start searching from */
|
long search_start; /* First character to start searching from */
|
||||||
int found_len; /* Length of found string or 0 if none was found */
|
int found_len; /* Length of found string or 0 if none was found */
|
||||||
long found_start; /* the found word from a search - start position */
|
long found_start; /* the found word from a search - start position */
|
||||||
|
@ -931,7 +931,6 @@ edit_init (WEdit * edit, int lines, int columns, const char *filename, long line
|
|||||||
}
|
}
|
||||||
#endif /* ENABLE_NLS */
|
#endif /* ENABLE_NLS */
|
||||||
edit = g_malloc0 (sizeof (WEdit));
|
edit = g_malloc0 (sizeof (WEdit));
|
||||||
edit->search = NULL;
|
|
||||||
to_free = 1;
|
to_free = 1;
|
||||||
}
|
}
|
||||||
edit_purge_widget (edit);
|
edit_purge_widget (edit);
|
||||||
@ -1025,6 +1024,8 @@ edit_clean (WEdit * edit)
|
|||||||
|
|
||||||
mc_search_free (edit->search);
|
mc_search_free (edit->search);
|
||||||
edit->search = NULL;
|
edit->search = NULL;
|
||||||
|
g_free (edit->last_search_string);
|
||||||
|
edit->last_search_string = NULL;
|
||||||
|
|
||||||
if (edit->converter != str_cnv_from_term)
|
if (edit->converter != str_cnv_from_term)
|
||||||
str_close_conv (edit->converter);
|
str_close_conv (edit->converter);
|
||||||
|
@ -83,46 +83,7 @@ int edit_confirm_save = 1;
|
|||||||
static int edit_save_cmd (WEdit * edit);
|
static int edit_save_cmd (WEdit * edit);
|
||||||
static unsigned char *edit_get_block (WEdit * edit, long start, long finish, int *l);
|
static unsigned char *edit_get_block (WEdit * edit, long start, long finish, int *l);
|
||||||
|
|
||||||
static void
|
int
|
||||||
edit_search_cmd_search_create_bookmark (WEdit * edit)
|
|
||||||
{
|
|
||||||
int found = 0, books = 0;
|
|
||||||
long l = 0, l_last = -1;
|
|
||||||
long q = 0;
|
|
||||||
gsize len = 0;
|
|
||||||
|
|
||||||
search_create_bookmark = FALSE;
|
|
||||||
book_mark_flush (edit, -1);
|
|
||||||
|
|
||||||
for (;;)
|
|
||||||
{
|
|
||||||
if (!mc_search_run (edit->search, (void *) edit, q, edit->last_byte, &len))
|
|
||||||
break;
|
|
||||||
if (found == 0)
|
|
||||||
edit->search_start = edit->search->normal_offset;
|
|
||||||
found++;
|
|
||||||
l += edit_count_lines (edit, q, edit->search->normal_offset);
|
|
||||||
if (l != l_last)
|
|
||||||
{
|
|
||||||
book_mark_insert (edit, l, BOOK_MARK_FOUND_COLOR);
|
|
||||||
books++;
|
|
||||||
}
|
|
||||||
l_last = l;
|
|
||||||
q = edit->search->normal_offset + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (found == 0)
|
|
||||||
{
|
|
||||||
edit_error_dialog (_("Search"), _("Search string not found"));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
edit_cursor_move (edit, edit->search_start - edit->curs1);
|
|
||||||
edit_scroll_screen_over_cursor (edit);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
edit_search_cmd_callback (const void *user_data, gsize char_offset)
|
edit_search_cmd_callback (const void *user_data, gsize char_offset)
|
||||||
{
|
{
|
||||||
return edit_get_byte ((WEdit *) user_data, (long) char_offset);
|
return edit_get_byte ((WEdit *) user_data, (long) char_offset);
|
||||||
@ -1901,112 +1862,47 @@ edit_replace_cmd (WEdit * edit, int again)
|
|||||||
g_free (input2);
|
g_free (input2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
void
|
edit_do_search (WEdit * edit)
|
||||||
edit_search_cmd (WEdit * edit, gboolean again)
|
|
||||||
{
|
{
|
||||||
char *search_string = NULL, *search_string_dup = NULL;
|
|
||||||
gsize len = 0;
|
gsize len = 0;
|
||||||
|
|
||||||
if (edit == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (edit->search != NULL)
|
|
||||||
{
|
|
||||||
search_string = g_strndup (edit->search->original, edit->search->original_len);
|
|
||||||
search_string_dup = search_string;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
GList *history;
|
|
||||||
history = history_get (MC_HISTORY_SHARED_SEARCH);
|
|
||||||
if (history != NULL && history->data != NULL)
|
|
||||||
{
|
|
||||||
search_string_dup = search_string = (char *) g_strdup (history->data);
|
|
||||||
history = g_list_first (history);
|
|
||||||
g_list_foreach (history, (GFunc) g_free, NULL);
|
|
||||||
g_list_free (history);
|
|
||||||
}
|
|
||||||
edit->search_start = edit->curs1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!again)
|
|
||||||
{
|
|
||||||
#ifdef HAVE_CHARSET
|
|
||||||
GString *tmp;
|
|
||||||
|
|
||||||
if (search_string != NULL && *search_string != '\0')
|
|
||||||
{
|
|
||||||
tmp = str_convert_to_display (search_string);
|
|
||||||
if (tmp != NULL)
|
|
||||||
{
|
|
||||||
if (tmp->len == 0)
|
|
||||||
g_string_free (tmp, TRUE);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
g_free (search_string);
|
|
||||||
search_string = search_string_dup = g_string_free (tmp, FALSE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* HAVE_CHARSET */
|
|
||||||
editcmd_dialog_search_show (edit, &search_string);
|
|
||||||
g_free (search_string_dup);
|
|
||||||
search_string_dup = NULL;
|
|
||||||
#ifdef HAVE_CHARSET
|
|
||||||
if (search_string != NULL && *search_string != '\0')
|
|
||||||
{
|
|
||||||
tmp = str_convert_to_input (search_string);
|
|
||||||
if (tmp != NULL)
|
|
||||||
{
|
|
||||||
if (tmp->len == 0)
|
|
||||||
g_string_free (tmp, TRUE);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
g_free (search_string);
|
|
||||||
search_string = g_string_free (tmp, FALSE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* HAVE_CHARSET */
|
|
||||||
|
|
||||||
edit_push_action (edit, KEY_PRESS + edit->start_display);
|
|
||||||
|
|
||||||
if (search_string == NULL)
|
|
||||||
{
|
|
||||||
edit->force |= REDRAW_COMPLETELY;
|
|
||||||
edit_scroll_screen_over_cursor (edit);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (edit->search != NULL)
|
|
||||||
{
|
|
||||||
mc_search_free (edit->search);
|
|
||||||
edit->search = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (edit->search == NULL)
|
if (edit->search == NULL)
|
||||||
{
|
edit->search_start = edit->curs1;
|
||||||
edit->search = mc_search_new (search_string, -1);
|
|
||||||
if (edit->search == NULL)
|
|
||||||
{
|
|
||||||
edit->search_start = edit->curs1;
|
|
||||||
g_free (search_string);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
edit->search->search_type = edit_search_options.type;
|
edit_push_action (edit, KEY_PRESS + edit->start_display);
|
||||||
edit->search->is_all_charsets = edit_search_options.all_codepages;
|
|
||||||
edit->search->is_case_sensitive = edit_search_options.case_sens;
|
|
||||||
edit->search->whole_words = edit_search_options.whole_words;
|
|
||||||
edit->search->search_fn = edit_search_cmd_callback;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_free (search_string);
|
|
||||||
|
|
||||||
if (search_create_bookmark)
|
if (search_create_bookmark)
|
||||||
edit_search_cmd_search_create_bookmark (edit);
|
{
|
||||||
|
int found = 0, books = 0;
|
||||||
|
long l = 0, l_last = -1;
|
||||||
|
long q = 0;
|
||||||
|
|
||||||
|
search_create_bookmark = FALSE;
|
||||||
|
book_mark_flush (edit, -1);
|
||||||
|
|
||||||
|
while (TRUE)
|
||||||
|
{
|
||||||
|
if (!mc_search_run (edit->search, (void *) edit, q, edit->last_byte, &len))
|
||||||
|
break;
|
||||||
|
if (found == 0)
|
||||||
|
edit->search_start = edit->search->normal_offset;
|
||||||
|
found++;
|
||||||
|
l += edit_count_lines (edit, q, edit->search->normal_offset);
|
||||||
|
if (l != l_last)
|
||||||
|
{
|
||||||
|
book_mark_insert (edit, l, BOOK_MARK_FOUND_COLOR);
|
||||||
|
books++;
|
||||||
|
}
|
||||||
|
l_last = l;
|
||||||
|
q = edit->search->normal_offset + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (found == 0)
|
||||||
|
edit_error_dialog (_("Search"), _("Search string not found"));
|
||||||
|
else
|
||||||
|
edit_cursor_move (edit, edit->search_start - edit->curs1);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (edit->found_len != 0 && edit->search_start == edit->found_start + 1
|
if (edit->found_len != 0 && edit->search_start == edit->found_start + 1
|
||||||
@ -2041,6 +1937,65 @@ edit_search_cmd (WEdit * edit, gboolean again)
|
|||||||
edit_scroll_screen_over_cursor (edit);
|
edit_scroll_screen_over_cursor (edit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
edit_search (WEdit *edit)
|
||||||
|
{
|
||||||
|
if (editcmd_dialog_search_show (edit))
|
||||||
|
edit_do_search (edit);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
edit_search_cmd (WEdit * edit, gboolean again)
|
||||||
|
{
|
||||||
|
if (edit == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!again)
|
||||||
|
edit_search (edit);
|
||||||
|
else if (edit->last_search_string != NULL)
|
||||||
|
edit_do_search (edit);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* find last search string in history */
|
||||||
|
GList *history;
|
||||||
|
|
||||||
|
history = history_get (MC_HISTORY_SHARED_SEARCH);
|
||||||
|
if (history != NULL && history->data != NULL)
|
||||||
|
{
|
||||||
|
edit->last_search_string = (char *) history->data;
|
||||||
|
history->data = NULL;
|
||||||
|
history = g_list_first (history);
|
||||||
|
g_list_foreach (history, (GFunc) g_free, NULL);
|
||||||
|
g_list_free (history);
|
||||||
|
|
||||||
|
edit->search = mc_search_new (edit->last_search_string, -1);
|
||||||
|
if (edit->search == NULL)
|
||||||
|
{
|
||||||
|
/* if not... then ask for an expression */
|
||||||
|
g_free (edit->last_search_string);
|
||||||
|
edit->last_search_string = NULL;
|
||||||
|
edit_search (edit);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
edit->search->search_type = edit_search_options.type;
|
||||||
|
edit->search->is_all_charsets = edit_search_options.all_codepages;
|
||||||
|
edit->search->is_case_sensitive = edit_search_options.case_sens;
|
||||||
|
edit->search->whole_words = edit_search_options.whole_words;
|
||||||
|
edit->search->search_fn = edit_search_cmd_callback;
|
||||||
|
edit_do_search (edit);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* if not... then ask for an expression */
|
||||||
|
g_free (edit->last_search_string);
|
||||||
|
edit->last_search_string = NULL;
|
||||||
|
edit_search (edit);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check if it's OK to close the editor. If there are unsaved changes,
|
* Check if it's OK to close the editor. If there are unsaved changes,
|
||||||
|
@ -157,148 +157,176 @@ editcmd_dialog_replace_show (WEdit * edit, const char *search_default, const cha
|
|||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
void
|
gboolean
|
||||||
editcmd_dialog_search_show (WEdit * edit, char **search_text)
|
editcmd_dialog_search_show (WEdit * edit)
|
||||||
{
|
{
|
||||||
(void) edit;
|
char *search_text;
|
||||||
|
|
||||||
if (*search_text == NULL)
|
size_t num_of_types;
|
||||||
*search_text = INPUT_LAST_TEXT;
|
gchar **list_of_types = mc_search_get_types_strings_array (&num_of_types);
|
||||||
|
int SEARCH_DLG_HEIGHT = SEARCH_DLG_MIN_HEIGHT + num_of_types - SEARCH_DLG_HEIGHT_SUPPLY;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
{
|
int dialog_result;
|
||||||
size_t num_of_types;
|
|
||||||
gchar **list_of_types = mc_search_get_types_strings_array (&num_of_types);
|
|
||||||
int SEARCH_DLG_HEIGHT = SEARCH_DLG_MIN_HEIGHT + num_of_types - SEARCH_DLG_HEIGHT_SUPPLY;
|
|
||||||
size_t i;
|
|
||||||
|
|
||||||
int dialog_result;
|
QuickWidget quick_widgets[] = {
|
||||||
|
/* 0 */
|
||||||
QuickWidget quick_widgets[] = {
|
QUICK_BUTTON (6, 10, 11, SEARCH_DLG_HEIGHT, N_("&Cancel"), B_CANCEL, NULL),
|
||||||
/* 0 */
|
/* 1 */
|
||||||
QUICK_BUTTON (6, 10, 11, SEARCH_DLG_HEIGHT, N_("&Cancel"), B_CANCEL, NULL),
|
QUICK_BUTTON (4, 10, 11, SEARCH_DLG_HEIGHT, N_("&Find all"), B_USER, NULL),
|
||||||
/* 1 */
|
/* 2 */
|
||||||
QUICK_BUTTON (4, 10, 11, SEARCH_DLG_HEIGHT, N_("&Find all"), B_USER, NULL),
|
QUICK_BUTTON (2, 10, 11, SEARCH_DLG_HEIGHT, N_("&OK"), B_ENTER, NULL),
|
||||||
/* 2 */
|
|
||||||
QUICK_BUTTON (2, 10, 11, SEARCH_DLG_HEIGHT, N_("&OK"), B_ENTER, NULL),
|
|
||||||
#ifdef HAVE_CHARSET
|
#ifdef HAVE_CHARSET
|
||||||
/* 3 */
|
/* 3 */
|
||||||
QUICK_CHECKBOX (33, SEARCH_DLG_WIDTH, 9, SEARCH_DLG_HEIGHT, N_("All charsets"),
|
QUICK_CHECKBOX (33, SEARCH_DLG_WIDTH, 9, SEARCH_DLG_HEIGHT, N_("All charsets"),
|
||||||
&edit_search_options.all_codepages),
|
&edit_search_options.all_codepages),
|
||||||
#endif
|
#endif
|
||||||
/* 4 */
|
/* 4 */
|
||||||
QUICK_CHECKBOX (33, SEARCH_DLG_WIDTH, 8, SEARCH_DLG_HEIGHT, N_("&Whole words"),
|
QUICK_CHECKBOX (33, SEARCH_DLG_WIDTH, 8, SEARCH_DLG_HEIGHT, N_("&Whole words"),
|
||||||
&edit_search_options.whole_words),
|
&edit_search_options.whole_words),
|
||||||
/* 5 */
|
/* 5 */
|
||||||
QUICK_CHECKBOX (33, SEARCH_DLG_WIDTH, 7, SEARCH_DLG_HEIGHT, N_("In se&lection"),
|
QUICK_CHECKBOX (33, SEARCH_DLG_WIDTH, 7, SEARCH_DLG_HEIGHT, N_("In se&lection"),
|
||||||
&edit_search_options.only_in_selection),
|
&edit_search_options.only_in_selection),
|
||||||
/* 6 */
|
/* 6 */
|
||||||
QUICK_CHECKBOX (33, SEARCH_DLG_WIDTH, 6, SEARCH_DLG_HEIGHT, N_("&Backwards"),
|
QUICK_CHECKBOX (33, SEARCH_DLG_WIDTH, 6, SEARCH_DLG_HEIGHT, N_("&Backwards"),
|
||||||
&edit_search_options.backwards),
|
&edit_search_options.backwards),
|
||||||
/* 7 */
|
/* 7 */
|
||||||
QUICK_CHECKBOX (33, SEARCH_DLG_WIDTH, 5, SEARCH_DLG_HEIGHT, N_("Case &sensitive"),
|
QUICK_CHECKBOX (33, SEARCH_DLG_WIDTH, 5, SEARCH_DLG_HEIGHT, N_("Case &sensitive"),
|
||||||
&edit_search_options.case_sens),
|
&edit_search_options.case_sens),
|
||||||
/* 8 */
|
/* 8 */
|
||||||
QUICK_RADIO (3, SEARCH_DLG_WIDTH, 5, SEARCH_DLG_HEIGHT,
|
QUICK_RADIO (3, SEARCH_DLG_WIDTH, 5, SEARCH_DLG_HEIGHT,
|
||||||
num_of_types, (const char **) list_of_types,
|
num_of_types, (const char **) list_of_types,
|
||||||
(int *) &edit_search_options.type),
|
(int *) &edit_search_options.type),
|
||||||
/* 9 */
|
/* 9 */
|
||||||
QUICK_INPUT (3, SEARCH_DLG_WIDTH, 3, SEARCH_DLG_HEIGHT,
|
QUICK_INPUT (3, SEARCH_DLG_WIDTH, 3, SEARCH_DLG_HEIGHT,
|
||||||
*search_text, SEARCH_DLG_WIDTH - 6, 0,
|
INPUT_LAST_TEXT, SEARCH_DLG_WIDTH - 6, 0,
|
||||||
MC_HISTORY_SHARED_SEARCH, search_text),
|
MC_HISTORY_SHARED_SEARCH, &search_text),
|
||||||
/* 10 */
|
/* 10 */
|
||||||
QUICK_LABEL (3, SEARCH_DLG_WIDTH, 2, SEARCH_DLG_HEIGHT, N_("Enter search string:")),
|
QUICK_LABEL (3, SEARCH_DLG_WIDTH, 2, SEARCH_DLG_HEIGHT, N_("Enter search string:")),
|
||||||
QUICK_END
|
QUICK_END
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef HAVE_CHARSET
|
#ifdef HAVE_CHARSET
|
||||||
size_t last_checkbox = 7;
|
size_t last_checkbox = 7;
|
||||||
#else
|
#else
|
||||||
size_t last_checkbox = 6;
|
size_t last_checkbox = 6;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
QuickDialog Quick_input = {
|
QuickDialog Quick_input = {
|
||||||
SEARCH_DLG_WIDTH, SEARCH_DLG_HEIGHT, -1, -1, N_("Search"),
|
SEARCH_DLG_WIDTH, SEARCH_DLG_HEIGHT, -1, -1, N_("Search"),
|
||||||
"[Input Line Keys]", quick_widgets, NULL, TRUE
|
"[Input Line Keys]", quick_widgets, NULL, TRUE
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef ENABLE_NLS
|
#ifdef ENABLE_NLS
|
||||||
char **list_of_types_nls;
|
char **list_of_types_nls;
|
||||||
|
|
||||||
/* header title */
|
/* header title */
|
||||||
Quick_input.title = _(Quick_input.title);
|
Quick_input.title = _(Quick_input.title);
|
||||||
/* buttons */
|
/* buttons */
|
||||||
for (i = 0; i < 3; i++)
|
for (i = 0; i < 3; i++)
|
||||||
quick_widgets[i].u.button.text = _(quick_widgets[i].u.button.text);
|
quick_widgets[i].u.button.text = _(quick_widgets[i].u.button.text);
|
||||||
/* checkboxes */
|
/* checkboxes */
|
||||||
for (i = 3; i <= last_checkbox; i++)
|
for (i = 3; i <= last_checkbox; i++)
|
||||||
quick_widgets[i].u.checkbox.text = _(quick_widgets[i].u.checkbox.text);
|
quick_widgets[i].u.checkbox.text = _(quick_widgets[i].u.checkbox.text);
|
||||||
/* label */
|
/* label */
|
||||||
quick_widgets[10].u.label.text = _(quick_widgets[10].u.label.text);
|
quick_widgets[10].u.label.text = _(quick_widgets[10].u.label.text);
|
||||||
|
|
||||||
/* radiobuttons */
|
/* radiobuttons */
|
||||||
/* create copy of radio items to avoid memory leak */
|
/* create copy of radio items to avoid memory leak */
|
||||||
list_of_types_nls = g_new0 (char *, num_of_types + 1);
|
list_of_types_nls = g_new0 (char *, num_of_types + 1);
|
||||||
for (i = 0; i < num_of_types; i++)
|
for (i = 0; i < num_of_types; i++)
|
||||||
list_of_types_nls[i] = g_strdup (_(list_of_types[i]));
|
list_of_types_nls[i] = g_strdup (_(list_of_types[i]));
|
||||||
g_strfreev (list_of_types);
|
g_strfreev (list_of_types);
|
||||||
list_of_types = list_of_types_nls;
|
list_of_types = list_of_types_nls;
|
||||||
quick_widgets[last_checkbox + 1].u.radio.items = (const char **) list_of_types;
|
quick_widgets[last_checkbox + 1].u.radio.items = (const char **) list_of_types;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* calculate widget coordinates */
|
/* calculate widget coordinates */
|
||||||
|
{
|
||||||
|
int len = 0;
|
||||||
|
int dlg_width;
|
||||||
|
gchar **radio = list_of_types;
|
||||||
|
int b0_len, b1_len, b2_len;
|
||||||
|
const int button_gap = 2;
|
||||||
|
|
||||||
|
/* length of radiobuttons */
|
||||||
|
while (*radio != NULL)
|
||||||
{
|
{
|
||||||
int len = 0;
|
len = max (len, str_term_width1 (*radio));
|
||||||
int dlg_width;
|
radio++;
|
||||||
gchar **radio = list_of_types;
|
|
||||||
int b0_len, b1_len, b2_len;
|
|
||||||
const int button_gap = 2;
|
|
||||||
|
|
||||||
/* length of radiobuttons */
|
|
||||||
while (*radio != NULL)
|
|
||||||
{
|
|
||||||
len = max (len, str_term_width1 (*radio));
|
|
||||||
radio++;
|
|
||||||
}
|
|
||||||
/* length of checkboxes */
|
|
||||||
for (i = 3; i <= last_checkbox; i++)
|
|
||||||
len = max (len, str_term_width1 (quick_widgets[i].u.checkbox.text) + 4);
|
|
||||||
|
|
||||||
/* preliminary dialog width */
|
|
||||||
dlg_width = max (len * 2, str_term_width1 (Quick_input.title)) + 4;
|
|
||||||
|
|
||||||
/* length of buttons */
|
|
||||||
b0_len = str_term_width1 (quick_widgets[0].u.button.text) + 3;
|
|
||||||
b1_len = str_term_width1 (quick_widgets[1].u.button.text) + 3;
|
|
||||||
b2_len = str_term_width1 (quick_widgets[2].u.button.text) + 5; /* default button */
|
|
||||||
len = b0_len + b1_len + b2_len + button_gap * 2;
|
|
||||||
|
|
||||||
/* dialog width */
|
|
||||||
Quick_input.xlen = max (SEARCH_DLG_WIDTH, max (dlg_width, len + 6));
|
|
||||||
|
|
||||||
/* correct widget coordinates */
|
|
||||||
for (i = 0; i < sizeof (quick_widgets) / sizeof (quick_widgets[0]); i++)
|
|
||||||
quick_widgets[i].x_divisions = Quick_input.xlen;
|
|
||||||
|
|
||||||
/* checkbox positions */
|
|
||||||
for (i = 3; i <= last_checkbox; i++)
|
|
||||||
quick_widgets[i].relative_x = Quick_input.xlen / 2 + 2;
|
|
||||||
/* input length */
|
|
||||||
quick_widgets[last_checkbox + 2].u.input.len = Quick_input.xlen - 6;
|
|
||||||
/* button positions */
|
|
||||||
quick_widgets[2].relative_x = Quick_input.xlen / 2 - len / 2;
|
|
||||||
quick_widgets[1].relative_x = quick_widgets[2].relative_x + b2_len + button_gap;
|
|
||||||
quick_widgets[0].relative_x = quick_widgets[1].relative_x + b1_len + button_gap;
|
|
||||||
}
|
}
|
||||||
|
/* length of checkboxes */
|
||||||
|
for (i = 3; i <= last_checkbox; i++)
|
||||||
|
len = max (len, str_term_width1 (quick_widgets[i].u.checkbox.text) + 4);
|
||||||
|
|
||||||
dialog_result = quick_dialog (&Quick_input);
|
/* preliminary dialog width */
|
||||||
|
dlg_width = max (len * 2, str_term_width1 (Quick_input.title)) + 4;
|
||||||
|
|
||||||
g_strfreev (list_of_types);
|
/* length of buttons */
|
||||||
|
b0_len = str_term_width1 (quick_widgets[0].u.button.text) + 3;
|
||||||
|
b1_len = str_term_width1 (quick_widgets[1].u.button.text) + 3;
|
||||||
|
b2_len = str_term_width1 (quick_widgets[2].u.button.text) + 5; /* default button */
|
||||||
|
len = b0_len + b1_len + b2_len + button_gap * 2;
|
||||||
|
|
||||||
if (dialog_result == B_CANCEL)
|
/* dialog width */
|
||||||
*search_text = NULL;
|
Quick_input.xlen = max (SEARCH_DLG_WIDTH, max (dlg_width, len + 6));
|
||||||
else if (dialog_result == B_USER)
|
|
||||||
search_create_bookmark = TRUE;
|
/* correct widget coordinates */
|
||||||
|
for (i = 0; i < sizeof (quick_widgets) / sizeof (quick_widgets[0]); i++)
|
||||||
|
quick_widgets[i].x_divisions = Quick_input.xlen;
|
||||||
|
|
||||||
|
/* checkbox positions */
|
||||||
|
for (i = 3; i <= last_checkbox; i++)
|
||||||
|
quick_widgets[i].relative_x = Quick_input.xlen / 2 + 2;
|
||||||
|
/* input length */
|
||||||
|
quick_widgets[last_checkbox + 2].u.input.len = Quick_input.xlen - 6;
|
||||||
|
/* button positions */
|
||||||
|
quick_widgets[2].relative_x = Quick_input.xlen / 2 - len / 2;
|
||||||
|
quick_widgets[1].relative_x = quick_widgets[2].relative_x + b2_len + button_gap;
|
||||||
|
quick_widgets[0].relative_x = quick_widgets[1].relative_x + b1_len + button_gap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dialog_result = quick_dialog (&Quick_input);
|
||||||
|
|
||||||
|
g_strfreev (list_of_types);
|
||||||
|
|
||||||
|
if ((dialog_result == B_CANCEL) || (search_text == NULL) || (search_text[0] == '\0'))
|
||||||
|
{
|
||||||
|
g_free (search_text);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dialog_result == B_USER)
|
||||||
|
search_create_bookmark = TRUE;
|
||||||
|
|
||||||
|
#ifdef HAVE_CHARSET
|
||||||
|
{
|
||||||
|
GString *tmp;
|
||||||
|
|
||||||
|
tmp = str_convert_to_input (search_text);
|
||||||
|
if (tmp != NULL)
|
||||||
|
{
|
||||||
|
g_free (search_text);
|
||||||
|
search_text = g_string_free (tmp, FALSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
g_free (edit->last_search_string);
|
||||||
|
edit->last_search_string = search_text;
|
||||||
|
mc_search_free (edit->search);
|
||||||
|
|
||||||
|
edit->search = mc_search_new (edit->last_search_string, -1);
|
||||||
|
if (edit->search != NULL)
|
||||||
|
{
|
||||||
|
edit->search->search_type = edit_search_options.type;
|
||||||
|
edit->search->is_all_charsets = edit_search_options.all_codepages;
|
||||||
|
edit->search->is_case_sensitive = edit_search_options.case_sens;
|
||||||
|
edit->search->whole_words = edit_search_options.whole_words;
|
||||||
|
edit->search->search_fn = edit_search_cmd_callback;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (edit->search != NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
@ -26,7 +26,7 @@ struct selection {
|
|||||||
|
|
||||||
void editcmd_dialog_replace_show (WEdit *, const char *, const char *, char **, char **);
|
void editcmd_dialog_replace_show (WEdit *, const char *, const char *, char **, char **);
|
||||||
|
|
||||||
void editcmd_dialog_search_show (WEdit *, char **);
|
gboolean editcmd_dialog_search_show (WEdit *edit);
|
||||||
|
|
||||||
int editcmd_dialog_raw_key_query (const char *, const char *, int);
|
int editcmd_dialog_raw_key_query (const char *, const char *, int);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user