I know scintilla is a much more powerful option of course, but still wanted to play around with the low-level way.
Code: Select all
Procedure Editor_Select(Gadget, LineStart.l, CharStart.l, LineEnd.l, CharEnd.l) ;;; thanks freak 2005!!
sel.CHARRANGE
sel\cpMin = SendMessage_(GadgetID(Gadget), #EM_LINEINDEX, LineStart, 0) + CharStart - 1
If LineEnd = -1
LineEnd = SendMessage_(GadgetID(Gadget), #EM_GETLINECOUNT, 0, 0)-1
EndIf
sel\cpMax = SendMessage_(GadgetID(Gadget), #EM_LINEINDEX, LineEnd, 0)
If CharEnd = -1
sel\cpMax + SendMessage_(GadgetID(Gadget), #EM_LINELENGTH, sel\cpMax, 0)
Else
sel\cpMax + CharEnd - 1
EndIf
SendMessage_(GadgetID(Gadget), #EM_EXSETSEL, 0, @sel)
EndProcedure
Procedure Editor_Color(Gadget, Color.l)
format.CHARFORMAT2
format\cbSize = SizeOf(CHARFORMAT2)
format\dwMask = #CFM_COLOR
format\crTextColor = Color
SendMessage_(GadgetID(Gadget), #EM_SETCHARFORMAT, #SCF_SELECTION, @format)
EndProcedure
Procedure Highlight(gad, t$, color)
Shared Line$, LineNumber
wordstart = FindString(Line$, t$, 1)
While wordstart <> 0
wordend = wordstart + Len(t$)
Editor_Select(gad, LineNumber, wordstart, LineNumber, wordend)
Debug "x" + Second(Date())
Editor_Color(gad, color)
wordstart = FindString(Line$, t$, wordend)
Wend
EndProcedure
Procedure ColoringRoutine(gad)
Shared Line$, LineNumber
SendMessage_(GadgetID(gad),#WM_SETREDRAW,0,0)
SendMessage_(GadgetID(gad), #EM_HIDESELECTION, 1,0)
SendMessage_(GadgetID(gad),#EM_GETSEL,@CurrentStartPos, @Line)
Line = SendMessage_(GadgetID(gad),#EM_LINEFROMCHAR, CurrentStartPos,0)
For LineNumber = (line - 20) To (line + 20)
Line$ = UCase(GetGadgetItemText(gad, LineNumber, 0))
Highlight(gad, "0", $0000FF)
Highlight(gad, "1", $0000FF)
Highlight(gad, "2", $0000FF)
Highlight(gad, "3", $0000FF)
Highlight(gad, "4", $0000FF)
Highlight(gad, "5", $0000FF)
Highlight(gad, "6", $0000FF)
Highlight(gad, "7", $0000FF)
Highlight(gad, "8", $0000FF)
Highlight(gad, "9", $0000FF)
Highlight(gad, "SYNTAX", $FF0000)
Next LineNumber
SendMessage_(GadgetID(gad), #EM_SETSEL, CurrentStartPos,CurrentStartPos)
SendMessage_(GadgetID(gad), #EM_HIDESELECTION, 0,0)
Editor_Color(gad, $000000)
SendMessage_(GadgetID(gad),#WM_SETREDRAW,1, 0)
InvalidateRect_(GadgetID(gad), 0, 1)
EndProcedure
Procedure FillList()
Shared prevupd
If Abs(ElapsedMilliseconds()-prevupd) > 200
ColoringRoutine(1)
prevupd = ElapsedMilliseconds()
EndIf
SetWindowTitle(0, Str(Len(GetGadgetText(1))) + " ch")
EndProcedure
#Editor = 1
OpenWindow(0, 0, 0, 500, 500, "EditorGadget", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
LoadFont(1, "Consolas", 14) : SetGadgetFont(-1, FontID(1))
EditorGadget(#Editor, 10, 10, 480, 480)
AddGadgetItem(#Editor, -1, "There are " + Str(Random(1000000)) + " ways to write a syntax highlighter.")
AddGadgetItem(#Editor, -1, "Nothing to highlight in this line.")
BindGadgetEvent(#Editor,@FillList(),#PB_EventType_Change )
ColoringRoutine(#Editor)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow