Code : Tout sélectionner
ProcedureDLL TEditor_Init()
; Numérotation des lignes
Structure LN
Editor_Ed.l
Container.l
Editor_Ln.l
EndStructure
Global NewList LNumber.LN()
EndProcedure
;- OK Numérotation de Lignes
;{
Procedure.l TEditor_LN_Callback(hwnd, msg, wparam, lparam)
OriginProc.l= GetProp_(hWnd, "OriginProc")
Shared previousItems
result = #PB_ProcessPureBasicEvents
Find=#False
For i=0 To CountList(LNumber())-1
SelectElement(LNumber(),i)
If IsGadget(LNumber()\Editor_ed)
Debug Str(wparam)+"-"+Str(lparam)+"-"+Str(GadgetID(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
; --> Keep linenumbers in sync with EditorGadget scrolling up or down (clicking scroll buttons)
SendMessage_(GadgetID(LNumber()\Editor_ed), #EM_GETSCROLLPOS, 0, @egOne.POINT)
; --> Keep numbers from scrolling left
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)
; --> Keep linenumbers in sync with EditorGadget scrolling up or down (dragging scroll thumb)
SendMessage_(GadgetID(LNumber()\Editor_ed), #EM_GETSCROLLPOS, 0, @egOne.POINT)
; --> Keep numbers from scrolling left
egOne\x = 0
SendMessage_(GadgetID(LNumber()\Editor_ln), #EM_SETSCROLLPOS, 0, egOne)
Case #EN_CHANGE
; --> Keep linenumbers in sync with EditorGadget adding or removing items
currentLine = SendMessage_(GadgetID(LNumber()\Editor_ed), #EM_LINEFROMCHAR, -1, 0)+1
lnItems = CountGadgetItems(LNumber()\Editor_ln)
egItems = CountGadgetItems(LNumber()\Editor_ed)
; --> For now I just clear the entire number list when items are
; --> added or removed. >>>>>>>>>>>>> Causes slight flicker so find a better way! <<<<<<<<<<<<<<
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
; --> Remove the last CR/LF left behind by RemoveGadgetItem
; --> Readonly off for linenumbers
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
; --> Keep linenumbers in sync with EditorGadget scrolling up or down (dragging scroll thumb)
SendMessage_(GadgetID(LNumber()\Editor_ed), #EM_GETSCROLLPOS, 0, @egOne.POINT)
; --> Keep numbers from scrolling left
egOne\x = 0
SendMessage_(GadgetID(LNumber()\Editor_ln), #EM_SETSCROLLPOS, 0, egOne)
previousItems = egItems
EndSelect
EndIf
EndIf
Case #WM_CLOSE
RemoveProp_(hWnd,"OriginProc")
EndSelect
EndIf
ProcedureReturn CallWindowProc_(OriginProc,hWnd,Msg,wParam,lParam)
EndProcedure
ProcedureDLL TEditor_LN_SetState(Gadget.l,State.l)
If State=#True
;{
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=TEditor_GetFontSize(gadget)
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)
;}
;{ Mise à droite des colonnes
egPara.PARAFORMAT2
egPara\cbSize = SizeOf(PARAFORMAT2)
egPara\dwMask = #PFM_ALIGNMENT
egpara\wAlignment = #PFA_RIGHT
SendMessage_(GadgetID(LNumber()\Editor_Ln), #EM_SETPARAFORMAT, #SCF_ALL, @egPara)
; récupère le texte de la sélection
SendMessage_(GadgetID(LNumber()\Editor_Ln),#EM_GETSEL,@StartSel,@EndSel)
Buffer$ = Space(EndSel-StartSel)
SendMessage_(GadgetID(LNumber()\Editor_Ln),#EM_GETSELTEXT,0,@Buffer$)
; récupère la position des barres de scroll
SendMessage_(GadgetID(LNumber()\Editor_Ln), #EM_GETSCROLLPOS, 0, @scrollP.POINT)
SendMessage_(GadgetID(LNumber()\Editor_Ln),#EM_REPLACESEL,#True,@Buffer$)
; définit la position des barres de scroll
SendMessage_(GadgetID(LNumber()\Editor_Ln), #EM_SETSCROLLPOS, 0, scrollP.POINT)
;}
SendMessage_(GadgetID(LNumber()\Editor_ln),#EM_SETMARGINS,1|2, 0|(10<<16))
EndIf
ProcedureReturn
;}
Else
;{
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)
; libération des gadgets
FreeGadget(Editor_ln)
FreeGadget(container)
; redimensionnement de l'éditeur
ResizeGadget(Editor_ed,GadgetX(Editor_ed)-size_container,#PB_Ignore,GadgetWidth(Editor_ed)+size_container,#PB_Ignore)
EndIf
EndIf
ProcedureReturn
;}
EndIf
EndProcedure
ProcedureDLL TEditor_LN_Start(Window.l)
OriginProc = SetWindowLong_(WindowID(Window), #GWL_WNDPROC, @TEditor_LN_Callback())
SetProp_(WindowID(Window), "OriginProc", OriginProc)
EndProcedure
ProcedureDLL TEditor_Info()
MessageRequester("", "Number:"+Str(CountList(LNumber())))
For i=0 To CountList(LNumber())-1
SelectElement(LNumber(),i)
MessageRequester("",Str(ListIndex(LNumber()))+"-"+Str(LNumber()\editor_ln))
Next
EndProcedure
;}
TEditor_Init()
If OpenWindow(0, 0, 0, 520, 440, "LibEditorPlus - Exemple > Numérotation des lignes", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
; Initialisation de la numerotation des lignes pour cette fenetre
TEditor_LN_Start(0)
;{ Menus
CreateMenu(1, WindowID(0))
MenuTitle("EditorGadget")
MenuItem(1, "Colonne > Fond"+Chr(9)+"F1")
MenuItem(2, "Colonne > Texte"+Chr(9)+"F2")
MenuItem(3, "Colonne > Taille +"+Chr(9)+"F3")
MenuItem(4, "Colonne > Taille -"+Chr(9)+"F4")
MenuItem(5, "Editeur > Fond"+Chr(9)+"F5")
MenuItem(6, "Stop"+Chr(9)+"F6")
MenuItem(7, "Commencer"+Chr(9)+"F7")
MenuItem(8, "Infos"+Chr(9)+"F8")
AddKeyboardShortcut(0,#PB_Shortcut_F1,1)
AddKeyboardShortcut(0,#PB_Shortcut_F2,2)
AddKeyboardShortcut(0,#PB_Shortcut_F3,3)
AddKeyboardShortcut(0,#PB_Shortcut_F4,4)
AddKeyboardShortcut(0,#PB_Shortcut_F5,5)
AddKeyboardShortcut(0,#PB_Shortcut_F6,6)
AddKeyboardShortcut(0,#PB_Shortcut_F7,7)
AddKeyboardShortcut(0,#PB_Shortcut_F8,8)
;}
;{ EditorGadget
PanelGadget(1000,0,0,250,400)
AddGadgetItem(1000,-1,"WIP_0")
EditorGadget(4,000,10,250,400)
TEditor_LN_SetState(4,#True)
TEditor_Info()
AddGadgetItem(1000,-1,"WIP_1")
Editor=EditorGadget(#PB_Any,000,10,250,400)
TEditor_LN_SetState(Editor,#True)
TEditor_Info()
CloseGadgetList()
For i=0 To 100
AddGadgetItem(4,i,"Line"+Str(i))
AddGadgetItem(Editor,i,"Line"+Str(i))
Next
;}
Repeat
event = WaitWindowEvent()
Select event
Case #PB_Event_Menu
Select EventMenu()
Case 8
TEditor_Info()
EndSelect
EndSelect
Until event = #PB_Event_CloseWindow
EndIf
End