The recorder and UNO dispatch calls

From Apache OpenOffice Wiki
Jump to: navigation, search provides a recorder, to record a series of actions, in Writer and Calc only, to produce some code. The recorder produces a series of UNO dispatch calls, which are not particularly useful for learning the API model. I personally find the code that the recorder produces to be a little hard to follow. It is generally considered preferable to use API calls but sometimes the only way or most convenient way is to use UNO dispatch calls.

The dispatch commands are an internal mechanism of The arguments of each dispatch command are not documented.

This Framework article is the latest command list available.

Below are three versions of the same macro:

  • Recorded example
  • Tidied UNO dispatch calls
  • API Calls

The series of steps recorded were:

Type "Some text" ; Press Enter; Type "A new paragraph with a "; Format > Character… > Bold > OK; Type "bold"; Format > Character… > Regular> OK; Type " word in it".

Note: This would be best handled with autotext, but this simple example demonstrates the point.

Recorded example

   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("")
   rem ----------------------------------------------------------------------
   dim args1(0) as new
   args1(0).Name = "Text"
   args1(0).Value = "Some text"
   dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args1())
   rem ----------------------------------------------------------------------
   dispatcher.executeDispatch(document, ".uno:InsertPara", "", 0, Array())
   rem ----------------------------------------------------------------------
   dim args3(0) as new
   args3(0).Name = "Text"
   args3(0).Value = "A new paragraph with a "
   dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args3())
   rem ----------------------------------------------------------------------
   dim args4(0) as new
   args4(0).Name = "Bold"
   args4(0).Value = true
   dispatcher.executeDispatch(document, ".uno:Bold", "", 0, args4())
   rem ----------------------------------------------------------------------
   dim args5(0) as new
   args5(0).Name = "Text"
   args5(0).Value = "bold"
   dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args5())
   rem ----------------------------------------------------------------------
   dim args6(0) as new
   args6(0).Name = "Bold"
   args6(0).Value = false
   dispatcher.executeDispatch(document, ".uno:Bold", "", 0, args6())
   rem ----------------------------------------------------------------------
   dim args7(0) as new
   args7(0).Name = "Text"
   args7(0).Value = " word in it."
   dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args7())
   end sub

Tidied UNO dispatch calls

(This heading is linked to from UNO Dispatch, so if you change it change the link as well.)

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):

   sub Example
       fnDispatch("InsertText", array("Text","Some text"))
       fnDispatch("InsertText", array("Text","A new paragraph with a "))
       fnDispatch("Bold", array("Bold",true))
       fnDispatch("InsertText", array("Text","bold"))
       fnDispatch("Bold", array("Bold",false))
       fnDispatch("InsertText", array("Text"," word in it."))
   end sub

   function fnDispatch(sCommand as string, optional mArgs)
       oFrame = ThisComponent.getCurrentController.getFrame
       oDispatcher = createUnoService("")
       'on error resume next
       if isMissing(mArgs) then
           fnDispatch = oDispatcher.executeDispatch(oFrame, ".uno:" & sCommand, "", 0, array())
           nArgs = uBound(mArgs) \ 2
           dim Args(nArgs) as new
           for i = 0 to nArgs
               Args(i).name = mArgs(i * 2)
               Args(i).value = mArgs(i * 2 + 1)
           fnDispatch = oDispatcher.executeDispatch(oFrame, ".uno:" & sCommand, "", 0, Args())
       end if
   end function

API calls

Finally the same example using API calls:

   sub Example
       oVC = thisComponent.getCurrentController.getViewCursor
       oText = oVC.text
       oText.insertString(oVC, "Some text", False)
       oText.insertControlCharacter(oVC,, False)
       oText.insertString(oVC, "A new paragraph with a ", False)
       oText.insertString(oVC, "bold", false)
       oText.insertString(oVC, " word in it.", false)
   end sub

Personal tools