Hey all,
Just a quick demo of a syntax highlighting text editor:
;
;Demo of a simple syntax highlighting editor!
;
;Auto-capitalizes words and sets some funky colors for numbers,
;strings and comments.
;
;Formatting is performed 'per-line', and changes in linecount are
;tracked to determine how many lines to reformat.
;
;Note: the color and formatting logic is a little convoluted in
;the interests of minimizing textarea modifications for SPEED.
;
window=CreateWindow( "Simple syntax highlighting text editor",0,0,640,480 )
textarea=CreateTextArea( 0,0,ClientWidth(window),ClientHeight(window)-96,window )
SetGadgetLayout textarea, 1,1,1,1
font=LoadFont( "lucida",20 )
SetTextAreaFont textarea,font
SetTextAreaColor textarea,0,0,0,True
SetTextAreaColor textarea,255,255,255
ActivateGadget textarea
Global output=CreateTextArea( 0,ClientHeight(window)-96,ClientWidth(window),96,window )
DisableGadget output
SetGadgetLayout output,1,1,0,1
SetTextAreaColor output,0,0,0
SetTextAreaColor output,192,192,192,True
bp$=GetEnv$("blitzpath")
tmp$=bp$+"/tmp/tmp.bb"
bcc$=bp$+"/bin/blitzcc"
Info( "Output window active!" )
Info( "blitzpath="+bp$ )
main_menu=WindowMenu( window )
file_menu=CreateMenu( "File",0,main_menu )
edit_menu=CreateMenu( "Edit",0,main_menu )
prog_menu=CreateMenu( "Program",0,main_menu )
go_menu=CreateMenu( "Go!",301,prog_menu )
UpdateWindowMenu window
HotKeyEvent 63,0,$1001,301 ;F5=program->go menu item
HotKeyEvent 1,0,$803,0,0,0,0,window ;ESC=close window!
n_lines=TextAreaLen( textarea,2 )
While WaitEvent()<>$803
Select EventID()
Case $103 ;key hit
Notify "Bam!"
Case $1001 ;menu action
Select EventData()
Case 301
t_file=WriteFile( tmp$ )
If t_file
WriteLine t_file,TextAreaText$( textarea )
CloseFile t_file
proc=CreateProcess( bcc$+" "+tmp$ )
If proc
While Not Eof(proc)
ln$=ReadLine$(proc)
If Len(ln$) Info( ln$ )
Wend
Else
Info( "Error creating blitzcc process",True )
EndIf
Else
Info( "Error writing tmp file",True )
EndIf
End Select
Case $401 ;gadget action
Select EventSource()
Case textarea
;calc row and column
row=TextAreaCursor( textarea,2 )
col=TextAreaCursor( textarea,1 )-TextAreaChar( textarea,row )
t_lines=0
If EventData()=1 ;modified?
;work how many lines added/removed
n=TextAreaLen( textarea,2 )
t_lines=n-n_lines
n_lines=n
If t_lines<0 t_lines=0
;lock textareas before big changes
LockTextArea textarea
;format the lines!!!!!
For n=row-t_lines To row
FormatLine( textarea,n )
Next
;unlock textarea
UnlockTextArea textarea
EndIf
SetStatusText window,"row="+(row+1)+" col="+(col+1)+" lines="+n_lines+" chars="+TextAreaLen(textarea)+" formated="+(t_lines+1)
End Select
End Select
Wend
End
Function info( t$,err=False )
If err t$="Error! - "+t$
AddTextAreaText output,t$+Chr$(10)
End Function
;return true for digits
Function IsDigit( i$ )
t=Asc(i$)
Return t>=48 And t<58
End Function
;return true for alphabetic characters
Function IsAlpha( i$ )
t=Asc(i$)
Return (t>=65 And t<65+26) Or (t>=97 And t<97+26)
End Function
Function FormatLine( textarea,n )
;line we're formatting
ln$=TextAreaText( textarea,n,1,2 )
;start-of-line character index
sol=TextAreaChar( textarea,n )
;color and format info
fmt_ch=0:fmt_r=0:fmt_g=0:fmt_b=0:fmt_f=-1
;next char to process
ch=1
While ch<=Len(ln$)
;save char index and get next char
t_ch=ch
i$=Mid$(ln$,ch,1)
;turn off formating flags (bold etc) by default
f=0
If IsDigit(i$)
;Format a numeric value
Repeat
ch=ch+1
If ch>Len(ln$) Exit
i$=Mid$(ln$,ch,1)
Until Not IsDigit(i$)
r=255:g=0:b=192 ;barf red
Else If IsAlpha(i$)
;Format an identifier
z$=i$
q$=Upper$(i$)
Repeat
ch=ch+1
If ch>Len(ln$) Exit
i$=Mid$(ln$,ch,1)
z$=z$+i$
q$=q$+Lower$(i$)
Until Not IsAlpha(i$)
If q$<>z$
SetTextAreaText textarea,q$,sol+t_ch-1,Len(q$)
EndIf
r=255:g=255:b=0:f=1 ;yellow, bold
Else If i$=Chr$(34)
;Format a string
Repeat
ch=ch+1
If ch>Len(ln$) Exit
i$=Mid$(ln$,ch,1)
Until i$=Chr$(34)
If i$=Chr$(34) ch=ch+1
r=0:g=255:b=0
Else If i$=";"
;Format a comment
ch=Len(ln$)+1
r=0:g=128:b=255:f=3 ;blue, bold-italic
Else
;Default formatting
ch=ch+1
r=255:g=255:b=255 ;white
EndIf
;if format changed, apply previous
If r<>fmt_r Or g<>fmt_g Or b<>fmt_b Or f<>fmt_f
If fmt_ch
FormatTextAreaText textarea,fmt_r,fmt_g,fmt_b,fmt_f,sol+fmt_ch-1,t_ch-fmt_ch
EndIf
fmt_ch=t_ch:fmt_r=r:fmt_g=g:fmt_b=b:fmt_f=f
EndIf
Wend
;format to EOL
If fmt_ch
FormatTextAreaText textarea,fmt_r,fmt_g,fmt_b,fmt_f,sol+fmt_ch-1,ch-fmt_ch
EndIf
End Function
|