Difference between revisions of "L'enregistreur de macro OpenOffice.org et les appels UNO (dispatch)"

From Apache OpenOffice Wiki
Jump to: navigation, search
Line 1: Line 1:
 
'''L'enregistreur de macro OpenOffice.org et les Appels UNO (dispatch)'''  
 
'''L'enregistreur de macro OpenOffice.org et les Appels UNO (dispatch)'''  
  
OpenOffice.org fourni un enregistreur, pour enregistrer une série d'actions, dans '''Writer et Calc seulement''', pour produire du code. L'enregistreur produit 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 personnelement que le code que produit l'enregistreur 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) de trouver les routines dont on a besoin.
+
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 personnelement 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) de 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
 
Pour une liste des appels du dispatcheur, voir : http://www.openoffice.org/files/documents/25/2570/commandsReference.html
Line 13: Line 13:
 
La séquence des opérations enregistrées sont :  
 
La séquence des opérations enregistrées sont :  
  
Taper "Some text" ; Appuyer '''Entrée'''; Taper "A new paragraph with a "; '''Format > Character… > Bold > OK'''; Type "bold"; '''Format > Character… > Regular> OK'''; Taper " word in it".  
+
Taper "Du texte" ; Appuyer '''Entrée'''; Taper "Un nouveau paragraphe avec un "; '''Format > Caractères… > Gras > OK'''; Taper "gras"; '''Format > Caractères… > "Regular"> OK'''; Taper " mot à l'intérieur".  
  
 
{| border="1"
 
{| border="1"
|'''Note:'''
+
|'''Remarque :'''
|This would be best handled with autotext, but this simple example demonstrates the point.
+
|Cela pouvait être mieux fait autrement, mais cet exemple simple sert à illustrer le point que nous traitons.
 
|}
 
|}
  
Line 37: Line 37:
 
     dim args1(0) as new com.sun.star.beans.PropertyValue
 
     dim args1(0) as new com.sun.star.beans.PropertyValue
 
     args1(0).Name = "Text"
 
     args1(0).Name = "Text"
     args1(0).Value = "Some text"
+
     args1(0).Value = "Du texte"
 
      
 
      
 
     dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args1())
 
     dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args1())
Line 47: Line 47:
 
     dim args3(0) as new com.sun.star.beans.PropertyValue
 
     dim args3(0) as new com.sun.star.beans.PropertyValue
 
     args3(0).Name = "Text"
 
     args3(0).Name = "Text"
     args3(0).Value = "A new paragraph with a "
+
     args3(0).Value = "Un nouveau paragraph avec un "
 
      
 
      
 
     dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args3())
 
     dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args3())
Line 61: Line 61:
 
     dim args5(0) as new com.sun.star.beans.PropertyValue
 
     dim args5(0) as new com.sun.star.beans.PropertyValue
 
     args5(0).Name = "Text"
 
     args5(0).Name = "Text"
     args5(0).Value = "bold"
+
     args5(0).Value = "gras"
 
      
 
      
 
     dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args5())
 
     dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args5())
Line 75: Line 75:
 
     dim args7(0) as new com.sun.star.beans.PropertyValue
 
     dim args7(0) as new com.sun.star.beans.PropertyValue
 
     args7(0).Name = "Text"
 
     args7(0).Name = "Text"
     args7(0).Value = " word in it."
+
     args7(0).Value = " mot à l'intéreur."
 
      
 
      
 
     dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args7())
 
     dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args7())
Line 83: Line 83:
  
 
==Ré-arrangement des appels UNO (dispatcheur)==
 
==Ré-arrangement des appels UNO (dispatcheur)==
(This heading is linked to from [[ UNO Dispatch]], so if you change it change the link as well.)  
+
(Cette entête est liées à [[UNO Dispatch]], par conséquent si vous la modifier, changer aussi le lien.)
  
Now the same example having been tidied using a function for calling the UNO dispatch calls (some UNO Dispatch calls return a value so using a function makes it more generically useful than a sub):  
+
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.) :  
  
 
<code>
 
<code>
 
     sub Example
 
     sub Example
         fnDispatch("InsertText", array("Text","Some text"))
+
         fnDispatch("InsertText", array("Text","Du texte"))
 
         fnDispatch("InsertPara")
 
         fnDispatch("InsertPara")
         fnDispatch("InsertText", array("Text","A new paragraph with a "))
+
         fnDispatch("InsertText", array("Text","Un nouveau paragraphe avec un "))
 
         fnDispatch("Bold", array("Bold",true))
 
         fnDispatch("Bold", array("Bold",true))
         fnDispatch("InsertText", array("Text","bold"))
+
         fnDispatch("InsertText", array("Text","gras"))
 
         fnDispatch("Bold", array("Bold",false))
 
         fnDispatch("Bold", array("Bold",false))
         fnDispatch("InsertText", array("Text"," word in it."))
+
         fnDispatch("InsertText", array("Text"," mot à l'intérieur."))
 
     end sub
 
     end sub
 
   
 
   
Line 124: Line 124:
 
         oVC = thisComponent.getCurrentController.getViewCursor
 
         oVC = thisComponent.getCurrentController.getViewCursor
 
         oText = oVC.text
 
         oText = oVC.text
         oText.insertString(oVC, "Some text", False)
+
         oText.insertString(oVC, "Du texte", False)
 
         oText.insertControlCharacter(oVC, com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False)
 
         oText.insertControlCharacter(oVC, com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False)
         oText.insertString(oVC, "A new paragraph with a ", False)
+
         oText.insertString(oVC, "Un nouveau paragraphe avec un ", False)
 
         oVC.setPropertyValue("CharWeight", com.sun.star.awt.FontWeight.BOLD)
 
         oVC.setPropertyValue("CharWeight", com.sun.star.awt.FontWeight.BOLD)
         oText.insertString(oVC, "bold", false)
+
         oText.insertString(oVC, "gras", false)
 
         oVC.setPropertyValue("CharWeight", com.sun.star.awt.FontWeight.NORMAL)
 
         oVC.setPropertyValue("CharWeight", com.sun.star.awt.FontWeight.NORMAL)
         oText.insertString(oVC, " word in it.", false)
+
         oText.insertString(oVC, " mot a l'intérieur.", false)
 
     end sub
 
     end sub
 
</code>
 
</code>

Revision as of 15:14, 23 June 2009

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 personnelement 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) de 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 "gras"; Format > Caractères… > "Regular"> OK; Taper " mot à 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 Example
   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 = "gras"
    
   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 = " mot à 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 Example
       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","gras"))
       fnDispatch("Bold", array("Bold",false))
       fnDispatch("InsertText", array("Text"," mot à 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 Example
       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, "gras", false)
       oVC.setPropertyValue("CharWeight", com.sun.star.awt.FontWeight.NORMAL)
       oText.insertString(oVC, " mot a l'intérieur.", false)
   end sub

Personal tools