'===========================================================================
' Subject: TAGGED MENU                        Date: 06-22-92 (05:45)       
'  Author: Ray Carson                         Code: QB, QBasic, PDS        
'  Origin: TAGGED,MENU                      Packet: MENU.ABC
'===========================================================================
DEFINT A-Z

DECLARE SUB TagMenu (UpperRow, LowerRow, LeftColumn, FgNormal, BgNormal, FgHlight, BgHlight, FgMarker, Keycode, N, QtySelected, Array$(), Tagged())
REDIM Array$(50), Tagged(50)
CALL TagMenu(5, 20, 32, 15, 1, 4, 7, 4, Keycode, N, QtySelected, Array$(), Tagged())
 
COLOR 0, 3: CLS
DEF SEG = &HB800
FOR X = 0 TO 4000 STEP 2
    POKE X, 176
NEXT
DEF SEG
FOR X = 1 TO 50
    Array$(X) = "Item No." + STR$(X)
NEXT

N = 50

CALL TagMenu(5, 20, 32, 15, 1, 4, 7, 4, Keycode, N, QtySelected, Array$(), Tagged())
COLOR 7, 0: CLS

IF Keycode = 27 THEN PRINT "User Aborted": END

PRINT LTRIM$(STR$(QtySelected)); " items selected:"
FOR X = 1 TO N
    IF Tagged(X) THEN
        LOCATE , 5
        PRINT Array$(X)
    END IF
NEXT
END

SUB TagMenu (UpperRow, LowerRow, LeftColumn, FgNormal, BgNormal, FgHlight, BgHlight, FgMarker, Keycode, N, QtySelected, Array$(), Tagged())
 
    SelChr$ = CHR$(16)
    MaxLength = 0
    FOR X = 1 TO N
        Q = LEN(Array$(X))
        IF Q > MaxLength THEN MaxLength = Q
    NEXT
    COLOR FgNormal, BgNormal
    LOCATE 25, 1: PRINT SPACE$(80);
    LOCATE 25, 2
    PRINT "<Home, End, "; CHR$(25); ", "; CHR$(24); "><Spacebar>Mark/Clear <F2>Mark All <F3>Clear All <Return>Exit";
    UR = UpperRow - 1
    LR = LowerRow + 1
    LC = LeftColumn - 2
    RC = LeftColumn + MaxLength + 3
    Top$ = CHR$(218) + STRING$(((RC - 1) - LC), 196) + CHR$(191)
    Middle$ = CHR$(179) + STRING$(((RC - 1) - LC), 32) + CHR$(179)
    Bottom$ = CHR$(192) + STRING$(((RC - 1) - LC), 196) + CHR$(217)
    LOCATE UR, LC: PRINT Top$;
    FOR Q = UR + 1 TO LR - 1
        LOCATE Q, LC: PRINT Middle$;
    NEXT
    LOCATE LR, LC: PRINT Bottom$;

SetupTagMenu:
    Row = UpperRow: Column = LeftColumn
    COLOR FgNormal, BgNormal
    X = 1
    DO
        LOCATE Row, Column
        PRINT " " + Array$(X) + SPACE$(MaxLength - LEN(Array$(X))) + " ";
        RowI = Row
        GOSUB CheckTagged
        Row = Row + 1
        IF Row = LowerRow + 1 THEN EXIT DO
        X = X + 1

    LOOP UNTIL X > N
    Row = UpperRow
    X = 1
    COLOR FgHlight, BgHlight
    LOCATE Row, Column
    PRINT " " + Array$(X) + SPACE$(MaxLength - LEN(Array$(X))) + " ";
 

