|
|
1.1 ! root 1: /* ! 2: * Output a select box 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 <string.h> ! 13: #include "winfun.h" ! 14: ! 15: extern WINDOW *open_window(); ! 16: extern int close_window(); ! 17: ! 18: select_box(b, opt, attr) ! 19: char *b[]; ! 20: int opt; ! 21: chtype attr; ! 22: { ! 23: register int i, j; ! 24: int bw, bh, nt, ni, ai, itoff, ilen, eoj; ! 25: WINDOW *w; ! 26: ! 27: i = bw = bh = 0; ! 28: ai = opt; ! 29: while (b[i] != NULL) ! 30: if ((j = strlen(b[i++]) + 2) > bw) ! 31: bw = j; /* width of the box */ ! 32: bh = i + 4; /* high of the box */ ! 33: nt = i; /* number of options */ ! 34: itoff = ++i; ! 35: ilen = 0; ! 36: while (b[i] != NULL) { ! 37: ilen += strlen(b[i]) + 3; ! 38: i++; ! 39: } ! 40: ilen--; ! 41: ni = i - itoff; ! 42: if (ilen > (bw - 2)) ! 43: bw = ilen + 2; ! 44: if ((w = open_window(bh, bw, (LINES-bh)/2, (COLS-bw)/2)) == (WINDOW *) 0) ! 45: nomem(); ! 46: cursoroff(); ! 47: leaveok(w, TRUE); ! 48: wattron(w, A_REVERSE); ! 49: for (i = 0; i < bh; i++)/* output the inverted box */ ! 50: for (j = 0; j < bw; j++) ! 51: mvwaddch(w, i, j, ' '); ! 52: for (i = 0; i < nt; i++) ! 53: mvwaddstr(w, i+1, 1, b[i]); ! 54: wattroff(w, A_REVERSE); ! 55: dialog_options(w, nt+2, (bw-ilen)/2, b, itoff, ai, attr); ! 56: eoj = 1; ! 57: while (eoj) { ! 58: switch (wgetch(w)) { ! 59: case ' ': ! 60: case W_KEY_TAB: ! 61: case KEY_RIGHT: ! 62: ai++; ! 63: if (ai > ni) ! 64: ai = 1; ! 65: dialog_options(w, nt+2, (bw-ilen)/2, b, itoff, ai, attr); ! 66: break; ! 67: case W_KEY_BTAB: ! 68: case KEY_LEFT: ! 69: ai--; ! 70: if (ai < 1) ! 71: ai = ni; ! 72: dialog_options(w, nt+2, (bw-ilen)/2, b, itoff, ai, attr); ! 73: break; ! 74: case '\r': ! 75: case KEY_ENTER: ! 76: eoj = 0; ! 77: break; ! 78: case W_KEY_REFR: ! 79: #ifdef KEY_REFR ! 80: case KEY_REFR: ! 81: #endif ! 82: wrefresh(curscr); ! 83: break; ! 84: default: ! 85: break; ! 86: } ! 87: } ! 88: close_window(w); ! 89: return(ai); ! 90: } ! 91: ! 92: /* ! 93: * output options in to the box ! 94: */ ! 95: static dialog_options(w, y, x, s, o, a, attr) ! 96: WINDOW *w; ! 97: char *s[]; ! 98: int y, x, o, a; ! 99: chtype attr; ! 100: { ! 101: register int j; ! 102: ! 103: j = 1; ! 104: wmove(w, y, x); ! 105: while (s[o] != NULL) { ! 106: waddch(w, ' '); ! 107: if (j == a) { ! 108: wattron(w, attr); ! 109: waddstr(w, s[o++]); ! 110: wattroff(w, attr); ! 111: } else ! 112: waddstr(w, s[o++]); ! 113: waddch(w, ' '); ! 114: wattron(w, A_REVERSE); ! 115: waddch(w, ' '); ! 116: wattroff(w, A_REVERSE); ! 117: j++; ! 118: } ! 119: wrefresh(w); ! 120: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.