'
' Demo shamelessly ripped from the NCURSES PROGRAMMING HOWTO:
'   http://tldp.org/HOWTO/NCURSES-Programming-HOWTO
'
' Ported to BaCon in June 2010 - PvE (GPLv3)
'
'------------------------------------------------------------------

INCLUDE "curses.bac"

CONST WIDTH = 30
CONST HEIGHT = 10 

DECLARE startx, starty, n_choices TYPE int
DECLARE choices$[] = { "Choice 1", "Choice 2", "Choice 3", "Choice 4", "Exit" } TYPE STRING

n_choices = 5

highlight = 1
choice = 0

initscr()
clear()
noecho()
' Line buffering disabled. pass on everything
cbreak()

startx = (80 - WIDTH) / 2
starty = (24 - HEIGHT) / 2
                
menu_win = newwin(HEIGHT, WIDTH, starty, startx)
keypad(menu_win, TRUE)
mvprintw(0, 0, "Use arrow keys to go up and down, Press enter to select a choice")
refresh()
CALL print_menu(menu_win, highlight)

WHILE TRUE

    c = wgetch(menu_win)

    SELECT c
        
        CASE KEY_UP
            IF highlight EQ 1 THEN highlight = n_choices
            ELSE DECR highlight

        CASE KEY_DOWN
            IF highlight EQ n_choices THEN highlight = 1
            ELSE INCR highlight

        CASE 10
            choice = highlight

        DEFAULT
            mvprintw(24, 0, "Charcter pressed is = %3d Hopefully it can be printed as '%c'", c, c)
            refresh()

    END SELECT
    CALL print_menu(menu_win, highlight)

    ' User did a choice come out of the infinite loop
    IF choice NE 0 THEN BREAK

WEND

clrtoeol()
refresh()
endwin()

PRINT "You chose choice ", choice, " with choice string '", choices$[choice - 1], "'."
END

SUB print_menu(NUMBER menu_win, int highlight)

    LOCAL x, y, i TYPE int

    x = 2
    y = 2
    box(menu_win, 0, 0)

    FOR i = 0 TO n_choices - 1

        ' High light the present choice
        IF highlight EQ i + 1 THEN
            wattron(menu_win, A_REVERSE)
            mvwprintw(menu_win, y, x, "%s", choices$[i])
            wattroff(menu_win, A_REVERSE)
        ELSE
            mvwprintw(menu_win, y, x, "%s", choices$[i])
        END IF
        INCR y
    NEXT

    wrefresh(menu_win)

END SUB