Unfortunately I have to go out unexpectedly and won't be back until late. So I won't be able to do anything more to my entry, (thought I'd get time to tidy it up a bit). I'll just post what I've done so far - bugs and all!
Got the wordwrap working when you are entering text and reach the end of the line, but it doesn't do it when you edit already existing text.
There are also plenty of things that don't quite work right, but I simply ran out of time...
Rem Example Text Editor Program For The DB Classic Challenge
Rem By TDK_Man April 2007
Sync On: Sync Rate 60: CLS 0
SET WINDOW ON
SET WINDOW TITLE "TDK's Text Editor"
SET WINDOW SIZE 642,489: Rem Window slightly larger than the display (640x480)
Show Window
Rem The default 640x480 display gives us an area with 71 characters across and 29 characters down
Set Text Font "Courier",1
Set Text Size 16
Set Text Transparent
True = 1: False = 0
MaxLines = 1000
Dim Lines$(MaxLines): Rem up to 1000 lines, but we will have to handle scrolling manually
CursorX = 0: CursorY=0: Rem Initial cursor starting position
NumLines = 1: Rem New doc always has a min of 1 line - even if not used
LineOffset = 0 : Rem for scrolling the lines of text
CharWidth = 9
ScrnCharWidth = 71
Gosub UpdateMenu
Ink RGB(255,255,255),0
Set Cursor CursorX,CursorY
Text CursorX*CharWidth,CursorY*16,"_"
Rem Main Loop
Do
KeyPressed = Asc(Inkey$())
Gosub ReadKeyPresses
Sync
Loop
End
ReadKeyPresses:
Rem ***************************
Rem Handle ASCII Keypresses
Rem ***************************
If KeyPressed > 31 And KeyPressed < 123
Rem Handle all keypresses here
Rem For example: 97 - 122 = a .. z 65 - 90 = A .. Z 48 - 57 = 0 .. 9
BeforeCursor$ = Left$(Lines$(CursorY+LineOffset),CursorX)
CurrentLineLen = Len(Lines$(CursorY+LineOffset))
AfterCursor$ = Right$(Lines$(CursorY+LineOffset),CurrentLineLen-CursorX)
Ink 0,0: Text CursorX*CharWidth,CursorY*16,"_"
If CursorX < ScrnCharWidth-1
Lines$(CursorY+LineOffset) = BeforeCursor$ + Chr$(KeyPressed) + AfterCursor$
Inc CursorX
Else
Rem Reached end of line so wordwrap here...
Lines$(CursorY+LineOffset) = BeforeCursor$+Chr$(KeyPressed)
ScanPos = Len(BeforeCursor$)+1: LineLen = ScanPos
While Mid$(Lines$(CursorY+LineOffset),ScanPos)<>" "
Dec ScanPos
EndWhile
LastWord$ = Right$(Lines$(CursorY+LineOffset),LineLen-ScanPos)
Lines$(CursorY+LineOffset) = Left$(BeforeCursor$,ScanPos-1)
CursorX = Len(LastWord$): Inc CursorY: Rem Drop to start of the next line
Gosub CheckScroll
Lines$(CursorY+LineOffset) = LastWord$
Inc NumLines: Rem Just started a new line
Endif
Gosub UpdateAllLines
Gosub UpdateMenu
Sleep 120
Endif
Rem ***** Backspace Key *****
If KeyPressed = 8
If CursorX > 0
CurrentLineLen = Len(Lines$(CursorY+LineOffset))
If CursorX = CurrentLineLen
Rem Currently at the end of the line
Lines$(CursorY+LineOffset) = Left$(Lines$(CursorY+LineOffset),CurrentLineLen-1)
Else
Rem Currently somewhere in the middle of the line
BeforeCursor$ = Left$(Lines$(CursorY+LineOffset),CursorX-1)
AfterCursor$ = Right$(Lines$(CursorY+LineOffset),CurrentLineLen-CursorX)
Lines$(CursorY+LineOffset) = BeforeCursor$ + AfterCursor$
Endif
Dec CursorX
Else
Rem At left edge of screen
If Len(Lines$(CursorY+LineOffset))=0
For N = CursorY To NumLines-2
Lines$(N) = Lines$(N+1)
Next N
Dec NumLines
Lines$(NumLines) =""
Dec CursorY: CurrentLineLen = Len(Lines$(CursorY+LineOffset))
If CursorX < CurrentLineLen Then CursorX = CurrentLineLen
Else
Rem There are characters after cursor
AfterCursor$ = Right$(Lines$(CursorY+LineOffset),CurrentLineLen-CursorX)
For N = CursorY To NumLines-2
Lines$(N) = Lines$(N+1)
Next N
Dec NumLines
Lines$(NumLines) = ""
If CursorY>0 Then Dec CursorY: CurrentLineLen = Len(Lines$(CursorY+LineOffset))
If CursorX < CurrentLineLen Then CursorX = CurrentLineLen
Lines$(CursorY+LineOffset) = Lines$(CursorY+LineOffset)+AfterCursor$
Rem Check new line length
CurrentLineLen = Len(Lines$(CursorY+LineOffset))
If CurrentLineLen > ScrnCharWidth
AfterCursor$ = Right$(Lines$(CursorY+LineOffset),CurrentLineLen - ScrnCharWidth): Rem characters after right edge of window
Lines$(CursorY+LineOffset) = Left$(Lines$(CursorY+LineOffset),ScrnCharWidth): Rem keep characters inside window
Lines$(CursorY+1) = AfterCursor$ + Lines$(CursorY+1)
Endif
Endif
Endif
Gosub UpdateAllLines
Gosub UpdateMenu
Sleep 140
Endif
Rem *******************************
Rem Handle NON-ASCII Keypresses
Rem *******************************
Rem ***** Return Key *****
If Returnkey()=1
Rem Drop to next line
Ink 0,0: Text CursorX*CharWidth,CursorY*16,"_"
CurrentLineLen = Len(Lines$(CursorY+LineOffset))
BeforeCursor$ = Left$(Lines$(CursorY+LineOffset),CursorX)
AfterCursor$ = Right$(Lines$(CursorY+LineOffset),CurrentLineLen-CursorX)
Rem Shuffle All Following Lines Down One (Will lose very last line but unlikely to be used)
For N = MaxLines-1 To CursorY+1 Step -1
Lines$(N) = Lines$(N-1)
Next N
Lines$(CursorY+LineOffset) = BeforeCursor$: Rem Set current line to text before cursor
Lines$(CursorY+LineOffset+1) = AfterCursor$: Rem Set following line to text after cursor
CursorX = 0
Inc CursorY: Rem New cursor position
Gosub CheckScroll
Inc NumLines: Rem We just added a new line
Ink 0,0: Text CursorX*CharWidth,(CursorY)*16,"_"
Ink RGB(255,255,255),0: Text CursorX*CharWidth,CursorY*16,"_"
Gosub UpdateAllLines
Gosub UpdateMenu
Sleep 140
Endif
Rem ***** Home Key ***** 199
If Scancode() = 199
Ink 0,0: Text CursorX*CharWidth,CursorY*16,"_"
CursorX = 0
Ink RGB(255,255,255),0: Text CursorX*CharWidth,CursorY*16,"_"
Endif
Rem ***** End Key ***** 207
If Scancode() = 207
Ink 0,0: Text CursorX*CharWidth,CursorY*16,"_"
CursorX = Len(Lines$(CursorY+LineOffset))
Ink RGB(255,255,255),0: Text CursorX*CharWidth,(CursorY)*16,"_"
Endif
Rem ***** Cursor Keys *****
If Upkey()=1 And CursorY >= 0: Rem Move Cursor Up
Ink 0,0: Text CursorX*CharWidth,CursorY*16,"_"
Dec CursorY: Gosub CheckScroll
CurrentLineLen = Len(Lines$(CursorY+LineOffset))
If CursorX > CurrentLineLen Then CursorX = CurrentLineLen
Ink RGB(255,255,255),0: Text CursorX*CharWidth,CursorY*16,"_"
Gosub UpdateMenu
Sleep 80
Endif
If Downkey()=1
If CursorY <= 28 And CursorY+LineOffset+1 < NumLines: Rem Move Cursor Down
Ink 0,0: Text CursorX*CharWidth,CursorY*16,"_"
Inc CursorY: Gosub CheckScroll
CurrentLineLen = Len(Lines$(CursorY+LineOffset))
If CursorX > CurrentLineLen Then CursorX = CurrentLineLen
Ink RGB(255,255,255),0: Text CursorX*CharWidth,CursorY*16,"_"
Gosub UpdateMenu
Sleep 80
Endif
Endif
If Leftkey()=1 And CursorX >= 0: Rem Move Cursor Left
Ink 0,0: Text CursorX*CharWidth,CursorY*16,"_"
If CursorX >=1
Dec CursorX
Else
If CursorY>0
Dec CursorY: Gosub CheckScroll
CurrentLineLen = Len(Lines$(CursorY+LineOffset))
CursorX=CurrentLineLen: Rem New position at end of previous line
Endif
Endif
Ink RGB(255,255,255),0: Text CursorX*CharWidth,CursorY*16,"_"
Gosub UpdateMenu
Sleep 50
Endif
If Rightkey()=1: Rem Move Cursor Right
Ink 0,0: Text CursorX*CharWidth,CursorY*16,"_"
CurrentLineLen = Len(Lines$(CursorY+LineOffset))
If CursorX < ScrnCharWidth and CursorX < CurrentLineLen
Inc CursorX
Else
If NumLines > CursorY+1+LineOffset
Inc CursorY: Gosub CheckScroll
CursorX=0: Rem New position at start of next line
Endif
Endif
Ink RGB(255,255,255),0: Text CursorX*CharWidth,CursorY*16,"_"
Gosub UpdateMenu
Sleep 50
Endif
Rem ***** Load (Ctrl-L) *****
If KeyState(38) = 1 And Scancode() = 29
Rem Load A File
Set Text Transparent
Ink RGB(0,100,0),0: Box 0,465,639,479
Ink RGB(255,255,255),RGB(0,100,0)
Set Cursor 0,29*16: Input " Please Enter A Filename To Load (No Extension Required): ";FName$
Repeat
Until ReturnKey()=0
FName$=FName$+".TXT": Rem <<< Choose your own filename extension here
If File Exist(FName$) = 1
UnDim Lines$(MaxLines): Rem Erase current string array
Dim Lines$(MaxLines): Rem Recreate array (empty)
Open To Read 1,FName$
Read String 1, Temp$: NumLines=Val(Temp$)
For N = 0 To NumLines-1
Read String 1, Lines$(N)
Next N
Close File 1
CursorX = 0: CursorY = 0: LineOffset=0
Else
Ink RGB(0,100,0),0: Box 0,465,639,479
Ink RGB(255,255,0),RGB(0,100,0)
Text 0,464," Sorry - That File Does Not Exist!"
Sleep 4000
Endif
Gosub UpdateAllLines
Gosub UpdateMenu
rem Set Text Transparent: Sync
Endif
Rem ***** Save (Ctrl-S) *****
If KeyState(31) = 1 And Scancode() = 29
Rem Save A File
Set Text Opaque: Sync
Ink RGB(0,100,0),0: Box 0,465,639,479
Ink RGB(255,255,255),RGB(0,100,0)
Set Cursor 0,29*16: Input " Please Enter A Filename To Save (No Extension Required): ";FName$
Repeat
Until ReturnKey()=0
FName$=FName$+".TXT": Rem <<< Choose your own filename extension here
If File Exist(FName$) = 1 Then Delete File FName$
Open To Write 1,FName$
Write String 1, Str$(NumLines)
For N = 0 To NumLines-1
Write String 1, Lines$(N)
Next N
Close File 1
Gosub UpdateAllLines
Gosub UpdateMenu
Set Text Transparent: Sync
Endif
Rem ***** Clear (Ctrl-C) *****
If KeyState(46) = 1 And Scancode() = 29
Rem Clear File
Set Text Opaque: Sync
Ink RGB(0,100,0),0: Box 0,465,639,479
Ink RGB(255,255,255),RGB(0,100,0)
Repeat
Until Scancode() = 0
CursorX=0: CursorY=0: NumLines=1
UnDim Lines$(MaxLines): Rem Erase current string array
Dim Lines$(MaxLines): Rem Recreate array (empty)
Gosub UpdateAllLines
Gosub UpdateMenu
Set Text Transparent: Sync
Endif
Rem ***** Exit (Ctrl-X) *****
If KeyState(45) = 1 And Scancode() = 29
Rem Exit
UnDim Lines$(MaxLines): Rem Erase current string array
End
Endif
Return
UpdateAllLines:
Set Text Opaque
Ink 0,0: Box 0,0,639,464
Ink RGB(255,255,255),0
For N = 0 To 28: Rem 28 Lines
Text 0,N*16,Lines$(N+LineOffset): Rem Correct lines if scrolled
Next N
Set Text Transparent
Text CursorX*CharWidth,CursorY*16,"_"
Return
UpdateMenu:
Set Text Opaque: Sync
Ink RGB(255,255,255),RGB(0,100,0)
Text 0,464," Ctrl-S Save Ctrl-L Load Ctrl-C Clear Ctrl-X Exit L:"+Str$(NumLines)+" CPos:"+Str$(CursorX+1)+"/"+Str$(CursorY+LineOffset+1)+" ": Rem Bottom line reserved for menu commands
Set Text Transparent: Sync
Return
CheckScroll:
If CursorY > 28
If CursorY+LineOffset < NumLines Then Inc LineOffset
CursorY = 28
Gosub UpdateAllLines
Endif
If CursorY < 0
If LineOffset > 0 Then Dec LineOffset
CursorY = 0
Gosub UpdateAllLines
Endif
Return
[Edit] Doh! Just checked and the deadline is tomorrow night - not tonight. Might get chance to finish it after all...
TDK_Man