L'enregistreur de macro OpenOffice.org et les appels UNO (dispatch)
L'enregistreur de macro OpenOffice.org et les instructions UNO
OpenOffice.org fournit un enregistreur, pour enregistrer une série d'actions, dans Writer et Calc seulement. Il permet de produire du code. L'enregistreur écrit une série d'instructions utilisant les objets UNO (Universal Network Objects, objets réseau universels), qui ne sont pas particulièrement pratique pour apprendre le modèle API d'OpenOffice.org. Le code produit est un peu dur à suivre. Il est généralement préférable d'utiliser les appels API d'OpenOffice.org mais parfois les appels UNO reste la seule la méthode (ou la plus facile) pour trouver les routines dont on a besoin.
Pour avoir une liste des instructions possibles, voir : http://wiki.services.openoffice.org/wiki/Framework/Article/OpenOffice.org_2.x_Commands
Ci-dessous, trois versions de la même macro :
- L'exemple produit par l'enregistreur
- Ré-arrangement des appels UNO (Universal Network Objects, objets réseau universels)
- Macro avec les appels API (Application programming interface, interface de programmation applicative)
La séquence des opérations enregistrées sont :
Taper "Du texte"; Appuyer Entrée; Taper "Un nouveau paragraphe avec un "; Format > Caractères… > Gras > OK; Taper "mot"; Format > Caractères… > Normal > OK; Taper " en gras à l'intérieur".
Remarque: | Cela pouvait être mieux fait autrement, mais cet exemple simple sert à illustrer le point que nous traitons. |
Exemple sortie de l'enregisteur Ooo
sub Exemple
rem ----------------------------------------------------------------------
rem define variables
dim document as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Text"
args1(0).Value = "Du texte"
dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args1())
rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:InsertPara", "", 0, Array())
rem ----------------------------------------------------------------------
dim args3(0) as new com.sun.star.beans.PropertyValue
args3(0).Name = "Text"
args3(0).Value = "Un nouveau paragraph avec un "
dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args3())
rem ----------------------------------------------------------------------
dim args4(0) as new com.sun.star.beans.PropertyValue
args4(0).Name = "Bold"
args4(0).Value = true
dispatcher.executeDispatch(document, ".uno:Bold", "", 0, args4())
rem ----------------------------------------------------------------------
dim args5(0) as new com.sun.star.beans.PropertyValue
args5(0).Name = "Text"
args5(0).Value = "mot"
dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args5())
rem ----------------------------------------------------------------------
dim args6(0) as new com.sun.star.beans.PropertyValue
args6(0).Name = "Bold"
args6(0).Value = false
dispatcher.executeDispatch(document, ".uno:Bold", "", 0, args6())
rem ----------------------------------------------------------------------
dim args7(0) as new com.sun.star.beans.PropertyValue
args7(0).Name = "Text"
args7(0).Value = " en gras à l'intéreur."
dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args7())
end sub
Ré-arrangement des instructions UNO
(Cette entête est liées à UNO Dispatch, par conséquent si vous la modifier, changer aussi le lien.)
Maintenant le même exemple ré-arrangé en utilisant une fonction pour appeler les objets UNO (certains objets UNO retournent une valeur, par conséquent il est préférable d'utiliser une fonction pour avoir aussi ce retour. L'utilisation d'une procédure (sub) ferait perdre la totale compatibilité des deux méthodes.) :
sub Exemple
fnDispatch("InsertText", array("Text","Du texte"))
fnDispatch("InsertPara")
fnDispatch("InsertText", array("Text","Un nouveau paragraphe avec un "))
fnDispatch("Bold", array("Bold",true))
fnDispatch("InsertText", array("Text","mot"))
fnDispatch("Bold", array("Bold",false))
fnDispatch("InsertText", array("Text"," en gras à l'intérieur."))
end sub
function fnDispatch(sCommand as string, optional mArgs)
oFrame = ThisComponent.getCurrentController.getFrame
oDispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
'on error resume next
if isMissing(mArgs) then
fnDispatch = oDispatcher.executeDispatch(oFrame, ".uno:" & sCommand, "", 0, array())
else
nArgs = uBound(mArgs) \ 2
dim Args(nArgs) as new com.sun.star.beans.PropertyValue
for i = 0 to nArgs
Args(i).name = mArgs(i * 2)
Args(i).value = mArgs(i * 2 + 1)
next
fnDispatch = oDispatcher.executeDispatch(oFrame, ".uno:" & sCommand, "", 0, Args())
end if
end function
Macro avec les appels API
Finalement le même exemple en utilisant les appels API :
sub Exemple
oVC = thisComponent.getCurrentController.getViewCursor
oText = oVC.text
oText.insertString(oVC, "Du texte", False)
oText.insertControlCharacter(oVC, com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False)
oText.insertString(oVC, "Un nouveau paragraphe avec un ", False)
oVC.setPropertyValue("CharWeight", com.sun.star.awt.FontWeight.BOLD)
oText.insertString(oVC, "mot", false)
oVC.setPropertyValue("CharWeight", com.sun.star.awt.FontWeight.NORMAL)
oText.insertString(oVC, " en gras a l'intérieur.", false)
end sub
Traduction à partir de : http://wiki.services.openoffice.org/wiki/The_OpenOffice.org_recorder_and_UNO_dispatch_calls