GetKey:
    DO
        k$ = INKEY$
    LOOP UNTIL LEN(k$)
    Keycode = ASC(k$)
    IF LEN(k$) = 2 THEN Keycode = ASC(RIGHT$(k$, 1))
    IF Keycode = 13 OR Keycode = 27 THEN    'Return or Escape
        COLOR FgNormal, BgNormal
        LOCATE Row, Column
        PRINT " " + Array$(X) + SPACE$(MaxLength - LEN(Array$(X))) + " ";
        COLOR 7, 0
        EXIT SUB
    END IF
    IF Keycode = 60 THEN                    'F2
        QtySelected = N                     'Mark all Files
        FOR Q = 1 TO N
            Tagged(Q) = -1
        NEXT
        COLOR FgMarker, BgNormal
        FOR Q = UpperRow TO LowerRow
            IF SCREEN(Q, Column + 1) <> 32 THEN
                LOCATE Q, Column - 1
                PRINT SelChr$;
            END IF
        NEXT
    END IF
    IF Keycode = 61 THEN                    'F3
        QtySelected = 0                     'Clear all Files
        FOR X = 1 TO N
            Tagged(X) = 0
        NEXT
        COLOR FgNormal, BgNormal
        FOR X = UpperRow TO LowerRow
            LOCATE X, Column - 1: PRINT " ";
        NEXT
    END IF
    IF Keycode = 71 THEN                    'Home
        GOTO SetupTagMenu
    END IF
    IF Keycode = 79 THEN                    'End
        COLOR FgNormal, BgNormal
        LOCATE Row, Column
        PRINT " " + Array$(X) + SPACE$(MaxLength - LEN(Array$(X))) + " ";
        Row = UpperRow
        X = N - (LowerRow - UpperRow)
        IF X < 1 THEN X = 1
        DO
            LOCATE Row, Column
            PRINT " " + Array$(X) + SPACE$(MaxLength - LEN(Array$(X))) + " ";
            RowI = Row
            GOSUB CheckTagged
            Row = Row + 1
            IF Row = LowerRow + 1 THEN EXIT DO
            X = X + 1
        LOOP UNTIL X > N
        X = N
        Row = Row - 1
        COLOR FgHlight, BgHlight
        LOCATE Row, Column
        PRINT " " + Array$(X) + SPACE$(MaxLength - LEN(Array$(X))) + " ";
    END IF
    IF Keycode = 80 OR Keycode = 32 THEN    'Down
        IF Keycode = 32 THEN                'Spacebar
            LOCATE Row, Column - 1
            IF Tagged(X) THEN
                COLOR FgNormal, BgNormal
                PRINT " ";
                Tagged(X) = 0
                QtySelected = QtySelected - 1
            ELSE
                COLOR FgMarker, BgNormal
                PRINT SelChr$;
                COLOR FgNormal, BgNormal
                Tagged(X) = -1
                QtySelected = QtySelected + 1
            END IF
        END IF
        IF X = N THEN GOTO GetKey
        COLOR FgNormal, BgNormal
        LOCATE Row, Column
        PRINT " " + Array$(X) + SPACE$(MaxLength - LEN(Array$(X))) + " ";
        Row = Row + 1
        IF Row = LowerRow + 1 THEN
            X = X + 1
            COLOR FgHlight, BgHlight
            Row = Row - 1
            LOCATE Row, Column
            PRINT " " + Array$(X) + SPACE$(MaxLength - LEN(Array$(X))) + " ";
            RowI = Row
            GOSUB CheckTagged
            Temp = X
            X = X - 1
            COLOR FgNormal, BgNormal
            FOR j = LowerRow - 1 TO UpperRow STEP -1
                LOCATE j, Column
                PRINT " " + Array$(X) + SPACE$(MaxLength - LEN(Array$(X))) + " ";
                RowI = j
                GOSUB CheckTagged
                X = X - 1
            NEXT
            X = Temp
        ELSE
            X = X + 1
            COLOR FgHlight, BgHlight
            LOCATE Row, Column
            PRINT " " + Array$(X) + SPACE$(MaxLength - LEN(Array$(X))) + " ";
            RowI = Row
            GOSUB CheckTagged
        END IF
    END IF
    IF Keycode = 72 THEN                    'Up
        IF X = 1 THEN GOTO GetKey
        COLOR FgNormal, BgNormal
        LOCATE Row, Column
        PRINT " " + Array$(X) + SPACE$(MaxLength - LEN(Array$(X))) + " ";
        Row = Row - 1
        IF Row = UpperRow - 1 THEN
            X = X - 1
            COLOR FgHlight, BgHlight
            Row = Row + 1
            LOCATE Row, Column
            PRINT " " + Array$(X) + SPACE$(MaxLength - LEN(Array$(X))) + " ";
            RowI = Row
            GOSUB CheckTagged
            Temp = X: X = X + 1
            COLOR FgNormal, BgNormal
            FOR j = UpperRow + 1 TO LowerRow
                LOCATE j, Column
                PRINT " " + Array$(X) + SPACE$(MaxLength - LEN(Array$(X))) + " ";
                RowI = j
                GOSUB CheckTagged
                X = X + 1
            NEXT
            X = Temp
        ELSE
            X = X - 1
            COLOR FgHlight, BgHlight
            LOCATE Row, Column
            PRINT " " + Array$(X) + SPACE$(MaxLength - LEN(Array$(X))) + " ";
            RowI = Row
            GOSUB CheckTagged
        END IF
    END IF
    GOTO GetKey
 
CheckTagged:
    LOCATE RowI, Column - 1
    IF Tagged(X) THEN
        COLOR FgMarker, BgNormal
        PRINT SelChr$;
        COLOR FgNormal, BgNormal
    ELSE
        COLOR FgNormal, BgNormal
        PRINT " ";
    END IF
    RETURN
    
END SUB

