Procedure EditorGadgetCursorX(Gadget) ; returns X-Pos of Cursor REG = GadgetID(Gadget) SendMessage_(REG,#EM_EXGETSEL,0,Range.CHARRANGE) ProcedureReturn (Range\cpMax-(SendMessage_(REG,#EM_LINEINDEX,SendMessage_(REG,#EM_EXLINEFROMCHAR,0,Range\cpMin),0))+1) EndProcedure Procedure EditorGadgetCursorY(Gadget) ; returns Y-Pos of Cursor REG = GadgetID(Gadget) SendMessage_(REG,#EM_EXGETSEL,0,Range.CHARRANGE) ProcedureReturn SendMessage_(REG,#EM_EXLINEFROMCHAR,0,Range\cpMin)+1 EndProcedure Procedure EditorGadgetCursorPos(Gadget) ; returns relative Position of Cursor SendMessage_(GadgetID(Gadget),#EM_EXGETSEL,0,Range.CHARRANGE) ProcedureReturn Range\cpMax EndProcedure Procedure EditorGadgetLocate(Gadget,x,y) ; Set cursor position REG = GadgetID(Gadget) CharIdx = SendMessage_(REG,#EM_LINEINDEX,y-1,0) LLength = SendMessage_(REG,#EM_LINELENGTH,CharIdx,0) If LLength >= x-1 CharIdx + x-1 EndIf Range.CHARRANGE Range\cpMin = CharIdx Range\cpMax = CharIdx SendMessage_(REG,#EM_EXSETSEL,0,Range) EndProcedure Procedure EditorGadgetSelect(Gadget, LineStart.l, CharStart.l, LineEnd.l, CharEnd.l) 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 EditorGadgetColor(Gadget, Color.l) format.CHARFORMAT format\cbSize = SizeOf(CHARFORMAT) format\dwMask = #CFM_COLOR format\crTextColor = Color SendMessage_(GadgetID(Gadget), #EM_SETCHARFORMAT, #SCF_SELECTION, @format) EndProcedure Procedure SyntaxHighlightEditor(gadget.l, keywords.s = "", allowedchars.s = "", color.l = 0) Static lastcontent.s = "" Static docolors.b = #False If (keywords = "") docolors = #True If (lastcontent = GetGadgetText(gadget)) docolors = #False ProcedureReturn EndIf Else If (Not docolors) ProcedureReturn EndIf EndIf allowedchars = LCase(allowedchars) keywords = LCase(keywords) x.l = EditorGadgetCursorX(gadget) y.l = EditorGadgetCursorY(gadget) SendMessage_(GadgetID(gadget), #WM_SETREDRAW, 0, 0) DisableGadget(gadget, #True) cnt.l = CountGadgetItems(gadget) For i.l = 0 To cnt-1 If (keywords = "") EditorGadgetSelect(gadget, i, 1, i, -1) EditorGadgetColor(gadget, 0) EditorGadgetSelect(gadget, 0,0,0,0) Else textline.s = LCase(GetGadgetItemText(gadget, i)) j.l = 0 Repeat j + 1 keyword.s = StringField(keywords, j, ",") If (keyword = "") Break EndIf k.l = 1 k = FindString(textline, keyword, k) While (k) If ((k = 1 Or FindString(allowedchars, Mid(textline, k-1, 1), 1) = 0) And (k+Len(keyword)-1 = Len(textline) Or FindString(allowedchars, Mid(textline, k+Len(keyword), 1), 1) = 0)) EditorGadgetSelect(gadget, i, k, i, k+Len(keyword)) EditorGadgetColor(gadget, color) EditorGadgetSelect(gadget, 0,0,0,0) EditorGadgetColor(gadget, 0) EndIf k = FindString(textline, keyword, k+1) Wend ForEver EndIf Next i SendMessage_(GadgetID(gadget), #WM_SETREDRAW, 1, 0) DisableGadget(gadget, #False) SetActiveGadget(gadget) EditorGadgetLocate(gadget, x, y) lastcontent = GetGadgetText(gadget) EndProcedure