Basic Univers
#SCF_ALL = 4
#PFM_NUMBERINGSTYLE= $2000
#PFM_NUMBERINGTAB= $4000
#PFM_NUMBERINGSTART= $8000
Enumeration
#Editor_0
#Editor_1
EndEnumeration
Global egPara.PARAFORMAT2
egPara\cbSize = SizeOf(PARAFORMAT2)
egPara\dwMask = #PFM_NUMBERING | #PFM_NUMBERINGSTART | #PFM_NUMBERINGSTYLE | #PFM_NUMBERINGTAB
egPara\wNumbering = 2
egPara\wNumberingStart = 1
egPara\wNumberingStyle = $100
egPara\wNumberingTab = 700
Procedure ALineNumber(hWnd, msg, wParam, lParam)
result = #PB_ProcessPureBasicEvents
Shared previousLineCount
Select msg
Case #WM_COMMAND
Select wParam>>16 &$FFFF
Case #EN_CHANGE
currentLineCount = SendMessage_(lParam, #EM_GETLINECOUNT , 0, 0)
If currentLineCount <> previousLineCount
currentLine = SendMessage_(lParam, #EM_LINEFROMCHAR, - 1, 0)
currentPos = SendMessage_(lParam, #EM_GETSEL, @startPos, @endPos)
SendMessage_(lParam, #EM_GETSCROLLPOS, 0, @scrollP.POINT)
egPara\wNumberingStart = currentLine + 1
SendMessage_(lParam, #WM_SETREDRAW, 0, 0)
For a = currentLine - 1 To currentLineCount - 1
egPara\wNumberingStart = a + 1
line.s = GetGadgetItemText(GetActiveGadget(), a, 0)
If line = ""
line = " "
EndIf
SetGadgetItemText(GetActiveGadget(), a, line, 0)
SendMessage_(lParam, #EM_SETPARAFORMAT, 0, egPara)
If line = " "
line = ""
SetGadgetItemText(GetActiveGadget(), a, line, 0)
EndIf
Next a
SendMessage_(lParam, #EM_SETSCROLLPOS, 0, scrollP.POINT)
SendMessage_(lParam, #EM_SETSEL, startPos, startPos)
SendMessage_(lParam, #WM_SETREDRAW, 1, 0)
InvalidateRect_(lParam, 0, 1)
EndIf
previousLineCount = SendMessage_(lParam, #EM_GETLINECOUNT , 0, 0)
EndSelect
EndSelect
ProcedureReturn result
EndProcedure
If OpenWindow(0, 0, 0, 800, 600, "EditorGadget with Line Numbers", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
EditorGadget(#Editor_0, 0, 0, 400, 600)
EditorGadget(#Editor_1, 400, 0, 400, 600)
SendMessage_(GadgetID(#Editor_0), #EM_SETEVENTMASK, 0, #ENM_CHANGE)
SendMessage_(GadgetID(#Editor_1), #EM_SETEVENTMASK, 0, #ENM_CHANGE)
For l = 1 To 260
AddGadgetItem(#Editor_0, l, "Line " + Str(l))
AddGadgetItem(#Editor_1, l, "Line " + Str(l))
SendMessage_(GadgetID(#Editor_0), #EM_SETPARAFORMAT, 0, egPara)
SendMessage_(GadgetID(#Editor_1), #EM_SETPARAFORMAT, 0, egPara)
egPara\wNumberingStart + 1
Next
SetWindowCallback(@ALineNumber())
Repeat
event = WaitWindowEvent()
Until event = #PB_Event_CloseWindow
EndIf
End