Root/
Source at commit 1900 created 12 years 4 months ago. By ifabio, Update GFX IDs list. | |
---|---|
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 | ␊ |
24 | char dialog_input_result[MAX_LEN + 1];␊ |
25 | ␊ |
26 | /*␊ |
27 | * Print the termination buttons␊ |
28 | */␊ |
29 | static 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, gettext(" Ok "), y, x, selected == 0);␊ |
35 | ␉print_button(dialog, gettext(" 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 | */␊ |
44 | int 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 | ␉if (!init)␊ |
53 | ␉␉instr[0] = '\0';␊ |
54 | ␉else␊ |
55 | ␉␉strcpy(instr, init);␊ |
56 | ␊ |
57 | do_resize:␊ |
58 | ␉if (getmaxy(stdscr) <= (height - 2))␊ |
59 | ␉␉return -ERRDISPLAYTOOSMALL;␊ |
60 | ␉if (getmaxx(stdscr) <= (width - 2))␊ |
61 | ␉␉return -ERRDISPLAYTOOSMALL;␊ |
62 | ␊ |
63 | ␉/* center dialog box on screen */␊ |
64 | ␉x = (COLS - width) / 2;␊ |
65 | ␉y = (LINES - height) / 2;␊ |
66 | ␊ |
67 | ␉draw_shadow(stdscr, y, x, height, width);␊ |
68 | ␊ |
69 | ␉dialog = newwin(height, width, y, x);␊ |
70 | ␉keypad(dialog, TRUE);␊ |
71 | ␊ |
72 | ␉draw_box(dialog, 0, 0, height, width,␊ |
73 | ␉␉ dlg.dialog.atr, dlg.border.atr);␊ |
74 | ␉wattrset(dialog, dlg.border.atr);␊ |
75 | ␉mvwaddch(dialog, height - 3, 0, ACS_LTEE);␊ |
76 | ␉for (i = 0; i < width - 2; i++)␊ |
77 | ␉␉waddch(dialog, ACS_HLINE);␊ |
78 | ␉wattrset(dialog, dlg.dialog.atr);␊ |
79 | ␉waddch(dialog, ACS_RTEE);␊ |
80 | ␊ |
81 | ␉print_title(dialog, title, width);␊ |
82 | ␊ |
83 | ␉wattrset(dialog, dlg.dialog.atr);␊ |
84 | ␉print_autowrap(dialog, prompt, width - 2, 1, 3);␊ |
85 | ␊ |
86 | ␉/* Draw the input field box */␊ |
87 | ␉box_width = width - 6;␊ |
88 | ␉getyx(dialog, y, x);␊ |
89 | ␉box_y = y + 2;␊ |
90 | ␉box_x = (width - box_width) / 2;␊ |
91 | ␉draw_box(dialog, y + 1, box_x - 1, 3, box_width + 2,␊ |
92 | ␉␉ dlg.dialog.atr, dlg.border.atr);␊ |
93 | ␊ |
94 | ␉print_buttons(dialog, height, width, 0);␊ |
95 | ␊ |
96 | ␉/* Set up the initial value */␊ |
97 | ␉wmove(dialog, box_y, box_x);␊ |
98 | ␉wattrset(dialog, dlg.inputbox.atr);␊ |
99 | ␊ |
100 | ␉input_x = strlen(instr);␊ |
101 | ␊ |
102 | ␉if (input_x >= box_width) {␊ |
103 | ␉␉scroll = input_x - box_width + 1;␊ |
104 | ␉␉input_x = box_width - 1;␊ |
105 | ␉␉for (i = 0; i < box_width - 1; i++)␊ |
106 | ␉␉␉waddch(dialog, instr[scroll + i]);␊ |
107 | ␉} else {␊ |
108 | ␉␉waddstr(dialog, instr);␊ |
109 | ␉}␊ |
110 | ␊ |
111 | ␉wmove(dialog, box_y, box_x + input_x);␊ |
112 | ␊ |
113 | ␉wrefresh(dialog);␊ |
114 | ␊ |
115 | ␉while (key != KEY_ESC) {␊ |
116 | ␉␉key = wgetch(dialog);␊ |
117 | ␊ |
118 | ␉␉if (button == -1) {␉/* Input box selected */␊ |
119 | ␉␉␉switch (key) {␊ |
120 | ␉␉␉case TAB:␊ |
121 | ␉␉␉case KEY_UP:␊ |
122 | ␉␉␉case KEY_DOWN:␊ |
123 | ␉␉␉␉break;␊ |
124 | ␉␉␉case KEY_LEFT:␊ |
125 | ␉␉␉␉continue;␊ |
126 | ␉␉␉case KEY_RIGHT:␊ |
127 | ␉␉␉␉continue;␊ |
128 | ␉␉␉case KEY_BACKSPACE:␊ |
129 | ␉␉␉case 127:␊ |
130 | ␉␉␉␉if (input_x || scroll) {␊ |
131 | ␉␉␉␉␉wattrset(dialog, dlg.inputbox.atr);␊ |
132 | ␉␉␉␉␉if (!input_x) {␊ |
133 | ␉␉␉␉␉␉scroll = scroll < box_width - 1 ? 0 : scroll - (box_width - 1);␊ |
134 | ␉␉␉␉␉␉wmove(dialog, box_y, box_x);␊ |
135 | ␉␉␉␉␉␉for (i = 0; i < box_width; i++)␊ |
136 | ␉␉␉␉␉␉␉waddch(dialog,␊ |
137 | ␉␉␉␉␉␉␉ instr[scroll + input_x + i] ?␊ |
138 | ␉␉␉␉␉␉␉ instr[scroll + input_x + i] : ' ');␊ |
139 | ␉␉␉␉␉␉input_x = strlen(instr) - scroll;␊ |
140 | ␉␉␉␉␉} else␊ |
141 | ␉␉␉␉␉␉input_x--;␊ |
142 | ␉␉␉␉␉instr[scroll + input_x] = '\0';␊ |
143 | ␉␉␉␉␉mvwaddch(dialog, box_y, input_x + box_x, ' ');␊ |
144 | ␉␉␉␉␉wmove(dialog, box_y, input_x + box_x);␊ |
145 | ␉␉␉␉␉wrefresh(dialog);␊ |
146 | ␉␉␉␉}␊ |
147 | ␉␉␉␉continue;␊ |
148 | ␉␉␉default:␊ |
149 | ␉␉␉␉if (key < 0x100 && isprint(key)) {␊ |
150 | ␉␉␉␉␉if (scroll + input_x < MAX_LEN) {␊ |
151 | ␉␉␉␉␉␉wattrset(dialog, dlg.inputbox.atr);␊ |
152 | ␉␉␉␉␉␉instr[scroll + input_x] = key;␊ |
153 | ␉␉␉␉␉␉instr[scroll + input_x + 1] = '\0';␊ |
154 | ␉␉␉␉␉␉if (input_x == box_width - 1) {␊ |
155 | ␉␉␉␉␉␉␉scroll++;␊ |
156 | ␉␉␉␉␉␉␉wmove(dialog, box_y, box_x);␊ |
157 | ␉␉␉␉␉␉␉for (i = 0; i < box_width - 1; i++)␊ |
158 | ␉␉␉␉␉␉␉␉waddch(dialog, instr [scroll + i]);␊ |
159 | ␉␉␉␉␉␉} else {␊ |
160 | ␉␉␉␉␉␉␉wmove(dialog, box_y, input_x++ + box_x);␊ |
161 | ␉␉␉␉␉␉␉waddch(dialog, key);␊ |
162 | ␉␉␉␉␉␉}␊ |
163 | ␉␉␉␉␉␉wrefresh(dialog);␊ |
164 | ␉␉␉␉␉} else␊ |
165 | ␉␉␉␉␉␉flash();␉/* Alarm user about overflow */␊ |
166 | ␉␉␉␉␉continue;␊ |
167 | ␉␉␉␉}␊ |
168 | ␉␉␉}␊ |
169 | ␉␉}␊ |
170 | ␉␉switch (key) {␊ |
171 | ␉␉case 'O':␊ |
172 | ␉␉case 'o':␊ |
173 | ␉␉␉delwin(dialog);␊ |
174 | ␉␉␉return 0;␊ |
175 | ␉␉case 'H':␊ |
176 | ␉␉case 'h':␊ |
177 | ␉␉␉delwin(dialog);␊ |
178 | ␉␉␉return 1;␊ |
179 | ␉␉case KEY_UP:␊ |
180 | ␉␉case KEY_LEFT:␊ |
181 | ␉␉␉switch (button) {␊ |
182 | ␉␉␉case -1:␊ |
183 | ␉␉␉␉button = 1;␉/* Indicates "Help" button is selected */␊ |
184 | ␉␉␉␉print_buttons(dialog, height, width, 1);␊ |
185 | ␉␉␉␉break;␊ |
186 | ␉␉␉case 0:␊ |
187 | ␉␉␉␉button = -1;␉/* Indicates input box is selected */␊ |
188 | ␉␉␉␉print_buttons(dialog, height, width, 0);␊ |
189 | ␉␉␉␉wmove(dialog, box_y, box_x + input_x);␊ |
190 | ␉␉␉␉wrefresh(dialog);␊ |
191 | ␉␉␉␉break;␊ |
192 | ␉␉␉case 1:␊ |
193 | ␉␉␉␉button = 0;␉/* Indicates "OK" button is selected */␊ |
194 | ␉␉␉␉print_buttons(dialog, height, width, 0);␊ |
195 | ␉␉␉␉break;␊ |
196 | ␉␉␉}␊ |
197 | ␉␉␉break;␊ |
198 | ␉␉case TAB:␊ |
199 | ␉␉case KEY_DOWN:␊ |
200 | ␉␉case KEY_RIGHT:␊ |
201 | ␉␉␉switch (button) {␊ |
202 | ␉␉␉case -1:␊ |
203 | ␉␉␉␉button = 0;␉/* Indicates "OK" button is selected */␊ |
204 | ␉␉␉␉print_buttons(dialog, height, width, 0);␊ |
205 | ␉␉␉␉break;␊ |
206 | ␉␉␉case 0:␊ |
207 | ␉␉␉␉button = 1;␉/* Indicates "Help" button is selected */␊ |
208 | ␉␉␉␉print_buttons(dialog, height, width, 1);␊ |
209 | ␉␉␉␉break;␊ |
210 | ␉␉␉case 1:␊ |
211 | ␉␉␉␉button = -1;␉/* Indicates input box is selected */␊ |
212 | ␉␉␉␉print_buttons(dialog, height, width, 0);␊ |
213 | ␉␉␉␉wmove(dialog, box_y, box_x + input_x);␊ |
214 | ␉␉␉␉wrefresh(dialog);␊ |
215 | ␉␉␉␉break;␊ |
216 | ␉␉␉}␊ |
217 | ␉␉␉break;␊ |
218 | ␉␉case ' ':␊ |
219 | ␉␉case '\n':␊ |
220 | ␉␉␉delwin(dialog);␊ |
221 | ␉␉␉return (button == -1 ? 0 : button);␊ |
222 | ␉␉case 'X':␊ |
223 | ␉␉case 'x':␊ |
224 | ␉␉␉key = KEY_ESC;␊ |
225 | ␉␉␉break;␊ |
226 | ␉␉case KEY_ESC:␊ |
227 | ␉␉␉key = on_key_esc(dialog);␊ |
228 | ␉␉␉break;␊ |
229 | ␉␉case KEY_RESIZE:␊ |
230 | ␉␉␉delwin(dialog);␊ |
231 | ␉␉␉on_key_resize();␊ |
232 | ␉␉␉goto do_resize;␊ |
233 | ␉␉}␊ |
234 | ␉}␊ |
235 | ␊ |
236 | ␉delwin(dialog);␊ |
237 | ␉return KEY_ESC;␉␉/* ESC pressed */␊ |
238 | }␊ |
239 |