Title : MaxGUI text area formatting
Author : Dabhand
Posted : 1+ years ago
Description : Example on how to format a MaxGUI text area, basically, it sweeps each line, splits the line into tokens then formats each token.
Currently, its set out to catch html tags, but you can change that and expand it with a little play.
Dabz
Code :
Framework MaxGUI.MaxGUI
Import BRL.EventQueue
Import BRL.Retro
Import MaxGui.Drivers
SuperStrict
Local window:TGadget = CreateWindow("SPad",30,20,400,300,Desktop(),WINDOW_TITLEBAR | WINDOW_MENU | WINDOW_STATUS)
Local textarea:TGadget = CreateTextArea(0,0,ClientWidth(window),ClientHeight(window),window)
SetTextAreaColor(textarea,1,81,107,True)
SetTextAreaColor(textarea,255,255,255,False)
'Menu
Local filemenu:TGadget
Const MENU_OPEN:Int=101
filemenu=CreateMenu("&File",0,WindowMenu(window))
CreateMenu"&Open",MENU_OPEN,filemenu,KEY_O,MODIFIER_COMMAND
UpdateWindowMenu window
While True
PollEvent()
Select EventID()
Case EVENT_GADGETACTION
Select(EventSource())
Case textarea
FormatLine(textarea)
End Select
Case EVENT_WINDOWCLOSE
End
Case EVENT_MENUACTION
Select EventData()
Case MENU_OPEN
Local result:String = RequestFile("Open file...","All files:*",False)
If result <> ""
SetTextAreaText(textArea,LoadText$(result))
FormatDocument(textArea)
End If
End Select
End Select
Wend
Function FormatLine(textArea:TGadget)
Local cursorpos:Int
Local currentline:Int, lineString:String
Local lineCharStart:Int, lineCharEnd:Int
cursorpos=TextAreaCursor(textArea)
currentLine = TextAreaLine(textArea,cursorPos)
lineCharStart = TextAreaChar(textArea,currentLine)
lineString = ""
For Local loop:Int = lineCharStart To TextAreaLen(textArea)
Local char:String = TextAreaText$(textArea,loop,1)
If (TextAreaLine(textArea,loop) <> currentLine) Or (loop = TextAreaLen(textArea))
lineCharEnd = loop-1
Exit
End If
lineString = lineString + char
Next
Local lex:TLexer = New TLexer
If lineString <> ""
lex.mLexLine(lineString)
End If
Local r:Int,g:Int,b:Int,flag:Int
Local inTag:Byte = False
For Local loop:Int = 0 To lex.iTokenAmount
r = 255 ; g = 255 ; b = 255 ; flag = 0
Local tempToken:String = lex.sTokenBank[loop]
If tempToken = "<"
r = 0 ; g = 255 ; b = 255
inTag = True
End If
If tempToken = ">"
r = 0 ; g = 255 ; b = 255
inTag = False
End If
If tempToken = "/" Or tempToken = "!"
If lex.sTokenBank[loop-1] = "<"
r = 255 ; g = 255 ; b = 50
flag = TEXTFORMAT_BOLD
End If
End If
For Local keyWordLoop:Int = 0 To lex.sKeywords.length-1
If intag = True
If lex.sKeywords[KeyWordLoop] = tempToken
r = 255 ; g = 255 ; b = 50
flag = TEXTFORMAT_BOLD
Exit
End If
End If
If tempToken = "h"
If lex.sTokenBank[loop-1] = "<" Or lex.sTokenBank[loop-1] = "/"
r = 255 ; g = 255 ; b = 50
flag = TEXTFORMAT_BOLD
End If
End If
Next
If Left$(tempToken,1) = "~q"
r = 50 ; g = 255 ; b = 50
End If
For Local numbersLoop:Int = 0 To lex.sNumbers.length-1
If lex.sNumbers[numbersLoop] = Left$(tempToken,1)
r = 192 ; g = 192 ; b = 192
If lex.sTokenBank[loop-1] = "h"
r = 255 ; g = 255 ; b = 50
flag = TEXTFORMAT_BOLD
End If
Exit
End If
Next
SetTextAreaText(textArea,tempToken,lineCharStart,Len(tempToken))
FormatTextAreaText(textArea,r,g,b,flag,lineCharStart,Len(tempToken))
lineCharStart = lineCharStart+Len(tempToken)
Next
End Function
Function FormatDocument(textArea:TGadget)
Local lineCount:Int = TextAreaLine(textArea,TextAreaLen(textArea))
Local currentline:Int, lineString:String
Local lineCharStart:Int, lineCharEnd:Int
For Local loopx:Int = 0 To lineCount
lineCharStart = TextAreaChar(textArea,loopx)
lineString = ""
For Local loop:Int = lineCharStart To TextAreaLen(textArea)
Local char:String = TextAreaText$(textArea,loop,1)
If (TextAreaLine(textArea,loop) <> loopx) Or (loopx = TextAreaLen(textArea))
lineCharEnd = loop-1
Exit
End If
lineString = lineString + char
Next
Local lex:TLexer = New TLexer
lex.mLexLine(lineString)
Local r:Int,g:Int,b:Int,flag:Int
Local inTag:Byte = False
For Local loop:Int = 0 To lex.iTokenAmount
r = 255 ; g = 255 ; b = 255 ; flag = 0
Local tempToken:String = lex.sTokenBank[loop]
If tempToken = "<"
r = 0 ; g = 255 ; b = 255
inTag = True
End If
If tempToken = ">"
r = 0 ; g = 255 ; b = 255
inTag = False
End If
If tempToken = "/" Or tempToken = "!"
If lex.sTokenBank[loop-1] = "<"
r = 255 ; g = 255 ; b = 50
flag = TEXTFORMAT_BOLD
End If
End If
For Local keyWordLoop:Int = 0 To lex.sKeywords.length-1
If intag = True
If lex.sKeywords[KeyWordLoop] = tempToken
r = 255 ; g = 255 ; b = 50
flag = TEXTFORMAT_BOLD
Exit
End If
If tempToken = "h"
If lex.sTokenBank[loop-1] = "<" Or lex.sTokenBank[loop-1] = "/"
r = 255 ; g = 255 ; b = 50
flag = TEXTFORMAT_BOLD
End If
End If
End If
Next
If Left$(tempToken,1) = "~q"
r = 50 ; g = 255 ; b = 50
End If
For Local numbersLoop:Int = 0 To lex.sNumbers.length-1
If lex.sNumbers[numbersLoop] = Left$(tempToken,1)
r = 192 ; g = 192 ; b = 192
If lex.sTokenBank[loop-1] = "h"
r = 255 ; g = 255 ; b = 50
flag = TEXTFORMAT_BOLD
End If
Exit
End If
Next
SetTextAreaText(textArea,tempToken,lineCharStart,Len(tempToken))
FormatTextAreaText(textArea,r,g,b,flag,lineCharStart,Len(tempToken))
lineCharStart = lineCharStart+Len(tempToken)
Next
Next
End Function
Type TLexer
Field sSymbols:String[] = [" ","+","-","*","^","/","%","=",">","<",":","{","}","[","]","(",")",";","&"]
Field sAlpha:String[] = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","Z","B","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","_"]
Field sNumbers:String[] = ["0","1","2","3","4","5","6","7","8","9","."]
Field sKeywords:String[] = ["body","doctype","head","html","meta","address","blockquote","br","div","em","h1","h2","h3","h4","h5","h6","p","pre","strong","sub","sup","b","big","hr","i","small","tt","dd","dl","dt","li","ol","ul","a","caption","table","td","th","tr","frame","frameset","iframe","noframes","img","map","object","style","button","form","input","label","legend","option","select","textarea","script","noscript"]
Field sTok:String = ""
Field bInStruct:Byte, sCurrentStructIdentifier:String
Field iTOKENS_PER_LINE:Int = 512
Field sTokenBank:String[iTOKENS_PER_LINE]
Field iTokenAmount:Int
'Field lstTokenList:TList = New TList
Field lstSymbolTable:TList = New TList
Field TYPE_UNKNOWN:Int = 0, TYPE_STRING:Int = 1, TYPE_IDENTIFIER:Int = 2, TYPE_COMMAND:Int = 3, TYPE_INTEGER:Int = 4, TYPE_FLOAT:Int = 5
Field TYPE_SYMBOL:Int = 6, TYPE_VARIABLE:Int = 7, TYPE_CONSTANT:Int = 8, TYPE_FUNCTION:Int = 9,TYPE_ARRAY:Int = 10, TYPE_STRUCT:Int = 11
Field DATA_UNKNOWN:Int = 0, DATA_INTEGER:Int = 1, DATA_FLOAT:Int = 2, DATA_STRING:Int = 3
Method TokenAmount:Int()
Return(iTokenAmount)
End Method
Method mLexLine:Int(sLinein:String)
Local sTempToken:String
Local iLoopLine:Int, iLoopOther:Int, sChar:String
Local bInString:Byte = False
iTokenAmount = 0
' lstTokenList.Clear()
For iLoopOther = 0 To iTOKENS_PER_LINE-1
sTokenBank[iLoopOther] = ""
Next
sLinein = sLinein + " "
For iLoopLine = 1 To Len(sLinein)
sChar = Mid$(sLinein,iLoopLine,1)
If sChar = "/"
If Mid$(sLinein,iLoopLine+1,1) = "/" Then Exit
End If
'check for strings
If sChar = "~q"
sTempToken = sChar
For iLoopLine = iLoopLine+1 To Len(sLinein)
sChar = Mid$(sLinein,iLoopLine,1)
If sChar = "~q" Then Exit
sTempToken = sTempToken + sChar
Next
sTempToken = sTempToken + sChar
iLoopLine = iLoopLine
iTokenAmount = iTokenAmount + 1
sTokenBank[iTokenAmount] = sTempToken
sTempToken = ""
End If
Local bDoExit:Byte
'Check for letters such as commands or identifiers
For iLoopOther = 0 To sAlpha.length-1
If sChar = sAlpha[iLoopOther]
sTempToken = sChar
For iLoopLine = iLoopLine+1 To Len(sLinein)
sChar = Mid$(sLinein,iLoopLine,1)
For iLoopOther = 0 To sAlpha.length-1
If sChar <> sAlpha[iLoopOther]
bDoExit = True
End If
If sChar = sAlpha[iLoopOther]
sTempToken = sTempToken + sChar
bDoExit = False
Exit
End If
Next
If bDoExit = True
iLoopLine = iLoopLine - 1
iTokenAmount = iTokenAmount + 1
sTokenBank[iTokenAmount] = Lower$(sTempToken)
sTempToken = ""
sChar = ""
Exit
End If
Next
End If
If bDoExit = True Then Exit
Next
'Check for numbers, including floats:-
bDoExit = False
For iLoopOther = 0 To sNumbers.length-1
If sChar = sNumbers[iLoopOther]
sTempToken = sChar
For iLoopLine = iLoopLine+1 To Len(sLinein)
sChar = Mid$(sLinein,iLoopLine,1)
For iLoopOther = 0 To sNumbers.length-1
If sChar <> sNumbers[iLoopOther]
bDoExit = True
End If
If sChar = sNumbers[iLoopOther]
sTempToken = sTempToken + sChar
bDoExit = False
Exit
End If
Next
If bDoExit = True
iLoopLine = iLoopLine - 1
iTokenAmount = iTokenAmount + 1
sTokenBank[iTokenAmount] = sTempToken
sTempToken = ""
sChar = ""
Exit
End If
Next
End If
If bDoExit = True Then Exit
Next
For iLoopOther = 0 To sSymbols.length-1
If sChar = sSymbols[iLoopOther]
sTempToken = sChar
iTokenAmount = iTokenAmount + 1
sTokenBank[iTokenAmount] = sTempToken
sTempToken = ""
sChar = ""
Exit
End If
Next
If sChar = " "
iTokenAmount = iTokenAmount + 1
sTokenBank[iTokenAmount] = sTempToken
sTempToken = ""
sChar = ""
End If
If sChar = "~t"
iTokenAmount = iTokenAmount + 1
sTokenBank[iTokenAmount] = sTempToken
sTempToken = ""
sChar = ""
End If
Next
iTokenAmount = iTokenAmount - 1
Return(iTokenAmount)
End Method
End Type
Comments : none...