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. >
smime.p7s
Description: S/MIME Cryptographic Signature