Scintilla et le HTML

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Scintilla et le HTML

Message par falsam »

Si tu as compris comment fonctionne l'indentation je suis preneur de la solution.
J'aimerais bien éviter que le passage à la ligne ne me positionne pas en debut de ligne mais plutot à la dernière tabulation de la ligne précédente.
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%
Warkering
Messages : 808
Inscription : ven. 08/janv./2010 1:14
Localisation : Québec, Canada

Re: Scintilla et le HTML

Message par Warkering »

Eh bien, j'explore justement ce mode, je souhaiterais que deux espaces remplace la tabulation et qu'elle soit ensuite automatique, mais dû à mon Cégep, je n'ai pas encore eu le temps de me pencher dessus. Je vais voir ça ce soir ( Car à l'heure où je t'écris, chez moi, il est 5h18 PM. :wink: ) et je t'en donnerai des nouvelles.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Scintilla et le HTML

Message par falsam »

le premier qui trouve dans ce cas :p
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
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Scintilla et le HTML

Message par falsam »

J'ai modifié mon code précédent en incorporant l'indentation ainsi qu'un menu minimum.
ça reste minimaliste mais je pense que c'est une bonne base pour développer une solution multitables et esthétique.

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

;Initialisation de la DLL Scintilla.
;Attention : SciLexer.dll doit etre present dans le meme dossier que votre programme
;ou bien dans un dossier dont vous aurez indiqué le chemin.
If Not InitScintilla("SciLexer.dll") 
  MessageRequester("Information", "SciLexer.dll doit etre present dans le meme dossier que votre programme")
  End
EndIf


;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, #Black)
  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, #Yellow)
  
  ;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, #Red)
  
  ;coloration syntaxique (Prefixe #SCE_H pour les attribut du lexer HTML)
  
  ;Texte par defaut
  ScintillaSendMessage(Gadget, #SCI_STYLESETFORE, #SCE_H_DEFAULT, #Black)
  ScintillaSendMessage(Gadget, #SCI_STYLESETBACK, #SCE_H_DEFAULT, $EAFEFE)
  
  ;Balises HTML
  ScintillaSendMessage(Gadget, #SCI_STYLESETFORE, #SCE_H_TAG, #Red)
  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, #Blue)
  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, #Red)
  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, #Green)
  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
Dernière modification par falsam le ven. 26/nov./2010 14:35, modifié 1 fois.
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%
Warkering
Messages : 808
Inscription : ven. 08/janv./2010 1:14
Localisation : Québec, Canada

Re: Scintilla et le HTML

Message par Warkering »

C'est très bien parti, malheureusement, je n'ai aucun code sous la main pour l'instant. Je n'ai pas pensé à m'y pencher plus au-dessus puisque, de un, il n'y a pas de Cégep aujourd'hui à cause de la neige, et que de deux, j'ai un kit 46" 1080- et PS3 dans le salon et ce depuis hier soir! :mrgreen:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Scintilla et le HTML

Message par Backup »

Joli code ! Merci :)
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Scintilla et le HTML

Message par falsam »

Une erreur c'est glissée dans le code (variable Len et FileLenght pour définir la même chose) j'ai corrigé en conséquence.
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%
Répondre