[Writer] Encadrement de chaîne de caractères par des balises

Vos meilleures macros et portions de code sont publiées dans cette section.
Aucun support sur une question de programmation ici !

Modérateur : Vilains modOOs

Règles du forum
Aucune question dans cette section !
Celle-ci rassemble les meilleures macros et portions de code. Vous pouvez en revanche commenter ou argumenter le code exposé. Vous pouvez même remercier l'auteur (cela fait toujours plaisir) en indiquant par exemple dans quel cadre ou contexte vous en avez eu l'utilité.
Si vous avez à poster quelque chose, faites-le depuis la section Macros et API et demandez à un modérateur de l'y déplacer.
Avatar de l’utilisateur
Sébastien C
Membre hOOnoraire
Membre hOOnoraire
Messages : 157
Inscription : 28 avr. 2008 23:21
Localisation : Meymac (19250)

[Writer] Encadrement de chaîne de caractères par des balises

Message par Sébastien C »

Rien n’est plus ennuyeux que de taper du BBcode. Autant on apprend très vite les lettres correspondant aux enrichissements typographiques (« i » pour italique, « b » pour gras (bold, « u » pour souligné (underline), &c.), autant il est assez fastidieux de les poser, même dans les zones de texte des navigateurs qui sont prévues à cet effet. Si, à fortiori, on tape son texte dans sa suite bureautique favorite (parce que c’est quand même nettement plus confortable), il faut alors jouer du copier/coller à longueur de frappe, ce qui finit par être assez lassant.

Suite à la lecture de ce fil, je me suis dit que ce serait une très bonne chose que de pouvoir sélectionner des bouts de texte et, via macro, les encadrer entre crochets. Partant de là, je me suis aussi rendu compte que la chose pourrait être très agréable pour, par exemple, placer une sélection entre guillemets à la française («  ») respectivement suivis et précédés d’espaces insécables (cf. ce suprême de code), voire entre parenthèse ou accolades. Continuant ma réflexion, je me suis encore dit que la chose serait très pratique pour coder, dans Writer, du BBcode utilisé dans la majorité des forums du Web.

Adepte assez inconditionnel des raccourcis claviers, j’ai un peu réfléchi comment faire le plus rapidement pour ne pas avoir à cliquer cent fois sur trente boutons mais se limiter à trois ou quatre touches pour faire le bon encadrement. Soit : l’appel de la macro pour un premier raccourci clavier et une seule lettre pour valider un choix dans une liste. Un coup de tabulation pour changer de contrôle (bouton « OK ») et une validation par la touche [Entrée]. Une boite de dialogue s’imposait mais comme elle se limite à la plus simple expression (une simple liste déroulante et deux boutons), je me suis dit que le plus simple serait de la construire par codage, plutôt qu’avec l’EDI. L’excellent suprême de code de l’ami Dude me permit la chose sans le moindre souci...

Il existe des tas de raccourcis claviers disponibles dans Writer. J’ai choisis [Ctrl] + [C] qui me lance ma macro, bien entendu recopiée dans les macros de l’utilisateur. Pourquoi « C » ? Parce que cadre et chaînes... Il est bien entendu possible de faire évoluer ce concept, particulièrement pour tout ce qui regarde les langages de balisage (HTML, XML, &c.). La mise en forme du contenu étant particulièrement soignée dans le code Basic, il reste à chacun de placer ses propres encadrements puisque l’utilisation d’une liste déroulante permet de ne pas limiter les possibilités.

:D

Le code de la macro...

Code : Tout sélectionner

' *************************************
' * Encadrement de texte par du texte *
' *************************************

Private oDlgModele, oDlg As Object
Private nNbControles As Long
Private bOK As Boolean

Sub encadreChaine
 ' Initialisation des variables.
 Dim monDocument, curseurVisible As Object
 Dim texteSel As String
 monDocument = ThisComponent : curseurVisible = monDocument.currentController.ViewCursor
 texteSel = curseurVisible.String

 ' Création de la boite de dialogue.
 bOK = False : oDlgModele = createUnoService("com.sun.star.awt.UnoControlDialogModel")
       
 oDlgModele.PositionX = 60  : oDlgModele.PositionY = 50
 oDlgModele.Width     = 120 :    oDlgModele.Height = 150
 oDlgModele.Title = "Encadrement de chaînes"

 oDlg = createUnoService("com.sun.star.awt.UnoControlDialog")
 oDlg.setModel(oDlgModele)
 nNbControles = 0

 ' Liste déroulante
 Dim contenu(14), cont(3, 14) As string
 ' Racourcis clavier - Signifiance - Encadrement gauche - Encadrement droit
 cont(0,  0) = "B" : cont(1,  0) = "Gras"                : cont(2,  0) = "[b]"               : cont(3,  0) = "[/b]"
 cont(0,  1) = "I" : cont(1,  1) = "Italique"            : cont(2,  1) = "[i]"               : cont(3,  1) = "[/i]"
 cont(0,  2) = "U" : cont(1,  2) = "Souligné"            : cont(2,  2) = "[u]"               : cont(3,  2) = "[/u]"
 cont(0,  3) = "Q" : cont(1,  3) = "Citation"            : cont(2,  3) = "[quote]"           : cont(3,  3) = "[/quote]"
 cont(0,  4) = "C" : cont(1,  4) = "Code"                : cont(2,  4) = "[code]"            : cont(3,  4) = "
"
cont(0, 5) = "L" : cont(1, 5) = "Liste" : cont(2, 5) = "
  • " : cont(3, 5) = "
"
cont(0, 6) = "M" : cont(1, 6) = "Image" : cont(2, 6) = "[img]" : cont(3, 6) = "[/img]"
cont(0, 7) = "H" : cont(1, 7) = "Lien HTTP" : cont(2, 7) = "" : cont(3, 7) = ""
cont(0, 8) = "S" : cont(1, 8) = "Dimension" : cont(2, 8) = "[size=]" : cont(3, 8) = "[/size]"
cont(0, 9) = "O" : cont(1, 9) = "Couleur" : cont(2, 9) = "[color=#]" : cont(3, 9) = "[/color]"
cont(0, 10) = "R" : cont(1, 10) = "Rayé" : cont(2, 10) = "" : cont(3, 10) = ""
cont(0, 11) = "3" : cont(1, 11) = "Guillemets français" : cont(2, 11) = chr(171) & chr(160) : cont(3, 11) = chr(160) & chr(187)
cont(0, 12) = "4" : cont(1, 12) = "Accolades" : cont(2, 12) = "{" : cont(3, 12) = "}"
cont(0, 13) = "5" : cont(1, 13) = "Crochets" : cont(2, 13) = "[" : cont(3, 13) = "]"
cont(0, 14) = "6" : cont(1, 14) = "Parenthèses" : cont(2, 14) = "(" : cont(3, 14) = ")"

for i= 0 to UBound(contenu) : contenu(i) = cont(0, i) & " - " & cont(1, i) & " - " & cont(2, i) & "_" & cont(3, i) : next i
' Position X et Y - Largeur et hauteur - Nom logique, contenu - Déroulante (vrai) ou fixe (false) - Nom du listener (optionnel)
Dlg_Liste(5, 17, 110, 100, "lstEncadr", contenu, False)

' Libellé
Dlg_Libelle(5, 5, 150, 15, "lbl1", "Choisissez votre encadrement de chaîne :")

' Boutons OK et Annule - Position X et Y - Largeur et hauteur - Nom logique, titre et nom du listener (optionnel)
Dlg_Bouton( 5, 130, 50, 15, "dlgValide", "OK", "ValideOuAnnule")
Dlg_Bouton(60, 130, 50, 15, "dlgAnnule", "Annuler", "ValideOuAnnule")

' Sélectionne le premier choix.
oDlg.GetControl("lstEncadr").SelectItemPos(0, True)

' Affichage du dialogue une fois construit
oDlg.setVisible(True) : oDlg.execute()

' Traitement du résultat si bOK
choix = oDlg.GetControl("lstEncadr").selectedItemPos
if (bOK and (choix <> -1)) then
curseurVisible.String = cont(2, choix) & texteSel & cont(3, choix)
end if
End Sub


' *****************************
' * Description des contrôles *
' *****************************

' *** Libellé ***
Sub Dlg_Libelle( x As Long, y As Long, larg As Long, haut As Long, cNom As String, cLib As String )
oLibModele = oDlgModele.createInstance( "com.sun.star.awt.UnoControlFixedTextModel" )

oLibModele.PositionX = x : oLibModele.PositionY = y
oLibModele.Width = larg : oLibModele.Height = haut
oLibModele.Name = cNom
oLibModele.TabIndex = nNbControles
oLibModele.Label = cLib

oDlgModele.insertByName(cNom, oLibModele)
oLibControle = oDlg.getControl(cNom)

nNbControles = nNbControles + 1
End Sub

' *** Bouton ***
Sub Dlg_Bouton(x As Long, y As Long, larg As Long, haut As Long, cNom As String, cLib As String, Optional cNomListener As String)
oBoutonModele = oDlgModele.createInstance( "com.sun.star.awt.UnoControlButtonModel" )

oBoutonModele.PositionX = x : oBoutonModele.PositionY = y
oBoutonModele.Width = larg : oBoutonModele.Height = haut
oBoutonModele.Name = cNom
oBoutonModele.TabIndex = nNbControles
oBoutonModele.Label = cLib

oDlgModele.insertByName(cNom, oBoutonModele)
oBoutonControle = oDlg.getControl(cNom)

' Création du listener
If IsMissing( cNomListener ) Then cNomListener = cNom
oActionListener = CreateUnoListener( cNomListener + "_", "com.sun.star.awt.XActionListener" )
oBoutonControle.addActionListener( oActionListener )

nNbControles = nNbControles + 1
End Sub

' *** Liste déroulante ***
Sub Dlg_Liste(x As Long, y As Long, larg As Long, haut As Long, cNom As String, contenu As Array, Optional bDeroule As Boolean, Optional cNomListener As String)
oListeModele = oDlgModele.createInstance( "com.sun.star.awt.UnoControlListBoxModel" )

oListeModele.PositionX = x : oListeModele.PositionY = y
oListeModele.Width = larg : oListeModele.Height = haut
oListeModele.Name = cNom
oListeModele.TabIndex = nNbControles
oListeModele.DropDown = False
If bDeroule Then oListeModele.DropDown = 0

oDlgModele.insertByName(cNom, oListeModele)
oListeControle = oDlg.getControl(cNom)

oListeControle.addItems( contenu(), 0)

' Nombre d'éléments affichable dans la liste : maximum 5
If (UBound(contenu) > 5) Then nbElements = (UBound(contenu) + 1) Else nbElements = 10

oListeControle.setDropDownLineCount(nbElements)

' Création du listener
If IsMissing(cNomListener) Then cNomListener = cNom
oActionListener = CreateUnoListener(cNomListener + "_", "com.sun.star.awt.XActionListener")
oListeControle.addActionListener(oActionListener)

nNbControles = nNbControles + 1
End Sub


' *******************
' * Allo j'écoute ? *
' *******************

' Listener unique pour OK ou Annuler
Sub ValideOuAnnule_actionPerformed(oEve)
If oEve.Source.getModel().Name = "dlgValide" Then bOK = True

' On ferme la boite de dialogue de toute façon.
oDlg.endExecute() : oDlg.setVisible(False)
End Sub

' Double-clic pour la liste déroulante implique une validation de la boite de dialogue.
Sub lstEncadr_actionPerformed()
bOK = True : oDlg.endExecute() : oDlg.setVisible(False)
End Sub
[/code]
...et le fichier qui va avec pour faire des tests :
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice 3.5.3.2 sous GNU-Linux Mageia 2.