# TclOO.tcl # ------------------------ # Written by: William J Giddings # 15th October, 2005 # Description: # ----------- # Render text pages within OpenOffice Writer under # the control of a Tcl Script. # # Proceedures: # ----------- # TclOO::begin

# Note: # ---- # Provides the a simple, task oriented interface to Sun OpenOffice. # # References: # ---------- # http://udk.openoffice.org/common/man/tutorial/office_automation.html # http://udk.openoffice.org/common/man/tutorial/writerdemo.html # http://api.openoffice.org/basic/man/tutorial/tutorial.pdf

 package require tcom

#----------------------- # create namespace to contain package specific procs and shared variables #-----------------------

 namespace eval TclOO {} {}

#----------------------- # If OpenOffice isn't running then start it up! #-----------------------

 proc TclOO::begin {} {
  # The service manager is always the starting point
  set ::TclOO::ServiceManager [::tcom::ref createobject com.sun.star.ServiceManager]

  # Create the Desktop
  set ::TclOO::Desktop [$TclOO::ServiceManager createInstance com.sun.star.frame.Desktop]
 }

#----------------------- # Open a new empty writer document #-----------------------

 proc TclOO::writer {} {
  array set args {}
  set ::TclOO::Document [$TclOO::Desktop loadComponentfromUrl private:factory/swriter _blank 0 [parray args]]
  set ::TclOO::Text [$::TclOO::Document getText]

 # Create a cursor object
 set ::TclOO::Cursor [$::TclOO::Text createTextCursor]
 }

#----------------------- # Create a text object #-----------------------

 proc TclOO::text:Insert {str} {
  # Inserting some Text
  $::TclOO::Text insertString $::TclOO::Cursor "$str\n" false
 }

#----------------------- # Print #-----------------------

 proc TclOO::print {} {
  array set args {}
  $::TclOO::Document Print [parray args]
 }

#----------------------- # Table #-----------------------

 proc TclOO::table {rows cols} {
  # create instance of table object
  set ::TclOO::Table [$::TclOO::Document createInstance "com.sun.star.text.TextTable"]
  # set the size 
  $::TclOO::Table initialize $rows $cols
  # Insert the table
  $::TclOO::Text insertTextContent $::TclOO::Cursor $::TclOO::Table false
 }

 #-----------------------
 # Insert string into table cel
 #-----------------------
 proc TclOO::table:SetCel {cel str} {
  set cell [$::TclOO::Table getCellByName $cel] 
  $cell SetString $str
 }

 #-----------------------
 # Insert forumula into table cel
 #-----------------------
 proc TclOO::table:SetFormula {cel frm} {
  set cell [$::TclOO::Table getCellByName $cel] 
  eval $cell setFormula $frm
 }

 #-----------------------
 # goto, reposistion insert cursor
 #-----------------------
 proc TclOO::goto {keyword {spc {}} } {
  # make sure keyowrd is the right format
  switch [string toupper $keyword] {
    RIGHT { set keyword goRight }
    LEFT { set keyword goLeft }
    NEXTSENTENCE {set keyword gotoNextSentence}
    PREVIOUSENTENCE { set keyword gotoPreviousSentence}
    NEXTPARAGRAPH {set keyword gotoNextParagraph}
    PREVIOUSPARAGRAPH {set keyword gotoPreviousParagraph}
    ENDOFPARAGRAPH {set keyword gotoEndOfParagraph}
    STARTOFPARAGRAPH {set keyword gotoStartOfParagraph}
    }
  $::TclOO::Cursor $keyword $spc false    
 }

 #-----------------------
 # the ubiquitous demo
 #-----------------------
 proc demo {} {
  # begin the rendering process
  TclOO::begin
  TclOO::writer

  # some sample text
  TclOO::text:Insert "Apple"
  TclOO::text:Insert "Bannana"
  TclOO::text:Insert "Cherry"
  TclOO::text:Insert "Damson"

  # add a table
  TclOO::table 4 4
  # add table headings
  TclOO::table:SetCel A1 Jan
  TclOO::table:SetCel B1 Feb
  TclOO::table:SetCel C1 Mar 
  TclOO::table:SetCel D1 Sum
  # first row of data
  TclOO::table:SetCel A2 10.0
  TclOO::table:SetCel B2 20.0
  TclOO::table:SetCel C2 30.5 
  # second row of data
  TclOO::table:SetCel A3 10.0
  TclOO::table:SetCel B3 20.0
  TclOO::table:SetCel C3 30.5 
  # some formulae
  TclOO::table:SetFormula D2 sum<A2:C2>
  TclOO::table:SetFormula D3 sum<A3:C3>  
  TclOO::table:SetCel C4 Total   
  TclOO::table:SetFormula D4 sum<D2:D3>  

  # reposition the cursor
  TclOO::goto Start
  TclOO::text:Insert "Top of Page"
  TclOO::goto End
  TclOO::text:Insert "Bottom of Page"
  TclOO::goto left 5
  TclOO::text:Insert "***"

  # and print!
  TclOO::print 

 }

 demo