home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload / ShartewareOverload.cdr / windows / baswind8.zip / TAGLIST.SUB < prev    next >
Text File  |  1990-09-14  |  33KB  |  943 lines

  1. '
  2. '
  3. '******************************************************************************
  4. '                    Function : TAGLIST                                       *
  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    TAGLIST(HEADER$,SHOWITEMS%,MAXITEMS%,NUMTAGGED%,ITEM$(1),TAGITEMS%(1),FORE%,BACK%,HFORE%,HBACK%,QUADRANT$,SHADOW%,RETURN.CODE%) STATIC
  24.  
  25.        DEFINT A-Z                               'make all short intergers by default
  26.  
  27.        RETURN.CODE%=0
  28.        MAKEWIND.RETURN.CODE=0
  29.        SETQUAD.RETURN.CODE=0
  30.        VIDEO.RETURN.CODE=0
  31.  
  32.        ITEM.MIN=LBOUND(ITEM$)                   'adjust for callers OPTION BASE
  33.        ITEM.MAX=UBOUND(ITEM$)                   'save array upper limits
  34.  
  35.        SELECT.BASE=1-ITEM.MIN                   'normalize to a base of 1
  36.  
  37. '
  38. ' insure array to hold tag flag dimensioned same as array being tagged
  39. '
  40.        IF (LBOUND(TAGITEMS%)<>ITEM.MIN) OR (UBOUND(TAGITEMS%)<>ITEM.MAX) THEN
  41.             NUMTAGGED%=-1                       'nothing noted as being selected
  42.          GOTO TAGLIST.DONE                      'were are thru
  43.        END IF
  44.  
  45. '
  46. ' add code to check that MAXITEMS dosnt go outside array bounds (+ or -)
  47. '
  48.        IF SHOWITEMS% > MAXITEMS% THEN           'we cant show more than whats avail
  49.            SHOWITEMS%=MAXITEMS%
  50.        END IF
  51.  
  52.        TEMP.ITEM$=STRING$(255," ")
  53.  
  54.        BEGVAL=1
  55.  
  56.        MENU.TOP.ROW=0
  57.        MENU.TOP.LEFT.COL=0
  58.        MENU.BOTTOM.ROW=0
  59.        MENU.BOTTOM.RIGHT.COL=0
  60.  
  61.        BUTTONS%=0                               'assume no mouse support avail
  62.  
  63.        CALL MMCHECK(BUTTONS%)                   'see if mouse support avail
  64.  
  65.        GOSUB TAGLIST.MMCURSORON
  66.  
  67. '
  68.  
  69.        MOUSECOL=0                               'locate the mouse cursor in upper
  70.        MOUSEROW=0                               'left top corner of screen
  71.  
  72.        CALL MMSETLOC(MOUSECOL,MOUSEROW)         'move the mouse cursor
  73.  
  74.        FIRST.TIME=-1
  75.  
  76.        GOSUB TAGLIST.MMCURSOROFF
  77.  
  78.  
  79.        MAX.NUMTAGGED.ALLOWED=MAXITEMS%          'assume we can tag all the items
  80.  
  81.        IF NUMTAGGED%>0 THEN                     'can we tag all the items?
  82.           MAX.NUMTAGGED.ALLOWED=NUMTAGGED%      'no, only this many can be tagged
  83.           NUMTAGGED%=0
  84.        END IF
  85.  
  86.        WINDLEN=LEN(HEADER$)                     'assume window length is header length
  87.  
  88. 'Determine width of window from length of items
  89.        FOR J=ITEM.MIN TO ITEM.MIN+MAXITEMS%
  90.            ASCIIZ=INSTR(ITEM$(J),CHR$(0))       'allow for an imbedded null x'00'
  91.            LEN.ITEM=ASCIIZ-1                    'char in a string
  92.            IF LEN.ITEM<1 THEN
  93.                LEN.ITEM=LEN(ITEM$(J))
  94.            END IF
  95.  
  96.            IF LEN.ITEM > WINDLEN THEN
  97.                 WINDLEN=LEN.ITEM
  98.            END IF
  99.  
  100.        NEXT
  101.  
  102. 'If Quadrant is in ROW:COL format, extract Row and Column
  103.  
  104.        IF INSTR(QUADRANT$,":")<>0 THEN          'was an absolute row:column specified
  105.              GOSUB TAGLIST.GETORD
  106.           GOTO TAGLIST.GO1
  107.        END IF
  108.  
  109. 'Determine Position based on Quadrant Parameter and size of menu
  110.  
  111.        QUADRANT=VAL(QUADRANT$)                  'The window is to be in 1 of the 5 quadrants
  112.  
  113.        IF QUADRANT <0 OR QUADRANT >4 THEN       'make sure the quadrant is valid
  114.            QUADRANT=0                           'if invalid, default to center of screen
  115.        END IF
  116.  
  117.        CALL SETQUAD(QUADRANT,CROW,CCOL,WINDLEN,SHOWITEMS%,SETQUAD.RETURN.CODE)
  118.  
  119.        ULR%=CROW-((SHOWITEMS%+2)/2-.5)           'the upper left row:column window co-ordinates
  120.        ULC%=CCOL-((WINDLEN/2)-.5)
  121.        LRR%=ULR%+SHOWITEMS%+1                     'the lower right window co-ordinates
  122.        LRC%=ULC%+WINDLEN-1
  123.  
  124. '
  125. 'Create Window for List
  126. TAGLIST.GO1:
  127.        MENU.TOP.ROW=ULR%+2                       'allow for the menu name box above the window
  128.        MENU.TOP.LEFT.COL=ULC%
  129.        MENU.BOTTOM.ROW=LRR%
  130.        MENU.BOTTOM.RIGHT.COL=LRC%
  131.  
  132.        FRAME%=4
  133.  
  134.        CALL MAKEWIND(ULR%,ULC%,LRR%,LRC%,FRAME,FORE%,BACK%,GROW,SHADOW%,LABEL$,MAKEWIND.RETURN.CODE)
  135.  
  136.        TEMPHDR$=SPACE$(WINDLEN)                 'make menu header as big as biggest item
  137.  
  138.        IF LEN(HEADER$)<>WINDLEN THEN            'does the menu header need centering?
  139.             GOSUB TAGLIST.PUTHDR                'YES
  140.        END IF
  141.  
  142.        ATTR=(HBACK% AND 7)*16+HFORE%            'display the menu header
  143.        ROW=ULR%
  144.        COL=ULC%
  145.        CALL FASTPRT(HEADER$,ROW,COL,ATTR,VIDEO.RETURN.CODE)
  146.  
  147.        ATTR=(BACK% AND 7)*16+FORE%              'bracket the menu header in the window
  148.        ROW=ULR%+1
  149.        COL=ULC%
  150.        DAT$=STRING$(WINDLEN,205)
  151.        CALL FASTPRT(DAT$,ROW,COL,ATTR,VIDEO.RETURN.CODE)
  152.  
  153. 'Set current choice to List Item #1, Set Beginning and Ending values,
  154. 'Display 'More...' message and enter Loop
  155.  
  156.        NUMTAGGED%=0                             'startoff assuming no items tagged
  157.  
  158.        SELECT.%=1                               'display the first group of items
  159.        OLD=SELECT.%
  160.  
  161.        BEGVAL=1                                 'starting with the first item
  162.        ENDVAL=SHOWITEMS%                        'and ending with the max we can display at once
  163.  
  164.        GOSUB TAGLIST.FILL
  165.  
  166.        FIRST.TIME=0
  167.  
  168. '
  169. TAGLIST.LOOP:
  170.        GOSUB TAGLIST.PRESS                          'Get KeyPress
  171.  
  172.        IF KP$=CHR$(13) OR KP$=CHR$(27) THEN         'was Enter or ESC key pressed?
  173.            GOTO TAGLIST.DONE                        'yes, were are thru
  174.        END IF
  175.  
  176.        GOTO TAGLIST.LOOP                            'keep waiting for user to press a key
  177.  
  178. '
  179. 'Check for KeyPress and sound error if not UP ARROW, DOWN ARROW, HOME, END, PAGE UP, PAGE DOWN, or RETURN
  180. TAGLIST.PRESS:
  181.        CLICK=-1                                     'flush any mouse clicks
  182.        DO WHILE CLICK
  183.           LFT%=0
  184.           RGT%=0
  185.           CALL MMCLICK(LFT%,RGT%)
  186.           CLICK=LFT%+RGT%
  187.        LOOP
  188.  
  189.        GOSUB TAGLIST.GET.PRESS
  190.  
  191.        IF KP$="" THEN                                'wait for a key or mouse click
  192.            GOTO TAGLIST.PRESS
  193.        END IF
  194.  
  195. '
  196. ' Was a INS or DEL key pressed
  197. '
  198.        IF LEN(KP$)=2 THEN                            'was an extended function key pressed?
  199.           IF MID$(KP$,2,1)=CHR$(82) OR MID$(KP$,2,1)=CHR$(83) THEN
  200.              GOTO TAGLIST.PRESS.ON
  201.           ELSE
  202.              GOTO TAGLIST.DOWN                       'see if cursor down pressed
  203.           END IF
  204.        END IF
  205.  
  206. '
  207. TAGLIST.PRESS.ON:
  208.        IF KP$=CHR$(13) THEN                          'Enter key pressed?
  209.            RETURN
  210.        END IF
  211.  
  212.        IF KP$=CHR$(27) THEN                          'ESC key pressed
  213.            NUMTAGGED%=-1                             'nothing noted as being selected
  214.          RETURN
  215.        END IF
  216.  
  217.        SELECT.SUB=(SELECT.%-SELECT.BASE)
  218.  
  219.        IF LEN(KP$)<>2 THEN                           'was an extened function key pressed?
  220.            GOTO TAGLIST.PRESS.CONT                   'no
  221.        END IF
  222.  
  223.        KP$=RIGHT$(KP$,1)                             'get the function key code pressed
  224.  
  225. '
  226. ' Check if INS key pressed and we are allowed to tag anymore items
  227. '
  228.        IF ((KP$=CHR$(82)) AND (TAGITEMS%(SELECT.SUB)=0)) THEN
  229.           IF NUMTAGGED+1<=MAX.NUMTAGGED.ALLOWED THEN
  230.                  TAGITEMS%(SELECT.SUB)=1             'tag this item
  231.                  NUMTAGGED%=NUMTAGGED%+1             'we have 1 more item tagged
  232.                  GOSUB TAGLIST.FILL                  'turn on the tag flag for this displayed item
  233.               GOTO TAGLIST.PRESS
  234.           ELSE
  235.               GOTO TAGLIST.PRESS.SOUNDOFF            'let user know this one already tagged
  236.           END IF
  237.        END IF
  238.  
  239. '
  240. ' Check if DEL key pressed and if this item is tagged
  241. '
  242.        IF ((KP$=CHR$(83)) AND (TAGITEMS%(SELECT.SUB)=1)) THEN
  243.              TAGITEMS%(SELECT.SUB)=0                 'untagg this item
  244.              NUMTAGGED%=NUMTAGGED%-1                 'we now have 1 less items tagged
  245.              GOSUB TAGLIST.FILL                      'turn off the tag flag on the displayed item
  246.           GOTO TAGLIST.PRESS
  247.        END IF
  248.  
  249.        GOTO TAGLIST.PRESS.SOUNDOFF                    'an error/problem,so let user know
  250.  
  251. TAGLIST.PRESS.CONT:
  252.        GOSUB TAGLIST.FIND.OPTION                      'find the first char of an item that matches key pressed
  253.  
  254.        IF SELECT.%<>SAVE.SELECT THEN                  'was a new item found?
  255.            RETURN                                     'YES
  256.        END IF
  257.  
  258. TAGLIST.PRESS.SOUNDOFF:
  259.        GOSUB TAGLIST.SOUNDOFF                         'NO, a new item not found!
  260.        GOTO TAGLIST.PRESS
  261.  
  262. '
  263. 'Process DOWN ARROW KeyPress
  264. TAGLIST.DOWN:
  265.        IF ASC(RIGHT$(KP$,1))=80 THEN                 'was cursor down key pressed?
  266.            SELECT.%=SELECT.%+1                       'this is the new item we want highlighted
  267.        ELSE
  268.            GOTO TAGLIST.UP                           'NO, see if cursor up
  269.        END IF
  270.  
  271.        IF SELECT.% > MAXITEMS% THEN                  'are we at the end of the items?
  272.             SELECT.% = MAXITEMS%                     'cant go past the end of the items
  273.             GOSUB TAGLIST.SOUNDOFF
  274.           RETURN
  275.        END IF
  276.  
  277.        IF (SELECT.% > ENDVAL) AND (SELECT.% = MAXITEMS%) THEN
  278.             BEGVAL=BEGVAL+1
  279.             ENDVAL=ENDVAL+1
  280.             OLD=0
  281.             GOSUB TAGLIST.FILL
  282.           RETURN
  283.        END IF
  284.  
  285. '
  286. ' have we requested an item on the next screen of items
  287. '
  288.        IF (SELECT.% > ENDVAL) AND (SELECT.% <> MAXITEMS%) THEN
  289.             BEGVAL=BEGVAL+1
  290.             ENDVAL=ENDVAL+1
  291.             OLD=0
  292.             GOSUB TAGLIST.FILL
  293.           RETURN
  294.        END IF
  295.  
  296. '
  297. ' highlight the next item
  298.        GOSUB TAGLIST.FILL
  299.        RETURN
  300.  
  301. '
  302. 'Process UP ARROW KeyPress
  303. TAGLIST.UP:
  304.        IF ASC(RIGHT$(KP$,1))=72 THEN                 'was cursor up key pressed?
  305.            SELECT.%=SELECT.%-1                       'this is the new item we want highlighted
  306.        ELSE
  307.            GOTO TAGLIST.PG.UP                        'NO, see if page up
  308.        END IF
  309.  
  310.        IF SELECT.% < 1 THEN                          'are we at the top of the items?
  311.             SELECT.%=1                               'cant go past the top
  312.             GOSUB TAGLIST.SOUNDOFF
  313.           RETURN
  314.        END IF
  315.  
  316.        IF (SELECT.% < BEGVAL) AND (SELECT.% = 1) THEN
  317.             BEGVAL=BEGVAL-1
  318.             ENDVAL=ENDVAL-1
  319.             OLD=0
  320.             GOSUB TAGLIST.FILL
  321.           RETURN
  322.        END IF
  323.  
  324. '
  325. ' have we requested an item on the next screen of items
  326. '
  327.        IF (SELECT.% < BEGVAL) AND (SELECT.% <> 1) THEN
  328.             BEGVAL=BEGVAL-1
  329.             ENDVAL=ENDVAL-1
  330.             OLD=0
  331.             GOSUB TAGLIST.FILL
  332.           RETURN
  333.        END IF
  334.  
  335. '
  336. ' highlight the next item
  337.        GOSUB TAGLIST.FILL
  338.        RETURN
  339.  
  340. '
  341. 'Process PAGE UP KeyPress
  342. TAGLIST.PG.UP:
  343.        IF ASC(RIGHT$(KP$,1))=73 THEN                 'was page up  key pressed?
  344.            OLD=SELECT.%                              'this is the current item highlighted
  345.            SELECT.%=SELECT.%-SHOWITEMS%              'this is the new item we want highlighted
  346.        ELSE
  347.            GOTO TAGLIST.PG.DN                        'NO, see if cursor down
  348.        END IF
  349.  
  350.        IF SELECT.% < 1 THEN                          'are we at the first screen of items?
  351.             KP$=CHR$(0)+CHR$(79)                     'simulate a END key press
  352.             SELECT.%=OLD
  353.           GOTO TAGLIST.ENDK
  354.        END IF
  355.  
  356.        BEGVAL=BEGVAL-SHOWITEMS%                      'calculate the first and last items in next screen
  357.        ENDVAL=ENDVAL-SHOWITEMS%
  358.  
  359.        IF BEGVAL < 1 THEN                            'we cant go past first item
  360.            BEGVAL=1                                  'point to first item
  361.            ENDVAL=SHOWITEMS%
  362.        END IF
  363.  
  364.        GOSUB TAGLIST.FILL                            'highlight the item
  365.        RETURN
  366.  
  367. '
  368. 'Process PAGE DOWN KeyPress
  369. TAGLIST.PG.DN:
  370.        IF ASC(RIGHT$(KP$,1))=81 THEN                 'was page down  key pressed?
  371.            OLD=SELECT.%                              'this is the current item highlighted
  372.            SELECT.%=SELECT.%+SHOWITEMS%              'this is the new item we want highlighted
  373.        ELSE
  374.            GOTO TAGLIST.HOME                         'NO, see if home pressed
  375.        END IF
  376.  
  377.        IF SELECT.% > MAXITEMS% THEN                  'are we at the last screen of items?
  378.           IF ENDVAL>=MAXITEMS% THEN
  379.               KP$=CHR$(0)+CHR$(71)                   'simulate a HOME key press
  380.               SELECT.%=OLD
  381.             GOTO TAGLIST.HOME
  382.           END IF
  383.        END IF
  384.  
  385.        BEGVAL=BEGVAL+SHOWITEMS%                      'calculate the first and last items in next screen
  386.        ENDVAL=ENDVAL+SHOWITEMS%
  387.  
  388.        IF ENDVAL > MAXITEMS% THEN                    'we cant go past the last item
  389.            ENDVAL=MAXITEMS%                          'point to last item
  390.            BEGVAL=(ENDVAL-SHOWITEMS%)+1
  391.            OLD=ENDVAL
  392.            SELECT.%=OLD
  393.        END IF
  394.  
  395.        GOSUB TAGLIST.FILL                            'highlight the item
  396.        RETURN
  397.  
  398. '
  399. 'Process HOME KeyPress
  400. TAGLIST.HOME:
  401.        IF ASC(RIGHT$(KP$,1))=71 THEN                 'was home key pressed?
  402.            OLD=SELECT.%                              'this is the current item highlighted
  403.        ELSE
  404.            GOTO TAGLIST.ENDK                         'NO, see if end key pressed
  405.        END IF
  406.  
  407.        IF SELECT.%=1 THEN
  408.             GOSUB TAGLIST.SOUNDOFF
  409.           RETURN
  410.        END IF
  411.  
  412.        SELECT.%=1                                   'display the first group of items
  413.        BEGVAL=1                                      'point to the first item
  414.        ENDVAL=BEGVAL+SHOWITEMS%-1                    'and display the first screen of this many items
  415.        GOSUB TAGLIST.FILL
  416.        RETURN
  417.  
  418. '
  419. 'Process END KeyPress
  420. TAGLIST.ENDK:
  421.        IF ASC(RIGHT$(KP$,1))=79 THEN                 'was end key pressed?
  422.            OLD=SELECT.%                              'this is the current item highlighted
  423.        ELSE
  424.            GOTO TAGLIST.ERRCHK                       'NO, let user know invalid key pressed
  425.        END IF
  426.  
  427.        IF SELECT.%=MAXITEMS% THEN
  428.              GOSUB TAGLIST.SOUNDOFF
  429.            RETURN
  430.        END IF
  431.  
  432.        SELECT.%=MAXITEMS%                            'display the last group of items
  433.        OLD=SELECT.%                                  'force screen re-display
  434.        ENDVAL=MAXITEMS%                              'point to the last item
  435.        BEGVAL=ENDVAL-SHOWITEMS%+1                    'display screen of last group of items
  436.  
  437.        GOSUB TAGLIST.FILL
  438.        RETURN
  439.  
  440. '
  441. 'Process ERROR
  442. TAGLIST.ERRCHK:
  443.        GOSUB TAGLIST.SOUNDOFF                        'let user know problem/error
  444.        GOTO TAGLIST.PRESS
  445.  
  446. '
  447. 'Fill Contents of window
  448. TAGLIST.FILL:
  449.        IF BEGVAL < 1 THEN                             'make sure we dont go out of bounds
  450.            BEGVAL=1
  451.        END IF
  452.  
  453.        IF ENDVAL > MAXITEMS% THEN                     'make sure we dont go past the end of the items
  454.            ENDVAL=MAXITEMS%
  455.        END IF
  456.  
  457.        OFFSET=ENDVAL-SELECT.%
  458.  
  459.        IF OFFSET < 0 THEN
  460.            OFFSET = 0
  461.        ELSEIF OFFSET > SHOWITEMS%-1 THEN
  462.            OFFSET = SHOWITEMS%-1
  463.        END IF
  464.  
  465.        GOSUB TAGLIST.MMCURSOROFF
  466.  
  467. '
  468. ' If next item to be hi-lited is on same screen already display, dont re-
  469. ' display all options, BUT turn off current hi-lited option and just turn
  470. ' on next item to be hi-lited (on this screen of options).
  471. '
  472.        IF OLD<>SELECT.% THEN
  473.           IF (OLD>=BEGVAL) AND (OLD<=ENDVAL) THEN
  474.                ATTR=(BACK% AND 7)*16+FORE%
  475.  
  476.                ROW=ROW
  477.                COL=ULC%
  478.  
  479.                IF TAGITEMS%(OLD-SELECT.BASE)=1 THEN
  480.                   MID$(ITEM$(OLD-SELECT.BASE),2,1)=CHR$(16)
  481.                ELSE
  482.                   MID$(ITEM$(OLD-SELECT.BASE),2,1)=" "
  483.                END IF
  484.  
  485.                DAT$=ITEM$(OLD-SELECT.BASE)
  486.  
  487.                ASCIIZ=INSTR(DAT$,CHR$(0))             'display ONLY the string upto
  488.                IF ASCIIZ>1 THEN                       'a null x'00' if one is imbedded
  489.                    DAT$=LEFT$(DAT$,ASCIIZ-1)
  490.                END IF
  491.  
  492.                DAT$=DAT$+SPACE$(WINDLEN)              'make all items the same length
  493.                DAT$=LEFT$(DAT$,WINDLEN)               'when they are displayed
  494.  
  495.                CALL FASTPRT(DAT$,ROW,COL,ATTR,VIDEO.RETURN.CODE)
  496.             GOTO TAGLIST.HILITE
  497.           END IF
  498.        END IF
  499.  
  500.        K=1
  501. '
  502. ' display the group of items we need
  503. '
  504.        FOR J=BEGVAL TO ENDVAL
  505.            ATTR=(BACK% AND 7)*16+FORE%
  506.            ROW=(ULR%+1+K)
  507.            COL=ULC%
  508.  
  509.            IF TAGITEMS%(J-SELECT.BASE)=1 THEN
  510.                MID$(ITEM$(J-SELECT.BASE),2,1)=CHR$(16)
  511.            ELSE
  512.                MID$(ITEM$(J-SELECT.BASE),2,1)=" "
  513.            END IF
  514.  
  515.            DAT$=ITEM$(J-SELECT.BASE)
  516.  
  517.            ASCIIZ=INSTR(DAT$,CHR$(0))           'allow for imbedded null x'00'
  518.            IF ASCIIZ>1 THEN                     'char in a string, to restrict
  519.                DAT$=LEFT$(DAT$,ASCIIZ-1)        'the amount of string displayed
  520.            END IF
  521.  
  522.            DAT$=DAT$+SPACE$(WINDLEN)            'make all the displayed messages
  523.            DAT$=LEFT$(DAT$,WINDLEN)             'the same size
  524.  
  525.            CALL FASTPRT(DAT$,ROW,COL,ATTR,VIDEO.RETURN.CODE)
  526.  
  527.            K=K+1
  528.        NEXT
  529.  
  530. '
  531. 'highlight the next item displayed
  532. TAGLIST.HILITE:
  533.        ATTR=(FORE% AND 7)*16+BACK%
  534.  
  535.        IF BEGVAL=1 AND SELECT.%=1 THEN
  536.             ROW=ULR%+2
  537.        ELSEIF (SELECT.% >= BEGVAL) AND (SELECT.% <= ENDVAL) THEN
  538.             ROW=ULR%+2+SELECT.%
  539.        END IF
  540.  
  541.        IF (ENDVAL=MAXITEMS%) AND (SELECT.%>=MAXITEMS%) THEN
  542.             SELECT.%=MAXITEMS%
  543.             ROW=LRR%
  544.        ELSE
  545.             ROW=LRR%-OFFSET
  546.        END IF
  547.  
  548.        COL=ULC%
  549.  
  550.        SELECT.SUB=(SELECT.%-SELECT.BASE)
  551.        IF TAGITEMS%(SELECT.SUB)=1 THEN
  552.            MID$(ITEM$(SELECT.SUB),2,1)=CHR$(16)
  553.        ELSE
  554.            MID$(ITEM$(SELECT.SUB),2,1)=" "
  555.        END IF
  556.  
  557.        DAT$=ITEM$(SELECT.SUB)
  558.  
  559.        ASCIIZ=INSTR(DAT$,CHR$(0))
  560.        IF ASCIIZ>1 THEN                         'allow for imbedded null x'00'
  561.            DAT$=LEFT$(DAT$,ASCIIZ-1)            'char in a string, to restrict
  562.        END IF                                    'the amount of string displayed
  563.  
  564.        DAT$=DAT$+SPACE$(WINDLEN)                'make all the displayed messages
  565.        DAT$=LEFT$(DAT$,WINDLEN)                 'the same size
  566.  
  567. '
  568. ' display this selected item, and highlight it
  569.  
  570.        CALL FASTPRT(DAT$,ROW,COL,ATTR,VIDEO.RETURN.CODE)
  571.  
  572.        IF FIRST.TIME THEN
  573.            MOUSEROW=(ROW-1)*8               'if so, put the mouse cursor on the new selection
  574.            MOUSECOL=(COL+(LEN(DAT$)\2)-1)*8
  575.            CALL MMSETLOC(MOUSECOL,MOUSEROW)
  576.        END IF
  577.  
  578.        OLD=SELECT.%                         'fixes problem with item being highlighed twice
  579.  
  580.        GOSUB TAGLIST.MORE                   'put arrows on top and bottom of window
  581.  
  582.        CLICK=-1
  583.        DO WHILE CLICK                       'flush mouse click , if holding down button
  584.           LFT%=0
  585.           RGT%=0
  586.           CALL MMCLICK(LFT%,RGT%)           'see if mouse clicked on the current highlighted item
  587.           CLICK=LFT%+RGT%                   'was right or left button clicked?
  588.        LOOP
  589.  
  590.        GOSUB TAGLIST.MMCURSORON
  591.        RETURN
  592.  
  593. '
  594. 'Display arrowhead on top or bottom of window as necessary
  595. TAGLIST.MORE:
  596.        IF SHOWITEMS%=MAXITEMS% THEN         'are we doing POPMENU
  597.             RETURN                          'yes, all items displayed at once
  598.        END IF
  599.  
  600.        MCOL=ULC%+((LRC%-ULC%)/2)-3           'calculate the windows upper frame location
  601.  
  602.        DAT$=" "+CHR$(30)+" "+CHR$(205)+" "+CHR$(31)+" "
  603.  
  604.        MROW=ULR%+1
  605.        GOSUB TAGLIST.DISP
  606.  
  607.        MROW=LRR%+1
  608.        GOSUB TAGLIST.DISP
  609.  
  610.        RETURN
  611.  
  612. '
  613. TAGLIST.DISP:
  614.        ATTR=(BACK% AND 7)*16+FORE%
  615.        CALL FASTPRT(DAT$,MROW,MCOL,ATTR,VIDEO.RETURN.CODE)
  616.        RETURN
  617.  
  618. '
  619. '
  620. ' Scan the list of items item looking for an item whose fitst character
  621. 'matches the keyboard character the user just typed.
  622. '
  623. TAGLIST.FIND.OPTION:
  624.        SAVE.SELECT=SELECT.%                 'save the current item highlighted
  625.        TEMP.SELECT=SELECT.%
  626.        FIRST.CHAR$=KP$                      'this is the character to look for
  627.  
  628. 'make test case in-sensative
  629. '
  630.        FIRST.CHAR$=UCASE$(FIRST.CHAR$)      'make test case in-sensative
  631.  
  632.        COUNT=0                              'how many items have looked at
  633. TAGLIST.FIND.LOOP:
  634.        TEMP.SELECT=TEMP.SELECT+1            'look at the item after the current one
  635.        IF TEMP.SELECT>MAXITEMS% THEN        'are we at the end of the list
  636.            TEMP.SELECT=1                    'Yes start back at the first item in the list
  637.        END IF
  638.  
  639.        COUNT=COUNT+1                        'we have looked at this many items so far
  640.        IF COUNT>MAXITEMS% THEN              'have we looked at all the items in the list
  641.            RETURN                           'YES
  642.        END IF
  643.  
  644.        MID$(TEMP.ITEM$,1)=ITEM$(TEMP.SELECT-SELECT.BASE)
  645.        LEN.TEMP.ITEM=LEN(ITEM$(TEMP.SELECT-SELECT.BASE))
  646.  
  647. '
  648. 'scan over leading spaces for this item, up to first character
  649. '
  650.        FOR I=1 TO LEN.TEMP.ITEM
  651.        IF MID$(TEMP.ITEM$,I,1)<>" " THEN
  652. '
  653. ' make comparison case in-sensative
  654. '
  655.            IF UCASE$(MID$(TEMP.ITEM$,I,1))=FIRST.CHAR$ THEN
  656.                GOTO TAGLIST.FOUND.IT        'this one was a match
  657.            ELSE
  658.              GOTO TAGLIST.FIND.LOOP         'not this one, keep looking
  659.            END IF
  660.        END IF
  661.  
  662.        NEXT
  663.  
  664.        GOTO TAGLIST.FIND.LOOP               'not this one, keep looking
  665.  
  666. '
  667. TAGLIST.FOUND.IT:
  668.        SELECT.%=TEMP.SELECT                   'this is the item to select now
  669.  
  670.        IF (SELECT.%>=BEGVAL) AND (SELECT.%<=ENDVAL) THEN 'new item on diff. screen
  671.           GOTO  TAGLIST.FOUND.IT.CONT         'NO
  672.        ENDIF
  673.  
  674.        OLD=SELECT.%                           'yes, force new screen re-display
  675.        BEGVAL=SELECT.%                        'start the display window with this item
  676.        ENDVAL=(BEGVAL+SHOWITEMS%)-1           'and end with this item
  677.  
  678.        IF ENDVAL > MAXITEMS% THEN             'are there enought items to fill this window
  679.            ENDVAL=MAXITEMS%                   'NO, so display the last group of items
  680.            BEGVAL=(ENDVAL-SHOWITEMS%)+1       'and highlight the one found
  681.        END IF
  682.  
  683. TAGLIST.FOUND.IT.CONT:
  684.        GOSUB TAGLIST.FILL                     'display the group of items and highlight one found
  685.  
  686.        OLD=SELECT.%
  687.        RETURN
  688.  
  689. '
  690. '
  691. ' Look for a keyboard key press or a mouse action and return a 'keystroke'
  692. '
  693. TAGLIST.GET.PRESS:
  694.        IF BUTTONS%=0 THEN                     'is a mouse supported?
  695.           GOTO TAGLIST.GET.INKEY              'no, just look at the keyboard
  696.        END IF
  697.  
  698.        CALL MMGETLOC(MOUSECOL,MOUSEROW)       'get the current mouse cursor scrren location
  699.  
  700.        MOUSEROW=(MOUSEROW\8)+1                'convert row to 80x25 co-ordinates
  701.        MOUSECOL=(MOUSECOL\8)+1                'convert columnto 80x25 co-ordinates
  702.  
  703. '
  704. ' Check if the mouse is still in the window box
  705. '
  706. TAGLIST.CHECK.IF.INBOX:
  707. '
  708. ' Is the mouse outside the window frame
  709. '
  710.        IF (MOUSEROW<MENU.TOP.ROW) OR (MOUSEROW>MENU.BOTTOM.ROW) THEN
  711.           GOTO TAGLIST.OUTSIDE.BOX
  712.        END IF
  713.  
  714. '
  715. ' Is the mouse in the box or on the window frame
  716. '
  717.        IF (MOUSECOL>=MENU.TOP.LEFT.COL) AND (MOUSECOL<=MENU.BOTTOM.RIGHT.COL) THEN
  718.           GOTO TAGLIST.FOUNDIT
  719.        END IF
  720.  
  721.  
  722. '
  723. ' Mouse cursor is outside the window, did user click any buttons
  724. '
  725. TAGLIST.OUTSIDE.BOX:
  726.        LFT%=0
  727.        RGT%=0
  728.        CALL MMCLICK(LFT%,RGT%)                'see if left or right button clicked?
  729.        CLICK=LFT%+RGT%
  730.        IF CLICK=0 THEN                        'any button clicked?
  731.            GOTO TAGLIST.OUTSIDE.BOX.CONT      'NO
  732.        END IF
  733.  
  734. '
  735. 'If any button clicked outside window then simualte an ESC key press
  736. '
  737.        IF (MOUSECOL<MENU.TOP.LEFT.COL-1) OR (MOUSECOL>MENU.BOTTOM.RIGHT.COL+1) THEN
  738.             KP$=CHR$(27)                      'simulate ESC key press
  739.            RETURN
  740.        END IF
  741.  
  742. '
  743. ' Mouse was clicked on the top or bottom window frame, get the character under
  744. 'the mouse cursor (on the screen)
  745. '
  746.        SCREEN.CHR=SCREEN(MOUSEROW,MOUSECOL)
  747.  
  748.        KP$=CHR$(0)+CHR$(73)                   'assume 'page up' to be simulated
  749.  
  750.        IF MOUSEROW=MENU.TOP.ROW-1 THEN        'mouse on upper window frame?
  751.            IF SHOWITEMS%<>MAXITEMS% THEN      'are we doing POPMENU
  752.              IF SCREEN.CHR=31 THEN            'NO, user click on 'down' arrow
  753.                    KP$=CHR$(0)+CHR$(81)       'YES, simulate 'page down' keystroke
  754.                  RETURN
  755.              ELSEIF SCREEN.CHR=30 THEN        'was mouse cursor on 'up' character
  756.                  RETURN
  757.              ELSE
  758.                  RETURN
  759.              END IF
  760.            END IF
  761.        END IF
  762.  
  763.        KP$=CHR$(0)+CHR$(81)                   'assume 'page down' to be simulated
  764.  
  765.        IF MOUSEROW=MENU.BOTTOM.ROW+1 THEN     'mouse on bottom window frame?
  766.            IF SHOWITEMS%<>MAXITEMS% THEN      'are we doing POPMENU
  767.              IF SCREEN.CHR=30 THEN            'NO, user click on 'up' arrow
  768.                    KP$=CHR$(0)+CHR$(73)       'YES, simulate 'page up' keystroke
  769.                  RETURN
  770.              ELSEIF SCREEN.CHR=31 THEN        'was mouse on 'down' character
  771.                  RETURN
  772.              ELSE
  773.                  RETURN
  774.              END IF
  775.            END IF
  776.        END IF
  777.  
  778.        KP$=CHR$(27)                           'Simualate an ESC keypress
  779.        RETURN
  780.  
  781. TAGLIST.OUTSIDE.BOX.CONT:
  782.        GOTO TAGLIST.GET.INKEY                 'see if a keyboard key pressed
  783.  
  784. '
  785. TAGLIST.FOUNDIT:
  786.        SELECT.%=BEGVAL+(MOUSEROW-MENU.TOP.ROW) 'this is the one we want to highlight now
  787.  
  788.        IF SELECT.%<>OLD THEN                   'are we on the same one as is currently highlighted
  789.             LFT%=0
  790.             RGT%=0
  791.             CALL MMCLICK(LFT%,RGT%)            'see if mouse clicked on the current highlighted item
  792.             CLICK=LFT%+RGT%                    'was right or left button clicked?
  793.             IF CLICK THEN                      'a button clicked?
  794.                  GOSUB TAGLIST.FILL            'NO, so highlight the newone just selected with the mouse
  795.                  OLD=SELECT.%
  796.              ELSE
  797.                  SELECT.%=OLD
  798.                GOTO TAGLIST.GET.INKEY
  799.             END IF
  800.  
  801.        END IF
  802.  
  803.        SELECT.%=OLD
  804.  
  805.        LFT%=0
  806.        RGT%=0
  807.        CALL MMCLICK(LFT%,RGT%)                 'see if mouse clicked on the current highlighted item
  808.        CLICK=LFT%+RGT%                         'was right or left button clicked?
  809.  
  810.        IF CLICK=0 THEN                         'a button clicked?
  811.           GOTO TAGLIST.GET.INKEY               'NO
  812.        END IF
  813.  
  814.        IF RGT% THEN                            'was right button pressed?
  815.             CLICK=0
  816.             KP$=CHR$(13)                       'Yes simulate a ENTER keypress
  817.          RETURN
  818.        END IF
  819.  
  820.        IF LFT%<1 THEN                          'was left button pressed
  821.           GOTO TAGLIST.GET.INKEY               'NO
  822.        END IF
  823.  
  824.        KP$=CHR$(0)+CHR$(82)                    'assume INS keypress to be simulated
  825.  
  826.        IF TAGITEMS%(SELECT.SUB)=1 THEN         'if item already tagged
  827.            KP$=CHR$(0)+CHR$(83)                'simulate a DEL keypress
  828.        END IF
  829.  
  830.        RETURN
  831.  
  832. '
  833. TAGLIST.GET.INKEY:
  834.        KP$=INKEY$                             'get a keyboard keypress character, if one avail.
  835.  
  836.        IF LEN(KP$)=0 THEN                     'keep looking for a mouse or keyboard action
  837.           GOTO TAGLIST.GET.PRESS
  838.        END IF
  839.  
  840.        RETURN
  841.  
  842. '
  843. '
  844. ' The Window upper left frame co-ordinates were defined
  845. '
  846. TAGLIST.GETORD:
  847.        QUADRANT$=LTRIM$(QUADRANT$)            'strip off any leading and trailing spaces
  848.        QUADRANT$=RTRIM$(QUADRANT$)
  849.  
  850.        COLON.LOC=INSTR(QUADRANT$,":")         'find where the row/column separator char is loacted
  851.  
  852.        IF COLON.LOC=1 THEN                    'was a row defined
  853.            QUADRANT$="01"+QUADRANT$           'NO, so default to row 02
  854.            COLON.LOC=3
  855.        END IF
  856.  
  857.        ULR%=VAL(LEFT$(QUADRANT$,COLON.LOC-1)) 'convert row to a interger. to work with
  858.  
  859.        IF (ULR%<1) OR (ULR%>24) THEN          'is row in valid range of screen co-ordinates
  860.           ULR%=2                              'no, so default to row 02
  861.        END IF
  862.  
  863.        IF COLON.LOC=LEN(QUADRANT$) THEN       'was a column co-ordinate defined
  864.           QUADRANT$=QUADRANT$+"00"            'NO, so default to 00
  865.        END IF
  866.  
  867.        ULC%=VAL(MID$(QUADRANT$,COLON.LOC+1))  'convert column to interger, to work with
  868.        IF (ULC%<1) OR (ULC%>80) THEN          'is the column in a valid range
  869.            GOSUB TAGLIST.CENTER.ON.THE.LINE   'NO, so center the window on the row
  870.        END IF
  871.  
  872.        QUADRANT.ROW$=STR$(ULR%)               'return the string of the row and column we are working with
  873.        QUADRANT$="0"+RIGHT$(QUADRANT.ROW$,LEN(QUADRANT.ROW$)-1)+":"
  874.        QUADRANT.COL$=STR$(ULC%)
  875.        QUADRANT$=QUADRANT$+"0"+RIGHT$(QUADRANT.COL$,LEN(QUADRANT.COL$)-1)
  876.  
  877.        LRR%=ULR%+SHOWITEMS%+1                   'calculate the windows lower right row and column co-ord.
  878.        LRC%=ULC%+WINDLEN-1
  879.        RETURN
  880.  
  881. '
  882. TAGLIST.CENTER.ON.THE.LINE:
  883.        TEMP.ULC%=40-(WINDLEN/2)                 'calculate the center point on the row
  884.        IF (ULC%<2) THEN                         'would window be outside screen?
  885.           TEMP.ULC%=2                           'put it back in scrren and allow for frame (but not shadow)
  886.        END IF
  887.  
  888.        ULC%=TEMP.ULC%                            'this is the upper left column needed to center this window
  889.  
  890.        RETURN
  891.  
  892. '
  893. '
  894. ' Center the window frame header, within the window.
  895. '
  896. TAGLIST.PUTHDR:
  897.        PAD=(WINDLEN/2)-(LEN(HEADER$)/2)-.5
  898.        MID$(TEMPHDR$,PAD+1,LEN(HEADER$))=HEADER$
  899.        HEADER$=TEMPHDR$
  900.        RETURN
  901.  
  902. '
  903. TAGLIST.MMCURSORON:
  904.        IF BUTTONS%=0 THEN                     'is a mouse supported?
  905.            RETURN                             'NO
  906.        END IF
  907.  
  908.        IF MOUSE.CURSOR=0 THEN                 'is the mouse off at present?
  909.           CALL MMCURSORON                     'YES, turn it on
  910.           MOUSE.CURSOR=-1
  911.        END IF
  912.  
  913.        RETURN
  914.  
  915. TAGLIST.MMCURSOROFF:
  916.        IF BUTTONS%=0 THEN                     'is a mouse supported?
  917.            RETURN                             'NO
  918.        END IF
  919.  
  920.        IF MOUSE.CURSOR=-1 THEN                'is the mouse on at present?
  921.           CALL MMCURSOROFF                    'YES, turn it off
  922.           MOUSE.CURSOR=0
  923.        END IF
  924.  
  925.        RETURN
  926.  
  927. '
  928. TAGLIST.SOUNDOFF:
  929.        SOUND 1000,1
  930.        SOUND 1500,2
  931.        SOUND 500,1
  932.        RETURN
  933.  
  934. '
  935. TAGLIST.DONE:
  936.        GOSUB TAGLIST.MMCURSOROFF              'turn the mouse off as we leave
  937.  
  938.        TEMP.ITEM$=""                          'free string space
  939.        HEADER$=""
  940.        TEMPHDR$=""
  941.        DAT$=""
  942. END SUB
  943.