From 35dcbfe7717b4c99fd5c5ff3cedd2a074722303e Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Wed, 20 Dec 2006 01:40:57 +0000 Subject: [PATCH] Editable text box widget based on mucurses and edit_string. --- src/hci/mucurses/widgets/editbox.c | 115 +++++++++++++++++++++++++++++ src/include/gpxe/editbox.h | 35 +++++++++ 2 files changed, 150 insertions(+) create mode 100644 src/hci/mucurses/widgets/editbox.c create mode 100644 src/include/gpxe/editbox.h diff --git a/src/hci/mucurses/widgets/editbox.c b/src/hci/mucurses/widgets/editbox.c new file mode 100644 index 00000000..64c121a1 --- /dev/null +++ b/src/hci/mucurses/widgets/editbox.c @@ -0,0 +1,115 @@ +/* + * Copyright (C) 2006 Michael Brown . + * + * 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 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 +#include +#include + +/** @file + * + * Editable text box widget + * + */ + +#define EDITBOX_MIN_CHARS 3 + +/** + * Initialise text box widget + * + * @v box Editable text box widget + * @v buf Text buffer + * @v len Size of text buffer + * @v win Containing window + * @v row Row + * @v col Starting column + * @v width Width + * + */ +void init_editbox ( struct edit_box *box, char *buf, size_t len, + WINDOW *win, unsigned int row, unsigned int col, + unsigned int width ) { + memset ( box, 0, sizeof ( *box ) ); + box->string.buf = buf; + box->string.len = len; + box->string.cursor = strlen ( buf ); + box->win = ( win ? win : stdscr ); + box->row = row; + box->col = col; + box->width = width; +} + +/** + * Draw text box widget + * + * @v box Editable text box widget + * + */ +void draw_editbox ( struct edit_box *box ) { + size_t width = box->width; + char buf[ width + 1 ]; + size_t keep_len; + signed int cursor_offset, underflow, overflow; + size_t len; + + /* Adjust starting offset so that cursor remains within box */ + cursor_offset = ( box->string.cursor - box->first ); + keep_len = strlen ( box->string.buf ); + if ( keep_len > EDITBOX_MIN_CHARS ) + keep_len = EDITBOX_MIN_CHARS; + underflow = ( keep_len - cursor_offset ); + overflow = ( cursor_offset - ( width - 1 ) ); + if ( underflow > 0 ) { + box->first -= underflow; + } else if ( overflow > 0 ) { + box->first += overflow; + } + cursor_offset = ( box->string.cursor - box->first ); + + /* Construct underscore-padded string portion */ + memset ( buf, '_', width ); + buf[width] = '\0'; + len = ( strlen ( box->string.buf ) - box->first ); + if ( len > width ) + len = width; + memcpy ( buf, ( box->string.buf + box->first ), len ); + + /* Print box content and move cursor */ + if ( ! box->win ) + box->win = stdscr; + mvwprintw ( box->win, box->row, box->col, "%s", buf ); + wmove ( box->win, box->row, ( box->col + cursor_offset ) ); +} + +/** + * Edit text box widget + * + * @v box Editable text box widget + * @v key Key pressed by user + * @ret key Key returned to application, or zero + * + */ +int edit_editbox ( struct edit_box *box, int key ) { + + /* Update the string itself */ + key = edit_string ( &box->string, key ); + + /* Update the display */ + draw_editbox ( box ); + + return key; +} diff --git a/src/include/gpxe/editbox.h b/src/include/gpxe/editbox.h new file mode 100644 index 00000000..2c5e0969 --- /dev/null +++ b/src/include/gpxe/editbox.h @@ -0,0 +1,35 @@ +#ifndef _GPXE_EDITBOX_H +#define _GPXE_EDITBOX_H + +/** @file + * + * Editable text box widget + * + */ + +#include +#include + +/** An editable text box widget */ +struct edit_box { + /** Editable string */ + struct edit_string string; + /** Containing window */ + WINDOW *win; + /** Row */ + unsigned int row; + /** Starting column */ + unsigned int col; + /** Width */ + unsigned int width; + /** First displayed character */ + unsigned int first; +}; + +extern void init_editbox ( struct edit_box *box, char *buf, size_t len, + WINDOW *win, unsigned int row, unsigned int col, + unsigned int width ); +extern void draw_editbox ( struct edit_box *box ); +extern int edit_editbox ( struct edit_box *box, int key ); + +#endif /* _GPXE_EDITBOX_H */