mirror of
https://github.com/MidnightCommander/mc
synced 2025-03-04 23:21:28 +03:00
mcviewer: apply status message for search process.
Signed-off-by: Andrew Borodin <aborodin@vmail.ru>
This commit is contained in:
parent
fc3f837d03
commit
dc03e9e28d
@ -125,6 +125,26 @@ mcview_set_buttonbar (mcview_t * view)
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
||||
static void
|
||||
mcview_display_percent (mcview_t * view, off_t p)
|
||||
{
|
||||
int percent;
|
||||
|
||||
percent = mcview_calc_percent (view, p);
|
||||
if (percent >= 0)
|
||||
{
|
||||
const screen_dimen top = view->status_area.top;
|
||||
const screen_dimen right = view->status_area.left + view->status_area.width;
|
||||
|
||||
widget_move (view, top, right - 4);
|
||||
tty_printf ("%3d%%", percent);
|
||||
/* avoid cursor wrapping in NCurses-base MC */
|
||||
widget_move (view, top, right - 1);
|
||||
}
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
||||
static void
|
||||
mcview_display_status (mcview_t * view)
|
||||
{
|
||||
@ -394,24 +414,3 @@ mcview_display_ruler (mcview_t * view)
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
||||
void
|
||||
mcview_display_percent (mcview_t * view, off_t p)
|
||||
{
|
||||
int percent;
|
||||
|
||||
percent = mcview_calc_percent (view, p);
|
||||
if (percent >= 0)
|
||||
{
|
||||
const screen_dimen top = view->status_area.top;
|
||||
const screen_dimen right = view->status_area.left + view->status_area.width;
|
||||
|
||||
widget_move (view, top, right - 4);
|
||||
tty_printf ("%3d%%", percent);
|
||||
/* avoid cursor wrapping in NCurses-base MC */
|
||||
widget_move (view, top, right - 1);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
@ -259,7 +259,6 @@ void mcview_update_bytes_per_line (mcview_t * view);
|
||||
void mcview_display_toggle_ruler (mcview_t * view);
|
||||
void mcview_display_clean (mcview_t * view);
|
||||
void mcview_display_ruler (mcview_t * view);
|
||||
void mcview_display_percent (mcview_t * view, off_t p);
|
||||
|
||||
/* growbuf.c: */
|
||||
void mcview_growbuf_init (mcview_t * view);
|
||||
|
@ -36,7 +36,7 @@
|
||||
#include <config.h>
|
||||
|
||||
#include "lib/global.h"
|
||||
#include "lib/tty/tty.h"
|
||||
#include "lib/strutil.h"
|
||||
#include "lib/widget.h"
|
||||
|
||||
#include "src/setup.h"
|
||||
@ -49,14 +49,57 @@
|
||||
|
||||
/*** file scope type declarations ****************************************************************/
|
||||
|
||||
typedef struct
|
||||
{
|
||||
simple_status_msg_t status_msg; /* base class */
|
||||
|
||||
gboolean first;
|
||||
mcview_t *view;
|
||||
off_t offset;
|
||||
} mcview_search_status_msg_t;
|
||||
|
||||
/*** file scope variables ************************************************************************/
|
||||
|
||||
static int search_cb_char_curr_index = -1;
|
||||
static char search_cb_char_buffer[6];
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
/*** file scope functions ************************************************************************/
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
||||
static int
|
||||
mcview_search_status_update_cb (status_msg_t * sm)
|
||||
{
|
||||
simple_status_msg_t *ssm = SIMPLE_STATUS_MSG (sm);
|
||||
mcview_search_status_msg_t *vsm = (mcview_search_status_msg_t *) sm;
|
||||
Widget *wd = WIDGET (sm->dlg);
|
||||
int percent = -1;
|
||||
|
||||
if (verbose)
|
||||
percent = mcview_calc_percent (vsm->view, vsm->offset);
|
||||
|
||||
if (percent >= 0)
|
||||
label_set_textv (ssm->label, _("Searching %s: %3d%%"), vsm->view->last_search_string,
|
||||
percent);
|
||||
else
|
||||
label_set_textv (ssm->label, _("Searching %s"), vsm->view->last_search_string);
|
||||
|
||||
if (vsm->first)
|
||||
{
|
||||
int wd_width;
|
||||
Widget *lw = WIDGET (ssm->label);
|
||||
|
||||
wd_width = max (wd->cols, lw->cols + 6);
|
||||
widget_set_size (wd, wd->y, wd->x, wd->lines, wd_width);
|
||||
widget_set_size (lw, lw->y, wd->x + (wd->cols - lw->cols) / 2, lw->lines, lw->cols);
|
||||
vsm->first = FALSE;
|
||||
}
|
||||
|
||||
return status_msg_common_update (sm);
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
||||
static void
|
||||
mcview_search_update_steps (mcview_t * view)
|
||||
{
|
||||
@ -74,9 +117,9 @@ mcview_search_update_steps (mcview_t * view)
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
||||
static gboolean
|
||||
mcview_find (mcview_t * view, off_t search_start, gsize * len)
|
||||
mcview_find (mcview_search_status_msg_t * ssm, off_t search_start, off_t search_end, gsize * len)
|
||||
{
|
||||
off_t search_end;
|
||||
mcview_t *view = ssm->view;
|
||||
|
||||
view->search_numNeedSkipChar = 0;
|
||||
search_cb_char_curr_index = -1;
|
||||
@ -93,7 +136,7 @@ mcview_find (mcview_t * view, off_t search_start, gsize * len)
|
||||
&& mc_search_is_fixed_search_str (view->search))
|
||||
search_end = search_start + view->search->original_len;
|
||||
|
||||
if (mc_search_run (view->search, (void *) view, search_start, search_end, len)
|
||||
if (mc_search_run (view->search, (void *) ssm, search_start, search_end, len)
|
||||
&& view->search->normal_offset == search_start)
|
||||
{
|
||||
if (view->text_nroff_mode)
|
||||
@ -109,14 +152,13 @@ mcview_find (mcview_t * view, off_t search_start, gsize * len)
|
||||
view->search_nroff_seq->index = search_start;
|
||||
mcview_nroff_seq_info (view->search_nroff_seq);
|
||||
|
||||
return mc_search_run (view->search, (void *) view, search_start, mcview_get_filesize (view),
|
||||
len);
|
||||
return mc_search_run (view->search, (void *) ssm, search_start, search_end, len);
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
||||
static void
|
||||
mcview_search_show_result (mcview_t * view, WDialog ** d, size_t match_len)
|
||||
mcview_search_show_result (mcview_t * view, size_t match_len)
|
||||
{
|
||||
int nroff_len;
|
||||
|
||||
@ -134,13 +176,6 @@ mcview_search_show_result (mcview_t * view, WDialog ** d, size_t match_len)
|
||||
match_len) : 0;
|
||||
view->search_end = view->search_start + match_len + nroff_len;
|
||||
|
||||
if (verbose)
|
||||
{
|
||||
dlg_run_done (*d);
|
||||
dlg_destroy (*d);
|
||||
*d = create_message (D_NORMAL, _("Search"), _("Seeking to search result"));
|
||||
tty_refresh ();
|
||||
}
|
||||
mcview_moveto_match (view);
|
||||
}
|
||||
|
||||
@ -151,7 +186,7 @@ mcview_search_show_result (mcview_t * view, WDialog ** d, size_t match_len)
|
||||
mc_search_cbret_t
|
||||
mcview_search_cmd_callback (const void *user_data, gsize char_offset, int *current_char)
|
||||
{
|
||||
mcview_t *view = (mcview_t *) user_data;
|
||||
mcview_t *view = ((mcview_search_status_msg_t *) user_data)->view;
|
||||
|
||||
/* view_read_continue (view, &view->search_onechar_info); *//* AB:FIXME */
|
||||
if (!view->text_nroff_mode)
|
||||
@ -206,23 +241,22 @@ mcview_search_cmd_callback (const void *user_data, gsize char_offset, int *curre
|
||||
mc_search_cbret_t
|
||||
mcview_search_update_cmd_callback (const void *user_data, gsize char_offset)
|
||||
{
|
||||
mcview_t *view = (mcview_t *) user_data;
|
||||
status_msg_t *sm = STATUS_MSG (user_data);
|
||||
mcview_search_status_msg_t *vsm = (mcview_search_status_msg_t *) user_data;
|
||||
mc_search_cbret_t result = MC_SEARCH_CB_OK;
|
||||
|
||||
if ((off_t) char_offset >= view->update_activate)
|
||||
vsm->offset = (off_t) char_offset;
|
||||
if (vsm->offset >= vsm->view->update_activate)
|
||||
{
|
||||
view->update_activate += view->update_steps;
|
||||
if (verbose)
|
||||
{
|
||||
mcview_display_percent (view, char_offset);
|
||||
tty_refresh ();
|
||||
}
|
||||
if (tty_got_interrupt ())
|
||||
return MC_SEARCH_CB_ABORT;
|
||||
vsm->view->update_activate += vsm->view->update_steps;
|
||||
|
||||
if (sm->update (sm) == B_CANCEL)
|
||||
result = MC_SEARCH_CB_ABORT;
|
||||
}
|
||||
/* may be in future return from this callback will change current position
|
||||
* in searching block. Now this just constant return value.
|
||||
*/
|
||||
return MC_SEARCH_CB_OK;
|
||||
|
||||
/* may be in future return from this callback will change current position in searching block. */
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
@ -230,21 +264,15 @@ mcview_search_update_cmd_callback (const void *user_data, gsize char_offset)
|
||||
void
|
||||
mcview_do_search (mcview_t * view)
|
||||
{
|
||||
mcview_search_status_msg_t vsm;
|
||||
|
||||
off_t search_start = 0;
|
||||
gboolean isFound = FALSE;
|
||||
gboolean need_search_again = TRUE;
|
||||
|
||||
WDialog *d = NULL;
|
||||
|
||||
size_t match_len;
|
||||
|
||||
if (verbose)
|
||||
{
|
||||
d = create_message (D_NORMAL, _("Search"), _("Searching %s"), view->last_search_string);
|
||||
tty_refresh ();
|
||||
}
|
||||
|
||||
/*for avoid infinite search loop we need to increase or decrease start offset of search */
|
||||
/* for avoid infinite search loop we need to increase or decrease start offset of search */
|
||||
|
||||
if (view->search_start != 0)
|
||||
{
|
||||
@ -278,9 +306,15 @@ mcview_do_search (mcview_t * view)
|
||||
|
||||
/* Compute the percent steps */
|
||||
mcview_search_update_steps (view);
|
||||
view->update_activate = 0;
|
||||
|
||||
tty_enable_interrupt_key ();
|
||||
view->update_activate = search_start;
|
||||
|
||||
vsm.first = TRUE;
|
||||
vsm.view = view;
|
||||
vsm.offset = search_start;
|
||||
|
||||
status_msg_init (STATUS_MSG (&vsm), _("Search"), 1.0, simple_status_msg_init_cb,
|
||||
mcview_search_status_update_cb, NULL);
|
||||
|
||||
do
|
||||
{
|
||||
@ -291,9 +325,9 @@ mcview_do_search (mcview_t * view)
|
||||
else
|
||||
growbufsize = view->search->original_len;
|
||||
|
||||
if (mcview_find (view, search_start, &match_len))
|
||||
if (mcview_find (&vsm, search_start, mcview_get_filesize (view), &match_len))
|
||||
{
|
||||
mcview_search_show_result (view, &d, match_len);
|
||||
mcview_search_show_result (view, match_len);
|
||||
need_search_again = FALSE;
|
||||
isFound = TRUE;
|
||||
break;
|
||||
@ -311,6 +345,8 @@ mcview_do_search (mcview_t * view)
|
||||
}
|
||||
while (mcview_may_still_grow (view));
|
||||
|
||||
status_msg_deinit (STATUS_MSG (&vsm));
|
||||
|
||||
if (view->search_start != 0 && !isFound && need_search_again
|
||||
&& !mcview_search_options.backwards)
|
||||
{
|
||||
@ -328,25 +364,35 @@ mcview_do_search (mcview_t * view)
|
||||
search_start = 0;
|
||||
}
|
||||
|
||||
if (!isFound && view->search->error_str != NULL && mcview_find (view, search_start, &match_len))
|
||||
if (!isFound && view->search->error_str != NULL)
|
||||
{
|
||||
mcview_search_show_result (view, &d, match_len);
|
||||
isFound = TRUE;
|
||||
}
|
||||
/* continue search form beginning */
|
||||
off_t search_end;
|
||||
|
||||
tty_disable_interrupt_key ();
|
||||
search_end = view->search_start;
|
||||
/* search_start is 0 here */
|
||||
view->update_activate = search_start;
|
||||
|
||||
if (verbose)
|
||||
{
|
||||
dlg_run_done (d);
|
||||
dlg_destroy (d);
|
||||
vsm.first = TRUE;
|
||||
vsm.view = view;
|
||||
vsm.offset = search_start;
|
||||
|
||||
status_msg_init (STATUS_MSG (&vsm), _("Search"), 1.0, simple_status_msg_init_cb,
|
||||
mcview_search_status_update_cb, NULL);
|
||||
|
||||
if (mcview_find (&vsm, search_start, search_end, &match_len))
|
||||
{
|
||||
mcview_search_show_result (view, match_len);
|
||||
isFound = TRUE;
|
||||
}
|
||||
|
||||
status_msg_deinit (STATUS_MSG (&vsm));
|
||||
}
|
||||
|
||||
if (!isFound && view->search->error_str != NULL)
|
||||
query_dialog (_("Search"), view->search->error_str, D_NORMAL, 1, _("&Dismiss"));
|
||||
|
||||
view->dirty++;
|
||||
mcview_update (view);
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
Loading…
x
Reference in New Issue
Block a user