'===========================================================================
' Subject: INPUT TEXT BOX                     Date: 11-20-00 (23:11)       
'  Author: Joel Nothman                       Code: QB, QBasic, PDS        
'  Origin: jnothman@crosswinds.net          Packet: TEXT.ABC
'===========================================================================
DECLARE FUNCTION TextBox$ (x!, y!, w!, max!, text$)
DECLARE SUB CharBox (x1!, y1!, x2!, y2!)
DECLARE SUB ShowCursor (x!, y!, C!)
DIM SHARED CancelFlag


SUB CharBox (x1, y1, x2, y2)
     LINE ((x1 - 1) * 8 - 1, (y1 - 1) * 16 - 1)-(x2 * 8, y2 * 16), , B
     FOR j = y1 TO y2
          LOCATE y1, x1
          PRINT STRING$(x2 - x1 + 1, " ");
     NEXT
END SUB

SUB ShowCursor (x, y, C)
     LINE ((x - 1) * 8, y * 16 - 1)-(x * 8 - 1, y * 16 - 1), C
END SUB

FUNCTION TextBox$ (x, y, w, max, text$)
     CancelFlag = 0

     COLOR 11
     CharBox x, y, x + w - 1, y

     Cursor = LEN(text$)
     Scroll = Cursor - w + 1
     IF Scroll < 0 THEN Scroll = 0
     DO
          LOCATE y, x
          COLOR 15
          PRINT STRING$(w, " ")
          IF text$ <> "" THEN
               LOCATE y, x
               PRINT MID$(text$, Scroll + 1, w)
          END IF

          Flag = 0
          q = 0
          DO
               a$ = INKEY$
               IF TIMER - .5 > q THEN
                    LastColour = ABS(LastColour - 14)
                    q = TIMER
                    ShowCursor x + Cursor - Scroll, y, LastColour
               END IF
         
               SELECT CASE a$
                    CASE ""
                    CASE KENTER$
                         Flag = 1
                         Quit = 1

                    CASE KESCAPE$
                         Flag = 1
                         Quit = 1
                         CancelFlag = 1
                   
                    CASE KLEFT$ 'Left
                         Flag = 1
                         ShowCursor x + Cursor - Scroll, y, 0
                         LastColour = 0
                        
                         f = 0
                         IF Cursor - Scroll = 0 THEN
                              IF Scroll = 0 THEN
                                   PLAY "L30o5c"
                                   f = 1
                              ELSE
                                   Scroll = Scroll - INT(w / 3)
                                   IF Scroll < 0 THEN Scroll = 0
                              END IF
                         END IF
                        
                         IF f = 0 THEN Cursor = Cursor - 1

                    CASE KRIGHT$ 'Right
                         Flag = 1
                         ShowCursor x + Cursor - Scroll, y, 0
                         LastColour = 0
                       
                         f = 0
                         IF Cursor = LEN(text$) THEN
                              PLAY "L30o5c"
                              f = 1
                         ELSE
                              IF Cursor - Scroll = w - 1 THEN
                                   Scroll = Scroll + INT(w / 3)
                                   IF Scroll > LEN(text$) THEN Scroll = LEN(text$)
                              END IF
                         END IF
                       
                         IF f = 0 THEN Cursor = Cursor + 1

                    CASE CHR$(8) 'backspace
                         IF Cursor > 0 THEN
                              Flag = 1
                              ShowCursor x + Cursor - Scroll, y, 0
                              LastColour = 0
                            
                              IF Cursor - Scroll = 0 THEN
                                   Scroll = Scroll - INT(w / 3) - 1
                                   IF Scroll < 0 THEN Scroll = 0
                              END IF
                       
                              Cursor = Cursor - 1
                              text$ = LEFT$(text$, Cursor) + MID$(text$, Cursor + 2)
                         ELSE
                              PLAY "L30o5c"
                         END IF

                    CASE CHR$(0) + CHR$(83)  'delete
                         IF Cursor < LEN(text$) THEN
                              text$ = LEFT$(text$, Cursor) + MID$(text$, Cursor + 2)
                              Flag = 1
                         ELSE
                              PLAY "L30o5c"
                         END IF

                    CASE CHR$(0) + CHR$(71) 'home
                         Scroll = 0
                         Cursor = 0
                         Flag = 1

                    CASE CHR$(0) + CHR$(79) 'end
                         Cursor = LEN(text$)
                         Scroll = Cursor - w + 1
                         IF Scroll < 0 THEN Scroll = 0
                         Flag = 1

                    CASE ELSE
                         IF (max <= LEN(text$) AND max > 0) OR LEN(a$) <> 1 THEN
                              PLAY "L30o5c"
                         ELSE
                              Flag = 1
                              IF Cursor > 0 THEN
                                   text$ = LEFT$(text$, Cursor) + a$ + MID$(text$, Cursor + 1)
                              ELSE
                                   text$ = a$ + text$
                              END IF

                              ShowCursor x + Cursor - Scroll, y, 0
                              LastColour = 0
                      
                              IF Cursor - Scroll = w - 1 THEN
                                   Scroll = Scroll + INT(w / 3)
                                   IF Scroll > LEN(text$) THEN Scroll = LEN(text$)
                              END IF
                              Cursor = Cursor + 1
                         END IF
               END SELECT
          LOOP UNTIL Flag = 1
          LastColour = 0
          ShowCursor x + Cursor - Scroll, y, 0
     LOOP UNTIL Quit = 1

     TextBox$ = text$
END FUNCTION
