Syntax highlighting editor

BlitzPlus Forums/BlitzPlus Programming/Syntax highlighting editor

The forum is locked. These are the original blitzbasic.com forums, kept so they can still be read. No new topics, replies or edits can be made here. To join in, head over to the Blitz3D+ forums.

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