home *** CD-ROM | disk | FTP | other *** search
/ World of Shareware - Software Farm 2 / wosw_2.zip / wosw_2 / QBAS / IMB9006.ZIP / TEXT3WIN.BAS < prev   
BASIC Source File  |  1990-05-16  |  7KB  |  285 lines

  1. ' TEXTWIN.BAS
  2.  
  3. ' This Sample program shows how to use
  4. ' TextWindow -- a function that allows
  5. ' a user to enter a window of text
  6.  
  7. DEFINT A-Z
  8. DECLARE FUNCTION TextWindow_
  9.            (Buffer$, Lines, Columns, x, y)
  10. DECLARE SUB MakeBox (x, y, Lines, Columns)
  11.  
  12. CLS
  13. LOCATE 15, 1: PRINT "Here are the results: "
  14.  
  15. 'declare Text Window size
  16. TextLines = 10: TextCols = 64
  17. Xwindow = 3: Ywindow = 10
  18.  
  19. 'declare buffer area to hold text
  20. Buffer$ = SPACE$(TextLines * TextCols)
  21.  
  22. ' call text window
  23. ExitOK = TextWindow(Buffer$, TextLines, TextCols,_
  24.                               Xwindow, Ywindow)
  25. IF ExitOK THEN
  26.  PRINT Buffer$
  27. ELSE
  28.  PRINT "Window not Saved"
  29. END IF
  30.  
  31. END
  32.  
  33. SUB MakeBox (x, y, Lines, Columns)
  34. ' Draw a single line box beginning at X,Y
  35. ' box is Lines tall by Columns wide
  36. DEFINT A-Z
  37.  
  38. ' top row
  39. LOCATE x, y, 0
  40. PRINT CHR$(218);
  41. PRINT STRING$(Columns - 2, CHR$(196));
  42. PRINT CHR$(191)
  43.  
  44. 'bottom row
  45. LOCATE x + Lines - 1, y, 0
  46. PRINT CHR$(192);
  47. PRINT STRING$(Columns - 2, CHR$(196));
  48. PRINT CHR$(217)
  49.  
  50. 'sides
  51. FOR I = 1 TO Lines - 2
  52.    LOCATE x + I, y, 0: PRINT CHR$(179)
  53.    LOCATE x + I, y + Columns - 1, 0
  54.    PRINT CHR$(179)
  55. NEXT I
  56.  
  57. END SUB
  58.  
  59. FUNCTION TextWindow (Buffer$, Lines, Columns,_
  60.                            Xwindow, Ywindow)
  61. ' This function allows the user to key in a window
  62. ' of text the input area will be Lines by Columns
  63. ' in size.  xwindow and ywindow are the upper left
  64. ' corner coordinates of text entry window
  65. ' The text is placed in Buffer$
  66. ' returns TRUE if user saves with Ctrl-End,
  67. ' FALSE on Esc
  68.  
  69. 'save cursor position
  70. SaveX = CSRLIN: SaveY = POS(0)
  71.  
  72. ' Scan codes for current valid user key-strokes
  73. ScanKeyhome = 71
  74. ScanKeyend = 79
  75. ScanKeyup = 72
  76. ScanKeyleft = 75
  77. ScanKeyright = 77
  78. ScanKeydown = 80
  79. ScanKeyctrlleft = 115
  80. ScanKeyctrlright = 116
  81. ScanKeyinsert = 82
  82. ScanKeydelete = 83
  83. ScanKeyctrlend = 117
  84. ScanKeyenter = 13
  85. ScanKeyescape = 27
  86. ScanKeybackspace = 8
  87.  
  88. 'Start with insert mode turned off
  89. FALSE = 0
  90. TRUE = NOT FALSE
  91. inserton = FALSE
  92.  
  93. ' Draw box around text, display marquis
  94. CALL MakeBox(Xwindow - 1, Ywindow - 1, Lines + 3,_
  95.                                     Columns + 2)
  96. LOCATE Xwindow + Lines, Ywindow + 1, 0
  97. PRINT "[Esc] to Abort,[Ctrl-End] to Save"
  98.  
  99. 'Current X,Y Coordinates of cursor within window
  100. XCoord = Xwindow: YCoord = Ywindow
  101.  
  102. 'start taking text in top left corner
  103. LOCATE XCoord, YCoord, 1
  104.  
  105. 'main user input loop
  106. DO
  107.   UserKey$ = INKEY$
  108.   SELECT CASE LEN(UserKey$)
  109.     CASE 2 'two-byte scan codes
  110.       SELECT CASE ASC(RIGHT$(UserKey$, 1))
  111.         CASE ScanKeyhome
  112.           XCoord = Xwindow: YCoord = Ywindow
  113.         CASE ScanKeyend
  114.           XCoord = Xwindow + Lines - 1
  115.           YCoord = Ywindow + Columns - 1
  116.         CASE ScanKeyup
  117.           IF XCoord > Xwindow THEN
  118.             XCoord = XCoord - 1
  119.           END IF
  120.         CASE ScanKeyleft
  121.           IF YCoord > Ywindow THEN
  122.             YCoord = YCoord - 1
  123.           END IF
  124.         CASE ScanKeyright
  125.           IF YCoord < Ywindow + Columns - 1 THEN
  126.             YCoord = YCoord + 1
  127.           END IF
  128.         CASE ScanKeydown
  129.           IF XCoord < Xwindow + Lines - 1 THEN
  130.             XCoord = XCoord + 1
  131.           END IF
  132.         CASE ScanKeyctrlleft
  133.           GOSUB LeftWord
  134.         CASE ScanKeyctrlright
  135.           GOSUB RightWord
  136.         CASE ScanKeyinsert
  137.           inserton = NOT inserton
  138.           LOCATE 25, 50, 0
  139.           IF inserton THEN
  140.             PRINT "Insert mode";
  141.           ELSE
  142.             PRINT SPACE$(11);
  143.           END IF
  144.         CASE ScanKeydelete
  145.           GOSUB MoveLeft
  146.         CASE ScanKeyctrlend
  147.           TextWindow = TRUE
  148.           EXIT DO
  149.         CASE ELSE
  150.           PRINT ASC(RIGHT$(UserKey$, 1))
  151.       END SELECT
  152.       LOCATE XCoord, YCoord, 1
  153.     CASE 1 'single-character scan codes
  154.       SELECT CASE ASC(UserKey$)
  155.         CASE ScanKeyenter
  156.           IF XCoord < Lines + Xwindow - 1 THEN
  157.             XCoord = XCoord + 1
  158.           END IF
  159.           YCoord = Ywindow
  160.           LOCATE XCoord, YCoord, 1
  161.         CASE ScanKeyescape
  162.           TextWindow = FALSE
  163.           EXIT DO
  164.         CASE ScanKeybackspace
  165.           IF YCoord > Ywindow THEN
  166.             YCoord = YCoord - 1
  167.             GOSUB MoveLeft
  168.           END IF
  169.           LOCATE XCoord, YCoord, 1
  170.         CASE ELSE
  171.           IF inserton THEN
  172.             GOSUB MoveRight
  173.           END IF
  174.           GOSUB UpdateBuffer
  175.           LOCATE XCoord, YCoord, 1
  176.           PRINT UserKey$;
  177.           IF YCoord < Columns + Ywindow - 1 THEN
  178.             YCoord = YCoord + 1
  179.           END IF
  180.       END SELECT
  181.     END SELECT
  182. LOOP
  183. 'End of main user input loop
  184.  
  185. 'restore cursor position
  186. LOCATE SaveX, SaveY, 1
  187. EXIT FUNCTION
  188.  
  189. UpdateBuffer:
  190. ' put the character typed into the string buffer
  191.    GOSUB ComputeBufPosn
  192.    MID$(Buffer$, BufPosn, 1) = UserKey$
  193. RETURN
  194.  
  195. MoveLeft:
  196. ' move characters left on delete or backspace
  197.    SaveYCoord = YCoord
  198.    FOR YCoord = SaveYCoord + 1 TO_
  199.                 Ywindow + Columns - 1 STEP 1
  200.       GOSUB ComputeBufPosn
  201.       OldChar$ = MID$(Buffer$, BufPosn, 1)
  202.       LOCATE XCoord, YCoord - 1, 0
  203.       PRINT OldChar$;
  204.       MID$(Buffer$, BufPosn - 1, 1) = OldChar$
  205.    NEXT YCoord
  206.    MID$(Buffer$, BufPosn, 1) = " "
  207.    LOCATE XCoord, YCoord - 1, 1
  208.    PRINT " "
  209.    YCoord = SaveYCoord
  210.    GOSUB ComputeBufPosn
  211. RETURN
  212.  
  213. MoveRight:
  214. ' move characters right on insert
  215.    SaveYCoord = YCoord
  216.    FOR YCoord = Ywindow + Columns - 2 TO_
  217.                          YCoord STEP -1
  218.       GOSUB ComputeBufPosn
  219.       OldChar$ = MID$(Buffer$, BufPosn, 1)
  220.       LOCATE XCoord, YCoord + 1, 0
  221.       PRINT OldChar$;
  222.       MID$(Buffer$, BufPosn + 1, 1) = OldChar$
  223.    NEXT YCoord
  224.    YCoord = SaveYCoord
  225.    GOSUB ComputeBufPosn
  226.    MID$(Buffer$, BufPosn, 1) = " "
  227.    LOCATE XCoord, YCoord, 1
  228.    PRINT " ";
  229. RETURN
  230.  
  231. LeftWord:
  232. 'Find the next word to the left
  233.    GOSUB ComputeBufPosn
  234.    IF BufPosn > 1 THEN BufPosn = BufPosn - 1
  235.    CharsSeen = FALSE
  236.    WordFound = FALSE
  237.    DO
  238.       ThisChar$ = MID$(Buffer$, BufPosn, 1)
  239.       CharsSeen = CharsSeen OR (ThisChar$ <> " ")
  240.       IF CharsSeen AND (ThisChar$ = " ") THEN
  241.          WordFound = TRUE
  242.       ELSE
  243.          BufPosn = BufPosn - 1
  244.       END IF
  245.    LOOP UNTIL WordFound OR BufPosn = 0
  246.    GOSUB ComputeCoords
  247.    LOCATE XCoord, YCoord, 1
  248. RETURN
  249.  
  250. RightWord:
  251. 'Find the next word to the right
  252.    GOSUB ComputeBufPosn
  253.    SpacesSeen = FALSE
  254.    WordFound = FALSE
  255.    DO
  256.       ThisChar$ = MID$(Buffer$, BufPosn, 1)
  257.       SpacesSeen = SpacesSeen OR (ThisChar$ = " ")
  258.       IF SpacesSeen AND (ThisChar$ <> " ") THEN
  259.          WordFound = TRUE
  260.       ELSE
  261.          IF BufPosn < Lines * Columns THEN_
  262.                     BufPosn = BufPosn + 1
  263.       END IF
  264.    LOOP UNTIL WordFound OR_
  265.      BufPosn = Lines * Columns
  266.    BufPosn = BufPosn - 1
  267.    GOSUB ComputeCoords
  268.    LOCATE XCoord, YCoord, 1
  269. RETURN
  270.  
  271. ComputeBufPosn:
  272. ' Compute current position within buffer
  273.    BufPosn = ((XCoord - Xwindow) * Columns) +_
  274.                         YCoord - Ywindow + 1
  275. RETURN
  276.  
  277. ComputeCoords:
  278. 'Compute screen Coordinates of relative BufPosn
  279.    XCoord = Xwindow + INT(BufPosn / Columns)
  280.    YCoord = Ywindow + (BufPosn MOD Columns)
  281. RETURN
  282.  
  283. END FUNCTION
  284.  
  285.