1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski // __________ Imports __________ 25*b1cdbd2cSJim Jagielski 26*b1cdbd2cSJim Jagielski 27*b1cdbd2cSJim Jagielski // base classes 28*b1cdbd2cSJim Jagielski import com.sun.star.uno.XInterface; 29*b1cdbd2cSJim Jagielski import com.sun.star.uno.UnoRuntime; 30*b1cdbd2cSJim Jagielski import com.sun.star.uno.Any; 31*b1cdbd2cSJim Jagielski 32*b1cdbd2cSJim Jagielski // factory for creating components 33*b1cdbd2cSJim Jagielski import com.sun.star.lang.XMultiServiceFactory; 34*b1cdbd2cSJim Jagielski import com.sun.star.lang.XComponent; 35*b1cdbd2cSJim Jagielski import com.sun.star.beans.XPropertySet; 36*b1cdbd2cSJim Jagielski 37*b1cdbd2cSJim Jagielski // application specific classes 38*b1cdbd2cSJim Jagielski import com.sun.star.chart.XChartDocument; 39*b1cdbd2cSJim Jagielski import com.sun.star.chart.XDiagram; 40*b1cdbd2cSJim Jagielski import com.sun.star.drawing.*; 41*b1cdbd2cSJim Jagielski import com.sun.star.frame.XModel; 42*b1cdbd2cSJim Jagielski import com.sun.star.text.XTextDocument; 43*b1cdbd2cSJim Jagielski import com.sun.star.text.XTextContent; 44*b1cdbd2cSJim Jagielski import com.sun.star.text.XTextCursor; 45*b1cdbd2cSJim Jagielski import com.sun.star.text.XText; 46*b1cdbd2cSJim Jagielski //import com.sun.star.text.VertOrientation; 47*b1cdbd2cSJim Jagielski //import com.sun.star.text.HoriOrientation; 48*b1cdbd2cSJim Jagielski import com.sun.star.document.XEmbeddedObjectSupplier; 49*b1cdbd2cSJim Jagielski 50*b1cdbd2cSJim Jagielski // base graphics things 51*b1cdbd2cSJim Jagielski import com.sun.star.awt.Point; 52*b1cdbd2cSJim Jagielski import com.sun.star.awt.Size; 53*b1cdbd2cSJim Jagielski 54*b1cdbd2cSJim Jagielski // Exceptions 55*b1cdbd2cSJim Jagielski import com.sun.star.uno.RuntimeException; 56*b1cdbd2cSJim Jagielski import com.sun.star.container.NoSuchElementException; 57*b1cdbd2cSJim Jagielski import com.sun.star.beans.UnknownPropertyException; 58*b1cdbd2cSJim Jagielski import com.sun.star.lang.IndexOutOfBoundsException; 59*b1cdbd2cSJim Jagielski 60*b1cdbd2cSJim Jagielski // __________ Implementation __________ 61*b1cdbd2cSJim Jagielski 62*b1cdbd2cSJim Jagielski /** Helper for creating an OLE chart 63*b1cdbd2cSJim Jagielski @author Björn Milcke 64*b1cdbd2cSJim Jagielski */ 65*b1cdbd2cSJim Jagielski public class ChartHelper 66*b1cdbd2cSJim Jagielski { ChartHelper( XModel aContainerDoc )67*b1cdbd2cSJim Jagielski public ChartHelper( XModel aContainerDoc ) 68*b1cdbd2cSJim Jagielski { 69*b1cdbd2cSJim Jagielski maContainerDocument = aContainerDoc; 70*b1cdbd2cSJim Jagielski } 71*b1cdbd2cSJim Jagielski insertOLEChartInWriter( String sChartName, Point aUpperLeft, Size aExtent, String sChartServiceName )72*b1cdbd2cSJim Jagielski public XChartDocument insertOLEChartInWriter( 73*b1cdbd2cSJim Jagielski String sChartName, 74*b1cdbd2cSJim Jagielski Point aUpperLeft, 75*b1cdbd2cSJim Jagielski Size aExtent, 76*b1cdbd2cSJim Jagielski String sChartServiceName ) 77*b1cdbd2cSJim Jagielski { 78*b1cdbd2cSJim Jagielski XChartDocument aResult = null; 79*b1cdbd2cSJim Jagielski 80*b1cdbd2cSJim Jagielski XMultiServiceFactory aFact = (XMultiServiceFactory) 81*b1cdbd2cSJim Jagielski UnoRuntime.queryInterface(XMultiServiceFactory.class, 82*b1cdbd2cSJim Jagielski maContainerDocument ); 83*b1cdbd2cSJim Jagielski 84*b1cdbd2cSJim Jagielski if( aFact != null ) 85*b1cdbd2cSJim Jagielski { 86*b1cdbd2cSJim Jagielski try 87*b1cdbd2cSJim Jagielski { 88*b1cdbd2cSJim Jagielski XTextContent xTextContent = (XTextContent)UnoRuntime.queryInterface( 89*b1cdbd2cSJim Jagielski XTextContent.class, 90*b1cdbd2cSJim Jagielski aFact.createInstance("com.sun.star.text.TextEmbeddedObject")); 91*b1cdbd2cSJim Jagielski 92*b1cdbd2cSJim Jagielski if ( xTextContent != null ) 93*b1cdbd2cSJim Jagielski { 94*b1cdbd2cSJim Jagielski XPropertySet xPropSet = (XPropertySet)UnoRuntime.queryInterface( 95*b1cdbd2cSJim Jagielski XPropertySet.class, xTextContent); 96*b1cdbd2cSJim Jagielski 97*b1cdbd2cSJim Jagielski Any aAny = new Any(String.class, msChartClassID); 98*b1cdbd2cSJim Jagielski xPropSet.setPropertyValue("CLSID", aAny ); 99*b1cdbd2cSJim Jagielski 100*b1cdbd2cSJim Jagielski XTextDocument xTextDoc = (XTextDocument) 101*b1cdbd2cSJim Jagielski UnoRuntime.queryInterface(XTextDocument.class, 102*b1cdbd2cSJim Jagielski maContainerDocument); 103*b1cdbd2cSJim Jagielski XText xText = xTextDoc.getText(); 104*b1cdbd2cSJim Jagielski XTextCursor xCursor = xText.createTextCursor(); 105*b1cdbd2cSJim Jagielski 106*b1cdbd2cSJim Jagielski //insert embedded object in text -> object will be created 107*b1cdbd2cSJim Jagielski xText.insertTextContent( xCursor, xTextContent, true ); 108*b1cdbd2cSJim Jagielski 109*b1cdbd2cSJim Jagielski // set size and position 110*b1cdbd2cSJim Jagielski XShape xShape = (XShape)UnoRuntime.queryInterface( 111*b1cdbd2cSJim Jagielski XShape.class, xTextContent); 112*b1cdbd2cSJim Jagielski xShape.setSize( aExtent ); 113*b1cdbd2cSJim Jagielski 114*b1cdbd2cSJim Jagielski aAny = new Any(Short.class, 115*b1cdbd2cSJim Jagielski new Short(com.sun.star.text.VertOrientation.NONE)); 116*b1cdbd2cSJim Jagielski xPropSet.setPropertyValue("VertOrient", aAny ); 117*b1cdbd2cSJim Jagielski aAny = new Any(Short.class, 118*b1cdbd2cSJim Jagielski new Short(com.sun.star.text.HoriOrientation.NONE)); 119*b1cdbd2cSJim Jagielski xPropSet.setPropertyValue("HoriOrient", aAny ); 120*b1cdbd2cSJim Jagielski aAny = new Any(Integer.class, new Integer(aUpperLeft.Y)); 121*b1cdbd2cSJim Jagielski xPropSet.setPropertyValue("VertOrientPosition", aAny ); 122*b1cdbd2cSJim Jagielski aAny = new Any(Integer.class, new Integer(aUpperLeft.X)); 123*b1cdbd2cSJim Jagielski xPropSet.setPropertyValue("HoriOrientPosition", aAny ); 124*b1cdbd2cSJim Jagielski 125*b1cdbd2cSJim Jagielski // retrieve the chart document as model of the OLE shape 126*b1cdbd2cSJim Jagielski aResult = (XChartDocument) UnoRuntime.queryInterface( 127*b1cdbd2cSJim Jagielski XChartDocument.class, 128*b1cdbd2cSJim Jagielski xPropSet.getPropertyValue( "Model" )); 129*b1cdbd2cSJim Jagielski 130*b1cdbd2cSJim Jagielski // create a diagram via the factory and set this as 131*b1cdbd2cSJim Jagielski // new diagram 132*b1cdbd2cSJim Jagielski aResult.setDiagram( 133*b1cdbd2cSJim Jagielski (XDiagram) UnoRuntime.queryInterface( 134*b1cdbd2cSJim Jagielski XDiagram.class, 135*b1cdbd2cSJim Jagielski ((XMultiServiceFactory) UnoRuntime.queryInterface( 136*b1cdbd2cSJim Jagielski XMultiServiceFactory.class, 137*b1cdbd2cSJim Jagielski aResult )).createInstance(sChartServiceName ))); 138*b1cdbd2cSJim Jagielski } 139*b1cdbd2cSJim Jagielski } catch( Exception ex) 140*b1cdbd2cSJim Jagielski { 141*b1cdbd2cSJim Jagielski System.out.println( "caught exception: " + ex ); 142*b1cdbd2cSJim Jagielski } 143*b1cdbd2cSJim Jagielski } 144*b1cdbd2cSJim Jagielski 145*b1cdbd2cSJim Jagielski return aResult; 146*b1cdbd2cSJim Jagielski } 147*b1cdbd2cSJim Jagielski insertOLEChartInDraw( String sChartName, Point aUpperLeft, Size aExtent, String sChartServiceName )148*b1cdbd2cSJim Jagielski public XChartDocument insertOLEChartInDraw( 149*b1cdbd2cSJim Jagielski String sChartName, 150*b1cdbd2cSJim Jagielski Point aUpperLeft, 151*b1cdbd2cSJim Jagielski Size aExtent, 152*b1cdbd2cSJim Jagielski String sChartServiceName ) 153*b1cdbd2cSJim Jagielski { 154*b1cdbd2cSJim Jagielski XChartDocument aResult = null; 155*b1cdbd2cSJim Jagielski 156*b1cdbd2cSJim Jagielski XShapes aPage = null; 157*b1cdbd2cSJim Jagielski 158*b1cdbd2cSJim Jagielski // try interface for multiple pages in a document 159*b1cdbd2cSJim Jagielski XDrawPagesSupplier aSupplier = (XDrawPagesSupplier) 160*b1cdbd2cSJim Jagielski UnoRuntime.queryInterface(XDrawPagesSupplier.class, 161*b1cdbd2cSJim Jagielski maContainerDocument ); 162*b1cdbd2cSJim Jagielski 163*b1cdbd2cSJim Jagielski if( aSupplier != null ) 164*b1cdbd2cSJim Jagielski { 165*b1cdbd2cSJim Jagielski try 166*b1cdbd2cSJim Jagielski { 167*b1cdbd2cSJim Jagielski // get first page 168*b1cdbd2cSJim Jagielski aPage = (XShapes) UnoRuntime.queryInterface( 169*b1cdbd2cSJim Jagielski XShapes.class, aSupplier.getDrawPages().getByIndex( 0 ) ); 170*b1cdbd2cSJim Jagielski } 171*b1cdbd2cSJim Jagielski catch( Exception ex ) 172*b1cdbd2cSJim Jagielski { 173*b1cdbd2cSJim Jagielski System.out.println( "First page not found in shape collection: " + 174*b1cdbd2cSJim Jagielski ex ); 175*b1cdbd2cSJim Jagielski } 176*b1cdbd2cSJim Jagielski } 177*b1cdbd2cSJim Jagielski else 178*b1cdbd2cSJim Jagielski { 179*b1cdbd2cSJim Jagielski // try interface for single draw page (e.g. spreadsheet) 180*b1cdbd2cSJim Jagielski XDrawPageSupplier aOnePageSupplier = (XDrawPageSupplier) 181*b1cdbd2cSJim Jagielski UnoRuntime.queryInterface(XDrawPageSupplier.class, 182*b1cdbd2cSJim Jagielski maContainerDocument ); 183*b1cdbd2cSJim Jagielski 184*b1cdbd2cSJim Jagielski if( aOnePageSupplier != null ) 185*b1cdbd2cSJim Jagielski { 186*b1cdbd2cSJim Jagielski aPage = (XShapes) UnoRuntime.queryInterface( 187*b1cdbd2cSJim Jagielski XShapes.class, aOnePageSupplier.getDrawPage()); 188*b1cdbd2cSJim Jagielski } 189*b1cdbd2cSJim Jagielski } 190*b1cdbd2cSJim Jagielski 191*b1cdbd2cSJim Jagielski if( aPage != null ) 192*b1cdbd2cSJim Jagielski { 193*b1cdbd2cSJim Jagielski XMultiServiceFactory aFact = (XMultiServiceFactory) 194*b1cdbd2cSJim Jagielski UnoRuntime.queryInterface(XMultiServiceFactory.class, 195*b1cdbd2cSJim Jagielski maContainerDocument ); 196*b1cdbd2cSJim Jagielski 197*b1cdbd2cSJim Jagielski if( aFact != null ) 198*b1cdbd2cSJim Jagielski { 199*b1cdbd2cSJim Jagielski try 200*b1cdbd2cSJim Jagielski { 201*b1cdbd2cSJim Jagielski // create an OLE shape 202*b1cdbd2cSJim Jagielski XShape aShape = (XShape) UnoRuntime.queryInterface( 203*b1cdbd2cSJim Jagielski XShape.class, 204*b1cdbd2cSJim Jagielski aFact.createInstance( "com.sun.star.drawing.OLE2Shape" )); 205*b1cdbd2cSJim Jagielski 206*b1cdbd2cSJim Jagielski // insert the shape into the page 207*b1cdbd2cSJim Jagielski aPage.add( aShape ); 208*b1cdbd2cSJim Jagielski aShape.setPosition( aUpperLeft ); 209*b1cdbd2cSJim Jagielski aShape.setSize( aExtent ); 210*b1cdbd2cSJim Jagielski 211*b1cdbd2cSJim Jagielski // make the OLE shape a chart 212*b1cdbd2cSJim Jagielski XPropertySet aShapeProp = (XPropertySet) 213*b1cdbd2cSJim Jagielski UnoRuntime.queryInterface(XPropertySet.class, aShape ); 214*b1cdbd2cSJim Jagielski if( aShapeProp != null ) 215*b1cdbd2cSJim Jagielski { 216*b1cdbd2cSJim Jagielski // set the class id for charts 217*b1cdbd2cSJim Jagielski aShapeProp.setPropertyValue( "CLSID", msChartClassID ); 218*b1cdbd2cSJim Jagielski 219*b1cdbd2cSJim Jagielski // retrieve the chart document as model of the OLE shape 220*b1cdbd2cSJim Jagielski aResult = (XChartDocument) UnoRuntime.queryInterface( 221*b1cdbd2cSJim Jagielski XChartDocument.class, 222*b1cdbd2cSJim Jagielski aShapeProp.getPropertyValue( "Model" )); 223*b1cdbd2cSJim Jagielski 224*b1cdbd2cSJim Jagielski // create a diagram via the factory and set this as 225*b1cdbd2cSJim Jagielski // new diagram 226*b1cdbd2cSJim Jagielski aResult.setDiagram( 227*b1cdbd2cSJim Jagielski (XDiagram) UnoRuntime.queryInterface( 228*b1cdbd2cSJim Jagielski XDiagram.class, 229*b1cdbd2cSJim Jagielski ((XMultiServiceFactory) UnoRuntime.queryInterface( 230*b1cdbd2cSJim Jagielski XMultiServiceFactory.class, 231*b1cdbd2cSJim Jagielski aResult )).createInstance(sChartServiceName ))); 232*b1cdbd2cSJim Jagielski } 233*b1cdbd2cSJim Jagielski } 234*b1cdbd2cSJim Jagielski catch( Exception ex ) 235*b1cdbd2cSJim Jagielski { 236*b1cdbd2cSJim Jagielski System.out.println( "Couldn't change the OLE shape into a chart: " + ex ); 237*b1cdbd2cSJim Jagielski } 238*b1cdbd2cSJim Jagielski } 239*b1cdbd2cSJim Jagielski } 240*b1cdbd2cSJim Jagielski 241*b1cdbd2cSJim Jagielski return aResult; 242*b1cdbd2cSJim Jagielski } 243*b1cdbd2cSJim Jagielski 244*b1cdbd2cSJim Jagielski 245*b1cdbd2cSJim Jagielski // __________ private members and methods __________ 246*b1cdbd2cSJim Jagielski 247*b1cdbd2cSJim Jagielski private final String msChartClassID = "12dcae26-281f-416f-a234-c3086127382e"; 248*b1cdbd2cSJim Jagielski 249*b1cdbd2cSJim Jagielski private XModel maContainerDocument; 250*b1cdbd2cSJim Jagielski } 251