03965aaf43f02ee50243465bd0b6b97baac20659
[ncurses.git] / test / demo_forms.c
1 /*
2  * $Id: demo_forms.c,v 1.3 2003/05/03 22:08:20 tom Exp $
3  *
4  * Demonstrate a variety of functions from the form library.
5  * Thomas Dickey - 2003/4/26
6  */
7 /*
8 TYPE_ALNUM                      -
9 TYPE_ENUM                       -
10 TYPE_INTEGER                    -
11 TYPE_IPV4                       -
12 TYPE_NUMERIC                    -
13 TYPE_REGEXP                     -
14 data_ahead                      -
15 data_behind                     -
16 dup_field                       -
17 dynamic_field_info              -
18 field_arg                       -
19 field_back                      -
20 field_count                     -
21 field_fore                      -
22 field_init                      -
23 field_just                      -
24 field_opts_on                   -
25 field_pad                       -
26 field_status                    -
27 field_term                      -
28 field_type                      -
29 form_init                       -
30 form_opts                       -
31 form_opts_off                   -
32 form_opts_on                    -
33 form_page                       -
34 form_request_by_name            -
35 form_term                       -
36 form_userptr                    -
37 free_fieldtype                  -
38 link_field                      -
39 link_fieldtype                  -
40 move_field                      -
41 new_page                        -
42 pos_form_cursor                 -
43 set_current_field               -
44 set_field_fore                  -
45 set_field_init                  -
46 set_field_pad                   -
47 set_field_status                -
48 set_field_term                  -
49 set_fieldtype_arg               -
50 set_fieldtype_choice            -
51 set_form_fields                 -
52 set_form_init                   -
53 set_form_opts                   -
54 set_form_page                   -
55 set_form_term                   -
56 set_form_userptr                -
57 set_max_field                   -
58 */
59
60 #include <test.priv.h>
61
62 #if USE_LIBFORM
63
64 #include <edit_field.h>
65
66 static FIELD *
67 make_label(int frow, int fcol, NCURSES_CONST char *label)
68 {
69     FIELD *f = new_field(1, strlen(label), frow, fcol, 0, 0);
70
71     if (f) {
72         set_field_buffer(f, 0, label);
73         set_field_opts(f, field_opts(f) & ~O_ACTIVE);
74     }
75     return (f);
76 }
77
78 /*
79  * Define each field with an extra one, for reflecting "actual" text.
80  */
81 static FIELD *
82 make_field(int frow, int fcol, int rows, int cols)
83 {
84     FIELD *f = new_field(rows, cols, frow, fcol, 0, 1);
85
86     if (f) {
87         set_field_back(f, A_UNDERLINE);
88         set_field_userptr(f, (void *) 0);
89     }
90     return (f);
91 }
92
93 static void
94 display_form(FORM * f)
95 {
96     WINDOW *w;
97     int rows, cols;
98
99     scale_form(f, &rows, &cols);
100
101     /*
102      * Put the form at the upper-left corner of the display, with just a box
103      * around it.
104      */
105     if ((w = newwin(rows + 2, cols + 4, 0, 0)) != (WINDOW *) 0) {
106         set_form_win(f, w);
107         set_form_sub(f, derwin(w, rows, cols, 1, 2));
108         box(w, 0, 0);
109         keypad(w, TRUE);
110     }
111
112     if (post_form(f) != E_OK)
113         wrefresh(w);
114 }
115
116 static void
117 erase_form(FORM * f)
118 {
119     WINDOW *w = form_win(f);
120     WINDOW *s = form_sub(f);
121
122     unpost_form(f);
123     werase(w);
124     wrefresh(w);
125     delwin(s);
126     delwin(w);
127 }
128
129 static int
130 my_form_driver(FORM * form, int c)
131 {
132     switch (c) {
133     case EDIT_FIELD('q'):
134         if (form_driver(form, REQ_VALIDATION) == E_OK)
135             return (TRUE);
136         break;
137     case EDIT_FIELD('h'):
138         help_edit_field();
139         break;
140     default:
141         beep();
142         break;
143     }
144     return (FALSE);
145 }
146
147 static void
148 show_current_field(WINDOW *win, FORM * form)
149 {
150     FIELD *field;
151     FIELDTYPE *type;
152     char *buffer;
153     int nbuf;
154
155     if (has_colors()) {
156         wbkgd(win, COLOR_PAIR(1));
157     }
158     werase(win);
159     wprintw(win, "Cursor: %d,%d\n", form->currow, form->curcol);
160     if ((field = current_field(form)) != 0) {
161         wprintw(win, "Field %d:", field_index(field));
162         if ((type = field_type(field)) != 0) {
163             if (type == TYPE_ALNUM)
164                 waddstr(win, "ALNUM");
165             else if (type == TYPE_ALPHA)
166                 waddstr(win, "ALPHA");
167             else if (type == TYPE_ENUM)
168                 waddstr(win, "ENUM");
169             else if (type == TYPE_INTEGER)
170                 waddstr(win, "INTEGER");
171             else if (type == TYPE_NUMERIC)
172                 waddstr(win, "NUMERIC");
173             else if (type == TYPE_REGEXP)
174                 waddstr(win, "REGEXP");
175             else
176                 waddstr(win, "other");
177         }
178         waddstr(win, "\n");
179         for (nbuf = 0; nbuf <= 2; ++nbuf) {
180             if ((buffer = field_buffer(field, nbuf)) != 0) {
181                 wprintw(win, "buffer %d:", nbuf);
182                 wattrset(win, A_REVERSE);
183                 waddstr(win, buffer);
184                 wattroff(win, A_REVERSE);
185                 waddstr(win, "\n");
186             }
187         }
188     }
189     wrefresh(win);
190 }
191
192 static void
193 demo_forms(void)
194 {
195     WINDOW *w;
196     FORM *form;
197     FIELD *f[100];
198     int finished = 0, c;
199     unsigned n = 0;
200     int pg;
201     WINDOW *also;
202
203     help_edit_field();
204
205     mvaddstr(4, 57, "Forms Entry Test");
206
207     refresh();
208
209     /* describe the form */
210     for (pg = 0; pg < 3; ++pg) {
211         char label[80];
212         sprintf(label, "Sample Form Page %d", pg + 1);
213         f[n++] = make_label(0, 15, label);
214         set_new_page(f[n - 1], TRUE);
215
216         f[n++] = make_label(2, 0, "Last Name");
217         f[n++] = make_field(3, 0, 1, 18);
218         set_field_type(f[n - 1], TYPE_ALPHA, 1);
219
220         f[n++] = make_label(2, 20, "First Name");
221         f[n++] = make_field(3, 20, 1, 12);
222         set_field_type(f[n - 1], TYPE_ALPHA, 1);
223
224         f[n++] = make_label(2, 34, "Middle Name");
225         f[n++] = make_field(3, 34, 1, 12);
226         set_field_type(f[n - 1], TYPE_ALPHA, 1);
227
228         f[n++] = make_label(5, 0, "Comments");
229         f[n++] = make_field(6, 0, 4, 46);
230     }
231
232     f[n++] = (FIELD *) 0;
233
234     form = new_form(f);
235
236     display_form(form);
237
238     w = form_win(form);
239     also = newwin(getmaxy(stdscr) - getmaxy(w), COLS, getmaxy(w), 0);
240     show_current_field(also, form);
241
242     while (!finished) {
243         switch (edit_field(form, &c)) {
244         case E_OK:
245             break;
246         case E_UNKNOWN_COMMAND:
247             finished = my_form_driver(form, c);
248             break;
249         default:
250             beep();
251             break;
252         }
253         show_current_field(also, form);
254     }
255
256     erase_form(form);
257
258     free_form(form);
259     for (c = 0; f[c] != 0; c++)
260         free_field(f[c]);
261     noraw();
262     nl();
263 }
264
265 int
266 main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED)
267 {
268     initscr();
269     cbreak();
270     noecho();
271     raw();
272     nonl();                     /* lets us read ^M's */
273     intrflush(stdscr, FALSE);
274     keypad(stdscr, TRUE);
275
276     if (has_colors()) {
277         start_color();
278         init_pair(1, COLOR_WHITE, COLOR_BLUE);
279         bkgd(COLOR_PAIR(1));
280         refresh();
281     }
282
283     demo_forms();
284
285     endwin();
286     return EXIT_SUCCESS;
287 }
288 #else
289 int
290 main(void)
291 {
292     printf("This program requires the curses form library\n");
293     ExitProgram(EXIT_FAILURE);
294 }
295 #endif