diff options
Diffstat (limited to 'systems/msdos/tx/src/txmenu.c')
-rw-r--r-- | systems/msdos/tx/src/txmenu.c | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/systems/msdos/tx/src/txmenu.c b/systems/msdos/tx/src/txmenu.c new file mode 100644 index 0000000000..58828bef3f --- /dev/null +++ b/systems/msdos/tx/src/txmenu.c @@ -0,0 +1,130 @@ +#include "tx.h" +#include <ctype.h> +extern int ExpandNames(char *, char *, int) ; +extern void DrawFrame(int,int,int,int,int) ; + + +int PrintTextMenu(int MenuNum) +{ + int row, col , width = 0, height, i ; + int bottom, left = 0; + int previous=0, current = 0 ; + char *TextInWindow, *TextInLine, *ExpMenu , **mp ; + char *Entry[MAX_ENTRIES] ; + + ExpMenu = malloc(NumEntries[MenuNum]*MAX_WIDTH); + mp = menu[MenuNum] ; /* Position pointers */ + Entry[0] = ExpMenu ; + + for ( i = 0 ; ( i < NumEntries[MenuNum] ) && + ( ( !i ) || ( (Entry[i] = Entry[i-1] + (left + 1) ) != NULL) ) ; + i++ ) { + ExpandNames(Entry[i],*mp,MAX_WIDTH); + width = ( ( ( left = strlen(Entry[i]) ) > width ) ? left : width ) ; + mp += 2 ; /* "left" is used here as dummy variable */ + } + + width += 4 ; /* 2 frame lines plus 2 spaces plus text width */ + height = 2 + NumEntries[MenuNum] ; /* 2 frame lines */ + left = ( RIGHT + 1 ) - width ; + bottom = ( TOP - 1 ) + height ; + if ( left < 1 || bottom > 25 ) { + fprintf(stderr,MSG_SCRBOUNDS,Progname); + exit(1) ; /* In case you changed menu settings but were not */ + } /* careful with bounds */ + row = wherey() ; col = wherex() ; /* Save cursor position */ + _setcursortype(_NOCURSOR) ; /* Hide cursor */ + TextInWindow = malloc(width * height * 2+1); + TextInLine = malloc(161) ; + gettext(left,TOP,RIGHT,bottom,TextInWindow); + gettext(1,25,80,25,TextInLine); + + while ( previous != -1 ) { + previous = 0 ; + window(left,TOP,RIGHT,bottom) ; + clrscr() ; /* Clear text in window area */ + window(1,1,80,25) ; /* But work in absolute coordinates */ + + DrawFrame(left,TOP,RIGHT,bottom,1) ; /* Draw window frame */ + + /* Print menu choices */ + + for ( i = 0 ; i < NumEntries[MenuNum] ; i++ ) { + gotoxy(left+2,TOP+1+i) ; + cputs(Entry[i]) ; + } + + gotoxy(1,25) ; + clreol() ; + cputs(MSG_CHOICE) ; + + while ( previous >= 0 ) { + while (1) { /* Highlight currently selected entry */ + textattr(color[(previous == current)]) ; + gotoxy(left+2,TOP+1+previous) ; + cputs(Entry[previous]) ; + i = ( width - 4 ) - strlen(Entry[previous]) ; + while ( i-- ) + putch(' ') ; + if ( previous == current ) + break ; + previous = current ; + } + textattr(color[0]) ; + i = getch(); /* Read character from keyboard */ + if ( i == 0 ) { /* If extended character */ + i = getch() ; /* Get character */ + i *= -1 ; /* Make it different from regular ascii */ + } + switch ( i ) { + case UPKEY : + case LEFTKEY : + if ( current ) + --current ; /* Move up one position */ + break ; + case DOWNKEY : + case RIGHTKEY : + if ( current < (NumEntries[MenuNum]-1) ) + ++current ; /* Move down one position */ + break ; + case HOMEKEY : + case PGUPKEY : + current = 0 ; /* Go to first entry */ + break ; + case ENDKEY : + case PGDNKEY : + current = NumEntries[MenuNum]-1 ; /* Go to last entry */ + break ; + case CR : + previous = -1 ; /* Choose current entry */ + break ; + case SPACE : + previous = -2 ; /* Momentarily restore original screen */ + break ; + default : + if ( (!isdigit(i)) || + ( (current = i - '0') >= NumEntries[MenuNum] ) ) + current = -1 ; /* default */ + previous = -1 ; /* A valid digit selects that entry */ + break ; + } + } + /* Restore Screen */ + puttext(left,TOP,RIGHT,bottom,TextInWindow) ; + puttext(1,25,80,25,TextInLine) ; + if ( previous == -2 ) + getch() ; /* wait for a keypress if ESC was pressed */ + + } + + free(ExpMenu) ; /* free memory */ + free(TextInWindow) ; + free(TextInLine) ; + + /* Restore settings */ + + _setcursortype(_NORMALCURSOR) ; /* show cursor */ + gotoxy(col,row) ; /* restore cursor position */ + + return current ; +} |