mcviewer: apply status message for search process.

Signed-off-by: Andrew Borodin <aborodin@vmail.ru>
This commit is contained in:
Andrew Borodin 2013-03-14 16:21:41 +04:00
parent fc3f837d03
commit dc03e9e28d
3 changed files with 118 additions and 74 deletions

View File

@ -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);
}
}
/* --------------------------------------------------------------------------------------------- */

View File

@ -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);

View File

@ -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);
}
/* --------------------------------------------------------------------------------------------- */