From 5588b80f74960ba3e6c2cad18532564cf558b443 Mon Sep 17 00:00:00 2001
From: "Frank Schoenheit [fs]" <frank.schoenheit@sun.com>
Date: Thu, 14 Oct 2010 16:40:31 +0200
Subject: undoapi: added tools (in test-tools.jar) for writing Java unit tests
 which operate on a live OOo

---
 test/prj/build.lst                                 |   1 +
 test/prj/d.lst                                     |   1 +
 test/source/java/org/openoffice/test/makefile.mk   |   7 +-
 .../org/openoffice/test/tools/DocumentType.java    |  60 ++++
 .../org/openoffice/test/tools/OfficeDocument.java  | 312 +++++++++++++++++++++
 .../openoffice/test/tools/OfficeDocumentView.java  | 125 +++++++++
 .../openoffice/test/tools/SpreadsheetDocument.java |  73 +++++
 .../org/openoffice/test/tools/SpreadsheetView.java |  72 +++++
 .../java/org/openoffice/test/tools/makefile.mk     |  41 +++
 9 files changed, 689 insertions(+), 3 deletions(-)
 create mode 100644 test/source/java/org/openoffice/test/tools/DocumentType.java
 create mode 100644 test/source/java/org/openoffice/test/tools/OfficeDocument.java
 create mode 100644 test/source/java/org/openoffice/test/tools/OfficeDocumentView.java
 create mode 100644 test/source/java/org/openoffice/test/tools/SpreadsheetDocument.java
 create mode 100644 test/source/java/org/openoffice/test/tools/SpreadsheetView.java
 create mode 100644 test/source/java/org/openoffice/test/tools/makefile.mk

(limited to 'test')

diff --git a/test/prj/build.lst b/test/prj/build.lst
index 5ef6353a1dc3..7adea0c0727b 100644
--- a/test/prj/build.lst
+++ b/test/prj/build.lst
@@ -2,3 +2,4 @@ te test : BOOST:boost cppu cppuhelper CPPUNIT:cppunit javaunohelper offuh ridlja
 te test\inc nmake - all inc NULL
 te test\source\cpp nmake - all source_cpp inc NULL
 te test\source\java\org\openoffice\test nmake - all source_java NULL
+te test\source\java\org\openoffice\test\tools nmake - all source_java_tools NULL
diff --git a/test/prj/d.lst b/test/prj/d.lst
index 48f9d8edba0c..54da2062a511 100644
--- a/test/prj/d.lst
+++ b/test/prj/d.lst
@@ -11,3 +11,4 @@ mkdir: %_DEST%\inc%_EXT%\test\detail
 ..\inc\test\toabsolutefileurl.hxx %_DEST%\inc%_EXT%\test\toabsolutefileurl.hxx
 ..\inc\test\uniquepipename.hxx %_DEST%\inc%_EXT%\test\uniquepipename.hxx
 ..\%__SRC%\class\test.jar %_DEST%\bin%_EXT%\test.jar
+..\%__SRC%\class\test-tools.jar %_DEST%\bin%_EXT%\test-tools.jar
diff --git a/test/source/java/org/openoffice/test/makefile.mk b/test/source/java/org/openoffice/test/makefile.mk
index 9314ea6a1506..76e2ffe0bcda 100644
--- a/test/source/java/org/openoffice/test/makefile.mk
+++ b/test/source/java/org/openoffice/test/makefile.mk
@@ -39,9 +39,10 @@ JAVAFILES = \
 JARFILES = juh.jar ridl.jar unoil.jar
 EXTRAJARFILES = $(OOO_JUNIT_JAR)
 
