Basic Univers
;-------------------------------------------
;- Colorisation syntaxique d'un code MySql
;-------------------------------------------

Structure SYNTAXHIGHLIGHT
  keyword.s
  effect.l
  color.l
EndStructure

NewList syntax.SYNTAXHIGHLIGHT()

Procedure.b Syntax_Clear()
 
  ClearList(syntax())
 
EndProcedure
Procedure.b Syntax_Add(keyword.s, color.l, effect.l)
 
  If AddElement(syntax())
    syntax()\keyword = keyword
    syntax()\effect = effect
    syntax()\color = color
  EndIf
 
EndProcedure
Procedure.l Syntax_Apply(gID.l)
 
  hGadget = GadgetID(gID)
 
  format.CHARFORMAT
  format\cbSize = SizeOf(CHARFORMAT)
  format\dwMask = #CFM_COLOR|#CFM_BOLD|#CFM_ITALIC|#CFM_UNDERLINE
 
  search.FINDTEXTEX
  search\chrg\cpMax = Len(GetGadgetText(gID))
  SendMessage_(hGadget, #EM_HIDESELECTION, #True, #Null)
 
  ForEach syntax()
   
    search\chrg\cpMin = 0
    search\lpstrText = @syntax()\keyword
   
    Repeat
      result = SendMessage_(hGadget, #EM_FINDTEXTEX, #FR_DOWN, @search) ;
      If result <> - 1
        SendMessage_(hGadget, #EM_SETSEL, search\chrgText\cpMin, search\chrgText\cpMax)
        format\crTextColor = syntax()\color
        format\dwEffects   = syntax()\effect
        SendMessage_(hGadget, #EM_SETCHARFORMAT, #SCF_SELECTION|#SCF_WORD, @format)
        search\chrg\cpMin = search\chrgText\cpMax
      EndIf
    Until result = - 1
   
  Next
 
  SendMessage_(hGadget, #EM_SETSEL, - 1, 0)
  SendMessage_(hGadget, #EM_HIDESELECTION, #False, #Null)
  SendMessage_(hGadget, #EM_LINESCROLL, #Null, 20)
 
EndProcedure

;-------------------------------------------
;- EXAMPLE: Définition de la syntaxe SQL
;-------------------------------------------

Restore SQL_ALPHA    : Repeat : Read item$ : If item$ : Syntax_Add(item$, $0B95E0, #CFM_ITALIC) : EndIf : Until item$ = ""
Restore SQL_OP       : Repeat : Read item$ : If item$ : Syntax_Add(item$, $0000DD, #CFE_BOLD) : EndIf : Until item$ = ""
Restore SQL_MOT      : Repeat : Read item$ : If item$ : Syntax_Add(item$, $00AA00, #CFE_BOLD) : EndIf : Until item$ = ""
Restore SQL_FONCTION : Repeat : Read item$ : If item$ : Syntax_Add(item$, $AACC44, #CFM_BOLD) : EndIf : Until item$ = ""
Restore SQL_NUM      : Repeat : Read item$ : If item$ : Syntax_Add(item$, $FF0000, 0) : EndIf : Until item$ = ""
Restore SQL_TABLE    : Repeat : Read item$ : If item$ : Syntax_Add(item$, $9B0E15, #CFE_UNDERLINE) : EndIf : Until item$ = ""
Restore SQL_CHAMP    : Repeat : Read item$ : If item$ : Syntax_Add(item$, $000000, 0) : EndIf : Until item$ = ""

DataSection ; Syntaxe SQL
  SQL_FONCTION:
  Data.s "CONCAT", "DATE_FORMAT", #NULL$
  SQL_NUM:
  Data.s "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", #NULL$
  SQL_OP:
  Data.s ".", ",", ";", "!", "(", ")", "<", ">", " = ", "LIKE", "NOT", "AND", "OR", #NULL$
  SQL_MOT:
  Data.s "SELECT", "DISTINCT", "WHERE", "FROM", "JOIN", "ON", "ORDER BY", "ASC", "DESC", "LIMIT", #NULL$
  SQL_ALPHA:
  Data.s "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", ":", "%", "'", Chr(34), #NULL$
  SQL_TABLE:
  Data.s "session", "droit", #NULL$
  SQL_CHAMP:
  Data.s "id", "prenom", "nom", "motdepasse", "inscription", "description", #NULL$
EndDataSection

;-------------------------------------------
;- EXAMPLE: Test Colorisation syntaxique
;-------------------------------------------

If OpenWindow(0, 0, 0, 640, 480, #PB_Window_SystemMenu|#PB_Window_ScreenCentered, "Colorisation Syntaxique")
 
  If CreateGadgetList(WindowID(0))
   
    EditorGadget(0, 5, 5, 630, 470)
   
    If LoadFont(0, "Arial", 16, #PB_Font_HighQuality)
      UseFont(0)
      SetGadgetFont(0, FontID())
    EndIf
   
    requete$ = "SELECT CONCAT(session.nom, ' ', session.nom), " + #LF$
    requete$ + "DATE_FORMAT('%d.%m.%Y %H:%i:%s', session.inscription), " + #LF$
    requete$ + "session.id, " + #LF$
    requete$ + "session.motdepasse, " + #LF$
    requete$ + "session.droit, " + #LF$
    requete$ + "droit.description " + #LF$ + #LF$
    requete$ + "FROM session " + #LF$
    requete$ + "JOIN droit ON droit.id = session.droit " + #LF$ + #LF$
    requete$ + "WHERE 1 " + #LF$
    requete$ + "AND session.prenom LIKE '%jean%' " + #LF$
    requete$ + "AND session.droit != 'invite' " + #LF$
    requete$ + "AND session.droit <> 'membre' " + #LF$ + #LF$
    requete$ + "ORDER BY session.id ASC " + #LF$
    requete$ + "LIMIT 0, 100;"
   
    SetGadgetText(0, requete$)
    Syntax_Apply(0)
   
  EndIf
 
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Break
    EndSelect
  ForEver
 
EndIf