source: debwrt/trunk/config/mconf/lxdialog/inputbox.c @ 1

Last change on this file since 1 was 1, checked in by amain, 13 years ago

Initial import of the build environment for DebWrt

File size: 5.6 KB
Line 
1/*
2 *  inputbox.c -- implements the input box
3 *
4 *  ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
5 *  MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
6 *
7 *  This program is free software; you can redistribute it and/or
8 *  modify it under the terms of the GNU General Public License
9 *  as published by the Free Software Foundation; either version 2
10 *  of the License, or (at your option) any later version.
11 *
12 *  This program is distributed in the hope that it will be useful,
13 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 *  GNU General Public License for more details.
16 *
17 *  You should have received a copy of the GNU General Public License
18 *  along with this program; if not, write to the Free Software
19 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21
22#include "dialog.h"
23
24char dialog_input_result[MAX_LEN + 1];
25
26/*
27 *  Print the termination buttons
28 */
29static void print_buttons(WINDOW * dialog, int height, int width, int selected)
30{
31        int x = width / 2 - 11;
32        int y = height - 2;
33
34        print_button(dialog, "  Ok  ", y, x, selected == 0);
35        print_button(dialog, " Help ", y, x + 14, selected == 1);
36
37        wmove(dialog, y, x + 1 + 14 * selected);
38        wrefresh(dialog);
39}
40
41/*
42 * Display a dialog box for inputing a string
43 */
44int dialog_inputbox(const char *title, const char *prompt, int height, int width,
45                    const char *init)
46{
47        int i, x, y, box_y, box_x, box_width;
48        int input_x = 0, scroll = 0, key = 0, button = -1;
49        char *instr = dialog_input_result;
50        WINDOW *dialog;
51
52        /* center dialog box on screen */
53        x = (COLS - width) / 2;
54        y = (LINES - height) / 2;
55
56        draw_shadow(stdscr, y, x, height, width);
57
58        dialog = newwin(height, width, y, x);
59        keypad(dialog, TRUE);
60
61        draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);
62        wattrset(dialog, border_attr);
63        mvwaddch(dialog, height - 3, 0, ACS_LTEE);
64        for (i = 0; i < width - 2; i++)
65                waddch(dialog, ACS_HLINE);
66        wattrset(dialog, dialog_attr);
67        waddch(dialog, ACS_RTEE);
68
69        print_title(dialog, title, width);
70
71        wattrset(dialog, dialog_attr);
72        print_autowrap(dialog, prompt, width - 2, 1, 3);
73
74        /* Draw the input field box */
75        box_width = width - 6;
76        getyx(dialog, y, x);
77        box_y = y + 2;
78        box_x = (width - box_width) / 2;
79        draw_box(dialog, y + 1, box_x - 1, 3, box_width + 2, border_attr, dialog_attr);
80
81        print_buttons(dialog, height, width, 0);
82
83        /* Set up the initial value */
84        wmove(dialog, box_y, box_x);
85        wattrset(dialog, inputbox_attr);
86
87        if (!init)
88                instr[0] = '\0';
89        else
90                strcpy(instr, init);
91
92        input_x = strlen(instr);
93
94        if (input_x >= box_width) {
95                scroll = input_x - box_width + 1;
96                input_x = box_width - 1;
97                for (i = 0; i < box_width - 1; i++)
98                        waddch(dialog, instr[scroll + i]);
99        } else {
100                waddstr(dialog, instr);
101        }
102
103        wmove(dialog, box_y, box_x + input_x);
104
105        wrefresh(dialog);
106
107        while (key != ESC) {
108                key = wgetch(dialog);
109
110                if (button == -1) {     /* Input box selected */
111                        switch (key) {
112                        case TAB:
113                        case KEY_UP:
114                        case KEY_DOWN:
115                                break;
116                        case KEY_LEFT:
117                                continue;
118                        case KEY_RIGHT:
119                                continue;
120                        case KEY_BACKSPACE:
121                        case 127:
122                                if (input_x || scroll) {
123                                        wattrset(dialog, inputbox_attr);
124                                        if (!input_x) {
125                                                scroll = scroll < box_width - 1 ? 0 : scroll - (box_width - 1);
126                                                wmove(dialog, box_y, box_x);
127                                                for (i = 0; i < box_width; i++)
128                                                        waddch(dialog,
129                                                               instr[scroll + input_x + i] ?
130                                                               instr[scroll + input_x + i] : ' ');
131                                                input_x = strlen(instr) - scroll;
132                                        } else
133                                                input_x--;
134                                        instr[scroll + input_x] = '\0';
135                                        mvwaddch(dialog, box_y, input_x + box_x, ' ');
136                                        wmove(dialog, box_y, input_x + box_x);
137                                        wrefresh(dialog);
138                                }
139                                continue;
140                        default:
141                                if (key < 0x100 && isprint(key)) {
142                                        if (scroll + input_x < MAX_LEN) {
143                                                wattrset(dialog, inputbox_attr);
144                                                instr[scroll + input_x] = key;
145                                                instr[scroll + input_x + 1] = '\0';
146                                                if (input_x == box_width - 1) {
147                                                        scroll++;
148                                                        wmove(dialog, box_y, box_x);
149                                                        for (i = 0; i < box_width - 1; i++)
150                                                                waddch(dialog, instr [scroll + i]);
151                                                } else {
152                                                        wmove(dialog, box_y, input_x++ + box_x);
153                                                        waddch(dialog, key);
154                                                }
155                                                wrefresh(dialog);
156                                        } else
157                                                flash();        /* Alarm user about overflow */
158                                        continue;
159                                }
160                        }
161                }
162                switch (key) {
163                case 'O':
164                case 'o':
165                        delwin(dialog);
166                        return 0;
167                case 'H':
168                case 'h':
169                        delwin(dialog);
170                        return 1;
171                case KEY_UP:
172                case KEY_LEFT:
173                        switch (button) {
174                        case -1:
175                                button = 1;     /* Indicates "Cancel" button is selected */
176                                print_buttons(dialog, height, width, 1);
177                                break;
178                        case 0:
179                                button = -1;    /* Indicates input box is selected */
180                                print_buttons(dialog, height, width, 0);
181                                wmove(dialog, box_y, box_x + input_x);
182                                wrefresh(dialog);
183                                break;
184                        case 1:
185                                button = 0;     /* Indicates "OK" button is selected */
186                                print_buttons(dialog, height, width, 0);
187                                break;
188                        }
189                        break;
190                case TAB:
191                case KEY_DOWN:
192                case KEY_RIGHT:
193                        switch (button) {
194                        case -1:
195                                button = 0;     /* Indicates "OK" button is selected */
196                                print_buttons(dialog, height, width, 0);
197                                break;
198                        case 0:
199                                button = 1;     /* Indicates "Cancel" button is selected */
200                                print_buttons(dialog, height, width, 1);
201                                break;
202                        case 1:
203                                button = -1;    /* Indicates input box is selected */
204                                print_buttons(dialog, height, width, 0);
205                                wmove(dialog, box_y, box_x + input_x);
206                                wrefresh(dialog);
207                                break;
208                        }
209                        break;
210                case ' ':
211                case '\n':
212                        delwin(dialog);
213                        return (button == -1 ? 0 : button);
214                case 'X':
215                case 'x':
216                        key = ESC;
217                case ESC:
218                        break;
219                }
220        }
221
222        delwin(dialog);
223        return -1;              /* ESC pressed */
224}
Note: See TracBrowser for help on using the repository browser.