home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload / ShartewareOverload.cdr / windows / baswind8.zip / BARMENU.SUB next >
Text File  |  1990-09-14  |  20KB  |  608 lines

  1. '
  2. '
  3. '******************************************************************************
  4. '                    Function : BARMENU                                       *
  5. '                                                                             *
  6. ' Purpose:                                                                    *
  7. '                                                                             *
  8. '                                                                             *
  9. ' Results:                                                                    *
  10. '                                                                             *
  11. ' Usage  :                                                                    *
  12. '                                                                             *
  13. '                                                                             *
  14. ' Date Written : 09/01/90 - Date Tested: 09/01/90 - Author: James P Morgan    *
  15. ' Date Modified:          -            :          -       :                   *
  16. '-----------------------------------------------------------------------------*
  17. ' NOTE:                                                                       *
  18. '******************************************************************************
  19. '                                                                             *
  20. '     SUB PROGRAM NAME          (PARAMETERS)                 STATIC/RECURSIVE *
  21. '-----------------------------------------------------------------------------*
  22. '                                                                             *
  23. SUB    BARMENU(MENULINE$,MENUFG%,MENUBG%,BLKSIZE%,BLKNUM%,MAXSIZE%(1),MAXITEMS%(1),ITEMS$(2),MENUSLCT%,ITEMSLCT%,RETURN.CODE%) STATIC
  24.  
  25.        DEFINT A-Z                               'make all short intergers by default
  26.  
  27. REM    $DYNAMIC
  28.        DIM SCR(2000)
  29.        DIM BAR.SCR(256)                         'storage for bar menu line
  30. REM    $STATIC
  31.  
  32.        RETURN.CODE%=0
  33.        MAKEWIND.RETURN.CODE=0
  34.        RESTWIND.RETURN.CODE=0
  35.        SAVEWIND.RETURN.CODE=0
  36.        VIDEO.RETURN.CODE=0
  37.  
  38.        ITEMS.MIN=LBOUND(ITEMS$,1)               'make the code independant of callers BASE OPTION
  39.        ITEMS.MAX=UBOUND(ITEMS$,1)
  40.  
  41. '
  42. ' need to add code to insure ALL arrays use same UBOUND
  43. '
  44.  
  45.        MENU.BASE=1-ITEMS.MIN
  46.  
  47.        MENU.MAXITEMS%=0
  48.  
  49.        MENU=1                                   'start with first menu
  50.        OLD.MENU=MENU
  51.  
  52.        MSELECT=1
  53.        OLD=1
  54.  
  55.        MENUROW=2                                'bar menu goes on this line
  56.        MENUCOL=2
  57.  
  58.        MENU.TOP.ROW=0                           'co-ordinates for pop-down menu, off bar
  59.        MENU.TOP.LEFT.COL=0
  60.        MENU.BOTTOM.ROW=0
  61.        MENU.BOTTOM.RIGHT.COL=0
  62.  
  63.        TEMP.ITEM$=STRING$(255," ")
  64.  
  65. '
  66.        BUTTONS%=0                               'assume no mouse support avail
  67.  
  68.        CALL MMCHECK(BUTTONS%)                   'see if mouse support avail
  69.  
  70.        GOSUB BARMENU.MMCURSORON
  71.  
  72.        MOUSECOL=0                               'locate the mouse cursor in upper
  73.        MOUSEROW=0                               'left top corner of screen
  74.  
  75.        CALL MMSETLOC(MOUSECOL,MOUSEROW)
  76.  
  77.        FIRST.TIME=-1
  78.  
  79.        GOSUB BARMENU.MMCURSOROFF
  80.  
  81.        PRESATTR=SCREEN(MENUROW,MENUCOL,1)       'get present attribute of menu bar
  82.  
  83.        ATTR=(MENUBG% AND 7)*16+MENUFG%          'turn on menu bar
  84.  
  85.        CALL FASTPRT(MENULINE$,MENUROW,MENUCOL,ATTR,VIDEO.RETURN.CODE)
  86.  
  87.        GOSUB BARMENU.BOX                        'display the barmenu box for the first barmenu selection
  88.  
  89.        GOTO BARMENU.LOOPX
  90.  
  91. '
  92. BARMENU.LOOP:
  93.        GOSUB BARMENU.PROCESS                    'turnoff Position of Selection Marker
  94. BARMENU.LOOPX:
  95.        GOSUB BARMENU.TON                        'turn on position of Selection Marker
  96.        GOSUB BARMENU.PRESS                      'Get KeyPress
  97.  
  98.        IF KP$=CHR$(13) THEN                     'if ENTER pressed , a selection was made
  99.            GOTO BARMENU.DONE                    'so we are thru
  100.        END IF
  101.  
  102.        IF KP$=CHR$(27) THEN                     'was ESC pressed?
  103.          GOTO BARMENU.DONE2
  104.        END IF
  105.  
  106.        GOTO BARMENU.LOOP
  107.  
  108. '
  109. 'Check for KeyPress and sound error if not UP ARROW, DOWN ARROW, LEFT ARROW, RIGHT ARROW, or RETURN
  110. '
  111. BARMENU.PRESS:
  112.        GOSUB BARMENU.MMCURSORON
  113.  
  114.        CALL MMCLICK(LFT%,RGT%)                  'flush any mouse clicks
  115.  
  116.        GOSUB BARMENU.GET.PRESS                  'generalized routine for kybd and mouse
  117.  
  118.        IF KP$="" THEN                           'anything to do?
  119.            GOTO BARMENU.PRESS                   'NO
  120.        END IF
  121.  
  122.        IF LEN(KP$)=2 THEN                       'an Extended function key pressed?
  123.            GOTO BARMENU.DOWN
  124.        END IF
  125.  
  126.        IF KP$=CHR$(13) THEN                     'ENTER pressed, a menu item was selected?
  127.           RETURN
  128.        END IF
  129.  
  130.        IF KP$=CHR$(27) THEN                     'was ESC pressed?
  131.             MENUSLCT%=0                         'cancel ALL selections!
  132.             ITEMSLCT%=0
  133.           RETURN
  134.        END IF
  135.  
  136.        GOSUB BARMENU.FIND.OPTION                'was the first char of an selection pressed?
  137.  
  138.        IF MSELECT<>SAVE.MSELECT THEN            'was a new selection was this letter found?
  139.           RETURN
  140.        END IF
  141.  
  142.        GOSUB BARMENU.SOUNDOFF
  143.        GOTO BARMENU.PRESS
  144.  
  145. '
  146. 'Process DOWN ARROW KeyPress
  147. '
  148. BARMENU.DOWN:
  149.        IF ASC(RIGHT$(KP$,1))<>80 THEN           'was cursor down pressed?
  150.            GOTO BARMENU.UP
  151.        END IF
  152.  
  153.        MSELECT=MSELECT+1                        'select the next item in the menu
  154.  
  155.        IF ITEMS$(MENU-MENU.BASE,MSELECT-MSLECT.BASE)=STRING$(MAXSIZE%(MENU-MENU.BASE),196) THEN
  156.            MSELECT=MSELECT+1
  157.        END IF
  158.  
  159. '
  160. ' are we past the end of the pop-down menu items?
  161. '
  162.        IF MSELECT > MENU.MAXITEMS% THEN
  163.             MSELECT=1                            'start back with the first pop-down menu item
  164.        END IF
  165.  
  166.        RETURN
  167.  
  168. '
  169. 'Process UP ARROW KeyPress
  170. BARMENU.UP:
  171.        IF ASC(RIGHT$(KP$,1))<>72 THEN           'was cursor up pressed?
  172.            GOTO BARMENU.OTHER
  173.        END IF
  174.  
  175.        MSELECT=MSELECT-1                        'select the previous item in the menu list
  176.  
  177. '
  178. 'did we go past the start of the pop-down menu items
  179. '
  180.        IF ITEMS$(MENU-MENU.BASE,MSELECT-MENU.BASE)=STRING$(MAXSIZE%(MENU-MENU.BASE),196) THEN
  181.            MSELECT=MSELECT-1
  182.        END IF
  183.  
  184.        IF MSELECT < 1 THEN
  185.            MSELECT=MENU.MAXITEMS%                 'select the last item in the pop-down list
  186.        END IF
  187.  
  188.        RETURN
  189.  
  190. '
  191. 'Process RIGHT ARROW KeyPress
  192. BARMENU.OTHER:                                  'was cursor right pressed?
  193.        IF ASC(RIGHT$(KP$,1))=77 THEN
  194.             MENU=MENU+1                         'select the next bar menu item
  195.           IF MENU > BLKNUM% THEN                'did we go past the end of the bar menu items
  196.                MENU = 1                         'Yes, loop back around to the first bar menu item
  197.                GOSUB BARMENU.NEWMENU
  198.             RETURN
  199.           ELSE
  200.                GOSUB BARMENU.NEWMENU
  201.             RETURN
  202.           END IF
  203.       END IF
  204.  
  205. '
  206. 'Process LEFT ARROW KeyPress
  207.  
  208.        IF ASC(RIGHT$(KP$,1))=75 THEN           'was cursor left pressed?
  209.               MENU=MENU-1                      'select the previous bar menu item
  210.            IF MENU < 1 THEN                    'did we go past the start of the bar menu items
  211.                MENU = BLKNUM%                  'yes, loop around to the last bar menu item
  212.                GOSUB BARMENU.NEWMENU
  213.              RETURN
  214.            ELSE
  215.                GOSUB BARMENU.NEWMENU
  216.              RETURN
  217.            END IF
  218.        END IF
  219.  
  220.        GOSUB BARMENU.SOUNDOFF                   'NOt a valid extended function key!
  221.        GOTO BARMENU.PRESS
  222.  
  223. '
  224. 'turn off present selection
  225. BARMENU.PROCESS:
  226.        IF OLD=0 THEN                            'anything selected yet?
  227.            RETURN
  228.        END IF
  229.  
  230.        GOSUB BARMENU.MMCURSOROFF
  231.  
  232. '      MENU.ITEM$=ITEMS$((MENU-MENU.BASE)+ITEMS.MIN,(OLD-OLD.BASE)+ITEMS.MIN)
  233. '      IF LEN(MENU.ITEM$)< LENGTH.MENU.ITEM THEN_
  234. '           MENU.ITEM$=MENU.ITEM$+STRING$(LENGTH.MENU.ITEM-LEN(MENU.ITEM$)," ")
  235.  
  236.        ROW=((MENU.TOP.ROW-1)+OLD)                'this is where this pop-down menu item is located
  237.        COL=MENU.TOP.LEFT.COL
  238.  
  239.        ATTR=(MENUBG% AND 7)*16+MENUFG%           'turn off highlighting for this menu item
  240.  
  241.        CALL FASTPRT(MENU.ITEM$,ROW,COL,ATTR,VIDEO.RETURN.CODE)
  242.  
  243.        RETURN
  244.  
  245. '
  246. 'Turn on new selection
  247. BARMENU.TON:
  248.        IF MSELECT=0 THEN                        'anything selected yet?
  249.            GOTO BARMENU.TON.NEWOLD
  250.        END IF
  251.  
  252.        GOSUB BARMENU.MMCURSOROFF
  253.  
  254.        MENU.ITEM$=ITEMS$(MENU-MENU.BASE,MSELECT-MENU.BASE)
  255.  
  256.        IF LEN(MENU.ITEM$)< LENGTH.MENU.ITEM THEN
  257.             MENU.ITEM$=MENU.ITEM$+STRING$(LENGTH.MENU.ITEM-LEN(MENU.ITEM$)," ")
  258.        END IF
  259.  
  260.        ROW=((MENU.TOP.ROW-1)+MSELECT)           'this is where the menu item is located
  261.        COL=MENU.TOP.LEFT.COL
  262.  
  263.        ATTR=(MENUFG% AND 7)*16+MENUBG%          'highlight this popdown menu item
  264.  
  265.        CALL FASTPRT(MENU.ITEM$,ROW,COL,ATTR,VIDEO.RETURN.CODE)
  266. '      IF FIRST.TIME THEN
  267.            IF MSELECT<>OLD THEN                     'did the selection change (cursor up or down)
  268.                MOUSEROW=(ROW-1)*8                   'if so, put the mouse cursor on the new selection
  269.                MOUSECOL=(COL-1)*8
  270.                CALL MMSETLOC(MOUSECOL,MOUSEROW)
  271.                FIRST.TIME=0
  272.            END IF
  273. '      END IF
  274.  
  275. BARMENU.TON.NEWOLD:
  276.        OLD=MSELECT                              'make the current selection the "OLD" one now
  277.        RETURN
  278.  
  279. '
  280. '
  281. BARMENU.NEWMENU:
  282.        MSELECT=0                                'reinitialize selections for a new menu
  283.        OLD=0
  284.  
  285.        OLD.MENU=MENU                            'this is the current bar menu item
  286.  
  287.        GOSUB BARMENU.MMCURSOROFF
  288.  
  289.        WINSEG=0
  290.        WINOFF=0
  291.        WINSEG=VARSEG(SCR(0))
  292.        WINOFF=VARPTR(SCR(0))
  293.  
  294.        CALL RESTWIND(WINDOW.TOP.ROW,WINDOW.TOP.LEFT.COL,WINDOW.BOT.ROW,WINDOW.BOT.RIGHT.COL,WINSEG,WINOFF,RESTWIND.RETURN.CODE)
  295.  
  296.        WINSEG=0
  297.        WINOFF=0
  298.        WINSEG=VARSEG(BAR.SCR(0))
  299.        WINOFF=VARPTR(BAR.SCR(0))
  300.        CALL RESTWIND(2,1,2,80,WINSEG,WINOFF,RESTWIND.RETURN.CODE)    'restore the bar menu line
  301.  
  302. '
  303. BARMENU.BOX:
  304. '
  305. 'Calculate the maximum items to be displayed in this pop-down window
  306. '
  307.        MENU.MAXITEMS%=MAXITEMS%(MENU-MENU.BASE)
  308.  
  309. '
  310. 'calculate the pop-down menu windows upper left row/column co-ordinates
  311. '
  312.        MENU.TOP.ROW=MENUROW+2
  313.        MENU.TOP.LEFT.COL=((MENU-1)*BLKSIZE%)+MENUCOL+1
  314.  
  315. '
  316. 'calculate the pop-down menu windows lower right row/column co-ordinates
  317. '
  318.        MENU.BOTTOM.ROW=(MENU.TOP.ROW+MENU.MAXITEMS%)-1
  319.  
  320.        LENGTH.MENU.ITEM=0
  321.        MENU.BOTTOM.RIGHT.COL=0
  322.  
  323. 'find the longest menu item in this menu
  324.        FOR K=ITEMS.MIN TO ITEMS.MIN+MENU.MAXITEMS%
  325.            MENU.ITEM$=ITEMS$(MENU-MENU.BASE,K)
  326.  
  327.            IF LEN(MENU.ITEM$)>MENU.BOTTOM.RIGHT.COL THEN
  328.               MENU.BOTTOM.RIGHT.COL=LEN(MENU.ITEM$)
  329.            END IF
  330.  
  331.        NEXT
  332.  
  333.        LENGTH.MENU.ITEM=MENU.BOTTOM.RIGHT.COL   'this is the size of the longest menu item
  334.  
  335.        MENU.BOTTOM.RIGHT.COL=MENU.TOP.LEFT.COL+(MENU.BOTTOM.RIGHT.COL-1)                          'SO, the box for this menu will be at least this big
  336.  
  337. 'save the area that this menu window will occupy
  338.  
  339.        WINDOW.TOP.ROW=MENU.TOP.ROW-1             'adjust row and cols to allow for window frame
  340.        WINDOW.BOT.ROW=MENU.BOTTOM.ROW+1
  341.        WINDOW.TOP.LEFT.COL=MENU.TOP.LEFT.COL-1
  342.        WINDOW.BOT.RIGHT.COL=MENU.BOTTOM.RIGHT.COL+1
  343.  
  344.        WINSEG=0
  345.        WINOFF=0
  346.        WINSEG=VARSEG(BAR.SCR(0))
  347.        WINOFF=VARPTR(BAR.SCR(0))
  348.  
  349.        CALL SAVEWIND(2,1,2,80,WINSEG,WINOFF,SAVEWIND.RETURN.CODE)
  350.  
  351.        WINSEG=0
  352.        WINOFF=0
  353.        WINSEG=VARSEG(SCR(0))
  354.        WINOFF=VARPTR(SCR(0))
  355.        CALL SAVEWIND(WINDOW.TOP.ROW,WINDOW.TOP.LEFT.COL,WINDOW.BOT.ROW,WINDOW.BOT.RIGHT.COL,WINSEG,WINOFF,SAVEWIND.RETURN.CODE)
  356.  
  357.        ROW=MENUROW                              'REVERSE ATTRIBUTE FOR MENU LINE BLOCK
  358.        COL=((MENU-1)*BLKSIZE%)+MENUCOL
  359.        BEGWORD=COL
  360.        REVWORD$=""
  361.  
  362. '
  363. BARMENU.LOOPWRD2:
  364.        WHILE LEN(REVWORD$)<BLKSIZE%
  365.              REVWORD$=REVWORD$+CHR$(SCREEN(MENUROW,BEGWORD,0))
  366.              BEGWORD=BEGWORD+1
  367.        WEND
  368.  
  369.        COL=COL
  370.  
  371.        ATTR=(MENUFG% * 16)+MENUBG%
  372.  
  373.        CALL FASTPRT(REVWORD$,ROW,COL,ATTR,VIDEO.RETURN.CODE)
  374.  
  375. '
  376. 'Locate mouse cursor in the middle of currently high-lighted bar menu item
  377. '
  378.        MOUSEROW=(ROW-1)*8
  379.        MOUSECOL=(BLKSIZE%\2)+COL-(MENUCOL-1)
  380.        MOUSECOL=(MOUSECOL-1)*8
  381.  
  382.        CALL MMSETLOC(MOUSECOL,MOUSEROW)
  383.  
  384. 'display pop-down menu for the currently
  385.  
  386.        FRAME=4
  387.        GROW=0
  388.        SHADOW=0
  389.        LABEL$=""
  390.  
  391.        CALL MAKEWIND(MENU.TOP.ROW,MENU.TOP.LEFT.COL,MENU.BOTTOM.ROW,MENU.BOTTOM.RIGHT.COL,FRAME,MENUFG%,MENUBG%,GROW,SHADOW,LABEL$,MAKEWIND.RETURN.CODE)
  392.  
  393. 'Place Menu Items in Window
  394.        FOR J=1 TO MENU.MAXITEMS%
  395.            MENU.ITEM$=ITEMS$(MENU-MENU.BASE,J-MENU.BASE)
  396. '
  397. ' Make all the menus items the same length
  398. '
  399.            IF LEN(MENU.ITEM$)< LENGTH.MENU.ITEM THEN
  400.               MENU.ITEM$=MENU.ITEM$+STRING$(LENGTH.MENU.ITEM-LEN(MENU.ITEM$)," ")
  401.            END IF
  402.  
  403.            ROW=(MENU.TOP.ROW-1)+J
  404.            ATTR=(MENUBG% AND 7)*16+MENUFG%
  405.  
  406.            CALL FASTPRT(MENU.ITEM$,ROW,MENU.TOP.LEFT.COL,ATTR,VIDEO.RETURN.CODE)
  407.        NEXT
  408.  
  409.        GOSUB BARMENU.MMCURSORON
  410.  
  411.        MSELECT=1                                'indicate that first pop-down menu item is current one
  412.        OLD=1
  413.        RETURN
  414.  
  415. '
  416. '
  417. BARMENU.FIND.OPTION:
  418.         SAVE.MSELECT=MSELECT                    'save the currently selected menu item
  419.         TEMP.MSELECT=MSELECT
  420.         FIRST.CHAR$=KP$                         'this is the character we want to match on
  421.         COUNT=0                                 'keep count of number of items matched against
  422. BARMENU.FIND.LOOP:
  423.         TEMP.MSELECT=TEMP.MSELECT+1             'look at the next menu item
  424.  
  425.         IF TEMP.MSELECT>MENU.MAXITEMS% THEN     'did we go past the end of the menu
  426.             TEMP.MSELECT=1                      'yes, loop back to the first item
  427.         END IF
  428.  
  429.         COUNT=COUNT+1                           'we have matched against this many items so far
  430.         IF COUNT>MENU.MAXITEMS% THEN            'have we looked at all the menu items
  431.             RETURN                              'yes, and a match was not found
  432.         END IF
  433.  
  434.         MID$(TEMP.ITEM$,1)=ITEMS$(MENU-MENU.BASE,TEMP.MSELECT-MENU.BASE)
  435.         LEN.TEMP.ITEM=LEN(ITEMS$(MENU-MENU.BASE,TEMP.MSELECT-MENU.BASE))
  436.  
  437. '
  438. 'Check this menu item to see if its first character matches
  439. '
  440. 'Scan over any leading spaces in the menu item
  441. '
  442.        FOR I=1 TO LEN.TEMP.ITEM
  443.        IF MID$(TEMP.ITEM$,I,1)<>" " THEN
  444.           IF MID$(TEMP.ITEM$,I,1)=FIRST.CHAR$ THEN
  445.                MSELECT=TEMP.MSELECT              'a match was found!
  446.              RETURN
  447.           ELSE
  448.              GOTO BARMENU.FIND.LOOP
  449.           END IF
  450.        END IF
  451.  
  452.        NEXT
  453.  
  454.        GOTO BARMENU.FIND.LOOP                    'no match found, keep looking
  455.  
  456. '
  457. '
  458. BARMENU.GET.PRESS:
  459.        IF BUTTONS%=0 THEN                        'is a mouse installed?
  460.           GOTO BARMENU.GET.INKEY                 'NO, so only check keyboard
  461.        END IF
  462.  
  463.        CALL MMGETLOC(MOUSECOL,MOUSEROW)          'get the current mouse screen cursor location
  464.  
  465.        MOUSECOL=(MOUSECOL\8)+1                   'convert to 80x25 co-ordinates
  466.        MOUSEROW=(MOUSEROW\8)+1
  467.  
  468.        IF MOUSEROW<>MENUROW THEN                 'is mouse on the menu line
  469.           GOTO BARMENU.CHECK.IF.INBOX            'no, is it in a menu box
  470.        END IF
  471.  
  472.        CALL MMCLICK(LFT%,RGT%)                   'flush the mouse clicks
  473.  
  474.        TEMP.MENU=((MOUSECOL-MENUCOL)\BLKSIZE%)+1 'where is the mouse cursor on the menu line
  475.        IF TEMP.MENU>BLKNUM% THEN                 'is it past the end of the bar menu items
  476.            GOTO BARMENU.GET.INKEY                'yes
  477.        END IF
  478.  
  479.        MENU=TEMP.MENU                            '
  480.        IF MENU<>OLD.MENU THEN                    'are we on the same bar menu item as before
  481.            GOSUB BARMENU.NEWMENU                 'NO, make the drop-down menu for this new bar menu item
  482.            GOSUB BARMENU.TON                     'turn on position of Selection Marker
  483.        END IF
  484.  
  485.        GOTO BARMENU.GET.INKEY
  486.  
  487. '
  488. BARMENU.CHECK.IF.INBOX:
  489. '
  490. 'Is mouse cursor outside the top or bottom of the drop-down menu window frame
  491. '
  492.        IF (MOUSEROW<MENU.TOP.ROW) OR (MOUSEROW>MENU.BOTTOM.ROW) THEN
  493.           GOTO BARMENU.NOT.IN.BOX
  494.        END IF
  495.  
  496. '
  497. 'Is the mouse cursor within  the left or right of drop-down menu window frame
  498. '
  499.        IF (MOUSECOL>=MENU.TOP.LEFT.COL) AND (MOUSECOL<=MENU.BOTTOM.RIGHT.COL) THEN
  500.           GOTO BARMENU.FOUNDIT
  501.        END IF
  502.  
  503. BARMENU.NOT.IN.BOX:
  504.        CALL MMCLICK(LFT%,RGT%)                  'see if user clicked outside the menu box
  505.        CLICK=LFT%+RGT%
  506.        IF CLICK THEN                            'any button clicked
  507.            KP$=CHR$(27)                         'Yes, simulate an ESC key press
  508.           RETURN
  509.        END IF
  510.  
  511.        GOSUB BARMENU.MMCURSORON
  512.        GOTO BARMENU.GET.INKEY
  513.  
  514. '
  515. BARMENU.FOUNDIT:
  516.        MSELECT=(MOUSEROW-MENU.TOP.ROW)+1         'mouse cursor is on this menu item
  517.  
  518.        IF MSELECT<>OLD THEN                      'are we on the same as before
  519.             GOSUB BARMENU.PROCESS                'NO, turnoff Position of Selection Marker
  520.             GOSUB BARMENU.TON                    'turn on position of Selection Marker
  521.             GOSUB BARMENU.MMCURSOROFF
  522.             CALL MMCLICK(LFT%,RGT%)              'flush any mouse clicks
  523.          GOTO BARMENU.GET.INKEY
  524.        END IF
  525.  
  526.        GOSUB BARMENU.MMCURSOROFF
  527.  
  528.        CALL MMCLICK(LFT%,RGT%)                    'did user click on the same menu item
  529.        CLICK=LFT%+RGT%
  530.        IF CLICK THEN                              'any mouse buttons pressed?
  531.            KP$=CHR$(13)                           'YES, simulate an ENTER keypress
  532.           RETURN
  533.        END IF
  534.  
  535. BARMENU.GET.INKEY:
  536.        KP$=INKEY$                               'was a keyboard key pressed
  537.  
  538.        IF LEN(KP$)=0 THEN                       'NO, keep looking for key or mouse click
  539.           GOTO BARMENU.GET.PRESS
  540.        END IF
  541.  
  542.        RETURN
  543.  
  544. '
  545. BARMENU.MMCURSORON:
  546.        IF BUTTONS%=0 THEN                       'is a mouse installed
  547.            RETURN                               'No
  548.        END IF
  549.  
  550.        IF MOUSE.CURSOR=0 THEN                   'if the mouse is off
  551.           CALL MMCURSORON                       'turn it on
  552.           MOUSE.CURSOR=-1
  553.        END IF
  554.  
  555.        RETURN
  556.  
  557. BARMENU.MMCURSOROFF:
  558.        IF BUTTONS%=0 THEN                       'is a mouse installed
  559.            RETURN                               'no
  560.        END IF
  561.  
  562.        IF MOUSE.CURSOR=-1 THEN                  'is mouse cursor on
  563.           CALL MMCURSOROFF                      'turn it off
  564.           MOUSE.CURSOR=0
  565.        END IF
  566.  
  567.        RETURN
  568. '
  569. '
  570. BARMENU.SOUNDOFF:
  571.        SOUND 1000,1
  572.        SOUND 1500,2
  573.        SOUND 500,1
  574.        RETURN
  575.  
  576. '
  577. BARMENU.DONE:
  578.        MENUSLCT%=MENU                            'this is the bar menu and drop-down item slected
  579.        ITEMSLCT%=MSELECT
  580.  
  581. 'turn off menu bar
  582. BARMENU.DONE2:
  583.        GOSUB BARMENU.MMCURSOROFF
  584.  
  585.        WINSEG=0
  586.        WINOFF=0
  587.        WINSEG=VARSEG(SCR(0))
  588.        WINOFF=VARPTR(SCR(0))
  589.  
  590.        CALL RESTWIND(WINDOW.TOP.ROW,WINDOW.TOP.LEFT.COL,WINDOW.BOT.ROW,WINDOW.BOT.RIGHT.COL,WINSEG,WINOFF,RESTWIND.RETURN.CODE)
  591.  
  592.        WINSEG=0
  593.        WINOFF=0
  594.        WINSEG=VARSEG(BAR.SCR(0))
  595.        WINOFF=VARPTR(BAR.SCR(0))
  596.        CALL RESTWIND(2,1,2,80,WINSEG,WINOFF,RESTWIND.RETURN.CODE)
  597.  
  598.        ATTR=PRESATTR
  599.        CALL FASTPRT(MENULINE$,MENUROW,MENUCOL,ATTR,VIDEO.RETURN.CODE)
  600.  
  601.        ERASE SCR                                 'erase the DYNAMIC arrays
  602.        ERASE BAR.SCR
  603.  
  604.        TEMP.ITEM$=""
  605.        MENU.ITEM$=""
  606.        REVWORD$=""
  607. END SUB
  608.