/************************************************************** * * 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. * *************************************************************/ // __________ Imports __________ // base classes import com.sun.star.uno.XInterface; import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.Any; // factory for creating components import com.sun.star.lang.XMultiServiceFactory; import com.sun.star.lang.XComponent; import com.sun.star.beans.XPropertySet; // application specific classes import com.sun.star.chart.XChartDocument; import com.sun.star.chart.XDiagram; import com.sun.star.drawing.*; import com.sun.star.frame.XModel; import com.sun.star.text.XTextDocument; import com.sun.star.text.XTextContent; import com.sun.star.text.XTextCursor; import com.sun.star.text.XText; //import com.sun.star.text.VertOrientation; //import com.sun.star.text.HoriOrientation; import com.sun.star.document.XEmbeddedObjectSupplier; // base graphics things import com.sun.star.awt.Point; import com.sun.star.awt.Size; // Exceptions import com.sun.star.uno.RuntimeException; import com.sun.star.container.NoSuchElementException; import com.sun.star.beans.UnknownPropertyException; import com.sun.star.lang.IndexOutOfBoundsException; // __________ Implementation __________ /** Helper for creating an OLE chart @author Björn Milcke */ public class ChartHelper { public ChartHelper( XModel aContainerDoc ) { maContainerDocument = aContainerDoc; } public XChartDocument insertOLEChartInWriter( String sChartName, Point aUpperLeft, Size aExtent, String sChartServiceName ) { XChartDocument aResult = null; XMultiServiceFactory aFact = (XMultiServiceFactory) UnoRuntime.queryInterface(XMultiServiceFactory.class, maContainerDocument ); if( aFact != null ) { try { XTextContent xTextContent = (XTextContent)UnoRuntime.queryInterface( XTextContent.class, aFact.createInstance("com.sun.star.text.TextEmbeddedObject")); if ( xTextContent != null ) { XPropertySet xPropSet = (XPropertySet)UnoRuntime.queryInterface( XPropertySet.class, xTextContent); Any aAny = new Any(String.class, msChartClassID); xPropSet.setPropertyValue("CLSID", aAny ); XTextDocument xTextDoc = (XTextDocument) UnoRuntime.queryInterface(XTextDocument.class, maContainerDocument); XText xText = xTextDoc.getText(); XTextCursor xCursor = xText.createTextCursor(); //insert embedded object in text -> object will be created xText.insertTextContent( xCursor, xTextContent, true ); // set size and position XShape xShape = (XShape)UnoRuntime.queryInterface( XShape.class, xTextContent); xShape.setSize( aExtent ); aAny = new Any(Short.class, new Short(com.sun.star.text.VertOrientation.NONE)); xPropSet.setPropertyValue("VertOrient", aAny ); aAny = new Any(Short.class, new Short(com.sun.star.text.HoriOrientation.NONE)); xPropSet.setPropertyValue("HoriOrient", aAny ); aAny = new Any(Integer.class, new Integer(aUpperLeft.Y)); xPropSet.setPropertyValue("VertOrientPosition", aAny ); aAny = new Any(Integer.class, new Integer(aUpperLeft.X)); xPropSet.setPropertyValue("HoriOrientPosition", aAny ); // retrieve the chart document as model of the OLE shape aResult = (XChartDocument) UnoRuntime.queryInterface( XChartDocument.class, xPropSet.getPropertyValue( "Model" )); // create a diagram via the factory and set this as // new diagram aResult.setDiagram( (XDiagram) UnoRuntime.queryInterface( XDiagram.class, ((XMultiServiceFactory) UnoRuntime.queryInterface( XMultiServiceFactory.class, aResult )).createInstance(sChartServiceName ))); } } catch( Exception ex) { System.out.println( "caught exception: " + ex ); } } return aResult; } public XChartDocument insertOLEChartInDraw( String sChartName, Point aUpperLeft, Size aExtent, String sChartServiceName ) { XChartDocument aResult = null; XShapes aPage = null; // try interface for multiple pages in a document XDrawPagesSupplier aSupplier = (XDrawPagesSupplier) UnoRuntime.queryInterface(XDrawPagesSupplier.class, maContainerDocument ); if( aSupplier != null ) { try { // get first page aPage = (XShapes) UnoRuntime.queryInterface( XShapes.class, aSupplier.getDrawPages().getByIndex( 0 ) ); } catch( Exception ex ) { System.out.println( "First page not found in shape collection: " + ex ); } } else { // try interface for single draw page (e.g. spreadsheet) XDrawPageSupplier aOnePageSupplier = (XDrawPageSupplier) UnoRuntime.queryInterface(XDrawPageSupplier.class, maContainerDocument ); if( aOnePageSupplier != null ) { aPage = (XShapes) UnoRuntime.queryInterface( XShapes.class, aOnePageSupplier.getDrawPage()); } } if( aPage != null ) { XMultiServiceFactory aFact = (XMultiServiceFactory) UnoRuntime.queryInterface(XMultiServiceFactory.class, maContainerDocument ); if( aFact != null ) { try { // create an OLE shape XShape aShape = (XShape) UnoRuntime.queryInterface( XShape.class, aFact.createInstance( "com.sun.star.drawing.OLE2Shape" )); // insert the shape into the page aPage.add( aShape ); aShape.setPosition( aUpperLeft ); aShape.setSize( aExtent ); // make the OLE shape a chart XPropertySet aShapeProp = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, aShape ); if( aShapeProp != null ) { // set the class id for charts aShapeProp.setPropertyValue( "CLSID", msChartClassID ); // retrieve the chart document as model of the OLE shape aResult = (XChartDocument) UnoRuntime.queryInterface( XChartDocument.class, aShapeProp.getPropertyValue( "Model" )); // create a diagram via the factory and set this as // new diagram aResult.setDiagram( (XDiagram) UnoRuntime.queryInterface( XDiagram.class, ((XMultiServiceFactory) UnoRuntime.queryInterface( XMultiServiceFactory.class, aResult )).createInstance(sChartServiceName ))); } } catch( Exception ex ) { System.out.println( "Couldn't change the OLE shape into a chart: " + ex ); } } } return aResult; } // __________ private members and methods __________ private final String msChartClassID = "12dcae26-281f-416f-a234-c3086127382e"; private XModel maContainerDocument; }