Utilisation de scintilla

Codes specifiques à Linux
Avatar de l’utilisateur
MetalOS
Messages : 1509
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Utilisation de scintilla

Message par MetalOS »

Salut les amis, j'aimerais me faire mon propre editeur html sous Linux et pour la coloration de la syntaxe utiliser scintilla. Seulement je ne connait pas du tous scintilla. Voici un exemple trouvé sur developpe.com.

Code : Tout sélectionner


EnableExplicit

Enumeration
  #File
 
  #Mainform
 
  #MainMenu
  #New
  #Open
  #Save
  #SaveAs
  #Quit
 
  #Editor
  #StatusBar
EndEnumeration

Global StyleWindows.l=#PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget
Global SciPos.l, SciLine.l, SciCol.l, SciIndent.l, SciFile.s, SciText.s
Global Result.l, FileLenght.l, *MemoryID.l

;CallBack qui recevra les evenements emis par le gadget Scintilla
;*scinotify pointe vers une structure comportant les informations sur l'évènement:
;Voir le bas de cette page http://www.scintilla.org/ScintillaDoc.html
;
;Cette procedure va permettre de connaitre la position courante du curseur
;et de se positionner correctement apres avoir actionner la touche Entrée
ProcedureDLL ScintillaCallBack(Gadget, *scinotify.SCNotification)
  ;La touche Entrée est utilisée
  If *scinotify\ch=13
   
    ;Mise en place dans la nouvelle ligne de l'indentation de la ligne précédente
    ScintillaSendMessage(Gadget, #SCI_SETLINEINDENTATION, SciLIne+1, SciIndent)
   
    ;Positionnement du curseur d'edition sur la nouvelle ligne
    ;Si pas d'indentation alors on ajoute 2 (ça fait bricolage mais je n'ai pas trouvé mieux)
    If SciIndent=0
      SciPos=SciPos+2
    EndIf
   
    ;Positionnement du curseur
    ScintillaSendMessage(Gadget, #SCI_GOTOPOS, SciPos+SciIndent)

  EndIf
 
  ;Determination de la position à l'intérieur de la chaine scintilla
  SciPos = ScintillaSendMessage(Gadget, #SCI_GETANCHOR)
 
  ;Determination de la ligne en cours
  SciLine = ScintillaSendMessage(Gadget, #SCI_LINEFROMPOSITION, SciPos)
 
  ;Determination de la colonne en cours
  SciCol = ScintillaSendMessage(Gadget, #SCI_GETCOLUMN, SciPos)
 
  ;Determination de l'indentation
  SciIndent = ScintillaSendMessage(Gadget, #SCI_GETLINEINDENTATION, SciLine)
 
  ;Affichage du numéro de ligne/colonne dans la barre de status
 ; StatusBarText(#StatusBar,0,"Line : " +Str(SciLine+1)+ "  Col : "+Str(SciCol+1), #PB_StatusBar_Center)
EndProcedure

Procedure SetScintillaProperties(Gadget)
 
  ;Chargement du dictionnaire HTML
  ScintillaSendMessage(Gadget, #SCI_SETLEXER, #SCLEX_HTML)
 
  ;Style par defaut du gadget scintilla
  ScintillaSendMessage(Gadget, #SCI_STYLESETFORE, #STYLE_DEFAULT, $000000)
  ScintillaSendMessage(Gadget, #SCI_STYLESETBACK, #STYLE_DEFAULT, $EAFEFE)
  ScintillaSendMessage(Gadget, #SCI_STYLESETFONT,#STYLE_DEFAULT,@"Verdana")
  ScintillaSendMessage(Gadget, #SCI_STYLESETSIZE, #STYLE_DEFAULT, 12)
  ;ScintillaSendMessage(gadget, #SCI_CLEARALL)
   
  ;Affichage de la colone de numérotation des lignes
  ScintillaSendMessage(Gadget, #SCI_SETMARGINTYPEN, 0, #SC_MARGIN_NUMBER) ;
  ScintillaSendMessage(Gadget, #SCI_SETMARGINWIDTHN, 0, 40)
  ScintillaSendMessage(Gadget, #SCI_STYLESETBACK, #STYLE_LINENUMBER, $D4D4D4)
  ScintillaSendMessage(Gadget, #SCI_STYLESETFORE, #STYLE_LINENUMBER, $10FFFF)
 
  ;Margin Mask Folder
  ScintillaSendMessage(Gadget, #SCI_SETMARGINMASKN, 2, #SC_MASK_FOLDERS)
  ScintillaSendMessage(Gadget, #SCI_SETMARGINWIDTHN, 2, 15)

  ;Affichage et couleur de la ligne active
  ScintillaSendMessage(Gadget, #SCI_SETCARETLINEVISIBLE, #True)
  ScintillaSendMessage(Gadget, #SCI_SETCARETLINEBACK, $C4FBFA)
 
  ;Les tabulations sont remplacées par des espaces
  ScintillaSendMessage(Gadget, #SCI_SETUSETABS, #False)
 
  ;Nombre d'espaces pour une tabulation
  ScintillaSendMessage(Gadget, #SCI_SETINDENT, 4)
 
  ;Affichage du guide d'indentation et affectatoin d'une couleur
  ScintillaSendMessage(Gadget, #SCI_SETINDENTATIONGUIDES, #SC_IV_LOOKFORWARD)
  ScintillaSendMessage(Gadget, #SCI_STYLESETFORE, #STYLE_INDENTGUIDE, $0605F7)
 
  ;coloration syntaxique (Prefixe #SCE_H pour les attribut du lexer HTML)
 
  ;Texte par defaut
  ScintillaSendMessage(Gadget, #SCI_STYLESETFORE, #SCE_H_DEFAULT, $000000)
  ScintillaSendMessage(Gadget, #SCI_STYLESETBACK, #SCE_H_DEFAULT, $EAFEFE)
 
  ;Balises HTML
  ScintillaSendMessage(Gadget, #SCI_STYLESETFORE, #SCE_H_TAG, $0605F9)
  ScintillaSendMessage(Gadget, #SCI_STYLESETBACK, #SCE_H_TAG, $EAFEFE)
 
  ;Balises inconnues
  ScintillaSendMessage(Gadget, #SCI_STYLESETFORE, #SCE_H_TAGUNKNOWN, $949494)
  ScintillaSendMessage(Gadget, #SCI_STYLESETBACK, #SCE_H_TAGUNKNOWN, $EAFEFE)
 
  ;Attributs
  ScintillaSendMessage(Gadget, #SCI_STYLESETFORE, #SCE_H_ATTRIBUTE, $E01A1F)
  ScintillaSendMessage(Gadget, #SCI_STYLESETBACK, #SCE_H_ATTRIBUTE, $EAFEFE)
 
  ;Attributs inconnus
  ScintillaSendMessage(Gadget, #SCI_STYLESETFORE, #SCE_H_ATTRIBUTEUNKNOWN, $505000)
  ScintillaSendMessage(Gadget, #SCI_STYLESETBACK, #SCE_H_ATTRIBUTEUNKNOWN, $EAFEFE)
 
  ;Chiffres
  ScintillaSendMessage(Gadget, #SCI_STYLESETFORE, #SCE_H_NUMBER, $0005FF)
  ScintillaSendMessage(Gadget, #SCI_STYLESETBACK, #SCE_H_NUMBER, $EAFEFE)
 
  ;Texte entres guillemets
  ScintillaSendMessage(Gadget, #SCI_STYLESETFORE, #SCE_H_DOUBLESTRING, $787878)
  ScintillaSendMessage(Gadget, #SCI_STYLESETBACK, #SCE_H_DOUBLESTRING, $EAFEFE)
 
  ;Textes entres simples quotes
  ScintillaSendMessage(Gadget, #SCI_STYLESETFORE, #SCE_H_SINGLESTRING, $787878)
  ScintillaSendMessage(Gadget, #SCI_STYLESETBACK, #SCE_H_SINGLESTRING, $EAFEFE)
 
  ;Autres balises
  ScintillaSendMessage(Gadget, #SCI_STYLESETFORE, #SCE_H_OTHER, $AE0050)
  ScintillaSendMessage(Gadget, #SCI_STYLESETBACK, #SCE_H_OTHER, $EAFEFE)
 
  ;Commentaires
  ScintillaSendMessage(Gadget, #SCI_STYLESETFORE, #SCE_H_COMMENT, $8CEE73)
  ScintillaSendMessage(Gadget, #SCI_STYLESETBACK, #SCE_H_COMMENT, $EAFEFE)
 
EndProcedure

;Affichage de la fenetre principale de l'application
Procedure MainFormShow() 
  OpenWindow(#MainForm,  0,  0, 800, 600, "HTML Editor", StyleWindows)
 
  ;Evite le scintillement du Scintilla gadget lors du redimentionnement de la fenetre
  SmartWindowRefresh(#Mainform, #True)
 
  ;Menu de l'application
  CreateMenu(#mainmenu,WindowID(#MainForm))
  MenuTitle("Fichier")
  MenuItem(#New,"Nouveau")
  MenuItem(#Open,"Ouvrir")
  MenuItem(#Save,"Enregistre")
  MenuItem(#SaveAs,"Enregistrer Sous")
  MenuBar()
  MenuItem(#Quit,"Quitter")
 
  ;@ScintillaCallBack() correspond à l'adresse de la procédure
  ;qui recevra les évènements émis par le contrôle.
  ScintillaGadget(#Editor, 10, 40, 790, 590, @ScintillaCallBack())
   
  CreateStatusBar(#StatusBar,WindowID(#Mainform))
  AddStatusBarField(150)
  AddStatusBarField(450)
 
 
  RemoveKeyboardShortcut(#Mainform, #PB_Shortcut_Tab)
 
  ;Affectation des touches de racourcis à aucun évènement menu
  ;tant qu'elles ne servent à rien afin d'éviter l'insertion des caracteres spéciaux
  AddKeyboardShortcut(#Mainform, #PB_Shortcut_Control+#PB_Shortcut_B, 0)
  AddKeyboardShortcut(#Mainform, #PB_Shortcut_Control+#PB_Shortcut_G, 0)
  AddKeyboardShortcut(#Mainform, #PB_Shortcut_Control+#PB_Shortcut_E, 0)
  AddKeyboardShortcut(#Mainform, #PB_Shortcut_Control+#PB_Shortcut_R, 0)
  AddKeyboardShortcut(#Mainform, #PB_Shortcut_Control+#PB_Shortcut_O, 0)
  AddKeyboardShortcut(#Mainform, #PB_Shortcut_Control+#PB_Shortcut_P, 0)
  AddKeyboardShortcut(#Mainform, #PB_Shortcut_Control+#PB_Shortcut_Q, 0)
  AddKeyboardShortcut(#Mainform, #PB_Shortcut_Control+#PB_Shortcut_S, 0)
  AddKeyboardShortcut(#Mainform, #PB_Shortcut_Control+#PB_Shortcut_F, 0)
  AddKeyboardShortcut(#Mainform, #PB_Shortcut_Control+#PB_Shortcut_H, 0)
  AddKeyboardShortcut(#Mainform, #PB_Shortcut_Control+#PB_Shortcut_K, 0)
  AddKeyboardShortcut(#Mainform, #PB_Shortcut_Control+#PB_Shortcut_W, 0) 
  AddKeyboardShortcut(#Mainform, #PB_Shortcut_Control+#PB_Shortcut_N, 0)
 
  StatusBarText(#StatusBar,1,"Nouveau document")
  SetActiveGadget(#editor)
EndProcedure

;Redimensionnement de la fenetre principale
Procedure MainFormResize()
  ResizeGadget(#Editor, #PB_Ignore, #PB_Ignore, WindowWidth(#MainForm)-30, WindowHeight(#Mainform)-100)
EndProcedure

;Nouveau document
Procedure NewFile()
  ScintillaSendMessage(#Editor, #SCI_SETTEXT, 0, @"")
  StatusBarText(#StatusBar,1,"Nouveau document")
EndProcedure

;Ouverture d'un fichier
Procedure LoadFile()
  SciFile=OpenFileRequester("Ouvrir un fichier", "", "html (*.html)|*.html|All files (*.*)|*.*", 0)
  If SciFile
    StatusBarText(#StatusBar,1,SciFile)
    If ReadFile(#File, SciFile)
      FileLenght = Lof(#file)
      *MemoryID = AllocateMemory(FileLenght)
      If *MemoryID
        ReadData(#File, *MemoryID, FileLenght)
        ScintillaSendMessage(#Editor, #SCI_SETTEXT, 0, *MemoryID)
        FreeMemory(*MemoryID)
      EndIf
      CloseFile(#File) 
    EndIf 
  EndIf
EndProcedure

;Sauvegarde d'un fichier sous
Procedure SaveFileAs()
  SciFile=OpenFileRequester("Sauvegarder un  fichier sous", "", "html (*.html)|*.html|All files (*.*)|*.*", 0)
  If SciFile
    StatusBarText(#StatusBar,1,SciFile)
    If CreateFile(#File, SciFile)
     FileLenght = ScintillaSendMessage(#Editor, #SCI_GETLENGTH)+1
     *MemoryID = AllocateMemory(FileLenght)
     If *MemoryID
       ScintillaSendMessage(#Editor, #SCI_GETTEXT, FileLenght, *MemoryID)
       WriteData(#File, *MemoryID, FileLenght)
       FreeMemory(*MemoryID) 
     EndIf
     CloseFile(#File) 
    EndIf
  EndIf
EndProcedure

;Sauvegarde d'un fichier
Procedure SaveFile()
  If SciFile<>""
  If CreateFile(#File, SciFile)
    FileLenght = ScintillaSendMessage(#Editor, #SCI_GETLENGTH)+1
    *MemoryID = AllocateMemory(FileLenght)
    If *MemoryID
      ScintillaSendMessage(#Editor, #SCI_GETTEXT, FileLenght, *MemoryID)
      WriteData(#File, *MemoryID, FileLenght)
      FreeMemory(*MemoryID) 
    EndIf
    CloseFile(#File) 
  EndIf
Else
  SaveFileAs()
EndIf
EndProcedure

;Debut du traitement
MainFormShow()
SetScintillaProperties(#Editor)

Repeat     
  Select WaitWindowEvent()
    Case #PB_Event_Menu
      Select EventMenu()
        Case #new
          NewFile()
        Case #Open
          LoadFile()
        Case #Save
          SaveFile()
        Case #SaveAs
          SaveFileAs()
        Case #Quit
          End
      EndSelect
     
    Case #PB_Event_Gadget
      Select EventGadget()

      EndSelect
     
    Case #PB_Event_SizeWindow
      MainFormResize()
     
    Case #PB_Event_CloseWindow
      End
     
  EndSelect
ForEver

La coloration du code HTML ne semble pas marcher. Quelqu'un pourrais essayer et me dire pourquoi ? Merci d'avance.
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Utilisation de scintilla

Message par G-Rom »

il manque la partie qui détecte le html non ?
regarde le code plus haut sur dev.com.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Utilisation de scintilla

Message par falsam »

@G-ROM : Le chargement du lexer HTML est bien initialisé
;Chargement du dictionnaire HTML
ScintillaSendMessage(Gadget, #SCI_SETLEXER, #SCLEX_HTML)

@MetalOS : Tu vas devoir affiner un peu plus ta demande.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Utilisation de scintilla

Message par G-Rom »

Avec des lexer prédéfini sous linux sa ne marche pas , j'ai bien les marges , lignes , etc...
mais pas les couleurs de texte ( commentaire , balise, etc... )
a mon avis faut le faire à la main :D
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Utilisation de scintilla

Message par falsam »

G-Rom a écrit :Avec des lexer prédéfini sous linux sa ne marche pas , j'ai bien les marges , lignes , etc...
mais pas les couleurs de texte ( commentaire , balise, etc... )
a mon avis faut le faire à la main :D
Après avoir installer ubuntu , je viens de tester ce code et effectivement la coloration syntaxique associée au lexer HTML ne fonctionne pas.

Petite précision pour ce code, l'initialisation de scintilla est inutile sous linux.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
MetalOS
Messages : 1509
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: Utilisation de scintilla

Message par MetalOS »

Merci de vos réponses les gars,

Je cherche juste à colorer du code html uniquement avec scintilla. Mais je ne vois pas comment faire je ne connais pas du tous scintilla.
Répondre