summaryrefslogtreecommitdiff
path: root/odk/examples/DevelopersGuide/OfficeDev/DesktopEnvironment/FunctionHelper.java
diff options
context:
space:
mode:
Diffstat (limited to 'odk/examples/DevelopersGuide/OfficeDev/DesktopEnvironment/FunctionHelper.java')
-rw-r--r--odk/examples/DevelopersGuide/OfficeDev/DesktopEnvironment/FunctionHelper.java1060
1 files changed, 0 insertions, 1060 deletions
diff --git a/odk/examples/DevelopersGuide/OfficeDev/DesktopEnvironment/FunctionHelper.java b/odk/examples/DevelopersGuide/OfficeDev/DesktopEnvironment/FunctionHelper.java
deleted file mode 100644
index 29b11256..00000000
--- a/odk/examples/DevelopersGuide/OfficeDev/DesktopEnvironment/FunctionHelper.java
+++ /dev/null
@@ -1,1060 +0,0 @@
-/*************************************************************************
- *
- * The Contents of this file are made available subject to the terms of
- * the BSD license.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of Sun Microsystems, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
- * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
- * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *************************************************************************/
-
-// __________ Imports __________
-
-import com.sun.star.uno.UnoRuntime;
-import com.sun.star.uno.AnyConverter;
-
-import java.lang.*;
-import java.awt.*;
-import javax.swing.*;
-import java.io.*;
-import java.net.*;
-
-// __________ Implementation __________
-
-/**
- * Is a collection of basic features.
- * This helper shows different functionality of framework api
- * in an example manner. You can use the follow ones:
- * (1) parse URL's
- * (2) create frames (inside/outside a java application)
- * (3) dispatches (with[out] notifications)
- * (4) loading/saving documents
- * (5) convert documents to HTML (if possible)
- * (6) close documents (and her frames) correctly
- *
- * There exist some other helper functionality too, which
- * doesn't use or demonstrate the office api:
- * (a) getting file names by using a file chosser
- *
- * @author Andreas Schlüns
- * @created 28.02.2002 15:31
- */
-public class FunctionHelper
-{
- // ____________________
-
- /**
- * This convert an URL (formated as a string) to a struct com.sun.star.util.URL.
- * It use a special service to do that: the URLTransformer.
- * Because some API calls need it and it's not allowed to set "Complete"
- * part of the util struct only. The URL must be parsed.
- *
- * @param sURL
- * URL for parsing in string notation
- *
- * @return [com.sun.star.util.URL]
- * URL in UNO struct notation
- */
- public static com.sun.star.util.URL parseURL(String sURL)
- {
- com.sun.star.util.URL aURL = null;
-
- if (sURL==null || sURL.equals(""))
- {
- System.out.println("wrong using of URL parser");
- return null;
- }
-
- try
- {
- com.sun.star.uno.XComponentContext xOfficeCtx =
- OfficeConnect.getOfficeContext();
-
- // Create special service for parsing of given URL.
- com.sun.star.util.XURLTransformer xParser =
- (com.sun.star.util.XURLTransformer)UnoRuntime.queryInterface(
- com.sun.star.util.XURLTransformer.class,
- xOfficeCtx.getServiceManager().createInstanceWithContext(
- "com.sun.star.util.URLTransformer", xOfficeCtx));
-
- // Because it's an in/out parameter we must use an array of URL objects.
- com.sun.star.util.URL[] aParseURL = new com.sun.star.util.URL[1];
- aParseURL[0] = new com.sun.star.util.URL();
- aParseURL[0].Complete = sURL;
-
- // Parse the URL
- xParser.parseStrict(aParseURL);
-
- aURL = aParseURL[0];
- }
- catch(com.sun.star.uno.RuntimeException exRuntime)
- {
- // Any UNO method of this scope can throw this exception.
- // Reset the return value only.
- aURL = null;
- }
- catch(com.sun.star.uno.Exception exUno)
- {
- // "createInstance()" method of used service manager can throw it.
- // Then it wasn't possible to get the URL transformer.
- // Return default instead of realy parsed URL.
- aURL = null;
- }
-
- return aURL;
- }
-
- // ____________________
-
- /**
- * create a new empty target frame
- * Attention: Currently we must use special service com.sun.star.frame.Task instead of Frame.
- * Because desktop environment accept this special frame type only as direct children.
- * Note - This service will be deprecated and must be replaces by com.sun.star.frame.Frame in
- * further versions. To feature prove we use both service names. If for new versions
- * the deprecated one not exist we get an empty frame, we can try to use the new service.
- *
- * @param xSMGR
- * we nee the remote service manager to create this task/frame service
- *
- * @return [com.sun.star.frame.XFrame]
- * the new created frame reference in case of success or null otherwhise
- */
- private static com.sun.star.frame.XFrame impl_createEmptyFrame(
- com.sun.star.uno.XComponentContext xCtx )
- {
- com.sun.star.frame.XFrame xFrame = null;
-
- try{
- xFrame = (com.sun.star.frame.XFrame)UnoRuntime.queryInterface(
- com.sun.star.frame.XFrame.class,
- xCtx.getServiceManager().createInstanceWithContext(
- "com.sun.star.frame.Task", xCtx));
- } catch(com.sun.star.uno.Exception ex1) {}
-
- if (xFrame==null)
- {
- try{
- xFrame = (com.sun.star.frame.XFrame)UnoRuntime.queryInterface(
- com.sun.star.frame.XFrame.class,
- xCtx.getServiceManager().createInstanceWithContext(
- "com.sun.star.frame.Frame", xCtx));
- } catch(com.sun.star.uno.Exception ex2) {}
- }
-
- return xFrame;
- }
-
- // ____________________
-
- /**
- * create a new window which can be used as container window of an office frame
- * We know two modes for creation:
- * - the office window will be a child of one of our java windows
- * - the office will be a normal system window outside this java application
- * This behaviour will be regulated by the second parameter of this operation.
- * If a parentview is given the first mode will be activated - otherwhise
- * the second one.
- *
- * Note: First mode (creation of a child window) can be reached by two different
- * ways.
- * - pack the required window handle of our java window inside an UNO object
- * to transport it to the remote office toolkit and get a child office
- * window.
- * This is the old way. It's better to use the second one - but to be
- * future prove this old one should be tried too.
- * - it's possible to pass the native window handle directly to the toolkit.
- * A special interface method was enabled to accept that.
- *
- * The right way to create an office window should be then:
- * - try to use second creation mode (directly using of the window handle)
- * - if it failed ... use the old way by packing the handle inside an object
- *
- * @param xSMGR
- * we need a service manager to be able to create remote office
- * services
- *
- * @param aParentView
- * the java window as parent for the office window if an inplace office
- * is required. If it is set to null the created office window will be
- * a normal system window outside of our java application.
- *
- * @return [com.sun.star.awt.XWindow]
- * The new created office window which can be used to set it as
- * a ContainerWindow on an empty office frame.
- */
- private static com.sun.star.awt.XWindow impl_createWindow(
- com.sun.star.uno.XComponentContext xCtx, NativeView aParentView )
- {
- com.sun.star.awt.XWindow xWindow = null;
- com.sun.star.awt.XWindowPeer xPeer = null;
- com.sun.star.awt.XToolkit xToolkit = null;
-
- // get access to toolkit of remote office to create the container window of
- // new target frame
- try{
- xToolkit = (com.sun.star.awt.XToolkit)UnoRuntime.queryInterface(
- com.sun.star.awt.XToolkit.class,
- xCtx.getServiceManager().createInstanceWithContext(
- "com.sun.star.awt.Toolkit", xCtx));
- }
- catch(com.sun.star.uno.Exception ex)
- {
- return null;
- }
-
- // mode 1) create an external system window
- if (aParentView==null)
- {
- // Describe the properties of the container window.
- com.sun.star.awt.WindowDescriptor aDescriptor =
- new com.sun.star.awt.WindowDescriptor();
- aDescriptor.Type = com.sun.star.awt.WindowClass.TOP;
- aDescriptor.WindowServiceName = "window";
- aDescriptor.ParentIndex = -1;
- aDescriptor.Parent = null;
- aDescriptor.Bounds = new com.sun.star.awt.Rectangle(0,0,0,0);
- aDescriptor.WindowAttributes = com.sun.star.awt.WindowAttribute.BORDER |
- com.sun.star.awt.WindowAttribute.MOVEABLE |
- com.sun.star.awt.WindowAttribute.SIZEABLE |
- com.sun.star.awt.WindowAttribute.CLOSEABLE;
-
- try{
- xPeer = xToolkit.createWindow( aDescriptor );
- } catch(com.sun.star.lang.IllegalArgumentException exIllegal) {}
- }
- // mode 2) create an internal office window as child of our given java
- // parent window
- else
- {
- // try new version of creation first: directly using of the window
- // handle. The old implementation of the corresponding toolkit method
- // requires a process ID. If this id isn't the right one a null object
- // is returned. But normaly nobody outside the office knows this id.
- // New version of this method ignore the id parameter and creation will
- // work.
- // Note: You must be shure if your window handle can be realy used by
- // the remote office. Means if this java client and the remote office
- // use the same display!
- com.sun.star.awt.XSystemChildFactory xChildFactory =
- (com.sun.star.awt.XSystemChildFactory)UnoRuntime.queryInterface(
- com.sun.star.awt.XSystemChildFactory.class, xToolkit);
-
- try
- {
- Integer nHandle = aParentView.getHWND();
- short nSystem = (short)aParentView.getNativeWindowSystemType();
- byte[] lProcID = new byte[0];
-
- xPeer = xChildFactory.createSystemChild((Object)nHandle,
- lProcID, nSystem);
-
- if (xPeer==null)
- {
- // mode 3) OK - new version doesn't work. It requires the
- // process id which we doesn't have.
- // So we must use the old way to get the right window peer.
- // Pack the handle inside a wrapper object.
- JavaWindowPeerFake aWrapper = new
- JavaWindowPeerFake(aParentView);
-
- com.sun.star.awt.XWindowPeer xParentPeer =
- (com.sun.star.awt.XWindowPeer)UnoRuntime.queryInterface(
- com.sun.star.awt.XWindowPeer.class, aWrapper);
-
- com.sun.star.awt.WindowDescriptor aDescriptor =
- new com.sun.star.awt.WindowDescriptor();
- aDescriptor.Type = com.sun.star.awt.WindowClass.TOP;
- aDescriptor.WindowServiceName = "workwindow";
- aDescriptor.ParentIndex = 1;
- aDescriptor.Parent = xParentPeer;
- aDescriptor.Bounds = new com.sun.star.awt.Rectangle(0,0,0,0);
- if (nSystem == com.sun.star.lang.SystemDependent.SYSTEM_WIN32)
- aDescriptor.WindowAttributes =
- com.sun.star.awt.WindowAttribute.SHOW;
- else
- aDescriptor.WindowAttributes =
- com.sun.star.awt.WindowAttribute.SYSTEMDEPENDENT;
-
- try{
- xPeer = xToolkit.createWindow( aDescriptor );
- } catch(com.sun.star.lang.IllegalArgumentException exIllegal) {}
- }
- }
- catch(java.lang.RuntimeException exJRun)
- {
- // This exception is thrown by the native JNI code if it try to get
- // the systemw window handle. A possible reason can be an invisible
- // java window. In this case it should be enough to set return
- // values to null. All other ressources (which was created before)
- // will be freed automaticly if scope wil be leaved.
- System.out.println("May be the NativeView object wasn't realy visible at calling time of getNativeWindow()?");
- xPeer = null;
- xWindow = null;
- }
- }
-
- // It doesn't matter which way was used to get the window peer.
- // Cast it to the right return interface and return it.
- xWindow = (com.sun.star.awt.XWindow)UnoRuntime.queryInterface(
- com.sun.star.awt.XWindow.class,
- xPeer);
-
- return xWindow;
- }
-
- // ____________________
-
- /**
- * This method create a new empty child frame on desktop instance of remote office.
- * It use a special JNI functionality to pass the office XWindow over a java window.
- * This java window can be inserted into another java window container for complex layouting.
- * If this parent java window isn't used, a top level system window will be created.
- * The the resulting office frame isn't plugged into this java application.
- *
- * @param sName
- * name to set it on the new created frame
- *
- * @param aParentView
- * java window which should be used as parent window of new created office frame window
- * May be set to null.
- *
- * @return [com.sun.star.frame.XFrame]
- * reference to the new created frame for success or null if it failed
- */
- public static com.sun.star.frame.XFrame createViewFrame(String sName, NativeView aParentView)
- {
- com.sun.star.frame.XFrame xFrame = null;
-
- try
- {
- com.sun.star.uno.XComponentContext xCtx =
- OfficeConnect.getOfficeContext();
-
- // create an empty office frame first
- xFrame = impl_createEmptyFrame(xCtx);
-
- // create an office window then
- // Depending from the given parameter aParentView it will be a child or a top level
- // system window. (see impl method for further informations)
- // But before we call this helper - prepare the possible parent window: show it.
- // JNI calls to get system window handle of java window can't work without that!
- if (aParentView!=null)
- aParentView.setVisible(true);
- com.sun.star.awt.XWindow xWindow = impl_createWindow(xCtx, aParentView);
-
- // pass the window the frame as his new container window.
- // It's neccessary to do it first - before you call anything else there.
- // Otherwhise the frame throws some exceptions for "uninitialized state".
- xFrame.initialize( xWindow );
-
- // Insert the new frame in desktop hierarchy.
- // Use XFrames interface to do so. It provides access to the child frame container of that instance.
- com.sun.star.frame.XFramesSupplier xTreeRoot = (com.sun.star.frame.XFramesSupplier)UnoRuntime.queryInterface(
- com.sun.star.frame.XFramesSupplier.class,
- xCtx.getServiceManager().createInstanceWithContext(
- "com.sun.star.frame.Desktop", xCtx));
- com.sun.star.frame.XFrames xChildContainer = xTreeRoot.getFrames();
- xChildContainer.append(xFrame);
-
- // Make some further initializations on frame and window.
- xWindow.setVisible(true);
- xFrame.setName(sName);
- }
- catch(com.sun.star.uno.RuntimeException exRuntime)
- {
- // Any UNO method of this scope can throw this exception.
- // So the frame can be already created and he must be freed
- // correctly. May be he was inserted into the desktop tree too ...
- if(xFrame!=null)
- {
- // Try to dispose the frame. He should deregister himself at the desktop object
- // and free all internal used ressources (e.g. the container window) automaticly.
- // It's possible to do that here - because frame has no component inside yet.
- // So nobody can disagree with that.
- // After the dispose() call forget all references to this frame and let him die.
- // If a new exception will occure ... no generell solution exist then.
- // Nobody can guarantee if next call will work or not.
- com.sun.star.lang.XComponent xComponent = (com.sun.star.lang.XComponent)UnoRuntime.queryInterface(
- com.sun.star.lang.XComponent.class,
- xFrame);
- xComponent.dispose();
- xComponent = null;
- xFrame = null;
- }
- }
- catch(com.sun.star.uno.Exception exUno)
- {
- // "createInstance()" method of used service manager can throw it.
- // If it occurred during creation of desktop service the frame already was created.
- // Free it by decresing his refcount. Changes on the desktop tree couldn't exist.
- // Without the desktop service that wasn't possible. So no further rollbacks must follow.
- if(xFrame!=null)
- {
- com.sun.star.lang.XComponent xComponent = (com.sun.star.lang.XComponent)UnoRuntime.queryInterface(
- com.sun.star.lang.XComponent.class,
- xFrame);
- xComponent.dispose();
- xComponent = null;
- xFrame = null;
- }
- }
-
- return xFrame;
- }
-
- // ____________________
-
- /**
- * Dispatch an URL to given frame.
- * Caller can register himself for following status events for dispatched
- * URL too. But nobody guarantee that such notifications will occure.
- * (see dispatchWithNotification() if you interest on that)
- * The returned dispatch object should be hold alive by caller
- * till he deosn't need it any longer. Otherwise the dispatcher can(!)
- * die by decreasing his refcount.
- *
- * @param xFrame frame wich should be the target of this dispatch
- * @param aURL full parsed and converted office URL for dispatch
- * @param lProperties optional arguments for dispatch
- * @param xListener optional listener which is registered automaticly for status events
- * (Note: Deregistration is part of this listener himself!)
- *
- * @return [XDispatch] It's the used dispatch object and can be used for deregistration of an optional listener.
- * Otherwhise caller can ignore it.
- */
- public static com.sun.star.frame.XDispatch execute(com.sun.star.frame.XFrame xFrame ,
- com.sun.star.util.URL aURL ,
- com.sun.star.beans.PropertyValue[] lProperties,
- com.sun.star.frame.XStatusListener xListener )
- {
- com.sun.star.frame.XDispatch xDispatcher = null;
-
- try
- {
- // Query the frame for right interface which provides access to all available dispatch objects.
- com.sun.star.frame.XDispatchProvider xProvider = (com.sun.star.frame.XDispatchProvider)UnoRuntime.queryInterface(
- com.sun.star.frame.XDispatchProvider.class,
- xFrame);
-
- // Ask himn for right dispatch object for given URL.
- // Force given frame as target for following dispatch by using "".
- // It means the same like "_self".
- xDispatcher = xProvider.queryDispatch(aURL,"",0);
-
- // Dispatch the URL into the frame.
- if(xDispatcher!=null)
- {
- if(xListener!=null)
- xDispatcher.addStatusListener(xListener,aURL);
-
- xDispatcher.dispatch(aURL,lProperties);
- }
- }
- catch(com.sun.star.uno.RuntimeException exUno)
- {
- // Any UNO method of this scope can throw this exception.
- // But there will be nothing to do then - because
- // we haven't changed anything inside the remote objects
- // except method "addStatusListener().
- // But in this case the source of this exception has to
- // rollback all his operations. There is no chance to
- // make anything right then.
- // Reset the return value to a default - that's it.
- exUno.printStackTrace();
- xDispatcher = null;
- }
-
- return xDispatcher;
- }
-
- // ____________________
-
- /**
- * Dispatch an URL to given frame.
- * Caller can register himself for following result events for dispatched
- * URL too. Notifications are guaranteed (instead of dispatch())
- * Returning of the dispatch object isn't neccessary.
- * Nobody must hold it alive longer the dispatch needs.
- *
- * @param xFrame frame wich should be the target of this dispatch
- * @param aURL full parsed and converted office URL for dispatch
- * @param lProperties optional arguments for dispatch
- * @param xListener optional listener which is registered automaticly for status events
- * (Note: Deregistration is not supported. Dispatcher does it automaticly.)
- */
- public static void executeWithNotification(com.sun.star.frame.XFrame xFrame ,
- com.sun.star.util.URL aURL ,
- com.sun.star.beans.PropertyValue[] lProperties,
- com.sun.star.frame.XDispatchResultListener xListener )
- {
- try
- {
- // Query the frame for right interface which provides access to all available dispatch objects.
- com.sun.star.frame.XDispatchProvider xProvider = (com.sun.star.frame.XDispatchProvider)UnoRuntime.queryInterface(
- com.sun.star.frame.XDispatchProvider.class,
- xFrame);
-
- // Ask himn for right dispatch object for given URL.
- // Force THIS frame as target for following dispatch.
- // Attention: The interface XNotifyingDispatch is an optional one!
- com.sun.star.frame.XDispatch xDispatcher = xProvider.queryDispatch(aURL,"",0);
- com.sun.star.frame.XNotifyingDispatch xNotifyingDispatcher = (com.sun.star.frame.XNotifyingDispatch)UnoRuntime.queryInterface(
- com.sun.star.frame.XNotifyingDispatch.class,
- xDispatcher);
-
- // Dispatch the URL.
- if(xNotifyingDispatcher!=null)
- xNotifyingDispatcher.dispatchWithNotification(aURL,lProperties,xListener);
- }
- catch(com.sun.star.uno.RuntimeException exUno)
- {
- // Any UNO method of this scope can throw this exception.
- // But there is nothing we can do then.
- exUno.printStackTrace();
- }
- }
-
- // ____________________
-
- /**
- * Load document specified by an URL into given frame synchronously.
- * The result of this operation will be the loaded document for success
- * or null if loading failed.
- *
- * @param xFrame frame wich should be the target of this load call
- * @param sURL unparsed URL for loading
- * @param lProperties optional arguments
- *
- * @return [XComponent] the loaded document for success or null if it's failed
- */
- public static com.sun.star.lang.XComponent loadDocument(
- com.sun.star.frame.XFrame xFrame, String sURL,
- com.sun.star.beans.PropertyValue[] lProperties)
- {
- com.sun.star.lang.XComponent xDocument = null;
- String sOldName = null;
-
- try
- {
- com.sun.star.uno.XComponentContext xCtx =
- OfficeConnect.getOfficeContext();
-
- // First prepare frame for loading
- // We must adress it inside the frame tree without any complications.
- // So we set an unambigous (we hope it) name and use it later.
- // Don't forget to reset original name after that.
- sOldName = xFrame.getName();
- String sTarget = "odk_officedev_desk";
- xFrame.setName(sTarget);
-
- // Get access to the global component loader of the office
- // for synchronous loading the document.
- com.sun.star.frame.XComponentLoader xLoader =
- (com.sun.star.frame.XComponentLoader)UnoRuntime.queryInterface(
- com.sun.star.frame.XComponentLoader.class,
- xCtx.getServiceManager().createInstanceWithContext(
- "com.sun.star.frame.Desktop", xCtx));
-
- // Load the document into the target frame by using his name and
- // special search flags.
- xDocument = xLoader.loadComponentFromURL(
- sURL,
- sTarget,
- com.sun.star.frame.FrameSearchFlag.CHILDREN,
- lProperties);
-
- // dont forget to restore old frame name ...
- xFrame.setName(sOldName);
- }
- catch(com.sun.star.io.IOException exIO)
- {
- // Can be thrown by "loadComponentFromURL()" call.
- // The only thing we should do then is to reset changed frame name!
- exIO.printStackTrace();
- xDocument = null;
- if(sOldName!=null)
- xFrame.setName(sOldName);
- }
- catch(com.sun.star.lang.IllegalArgumentException exIllegal)
- {
- // Can be thrown by "loadComponentFromURL()" call.
- // The only thing we should do then is to reset changed frame name!
- exIllegal.printStackTrace();
- xDocument = null;
- if(sOldName!=null)
- xFrame.setName(sOldName);
- }
- catch(com.sun.star.uno.RuntimeException exRuntime)
- {
- // Any UNO method of this scope can throw this exception.
- // The only thing we can try(!) is to reset changed frame name.
- exRuntime.printStackTrace();
- xDocument = null;
- if(sOldName!=null)
- xFrame.setName(sOldName);
- }
- catch(com.sun.star.uno.Exception exUno)
- {
- // "createInstance()" method of used service manager can throw it.
- // The only thing we should do then is to reset changed frame name!
- exUno.printStackTrace();
- xDocument = null;
- if(sOldName!=null)
- xFrame.setName(sOldName);
- }
-
- return xDocument;
- }
-
- // ____________________
-
- /**
- * Save currently loaded document of given frame.
- *
- * @param xDocument document for saving changes
- */
- public static void saveDocument(com.sun.star.lang.XComponent xDocument)
- {
- try
- {
- // Check for supported model functionality.
- // Normaly the application documents (text, spreadsheet ...) do so
- // but some other ones (e.g. db components) doesn't do that.
- // They can't be save then.
- com.sun.star.frame.XModel xModel = (com.sun.star.frame.XModel)UnoRuntime.queryInterface(
- com.sun.star.frame.XModel.class,
- xDocument);
- if(xModel!=null)
- {
- // Check for modifications => break save process if there is nothing to do.
- com.sun.star.util.XModifiable xModified = (com.sun.star.util.XModifiable)UnoRuntime.queryInterface(
- com.sun.star.util.XModifiable.class,
- xModel);
- if(xModified.isModified()==true)
- {
- com.sun.star.frame.XStorable xStore = (com.sun.star.frame.XStorable)UnoRuntime.queryInterface(
- com.sun.star.frame.XStorable.class,
- xModel);
-
- xStore.store();
- }
- }
- }
- catch(com.sun.star.io.IOException exIO)
- {
- // Can be thrown by "store()" call.
- // But there is nothing we can do then.
- exIO.printStackTrace();
- }
- catch(com.sun.star.uno.RuntimeException exUno)
- {
- // Any UNO method of this scope can throw this exception.
- // But there is nothing we can do then.
- exUno.printStackTrace();
- }
- }
-
- // ____________________
-
- /**
- * It try to export given document in HTML format.
- * Current document will be converted to HTML and moved to new place on disk.
- * A "new" file will be created by given URL (may be overwritten
- * if it already exist). Right filter will be used automaticly if factory of
- * this document support it. If no valid filter can be found for export,
- * nothing will be done here.
- *
- * @param xDocument document which should be exported
- * @param sURL target URL for converted document
- */
- public static void saveAsHTML(com.sun.star.lang.XComponent xDocument,
- String sURL )
- {
- try
- {
- // First detect factory of this document.
- // Ask for the supported service name of this document.
- // If information is available it can be used to find out wich
- // filter exist for HTML export. Normaly this filter should be searched
- // inside the filter configuration but this little demo doesn't do so.
- // (see service com.sun.star.document.FilterFactory for further
- // informations too)
- // Well known filter names are used directly. They must exist in current
- // office installation. Otherwise this code will fail. But to prevent
- // this code against missing filters it check for existing state of it.
- com.sun.star.lang.XServiceInfo xInfo = (com.sun.star.lang.XServiceInfo)
- UnoRuntime.queryInterface(com.sun.star.lang.XServiceInfo.class,
- xDocument);
-
- if(xInfo!=null)
- {
- // Find out possible filter name.
- String sFilter = null;
- if(xInfo.supportsService("com.sun.star.text.TextDocument")==true)
- sFilter = new String("HTML (StarWriter)");
- else
- if(xInfo.supportsService("com.sun.star.text.WebDocument")==true)
- sFilter = new String("HTML");
- else
- if(xInfo.supportsService("com.sun.star.sheet.SpreadsheetDocument")==true)
- sFilter = new String("HTML (StarCalc)");
-
- // Check for existing state of this filter.
- if(sFilter!=null)
- {
- com.sun.star.uno.XComponentContext xCtx =
- OfficeConnect.getOfficeContext();
-
- com.sun.star.container.XNameAccess xFilterContainer =
- (com.sun.star.container.XNameAccess)
- UnoRuntime.queryInterface(
- com.sun.star.container.XNameAccess.class,
- xCtx.getServiceManager().createInstanceWithContext(
- "com.sun.star.document.FilterFactory", xCtx));
-
- if(xFilterContainer.hasByName(sFilter)==false)
- sFilter=null;
- }
-
- // Use this filter for export.
- if(sFilter!=null)
- {
- // Export can be forced by saving the document and using a
- // special filter name which can write needed format. Build
- // neccessary argument list now.
- // Use special flag "Overwrite" too, to prevent operation
- // against possible exceptions, if file already exist.
- com.sun.star.beans.PropertyValue[] lProperties =
- new com.sun.star.beans.PropertyValue[2];
- lProperties[0] = new com.sun.star.beans.PropertyValue();
- lProperties[0].Name = "FilterName";
- lProperties[0].Value = sFilter;
- lProperties[1] = new com.sun.star.beans.PropertyValue();
- lProperties[1].Name = "Overwrite";
- lProperties[1].Value = Boolean.TRUE;
-
- com.sun.star.frame.XStorable xStore =
- (com.sun.star.frame.XStorable)UnoRuntime.queryInterface(
- com.sun.star.frame.XStorable.class, xDocument);
-
- xStore.storeAsURL(sURL,lProperties);
- }
- }
- }
- catch(com.sun.star.io.IOException exIO)
- {
- // Can be thrown by "store()" call.
- // Do nothing then. Saving failed - that's it.
- exIO.printStackTrace();
- }
- catch(com.sun.star.uno.RuntimeException exRuntime)
- {
- // Can be thrown by any uno call.
- // Do nothing here. Saving failed - that's it.
- exRuntime.printStackTrace();
- }
- catch(com.sun.star.uno.Exception exUno)
- {
- // Can be thrown by "createInstance()" call of service manager.
- // Do nothing here. Saving failed - that's it.
- exUno.printStackTrace();
- }
- }
-
- // ____________________
-
- /**
- * Try to close the document without any saving of modifications.
- * We can try it only! Controller and/or model of this document
- * can disagree with that. But mostly they doesn't do so.
- *
- * @param xDocument document which should be clcosed
- */
- public static void closeDocument(com.sun.star.lang.XComponent xDocument)
- {
- try
- {
- // Check supported functionality of the document (model or controller).
- com.sun.star.frame.XModel xModel =
- (com.sun.star.frame.XModel)UnoRuntime.queryInterface(
- com.sun.star.frame.XModel.class, xDocument);
-
- if(xModel!=null)
- {
- // It's a full featured office document.
- // Reset the modify state of it and close it.
- // Note: Model can disgree by throwing a veto exception.
- com.sun.star.util.XModifiable xModify =
- (com.sun.star.util.XModifiable)UnoRuntime.queryInterface(
- com.sun.star.util.XModifiable.class, xModel);
-
- xModify.setModified(false);
- xDocument.dispose();
- }
- else
- {
- // It's a document which supports a controller .. or may by a pure
- // window only. If it's at least a controller - we can try to
- // suspend him. But - he can disagree with that!
- com.sun.star.frame.XController xController =
- (com.sun.star.frame.XController)UnoRuntime.queryInterface(
- com.sun.star.frame.XController.class, xDocument);
-
- if(xController!=null)
- {
- if(xController.suspend(true)==true)
- {
- // Note: Don't dispose the controller - destroy the frame
- // to make it right!
- com.sun.star.frame.XFrame xFrame = xController.getFrame();
- xFrame.dispose();
- }
- }
- }
- }
- catch(com.sun.star.beans.PropertyVetoException exVeto)
- {
- // Can be thrown by "setModified()" call on model.
- // He disagree with our request.
- // But there is nothing to do then. Following "dispose()" call wasn't
- // never called (because we catch it before). Closing failed -that's it.
- exVeto.printStackTrace();
- }
- catch(com.sun.star.lang.DisposedException exDisposed)
- {
- // If an UNO object was already disposed before - he throw this special
- // runtime exception. Of course every UNO call must be look for that -
- // but it's a question of error handling.
- // For demonstration this exception is handled here.
- exDisposed.printStackTrace();
- }
- catch(com.sun.star.uno.RuntimeException exRuntime)
- {
- // Every uno call can throw that.
- // Do nothing - closing failed - that's it.
- exRuntime.printStackTrace();
- }
- }
-
- // ____________________
-
- /**
- * Try to close the frame instead of the document.
- * It shows the possible interface to do so.
- *
- * @param xFrame
- * frame which should be clcosed
- *
- * @return <TRUE/> in case frame could be closed
- * <FALSE/> otherwise
- */
- public static boolean closeFrame(com.sun.star.frame.XFrame xFrame)
- {
- boolean bClosed = false;
-
- try
- {
- // first try the new way: use new interface XCloseable
- // It replace the deprecated XTask::close() and should be preferred ...
- // if it can be queried.
- com.sun.star.util.XCloseable xCloseable =
- (com.sun.star.util.XCloseable)UnoRuntime.queryInterface(
- com.sun.star.util.XCloseable.class, xFrame);
- if (xCloseable!=null)
- {
- // We deliver the owner ship of this frame not to the (possible)
- // source which throw a CloseVetoException. We whishto have it
- // under our own control.
- try
- {
- xCloseable.close(false);
- bClosed = true;
- }
- catch( com.sun.star.util.CloseVetoException exVeto )
- {
- bClosed = false;
- }
- }
- else
- {
- // OK: the new way isn't possible. Try the old one.
- com.sun.star.frame.XTask xTask = (com.sun.star.frame.XTask)
- UnoRuntime.queryInterface(com.sun.star.frame.XTask.class,
- xFrame);
- if (xTask!=null)
- {
- // return value doesn't interest here. Because
- // we forget this task ...
- bClosed = xTask.close();
- }
- }
- }
- catch (com.sun.star.lang.DisposedException exDisposed)
- {
- // Of course - this task can be already dead - means disposed.
- // But for us it's not important. Because we tried to close it too.
- // And "already disposed" or "closed" should be the same ...
- bClosed = true;
- }
-
- return bClosed;
- }
-
- // ____________________
-
- /**
- * Try to find an unique frame name, which isn't currently used inside
- * remote office instance. Because we create top level frames
- * only, it's enough to check the names of existing child frames on the
- * desktop only.
- *
- * @return [String]
- * should represent an unique frame name, which currently isn't
- * used inside the remote office frame tree
- * (Couldn't guaranteed for a real multithreaded environment.
- * But we try it ...)
- */
- private static final String BASEFRAMENAME = "Desk View ";
-
- public static String getUniqueFrameName()
- {
- String sName = null;
-
- com.sun.star.uno.XComponentContext xCtx = OfficeConnect.getOfficeContext();
-
- try
- {
- com.sun.star.frame.XFramesSupplier xSupplier =
- (com.sun.star.frame.XFramesSupplier)UnoRuntime.queryInterface(
- com.sun.star.frame.XFramesSupplier.class,
- xCtx.getServiceManager().createInstanceWithContext(
- "com.sun.star.frame.Desktop", xCtx));
-
- com.sun.star.container.XIndexAccess xContainer =
- (com.sun.star.container.XIndexAccess)UnoRuntime.queryInterface(
- com.sun.star.container.XIndexAccess.class,
- xSupplier.getFrames());
-
- int nCount = xContainer.getCount();
- for (int i=0; i<nCount; ++i )
- {
- com.sun.star.frame.XFrame xFrame = (com.sun.star.frame.XFrame)AnyConverter.toObject(new com.sun.star.uno.Type(com.sun.star.frame.XFrame.class), xContainer.getByIndex(i));
- sName = new String(BASEFRAMENAME+mnViewCount);
- while(sName.compareTo(xFrame.getName())==0)
- {
- ++mnViewCount;
- sName = new String(BASEFRAMENAME+mnViewCount);
- }
- }
- }
- catch(com.sun.star.uno.Exception exCreateFailed)
- {
- sName = new String(BASEFRAMENAME);
- }
-
- if (sName==null)
- {
- System.out.println("invalid name!");
- sName = new String(BASEFRAMENAME);
- }
-
- return sName;
- }
-
- // ____________________
-
- /**
- * helper to get a file URL selected by user
- * This method doesn't show any API concepts ...
- * but is neccessary rof this demo application.
- *
- * @param aParent parent window of this dialog
- * @param bOpen If it is set to true =>
- * dialog is opend in "file open" mode -
- * otherwise in "file save" mode.
- */
- public static String askUserForFileURL(Component aParent,boolean bOpen)
- {
- String sFileURL = null;
- int nDecision = JFileChooser.CANCEL_OPTION;
- JFileChooser aChooser = null;
-
- // set last visited directory on new file chosser
- // (if this information is available)
- if( maLastDir==null )
- aChooser = new JFileChooser();
- else
- aChooser = new JFileChooser(maLastDir);
-
- // decide between file open/save dialog
- if( bOpen==true )
- nDecision = aChooser.showOpenDialog(aParent);
- else
- nDecision = aChooser.showSaveDialog(aParent);
-
- // react for "OK" result only
- if(nDecision == JFileChooser.APPROVE_OPTION)
- {
- // save current directory as last visited one
- maLastDir = aChooser.getCurrentDirectory();
- // get file URL from the dialog
- try
- {
- sFileURL = aChooser.getSelectedFile().toURI().toURL().toExternalForm();
- }
- catch( MalformedURLException ex )
- {
- ex.printStackTrace();
- sFileURL = null;
- }
- // problem of java: file URL's are coded with 1 slash instead of 3 ones!
- // => correct this problem first, otherwise office can't use these URL's
- if(
- ( sFileURL !=null ) &&
- ( sFileURL.startsWith("file:/") ==true ) &&
- ( sFileURL.startsWith("file://")==false )
- )
- {
- StringBuffer sWorkBuffer = new StringBuffer(sFileURL);
- sWorkBuffer.insert(6,"//");
- sFileURL = sWorkBuffer.toString();
- }
- }
-
- return sFileURL;
- }
-
- // ____________________
-
- /**
- * @member maLastDir save the last visited directory of used file open/save dialog
- * @member mnViewCount we try to set unique names on every frame we create (that's why we must count it)
- */
- private static File maLastDir = null;
- private static int mnViewCount = 0 ;
-}