You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@openoffice.apache.org by "Rony G. Flatscher" <Ro...@wu.ac.at> on 2022/08/04 12:12:43 UTC

Portable version (Re: OLE: swriter (adjust paragraphs)

This is the second of a total of four postings with the intention to demonstrate how to realize the 
same functionality of the posted OLE samples without OLE and in a portable way (running unchanged on 
Windows, Linux and Apple).

These are samples in the ooRexx scripting language, which usually can be easily adapted to other 
languages by replacing the tilde (~), the ooRexx message operator, with a dot (.).

Also, these solutions will use queryInterface() such that one can see for other programming 
languages that need to employ queryInterface() what the interface names are. The ooRexx solution 
(actually the ooRexx-Java bridge BSF4ooRexx) takes advantage of the available message paradigm and 
allows one to merely send the (unqualified) interface name to an UNO object (instead of coding the 
entire queryInterface() statement). The fully qualified interface name can always be looked up 
quickly from the AOO index for the letter "X": 
<https://www.openoffice.org/api/docs/common/ref/index-files/index-24.html>.

Here the portable, OLE-less solution as a follow-up to the matching posting (see underneath):

    /**********************************************************************
      swriter_paragraphs.rxo: using UNO.CLS (i.e. Java UNO under the hood) with ooRexx

      Links:<https://OpenOffice.org>
              <https://wiki.openoffice.org/wiki/Documentation/DevGuide/ProUNO/Bridge/Automation_Bridge>
              <https://www.pitonyak.org/oo.php>
              <https://www.openoffice.org/udk/common/man/spec/ole_bridge.html>

      Using UNO.CLS create a new swriter document, add paragraphs that get aligned
      in four different ways. Demonstrates how to incorporate UNO_CONSTANTS and
      UNO_ENUM values into a Rexx directory-like collection for easier use.
    ***********************************************************************/

    /* create a text document, demonstrate how to align paragraphs */
    xDesktop=uno.createDesktop()        -- bootstrap & get access to XDesktop
    xcl=xDesktop~XComponentLoader       -- get XComponentLoader interface

    uri="private:factory/swriter"       -- new swriter document
    doc=xcl~loadComponentFromURL(uri,"_blank",0,.uno~noProps)

    xText=doc~XTextDocument~getText     -- get text object
    xText~setString("Hello, this is ooRexx on:" .DateTime~new"!")

    xTextCursor=xText~createTextCursor  -- create the character based cursor
        -- make paragraph's properties accessible:
    xParaProps=xTextCursor~XParagraphCursor~XPropertySet

    ctlChars=.uno_constants~new("com.sun.star.text.ControlCharacter") -- UNO_CONSTANT
    paraBreak=ctlChars~paragraph_break  -- get paragraph break constant

    paraAdj =.uno_enum~new("com.sun.star.style.ParagraphAdjust")   -- UNO_ENUM

    arr=.array~of("right", "center", "block", "left")  -- adjustments
    do adj over arr   -- iterate over adjustments, create string, adjust
        xTextCursor~gotoEnd(.false)      -- position at end
        xText~insertControlCharacter(xTextCursor, paraBreak, .false)
        string=("This paragraph will be" adj"-adjusted. ")~copies(8)
        xText~insertString(xTextCursor, string, .true)
        xParaProps~setPropertyValue("ParaAdjust", paraAdj~send(adj))
    end

    ::requires UNO.CLS   -- get UNO support

If there are any questions, please ask them.

---rony


On 24.06.2022 13:04, Rony G. Flatscher wrote:
> This ooRexx program creates a swriter document which creates paragraphs that get right-, center-, 
> block- and left-adjusted. There is a routine that allows to fetch constant and enum values in an 
> ooRexx directory, such that sending the name of a constant or enum value will return the value one 
> has to use as an argument.
>
> /**********************************************************************
>      AOO_swriter_paragraphs.rex using OLE (object linking and embedding) with ooRexx
>
>      Links: <https://OpenOffice.org>
> <https://wiki.openoffice.org/wiki/Documentation/DevGuide/ProUNO/Bridge/Automation_Bridge>
> <https://www.pitonyak.org/oo.php>
> <https://www.openoffice.org/udk/common/man/spec/ole_bridge.html>
>
>      Using OLE create a new swriter document, add paragraphs that get aligned
>      in four different ways. Demonstrates how to use UNO reflection and
>      incorporate UNO_CONSTANTS and UNO_ENUM values into a Rexx directory for
>      easier use.
> ***********************************************************************/
>
>    /* create a text document, demonstrate how to align paragraphs */
>    serviceManager = .OLEObject~new('com.sun.star.ServiceManager')
>    /* create text document */
>    desktop  = serviceManager~createInstance('com.sun.star.frame.Desktop')
>    noProps  = .array~new   /* empty array (no properties)   */
>    document = desktop~loadComponentFromURL('private:factory/swriter', '_blank', 0, noProps)
>
>    text = document~getText                -- get text object
>    text~setString("Hello, this is ooRexx on:" .DateTime~new"!")
>    cursor = text~createTextCursor
>
>    ctlChars = getAsDirectory(serviceManager, "com.sun.star.text.ControlCharacter")  -- UNO_CONSTANT
>    paraBreak = ctlChars~paragraph_break   -- get paragraph break constant
>
>    paraAdj = getAsDirectory(serviceManager, "com.sun.star.style.ParagraphAdjust")   -- UNO_ENUM
>
>    arr = .array~of("right", "center", "block", "left")   -- adjustments
>    do adj over arr   -- iterate over adjustments, create string, adjust
>        cursor~gotoEnd(.false)     -- position at end
>        text~insertControlCharacter(cursor, paraBreak, .false)
>        string = ("This paragraph will be" adj"-adjusted. ")~copies(8)
>        text~insertString(cursor, string, .true)
>        -- fetch appropriate adjust enum value from directory
>        cursor~setPropertyValue("ParaAdjust", paraAdj~send(adj))
>    end
>
>
>    /* Routine returns a Rexx directory containing all names and values of the supplied
>        UNO_CONSTANTS or UNO_ENUM class name (needs to be fully qualified).  */
>    ::routine getAsDirectory
>       use strict arg serviceManager, unoClzName
>
>       dir = .Directory~new              -- directory will get
>       dir~objectName = unoClzName       -- allows to show the uno class it represents
>
>       ctxt = serviceManager~defaultContext
>       tdm = ctxt~getValueByName("/singletons/com.sun.star.reflection.theTypeDescriptionManager")
>       reflClz= tdm~getByHierarchicalName(unoClzName)
>       if reflClz~isNil then return dir  -- return empty directory
>
>       typeClass = reflClz~getTypeClass
>       if typeClass = 30 then         -- UNO_CONSTANTS
>       do
>          dir~objectName = unoClzName "(UNO_CONSTANTS)" -- supply type info to name
>          do c over reflClz~getConstants -- iterate over constant fields
>             name = c~getName            -- fully qualified
>             name = name~substr(name~lastPos('.')+1) -- extract last word
>             dir[name] = c~getConstantValue -- store constant values with their names
>             -- say "name:" name "->" c~getConstantValue
>          end
>       end
>       else if typeClass = 15 then    -- UNO_ENUMERATION
>       do
>          dir~objectName = unoClzName "(UNO_ENUM)"   -- supply type info to name
>          enumNames = reflClz~getEnumNames     -- get all enumeration names
>          enumValues = reflClz~getEnumValues   -- get all enumeration values
>          do i=1 to enumNames~items
>             name = enumNames[i]
>             name = name~substr(name~lastPos('.')+1) -- extract last word
>             dir[name] = enumValues[i]   -- store enum values with their names
>             -- say "name:" name "->" enumValues[i]
>          end
>       end
>       return dir
>
> HTH
>
> ---rony
>
> P.S.: The short paper at <https://epub.wu.ac.at/8118/> introduces ooRexx briefly in ten pages, 
> home of Rexx based technologies is the non-profit SIG "Rexx Language Association" at 
> <https://www.RexxLA.org>.