1 /*
2 * Copyright (C) 2006 Michael Brown <mbrown@fensystems.co.uk>.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation; either version 2 of the
7 * License, or any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17 */
18
19 FILE_LICENCE ( GPL2_OR_LATER );
20
21 #include <string.h>
22 #include <assert.h>
23 #include <gpxe/editbox.h>
24
25 /** @file
26 *
27 * Editable text box widget
28 *
29 */
30
31 #define EDITBOX_MIN_CHARS 3
32
33 /**
34 * Initialise text box widget
35 *
36 * @v box Editable text box widget
37 * @v buf Text buffer
38 * @v len Size of text buffer
39 * @v win Containing window
40 * @v row Row
41 * @v col Starting column
42 * @v width Width
43 * @v flags Flags
44 */
init_editbox(struct edit_box * box,char * buf,size_t len,WINDOW * win,unsigned int row,unsigned int col,unsigned int width,unsigned int flags)45 void init_editbox ( struct edit_box *box, char *buf, size_t len,
46 WINDOW *win, unsigned int row, unsigned int col,
47 unsigned int width, unsigned int flags ) {
48 memset ( box, 0, sizeof ( *box ) );
49 box->string.buf = buf;
50 box->string.len = len;
51 box->string.cursor = strlen ( buf );
52 box->win = ( win ? win : stdscr );
53 box->row = row;
54 box->col = col;
55 box->width = width;
56 box->flags = flags;
57 }
58
59 /**
60 * Draw text box widget
61 *
62 * @v box Editable text box widget
63 *
64 */
draw_editbox(struct edit_box * box)65 void draw_editbox ( struct edit_box *box ) {
66 size_t width = box->width;
67 char buf[ width + 1 ];
68 signed int cursor_offset, underflow, overflow, first;
69 size_t len;
70
71 /* Adjust starting offset so that cursor remains within box */
72 cursor_offset = ( box->string.cursor - box->first );
73 underflow = ( EDITBOX_MIN_CHARS - cursor_offset );
74 overflow = ( cursor_offset - ( width - 1 ) );
75 first = box->first;
76 if ( underflow > 0 ) {
77 first -= underflow;
78 if ( first < 0 )
79 first = 0;
80 } else if ( overflow > 0 ) {
81 first += overflow;
82 }
83 box->first = first;
84 cursor_offset = ( box->string.cursor - first );
85
86 /* Construct underscore-padded string portion */
87 memset ( buf, '_', width );
88 buf[width] = '\0';
89 len = ( strlen ( box->string.buf ) - first );
90 if ( len > width )
91 len = width;
92 if ( box->flags & EDITBOX_STARS ) {
93 memset ( buf, '*', len );
94 } else {
95 memcpy ( buf, ( box->string.buf + first ), len );
96 }
97
98 /* Print box content and move cursor */
99 if ( ! box->win )
100 box->win = stdscr;
101 mvwprintw ( box->win, box->row, box->col, "%s", buf );
102 wmove ( box->win, box->row, ( box->col + cursor_offset ) );
103 }
104