'===========================================================================
' Subject: SUPER LIMITED INPUT                Date: 05-11-97 (16:39)       
'  Author: Richard Peacock                    Code: QB, QBasic, PDS        
'  Origin: rjp1@bayou.com                   Packet: TEXT.ABC
'===========================================================================
DECLARE FUNCTION InputLine$ (text$, ViewWidth%, keycode%)
DECLARE FUNCTION Lesser% (Var1%, Var2%)

' Super Limited Input!!


' Hello all!
' This is a cool little thing to let you have an input line, that can scroll
' back anf forth with the left & right keys!  You also type.  (Just run it)
' Do with this what you will, just give me small credit.

' I am Richard Peacock, Of Peacock Programming.  My page is at:
' www.bayou.com/~rjp1/        Go there and follow the link to my
' game page.  Thanx all....and bye!
'      ./
'     /|
'     / \

        'These are the ascii codes of the keys.

CONST false = 0, true = NOT false
CONST ESC = 27, ENTER = 13, BkSpc = 8, TabKey = 9
CONST InsertKey = -82, DeleteKey = -83
CONST HomeKey = -71, CtrlHome = -119
CONST EndKey = -79, CtrlEnd = -117
CONST PgUpKey = -73, PgDnKey = -81
CONST UpArrow = -72, DnArrow = -80, LArrow = -75, RArrow = -77
DIM SHARED CursSize%

CursSize% = 7


CLS


        '  Ok, All I'm really doing here is making a pretty little dialog box.
        '  (The one you see when you run the program).





LOCATE 4, 1
PRINT "Features:  You can scroll left and right.  Press INSERT to use INS and OVS mode."
PRINT "You can use HOME and END.  You can use Ascii symbols."


LOCATE 10, 23
COLOR 0, 7: PRINT "File Name:"
COLOR 15, 2
LOCATE 10, 32

        ' I will explain this next line:
        ' The first thing in quotes is the starting line.  It can be blank.
        ' The second is how many spaces across to allow.
        ' The last statement is the letter you type.

a$ = InputLine$("It can scroll when you type!", 29, keycode%)
LOCATE 1, 1: COLOR 7, 0
IF keycode% = ESC THEN LOCATE 1, 1: PRINT "You hit ESC"
IF keycode% = ENTER THEN LOCATE 1, 1: PRINT "You hit ENTER"
PRINT a$

FUNCTION InputLine$ (text$, ViewWidth%, keycode%)

MaxLnLen% = 128
LCol% = POS(0): RCol% = LCol% + ViewWidth% - 1
View$ = SPACE$(ViewWidth%)
Work$ = LEFT$(text$, MaxLnLen%)
LnLen% = LEN(Work$)
CCol% = Lesser(LCol% + LnLen%, RCol%)
AChar% = LnLen% + 1

'LOCATE , , 0, CursSize% - 1, CursSize%
Insert% = true
DO
  LOCATE , LCol%
  LSET View$ = MID$(Work$, AChar% - (CCol% - LCol%), ViewWidth%)
  PRINT View$;
  LOCATE , CCol%, 1
  LnLen% = LEN(Work$)
  DO
    DO: Ky$ = INKEY$: LOOP UNTIL LEN(Ky$)
    keycode% = ASC(Ky$): IF keycode% = 0 THEN keycode% = -ASC(MID$(Ky$, 2))
  LOOP UNTIL keycode% <> BadKey%: BadKey% = 0
  LOCATE , , 0
  SELECT CASE keycode%
    CASE BkSpc
         IF AChar% = 1 THEN
           BEEP: BadKey% = keycode%
         ELSE
           IF AChar% <= LnLen% + 1 THEN
                Work$ = LEFT$(Work$, AChar% - 2) + MID$(Work$, AChar%)
           END IF
           AChar% = AChar% - 1
           IF CCol% <> LCol% THEN CCol% = CCol% - 1
         END IF
    CASE ENTER
         text$ = Work$
         EXIT DO
    CASE ESC
         EXIT DO
    CASE 32 TO 255      ' letter keys
         IF AChar% > MaxLnLen% THEN
           BEEP: BadKey% = keycode%
         ELSE
           IF AChar% <= LnLen% THEN
                IF Insert% THEN
                  IF LnLen% = MaxLnLen% THEN
                    BEEP: BadKey% = keycode%
                  ELSE
                    Work$ = LEFT$(Work$, AChar% - 1) + Ky$ + MID$(Work$, AChar%)
                    AChar% = AChar% + 1
                    IF CCol% <> RCol% THEN CCol% = CCol% + 1
                  END IF
                ELSE 'IF NOT Insert% THEN (in overstrike mode)
                  MID$(Work$, AChar%, 1) = Ky$
                  AChar% = AChar% + 1
                  IF CCol% <> RCol% THEN CCol% = CCol% + 1
                END IF
           ELSE 'IF AChar% > LnLen% THEN
                Work$ = Work$ + SPACE$(AChar% - LnLen% - 1) + Ky$
                AChar% = AChar% + 1
                IF CCol% <> RCol% THEN CCol% = CCol% + 1
           END IF
         END IF
    CASE LArrow
         IF AChar% = 1 THEN
           BEEP: BadKey% = keycode%
         ELSE 'IF AChar% > 1 THEN
           AChar% = AChar% - 1
           IF CCol% <> LCol% THEN CCol% = CCol% - 1
         END IF
    CASE RArrow
         IF AChar% > MaxLnLen% THEN
           BEEP: BadKey% = keycode%
         ELSE
           AChar% = AChar% + 1
           IF CCol% <> RCol% THEN CCol% = CCol% + 1
         END IF
    CASE HomeKey
         AChar% = 1
         CCol% = LCol%
    CASE EndKey
         AChar% = LnLen% + 1
         CCol% = Lesser(LCol% + LnLen%, RCol%)
    CASE InsertKey
         Insert% = NOT Insert%
         IF Insert% THEN
         LOCATE , , , CursSize% - 1, CursSize%
         ELSE
         LOCATE , , , CursSize% / 2, CursSize%
         END IF
    CASE DeleteKey
         IF AChar% <= LnLen% THEN
           Work$ = LEFT$(Work$, AChar% - 1) + MID$(Work$, AChar% + 1)
         END IF
    CASE ELSE
         BEEP: BadKey% = keycode%
  END SELECT
 LOOP
 LOCATE , , , CursSize% - 1, CursSize%

InputLine$ = text$

END FUNCTION

 FUNCTION Lesser% (Var1%, Var2%) STATIC
 Lesser% = Var1%: IF Var2% < Var1% THEN Lesser% = Var2%
END FUNCTION
