|
|
1.1 root 1: /*
2: * Display a box with buttons and edit the buttons
3: *
4: * Copyright (c) 1990-93 Udo Munk
5: */
6:
7: #ifdef AIX
8: #define NLS
9: #endif
10:
11: #include <curses.h>
12: #include <string.h>
13: #include "winfun.h"
14:
15: extern WINDOW *open_window();
16: extern int close_window();
17:
18: button_box(bp)
19: struct bbox *bp;
20: {
21: register int i, j, k;
22: int grp = 0, but = 0;
23: int bh, bw;
24: int eoj = 1;
25: int *p;
26: int ret;
27: WINDOW *w;
28:
29: bh = bp->b_anz * 3 + 3; /* compute high of box */
30: bw = strlen(bp->b_text) + 2;/* compute width of box */
31: for (i = 0; i < bp->b_anz; i++) {
32: j = strlen(bp->b_ptr[i]->g_text) + 2;
33: if (j > bw)
34: bw = j;
35: for (j = 0, k = 0; j < bp->b_ptr[i]->g_anz; j++)
36: k += strlen(bp->b_ptr[i]->g_ptr[j]->b_text) + 6;
37: if (k > bw)
38: bw = k;
39: }
40:
41: if ((w = open_window(bh, bw, (LINES-bh)/2, (COLS-bw)/2)) == (WINDOW *) 0)
42: nomem();
43:
44: wattron(w, A_REVERSE); /* output inverted box */
45: for (i = 0; i < bh; i++)
46: for (j = 0; j < bw; j++)
47: mvwaddch(w, i, j, ' ');
48: mvwaddstr(w, 1, 1, bp->b_text);
49: for (i = 0; i < bp->b_anz; i++) {
50: mvwaddstr(w, i*3+3, 1, bp->b_ptr[i]->g_text);
51: wmove(w, i*3+4, 1);
52: for (j = 0; j < bp->b_ptr[i]->g_anz; j++) {
53: wprintw(w, "%s ", bp->b_ptr[i]->g_ptr[j]->b_text);
54: wprintw(w, "[%c] ", (bp->b_ptr[i]->g_ptr[j]->b_val) ? 'x' : ' ');
55: }
56: }
57: wrefresh(w);
58: cursoron();
59:
60: while (eoj) { /* now edit the buttons */
61: for (i = 0, j = 0; i <= but; i++)
62: j += strlen(bp->b_ptr[grp]->g_ptr[i]->b_text) + 6;
63: wmove(w, grp*3+4, j-3);
64: wrefresh(w);
65: switch (k = wgetch(w)) {
66: case '\r': /* ready, leave function */
67: case KEY_ENTER:
68: ret = WIN_OK;
69: eoj = 0;
70: break;
71: case 033: /* ESC, function aborted */
72: ret = WIN_ABORT;
73: eoj = 0;
74: break;
75: case ' ': /* switch current button on/off */
76: p = &(bp->b_ptr[grp]->g_ptr[but]->b_val);
77: if (*p == 0) {
78: *p = 1;
79: waddch(w, 'x');
80: } else {
81: *p = 0;
82: waddch(w, ' ');
83: }
84: break;
85: case KEY_RIGHT: /* go to next button right */
86: but++;
87: if (but >= bp->b_ptr[grp]->g_anz)
88: but = 0;
89: break;
90: case KEY_LEFT: /* go to next button left */
91: but--;
92: if (but < 0)
93: but = bp->b_ptr[grp]->g_anz - 1;
94: break;
95: case KEY_DOWN: /* go to next button down */
96: grp++;
97: if (grp >= bp->b_anz)
98: grp = 0;
99: break;
100: case KEY_UP: /* go to next button up */
101: grp--;
102: if (grp < 0)
103: grp = bp->b_anz - 1;
104: break;
105: }
106: }
107: close_window(w);
108: cursoroff();
109: return(ret);
110: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.