-JARTARGET = test.jar
-JARCLASSDIRS = $(PACKAGE)
-JARCLASSPATH = $(JARFILES)
+JARTARGET        = test.jar
+JARCLASSDIRS     = $(PACKAGE)
+JARCLASSEXCLUDES = $(PACKAGE)/tools/* FOOBAR
+JARCLASSPATH     = $(JARFILES)
  # expect $(OOO_JUNIT_JAR) to be on CLASSPATH wherever test.jar is used (also,
  # on Windows, $(OOO_JUNIT_JAR) could be an absolute pathname with drive letter
  # like X:/path and some JVMs would refuse to load test.jar if its MANIFEST.MF
diff --git a/test/source/java/org/openoffice/test/tools/DocumentType.java b/test/source/java/org/openoffice/test/tools/DocumentType.java
new file mode 100644
index 000000000000..cccf803cec81
--- /dev/null
+++ b/test/source/java/org/openoffice/test/tools/DocumentType.java
@@ -0,0 +1,60 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org.  If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+package org.openoffice.test.tools;
+
+/** a helper "enumeration class" for classifying a document type
+*/
+public class DocumentType extends com.sun.star.uno.Enum
+{
+    private DocumentType( int value )
+    {
+        super( value );
+    }
+
+    public static DocumentType getDefault()
+    {
+        return WRITER;
+    }
+
+    public static final DocumentType WRITER = new DocumentType(0);
+    public static final DocumentType CALC = new DocumentType(1);
+    public static final DocumentType DRAWING = new DocumentType(2);
+    public static final DocumentType XMLFORM = new DocumentType(3);
+    public static final DocumentType UNKNOWN = new DocumentType(-1);
+
+    public static DocumentType fromInt(int value)
+    {
+        switch(value)
+        {
+            case 0: return WRITER;
+            case 1: return CALC;
+            case 2: return DRAWING;
+            case 3: return XMLFORM;
+            default: return UNKNOWN;
+        }
+    }
+};
diff --git a/test/source/java/org/openoffice/test/tools/OfficeDocument.java b/test/source/java/org/openoffice/test/tools/OfficeDocument.java
new file mode 100644
index 000000000000..96db51138d67
--- /dev/null
+++ b/test/source/java/org/openoffice/test/tools/OfficeDocument.java
@@ -0,0 +1,312 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org.  If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+package org.openoffice.test.tools;
+
+import com.sun.star.beans.PropertyState;
+import com.sun.star.beans.PropertyValue;
+import com.sun.star.document.MacroExecMode;
+import com.sun.star.drawing.XDrawPage;
+import com.sun.star.drawing.XDrawPageSupplier;
+import com.sun.star.drawing.XDrawPages;
+import com.sun.star.drawing.XDrawPagesSupplier;
+import com.sun.star.frame.XComponentLoader;
+import com.sun.star.frame.XController;
+import com.sun.star.frame.XFrame;
+import com.sun.star.frame.XModel;
+import com.sun.star.lang.XComponent;
+import com.sun.star.lang.XMultiServiceFactory;
+import com.sun.star.lang.XServiceInfo;
+import com.sun.star.uno.UnoRuntime;
+import com.sun.star.uno.XInterface;
+import com.sun.star.util.CloseVetoException;
+import com.sun.star.util.XCloseable;
+import com.sun.star.util.XModifiable;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**************************************************************************/
+
+/**************************************************************************/
+/** provides a small wrapper around a document
+*/
+public class OfficeDocument
+{
+    /* ================================================================== */
+    /* ------------------------------------------------------------------ */
+    public OfficeDocument( XMultiServiceFactory orb, XComponent document )
+    {
+        m_orb = orb;
+        m_documentComponent = document;
+    }
+
+    /* ------------------------------------------------------------------ */
+    protected static XComponent implLoadAsComponent( XMultiServiceFactory orb, String documentOrFactoryURL ) throws com.sun.star.uno.Exception
+    {
+        return implLoadAsComponent( orb, documentOrFactoryURL, new PropertyValue[0] );
+    }
+
+    /* ------------------------------------------------------------------ */
+    protected static XComponent implLoadAsComponent( XMultiServiceFactory orb, String documentOrFactoryURL, final PropertyValue[] i_args ) throws com.sun.star.uno.Exception
+    {
+        XComponentLoader aLoader = UnoRuntime.queryInterface( XComponentLoader.class,
+            orb.createInstance( "com.sun.star.frame.Desktop" ) );
+
+        XComponent document = UnoRuntime.queryInterface( XComponent.class,
+            aLoader.loadComponentFromURL( documentOrFactoryURL, "_blank", 0, i_args )
+        );
+        return document;
+    }
+
+    /* ------------------------------------------------------------------ */
+    private static OfficeDocument implLoadDocument( XMultiServiceFactory orb, String documentOrFactoryURL ) throws com.sun.star.uno.Exception
+    {
+        return implLoadDocument( orb, documentOrFactoryURL, new PropertyValue[0] );
+    }
+
+    /* ------------------------------------------------------------------ */
+    private static OfficeDocument implLoadDocument( XMultiServiceFactory orb, String documentOrFactoryURL, final PropertyValue[] i_args ) throws com.sun.star.uno.Exception
+    {
+        XComponent document = implLoadAsComponent( orb, documentOrFactoryURL, i_args );
+
+        XServiceInfo xSI = UnoRuntime.queryInterface( XServiceInfo.class, document );
+        if ( xSI.supportsService( "com.sun.star.sheet.SpreadsheetDocument" ) )
+            return new SpreadsheetDocument( orb, document );
+        return new OfficeDocument( orb, document );
+    }
+
+    /* ------------------------------------------------------------------ */
+    public static OfficeDocument loadDocument( XMultiServiceFactory orb, String documentURL ) throws com.sun.star.uno.Exception
+    {
+        return implLoadDocument( orb, documentURL );
+    }
+
+    /* ------------------------------------------------------------------ */
+    public static OfficeDocument blankTextDocument( XMultiServiceFactory orb ) throws com.sun.star.uno.Exception
+    {
+        return blankDocument( orb, DocumentType.WRITER );
+    }
+
+    /* ------------------------------------------------------------------ */
+    public static OfficeDocument blankXMLForm( XMultiServiceFactory orb ) throws com.sun.star.uno.Exception
+    {
+        return blankDocument( orb, DocumentType.XMLFORM );
+    }
+
+    /* ------------------------------------------------------------------ */
+    public static OfficeDocument blankDocument( XMultiServiceFactory orb, DocumentType eType ) throws com.sun.star.uno.Exception
+    {
+        final PropertyValue[] args = new PropertyValue[] {
+            new PropertyValue( "MacroExecutionMode", -1, MacroExecMode.ALWAYS_EXECUTE, PropertyState.DIRECT_VALUE )
+        };
+        return implLoadDocument( orb, getDocumentFactoryURL( eType ), args );
+    }
+
+    /* ------------------------------------------------------------------ */
+    public boolean close()
+    {
+        try
+        {
+            XCloseable closeDoc = UnoRuntime.queryInterface( XCloseable.class, m_documentComponent );
+            closeDoc.close( true );
+            return true;
+        }
+        catch ( CloseVetoException e )
+        {
+            Logger.getLogger( OfficeDocument.class.getName() ).log( Level.SEVERE, "closing the document was vetoed", e );
+        }
+        return false;
+    }
+
+    /* ================================================================== */
+    /* ------------------------------------------------------------------ */
+    public XComponent getDocument( )
+    {
+        return m_documentComponent;
+    }
+
+    /* ------------------------------------------------------------------ */
+    public boolean isModified()
+    {
+        XModifiable modify = (XModifiable)query( XModifiable.class );
+        return modify.isModified();
+    }
+
+    /* ------------------------------------------------------------------ */
+    public Object query( Class aInterfaceClass )
+    {
+        return UnoRuntime.queryInterface( aInterfaceClass, m_documentComponent );
+    }
+
+    /* ------------------------------------------------------------------ */
+    public XMultiServiceFactory getOrb( )
+    {
+        return m_orb;
+    }
+
+    /* ------------------------------------------------------------------ */
+    /** retrieves the current view of the document
+        @return
+            the view component, queried for the interface described by aInterfaceClass
+    */
+    public OfficeDocumentView getCurrentView( )
+    {
+        // get the model interface for the document
+        XModel xDocModel = UnoRuntime.queryInterface( XModel.class, m_documentComponent );
+        // get the current controller for the document - as a controller is tied to a view,
+        // this gives us the currently active view for the document.
+        XController xController = xDocModel.getCurrentController();
+
+        if ( classify() == DocumentType.CALC )
+            return new SpreadsheetView( m_orb, this, xController );
+
+        return new OfficeDocumentView( m_orb, this, xController );
+    }
+
+    /* ------------------------------------------------------------------ */
+    /** reloads the document
+     *
+     *  The reload is done by dispatching the respective URL at a frame of the document.
+     *  As a consequence, if you have references to a view of the document, or any interface
+     *  of the document, they will become invalid.
+     *  The Model instance itself, at which you called reload, will still be valid, it will
+     *  automatically update its internal state after the reload.
+     *
+     *  Another consequence is that if the document does not have a view at all, it cannot
+     *  be reloaded.
+     */
+    public void reload() throws Exception
+    {
+        OfficeDocumentView view = getCurrentView();
+        XFrame frame = view.getController().getFrame();
+        XModel oldModel = frame.getController().getModel();
+
+        getCurrentView().dispatch( ".uno:Reload" );
+
+        m_documentComponent = UnoRuntime.queryInterface( XComponent.class, frame.getController().getModel() );
+
+        XModel newModel = getCurrentView().getController().getModel();
+        if ( UnoRuntime.areSame( oldModel, newModel ) )
+            throw new java.lang.IllegalStateException( "reload failed" );
+    }
+
+    /* ------------------------------------------------------------------ */
+    /** returns a URL which can be used to create a document of a certain type
+    */
+    public static String getDocumentFactoryURL( DocumentType eType )
+    {
+        if ( eType == DocumentType.WRITER )
+            return "private:factory/swriter";
+        if ( eType == DocumentType.CALC )
+            return "private:factory/scalc";
+        if ( eType == DocumentType.DRAWING )
+            return "private:factory/sdraw";
+        if ( eType == DocumentType.XMLFORM )
+            return "private:factory/swriter?slot=21053";
+        return "private:factory/swriter";
+    }
+
+    /* ------------------------------------------------------------------ */
+    /** classifies a document
+    */
+    public DocumentType classify( )
+    {
+        XServiceInfo xSI = UnoRuntime.queryInterface( XServiceInfo.class, m_documentComponent );
+
+        if ( xSI.supportsService( "com.sun.star.text.TextDocument" ) )
+            return DocumentType.WRITER;
+        else if ( xSI.supportsService( "com.sun.star.sheet.SpreadsheetDocument" ) )
+            return DocumentType.CALC;
+        else if ( xSI.supportsService( "com.sun.star.drawing.DrawingDocument" ) )
+            return DocumentType.DRAWING;
+
+        return DocumentType.UNKNOWN;
+    }
+
+    /* ------------------------------------------------------------------ */
+    /** retrieves a com.sun.star.drawing.DrawPage of the document, denoted by index
+     *  @param index
+     *      the index of the draw page
+     *  @throws
+     *      com.sun.star.lang.IndexOutOfBoundsException
+     *      com.sun.star.lang.WrappedTargetException
+     */
+    protected XDrawPage getDrawPage( int index ) throws com.sun.star.lang.IndexOutOfBoundsException, com.sun.star.lang.WrappedTargetException
+    {
+        XDrawPagesSupplier xSuppPages = UnoRuntime.queryInterface( XDrawPagesSupplier.class, getDocument() );
+        XDrawPages xPages = xSuppPages.getDrawPages();
+
+        return UnoRuntime.queryInterface( XDrawPage.class, xPages.getByIndex( index ) );
+    }
+
+    /* ------------------------------------------------------------------ */
+    /** retrieves the <type scope="com.sun.star.drawing">DrawPage</type> of the document
+    */
+    protected XDrawPage getMainDrawPage( ) throws com.sun.star.uno.Exception
+    {
+        XDrawPage xReturn;
+
+        // in case of a Writer document, this is rather easy: simply ask the XDrawPageSupplier
+        XDrawPageSupplier xSuppPage = UnoRuntime.queryInterface( XDrawPageSupplier.class, getDocument() );
+        if ( null != xSuppPage )
+            xReturn = xSuppPage.getDrawPage();
+        else
+        {   // the model itself is no draw page supplier - okay, it may be a Writer or Calc document
+            // (or any other multi-page document)
+            XDrawPagesSupplier xSuppPages = UnoRuntime.queryInterface( XDrawPagesSupplier.class, getDocument() );
+            XDrawPages xPages = xSuppPages.getDrawPages();
+
+            xReturn = UnoRuntime.queryInterface( XDrawPage.class, xPages.getByIndex( 0 ) );
+
+            // Note that this is no really error-proof code: If the document model does not support the
+            // XDrawPagesSupplier interface, or if the pages collection returned is empty, this will break.
+        }
+
+        return xReturn;
+    }
+
+    /* ------------------------------------------------------------------ */
+    /** creates a component at the service factory provided by the document
+    */
+    public XInterface createInstance( String serviceSpecifier ) throws com.sun.star.uno.Exception
+    {
+        XMultiServiceFactory xORB = UnoRuntime.queryInterface( XMultiServiceFactory.class, m_documentComponent );
+        return (XInterface)xORB.createInstance( serviceSpecifier );
+    }
+
+    /* ------------------------------------------------------------------ */
+    /** creates a component at the service factory provided by the document
+    */
+    public XInterface createInstanceWithArguments( String serviceSpecifier, Object[] arguments ) throws com.sun.star.uno.Exception
+    {
+        XMultiServiceFactory xORB = UnoRuntime.queryInterface( XMultiServiceFactory.class, m_documentComponent );
+        return (XInterface) xORB.createInstanceWithArguments( serviceSpecifier, arguments );
+    }
+
+    private XMultiServiceFactory    m_orb;
+    private XComponent              m_documentComponent;
+};
+
diff --git a/test/source/java/org/openoffice/test/tools/OfficeDocumentView.java b/test/source/java/org/openoffice/test/tools/OfficeDocumentView.java
new file mode 100644
index 000000000000..beba6b3b3a38
--- /dev/null
+++ b/test/source/java/org/openoffice/test/tools/OfficeDocumentView.java
@@ -0,0 +1,125 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org.  If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+package org.openoffice.test.tools;
+
+/**************************************************************************/
+
+import com.sun.star.beans.PropertyValue;
+import com.sun.star.frame.XController;
+import com.sun.star.frame.XDispatch;
+import com.sun.star.frame.XDispatchProvider;
+import com.sun.star.lang.XMultiServiceFactory;
+import com.sun.star.uno.UnoRuntime;
+import com.sun.star.util.URL;
+import com.sun.star.util.XURLTransformer;
+
+/**************************************************************************/
+/** provides a small wrapper around a document view
+*/
+public class OfficeDocumentView
+{
+    private     XMultiServiceFactory    m_orb;
+    private     XController             m_controller;
+    private     OfficeDocument          m_document;
+
+    /* ------------------------------------------------------------------ */
+    final protected XController getController()
+    {
+        return m_controller;
+    }
+
+    /* ------------------------------------------------------------------ */
+    final protected OfficeDocument getDocument()
+    {
+        return m_document;
+    }
+
+    /* ------------------------------------------------------------------ */
+    public OfficeDocumentView( XMultiServiceFactory orb, OfficeDocument document, XController controller )
+    {
+        m_orb = orb;
+        m_document = document;
+        m_controller = controller;
+    }
+
+    /* ------------------------------------------------------------------ */
+    /** retrieves a dispatcher for the given URL, obtained at the current view of the document
+        @param aURL
+            a one-element array. The first element must contain a valid
+            <member scope="com.sun.star.util">URL::Complete</member> value. Upon return, the URL is correctly
+            parsed.
+        @return
+            the dispatcher for the URL in question
+    */
+    public XDispatch getDispatcher( URL[] aURL ) throws java.lang.Exception
+    {
+        XDispatch xReturn = null;
+
+        // go get the dispatch provider of it's frame
+        XDispatchProvider xProvider = UnoRuntime.queryInterface( XDispatchProvider.class, m_controller.getFrame() );
+        if ( null != xProvider )
+        {
+            // need an URLTransformer
+            XURLTransformer xTransformer = UnoRuntime.queryInterface( XURLTransformer.class,
+                m_orb.createInstance( "com.sun.star.util.URLTransformer" ) );
+            xTransformer.parseStrict( aURL );
+
+            xReturn = xProvider.queryDispatch( aURL[0], new String( ), 0 );
+        }
+        return xReturn;
+    }
+
+    /* ------------------------------------------------------------------ */
+    /** retrieves a dispatcher for the given URL, obtained at the current view of the document
+    */
+    public XDispatch getDispatcher( String url ) throws java.lang.Exception
+    {
+        URL[] aURL = new URL[] { new URL() };
+        aURL[0].Complete = url;
+        return getDispatcher( aURL );
+    }
+
+    /* ------------------------------------------------------------------ */
+    /** dispatches the given URL into the view, if there's a dispatcher for it
+
+        @return
+            <TRUE/> if the URL was successfully dispatched
+    */
+    public boolean dispatch( String url ) throws java.lang.Exception
+    {
+        URL[] completeURL = new URL[] { new URL() };
+        completeURL[0].Complete = url;
+        XDispatch dispatcher = getDispatcher( completeURL );
+        if ( dispatcher == null )
+            return false;
+
+        PropertyValue[] aDummyArgs = new PropertyValue[] { };
+        dispatcher.dispatch( completeURL[0], aDummyArgs );
+        return true;
+    }
+};
+
diff --git a/test/source/java/org/openoffice/test/tools/SpreadsheetDocument.java b/test/source/java/org/openoffice/test/tools/SpreadsheetDocument.java
new file mode 100644
index 000000000000..83b4028eec32
--- /dev/null
+++ b/test/source/java/org/openoffice/test/tools/SpreadsheetDocument.java
@@ -0,0 +1,73 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org.  If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.test.tools;
+
+import com.sun.star.lang.XMultiServiceFactory;
+import com.sun.star.lang.XComponent;
+import com.sun.star.table.XCellRange;
+import com.sun.star.container.XIndexAccess;
+import com.sun.star.sheet.XSpreadsheetDocument;
+import com.sun.star.sheet.XSpreadsheets;
+import com.sun.star.uno.UnoRuntime;
+
+/**
+ * @author  frank.schoenheit@oracle.com
+ */
+public class SpreadsheetDocument extends OfficeDocument
+{
+    /** Creates a new blank spreadsheet document */
+    /* ------------------------------------------------------------------ */
+    public SpreadsheetDocument( XMultiServiceFactory orb ) throws com.sun.star.uno.Exception
+    {
+        super( orb, implLoadAsComponent( orb, "private:factory/scalc" ) );
+    }
+
+    /* ------------------------------------------------------------------ */
+    public SpreadsheetDocument( XMultiServiceFactory orb, XComponent document ) throws com.sun.star.uno.Exception
+    {
+        super( orb, document );
+    }
+
+    /* ------------------------------------------------------------------ */
+    /** returns the sheets collection
+    */
+    public XSpreadsheets getSheets() throws com.sun.star.uno.Exception
+    {
+        XSpreadsheetDocument spreadsheetDoc = UnoRuntime.queryInterface( XSpreadsheetDocument.class, getDocument() );
+        return spreadsheetDoc.getSheets();
+    }
+
+    /* ------------------------------------------------------------------ */
+    /** returns the sheet with the given index
+    */
+    public XCellRange getSheet( int index ) throws com.sun.star.uno.Exception
+    {
+        XIndexAccess sheets = UnoRuntime.queryInterface( XIndexAccess.class, getSheets() );
+        return UnoRuntime.queryInterface( XCellRange.class, sheets.getByIndex( index ) );
+    }
+}
diff --git a/test/source/java/org/openoffice/test/tools/SpreadsheetView.java b/test/source/java/org/openoffice/test/tools/SpreadsheetView.java
new file mode 100644
index 000000000000..34cb8b0813e4
--- /dev/null
+++ b/test/source/java/org/openoffice/test/tools/SpreadsheetView.java
@@ -0,0 +1,72 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org.  If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+package org.openoffice.test.tools;
+
+import com.sun.star.container.XIndexAccess;
+import com.sun.star.frame.XController;
+import com.sun.star.lang.XMultiServiceFactory;
+import com.sun.star.sheet.XSpreadsheet;
+import com.sun.star.sheet.XSpreadsheetDocument;
+import com.sun.star.sheet.XSpreadsheetView;
+import com.sun.star.uno.UnoRuntime;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * @author frank.schoenheit@oracle.com
+ */
+public class SpreadsheetView extends OfficeDocumentView
+{
+
+    /** Creates a new instance of SpreadsheetView */
+    public SpreadsheetView( XMultiServiceFactory orb, OfficeDocument document, XController controller )
+    {
+        super( orb, document, controller );
+    }
+
+    /** activates the sheet with the given index
+     */
+    void activateSheet( int sheetIndex )
+    {
+        try
+        {
+            // get the sheet to activate
+            XSpreadsheetDocument doc = UnoRuntime.queryInterface( XSpreadsheetDocument.class, getDocument().getDocument() );
+            XIndexAccess sheets = UnoRuntime.queryInterface( XIndexAccess.class, doc.getSheets() );
+
+            XSpreadsheet sheet = UnoRuntime.queryInterface( XSpreadsheet.class, sheets.getByIndex( sheetIndex ) );
+
+            // activate
+            XSpreadsheetView view = UnoRuntime.queryInterface( XSpreadsheetView.class, getController() );
+            view.setActiveSheet( sheet );
+        }
+        catch( com.sun.star.uno.Exception e )
+        {
+            Logger.getLogger( SpreadsheetView.class.getName() ).log( Level.SEVERE, "unable to activate the given sheet", e );
+        }
+    }
+}
diff --git a/test/source/java/org/openoffice/test/tools/makefile.mk b/test/source/java/org/openoffice/test/tools/makefile.mk
new file mode 100644
index 000000000000..ec7d191e6b10
--- /dev/null
+++ b/test/source/java/org/openoffice/test/tools/makefile.mk
@@ -0,0 +1,41 @@
+#*************************************************************************
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org.  If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#***********************************************************************/
+
+PRJ = ../../../../../..
+PRJNAME = test
+TARGET = java
+
+PACKAGE = org/openoffice/test/tools
+
+JARFILES = juh.jar ridl.jar unoil.jar
+JAVAFILES = $(shell @$(FIND) . -name "*.java")
+
+JARTARGET = test-tools.jar
+JARCLASSDIRS = $(PACKAGE)
+JARCLASSPATH = $(JARFILES)
+
+.INCLUDE: settings.mk
+.INCLUDE: target.mk
+
-- 
cgit