home *** CD-ROM | disk | FTP | other *** search
/ Amiga Elysian Archive / AmigaElysianArchive.iso / bus_pers / bspread.lha / BSpread.bas next >
BASIC Source File  |  1988-05-12  |  30KB  |  993 lines

  1. ' "BSpread" - an AmigaBasic(tm) Spread Sheet;
  2. ' Written  for  'Amazing Computing'  Magazine
  3. '      by Bryan D. Catley,  August 1987
  4. ' -------------------------------------------
  5. '
  6. '    Copyright (c) 1987 by FelineSystems.
  7. '           All rights reserved.
  8. '
  9. '
  10. '*********************************************************
  11. '*                                                       *
  12. '* Using BSpread with AC/BASIC:                          *
  13. '* ----------------------------                          *
  14. '*                                                       *
  15. '* To compile BSpread, you must switch on the N & A      *
  16. '* options.  The N option is for runtime event detection *
  17. '* and the A option is for Long Addressing.              *
  18. '*                                                       *
  19. '*********************************************************
  20. '
  21. CLEAR ,25000:CLEAR ,105000&:OPTION BASE 1
  22. MaxCol=40:MaxRow=50:CWidth=10:NumCols=7:Yes=0
  23. Blk=0:Gra=1:Mag=2:Yel=3:m0=0:menuID=0:menuIT=0
  24. n=0:x=0:y=0:z=0:rowtop=0:colleft=0:oldtop=0:oldleft=0
  25. StartCol=1:EndCol=7:ColLite=0:FirstCol=40:LastCol=600
  26. StartRow=1:EndRow=19:RowLite=0:FirstRow=32:LastRow=184
  27. ErrSw=0:RelSw=0:Total=0:CellMgmt=0:Holding=0:HoldCols=0
  28. TempCol=0:TempRow=0:NoGdgt=0:AllOK=-1:Saved=-1
  29. x%=0:row%=0:col%=0:PrintCol%=6:PrintRow%=5
  30. CellValue$="":TypeFlag$="":Response$="":Cell$=""
  31. TempCol$="":TempRow$="":Prompt$="":Prompt2$=""
  32. a$="":b$="":x$="":y$="":z$="":FileNm$="":TxtNm$=""
  33. Formula$="":ErrMsg$="":op$="":ops$="+-*/!"
  34. Mask$="################.##-":Key$=""
  35. DIM IPcursor%(20),CellLite%(165)
  36. DIM ColHdg$(MaxCol),BSpread$(MaxCol,MaxRow,2),MKeys$(2)
  37. GOSUB Initialize:ON ERROR GOTO BasicError
  38. WHILE MOUSE(0)=0:WEND:WHILE MOUSE(0)<>0:WEND
  39. LINE(40,32)-STEP(560,152),Gra,bf
  40.  
  41. WaitForUser:
  42. IF ErrSw=0 THEN 
  43.   COLOR Mag,Blk:LOCATE 2,1
  44.   PRINT"Use Project Menus or Select a Cell.";SPACE$(33);
  45. END IF
  46. m0=0:menuID=0:menuIT=0:Key$="":ErrSw=0
  47. MKeys$(1)="LSATPQ":MKeys$(2)="CG"
  48. WHILE m0=0 AND menuID=0 AND Key$=""
  49.   x=MOUSE(1):y=MOUSE(2)
  50.   IF x>FirstCol AND x<LastCol AND y>FirstRow AND y<LastRow THEN
  51.     GOSUB MouseOK
  52.   ELSE
  53.     IF oldtop<>0 THEN PUT(oldleft,oldtop),CellLite%
  54.     oldtop=0:rowtop=0:oldleft=0:colleft=0
  55.   END IF
  56.   m0=MOUSE(0):menuID=MENU(0):menuIT=MENU(1):Key$=INKEY$
  57. WEND
  58. IF Key$<>"" THEN
  59.   FOR n=1 TO 2
  60.     x=INSTR(MKeys$(n),UCASE$(Key$))
  61.     IF x<>0 THEN menuID=n:menuIT=x:n=2
  62.   NEXT
  63. END IF
  64. IF menuID<>0 THEN ON menuID GOTO ProjMgmtI,ProjMgmtII
  65. x=MOUSE(1):y=MOUSE(2):WHILE MOUSE(0)<>0:WEND
  66. IF x>40 AND x<600 AND y>16 AND y<24 THEN NewColumn
  67. IF x>4 AND x<16 AND y>29 AND y<179 THEN NewRow
  68. IF x<FirstCol OR x>600 OR y<FirstRow OR y>184 THEN WaitForUser
  69.  
  70. CellSelected:
  71. CellCol=INT((x-FirstCol)/(CWidth*8)+StartCol)
  72. CellRow=INT((y-FirstRow)/8+StartRow)
  73. MENU 1,0,0:MENU 2,0,0:MENU 3,0,1:MENU 4,0,1
  74. CellMgmt=-1
  75. NewCellSelection:
  76. COLOR Mag,Blk:LOCATE 2,1
  77. PRINT"Use Cell Menus or Click in Another Cell.";SPACE$(28);
  78. m0=0:menuID=0:menuIT=0:Key$="":MKeys$(1)="DF$$$$$$GX":MKeys$(2)=""
  79. WHILE m0=0 AND menuID=0 AND Key$=""
  80.   m0=MOUSE(0):menuID=MENU(0):menuIT=MENU(1):Key$=INKEY$
  81. WEND
  82. IF Key$<>"" THEN
  83.   x=INSTR(MKeys$(1),UCASE$(Key$))
  84.   IF x<>0 THEN menuID=3:menuIT=x
  85. END IF
  86. IF menuID<>0 THEN
  87.   ON menuID-2 GOTO CellMgmtI,CellMgmtII
  88. ELSE
  89.   x=MOUSE(1):y=MOUSE(2):WHILE MOUSE(0)<>0:WEND
  90.   IF x>40 AND x<600 AND y>16 AND y<24 THEN NewColumn
  91.   IF x>4 AND x<16 AND y>29 AND y<179 THEN NewRow
  92.   IF x>FirstCol AND x<LastCol AND y>FirstRow AND y<LastRow THEN
  93.     GOSUB MouseOK:GOTO CellSelected
  94.   ELSE
  95.     GOTO NewCellSelection
  96.   END IF
  97. END IF
  98.  
  99. NewColumn:
  100. StartCol=INT((x-40)/14)+1:LastCol=600
  101. IF StartCol+NumCols>MaxCol THEN
  102.   LastCol=((MaxCol+1-StartCol)*(CWidth*8))+40
  103. END IF
  104. GOSUB DoColHdg:GOSUB ShoData
  105. IF CellMgmt THEN CellSelected ELSE WaitForUser
  106.  
  107. NewRow:
  108. StartRow=INT((y-29)/3)+1:LastRow=184
  109. IF StartRow+19>MaxRow THEN LastRow=((MaxRow+1-StartRow)*8)+32
  110. GOSUB DoRowHdg:GOSUB ShoData:
  111. IF CellMgmt THEN CellSelected ELSE WaitForUser
  112.  
  113. CellMgmtI:
  114. ON menuIT GOTO CellData,CellFormula,ZeroCell,BlankCell,CopyCell
  115. ON menuIT-5 GOTO MoveCell,PropRight,PropDown,CMGoTo,CellExit
  116.  
  117. CellData:
  118. CellValue$=BSpread$(CellCol,CellRow,1)
  119. TypeFlag$=BSpread$(CellCol,CellRow,2)
  120. COLOR Gra,Blk:LOCATE 2,1:PRINT SPACE$(68)
  121. LOCATE 2,1:PRINT"New Cell Value? ";
  122. x%=CWidth:GetData CellValue$,"CHAR",x%
  123. IF CellValue$<>"" THEN
  124.   BSpread$(CellCol,CellRow,1)=CellValue$
  125.   BSpread$(CellCol,CellRow,2)=TypeFlag$
  126. ELSE
  127.   BSpread$(CellCol,CellRow,1)=""
  128.   BSpread$(CellCol,CellRow,2)=""
  129. END IF
  130. GOSUB PrintCell:GOTO CellChanged
  131.  
  132. CellFormula:
  133. CellValue$=MID$(BSpread$(CellCol,CellRow,2),2)
  134. COLOR Gra,Blk:LOCATE 2,1:PRINT SPACE$(68)
  135. LOCATE 2,1:PRINT"New Formula? ";
  136. GetData CellValue$,"CHAR",53:CellValue$=UCASE$(CellValue$)
  137. IF CellValue$<>"" THEN
  138.   BSpread$(CellCol,CellRow,2)="F"+CellValue$
  139.   BSpread$(CellCol,CellRow,1)=STRING$(CWidth,"*")
  140. ELSE
  141.   BSpread$(CellCol,CellRow,1)=""
  142.   BSpread$(CellCol,CellRow,2)=""
  143. END IF
  144. GOSUB PrintCell:GOTO CellChanged
  145.  
  146. ZeroCell:
  147. BSpread$(CellCol,CellRow,1)="0"
  148. BSpread$(CellCol,CellRow,2)="N"
  149. GOSUB PrintCell:GOTO CellChanged
  150.  
  151. BlankCell:
  152. BSpread$(CellCol,CellRow,1)=""
  153. BSpread$(CellCol,CellRow,2)=""
  154. GOSUB PrintCell:GOTO CellChanged
  155.  
  156. CopyCell:
  157. MoveCell:
  158. Prompt$="Target Cell? ":GOSUB GetCellNum
  159. BSpread$(TempCol,TempRow,1)=BSpread$(CellCol,CellRow,1)
  160. BSpread$(TempCol,TempRow,2)=BSpread$(CellCol,CellRow,2)
  161. IF menuIT=6 THEN
  162.   BSpread$(CellCol,CellRow,1)="":GOSUB PrintCell
  163.   BSpread$(CellCol,CellRow,2)=""
  164. END IF
  165. IF TempCol>=StartCol AND TempCol<=EndCol THEN
  166.   IF TempRow>=StartRow AND TempRow<=EndRow THEN
  167.     IF menuIT=6 THEN GOSUB PrintCell
  168.     x=CellCol:y=CellRow:CellCol=TempCol:CellRow=TempRow
  169.     GOSUB PrintCell:CellCol=x:CellRow=y
  170.   END IF
  171. END IF
  172. GOTO CellChanged
  173.  
  174. PropRight:
  175. COLOR Gra,Blk:LOCATE 2,1:PRINT SPACE$(68)
  176. LOCATE 2,1:PRINT"Number of Columns? ";
  177. Response$="":GetData Response$,"INT",2:y=VAL(Response$)
  178. IF Response$<>"" THEN
  179.   IF CellCol+y>MaxCol THEN y=MaxCol-CellCol
  180.   FOR x=CellCol+1 TO CellCol+y
  181.     BSpread$(x,CellRow,1)=BSpread$(CellCol,CellRow,1)
  182.     BSpread$(x,CellRow,2)=BSpread$(CellCol,CellRow,2)
  183.   NEXT
  184.   y=y+EndCol:IF y>EndCol THEN y=EndCol
  185.   x=CellCol:FOR CellCol=x+1 TO y:GOSUB PrintCell:NEXT
  186.   CellCol=x
  187. END IF
  188. GOTO CellChanged
  189.  
  190. PropDown:
  191. COLOR Gra,Blk:LOCATE 2,1:PRINT SPACE$(68)
  192. LOCATE 2,1:PRINT"Number of Rows? ";
  193. Response$="":GetData Response$,"INT",2:y=VAL(Response$)
  194. IF Response$<>"" THEN
  195.   IF CellRow+y>MaxRow THEN y=MaxRow-CellRow
  196.   FOR x=CellRow+1 TO CellRow+y
  197.     BSpread$(CellCol,x,1)=BSpread$(CellCol,CellRow,1)
  198.     BSpread$(CellCol,x,2)=BSpread$(CellCol,CellRow,2)
  199.   NEXT
  200.   y=CellRow+y:IF y>EndRow THEN y=EndRow
  201.   x=CellRow:FOR CellRow=x+1 TO y:GOSUB PrintCell:NEXT
  202.   CellRow=x
  203. END IF
  204. GOTO CellChanged
  205.  
  206. CMGoTo:
  207. GOSUB GoToCell:GOTO NewCellSelection
  208.  
  209. CellMgmtII:
  210. ON menuIT GOTO ZeroCol,ZeroRow,BlankCol,BlankRow,InsertCol
  211. ON menuIT-5 GOTO InsertRow,RemoveCol,RemoveRow
  212.  
  213. ZeroCol:
  214. BlankCol:
  215. COLOR Mag,Blk:LOCATE 2,1:PRINT SPACE$(68)
  216. IF menuIT=1 THEN Prompt$="  Ok to zero":Prompt2$=" this column?"
  217. IF menuIT=1 THEN a$="N":b$="0"
  218. IF menuIT=3 THEN Prompt$="  Ok to blank":Prompt2$=" this column?"
  219. IF menuIT=3 THEN a$="C":b$=""
  220. GOSUB YesNo:IF NOT Yes THEN NewCellSelection
  221. IF menuIT=1 THEN LOCATE 2,1:PRINT"Zeroing column..."
  222. IF menuIT=3 THEN LOCATE 2,1:PRINT"Blanking column..."
  223. FOR TempRow=1 TO MaxRow
  224.   IF BSpread$(CellCol,TempRow,2)=a$ THEN
  225.     BSpread$(CellCol,TempRow,1)=b$
  226.     x=CellRow:CellRow=TempRow:GOSUB PrintCell:CellRow=x
  227.     IF menuIT=3 THEN BSpread$(CellCol,TempRow,2)=""
  228.   END IF
  229. NEXT
  230. GOTO CellChanged
  231.  
  232. ZeroRow:
  233. BlankRow:
  234. COLOR Mag,Blk:LOCATE 2,1:PRINT SPACE$(68)
  235. IF menuIT=2 THEN Prompt$="  Ok to zero":Prompt2$="   this row?"
  236. IF menuIT=2 THEN a$="N":b$="0"
  237. IF menuIT=4 THEN Prompt$="  Ok to blank":Prompt2$="  this row?"
  238. IF menuIT=4 THEN a$="C":b$=""
  239. GOSUB YesNo:IF NOT Yes THEN NewCellSelection
  240. IF menuIT=2 THEN LOCATE 2,1:PRINT"Zeroing column..."
  241. IF menuIT=4 THEN LOCATE 2,1:PRINT"Blanking column..."
  242. FOR TempCol=1 TO MaxCol
  243.   IF BSpread$(TempCol,CellRow,2)=a$ THEN
  244.     BSpread$(TempCol,CellRow,1)=b$
  245.     x=CellCol:CellCol=TempCol:GOSUB PrintCell:CellCol=x 
  246.     IF menuIT=4 THEN BSpread$(TempCol,CellRow,2)=""   
  247.   END IF
  248. NEXT
  249. GOTO CellChanged
  250.  
  251. InsertCol:
  252. COLOR Mag,Blk:LOCATE 2,1:PRINT SPACE$(68)
  253. Prompt$="  Ok to loose":Prompt2$="  column  NN?"
  254. GOSUB YesNo:IF NOT Yes THEN NewCellSelection
  255. COLOR Gra,Blk:LOCATE 2,1:PRINT"Inserting column..."
  256. IF CellCol<MaxCol THEN
  257.   FOR TempCol=MaxCol-1 TO CellCol STEP -1
  258.     FOR TempRow=1 TO MaxRow
  259.       BSpread$(TempCol+1,TempRow,1)=BSpread$(TempCol,TempRow,1)
  260.       BSpread$(TempCol+1,TempRow,2)=BSpread$(TempCol,TempRow,2)
  261.     NEXT
  262.   NEXT
  263. END IF
  264. FOR TempRow=1 TO MaxRow
  265.   BSpread$(CellCol,TempRow,1)=""
  266.   BSpread$(CellCol,TempRow,2)=""
  267. NEXT
  268. GOSUB ShoData:GOTO CellChanged
  269.  
  270. InsertRow:
  271. COLOR Mag,Blk:LOCATE 2,1:PRINT SPACE$(68)
  272. Prompt$="  Ok to loose":Prompt2$="    row 50?"
  273. GOSUB YesNo:IF NOT Yes THEN NewCellSelection
  274. COLOR Gra,Blk:LOCATE 2,1:PRINT"Inserting row..."
  275. IF CellRow<MaxRow THEN
  276.   FOR TempCol=1 TO MaxCol
  277.     FOR TempRow=MaxRow-1 TO CellRow STEP -1
  278.       BSpread$(TempCol,TempRow+1,1)=BSpread$(TempCol,TempRow,1)
  279.       BSpread$(TempCol,TempRow+1,2)=BSpread$(TempCol,TempRow,2)
  280.     NEXT
  281.   NEXT
  282. END IF
  283. FOR TempCol=1 TO MaxCol
  284.   BSpread$(TempCol,CellRow,1)=""
  285.   BSpread$(TempCol,CellRow,2)=""
  286. NEXT
  287. GOSUB ShoData:GOTO CellChanged
  288.  
  289. RemoveCol:
  290. COLOR Gra,Blk:LOCATE 2,1:PRINT SPACE$(68)
  291. Prompt$=" OK to delete":Prompt2$="current column?"
  292. GOSUB YesNo:IF NOT Yes THEN NewCellSelection
  293. LOCATE 2,1:PRINT"Deleting column..."
  294. IF CellCol<MaxCol THEN
  295.   FOR TempCol=CellCol TO MaxCol-1
  296.     FOR TempRow=1 TO MaxRow
  297.       BSpread$(TempCol,TempRow,1)=BSpread$(TempCol+1,TempRow,1)
  298.       BSpread$(TempCol,TempRow,2)=BSpread$(TempCol+1,TempRow,2)
  299.     NEXT
  300.   NEXT
  301. END IF
  302. FOR TempRow=1 TO MaxRow
  303.   BSpread$(MaxCol,TempRow,1)="":BSpread$(MaxCol,TempRow,2)=""
  304. NEXT
  305. GOSUB ShoData:GOTO CellChanged
  306.  
  307. RemoveRow:
  308. COLOR Gra,Blk:LOCATE 2,1:PRINT SPACE$(68)
  309. Prompt$=" OK to delete":Prompt2$=" current row?"
  310. GOSUB YesNo:IF NOT Yes THEN NewCellSelection
  311. LOCATE 2,1:PRINT"Deleting row..."
  312. IF CellRow<MaxRow THEN
  313.   FOR TempCol=1 TO MaxCol
  314.     FOR TempRow=CellRow TO MaxRow-1
  315.       BSpread$(TempCol,TempRow,1)=BSpread$(TempCol,TempRow+1,1)
  316.       BSpread$(TempCol,TempRow,2)=BSpread$(TempCol,TempRow+1,2)
  317.     NEXT
  318.   NEXT
  319. END IF
  320. FOR TempCol=1 TO MaxCol
  321.   BSpread$(TempCol,MaxRow,1)="":BSpread$(TempCol,MaxRow,2)=""
  322. NEXT
  323. GOSUB ShoData:GOTO CellChanged
  324.  
  325. CellChanged:
  326. Saved=0:LINE(609,9)-STEP(6,6),Mag,bf
  327. GOTO NewCellSelection
  328.  
  329. CellExit:
  330. IF NOT Holding THEN MENU 1,0,1
  331. MENU 2,0,1:MENU 3,0,0:MENU 4,0,0
  332. CellMgmt=0:GOTO WaitForUser
  333.  
  334. ProjMgmtI:
  335. ON menuIT GOTO LodSheet,SvSheet,SvSheetAs,SvTxt,prStart,Xit
  336.  
  337. LodSheet:
  338. IF NOT Saved THEN
  339.   Prompt$="Sheet not saved":Prompt2$="   Continue?"
  340.   GOSUB YesNo:IF NOT Yes THEN WaitForUser
  341. END IF
  342. COLOR Gra,Blk:LOCATE 2,1:PRINT SPACE$(68)
  343. LOCATE 2,1:PRINT"Load sheet? ";
  344. LSget:
  345. COLOR Gra,Blk:LOCATE 2,13:GetData FileNm$,"CHAR",39
  346. IF FileNm$="" THEN WaitForUser
  347. IF RIGHT$(FileNm$,4)<>".bsp" THEN FileNm$=FileNm$+".bsp"
  348. OPEN FileNm$ FOR INPUT AS #1
  349. AfterOpen:
  350. IF ErrSw=1 THEN ErrSw=0:GOTO LSget
  351. LOCATE 2,1:PRINT SPACE$(68)
  352. LOCATE 2,1:PRINT"Loading sheet ";FileNm$
  353. INPUT#1,CWidth,NumCols,StartCol,EndCol
  354. INPUT#1,LastCol,StartRow,EndRow,LastRow
  355. INPUT#1,Mask$
  356. FOR TempCol=1 TO MaxCol
  357.   FOR TempRow=1 TO MaxRow
  358.     INPUT#1,BSpread$(TempCol,TempRow,1)
  359.     INPUT#1,BSpread$(TempCol,TempRow,2)
  360.   NEXT
  361. NEXT
  362. CLOSE #1:GOSUB DoColHdg:GOSUB DoRowHdg
  363. MENU 2,5,1:MENU 2,6,1:MENU 2,7,1:MENU 2,8,1
  364. x=CWidth/5+4:MENU 2,x,2
  365. Saved=-1:LINE(609,9)-STEP(6,6),Blk,bf:COLOR Yel,Blk
  366. LOCATE 1,16:PRINT RIGHT$(FileNm$,52);SPACE$(52-LEN(FileNm$))
  367. IF MID$(Mask$,17,1)="." THEN TwoDec ELSE NoDec
  368.  
  369. SvSheet:
  370. SvSheetAs:
  371. COLOR Gra,Blk:LOCATE 2,1:PRINT SPACE$(68)
  372. IF FileNm$="" OR menuIT=3 THEN
  373.   LOCATE 2,1:PRINT"Save as sheet? ";
  374.   GetData FileNm$,"CHAR",50
  375. END IF
  376. IF FileNm$="" THEN WaitForUser
  377. IF RIGHT$(FileNm$,4)<>".bsp" THEN FileNm$=FileNm$+".bsp"
  378. LOCATE 2,1:PRINT SPACE$(68)
  379. LOCATE 2,1:PRINT"Saving sheet ";FileNm$
  380. OPEN FileNm$ FOR OUTPUT AS #1
  381. WRITE#1,CWidth,NumCols,StartCol,EndCol
  382. WRITE#1,LastCol,StartRow,EndRow,LastRow
  383. WRITE#1,Mask$
  384. FOR TempCol=1 TO MaxCol
  385.   FOR TempRow=1 TO MaxRow
  386.     WRITE#1,BSpread$(TempCol,TempRow,1)
  387.     WRITE#1,BSpread$(TempCol,TempRow,2)
  388.   NEXT
  389. NEXT
  390. CLOSE #1:Saved=-1:COLOR Yel,Blk
  391. LOCATE 1,16:PRINT RIGHT$(FileNm$,52);SPACE$(52-LEN(FileNm$))
  392. GOTO WaitForUser
  393.  
  394. SvTxt:
  395. prStart:
  396. COLOR Gra,Blk:LOCATE 2,1:PRINT SPACE$(68):z$=""
  397. LOCATE 2,1:PRINT"Number of columns? ";:GetData z$,"INT",1
  398. z=VAL(z$):LOCATE 2,1:PRINT SPACE$(68)
  399. IF z>NumCols OR z<1 THEN z=NumCols
  400. IF menuIT=4 THEN
  401.   LOCATE 2,1:PRINT"Save as text file? ";
  402.   GetData TxtNm$,"CHAR",48
  403.   IF TxtNm$="" THEN WaitForUser
  404.   IF RIGHT$(TxtNm$,4)<>".txt" THEN TxtNm$=TxtNm$+".txt"
  405.   LOCATE 2,1:PRINT SPACE$(68)
  406.   LOCATE 2,1:PRINT"Saving text file ";TxtNm$
  407.   OPEN TxtNm$ FOR OUTPUT AS #1
  408. ELSE
  409.   LOCATE 2,1:PRINT"Printing sheet..."
  410. END IF
  411. FOR y=1 TO MaxRow
  412.   FOR x=StartCol TO StartCol+z-1
  413.     x$=BSpread$(x,y,1)
  414.     y$=LEFT$(BSpread$(x,y,2),1)
  415.     IF (y$="N" OR y$="F") AND LEN(x$)>CWidth THEN
  416.       x$="*LEN*"+STRING$(CWidth-5,"*")
  417.     END IF     
  418.     n=CWidth-LEN(x$):IF n<0 THEN n=0
  419.     IF y$="C" OR y$="" OR LEFT$(x$,1)="*" THEN
  420.       IF menuIT=4 THEN 
  421.         PRINT#1,x$;SPACE$(n);
  422.       ELSE
  423.         LPRINT x$+SPACE$(n);
  424.       END IF
  425.     ELSE
  426.       IF menuIT=4 THEN
  427.         PRINT#1,USING RIGHT$(Mask$,CWidth);VAL(x$);
  428.       ELSE
  429.         LPRINT USING RIGHT$(Mask$,CWidth);VAL(x$);
  430.       END IF
  431.     END IF
  432.   NEXT
  433.   IF menuIT=4 THEN PRINT#1," " ELSE LPRINT " "
  434. NEXT
  435. IF menuIT=4 THEN CLOSE#1
  436. GOTO WaitForUser
  437.  
  438. ProjMgmtII:
  439. ON menuIT GOTO Calculate,PRGoTo,ClrSheet,ResetSheet,CSz5
  440. ON menuIT-5 GOTO CSz10,CSz15,CSz20,TwoDec,NoDec,HoldRlse
  441. ON menuIT-11 GOTO Template
  442.  
  443. Calculate:
  444. COLOR Gra,Blk:LOCATE 2,1:PRINT"Calculating...";SPACE$(54);
  445. FOR CellRow=1 TO MaxRow
  446.   FOR CellCol=1 TO MaxCol
  447.     IF LEFT$(BSpread$(CellCol,CellRow,2),1)="F" THEN
  448.       Formula$=MID$(BSpread$(CellCol,CellRow,2),2)
  449.       Total=0:ErrSw=0
  450.       IF Formula$="TOTCOL" THEN
  451.         GOSUB TotalCols
  452.       ELSEIF Formula$="TOTROW" THEN
  453.         GOSUB TotalRows
  454.       ELSEIF Formula$<>"" THEN
  455.         GOSUB Evaluate
  456.       END IF
  457.       IF LEN(STR$(Total))>CWidth THEN
  458.         ErrMsg$="Result too big!":ErrSw=1
  459.       END IF
  460.       IF ErrSw=1 THEN
  461.         BEEP:COLOR Mag,Blk:LOCATE 2,1:PRINT SPACE$(68)
  462.         LOCATE 2,67-LEN(ErrMsg$):PRINT ErrMsg$
  463.       END IF
  464.     END IF
  465.   NEXT 
  466. NEXT
  467. GOTO CalcXit
  468.  
  469. TotalCols:
  470. IF CellRow=1 THEN
  471.   BSpread$(CellCol,CellRow,1)="0"
  472. ELSE
  473.   FOR y=1 TO CellRow-1
  474.     IF LEFT$(BSpread$(CellCol,y,2),1)="N" THEN
  475.       Total=Total+VAL(BSpread$(CellCol,y,1))
  476.     ELSEIF LEFT$(BSpread$(CellCol,y,2),1)="F" THEN
  477.       IF LEFT$(BSpread$(CellCol,y,1),1)<>"*" THEN
  478.         Total=Total+VAL(BSpread$(CellCol,y,1))
  479.       END IF
  480.     END IF
  481.   NEXT
  482. END IF
  483. BSpread$(CellCol,CellRow,1)=STR$(Total):GOSUB PrintCell
  484. RETURN
  485.  
  486. TotalRows:
  487. IF CellCol=1 THEN
  488.   BSpread$(CellCol,CellRow,1)="0"
  489. ELSE
  490.   FOR x=1 TO CellCol-1
  491.     IF LEFT$(BSpread$(x,CellRow,2),1)="N" THEN
  492.       Total=Total+VAL(BSpread$(x,CellRow,1))
  493.     ELSEIF LEFT$(BSpread$(x,CellRow,2),1)="F" THEN
  494.       IF LEFT$(BSpread$(x,CellRow,1),1)<>"*" THEN
  495.         Total=Total+VAL(BSpread$(x,CellRow,1))
  496.       END IF
  497.     END IF
  498.   NEXT
  499. END IF
  500. BSpread$(CellCol,CellRow,1)=STR$(Total):GOSUB PrintCell
  501. RETURN
  502.  
  503. Evaluate:
  504. op$="+":CellValue$="":Formula$=Formula$+"!"
  505. FOR x=1 TO LEN(Formula$)
  506.   x$=MID$(Formula$,x,1):y=INSTR(ops$,x$)
  507.   IF (x$="[" OR RelSw=1) THEN
  508.     RelSw=1:CellValue$=CellValue$+x$
  509.     IF x$="]" THEN RelSw=0
  510.   ELSEIF (y=0) OR (y<>0 AND CellValue$="") THEN
  511.     CellValue$=CellValue$+x$
  512.   ELSE
  513.     y$=LEFT$(CellValue$,1)
  514.     IF (y$<CHR$(48) OR y$>CHR$(57)) AND (y$<>"-" AND y$<>".") THEN
  515.       Cell$=CellValue$:GOSUB GetCellID
  516.       IF AllOK THEN
  517.         y$=BSpread$(TempCol,TempRow,1)
  518.         z$=BSpread$(TempCol,TempRow,2)
  519.         IF LEFT$(z$,1)="N" THEN
  520.           CellValue$=y$
  521.         ELSEIF LEFT$(z$,1)="F" THEN
  522.           IF LEFT$(y$,1)<>"*" THEN
  523.             CellValue$=y$
  524.           ELSE
  525.             ErrMsg$="Unresolved Formula at "+CellValue$:ErrSw=1
  526.           END IF
  527.         ELSE
  528.           ErrMsg$="Character/Null at "+CellValue$:ErrSw=1
  529.         END IF
  530.       END IF
  531.     END IF
  532.     IF ErrSw<>1 THEN
  533.       IF op$="+" THEN Total=Total+VAL(CellValue$)
  534.       IF op$="-" THEN Total=Total-VAL(CellValue$)
  535.       IF op$="*" THEN Total=Total*VAL(CellValue$)
  536.       IF op$="/" THEN Total=Total/VAL(CellValue$)
  537.       op$=x$:CellValue$=""
  538.     ELSE
  539.       x=LEN(Formula$)
  540.     END IF
  541.   END IF
  542. NEXT    
  543. IF ErrSw=0 THEN
  544.   BSpread$(CellCol,CellRow,1)=STR$(Total):GOSUB PrintCell
  545. END IF
  546. RETURN
  547.  
  548. CalcXit:
  549. LINE(609,9)-STEP(6,6),Mag,bf:Saved=0
  550. GOTO WaitForUser
  551.  
  552. PRGoTo:
  553. GOSUB GoToCell:GOTO WaitForUser
  554.  
  555. ClrSheet:
  556. Prompt$="  OK to clear":Prompt2$="     Sheet?":GOSUB YesNo
  557. IF NOT Yes THEN WaitForUser
  558. COLOR Gra,Blk:LOCATE 2,1:PRINT"Clearing Sheet...";SPACE$(51)
  559. FOR x=1 TO MaxCol
  560.   FOR y=1 TO MaxRow
  561.     BSpread$(x,y,1)=""
  562.     BSpread$(x,y,2)=""
  563.   NEXT
  564. NEXT
  565. LINE(40,32)-STEP(560,152),Gra,bf
  566. LINE(609,9)-STEP(6,6),Blk,bf
  567. Saved=-1:GOTO WaitForUser
  568.  
  569. ResetSheet:
  570. Prompt$="  OK to reset":Prompt2$="     Sheet?":GOSUB YesNo
  571. IF NOT Yes THEN WaitForUser
  572. COLOR Gra,Blk:LOCATE 2,1:PRINT"Resetting Sheet...";SPACE$(50)
  573. FOR CellRow=1 TO MaxRow
  574.   FOR CellCol=1 TO MaxCol
  575.     IF LEFT$(BSpread$(CellCol,CellRow,2),1)="F" THEN
  576.       BSpread$(CellCol,CellRow,1)=STRING$(CWidth,"*")
  577.       GOSUB PrintCell
  578.     END IF
  579.   NEXT
  580. NEXT
  581. LINE(609,9)-STEP(6,6),Blk,bf
  582. Saved=0:GOTO WaitForUser
  583.  
  584. CSz5:
  585. CSz10:
  586. CSz15:
  587. CSz20:
  588. MENU 2,5,1:MENU 2,6,1:MENU 2,7,1:MENU 2,8,1
  589. IF menuIT=5 THEN MENU 2,5,2:CWidth= 5:NumCols=14
  590. IF menuIT=6 THEN MENU 2,6,2:CWidth=10:NumCols= 7
  591. IF menuIT=7 THEN MENU 2,7,2:CWidth=15:NumCols= 4
  592. IF menuIT=8 THEN MENU 2,8,2:CWidth=20:NumCols= 3
  593. GOSUB DoColHdg:GOSUB ShoData:GOTO WaitForUser
  594.  
  595. TwoDec:
  596. MENU 2,9,2:MENU 2,10,1:Mask$="################.##-"
  597. GOSUB ShoData:GOTO WaitForUser
  598.  
  599. NoDec:
  600. MENU 2,9,1:MENU 2,10,2:Mask$="###################-"
  601. GOSUB ShoData:GOTO WaitForUser
  602.  
  603. HoldRlse:
  604. IF NOT Holding THEN
  605.   COLOR Gra,Blk:LOCATE 2,1:PRINT SPACE$(68)
  606.   LOCATE 2,1:PRINT"How Many? ";
  607.   Response$="":GetData Response$,"INT",1:HoldCols=VAL(Response$)
  608.   IF HoldCols=>NumCols THEN HoldCols=NumCols-1
  609.   StartCol=StartCol+HoldCols:FirstCol=40+CWidth*8*HoldCols
  610.   NumCols=NumCols-HoldCols:PrintCol%=6+CWidth*HoldCols
  611.   MENU 2,5,0:MENU 2,6,0:MENU 2,7,0:MENU 2,8,0
  612.   MENU 2,11,1," Release Cols    ":Holding=-1:GOSUB DoColHdg
  613.   MENU 1,0,0:MENU 2,12,0:MENU 4,6,0:MENU 4,8,0
  614. ELSE
  615.   StartCol=StartCol=HoldCols
  616.   IF StartCol<1 THEN StartCol=1
  617.   FirstCol=40:PrintCol%=6:Holding=0
  618.   MENU 2,5,1:MENU 2,6,1:MENU 2,7,1:MENU 2,8,1
  619.   IF CWidth= 5 THEN MENU 2,5,1:NumCols=14
  620.   IF CWidth=10 THEN MENU 2,6,2:NumCols= 7
  621.   IF CWidth=15 THEN MENU 2,7,2:NumCols= 4
  622.   IF CWidth=20 THEN MENU 2,8,2:NumCols= 3
  623.   MENU 2,11,1," Hold 1st Cols   "
  624.   GOSUB DoColHdg:GOSUB ShoData
  625.   MENU 1,0,1:MENU 2,12,1:MENU 4,6,1:MENU 4,8,1
  626. END IF
  627. GOTO WaitForUser
  628.  
  629. Template:
  630. Prompt$="  OK to  Make":Prompt2$="  a Template?":GOSUB YesNo
  631. IF NOT Yes THEN WaitForUser
  632. COLOR Gra,Blk:LOCATE 2,1:PRINT"Making Template...";SPACE$(50)
  633. FOR CellRow=1 TO MaxRow
  634.   FOR CellCol=1 TO MaxCol
  635.     x$=LEFT$(BSpread$(CellCol,CellRow,2),1)
  636.     IF x$="N" THEN
  637.       BSpread$(CellCol,CellRow,1)=""
  638.       BSpread$(CellCol,CellRow,2)=""
  639.       GOSUB PrintCell
  640.     ELSEIF x$="F" THEN
  641.       BSpread$(CellCol,CellRow,1)=STRING$(CWidth,"*")
  642.       GOSUB PrintCell
  643.     END IF
  644.   NEXT
  645. NEXT
  646. LINE(609,9)-STEP(6,6),Blk,bf
  647. Saved=0:GOTO WaitForUser
  648.  
  649. Xit:
  650. IF NOT Saved THEN
  651.   Prompt$="Sheet not saved":Prompt2$="Quit 'BSpread'?"
  652.   GOSUB YesNo:IF NOT Yes THEN WaitForUser
  653. END IF
  654. MENU RESET:COLOR Gra,Blk
  655. ' $IGNORE ON
  656. CLEAR ,25000
  657. ' $IGNORE OFF
  658. CLS:END
  659.  
  660. YesNo:
  661. WINDOW 2,,(120,51)-(258,97),0,-1
  662. COLOR Blk,Yel:x=22
  663. FOR n=32 TO 0 STEP -1
  664.   LINE(0,n)-STEP(137,0),Yel
  665.   x=x+1
  666.   LINE(0,x)-STEP(137,0),Yel
  667. NEXT
  668. LINE(15,31)-STEP(32,16),Blk,bf:LINE(95,31)-STEP(32,16),Blk,bf
  669. LINE(12,28)-STEP(32,16),Gra,bf:LINE(92,28)-STEP(32,16),Gra,bf
  670. LINE(12,28)-STEP(32,16),Mag,b:LINE(92,28)-STEP(32,16),Mag,b
  671. LINE(13,29)-STEP(30,14),Mag,b:LINE(93,29)-STEP(30,14),Mag,b
  672. LOCATE 2,2:PRINT Prompt$:LOCATE 3,2:PRINT Prompt2$
  673. COLOR Mag,Gra:LOCATE 5,3:PRINT"Yes";PTAB(100);"No";
  674. NoGdgt=-1
  675. WHILE NoGdgt
  676.   WHILE MOUSE(0)=0:WEND
  677.     x=MOUSE(1):y=MOUSE(2)
  678.     IF y>28 AND y<44 THEN
  679.       IF x>12 AND x<52 THEN
  680.         Yes=-1:NoGdgt=0
  681.       ELSEIF x>92 AND x<122 THEN
  682.         Yes=0:NoGdgt=0
  683.       END IF
  684.     END IF
  685.   WHILE MOUSE(0)<>0:WEND
  686. WEND
  687. WINDOW CLOSE 2
  688. RETURN
  689.  
  690. GoToCell:
  691. Prompt$="Go To Cell? ":GOSUB GetCellNum
  692. StartCol=TempCol:LastCol=600
  693. IF StartCol+NumCols>MaxCol THEN
  694.   LastCol=((MaxCol+1-StartCol)*(CWidth*8))+40
  695. END IF
  696. StartRow=TempRow:LastRow=184
  697. IF StartRow+19>MaxRow THEN LastRow=((MaxRow+1-StartRow)*8)+32
  698. GOSUB DoColHdg:GOSUB DoRowHdg:GOSUB ShoData
  699. RETURN
  700.  
  701. GetCellNum:
  702. COLOR Gra,Blk:LOCATE 2,1:PRINT SPACE$(68):Cell$=""
  703. GCNget:
  704. LOCATE 2,1:PRINT Prompt$;
  705. GetData Cell$,"CHAR",4:GOSUB GetCellID
  706. IF NOT AllOK THEN
  707.   COLOR Mag,Blk:LOCATE 2,67-LEN(ErrMsg$)
  708.   PRINT ErrMsg$:BEEP
  709.   COLOR Gra,Blk:GOTO GCNget
  710. END IF
  711. RETURN
  712.  
  713. GetCellID:
  714. Cell$=UCASE$(Cell$):AllOK=-1:ErrSw=0
  715. IF LEFT$(Cell$,1)="[" THEN
  716.   n=1:GOSUB RelCell
  717.   IF AllOK AND MID$(Cell$,n,1)="," THEN
  718.     GOSUB RelCell
  719.   ELSE
  720.     IF MID$(Cell$,n,1)="]" THEN
  721.       ErrMsg$="Missing Col/Row: "+Cell$:ErrSw=1:AllOK=0
  722.     ELSE
  723.       IF ErrSw=0 THEN GOSUB RelCell
  724.     END IF
  725.   END IF
  726. ELSE
  727.   GOSUB AbsCell
  728. END IF
  729. RETURN
  730.  
  731. RelCell:
  732. z$=MID$(Cell$,n,1)
  733. IF z$="[" OR z$="," THEN
  734.   n=n+1:z$=MID$(Cell$,n,1)
  735.   IF z$="C" OR z$="R" THEN
  736.     n=n+1:a$=MID$(Cell$,n,1)
  737.     IF a$="+" OR a$="-" THEN
  738.       n=n+1:y$=MID$(Cell$,n+1,1)
  739.       IF y$="," OR y$="]" THEN
  740.         y$=MID$(Cell$,n,1):n=n+1
  741.       ELSE
  742.         y$=MID$(Cell$,n,2):n=n+2
  743.       END IF
  744.       IF z$="C" THEN 
  745.         IF a$="+" THEN TempCol=CellCol+VAL(y$)
  746.         IF a$="-" THEN TempCol=CellCol-VAL(y$)
  747.         IF TempCol<1 OR TempCol>MaxCol THEN
  748.           ErrMsg$="Illegal Column: "+Cell$:ErrSw=1:AllOK=0:TempCol=1
  749.         END IF
  750.       ELSEIF z$="R" THEN
  751.         IF a$="+" THEN TempRow=CellRow+VAL(y$)      
  752.         IF a$="-" THEN TempRow=CellRow-VAL(y$)
  753.         IF TempRow<1 OR TempRow>MaxRow THEN
  754.           ErrMsg$="Illegal Row: "+Cell$:ErrSw=1:AllOK=0:TempRow=1
  755.         END IF
  756.       END IF
  757.     ELSE
  758.       ErrMsg$="Illegal Operator: "+Cell$:ErrSw=1:AllOK=0 
  759.     END IF
  760.   ELSE
  761.     ErrMsg$="Must Specify a C or R: "+Cell$:ErrSw=1:AllOK=0   
  762.   END IF
  763. ELSE
  764.   ErrMsg$="Illegal Relative Format: "+Cell$:ErrSw=1:AllOK=0
  765. END IF
  766. RETURN
  767.       
  768. AbsCell:
  769. TempCol=0
  770. IF LEN(Cell$)<2 THEN ACerr1
  771. IF LEN(Cell$)=2 OR LEN(Cell$)=4 THEN
  772.   n=LEN(Cell$)/2
  773.   TempCol$=LEFT$(Cell$,n):TempRow$=RIGHT$(Cell$,n)
  774. ELSE
  775.   IF MID$(Cell$,2,1)<CHR$(58) THEN
  776.     TempCol$=LEFT$(Cell$,1):TempRow$=RIGHT$(Cell$,2)
  777.   ELSE
  778.     TempCol$=LEFT$(Cell$,2):TempRow$=RIGHT$(Cell$,1)
  779.   END IF
  780. END IF
  781. IF LEN(TempCol$)=2 THEN
  782.   IF LEFT$(TempCol$,1)<>RIGHT$(TempCol$,1) THEN ACerr2
  783.   TempCol=26:TempCol$=RIGHT$(TempCol$,1)
  784. END IF
  785. TempCol=TempCol+ASC(TempCol$)-64
  786. IF TempCol<1 OR TempCol>MaxCol THEN ACerr2
  787. TempRow=VAL(TempRow$)
  788. IF TempRow<1 OR TempRow>MaxRow THEN ACerr3
  789. GOTO ACexit
  790. ACerr1:ErrMsg$="Illegal CellID: ":GOTO ACerrEnd
  791. ACerr2:ErrMsg$="Invalid Column: ":GOTO ACerrEnd
  792. ACerr3:ErrMsg$="Invalid Row: ":GOTO ACerrEnd
  793. ACerrEnd:ErrMsg$=ErrMsg$+Cell$:AllOK=0:ErrSw=1
  794. ACexit:
  795. RETURN
  796.  
  797. ShoData:
  798. LINE(FirstCol,FirstRow)-(600,192),Gra,bf
  799. rowtop=0:oldtop=0:colleft=0:oldleft=0
  800. FOR CellRow=StartRow TO EndRow
  801.   FOR CellCol=StartCol TO EndCol
  802.     GOSUB PrintCell
  803.   NEXT
  804. NEXT
  805. CellCol=StartCol:CellRow=StartRow
  806. IF CellMgmt THEN x=FirstCol+4:y=FirstRow+4:GOSUB MouseOK
  807. RETURN
  808.  
  809. MouseOK:
  810. n=CWidth*8
  811. rowtop=INT(y/8)*8:colleft=INT((x-40)/n)*n+40
  812. IF colleft>LastCol-n THEN colleft=LastCol-n
  813. IF rowtop<>oldtop OR colleft<>oldleft THEN
  814.   IF oldtop<>0 THEN PUT(oldleft,oldtop),CellLite%
  815.   PUT(colleft,rowtop),CellLite%
  816.   oldtop=rowtop:oldleft=colleft
  817. END IF
  818. RETURN
  819.  
  820. PrintCell:
  821. IF colleft<>0 THEN PUT(colleft,rowtop),CellLite%
  822. row%=PrintRow%+CellRow-StartRow
  823. col%=PrintCol%+((CellCol-StartCol)*CWidth)
  824. IF row%<24 AND row%>4 AND col%<(77-CWidth) AND col%=>PrintCol% THEN
  825.   LOCATE row%,col%:COLOR Blk,Gra
  826.   x$=BSpread$(CellCol,CellRow,1)
  827.   y$=LEFT$(BSpread$(CellCol,CellRow,2),1)
  828.   IF (y$="N" OR y$="F") AND (LEN(x$)>CWidth) THEN
  829.     COLOR Mag:PRINT"*LEN*";STRING$(CWidth-5,"*"):COLOR Blk
  830.   ELSE  
  831.     n=CWidth-LEN(x$):IF n<0 THEN n=0
  832.     IF y$="C" OR y$="" OR LEFT$(x$,1)="*" THEN
  833.       PRINT LEFT$(x$,CWidth);SPACE$(n);
  834.     ELSE
  835.       PRINT USING RIGHT$(Mask$,CWidth);VAL(x$);
  836.     END IF
  837.   END IF
  838. END IF
  839. IF colleft<>0 THEN PUT(colleft,rowtop),CellLite%
  840. RETURN
  841.  
  842. DoColHdg:
  843. COLOR Blk,Mag:LOCATE 4,6:PRINT SPACE$(70):LOCATE 4,PrintCol%
  844. GET(24,24)-(24+CWidth*8-1,31),CellLite%
  845. EndCol=StartCol+NumCols-1:IF EndCol>MaxCol THEN EndCol=MaxCol
  846. FOR n=StartCol TO EndCol
  847.   PRINT SPC(CWidth-3);ColHdg$(n);":";
  848. NEXT
  849. IF ColLite<>0 THEN LINE(ColLite,17)-STEP(10,5),Blk,bf
  850. n=41-13+(14*StartCol)
  851. LINE(n,17)-STEP(10,5),Yel,bf:ColLite=n
  852. RETURN
  853.  
  854. DoRowHdg:
  855. COLOR Blk,Mag:row%=5
  856. LINE(24,24)-STEP(15,160),Mag,bf
  857. LINE(600,24)-STEP(15,160),Mag,bf
  858. EndRow=StartRow+18:IF EndRow>MaxRow THEN EndRow=MaxRow
  859. FOR n=StartRow TO EndRow
  860.   LOCATE row%,4:PRINT USING "##";n;
  861.   PRINT SPC(70);:PRINT USING "##";n;
  862.   row%=row%+1
  863. NEXT
  864. IF RowLite<>0 THEN LINE(6,RowLite)-STEP(8,1),Blk,bf
  865. n=30-3+(3*StartRow)
  866. LINE(6,n)-STEP(8,1),Yel,bf:RowLite=n
  867. RETURN
  868.  
  869. BasicError:
  870. COLOR Mag,Blk:BEEP:ErrSw=1
  871. IF ERR=53 THEN
  872.   LOCATE 2,53:PRINT"File Not Found!"
  873.   RESUME AfterOpen
  874. ELSE
  875.   LOCATE 2,1:PRINT SPACE$(68)
  876.   LOCATE 2,1:PRINT"AmigaBasic Error:";ERR;
  877. END IF
  878. MENU 1,0,1:MENU 2,0,1:MENU 3,0,0:MENU 4,0,0
  879. RESUME WaitForUser
  880.  
  881. Initialize:
  882. FOR n=1 TO MaxCol:READ ColHdg$(n):NEXT
  883. DATA" A"," B"," C"," D"," E"," F"," G"," H"
  884. DATA" I"," J"," K"," L"," M"," N"," O"," P"
  885. DATA" Q"," R"," S"," T"," U"," V"," W"," X"
  886. DATA" Y"," Z","AA","BB","CC","DD","EE","FF"
  887. DATA"GG","HH","II","JJ","KK","LL","MM","NN"
  888. PALETTE 0,0,0,0:PALETTE 1,0,0,0
  889. PALETTE 2,0,0,0:PALETTE 3,0,0,0
  890. COLOR ,Blk:CLS
  891. LINE(24,24)-STEP(592,160),Mag,bf
  892. LINE(40,32)-STEP(560,152),Gra,bf
  893. LINE(40,16)-STEP(560,7),Gra,b
  894. LINE(4,29)-STEP(12,150),Gra,b
  895. FOR n=54 TO 592 STEP 14:LINE(n,16)-STEP(0,7),Gra:NEXT
  896. FOR n=32 TO 176 STEP 3:LINE(4,n)-STEP(12,0),Gra:NEXT
  897. GET(24,24)-(31,31),IPcursor%
  898. GOSUB DoColHdg:GOSUB DoRowHdg
  899. COLOR Gra,Blk:LOCATE 2,69:PRINT"Changed:"
  900. LINE(608,8)-STEP(8,8),Gra,b
  901. COLOR Yel,Blk:LOCATE 1,1:PRINT"Current Sheet: unnamed"
  902. LOCATE 1,69:PRINT"'BSpread'"
  903. MENU 1,0,1,"Project Mgmt I"
  904. MENU 1,1,1," Load     (L)":MENU 1,2,1," Save     (S)"
  905. MENU 1,3,1," Save As  (A)":MENU 1,4,1," Text File(T)"
  906. MENU 1,5,1," Print    (P)":MENU 1,6,1," Quit     (Q)"
  907. MENU 2, 0,1,"Project Mgmt II"
  908. MENU 2, 1,1," Calculate    (C)":MENU 2, 2,1," Go To Cell...(G)"
  909. MENU 2, 3,1," Clear Sheet     ":MENU 2, 4,1," Reset Sheet     "
  910. MENU 2, 5,1,"  Cell Size 5    ":MENU 2, 6,2,"  Cell Size 10   "
  911. MENU 2, 7,1,"  Cell Size 15   ":MENU 2, 8,1,"  Cell Size 20   "
  912. MENU 2, 9,2,"  Two Decimals   ":MENU 2,10,1,"  No Decimals    "
  913. MENU 2,11,1," Hold 1st Cols   ":MENU 2,12,1," Make a Shell    "
  914. MENU 3,0,0,"Cell Mgmt I"
  915. MENU 3,1,1," Cell Data    (D)":MENU 3,2,1," Cell Formula (F)"
  916. MENU 3,3,1," Zero Cell       ":MENU 3,4,1," Blank Cell      "
  917. MENU 3,5,1," Copy Cell       ":MENU 3,6,1," Move Cell       "
  918. MENU 3,7,1," Propogate Right ":MENU 3,8,1," Propogate Down  "
  919. MENU 3,9,1," Go To Cell...(G)":MENU 3,10,1," Exit         (X)"
  920. MENU 4,0,0,"Cell Mgmt II"
  921. MENU 4,1,1," Zero Column  ":MENU 4,2,1," Zero Row     "
  922. MENU 4,3,1," Blank Column ":MENU 4,4,1," Blank Row    "
  923. MENU 4,5,1," Insert Column":MENU 4,6,1," Insert Row   "
  924. MENU 4,7,1," Remove Column":MENU 4,8,1," Remove Row   "
  925. COLOR Blk,Gra:LOCATE 19,32:PRINT"'Click' to Start"
  926. LOCATE 7,19:PRINT"'BSpread' - an AmigaBasic(tm) Spread Sheet"
  927. LOCATE 9,20:PRINT"Written for 'Amazing Computing' Magazine"
  928. LOCATE 11,39:PRINT"by"
  929. LOCATE 15,22:PRINT"Copyright (c) 1987 by  FelineSystems"
  930. LOCATE 16,31:PRINT"All Rights Reserved"
  931. COLOR Mag,Gra:LOCATE 13,32:PRINT"Bryan  D.  Catley"
  932. LOCATE 21,14:PRINT"2221  Glasgow Road  Alexandria  ";
  933. PRINT"Virginia  22307-1819"
  934. PALETTE 0,0,0,0:PALETTE 1,.75,.75,.75
  935. PALETTE 2,1,0,1:PALETTE 3,1,.8,0
  936. RETURN
  937.  
  938. SUB GetData (Text$,DataType$,maxlen%) STATIC
  939. SHARED TypeFlag$,IPcursor%()
  940. WHILE INKEY$<>"":WEND
  941. Start=POS(0):Cur=0:xpix=(Start-1)*8:ypix=(CSRLIN-1)*8
  942. ShoText:
  943. IF LEN(Text$)=0 THEN TypeFlag$="N"
  944. n=maxlen%+1-LEN(Text$):IF n<0 THEN n=0
  945. PRINT Text$+SPACE$(n);:LOCATE ,Start
  946. xpix=(Start+Cur-1)*8:PUT(xpix,ypix),IPcursor%
  947. NxtChar:
  948. x$="":LeftPart$="":RightPart$=""
  949. WHILE x$="":x$=INKEY$:WEND
  950. IF x$=CHR$(30)  THEN CurRight ' Right-cursor
  951. IF x$=CHR$(31)  THEN CurLeft  ' Left-cursor
  952. IF x$=CHR$(8)   THEN DelLeft  ' Back-space key
  953. IF x$=CHR$(127) THEN DelRight ' Delete key
  954. IF x$=CHR$(27)  THEN ClrText  ' Escape key
  955. IF x$=CHR$(13)  THEN GetDone  ' Return key
  956. IF DataType$="CHAR"  AND TypeFlag$<>"C" THEN
  957.   IF (x$<CHR$(48) OR x$>CHR$(57)) AND (x$<>".") THEN 
  958.     IF LEN(Text$)>0 OR x$<>"-" THEN TypeFlag$="C"
  959.   END IF
  960. ELSEIF DataType$="INT" THEN
  961.   IF x$<CHR$(48) OR x$>CHR$(57) THEN
  962.     BEEP:GOTO NxtChar
  963.   END IF
  964. END IF
  965. InsertChar:
  966. IF LEN(Text$)=maxlen% THEN BEEP:GOTO NxtChar
  967. IF Cur>0 THEN LeftPart$=MID$(Text$,1,Cur)
  968. IF LEN(Text$)>0 THEN RightPart$=MID$(Text$,Cur+1,LEN(Text$)-LEN(LeftPart$))
  969. Text$=LeftPart$+x$+RightPart$:Cur=Cur+1:GOTO ShoText
  970. CurRight:
  971. IF Cur=LEN(Text$) THEN NxtChar
  972. Cur=Cur+1:GOTO ShoText
  973. CurLeft:
  974. IF Cur=0 THEN NxtChar
  975. Cur=Cur-1:GOTO ShoText
  976. DelLeft:
  977. IF LEN(Text$)=0 OR Cur=0 THEN BEEP:GOTO NxtChar
  978. IF Cur>1 THEN LeftPart$=MID$(Text$,1,Cur-1)
  979. IF LEN(Text$)>Cur THEN RightPart$=MID$(Text$,Cur+1,LEN(Text$)-Cur)
  980. Text$=LeftPart$+RightPart$:Cur=Cur-1:GOTO ShoText
  981. DelRight:
  982. IF LEN(Text$)=0 OR Cur=LEN(Text$) THEN BEEP:GOTO NxtChar
  983. IF Cur>0 THEN LeftPart$=MID$(Text$,1,Cur)
  984. IF Cur+1<LEN(Text$) THEN RightPart$=MID$(Text$,Cur+2,LEN(Text$)-Cur+1)
  985. Text$=LeftPart$+RightPart$:GOTO ShoText
  986. ClrText:
  987. PRINT SPACE$(maxlen%+1);:LOCATE ,Start
  988. Cur=0:Text$="":GOTO ShoText
  989. GetDone:
  990. PUT(xpix,ypix),IPcursor%
  991. END SUB
  992.   
  993.