/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ /**************************************************************************/ 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
* @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 DrawPage 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 ); } };