Portable version (Re: OLE: simpress (create presentation and then run/starts it)

2022-08-04 Thread Rony G. Flatscher
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": 
.


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

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

 Links:
 

 
 

 Using UNO.CLS create a new simpress presentation about REXX and ooRexx and 
then
 display it as a presentation. Demonstrates how to use enumeration to
 enumerate paragraphs of a text and query their 'NumberingLevel' property.
   ***/

   /* create a presentation, then start it */
   xDesktop=uno.createDesktop()-- bootstrap & get access to XDesktop
   xcl=xDesktop~XComponentLoader   -- get XComponentLoader interface

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

   xDrawPages = document~XDrawPagesSupplier~getDrawPages   -- get DrawPages
   -- first page
   drawPage=xDrawPages~getByIndex(0)  -- get first (empty) page

   drawPage~XPropertySet~setPropertyValue("Layout", box("short",0))  -- "Title 
Slide"
   xShapes=drawPage~XShapes   -- get access to its shapes

   ---
   title = "ooRexx"
   xShapes~getByIndex(0)~XText~setString(title)

   shape = xShapes~getByIndex(1)~XText
   cursor = shape~createTextCursor~XTextCursor  -- create cursor, get 
XTextCursor
   cr="0d"x
   shape~insertString(cursor,"Open Object Rexx (ooRexx)"cr, .false)

   textRange=shape~getEnd -- get a XTextRange
   textRange~XPropertySet~setPropertyValue("CharHeight", box('short',15))  -- 
use 15 pixel height
   info="(Presentation created:" .dateTime~new")"
   textRange~setString(info)  -- set it to this string

   -- add a second page
   drawPage=xDrawPages~~insertNewByIndex(1)~getByIndex(1) -- insert at end, get 
access

   -- drawPage=drawPages~~insertNewByIndex(1)~getByIndex(1) -- insert at end, 
get access
   drawPage~XPropertySet~setPropertyValue("Layout", box('short',1))  -- "Title 
Content"
   xShapes = drawPage~XShapes
   xshapes~getByIndex(0)~XText~setString("Open Object Rexx (ooRexx)")  -- first 
shape

   text=xShapes~getByIndex(1)~XText -- get second shape (listing)
   -- add string, supply level
   call addItem text, "REXX (IBM)",   0
   call addItem text, "First released in 1979 for IBM mainframes",1
   call addItem text, "Object REXX (IBM)",0
   call addItem text, "Object-oriented successor to REXX",1
   call addItem text, "First released in 1994 with IBM's OS/2 Warp",  1
   call addItem text, "Negotiations about open-sourcing with RexxLA", 1
   call addItem text, "Rexx Language Association (www.RexxLA.org)",   2
   call addItem text, "Source code handed over to RexxLA in 2003",2
   call addItem text, "Open Object Rexx (ooRexx by RexxLA)",  0
   call addItem text, "First released in 2004 by RexxLA", 1, .false

   document~XModifiable~setModified(.false) -- inhibit save-as popup
   /* "start" would be found in the ooRexx root class .Object, hence forcing
   the message to be dispatched to the Java object */
   document~XPresentationSupplier~getPresentation~~bsf.dispatch("start")  -- 
start presentation

   say "double-check: dump NumberingLevel of each text paragraph:"
   call dumpItems text-- demonstrates enumerating listing 
text

   ::requires UNO.CLS  -- get UNO support, will require BSF.CLS 
(ooRexx-Java bridge)


   ::routine addItem-- adds string at the given (0-based 
outline) level
  use arg xText, 

OLE: simpress (create presentation and then run/starts it)

2022-06-24 Thread Rony G. Flatscher

This ooRexx program creates a simpress presentation and then runs/starts it.

   /**
 AOO_simpress_present.rex using OLE (object linking and embedding) with 
ooRexx

 Links: 
   

   
   

 Using OLE create a new simpress presentation about REXX and ooRexx and then
 display it as a presentation. Demonstrates how to use enumeration to
 enumerate paragraphs of a text and query their 'NumberingLevel' property.
   ***/

   /* create a presentation, then start it */
   serviceManager = .OLEObject~new('com.sun.star.ServiceManager')
   desktop  = serviceManager~createInstance('com.sun.star.frame.Desktop')
   noProps  = .array~new   /* empty array (no properties)   */
   document = desktop~loadComponentFromURL('private:factory/simpress', 
'_blank', 0, noProps)

   drawPages = document~getDrawPages  -- get DrawPages
   -- first page
   drawPage=drawPages~getByIndex(0)   -- get first (empty) page
   drawPage~setPropertyValue("Layout", 0) -- "Title Slide"

   title = "ooRexx"
   shape = drawPage~getByIndex(0) -- get first shape (title)
   shape~setString(title)

   shape = drawPage~getByIndex(1) -- get second shape (subtitle)
   cursor = shape~createTextCursor    -- get XTextCursor
   cr="0d"x
   shape~insertString(cursor,"Open Object Rexx (ooRexx)"cr, .false)

   textRange=shape~getEnd -- get a XTextRange
   textRange~setPropertyValue("CharHeight", 15)    -- use 15 pixel height
   info="(Presentation created:" .dateTime~new")"
   textRange~setString(info)  -- set it to this string

   -- add a second page
   drawPage=drawPages~~insertNewByIndex(1)~getByIndex(1) -- insert at end, get 
access
   drawPage~setPropertyValue("Layout", 1) -- "Title Content"
   drawPage~getByIndex(0)~setString("Open Object Rexx (ooRexx)") -- first shape

   text=drawPage~getByIndex(1)    -- get second shape (listing)
   -- add string, supply level
   call addItem text, "REXX (IBM)",   0
   call addItem text, "First released in 1979 for IBM mainframes",    1
   call addItem text, "Object REXX (IBM)",    0
   call addItem text, "Object-oriented successor to REXX",    1
   call addItem text, "First released in 1994 with IBM's OS/2 Warp",  1
   call addItem text, "Negotiations about open-sourcing with RexxLA", 1
   call addItem text, "Rexx Language Association (www.RexxLA.org)",   2
   call addItem text, "Source code handed over to RexxLA in 2003",    2
   call addItem text, "Open Object Rexx (ooRexx by RexxLA)",  0
   call addItem text, "First released in 2004 by RexxLA", 1, .false

   document~setModified(.false) -- inhibit save-as popup
   /* OOo OLE interface does not answer hasOleMethod('start') with .true
   therefore forcing "start" to be dispatched to Windows */
   document~getPresentation~dispatch("start")   -- start presentation

   say "double-check: dump NumberingLevel of each text paragraph:"
   call dumpItems text    -- demonstrates enumerating listing 
text


   ::routine addItem    -- adds string at the given (0-based 
outline) level
  use arg xText, string, level, bNewParagraph=.true

  xTR=xText~getEnd   -- get XTextRange
  xTR~setPropertyValue("NumberingLevel",level) -- set XTextRange level
  xTR~setString(string)  -- set string

  if bNewParagraph=.true then    -- add new paragraph
 xTR~getEnd~setString("0a"x) -- add linefeed character -> new paragraph

   ::routine dumpItems  -- show level and string from XText
  use arg xText

  enum=xText~createEnumeration   -- enumerate paragraphs
  do i=1 while enum~hasMoreElements
    xtr=enum~nextElement -- we need XTextRange's string & properties
    nl=xtr~getPropertyValue("NumberingLevel")
    say " item #" i": NumberingLevel="pp(nl) pp(xtr~getString)
  end
  return
   pp: -- "pretty print", internal routine: return argument enclosed in square 
brackets
  return "["arg(1)"]"

HTH

---rony

P.S.: The short paper at  introduces ooRexx briefly in ten pages, home 
of Rexx based technologies is the non-profit SIG "Rexx Language Association" at 
.