|
|
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.