329 lines
13 KiB
Java
329 lines
13 KiB
Java
/*************************************************************************
|
|
*
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
|
*
|
|
* $RCSfile: DocumentHelper.java,v $
|
|
*
|
|
* $Revision: 1.5 $
|
|
*
|
|
* last change: $Author: rt $ $Date: 2005-09-07 20:07:49 $
|
|
*
|
|
* The Contents of this file are made available subject to
|
|
* the terms of GNU Lesser General Public License Version 2.1.
|
|
*
|
|
*
|
|
* GNU Lesser General Public License Version 2.1
|
|
* =============================================
|
|
* Copyright 2005 by Sun Microsystems, Inc.
|
|
* 901 San Antonio Road, Palo Alto, CA 94303, USA
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License version 2.1, as published by the Free Software Foundation.
|
|
*
|
|
* This library 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 for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
|
* MA 02111-1307 USA
|
|
*
|
|
************************************************************************/
|
|
|
|
/**************************************************************************/
|
|
import com.sun.star.uno.*;
|
|
import com.sun.star.lang.*;
|
|
import com.sun.star.util.*;
|
|
import com.sun.star.awt.*;
|
|
import com.sun.star.drawing.*;
|
|
import com.sun.star.frame.*;
|
|
import com.sun.star.form.*;
|
|
import com.sun.star.beans.*;
|
|
import com.sun.star.container.*;
|
|
import com.sun.star.container.*;
|
|
|
|
/**************************************************************************/
|
|
/** provides a small wrapper around a document
|
|
*/
|
|
public class DocumentHelper
|
|
{
|
|
/// the remote office context
|
|
protected XComponentContext m_remoteContext;
|
|
/// the remote service manager
|
|
protected XMultiServiceFactory m_orb;
|
|
protected XComponent m_documentComponent;
|
|
|
|
/* ------------------------------------------------------------------ */
|
|
public XComponent getDocument( )
|
|
{
|
|
return m_documentComponent;
|
|
}
|
|
|
|
/* ------------------------------------------------------------------ */
|
|
public XComponentContext getContext( )
|
|
{
|
|
return m_remoteContext;
|
|
}
|
|
|
|
/* ------------------------------------------------------------------ */
|
|
public XMultiServiceFactory getOrb( )
|
|
{
|
|
return m_orb;
|
|
}
|
|
|
|
/* ------------------------------------------------------------------ */
|
|
public DocumentHelper( XComponentContext xContext, XComponent document )
|
|
{
|
|
m_remoteContext = xContext;
|
|
m_orb = (XMultiServiceFactory)UnoRuntime.queryInterface(
|
|
XMultiServiceFactory.class, m_remoteContext.getServiceManager());
|
|
m_documentComponent = document;
|
|
}
|
|
|
|
/* ------------------------------------------------------------------ */
|
|
protected static XComponent implCreateBlankDocument( XComponentContext xCtx, String factoryURL ) throws com.sun.star.uno.Exception
|
|
{
|
|
XComponentLoader aLoader = (XComponentLoader)UnoRuntime.queryInterface(
|
|
XComponentLoader.class,
|
|
xCtx.getServiceManager().createInstanceWithContext(
|
|
"com.sun.star.frame.Desktop", xCtx ));
|
|
|
|
return UNO.queryComponent(
|
|
aLoader.loadComponentFromURL( factoryURL, "_blank", 0, new PropertyValue[ 0 ] )
|
|
);
|
|
}
|
|
|
|
/* ------------------------------------------------------------------ */
|
|
public static DocumentHelper blankTextDocument( XComponentContext xCtx ) throws com.sun.star.uno.Exception
|
|
{
|
|
return blankDocument( xCtx, DocumentType.WRITER );
|
|
}
|
|
|
|
/* ------------------------------------------------------------------ */
|
|
public static DocumentHelper blankDocument( XComponentContext xCtx, DocumentType eType ) throws com.sun.star.uno.Exception
|
|
{
|
|
XComponent document = implCreateBlankDocument( xCtx, getDocumentFactoryURL( eType ) );
|
|
if ( eType == DocumentType.CALC )
|
|
return new SpreadsheetDocument( xCtx, document );
|
|
|
|
return new DocumentHelper( xCtx, document );
|
|
}
|
|
|
|
/* ------------------------------------------------------------------ */
|
|
/** retrieves the current view of the document
|
|
@return
|
|
the view component, queried for the interface described by aInterfaceClass
|
|
*/
|
|
public DocumentViewHelper getCurrentView( )
|
|
{
|
|
// get the model interface for the document
|
|
XModel xDocModel = (XModel)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 DocumentViewHelper( m_orb, this, xController );
|
|
}
|
|
|
|
/* ------------------------------------------------------------------ */
|
|
/** creates a new form which is a child of the given form components container
|
|
|
|
@param xParentContainer
|
|
The parent container for the new form
|
|
@param sInitialName
|
|
The initial name of the form. May be null, in this case the default (which
|
|
is an implementation detail) applies.
|
|
*/
|
|
protected XIndexContainer createSubForm( XIndexContainer xParentContainer, String sInitialName )
|
|
throws com.sun.star.uno.Exception
|
|
{
|
|
// create a new form
|
|
Object xNewForm = m_orb.createInstance( "com.sun.star.form.component.DataForm" );
|
|
|
|
// insert
|
|
xParentContainer.insertByIndex( xParentContainer.getCount(), xNewForm );
|
|
|
|
// set the name if necessary
|
|
if ( null != sInitialName )
|
|
{
|
|
XPropertySet xFormProps = UNO.queryPropertySet( xNewForm );
|
|
xFormProps.setPropertyValue( "Name", sInitialName );
|
|
}
|
|
|
|
// outta here
|
|
return (XIndexContainer)UnoRuntime.queryInterface( XIndexContainer.class, xNewForm );
|
|
}
|
|
|
|
/* ------------------------------------------------------------------ */
|
|
/** creates a new form which is a child of the given form components container
|
|
|
|
@param aParentContainer
|
|
The parent container for the new form
|
|
@param sInitialName
|
|
The initial name of the form. May be null, in this case the default (which
|
|
is an implementation detail) applies.
|
|
*/
|
|
public XIndexContainer createSubForm( Object aParentContainer, String sInitialName )
|
|
throws com.sun.star.uno.Exception
|
|
{
|
|
XIndexContainer xParentContainer = (XIndexContainer)UnoRuntime.queryInterface(
|
|
XIndexContainer.class, aParentContainer );
|
|
return createSubForm( xParentContainer, sInitialName );
|
|
}
|
|
|
|
/* ------------------------------------------------------------------ */
|
|
/** creates a form which is a sibling of the given form
|
|
@param aForm
|
|
A sinbling of the to be created form.
|
|
|
|
@param sInitialName
|
|
The initial name of the form. May be null, in this case the default (which
|
|
is an implementation detail) applies.
|
|
*/
|
|
public XIndexContainer createSiblingForm( Object aForm, String sInitialName ) throws com.sun.star.uno.Exception
|
|
{
|
|
// get the parent
|
|
XChild xAsChild = (XChild)UnoRuntime.queryInterface( XChild.class, aForm );
|
|
XIndexContainer xContainer = (XIndexContainer)UnoRuntime.queryInterface(
|
|
XIndexContainer.class, xAsChild.getParent() );;
|
|
// append a new form to this parent container
|
|
return createSubForm( xContainer, sInitialName );
|
|
}
|
|
|
|
/* ------------------------------------------------------------------ */
|
|
/** retrieves the document model which a given form component belongs to
|
|
*/
|
|
static public DocumentHelper getDocumentForComponent( Object aFormComponent, XComponentContext xCtx )
|
|
{
|
|
XChild xChild = (XChild)UnoRuntime.queryInterface( XChild.class, aFormComponent );
|
|
XModel xModel = null;
|
|
while ( ( null != xChild ) && ( null == xModel ) )
|
|
{
|
|
XInterface xParent = (XInterface)xChild.getParent();
|
|
xModel = (XModel)UnoRuntime.queryInterface( XModel.class, xParent );
|
|
xChild = (XChild)UnoRuntime.queryInterface( XChild.class, xParent );
|
|
}
|
|
|
|
return new DocumentHelper( xCtx, xModel );
|
|
}
|
|
|
|
/* ------------------------------------------------------------------ */
|
|
/** 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";
|
|
return "private:factory/swriter";
|
|
}
|
|
|
|
/* ------------------------------------------------------------------ */
|
|
/** classifies a document
|
|
*/
|
|
public DocumentType classify( )
|
|
{
|
|
XServiceInfo xSI = (XServiceInfo)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<br/>
|
|
* @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 = (XDrawPagesSupplier)UnoRuntime.queryInterface(
|
|
XDrawPagesSupplier.class, getDocument() );
|
|
XDrawPages xPages = xSuppPages.getDrawPages();
|
|
|
|
return (XDrawPage)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 = (XDrawPageSupplier)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 = (XDrawPagesSupplier)UnoRuntime.queryInterface(
|
|
XDrawPagesSupplier.class, getDocument() );
|
|
XDrawPages xPages = xSuppPages.getDrawPages();
|
|
|
|
xReturn = (XDrawPage)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;
|
|
}
|
|
|
|
/* ------------------------------------------------------------------ */
|
|
/** retrieves the root of the hierarchy of form components
|
|
*/
|
|
protected XNameContainer getFormComponentTreeRoot( ) throws com.sun.star.uno.Exception
|
|
{
|
|
XFormsSupplier xSuppForms = (XFormsSupplier)UnoRuntime.queryInterface(
|
|
XFormsSupplier.class, getMainDrawPage( ) );
|
|
|
|
XNameContainer xFormsCollection = null;
|
|
if ( null != xSuppForms )
|
|
{
|
|
xFormsCollection = xSuppForms.getForms();
|
|
}
|
|
return xFormsCollection;
|
|
}
|
|
|
|
/* ------------------------------------------------------------------ */
|
|
/** creates a component at the service factory provided by the document
|
|
*/
|
|
public XInterface createInstance( String serviceSpecifier ) throws com.sun.star.uno.Exception
|
|
{
|
|
XMultiServiceFactory xORB = (XMultiServiceFactory)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 = (XMultiServiceFactory)UnoRuntime.queryInterface( XMultiServiceFactory.class,
|
|
m_documentComponent );
|
|
return (XInterface) xORB.createInstanceWithArguments( serviceSpecifier, arguments );
|
|
}
|
|
};
|
|
|