mirror of https://github.com/MidnightCommander/mc
Handle history of input line.
Added pointer to the current history item and use to walk in history. Signed-off-by: Andrew Borodin <aborodin@vmail.ru>
This commit is contained in:
parent
f899f62a86
commit
c813d1baad
|
@ -2,7 +2,7 @@
|
||||||
Widgets for the Midnight Commander
|
Widgets for the Midnight Commander
|
||||||
|
|
||||||
Copyright (C) 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003,
|
Copyright (C) 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003,
|
||||||
2004, 2005, 2006, 2007, 2009, 2010, 2011
|
2004, 2005, 2006, 2007, 2009, 2010, 2011, 2012
|
||||||
The Free Software Foundation, Inc.
|
The Free Software Foundation, Inc.
|
||||||
|
|
||||||
Authors:
|
Authors:
|
||||||
|
@ -11,7 +11,7 @@
|
||||||
Jakub Jelinek, 1995
|
Jakub Jelinek, 1995
|
||||||
Andrej Borsenkow, 1996
|
Andrej Borsenkow, 1996
|
||||||
Norbert Warmuth, 1997
|
Norbert Warmuth, 1997
|
||||||
Andrew Borodin <aborodin@vmail.ru>, 2009, 2010
|
Andrew Borodin <aborodin@vmail.ru>, 2009, 2010, 2011, 2012
|
||||||
|
|
||||||
This file is part of the Midnight Commander.
|
This file is part of the Midnight Commander.
|
||||||
|
|
||||||
|
@ -287,7 +287,7 @@ history_save (struct mc_config_t *cfg, const char *name, GList * h)
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
char *
|
char *
|
||||||
history_show (GList ** history, Widget * widget)
|
history_show (GList ** history, Widget * widget, int current)
|
||||||
{
|
{
|
||||||
GList *z, *hlist = NULL, *hi;
|
GList *z, *hlist = NULL, *hi;
|
||||||
size_t maxlen, i, count = 0;
|
size_t maxlen, i, count = 0;
|
||||||
|
@ -342,7 +342,10 @@ history_show (GList ** history, Widget * widget)
|
||||||
{
|
{
|
||||||
/* draw list entries from bottom upto top */
|
/* draw list entries from bottom upto top */
|
||||||
listbox_set_list (query_list, hlist);
|
listbox_set_list (query_list, hlist);
|
||||||
listbox_select_last (query_list);
|
if (current < 0 || (size_t) current >= count)
|
||||||
|
listbox_select_last (query_list);
|
||||||
|
else
|
||||||
|
listbox_select_entry (query_list, count - 1 - (size_t) current);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -350,6 +353,8 @@ history_show (GList ** history, Widget * widget)
|
||||||
/* revert history direction */
|
/* revert history direction */
|
||||||
hlist = g_list_reverse (hlist);
|
hlist = g_list_reverse (hlist);
|
||||||
listbox_set_list (query_list, hlist);
|
listbox_set_list (query_list, hlist);
|
||||||
|
if (current > 0)
|
||||||
|
listbox_select_entry (query_list, current);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (run_dlg (query_dlg) != B_CANCEL)
|
if (run_dlg (query_dlg) != B_CANCEL)
|
||||||
|
|
|
@ -29,7 +29,7 @@ GList *history_load (struct mc_config_t * cfg, const char *name);
|
||||||
void history_save (struct mc_config_t * cfg, const char *name, GList * h);
|
void history_save (struct mc_config_t * cfg, const char *name, GList * h);
|
||||||
/* for repositioning of history dialog we should pass widget to this
|
/* for repositioning of history dialog we should pass widget to this
|
||||||
* function, as position of history dialog depends on widget's position */
|
* function, as position of history dialog depends on widget's position */
|
||||||
char *history_show (GList ** history, Widget * widget);
|
char *history_show (GList ** history, Widget * widget, int current);
|
||||||
|
|
||||||
/*** inline functions ****************************************************************************/
|
/*** inline functions ****************************************************************************/
|
||||||
|
|
||||||
|
|
|
@ -105,7 +105,13 @@ draw_history_button (WInput * in)
|
||||||
char c;
|
char c;
|
||||||
gboolean disabled = (((Widget *) in)->options & W_DISABLED) != 0;
|
gboolean disabled = (((Widget *) in)->options & W_DISABLED) != 0;
|
||||||
|
|
||||||
c = in->history->next ? (in->history->prev ? '|' : 'v') : '^';
|
if (g_list_next (in->history_current) == NULL)
|
||||||
|
c = '^';
|
||||||
|
else if (g_list_previous (in->history_current) == NULL)
|
||||||
|
c = 'v';
|
||||||
|
else
|
||||||
|
c = '|';
|
||||||
|
|
||||||
widget_move (&in->widget, 0, in->field_width - HISTORY_BUTTON_WIDTH);
|
widget_move (&in->widget, 0, in->field_width - HISTORY_BUTTON_WIDTH);
|
||||||
tty_setcolor (disabled ? DISABLED_COLOR : in->color[WINPUTC_HISTORY]);
|
tty_setcolor (disabled ? DISABLED_COLOR : in->color[WINPUTC_HISTORY]);
|
||||||
#ifdef LARGE_HISTORY_BUTTON
|
#ifdef LARGE_HISTORY_BUTTON
|
||||||
|
@ -191,7 +197,7 @@ do_show_hist (WInput * in)
|
||||||
|
|
||||||
len = get_history_length (in->history);
|
len = get_history_length (in->history);
|
||||||
|
|
||||||
r = history_show (&in->history, &in->widget);
|
r = history_show (&in->history, &in->widget, g_list_position (in->history_current, in->history));
|
||||||
if (r != NULL)
|
if (r != NULL)
|
||||||
{
|
{
|
||||||
input_assign_text (in, r);
|
input_assign_text (in, r);
|
||||||
|
@ -268,6 +274,7 @@ push_history (WInput * in, const char *text)
|
||||||
in->history_changed)
|
in->history_changed)
|
||||||
{
|
{
|
||||||
in->history = list_append_unique (in->history, t);
|
in->history = list_append_unique (in->history, t);
|
||||||
|
in->history_current = in->history;
|
||||||
in->history_changed = TRUE;
|
in->history_changed = TRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -628,12 +635,12 @@ hist_prev (WInput * in)
|
||||||
if (in->need_push)
|
if (in->need_push)
|
||||||
push_history (in, in->buffer);
|
push_history (in, in->buffer);
|
||||||
|
|
||||||
prev = g_list_previous (in->history);
|
prev = g_list_previous (in->history_current);
|
||||||
if (prev != NULL)
|
if (prev != NULL)
|
||||||
{
|
{
|
||||||
in->history = prev;
|
|
||||||
in->history_changed = TRUE;
|
|
||||||
input_assign_text (in, (char *) prev->data);
|
input_assign_text (in, (char *) prev->data);
|
||||||
|
in->history_current = prev;
|
||||||
|
in->history_changed = TRUE;
|
||||||
in->need_push = FALSE;
|
in->need_push = FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -655,14 +662,17 @@ hist_next (WInput * in)
|
||||||
if (in->history == NULL)
|
if (in->history == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
next = g_list_next (in->history);
|
next = g_list_next (in->history_current);
|
||||||
if (next == NULL)
|
if (next == NULL)
|
||||||
|
{
|
||||||
input_assign_text (in, "");
|
input_assign_text (in, "");
|
||||||
|
in->history_current = in->history;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
in->history = next;
|
|
||||||
in->history_changed = TRUE;
|
|
||||||
input_assign_text (in, (char *) next->data);
|
input_assign_text (in, (char *) next->data);
|
||||||
|
in->history_current = next;
|
||||||
|
in->history_changed = TRUE;
|
||||||
in->need_push = FALSE;
|
in->need_push = FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -826,6 +836,7 @@ input_load_history (const gchar * event_group_name, const gchar * event_name,
|
||||||
(void) event_name;
|
(void) event_name;
|
||||||
|
|
||||||
in->history = history_load (ev->cfg, in->history_name);
|
in->history = history_load (ev->cfg, in->history_name);
|
||||||
|
in->history_current = in->history;
|
||||||
|
|
||||||
if (in->init_text == NULL)
|
if (in->init_text == NULL)
|
||||||
def_text = "";
|
def_text = "";
|
||||||
|
@ -1005,6 +1016,7 @@ input_new (int y, int x, const int *input_colors, int width, const char *def_tex
|
||||||
|
|
||||||
/* prepare to history setup */
|
/* prepare to history setup */
|
||||||
in->history = NULL;
|
in->history = NULL;
|
||||||
|
in->history_current = NULL;
|
||||||
in->history_changed = FALSE;
|
in->history_changed = FALSE;
|
||||||
in->history_name = NULL;
|
in->history_name = NULL;
|
||||||
if ((histname != NULL) && (*histname != '\0'))
|
if ((histname != NULL) && (*histname != '\0'))
|
||||||
|
@ -1182,12 +1194,13 @@ input_assign_text (WInput * in, const char *text)
|
||||||
{
|
{
|
||||||
input_free_completions (in);
|
input_free_completions (in);
|
||||||
g_free (in->buffer);
|
g_free (in->buffer);
|
||||||
in->buffer = g_strdup (text); /* was in->buffer->text */
|
in->current_max_size = strlen (text) + 1;
|
||||||
in->current_max_size = strlen (in->buffer) + 1;
|
in->buffer = g_strndup (text, in->current_max_size); /* was in->buffer->text */
|
||||||
in->point = str_length (in->buffer);
|
in->point = str_length (in->buffer);
|
||||||
in->mark = 0;
|
in->mark = 0;
|
||||||
in->need_push = TRUE;
|
in->need_push = TRUE;
|
||||||
in->charpoint = 0;
|
in->charpoint = 0;
|
||||||
|
input_update (in, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
|
|
@ -60,6 +60,7 @@ typedef struct
|
||||||
char *buffer; /* pointer to editing buffer */
|
char *buffer; /* pointer to editing buffer */
|
||||||
char *history_name; /* name of history for loading and saving */
|
char *history_name; /* name of history for loading and saving */
|
||||||
GList *history; /* the history */
|
GList *history; /* the history */
|
||||||
|
GList *history_current; /* current history item */
|
||||||
gboolean history_changed; /* the history has changed */
|
gboolean history_changed; /* the history has changed */
|
||||||
gboolean need_push; /* need to push the current Input on hist? */
|
gboolean need_push; /* need to push the current Input on hist? */
|
||||||
gboolean strip_password; /* need to strip password before placing string to history */
|
gboolean strip_password; /* need to strip password before placing string to history */
|
||||||
|
|
|
@ -3122,7 +3122,7 @@ directory_history_list (WPanel * panel)
|
||||||
{
|
{
|
||||||
char *s;
|
char *s;
|
||||||
|
|
||||||
s = history_show (&panel->dir_history, &panel->widget);
|
s = history_show (&panel->dir_history, &panel->widget, -1);
|
||||||
|
|
||||||
if (s != NULL)
|
if (s != NULL)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue