|
|
1.1 root 1: /*
2: * Output an pulldown menu and select one option
3: *
4: * Copyright (c) 1990-93 by Udo Munk
5: */
6:
7: #ifdef AIX
8: #define NLS
9: #endif
10:
11: #include <curses.h>
12: #include <ctype.h>
13: #include <string.h>
14: #include "winfun.h"
15:
16: extern WINDOW *open_window();
17: extern int close_window();
18:
19: static int inp;
20:
21: pulldown_menu(b, y, x, attr, color)
22: struct menu *b;
23: int x, y;
24: chtype attr, color;
25: {
26: register char *p;
27: register int i, j;
28: int bh, bw, ni, ai, eoj, search;
29: register struct menu *m;
30: WINDOW *w;
31:
32: i = bh = bw = 0;
33: m = b;
34: while (m->m_text != NULL) {
35: if (strlen(m->m_text) > bw)
36: bw = strlen(m->m_text);
37: i++;
38: m++;
39: }
40: bw += 4;
41: bh = i + 3;
42: ni = i - 1;
43: if ((w = open_window(bh, bw, y, x)) == (WINDOW *) 0)
44: nomem();
45: cursoroff();
46: leaveok(w, TRUE);
47: wattron(w, color);
48: mvwaddch(w, 0, 0, ul_corner);
49: for (i = 0; i < bw-2; i++)
50: waddch(w, h_line);
51: waddch(w, ur_corner);
52: mvwaddch(w, 1, 0, v_line);
53: waddch(w, ' ');
54: waddstr(w, b->m_text);
55: i = strlen(b->m_text);
56: while (i < bw - 2) {
57: waddch(w, ' ');
58: i++;
59: }
60: mvwaddch(w, 1, bw-1, v_line);
61: mvwaddch(w, 2, 0, l_tee);
62: for (i = 0; i < bw-2; i++)
63: waddch(w, h_line);
64: waddch(w, r_tee);
65: for (i = 0; i < ni; i++) {
66: mvwaddch(w, i+3, 0, v_line);
67: mvwaddch(w, i+3, bw-1, v_line);
68: }
69: mvwaddch(w, i+3, 0, ll_corner);
70: for (j = 0; j < bw-2; j++)
71: waddch(w, h_line);
72: waddch(w, lr_corner);
73: ai = 1;
74: menu_options(w, bw-3, b, ni, ai, attr, color);
75: eoj = 1;
76: while (eoj) {
77: if (inp == -1)
78: inp = wgetch(w);
79: switch (inp) {
80: case KEY_DOWN:
81: ai++;
82: if (ai > ni)
83: ai = 1;
84: menu_options(w, bw-3, b, ni, ai, attr, color);
85: break;
86: case KEY_UP:
87: ai--;
88: if (ai < 1)
89: ai = ni;
90: menu_options(w, bw-3, b, ni, ai, attr, color);
91: break;
92: case KEY_LEFT:
93: ai = WIN_PREVMEN;
94: eoj = 0;
95: break;
96: case KEY_RIGHT:
97: ai = WIN_NEXTMEN;
98: eoj = 0;
99: break;
100: case '\r':
101: case KEY_ENTER:
102: eoj = 0;
103: break;
104: case 033: /* ESC, abort menu */
105: case ' ':
106: ai = WIN_ABORT;
107: eoj = 0;
108: break;
109: case W_KEY_REFR:
110: #ifdef KEY_REFR
111: case KEY_REFR:
112: #endif
113: wrefresh(curscr);
114: inp = -1;
115: break;
116: default:
117: if (!((inp >= '0' && inp <= '9') ||
118: (inp >= 'A' && inp <= 'Z') ||
119: (inp >= 'a' && inp <= 'z'))) {
120: inp = -1;
121: break;
122: }
123: m = b + 1;
124: search = 0;
125: j = 1;
126: while (m->m_text) {
127: p = m->m_text;
128: if (toupper(inp&0177) == toupper(*(p + m->m_opt - 1))) {
129: search = j;
130: break;
131: }
132: m++;
133: j++;
134: }
135: if (search) {
136: ai = search;
137: eoj = 0;
138: } else
139: inp = -1;
140: break;
141: }
142: }
143: close_window(w);
144: return(ai);
145: }
146:
147: /*
148: * output options of pulldown menu
149: */
150: static menu_options(w, l, s, n, a, attr, color)
151: WINDOW *w;
152: struct menu *s;
153: int l, n, a;
154: chtype attr, color;
155: {
156: register int i, j;
157: register char *p;
158: register chtype mark = (color == A_NORMAL) ? A_REVERSE : A_NORMAL;
159: register chtype mark1 = (color == A_NORMAL) ? ((attr == A_NORMAL) ? A_REVERSE : attr) : ((attr == A_NORMAL) ? A_NORMAL : A_REVERSE | attr);
160:
161: s++;
162: for (i = 1; i <= n; i++, s++) {
163: wmove(w, i+2, 1);
164: if (i == a)
165: wattrset(w, mark);
166: else
167: wattrset(w, color);
168: waddch(w, ' ');
169: j = 1;
170: p = s->m_text;
171: while (*p) {
172: if (j == s->m_opt) {
173: if (i == a)
174: wattrset(w, attr);
175: else
176: wattrset(w, mark1);
177: waddch(w, *p++);
178: if (i == a)
179: wattrset(w, mark);
180: else
181: wattrset(w, color);
182: waddstr(w, p);
183: break;
184: } else {
185: waddch(w, *p++);
186: j++;
187: }
188: }
189: j = strlen(s->m_text);
190: while (j < l) {
191: waddch(w, ' ');
192: j++;
193: }
194: }
195: nodelay(w, TRUE);
196: inp = wgetch(w);
197: nodelay(w, FALSE);
198: if (inp == -1)
199: wrefresh(w);
200: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.