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