Librairie PureSyntaxColoration et Probleme avec l'editor

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Librairie PureSyntaxColoration et Probleme avec l'editor

Message par Progi1984 »

Salut, je suis en train de faire un petit tool utilsant la coloration syntaxique avec ma propre lib
mais j'ai deux problemes :
  • 1. Comment trouver un entier dans une ligen ?
  • 2. Au niveau de l"editor, quand je dépasse la hauteur de la page il me fait remonter ma page rapidement et cela se voit !
Testez vous verrez
Voici mon code :

Code : Tout sélectionner

 Cf plus bas pour la version fonctionnant avec moins de problème
Dernière modification par Progi1984 le jeu. 27/janv./2005 11:31, modifié 1 fois.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Comment trouver un entier dans une ligen ?
ben c'est simple tu test charactere par charactere
puis si le code ascii est compris entre 48 et 57 c'est forcement un chiffre
tu le met dans une variable chaine
donc tu entre dans le 2 em algo (ou le meme recursivité ) qui verifie si le charactere suivant est aussi un chiffre si c'est le cas tu concatene ce chiffre avec celui d'avant dans la fameuse variable chaine
et tu recommence jusqu'a que le charactere observé ne soit plus compris entre 48 et 57

alors dans ta fameuse variable chaine ou tu a concatené (mis bout a bout)
tes chiffres tu obtiens un nombre (ou un chiffre s'il n'y en a eu qu'un)
que tu transforme en variable numerique avec "VAL()"

:D


Au niveau de l"editor, quand je dépasse la hauteur de la page il me fait remonter ma page rapidement et cela se voit !
j'ai plutot l'impression que ça vien du fait que tu réecris tes lignes
toujour a la mem coordonés , donc on appercois le reafichage de ces ligne avant que l'editeur se rafraichisse !


ta ligne " New.s=GetGadgetText(#Editor) "

je l'ai mis en dehors de la boucle Repeat until !! :D

Code : Tout sélectionner

;Par Progi1984
; Libraire PureSyntaxColoration
NewList keyword.s()
AddElement(keyword())
keyword()="if"
AddElement(keyword())
keyword()="then"
AddElement(keyword())
keyword()="endif"


FirstElement(keyword())
#Editor = 1

Procedure Editor_CursorX(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 Editor_CursorY(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 Editor_CursorPos(Gadget)
  ; returns relative Position of Cursor
  SendMessage_(GadgetID(Gadget),#EM_EXGETSEL,0,Range.CHARRANGE)
  ProcedureReturn Range\cpMax
EndProcedure

Procedure Editor_Locate(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 Editor_Select(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

; Set the Text color for the Selection
; in RGB format
Procedure Editor_Color(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

; Set Font Size for the Selection
; in pt
Procedure Editor_FontSize(Gadget, Fontsize.l)
  format.CHARFORMAT
  format\cbSize = SizeOf(CHARFORMAT)
  format\dwMask = #CFM_SIZE
  format\yHeight = FontSize*20
  SendMessage_(GadgetID(Gadget), #EM_SETCHARFORMAT, #SCF_SELECTION, @format)
EndProcedure

; Set Font for the Selection
; You must specify a font name, the font doesn't need
; to be loaded
Procedure Editor_Font(Gadget, FontName.s)
  format.CHARFORMAT
  format\cbSize = SizeOf(CHARFORMAT)
  format\dwMask = #CFM_FACE
  PokeS(@format\szFaceName, FontName)
  SendMessage_(GadgetID(Gadget), #EM_SETCHARFORMAT, #SCF_SELECTION, @format)
EndProcedure

; Set Format of the Selection. This can be a combination of
; the following values:
; #CFM_BOLD
; #CFM_ITALIC
; #CFM_UNDERLINE
; #CFM_STRIKEOUT
Procedure Editor_Format(Gadget, Flags.l)
  format.CHARFORMAT
  format\cbSize = SizeOf(CHARFORMAT)
  format\dwMask = #CFM_ITALIC|#CFM_BOLD|#CFM_STRIKEOUT|#CFM_UNDERLINE
  format\dwEffects = Flags
  SendMessage_(GadgetID(Gadget), #EM_SETCHARFORMAT, #SCF_SELECTION, @format)
EndProcedure

Procedure Editor_ColorText(gadget,ydeb,xdeb,yfin,xfin,color)
  Editor_Select(gadget,ydeb,xdeb,yfin,xfin)
  Editor_Color(gadget,color)
EndProcedure

Procedure Highlight(xx,yy)
  For i=0 To CountGadgetItems(#editor)-1
    text$=LCase(GetGadgetItemText(#editor,i,0))
    Debug text$
    If Len(text$)>0
      ;Keyword
      For j=0 To CountList(Keyword())
        SelectElement(keyword(),j)
        Debug keyword()
        p=FindString(text$,keyword(),0)
        If p>0
          spacer$=Mid(text$,p-1,1)
          If p=1 Or p=0 Or spacer$=" " Or spacer$="," Or spacer$="=" Or spacer$="("
            spacer$=Mid(text$,p+Len(keyword()),1)
            Debug spacer$
            If spacer$=" " Or spacer$="(" Or spacer$=""; Or spacer$=Chr(13) Or spacer$=Chr(10) Or spacer$="   "
              Editor_ColorText(#editor,i,p,i,p+Len(keyword())+1, RGB(0,255,0))
            EndIf
          EndIf
        EndIf
      Next
      ;strings
      p=1
      p=FindString(text$,Chr(34),p)
      Debug "p1-"+Str(p)
      If p>0
        If p
          p2=FindString(text$,Chr(34),p+1)
          Debug "p2-"+Str(p2)
        EndIf
        If p2>p
          Editor_ColorText(#editor,i,p,i,p2+1, RGB(255,0,0))
        EndIf
      EndIf
      ; commentaires
      p=FindString(text$,";",0)
      If p<>0
        Editor_ColorText(#Editor,i,p,i,Len(text$)+1, RGB(0,0,255))
      EndIf 
    EndIf
  Next
  Editor_Locate(#Editor,xx,yy)
EndProcedure
; -------------------------------------------------------------
; Source Example:



If OpenWindow(0, 0, 0, 500, 500, #PB_Window_SystemMenu|#PB_Window_ScreenCentered, "EditorGadget")
  If CreateGadgetList(WindowID())
    CallDebugger
    EditorGadget(#Editor, 10, 10, 480, 480)
    
    SetGadgetText(#Editor, "If you are ; a man if"+Chr(13)+Chr(10)+Chr(34)+";then go"+Chr(34)+" ; Aux hiotes"+Chr(13)+Chr(10)+";if not"+Chr(13)+Chr(10)+"not if")
    
    
    
    SendMessage_(GadgetID(#Editor),#EM_SETBKGNDCOLOR,0,RGB($FF,$FF,$BF))
    
    
    Editor_Select(#Editor, 0, 0, 0, 0)   ; select nothing again
      
    New.s=GetGadgetText(#Editor)  ;<<<<<< ça pas dans la boucle !!!!   DOBRO 
    
    Repeat
    
      If New.s<>old.s
        x=Editor_CursorX(#Editor)
        y=Editor_CursorY(#Editor)
        
        Highlight(x,y)
        old=New
        
        
        ;       Editor_Select(#Editor, i, line, i, lineb)
        Editor_Color(#Editor, RGB(0,0,0))       
      EndIf
      
    Until WaitWindowEvent() = #PB_EventCloseWindow
  EndIf
EndIf

End



; ExecutableFormat=Windows
; EOF
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Je teste et je te remercie d'avance !
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Voilà mes deux problèmes sont résolus :
1. Recherche des entiers c'est ok
2.@Dobro : Mettre "New.s=GetGadgetText(#editor)" en dehors de la boucle Repeat ne me permet pas d'obtenir le texte de l"editor gadget à chaque boucle. Mais j'ai résolu ce problème.

Hélas de nouveaux problèmes sont apparus :
1. Où peut-on avoir la liste des constantes à envoyer à un editorgadget avec un SendMessage

Code : Tout sélectionner

  SendMessage_(GadgetID(gadget),#EM_SETBKGNDCOLOR,0,color) 

où la constante est #EM_SETBKGNDCOLOR.
2. Quand je surligne avec la souris l'editorgadget, mes couleurs s'effacent. Pourquoi ?
3. Au niveau de la coloration des strings, je ne peux en choisir qu'une par ligne. Comment améliorer cela ?

Merci à dobro pour son aide sur les entiers

PS : La communauté purebasicienne est géniale.

Code : Tout sélectionner


NewList keyword.s()
AddElement(keyword())
keyword()="if"
AddElement(keyword())
keyword()="then"
AddElement(keyword())
keyword()="endif"
Global new.s,old.s
Global p
FirstElement(keyword())
#Editor = 1 

Procedure Editor_CursorX(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 Editor_Background(Gadget,color)
SendMessage_(GadgetID(gadget),#EM_SETBKGNDCOLOR,0,color)
EndProcedure

Procedure Editor_CursorY(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 Editor_Locate(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 Editor_Select(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 Editor_Color(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 Editor_ColorText(gadget,ydeb,xdeb,yfin,xfin,color)
  Editor_Select(gadget,ydeb,xdeb,yfin,xfin)
  Editor_Color(gadget,color)
EndProcedure

Procedure Editor_Highlight(xx,yy)
  i=Editor_CursorY(#editor)-1
  text$=LCase(GetGadgetItemText(#editor,i,0))
  
  Debug text$
  If Len(text$)>0
    ;Entiers
    For e=0 To Len(text$)
      If Asc(Mid(text$,e,1))>=48 And Asc(Mid(text$,e,1))<=57
        Editor_Colortext(#editor,i,e,i,e+1,RGB(128,128,0))
      EndIf
    Next
    ;Keyword
    For j=0 To CountList(Keyword())
      SelectElement(keyword(),j)
      Debug keyword()
      p=FindString(text$,keyword(),0)
      If p>0
        spacer$=Mid(text$,p-1,1)
        If p=1 Or p=0 Or spacer$=" " Or spacer$="," Or spacer$="=" Or spacer$="("
          spacer$=Mid(text$,p+Len(keyword()),1)
; ;           Debug spacer$
          If spacer$=" " Or spacer$="(" Or spacer$=""; Or spacer$=Chr(13) Or spacer$=Chr(10) Or spacer$="	"
            Editor_ColorText(#editor,i,p,i,p+Len(keyword())+1, RGB(0,255,0))
          EndIf
        EndIf
      EndIf
    Next
    ;Strings
    p=1
    p=FindString(text$,Chr(34),p)
    Debug "p1-"+Str(p)
    If p>0
       If p
          p2=FindString(text$,Chr(34),p+1)
          Debug "p2-"+Str(p2)
       EndIf
       If p2>p
          Editor_ColorText(#editor,i,p,i,p2+1, RGB(255,0,0))
       EndIf
    EndIf
    ;Commentaires
    p=FindString(text$,";",0)
    If p<>0 
      Editor_ColorText(#editor,i,p,i,Len(text$)+1, RGB(0,0,255))
    EndIf  
  EndIf
;Next
Editor_Locate(#editor,xx,yy)

EndProcedure



If OpenWindow(0, 0, 0, 500, 500, #PB_Window_SystemMenu|#PB_Window_Screencentered, "EditorGadget") 
  If CreateGadgetList(WindowID()) 
    
    EditorGadget(#Editor, 10, 10, 480, 480) 
    Editor_background(#editor,RGB($FF,$FF,$BF))
    SetGadgetText(#Editor, "If you are ; a man if"+Chr(13)+Chr(10)+Chr(34)+";then go"+Chr(34)+" ; Aux hiotes"+Chr(13)+Chr(10)+";if not"+Chr(13)+Chr(10)+"not if")

    For i=0 To CountGadgetItems(#editor)
      Editor_highlight(0,i)
    Next
          
    Editor_Select(#Editor, 0, 0, 0, 0)   ; select nothing again 
 
    Repeat 
      New.s=GetGadgetText(#editor)
      If new.s<>old.s
        x=Editor_CursorX(#editor)
        y=Editor_CursorY(#editor)
        Editor_Highlight(x,y)
        old=new      
      EndIf
      Editor_Color(#Editor, RGB(0,0,0))       
    Until WaitWindowEvent() = #PB_EventCloseWindow 
  EndIf 
EndIf 

End 
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

. Quand je surligne avec la souris l'editorgadget, mes couleurs s'effacent. Pourquoi ?
je crois qu'il faudrai envoyer un message de redraw
qu'il faut gerer avec un callback

cherche sur le forum il y a des exemple de Callback repaint windows !

:D
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

En mettant cette ligne dans la condition :Editor_Color(#Editor, RGB(0,0,0)) ; c'est mieux.

Code : Tout sélectionner

      If new.s<>old.s 
        X=Editor_CursorX(#Editor) 
        y=Editor_CursorY(#Editor) 
        Editor_Highlight(X,y) 
        old=new 
        Editor_Color(#Editor, RGB(0,0,0))      
      EndIf 
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

ben ça c'est du tout cuit !! :D
Répondre