Implement line_edit() function (full line editor) which may called
externally. Rewrite inputbox/textbox to use this function.
This commit is contained in:
parent
57a3ad3e15
commit
2a9cdd71dd
@ -1,9 +1,9 @@
|
||||
# Makefile for libdialog
|
||||
# $Id: Makefile,v 1.2 1994/10/12 01:54:38 ache Exp $
|
||||
# $Id: Makefile,v 1.3 1994/10/20 21:56:34 ache Exp $
|
||||
|
||||
LIB= dialog
|
||||
SRCS= kernel.c rc.c checklist.c inputbox.c menubox.c msgbox.c \
|
||||
radiolist.c textbox.c yesno.c
|
||||
lineedit.c radiolist.c textbox.c yesno.c
|
||||
|
||||
CFLAGS+= -Wall -Wstrict-prototypes -DLOCALE
|
||||
|
||||
|
@ -41,6 +41,7 @@ extern bool use_shadow;
|
||||
void draw_shadow(WINDOW *win, int y, int x, int height, int width);
|
||||
#endif
|
||||
void draw_box(WINDOW *win, int y, int x, int height, int width, chtype box, chtype border);
|
||||
int line_edit(WINDOW* dialog, int box_y, int box_x, int box_width, chtype attrs, int first, unsigned char *result);
|
||||
|
||||
void dialog_create_rc(unsigned char *filename);
|
||||
int dialog_yesno(unsigned char *title, unsigned char *prompt, int height, int width);
|
||||
|
@ -28,8 +28,8 @@
|
||||
*/
|
||||
int dialog_inputbox(unsigned char *title, unsigned char *prompt, int height, int width, unsigned char *result)
|
||||
{
|
||||
int i, x, y, box_y, box_x, box_width,
|
||||
input_x = 0, scroll = 0, key = 0, button = -1;
|
||||
int i, x, y, box_y, box_x, box_width, first,
|
||||
key = 0, button = -1;
|
||||
unsigned char instr[MAX_LEN+1];
|
||||
WINDOW *dialog;
|
||||
|
||||
@ -37,8 +37,6 @@ int dialog_inputbox(unsigned char *title, unsigned char *prompt, int height, int
|
||||
x = (COLS - width)/2;
|
||||
y = (LINES - height)/2;
|
||||
|
||||
memset(instr, 0, sizeof(instr));
|
||||
|
||||
#ifdef HAVE_NCURSES
|
||||
if (use_shadow)
|
||||
draw_shadow(stdscr, y, x, height, width);
|
||||
@ -80,127 +78,15 @@ int dialog_inputbox(unsigned char *title, unsigned char *prompt, int height, int
|
||||
print_button(dialog, "Cancel", y, x+14, FALSE);
|
||||
print_button(dialog, " OK ", y, x, TRUE);
|
||||
|
||||
wmove(dialog, box_y, box_x);
|
||||
wrefresh(dialog);
|
||||
first = 1;
|
||||
while (key != ESC) {
|
||||
key = wgetch(dialog);
|
||||
|
||||
if (button == -1) { /* Input box selected */
|
||||
switch (key) {
|
||||
case TAB:
|
||||
case KEY_BTAB:
|
||||
case KEY_UP:
|
||||
case KEY_DOWN:
|
||||
break;
|
||||
case KEY_HOME:
|
||||
input_x = scroll = 0;
|
||||
wmove(dialog, box_y, box_x);
|
||||
for (i = 0; i < box_width; i++)
|
||||
waddch(dialog, instr[i] ? instr[i] : ' ');
|
||||
wmove(dialog, box_y, box_x);
|
||||
wrefresh(dialog);
|
||||
continue;
|
||||
case KEY_END:
|
||||
for (i = strlen(instr) - 1; i >= scroll + input_x && instr[i] == ' '; i--)
|
||||
instr[i] = '\0';
|
||||
i++;
|
||||
input_x = i % box_width;
|
||||
scroll = i - input_x;
|
||||
wmove(dialog, box_y, box_x);
|
||||
for (i = 0; i < box_width; i++)
|
||||
waddch(dialog, instr[scroll+i] ? instr[scroll+i] : ' ');
|
||||
wmove(dialog, box_y, input_x + box_x);
|
||||
wrefresh(dialog);
|
||||
continue;
|
||||
case KEY_LEFT:
|
||||
if (input_x || scroll) {
|
||||
wattrset(dialog, inputbox_attr);
|
||||
if (!input_x) {
|
||||
int oldscroll = scroll;
|
||||
scroll = scroll < box_width-1 ? 0 : scroll-(box_width-1);
|
||||
wmove(dialog, box_y, box_x);
|
||||
for (i = 0; i < box_width; i++)
|
||||
waddch(dialog, instr[scroll+input_x+i] ? instr[scroll+input_x+i] : ' ');
|
||||
input_x = oldscroll - 1 - scroll;
|
||||
}
|
||||
else
|
||||
input_x--;
|
||||
wmove(dialog, box_y, input_x + box_x);
|
||||
wrefresh(dialog);
|
||||
}
|
||||
continue;
|
||||
case KEY_RIGHT:
|
||||
if (scroll+input_x < MAX_LEN) {
|
||||
wattrset(dialog, inputbox_attr);
|
||||
if (!instr[scroll+input_x])
|
||||
instr[scroll+input_x] = ' ';
|
||||
if (input_x == box_width-1) {
|
||||
scroll++;
|
||||
wmove(dialog, box_y, box_x);
|
||||
for (i = 0; i < box_width; i++)
|
||||
waddch(dialog, instr[scroll+i] ? instr[scroll+i] : ' ');
|
||||
wmove(dialog, box_y, box_x + box_width - 1);
|
||||
}
|
||||
else {
|
||||
wmove(dialog, box_y, input_x + box_x);
|
||||
waddch(dialog, instr[scroll+input_x]);
|
||||
input_x++;
|
||||
}
|
||||
wrefresh(dialog);
|
||||
} else
|
||||
flash(); /* Alarm user about overflow */
|
||||
continue;
|
||||
case KEY_BACKSPACE:
|
||||
case KEY_DC:
|
||||
if (input_x || scroll) {
|
||||
i = strlen(instr);
|
||||
memmove(instr+scroll+input_x-1, instr+scroll+input_x, i-scroll+input_x+1);
|
||||
wattrset(dialog, inputbox_attr);
|
||||
if (!input_x) {
|
||||
int oldscroll = scroll;
|
||||
scroll = scroll < box_width-1 ? 0 : scroll-(box_width-1);
|
||||
wmove(dialog, box_y, box_x);
|
||||
for (i = 0; i < box_width; i++)
|
||||
waddch(dialog, instr[scroll+input_x+i] ? instr[scroll+input_x+i] : ' ');
|
||||
input_x = oldscroll - 1 - scroll;
|
||||
}
|
||||
else
|
||||
input_x--;
|
||||
wmove(dialog, box_y, input_x + box_x);
|
||||
for (i = input_x; i < box_width; i++)
|
||||
waddch(dialog, instr[scroll+i] ? instr[scroll+i] : ' ');
|
||||
wmove(dialog, box_y, input_x + box_x);
|
||||
wrefresh(dialog);
|
||||
}
|
||||
continue;
|
||||
default:
|
||||
if (key < 0x100 && isprint(key)) {
|
||||
for (i = strlen(instr) - 1; i >= scroll + input_x && instr[i] == ' '; i--)
|
||||
instr[i] = '\0';
|
||||
i++;
|
||||
if (i < MAX_LEN) {
|
||||
memmove(instr+scroll+input_x+1, instr+scroll+input_x, i-scroll+input_x);
|
||||
wattrset(dialog, inputbox_attr);
|
||||
instr[scroll+input_x] = key;
|
||||
if (input_x == box_width-1) {
|
||||
scroll++;
|
||||
wmove(dialog, box_y, box_x);
|
||||
for (i = 0; i < box_width-1; i++)
|
||||
waddch(dialog, instr[scroll+i]);
|
||||
}
|
||||
else {
|
||||
wmove(dialog, box_y, input_x + box_x);
|
||||
for (i = input_x; i < box_width; i++)
|
||||
waddch(dialog, instr[scroll+i] ? instr[scroll+i] : ' ');
|
||||
wmove(dialog, box_y, ++input_x + box_x);
|
||||
}
|
||||
wrefresh(dialog);
|
||||
} else
|
||||
flash(); /* Alarm user about overflow */
|
||||
continue;
|
||||
}
|
||||
}
|
||||
key = line_edit(dialog, box_y, box_x, box_width, dialog_attr, first, instr);
|
||||
first = 0;
|
||||
}
|
||||
else
|
||||
key = wgetch(dialog);
|
||||
|
||||
switch (key) {
|
||||
case 'O':
|
||||
@ -226,8 +112,6 @@ int dialog_inputbox(unsigned char *title, unsigned char *prompt, int height, int
|
||||
button = -1; /* Indicates input box is selected */
|
||||
print_button(dialog, "Cancel", y, x+14, FALSE);
|
||||
print_button(dialog, " OK ", y, x, TRUE);
|
||||
wmove(dialog, box_y, box_x + input_x);
|
||||
wrefresh(dialog);
|
||||
break;
|
||||
case 1:
|
||||
button = 0; /* Indicates "OK" button is selected */
|
||||
@ -257,16 +141,12 @@ int dialog_inputbox(unsigned char *title, unsigned char *prompt, int height, int
|
||||
button = -1; /* Indicates input box is selected */
|
||||
print_button(dialog, "Cancel", y, x+14, FALSE);
|
||||
print_button(dialog, " OK ", y, x, TRUE);
|
||||
wmove(dialog, box_y, box_x + input_x);
|
||||
wrefresh(dialog);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case ' ':
|
||||
case '\n':
|
||||
delwin(dialog);
|
||||
for (i = strlen(instr) - 1; i >= scroll + input_x && instr[i] == ' '; i--)
|
||||
instr[i] = '\0';
|
||||
if (button < 1)
|
||||
strcpy(result, instr);
|
||||
return (button == -1 ? 0 : button);
|
||||
|
168
gnu/lib/libdialog/lineedit.c
Normal file
168
gnu/lib/libdialog/lineedit.c
Normal file
@ -0,0 +1,168 @@
|
||||
/*
|
||||
* inputbox.c -- implements the input box
|
||||
*
|
||||
* AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
|
||||
#include <dialog.h>
|
||||
#include "dialog.priv.h"
|
||||
|
||||
|
||||
/*
|
||||
* Line editor
|
||||
*/
|
||||
int line_edit(WINDOW* dialog, int box_y, int box_x, int box_width, chtype attr, int first, unsigned char *result)
|
||||
{
|
||||
int i, key;
|
||||
static int input_x, scroll;
|
||||
static unsigned char instr[MAX_LEN+1];
|
||||
|
||||
if (first) {
|
||||
keypad(dialog, TRUE);
|
||||
memset(instr, 0, sizeof(instr));
|
||||
input_x = scroll = 0;
|
||||
}
|
||||
|
||||
wattrset(dialog, attr);
|
||||
wmove(dialog, box_y, box_x + input_x);
|
||||
wrefresh(dialog);
|
||||
for (;;) {
|
||||
key = wgetch(dialog);
|
||||
switch (key) {
|
||||
case TAB:
|
||||
case KEY_BTAB:
|
||||
case KEY_UP:
|
||||
case KEY_DOWN:
|
||||
case ESC:
|
||||
case '\n':
|
||||
for (i = strlen(instr) - 1; i >= scroll + input_x && instr[i] == ' '; i--)
|
||||
instr[i] = '\0';
|
||||
goto ret;
|
||||
case KEY_HOME:
|
||||
input_x = scroll = 0;
|
||||
wmove(dialog, box_y, box_x);
|
||||
for (i = 0; i < box_width; i++)
|
||||
waddch(dialog, instr[i] ? instr[i] : ' ');
|
||||
wmove(dialog, box_y, box_x);
|
||||
wrefresh(dialog);
|
||||
continue;
|
||||
case KEY_END:
|
||||
for (i = strlen(instr) - 1; i >= scroll + input_x && instr[i] == ' '; i--)
|
||||
instr[i] = '\0';
|
||||
i++;
|
||||
input_x = i % box_width;
|
||||
scroll = i - input_x;
|
||||
wmove(dialog, box_y, box_x);
|
||||
for (i = 0; i < box_width; i++)
|
||||
waddch(dialog, instr[scroll+i] ? instr[scroll+i] : ' ');
|
||||
wmove(dialog, box_y, input_x + box_x);
|
||||
wrefresh(dialog);
|
||||
continue;
|
||||
case KEY_LEFT:
|
||||
if (input_x || scroll) {
|
||||
wattrset(dialog, inputbox_attr);
|
||||
if (!input_x) {
|
||||
int oldscroll = scroll;
|
||||
scroll = scroll < box_width-1 ? 0 : scroll-(box_width-1);
|
||||
wmove(dialog, box_y, box_x);
|
||||
for (i = 0; i < box_width; i++)
|
||||
waddch(dialog, instr[scroll+input_x+i] ? instr[scroll+input_x+i] : ' ');
|
||||
input_x = oldscroll - 1 - scroll;
|
||||
}
|
||||
else
|
||||
input_x--;
|
||||
wmove(dialog, box_y, input_x + box_x);
|
||||
wrefresh(dialog);
|
||||
}
|
||||
continue;
|
||||
case KEY_RIGHT:
|
||||
if (scroll+input_x < MAX_LEN) {
|
||||
wattrset(dialog, inputbox_attr);
|
||||
if (!instr[scroll+input_x])
|
||||
instr[scroll+input_x] = ' ';
|
||||
if (input_x == box_width-1) {
|
||||
scroll++;
|
||||
wmove(dialog, box_y, box_x);
|
||||
for (i = 0; i < box_width; i++)
|
||||
waddch(dialog, instr[scroll+i] ? instr[scroll+i] : ' ');
|
||||
wmove(dialog, box_y, box_x + box_width - 1);
|
||||
}
|
||||
else {
|
||||
wmove(dialog, box_y, input_x + box_x);
|
||||
waddch(dialog, instr[scroll+input_x]);
|
||||
input_x++;
|
||||
}
|
||||
wrefresh(dialog);
|
||||
} else
|
||||
flash(); /* Alarm user about overflow */
|
||||
continue;
|
||||
case KEY_BACKSPACE:
|
||||
case KEY_DC:
|
||||
if (input_x || scroll) {
|
||||
i = strlen(instr);
|
||||
memmove(instr+scroll+input_x-1, instr+scroll+input_x, i-scroll+input_x+1);
|
||||
wattrset(dialog, inputbox_attr);
|
||||
if (!input_x) {
|
||||
int oldscroll = scroll;
|
||||
scroll = scroll < box_width-1 ? 0 : scroll-(box_width-1);
|
||||
wmove(dialog, box_y, box_x);
|
||||
for (i = 0; i < box_width; i++)
|
||||
waddch(dialog, instr[scroll+input_x+i] ? instr[scroll+input_x+i] : ' ');
|
||||
input_x = oldscroll - 1 - scroll;
|
||||
}
|
||||
else
|
||||
input_x--;
|
||||
wmove(dialog, box_y, input_x + box_x);
|
||||
for (i = input_x; i < box_width; i++)
|
||||
waddch(dialog, instr[scroll+i] ? instr[scroll+i] : ' ');
|
||||
wmove(dialog, box_y, input_x + box_x);
|
||||
wrefresh(dialog);
|
||||
}
|
||||
continue;
|
||||
default:
|
||||
if (key < 0x100 && isprint(key)) {
|
||||
for (i = strlen(instr) - 1; i >= scroll + input_x && instr[i] == ' '; i--)
|
||||
instr[i] = '\0';
|
||||
i++;
|
||||
if (i < MAX_LEN) {
|
||||
memmove(instr+scroll+input_x+1, instr+scroll+input_x, i-scroll+input_x);
|
||||
wattrset(dialog, inputbox_attr);
|
||||
instr[scroll+input_x] = key;
|
||||
if (input_x == box_width-1) {
|
||||
scroll++;
|
||||
wmove(dialog, box_y, box_x);
|
||||
for (i = 0; i < box_width-1; i++)
|
||||
waddch(dialog, instr[scroll+i]);
|
||||
}
|
||||
else {
|
||||
wmove(dialog, box_y, input_x + box_x);
|
||||
for (i = input_x; i < box_width; i++)
|
||||
waddch(dialog, instr[scroll+i] ? instr[scroll+i] : ' ');
|
||||
wmove(dialog, box_y, ++input_x + box_x);
|
||||
}
|
||||
wrefresh(dialog);
|
||||
} else
|
||||
flash(); /* Alarm user about overflow */
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
ret:
|
||||
strcpy(result, instr);
|
||||
return key;
|
||||
}
|
@ -618,7 +618,7 @@ static unsigned char *get_line(void)
|
||||
*/
|
||||
static int get_search_term(WINDOW *win, unsigned char *search_term, int height, int width)
|
||||
{
|
||||
int i, x, y, input_x = 0, scroll = 0, key = 0,
|
||||
int x, y, key = 0, first,
|
||||
box_height = 3, box_width = 30;
|
||||
|
||||
x = (width - box_width)/2;
|
||||
@ -633,55 +633,19 @@ static int get_search_term(WINDOW *win, unsigned char *search_term, int height,
|
||||
waddstr(win, " Search ");
|
||||
|
||||
box_width -= 2;
|
||||
wmove(win, y+1, x+1);
|
||||
wrefresh(win);
|
||||
search_term[0] = '\0';
|
||||
wattrset(win, searchbox_attr);
|
||||
|
||||
first = 1;
|
||||
while (key != ESC) {
|
||||
key = wgetch(win);
|
||||
key = line_edit(win, y+1, x+1, box_width, searchbox_attr, first, search_term);
|
||||
first = 0;
|
||||
switch (key) {
|
||||
case '\n':
|
||||
if (search_term[0] != '\0')
|
||||
return 0;
|
||||
break;
|
||||
case KEY_BACKSPACE:
|
||||
if (input_x || scroll) {
|
||||
if (!input_x) {
|
||||
scroll = scroll < box_width-1 ? 0 : scroll-(box_width-1);
|
||||
wmove(win, y+1, x+1);
|
||||
for (i = 0; i < box_width; i++)
|
||||
waddch(win, search_term[scroll+input_x+i] ?
|
||||
search_term[scroll+input_x+i] : ' ');
|
||||
input_x = strlen(search_term) - scroll;
|
||||
}
|
||||
else
|
||||
input_x--;
|
||||
search_term[scroll+input_x] = '\0';
|
||||
wmove(win, y+1, input_x + x+1);
|
||||
waddch(win, ' ');
|
||||
wmove(win, y+1, input_x + x+1);
|
||||
wrefresh(win);
|
||||
}
|
||||
break;
|
||||
case ESC:
|
||||
break;
|
||||
default:
|
||||
if (isprint(key))
|
||||
if (scroll+input_x < MAX_LEN) {
|
||||
search_term[scroll+input_x] = key;
|
||||
search_term[scroll+input_x+1] = '\0';
|
||||
if (input_x == box_width-1) {
|
||||
scroll++;
|
||||
wmove(win, y+1, x+1);
|
||||
for (i = 0; i < box_width-1; i++)
|
||||
waddch(win, search_term[scroll+i]);
|
||||
}
|
||||
else {
|
||||
wmove(win, y+1, input_x++ + x+1);
|
||||
waddch(win, key);
|
||||
}
|
||||
wrefresh(win);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user