|
|
1.1 root 1: /*
2: * inputbox.c -- implements the input box
3: *
4: * ORIGINAL AUTHOR: Savio Lam ([email protected])
5: * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap ([email protected])
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.