############################################ # 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 - startup OpenOffice # TclOO::writer - create writer document # TclOO::text:Insert {str} - insert text # TclOO::print - print document to default printer # TclOO::table {rows cols} - create table # TclOO::table:SetCel {cel str} - set cel value # TclOO::table:SetFormula {cel frm} - set cel cel formula # TclOO::goto {keyword {spc {}} } - reposition insert cursor # # Note: # ---- # # # 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
schlenk 16. Oct 2005 While wrapping things in a nicer TclOO namespace is good, using Tcom limits it to windows. The same thing using TclUNO would be a nice addition.
Arnulf Wiedemann 18. Oct 2005 Just for information: There is some work in progress having a tcl-only package with the same interfaces as the tcluno C++ Version library, which should also run on Microsoft Windows. The base of the package is ready; there is only some more testing necessary before releasing it. Let me know if somebody likes to be the "guinea pig" for testing. Look on the tcluno page for contacting me.