Je voulais un code qui soit aussi bien fonctionnel sur Windows que sur Linux et Le Soldat Inconnu avait déjà fait le gros du boulot, donc j'ai cherché un peu pour que cela marche aussi sur le dos du pingouin.
Je m'épate moi-même parce que j'ai dû mettre mon nez dans une doc anglaise alors que j'y suis allergique

Il y a peut-être des choses à modifier.
Si personne n'a rien à y redire, je zapperai peut-être le code dans la rubrique ouverte par progi1984 pour les codes multi-OS.
Code : Tout sélectionner
; Application permettant d'appliquer des tags avant et après une portion de texte selectionnée.
;Auteur de la version Windows : Le Soldat Inconnu
; Version originale : http://www.purebasic.fr/french/viewtopic.php?p=110367#p110367
; Date : ??-??-??
; Auteur de la version Linux : Geo Trouvpatou aka El Konkonbre M@squed.
; Date : 26-03-10
; PB 4.41.
; OS : Windows et Linux.
; Ce code est disponible ici : http://www.purebasic.fr/french/viewtopic.php?f=6&t=10480
EnableExplicit
; -------------------------------------------------------------------------------------------
;- Enumérations
; -------------------------------------------------------------------------------------------
Enumeration #PB_Compiler_EnumerationValue
; - Windows
#WINDOW_EditeurBBCode
; - Gadgets
#EDITOR_GADGET
#BUTTON_Gras
#BUTTON_Italique
#BUTTON_Souligne
#COMBO_BOX_Couleur
EndEnumeration
; -------------------------------------------------------------------------------------------
;- Déclarations
; -------------------------------------------------------------------------------------------
Declare EditeurBBCode()
Declare AppliquerBBCode(BBCodeDebut$, BBCodeFin$)
Global evenement.i
; -------------------------------------------------------------------------------------------
;- Main
; -------------------------------------------------------------------------------------------
; On ouvre l'éditeur.
EditeurBBCode()
; -------------------------------------------------------------------------------------------
;- Boucle
; -------------------------------------------------------------------------------------------
Repeat
evenement = WaitWindowEvent()
; Evènements Boutons (Gadgets en général)
If evenement = #PB_Event_Gadget
Select EventGadget()
Case #BUTTON_Gras
AppliquerBBCode("[b]", "[/b]")
Case #BUTTON_Italique
AppliquerBBCode("[i]", "[/i]")
Case #BUTTON_Souligne
AppliquerBBCode("[u]", "[/u]")
Case #COMBO_BOX_Couleur
Define resultatCombo = GetGadgetState(#COMBO_BOX_Couleur)
;Debug resultatCombo
Define resultatCouleur$ = GetGadgetItemText(#COMBO_BOX_Couleur, resultatCombo)
Debug resultatCouleur$
If resultatCouleur$ = "Rouge"
AppliquerBBCode("[color=#FF0000]", "[/color]")
ElseIf resultatCouleur$ = "Vert"
AppliquerBBCode("[color=#008000]", "[/color]")
ElseIf resultatCouleur$ = "Bleu"
AppliquerBBCode("[color=#0000FF]", "[/color]")
EndIf
; On se remet sur défaut après avoir appliqué les tags "couleur"
SetGadgetState(#COMBO_BOX_Couleur, 0)
EndSelect
EndIf
Until evenement = #PB_Event_CloseWindow
; -------------------------------------------------------------------------------------------
;- Procédures.
; -------------------------------------------------------------------------------------------
Procedure EditeurBBCode()
If OpenWindow(#WINDOW_EditeurBBCode, 60, 250, 400, 280, "", #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered) ;
EditorGadget(#EDITOR_GADGET, 0, 0, 400, 220)
SetGadgetText(#EDITOR_GADGET, "PureBasic PureBasic PureBasic" + Chr(10) + "PureBasic PureBasic PureBasic" + Chr(10) + "PureBasic, ça rôxx," + Chr(10) + "pour Windows et Linux.")
ButtonGadget(#BUTTON_Gras, 40, 220, 100, 24, "Gras")
ButtonGadget(#BUTTON_Italique, 140, 220, 100, 24, "Italique")
ButtonGadget(#BUTTON_Souligne, 240, 220, 100, 24, "Souligné")
ComboBoxGadget(#COMBO_BOX_Couleur, 140, 250, 200, 25)
AddGadgetItem(#COMBO_BOX_Couleur, 0, "Défaut")
AddGadgetItem(#COMBO_BOX_Couleur, 1, "Rouge")
AddGadgetItem(#COMBO_BOX_Couleur, 2, "Vert")
AddGadgetItem(#COMBO_BOX_Couleur, 3, "Bleu")
SetGadgetState(#COMBO_BOX_Couleur, 0) ; On sélectionne "Défaut" à l'ouverture de l'application.
EndIf
EndProcedure
Procedure AppliquerBBCode(BBCodeDebut$, BBCodeFin$)
Protected nbItems.i, buffer.i
Protected index.i, PositionCurseurDebut.i, PositionCurseurFin.i
Protected Texte$
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Windows
SendMessage_(GadgetID(#EDITOR_GADGET), #EM_GETSEL, @PositionCurseurDebut, @PositionCurseurFin)
CompilerCase #PB_OS_Linux
;Protected StartIter.GtkTextIter, EndIter.GtkTextIter
Protected.GtkTextIter StartIter, EndIter
buffer = gtk_text_view_get_buffer_(GadgetID(#EDITOR_GADGET))
gtk_text_buffer_get_selection_bounds_(buffer, @StartIter, @EndIter)
; Détermine le num ou se trouve le curseur de début de selection du texte.
PositionCurseurDebut = gtk_text_iter_get_offset_(@StartIter)
Debug "Selection début = "+ Str(PositionCurseurDebut)
; Détermine le num ou se trouve le curseur de fin de selection du texte.
PositionCurseurFin = gtk_text_iter_get_offset_(@EndIter)
Debug "Selection fin = "+ Str(PositionCurseurFin)
CompilerEndSelect
;+++++++++++++++++++++++ Code tout OS Début ++++++++++++++++++++
;Debug CountGadgetItems(#EDITOR_GADGET) ; Compte le nombre de ligne de l'Editor.
Texte$ = ""
nbItems = CountGadgetItems(#EDITOR_GADGET) - 1
For index = 0 To nbItems
If Texte$ <> ""
Texte$ + Chr(10)
EndIf
Texte$ + GetGadgetItemText(#EDITOR_GADGET, index)
Next
Debug "----------"
Texte$ = Left(Texte$, PositionCurseurDebut) + BBCodeDebut$ + Mid(Texte$, PositionCurseurDebut + 1, PositionCurseurFin - PositionCurseurDebut) + BBCodeFin$ + Right(Texte$, Len(Texte$) - PositionCurseurFin)
Debug Texte$
;+++++++++++++++++++++++ Code tout OS Fin ++++++++++++++++++++
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Windows
; Permet de ne pas laisser sélectionné le tag de départ et de fin mais uniquement le texte entre les 2 tags.
PositionCurseurDebut + Len(BBCodeDebut$)
PositionCurseurFin + Len(BBCodeDebut$)
SetGadgetText(#EDITOR_GADGET, Texte$)
SendMessage_(GadgetID(#EDITOR_GADGET), #EM_SETSEL, PositionCurseurDebut, PositionCurseurFin)
SetActiveGadget(#EDITOR_GADGET)
CompilerCase #PB_OS_Linux
SetGadgetText(#EDITOR_GADGET, Texte$)
SetActiveGadget(#EDITOR_GADGET) ; Donne le focus au gadget et remet le curseur en fin de texte
CompilerEndSelect
EndProcedure