L'enregistreur de macro OpenOffice.org et les appels UNO (dispatch)
L'enregistreur de macro OpenOffice.org et les appels UNO (dispatch)
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'appels UNO (dispatch), qui ne sont pas particulièrement pratique pour apprendre le modèle API d'OpenOffice.org. Je trouve personnellement que 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 le dispatcheur d'appels UNO reste la seule la méthode (ou la plus facile) pour trouver les routines dont on a besoin.
Pour une liste des appels du dispatcheur, voir: http://www.openoffice.org/files/documents/25/2570/commandsReference.html
Ci-dessous, trois versions de la même macro:
- L'exemple produit par l'enregistreur
- Ré-arrangement des appels UNO (dispatcheur)
- Macro avec les appels API
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 appels UNO (dispatcheur)
(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 le dispatcheur d'appels UNO (certains appels UNO (Dispatch) 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