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>.

Reply via email to