'===========================================================================
' Subject: MULTI-LINE EDIT                    Date: 01-01-97 (22:23)       
'  Author: Brian Bacon                        Code: QB, QBasic, PDS        
'  Origin: FidoNet QUIK_BAS Echo            Packet: TEXT.ABC
'===========================================================================
'Multi-line edit
DECLARE SUB MLedit (Text$(), Row, Col, Ln, Hg, Fg, Bg, KeyCode)
' Row, Col - Row/Col of upper left corner
' Ln - Max length of each line
' Hg - Total number of lines to edit
' Fg, Bg - foreground/background color of edit box
' KeyCode - Key used to exit (27=esc, 13=ctrl-enter or max lines
'                            reached)
'
' This routine exits if you hit ENTER on the last edit-able line
DIM SHARED TypeOver
TypeOver = 1  ' On
TypeOver = -2 ' Off

CLS
DIM T$(20)
T$(1) = "Press ESC to abort"
T$(2) = "Press CTRL-ENTER to end editing"
T$(3) = "Press HOME or END to go to the Beginning/End of the line"
T$(4) = "Press CTRL-HOMEor CTRL-END to go to the Beginning/End of "
T$(4) = T$(4) + "the input"
T$(5) = "Use the cursor keys to move around."
T$(6) = "Unfortunatly MLedit doesnt support word wrapping."
T$(7) = "You can use INS and DEL though.. and BACKSPACE will work"
T$(7) = T$(7) + " ANYWHERE"
MLedit T$(), 1, 1, 80, 20, 15, 1, KC

'Multi-Line Edit by Brian Bacon
SUB MLedit (Text$(), Row, Col, Ln, Hg, Fg, Bg, KeyCode)
    COLOR Fg, Bg
    FOR I = 0 TO Hg - 1
        LOCATE Row + I, Col
        PRINT SPACE$(Ln)
    NEXT I
    LOCATE Row, Col
    FOR I = 1 TO UBOUND(Text$)
        PRINT Text$(I)
    NEXT I
    FOR I = 1 TO UBOUND(Text$)
        IF Text$(I) <> "" THEN f = I
    NEXT I
    c = Col + LEN(Text$(f))
    r = Row + f - 1
    EdN = f
    DIM EdText$(UBOUND(Text$))
    FOR I = 1 TO UBOUND(Text$)
        EdText$(I) = Text$(I)
    NEXT I
    DEF SEG = 0
    IF PEEK(&H463) = &HB4 THEN
       CsrSize = 12
    ELSE
       CsrSize = 7
    END IF
    DEF SEG
    DO
      IF TypeOver = 1 THEN
         TopLine = CsrSize \ 2
      ELSE
         TopLine = CsrSize - 1
      END IF
      LOCATE r, c, 1, TopLine, CsrSize
      DO
        A$ = INKEY$
      LOOP UNTIL LEN(A$)
      SELECT CASE A$
             CASE CHR$(27): KeyCode = 27: EXIT SUB
             CASE CHR$(10) 'Ctrl-Enter
                     KeyCode = 13
                     FOR I = 1 TO UBOUND(Text$)
                         EdText$(I) = Text$(I)
                     NEXT I
                     EXIT SUB
             CASE CHR$(13)
                  IF EdN = UBOUND(Text$) THEN
                     KeyCode = 13
                     FOR I = 1 TO UBOUND(Text$)
                         EdText$(I) = Text$(I)
                     NEXT I
                     EXIT SUB
                  ELSE
                     EdN = EdN + 1
                     r = r + 1
                     c = Col
                  END IF
             CASE CHR$(0) + CHR$(&H4D) 'right
                  IF c = Col + Ln - 1 AND r = Row + Hg - 1 THEN
                     BEEP
                  ELSEIF c = Col + Ln - 1 AND r < Row + Hg - 1 THEN
                     r = r + 1
                     c = Col
                     EdN = EdN + 1
                  ELSE
                     c = c + 1
                  END IF
             CASE CHR$(0) + CHR$(&H4B) 'left
                  IF c = Col AND r = Row THEN
                     BEEP
                  ELSEIF c = Col AND r > Row THEN
                     r = r - 1
                     c = Col + Ln - 1
                     EdN = EdN - 1
                  ELSE
                     c = c - 1
                  END IF
             CASE CHR$(0) + CHR$(&H48) 'up
                  IF r = Row THEN BEEP ELSE r = r - 1: EdN = EdN - 1
             CASE CHR$(0) + CHR$(&H50) 'down
                  IF r = Row + Hg - 1 THEN
                     BEEP
                  ELSE r = r + 1
                     EdN = EdN + 1
                  END IF
             CASE CHR$(0) + CHR$(&H4F) 'end
                  c = Col + Ln - 1
             CASE CHR$(0) + CHR$(&H47) 'home
                  c = Col
             CASE CHR$(0) + CHR$(&H53) 'del
                  IF LEN(EdText$(EdN)) > 0 THEN
                     EdText$(EdN) = LEFT$(EdText$(EdN), c - Col) + MID$(EdText$(EdN), c - Col + 2)
                     LOCATE Row + EdN - 1, Col
                     PRINT SPACE$(Ln)
                     LOCATE Row + EdN - 1, Col
                     PRINT EdText$(EdN)
                  END IF
             CASE CHR$(0) + CHR$(&H52) 'ins
                  TypeOver = NOT TypeOver
             CASE CHR$(0) + CHR$(119) 'ctrl-home
                  r = Row: c = Col: EdN = 1
             CASE CHR$(0) + CHR$(117) 'ctrl-end
                  r = Row + Hg - 1: c = Col + Ln - 1
                  EdN = UBOUND(Text$)
             CASE CHR$(8)
                  IF LEN(EdText$(EdN)) > 0 AND c > 1 THEN
                     EdText$(EdN) = LEFT$(EdText$(EdN), c - 1 - Col) + MID$(EdText$(EdN), c - Col + 1)
                     LOCATE Row + EdN - 1, Col
                     PRINT SPACE$(Ln)
                     LOCATE Row + EdN - 1, Col
                     PRINT EdText$(EdN)
                     c = c - 1
                  ELSEIF EdN > 1 THEN
                     EdN = EdN - 1
                     c = LEN(EdText$(EdN)) + Col
                     IF c = 81 THEN c = 80
                     r = r - 1
                  END IF
             CASE CHR$(32) TO CHR$(254)
                  IF TypeOver = 1 THEN
                     IF c - Col + 1 > LEN(EdText$(EdN)) THEN
                        EdText$(EdN) = EdText$(EdN)
                     END IF
                     MID$(EdText$(EdN), c - Col + 1) = A$
                  ELSE
                     EdText$(EdN) = EdText$(EdN) + SPACE$(Ln - LEN(EdText$(EdN)))
                     EdText$(EdN) = LEFT$(EdText$(EdN), c - Col) + A$ + MID$(EdText$(EdN), c - Col + 1)
                     EdText$(EdN) = RTRIM$(EdText$(EdN))
                     IF LEN(EdText$(EdN)) > Ln THEN EdText$(EdN) = LEFT$(EdText$(EdN), Ln)
                  END IF
                  LOCATE r, Col
                  PRINT SPACE$(Ln)
                  LOCATE r, Col
                  PRINT EdText$(EdN)
                  c = c + 1
                  IF c - Col + 1 > Ln THEN
                     r = r + 1
                     c = Col
                     IF r - Row + 1 > Hg THEN
                        r = r - 1
                        c = Col + Ln - 1
                     END IF
                     EdN = r - Row + 1
                  END IF
     END SELECT
   LOOP
END SUB
