Hello Rony,

I almost forgot to answer...

This is great work (although I only understand a bit of it).

Could this also work with Object REXX from OS/2 [1]?

Regards,

   Matthias

[1] http://www.edm2.com/index.php/IBM_Object_REXX_for_OS/2

Am 04.08.22 um 14:07 schrieb Rony G. Flatscher:
> This is the first 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_table.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>
>
>      This is the ooRexx version (which includes corrections) of the
> VBScript
>      "A Quick Tour" example from the AOO (Apache OpenOffice) DevGuide,
> chapter
>      "Automation_Bridge" documentation.
>
>      Using UNO.CLS create a new swriter document, a TextTable, a
> TextFrame, paragraphs
>      and apply various formattings.
>   
> ***********************************************************************/
>
>       -- Create the Desktop
>       xDesktop=uno.createDesktop()        -- bootstrap & get access to
> XDesktop
>       xcl=xDesktop~XComponentLoader       -- get XComponentLoader
> interface
>
>       -- Open a new empty writer document
>       uri="private:factory/swriter"       -- new swriter document
>       objDocument=xcl~loadComponentFromURL(uri,"_blank",0,.uno~noProps)
>
>       -- Create a text object
>       objText= objDocument~XTextDocument~getText
>
>       -- Create a cursor object
>       objCursor= objText~createTextCursor
>
>       -- Inserting some Text
>       vbLf = "0a"x    -- line-feed character
>       objText~insertString( objCursor, "The first line in the newly
> created text document."vbLf, .false)
>
>       -- Inserting a second line
>       objText~insertString( objCursor, "Now we-- re in the second
> line", .false)
>
>       -- query interface XMultiServiceFactory
>       objDocument = objDocument~XMultiServiceFactory
>
>       -- Create instance of a text table with 4 columns and 4 rows
>       objTable= objDocument~createInstance(
> "com.sun.star.text.TextTable")~XTextTable
>       objTable~initialize( 4, 4 )
>
>       -- Insert the table
>       objText~insertTextContent( objCursor, objTable, .false)
>
>       -- Get first row
>       objRows= objTable~getRows
>       objRow= objRows~getByIndex( 0)
>
>       -- Set the table background color
>       objTable~XPropertySet~setPropertyValue( "BackTransparent", .false)
>       objTable~XPropertySet~setPropertyValue( "BackColor", 13421823)
>
>       -- Set a different background color for the first row
>       objRow~XPropertySet~setPropertyValue( "BackTransparent", .false)
>       objRow~XPropertySet~setPropertyValue( "BackColor", 6710932)
>
>       -- Fill the first table row
>       call insertIntoCell "A1","FirstColumn", objTable --
> insertIntoCell is a helper function, see below
>       call insertIntoCell "B1","SecondColumn", objTable
>       call insertIntoCell "C1","ThirdColumn", objTable
>       call insertIntoCell "D1","SUM", objTable
>
>       objTable~getCellByName("A2")~setValue( 22.5     )
>       objTable~getCellByName("B2")~setValue( 5615.3   )
>       objTable~getCellByName("C2")~setValue( -2315.7  )
>       objTable~getCellByName("D2")~setFormula( "=sum <A2>+<B2>+<C2>"  )
>
>       objTable~getCellByName("A3")~setValue( 21.5     )
>       objTable~getCellByName("B3")~setValue( 615.3    )
>       objTable~getCellByName("C3")~setValue( -315.7   )
>       objTable~getCellByName("D3")~setFormula( "sum <A3>+<B3>+<C3>" )
>
>       objTable~getCellByName("A4")~setValue( 121.5    )
>       objTable~getCellByName("B4")~setValue( -615.3   )
>       objTable~getCellByName("C4")~setValue( 415.7    )
>       objTable~getCellByName("D4")~setFormula( "sum <A4>+<B4>+<C4>" )
>
>       range=objTable~XCellRange~getCellRangeByName("A2:D4")
>       range~XPropertySet~setPropertyValue("NumberFormat",
> box("short",4))   -- set number format
>       -- use ParaAdjust: com.sun.star.style.ParagraphAdjust.RIGHT
>       right=.uno_enum~new("com.sun.star.style.ParagraphAdjust")~right
>       range~XPropertySet~setPropertyValue("ParaAdjust", right)  --
> align right
>
>       -- Change the CharColor and add a Shadow
>       objCursor~XPropertySet~setPropertyValue( "CharColor", 255)
>       objCursor~XPropertySet~setPropertyValue( "CharShadowed", .true)
>
>       -- Create a paragraph break
>       -- The second argument is a
> com::sun::star::text::ControlCharacter::PARAGRAPH_BREAK constant
>       objText~insertControlCharacter( objCursor, 0 , .false)
>
>       -- Inserting colored Text.
>       objText~insertString( objCursor, " This is a colored Text - blue
> with shadow"vbLf, .false)
>
>       -- Create a paragraph break ( ControlCharacter::PARAGRAPH_BREAK).
>       objText~insertControlCharacter( objCursor, 0, .false)
>
>       -- Create a TextFrame~
>       objTextFrame=
> objDocument~createInstance("com.sun.star.text.TextFrame")~XTextFrame
>
>       -- Create a Size struct~
>       objSize = .bsf~new("com.sun.star.awt.Size")
>       objSize~Width= 15000
>       objSize~Height= 400
>       objTextFrame~XShape~setSize( objSize)
>
>       --  TextContentAnchorType.AS_CHARACTER = 1
>       objTextFrame~XPropertySet~setPropertyValue( "AnchorType", 1)
>
>       -- insert the frame
>       objText~insertTextContent( objCursor, objTextFrame, .false)
>
>       -- Get the text object of the frame
>       objFrameText= objTextFrame~getText
>
>       -- Create a cursor object
>       objFrameTextCursor= objFrameText~createTextCursor
>
>       -- Inserting some Text
>       objFrameText~insertString( objFrameTextCursor, "The first line
> in the newly created text frame.", -
>                                  .false)
>       objFrameText~insertString( objFrameTextCursor, -
>                vbLf"With this second line the height of the frame
> raises.", .false)
>
>       -- Create a paragraph break
>       -- The second argument is a
> com::sun::star::text::ControlCharacter::PARAGRAPH_BREAK constant
>       objFrameText~insertControlCharacter( objCursor, 0 , .false)
>
>       -- Change the CharColor and remove the Shadow
>       objCursor~XPropertySet~setPropertyValue( "CharColor", 65536)
>       objCursor~XPropertySet~setPropertyValue( "CharShadowed", .false)
>
>       -- Insert another string
>       objText~insertString( objCursor, " That-- s all for now !!",
> .false)
>
>    ::requires UNO.CLS   -- get UNO support
>
>    ::routine insertIntoCell
>       use arg strCellName, strText, objTable
>
>       objCellText= objTable~getCellByName( strCellName)~XText
>       objCellCursor= objCellText~createTextCursor
>       objCellCursor~XPropertySet~setPropertyValue( "CharColor",16777215)
>       objCellText~insertString( objCellCursor, strText, .false)
>
> If there are any questions, please ask them.
>
> ---rony
>
>
> On 24.06.2022 12:57, Rony G. Flatscher wrote:
>> Having looked around some nutshell OLE samples to port to ooRexx I
>> stumbled over
>> <https://wiki.openoffice.org/wiki/Documentation/DevGuide/ProUNO/Bridge/Automation_Bridge>
>> which depicts a VBScript example.
>>
>> There are the following changes in the ooRexx code:
>>
>>  * the "=sum" formula now has the cells and the + operator to add
>> them up,
>>  * the TextTable numbers are formatted to #,###.00 and right adjusted.
>>
>> Ad ooRexx: I use it to teach BA students programming from zero to
>> Windows to Java in a four hour lecture in a semester (four months).
>> The Java part includes the knowledge to apply ooRexx via the UNO Java
>> bindings (one can use ooRexx to interact with Java objects, such that
>> the students do not need to know Java, they just need to be able to
>> read Java documentation).
>>
>> ooRexx implements the message paradigm: a value (an object, an
>> instance) is conceptually like a living thing that understands
>> messages one sends to it, which causes the value to look for a method
>> by the same name (supplying arguments, if any) which it invokes and
>> returns any return value if any. The message operator is the tilde
>> (~), the receiver is on the left hand side, the message name on the
>> right hand side. (The short paper at <https://epub.wu.ac.at/8118/>
>> introduces ooRexx briefly in ten pages.)
>>
>> Usually one can turn VB code into ooRexx by replacing dots with a
>> tilde, however it also works the other way round by replacing tildes
>> with dots . :)
>>
>> Here the transcription:
>>
>> /**********************************************************************
>>      AOO_swriter_table.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>
>>
>>      This is the ooRexx version (which includes corrections) of the
>> VBScript
>>      "A Quick Tour" example from the AOO (Apache OpenOffice)
>> DevGuide, chapter
>>      "Automation_Bridge" documentation.
>>
>>      Using OLE create a new swriter document, a TextTable, a
>> TextFrame, paragraphs
>>      and apply various formatings.
>> ***********************************************************************/
>>
>>       -- The service manager is always the starting point
>>       -- If there is no office running then an office is started up
>>       objServiceManager= .OleObject~new("com.sun.star.ServiceManager")
>>
>>       -- Create the Desktop
>>       objDesktop=
>> objServiceManager~createInstance("com.sun.star.frame.Desktop")
>>
>>       -- Open a new empty writer document
>>       args=.array~new
>>       objDocument=
>> objDesktop~loadComponentFromURL("private:factory/swriter", "_blank",
>> 0, args)
>>
>>       -- Create a text object
>>       objText= objDocument~getText
>>
>>       -- Create a cursor object
>>       objCursor= objText~createTextCursor
>>
>>       -- Inserting some Text
>>       vbLf = "0a"x    -- line-feed character
>>       objText~insertString( objCursor, "The first line in the newly
>> created text document."vbLf,
>>    .false)
>>
>>       -- Inserting a second line
>>       objText~insertString( objCursor, "Now we-- re in the second
>> line", .false)
>>
>>       -- Create instance of a text table with 4 columns and 4 rows
>>       objTable= objDocument~createInstance(
>> "com.sun.star.text.TextTable")
>>       objTable~initialize( 4, 4 )
>>
>>       -- Insert the table
>>       objText~insertTextContent( objCursor, objTable, .false)
>>
>>       -- Get first row
>>       objRows= objTable~getRows
>>       objRow= objRows~getByIndex( 0)
>>
>>       -- Set the table background color
>>       objTable~setPropertyValue( "BackTransparent", .false)
>>       objTable~setPropertyValue( "BackColor", 13421823)
>>
>>       -- Set a different background color for the first row
>>       objRow~setPropertyValue( "BackTransparent", .false)
>>       objRow~setPropertyValue( "BackColor", 6710932)
>>
>>       -- Fill the first table row
>>       call insertIntoCell "A1","FirstColumn", objTable --
>> insertIntoCell is a helper function, see
>>    below
>>       call insertIntoCell "B1","SecondColumn", objTable
>>       call insertIntoCell "C1","ThirdColumn", objTable
>>       call insertIntoCell "D1","SUM", objTable
>>
>>       objTable~getCellByName("A2")~setValue( 22.5     )
>>       objTable~getCellByName("B2")~setValue( 5615.3   )
>>       objTable~getCellByName("C2")~setValue( -2315.7  )
>>       objTable~getCellByName("D2")~setFormula( "=sum <A2>+<B2>+<C2>"  )
>>
>>       objTable~getCellByName("A3")~setValue( 21.5     )
>>       objTable~getCellByName("B3")~setValue( 615.3    )
>>       objTable~getCellByName("C3")~setValue( -315.7   )
>>       objTable~getCellByName("D3")~setFormula( "sum <A3>+<B3>+<C3>" )
>>
>>       objTable~getCellByName("A4")~setValue( 121.5    )
>>       objTable~getCellByName("B4")~setValue( -615.3   )
>>       objTable~getCellByName("C4")~setValue( 415.7    )
>>       objTable~getCellByName("D4")~setFormula( "sum <A4>+<B4>+<C4>" )
>>
>>       range=objTable~getCellRangeByName("A2:D4")
>>       range~setPropertyValue("NumberFormat", 4)  -- set number format
>>       -- use ParaAdjust: com.sun.star.style.ParagraphAdjust.RIGHT
>>       range~setPropertyValue("ParaAdjust", 1)    -- align right
>>
>>       -- Change the CharColor and add a Shadow
>>       objCursor~setPropertyValue( "CharColor", 255)
>>       objCursor~setPropertyValue( "CharShadowed", .true)
>>
>>       -- Create a paragraph break
>>       -- The second argument is a
>> com::sun::star::text::ControlCharacter::PARAGRAPH_BREAK constant
>>       objText~insertControlCharacter( objCursor, 0 , .false)
>>
>>       -- Inserting colored Text.
>>       objText~insertString( objCursor, " This is a colored Text -
>> blue with shadow"vbLf, .false)
>>
>>       -- Create a paragraph break ( ControlCharacter::PARAGRAPH_BREAK).
>>       objText~insertControlCharacter( objCursor, 0, .false)
>>
>>       -- Create a TextFrame~
>>       objTextFrame=
>> objDocument~createInstance("com.sun.star.text.TextFrame")
>>
>>       -- Create a Size struct~
>>       objSize =
>> objServiceManager~Bridge_GetStruct("com.sun.star.awt.Size")
>>       objSize~Width= 15000
>>       objSize~Height= 400
>>       objTextFrame~setSize( objSize)
>>
>>       --  TextContentAnchorType.AS_CHARACTER = 1
>>       objTextFrame~setPropertyValue( "AnchorType", 1)
>>
>>       -- insert the frame
>>       objText~insertTextContent( objCursor, objTextFrame, .false)
>>
>>       -- Get the text object of the frame
>>       objFrameText= objTextFrame~getText
>>
>>       -- Create a cursor object
>>       objFrameTextCursor= objFrameText~createTextCursor
>>
>>       -- Inserting some Text
>>       objFrameText~insertString( objFrameTextCursor, "The first line
>> in the newly created text
>>    frame.", -
>>                                  .false)
>>       objFrameText~insertString( objFrameTextCursor, -
>>                vbLf"With this second line the height of the frame
>> raises.", .false)
>>
>>       -- Create a paragraph break
>>       -- The second argument is a
>> com::sun::star::text::ControlCharacter::PARAGRAPH_BREAK constant
>>       objFrameText~insertControlCharacter( objCursor, 0 , .false)
>>
>>       -- Change the CharColor and remove the Shadow
>>       objCursor~setPropertyValue( "CharColor", 65536)
>>       objCursor~setPropertyValue( "CharShadowed", .false)
>>
>>       -- Insert another string
>>       objText~insertString( objCursor, " That-- s all for now !!",
>> .false)
>>
>>    ::routine insertIntoCell
>>       use arg strCellName, strText, objTable
>>
>>       objCellText= objTable~getCellByName( strCellName)
>>       objCellCursor= objCellText~createTextCursor
>>       objCellCursor~setPropertyValue( "CharColor",16777215)
>>       objCellText~insertString( objCellCursor, strText, .false)
>>
>> ---rony
>>
>> P.S.: As I have not found too many self-contained OLE nutshell
>> samples I came up with additional examples for swriter, scalc and
>> simpress which I will post one by one to ease locating them via
>> search engines. Although they will be in the rather unknown ooRexx
>> language it will be simple to translate them to VBS or other
>> programming languages that support OLE.
>

Attachment: smime.p7s
Description: S/MIME Cryptographic Signature

Reply via email to