close document uno Josef Frysak How to close a document?

First check if the document has been changed since last save by using the

"XModifiable" interface. If it has been changed use the "XStorable"

interface to save it before closing the document.

To close a document there are 3 ways to do so: The "close" method of the

"XClosable" interface, the "dispose" function of the "XComponent" interface

and the "terminate" method of the "XDesktop" interface. The best way to

close a document is to use the "close" method.

For further details see http://wi.wu-wien.ac.at/rgf/diplomarbeiten/BakkStuff/2008/200809_Frysak/200809_Frysak_Automating_OOo_ooRexx_Nutshells.pdf.

-- try to get a script context, will be .nil, if script was not invoked by OOo x_ScriptContext = uno.getScriptContext() if (x_ScriptContext <> .nil) then do -- invoked by OOo as a macro -- get context x_ComponentContext = x_ScriptContext~getComponentContext -- get desktop (an XDesktop) x_Desktop = x_ScriptContext~getDesktop -- get current document x_Document = x_ScriptContext~getDocument end else do -- called from outside of OOo, create a connection -- connect to Open Office and get component context x_ComponentContext = UNO.connect() -- create a desktop service and its interface service = "{%see com.sun.star.frame.Desktop}" s_Desktop = x_ComponentContext~getServiceManager~{%see com.sun.star.lang.XMultiServiceFactory%XMultiServiceFactory}~createInstance(service) x_Desktop = s_Desktop~{%see com.sun.star.frame.XDesktop%XDesktop} -- get the last active document x_Document = x_Desktop~getCurrentComponent() end -- create outputtext output = "Document " -- check if doucument has been changed x_Modifiable = x_Document~{%see com.sun.star.util.XModifiable%XModifiable} x_Storable = x_Document~{%see com.sun.star.frame.XStorable%XStorable} If (x_Modifiable~isModified()) Then do output = output || "was Modified, " /* if there is allready a file containing the document then save into this file, else just set modify flag to false (do not save file) */ If (x_Storable~hasLocation & (\ x_Storable~isReadOnly)) Then do x_Storable~store() output = output || "and has been stored - " end else do x_Modifiable~setModified(.false) output = output || "and has NOT been stored - " end end else do output = output || "was NOT Modified - " end /* next check for different methods to shut down if we are able to create a XModel interface then also try to query a XClosable interface to close document. If XCloseable interface is not available, use Documents dispose method to close the document. If XModel interface query fails, terminate the frame to shut down. */ -- x_ServiceInfo = x_Document~{%see com.sun.star.lang.XServiceInfo%XServiceInfo} -- If x_ServiceInfo~supportsService("{%see com.sun.star.frame.XModel}") then -- I dont know why, but this does not work properly, therefore x_Model = x_Document~{%see com.sun.star.frame.XModel%XModel} if x_Model <> .nil then do x_Closeable = x_Document~{%see com.sun.star.util.XCloseable%XCloseable} If x_Closeable <> .nil then do x_Closeable~close(.true) output = output || "closed by XClosable Interface (SOFTEST WAY)" end else do x_Document~dispose() output = output || "closed by XDocument Interface (SOFT WAY)" end end else do x_Desktop~terminate() output = output || "closed by XDesktop Interface (HARD WAY)" end -- finaly show message what happened .bsf.dialog~messageBox(output, "Closing Document...", "information") ::requires UNO.CLS
Initial version