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.

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,




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 :