Basic Univers
Structure LN
Editor_Ed.l
Container.l
Editor_Ln.l
EndStructure
Global NewList LNumber.LN()
Global LN
Procedure LN_Init(gadget)
Find =#False
ForEach LNumber()
If LNumber()\editor_ed = gadget
Find =#True
Break
EndIf
Next
If Find =#False
LastElement(LNumber())
AddElement(LNumber())
LNumber()\Editor_ed = gadget
gadget_x = GadgetX(gadget)
gadget_y = GadgetY(gadget)
gadget_width = GadgetWidth(gadget)
gadget_height = GadgetHeight(gadget)
ResizeGadget(gadget, gadget_x + 50, #PB_Ignore, gadget_width - 50, #PB_Ignore)
LNumber()\Container = ContainerGadget(#PB_Any, gadget_x, gadget_y, 50, gadget_height, #PB_Container_BorderLess)
LNumber()\Editor_Ln = EditorGadget(#PB_Any, 0, 0, 50, gadget_height)
SendMessage_(GadgetID(LNumber()\Editor_Ln), #EM_SHOWSCROLLBAR, #SB_VERT, #False)
SendMessage_(GadgetID(LNumber()\Editor_Ln), #EM_SHOWSCROLLBAR, #SB_HORZ, #False)
CloseGadgetList()
AddGadgetItem(LNumber()\Editor_Ln, - 1, "1 ")
SendMessage_(GadgetID(LNumber()\Editor_Ln), #EM_SETBKGNDCOLOR, 0, RGB(248, 248, 220))
SendMessage_(GadgetID(LNumber()\Editor_Ln), #EM_SETREADONLY, 1, 0)
SendMessage_(GadgetID(gadget), #EM_SETEVENTMASK, 0, #ENM_UPDATE | #ENM_CHANGE | #ENM_SCROLL | #ENM_KEYEVENTS)
egFormat.CHARFORMAT
egFormat\cbSize = SizeOf(CHARFORMAT)
egFormat\dwMask = #CFM_SIZE | #CFM_COLOR
size = 8
egFormat\yHeight = size*20
SendMessage_(GadgetID(LNumber()\Editor_Ln), #EM_SETCHARFORMAT, #SCF_ALL, @egFormat)
SendMessage_(GadgetID(LNumber()\editor_ed), #EM_GETSCROLLPOS, 0, @egOne.POINT)
egOne\x = 0
SendMessage_(GadgetID(LNumber()\editor_ed), #EM_HIDESELECTION, #True, 0)
SetGadgetText(LNumber()\editor_ed, GetGadgetText(LNumber()\editor_ed))
SendMessage_(GadgetID(LNumber()\editor_ed), #EM_HIDESELECTION, #False, 0)
SendMessage_(GadgetID(LNumber()\editor_ed), #EM_SETSCROLLPOS, 0, egOne)
egPara.PARAFORMAT2
egPara\cbSize = SizeOf(PARAFORMAT2)
egPara\dwMask = #PFM_ALIGNMENT
egpara\wAlignment = #PFA_RIGHT
SendMessage_(GadgetID(LNumber()\Editor_Ln), #EM_SETPARAFORMAT, #SCF_ALL, @egPara)
SendMessage_(GadgetID(LNumber()\Editor_Ln), #EM_GETSEL, @StartSel, @EndSel)
Buffer$ = Space(EndSel - StartSel)
SendMessage_(GadgetID(LNumber()\Editor_Ln), #EM_GETSELTEXT, 0, @Buffer$)
SendMessage_(GadgetID(LNumber()\Editor_Ln), #EM_GETSCROLLPOS, 0, @scrollP.POINT)
SendMessage_(GadgetID(LNumber()\Editor_Ln), #EM_REPLACESEL, #True, @Buffer$)
SendMessage_(GadgetID(LNumber()\Editor_Ln), #EM_SETSCROLLPOS, 0, scrollP.POINT)
SendMessage_(GadgetID(LNumber()\editor_ln), #EM_SETMARGINS, 1|2, 0|(10<<16))
EndIf
ProcedureReturn
EndProcedure
Procedure LN_Stop(gadget)
If IsGadget(gadget)
Find =- 1
ForEach LNumber()
If LNumber()\editor_ed = gadget
Find = ListIndex(LNumber())
Break
EndIf
Next
If Find>- 1
SelectElement(LNumber(), Find)
editor_ed = LNumber()\editor_ed
container = LNumber()\container
editor_ln = LNumber()\editor_ln
DeleteElement(LNumber(), 1)
size_container = GadgetWidth(container)
FreeGadget(editor_ln)
FreeGadget(container)
ResizeGadget(editor_ed, GadgetX(editor_ed)- size_container, #PB_Ignore, GadgetWidth(editor_ed)+ size_container, #PB_Ignore)
EndIf
EndIf
EndProcedure
Procedure LN_Update(param =- 1)
If param =- 1
ForEach LNumber()
LN_Update(LNumber()\editor_ed)
Next
Else
ForEach LNumber()
If LNumber()\editor_ed = param
Break
EndIf
Next
If EventGadget() = LNumber()\editor_ln
firstline = SendMessage_(GadgetID(LNumber()\editor_ln), #EM_GETFIRSTVISIBLELINE, 0, 0)
SetActiveGadget(LNumber()\editor_ed)
EndIf
EndIf
EndProcedure
Procedure LN_SetColorText(Gadget, Color)
ForEach LNumber()
If LNumber()\editor_ed = Gadget
Break
EndIf
Next
If ListIndex(LNumber()) > - 1
SendMessage_(GadgetID(LNumber()\editor_ln), #EM_SETBKGNDCOLOR, 0, Color)
SendMessage_(GadgetID(LNumber()\editor_ed), #EM_GETSCROLLPOS, 0, @egOne.POINT)
egOne\x = 0
SendMessage_(GadgetID(LNumber()\editor_ed), #EM_SETSCROLLPOS, 0, egOne)
EndIf
EndProcedure
Procedure LN_SetColorBack(Gadget, Color)
ForEach LNumber()
If LNumber()\editor_ed = Gadget
Break
EndIf
Next
If ListIndex(LNumber()) > - 1
egFormat.CHARFORMAT
egFormat\cbSize = SizeOf(CHARFORMAT)
SendMessage_(GadgetID(LNumber()\editor_ln), #EM_GETCHARFORMAT, #SCF_ALL, @egFormat)
egFormat\dwMask | #CFM_SIZE | #CFM_COLOR
size = 8
egFormat\yHeight = size*20
egFormat\crTextColor = Color
SendMessage_(GadgetID(LNumber()\editor_ln), #EM_SETCHARFORMAT, #SCF_ALL, @egFormat)
SendMessage_(GadgetID(LNumber()\editor_ed), #EM_GETSCROLLPOS, 0, @egOne.POINT)
egOne\x = 0
SendMessage_(GadgetID(LNumber()\editor_ln), #EM_SETSCROLLPOS, 0, egOne)
EndIf
EndProcedure
Procedure LN_Resize(Gadget, Valeur)
ForEach LNumber()
If LNumber()\editor_ed = Gadget
Break
EndIf
Next
If ListIndex(LNumber()) > - 1
ResizeGadget(LNumber()\Container, #PB_Ignore, #PB_Ignore, GadgetWidth(LNumber()\Container)+ Valeur, #PB_Ignore)
ResizeGadget(LNumber()\editor_ln, #PB_Ignore, #PB_Ignore, GadgetWidth(LNumber()\editor_ln)+ Valeur, #PB_Ignore)
ResizeGadget(LNumber()\editor_ed, GadgetX(LNumber()\editor_ed)+ Valeur, #PB_Ignore, GadgetWidth(LNumber()\editor_ed)- Valeur, #PB_Ignore)
EndIf
EndProcedure
Procedure Test_SetColor(Gadget)
ForEach LNumber()
If LNumber()\editor_ed = Gadget
Break
EndIf
Next
SendMessage_(GadgetID(LNumber()\editor_ed), #EM_SETBKGNDCOLOR, 0, RGB(Random(255), Random(255), Random(255)))
EndProcedure
Procedure.l LN_Callback(hwnd, msg, wparam, lparam)
Shared previousItems
result = #PB_ProcessPureBasicEvents
Find =#False
ForEach LNumber()
If IsGadget(LNumber()\editor_ed)
If GadgetID(LNumber()\editor_ed)= lparam
Find =#True
Break
EndIf
EndIf
Next
If Find =#True
Select msg
Case #WM_COMMAND
If IsGadget(LNumber()\editor_ed) And IsGadget(LNumber()\editor_ln)
If lparam = GadgetID(LNumber()\editor_ed)
Select wparam >>16&$FFFF
Case #EN_VSCROLL
SendMessage_(GadgetID(LNumber()\editor_ed), #EM_GETSCROLLPOS, 0, @egOne.POINT)
egOne\x = 0
SendMessage_(GadgetID(LNumber()\editor_ln), #EM_SETSCROLLPOS, 0, egOne)
Case #EN_UPDATE
SendMessage_(GadgetID(LNumber()\editor_ed), #EM_SETCHARFORMAT, #SCF_ALL, @egFormat)
SendMessage_(GadgetID(LNumber()\editor_ed), #EM_GETSCROLLPOS, 0, @egOne.POINT)
egOne\x = 0
SendMessage_(GadgetID(LNumber()\editor_ln), #EM_SETSCROLLPOS, 0, egOne)
Case #EN_CHANGE
currentLine = SendMessage_(GadgetID(LNumber()\editor_ed), #EM_LINEFROMCHAR, - 1, 0)+ 1
lnItems = CountGadgetItems(LNumber()\editor_ln)
egItems = CountGadgetItems(LNumber()\editor_ed)
If egItems > lnItems
For i = lnItems + 1 To egItems
AddGadgetItem(LNumber()\editor_ln, i, Str(i))
Next i
EndIf
If egItems < lnItems
For i = lnItems To egItems Step - 1
RemoveGadgetItem(LNumber()\editor_ln, i)
Next i
SendMessage_(GadgetID(LNumber()\editor_ln), #EM_SETREADONLY, 0, 0)
SendMessage_(GadgetID(LNumber()\editor_ln), #WM_KEYDOWN, #VK_BACK, 0)
SendMessage_(GadgetID(LNumber()\editor_ln), #WM_KEYUP, #VK_BACK, 0)
SendMessage_(GadgetID(LNumber()\editor_ln), #EM_SETREADONLY, 1, 0)
EndIf
SendMessage_(GadgetID(LNumber()\editor_ed), #EM_GETSCROLLPOS, 0, @egOne.POINT)
egOne\x = 0
SendMessage_(GadgetID(LNumber()\editor_ln), #EM_SETSCROLLPOS, 0, egOne)
previousItems = egItems
EndSelect
EndIf
EndIf
EndSelect
EndIf
ProcedureReturn result
EndProcedure
If OpenWindow(0, 0, 0, 700, 500, "EditorGadget w/Line Numbers", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
SetWindowCallback(@LN_Callback())
CreateMenu(1, WindowID(0))
MenuTitle("F&ile")
MenuItem(104, "&Quit" + Chr(9) + "Ctrl+Q")
MenuTitle("&AZERTY")
MenuItem(121, "Colonne > &Fond")
MenuItem(122, "Colonne > &Texte")
MenuItem(123, "&Editor > Fond")
MenuItem(124, "Colonne > Taille +")
MenuItem(125, "Colonne > Taille -")
MenuItem(126, "Stop")
MenuItem(127, "Commencer")
AddKeyboardShortcut(0, #PB_Shortcut_F1, 121)
AddKeyboardShortcut(0, #PB_Shortcut_F2, 122)
AddKeyboardShortcut(0, #PB_Shortcut_F3, 123)
AddKeyboardShortcut(0, #PB_Shortcut_F4, 124)
AddKeyboardShortcut(0, #PB_Shortcut_F5, 125)
AddKeyboardShortcut(0, #PB_Shortcut_F6, 126)
AddKeyboardShortcut(0, #PB_Shortcut_F7, 127)
EditorGadget(4, 40, 0, 250, 400)
LN_Init(4)
list = EditorGadget(#PB_Any, 290, 0, 250, 400)
LN_Init(list)
For i = 0 To 100
AddGadgetItem(4, i, "Line" + Str(i))
AddGadgetItem(list, i, "Line" + Str(i))
Next
Repeat
event = WaitWindowEvent()
LN_Update()
Select event
Case #PB_Event_Menu
Select EventMenu()
Case 104
CloseWindow(0)
Case 121
LN_SetColorText(4, RGB(Random(255), Random(255), Random(255)))
LN_SetColorText(list, RGB(Random(255), Random(255), Random(255)))
Case 122
LN_SetColorBack(4, RGB(Random(255), Random(255), Random(255)))
LN_SetColorBack(list, RGB(Random(255), Random(255), Random(255)))
Case 123
Test_SetColor(4)
Test_SetColor(list)
Case 124
LN_Resize(4, 5)
LN_Resize(list, 5)
Case 125
LN_Resize(4, - 5)
LN_Resize(list, - 5)
Case 126
LN_Stop(4)
LN_Stop(list)
Case 127
LN_Init(4)
LN_Init(list)
EndSelect
EndSelect
Until event = #PB_Event_CloseWindow
EndIf
End