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 // base classes 27*b1cdbd2cSJim Jagielski import com.sun.star.uno.XInterface; 28*b1cdbd2cSJim Jagielski import com.sun.star.uno.UnoRuntime; 29*b1cdbd2cSJim Jagielski import com.sun.star.lang.*; 30*b1cdbd2cSJim Jagielski 31*b1cdbd2cSJim Jagielski // property access 32*b1cdbd2cSJim Jagielski import com.sun.star.beans.*; 33*b1cdbd2cSJim Jagielski 34*b1cdbd2cSJim Jagielski // application specific classes 35*b1cdbd2cSJim Jagielski import com.sun.star.chart.*; 36*b1cdbd2cSJim Jagielski import com.sun.star.drawing.*; 37*b1cdbd2cSJim Jagielski 38*b1cdbd2cSJim Jagielski import com.sun.star.table.CellRangeAddress; 39*b1cdbd2cSJim Jagielski import com.sun.star.frame.XModel; 40*b1cdbd2cSJim Jagielski import com.sun.star.frame.XController; 41*b1cdbd2cSJim Jagielski 42*b1cdbd2cSJim Jagielski import com.sun.star.util.XNumberFormatsSupplier; 43*b1cdbd2cSJim Jagielski import com.sun.star.util.XNumberFormats; 44*b1cdbd2cSJim Jagielski 45*b1cdbd2cSJim Jagielski // base graphics things 46*b1cdbd2cSJim Jagielski import com.sun.star.awt.Point; 47*b1cdbd2cSJim Jagielski import com.sun.star.awt.Size; 48*b1cdbd2cSJim Jagielski import com.sun.star.awt.Rectangle; 49*b1cdbd2cSJim Jagielski import com.sun.star.awt.FontWeight; 50*b1cdbd2cSJim Jagielski import com.sun.star.awt.FontRelief; 51*b1cdbd2cSJim Jagielski 52*b1cdbd2cSJim Jagielski // Exceptions 53*b1cdbd2cSJim Jagielski import com.sun.star.uno.Exception; 54*b1cdbd2cSJim Jagielski import com.sun.star.uno.RuntimeException; 55*b1cdbd2cSJim Jagielski import com.sun.star.beans.UnknownPropertyException; 56*b1cdbd2cSJim Jagielski import com.sun.star.lang.IndexOutOfBoundsException; 57*b1cdbd2cSJim Jagielski import com.sun.star.util.MalformedNumberFormatException; 58*b1cdbd2cSJim Jagielski 59*b1cdbd2cSJim Jagielski 60*b1cdbd2cSJim Jagielski // __________ Implementation __________ 61*b1cdbd2cSJim Jagielski 62*b1cdbd2cSJim Jagielski /** Create a spreadsheet add some data and add a chart 63*b1cdbd2cSJim Jagielski @author Björn Milcke 64*b1cdbd2cSJim Jagielski */ 65*b1cdbd2cSJim Jagielski public class ChartInDraw 66*b1cdbd2cSJim Jagielski { 67*b1cdbd2cSJim Jagielski // ____________________ 68*b1cdbd2cSJim Jagielski main( String args[] )69*b1cdbd2cSJim Jagielski public static void main( String args[] ) 70*b1cdbd2cSJim Jagielski { 71*b1cdbd2cSJim Jagielski Helper aHelper = new Helper( args ); 72*b1cdbd2cSJim Jagielski 73*b1cdbd2cSJim Jagielski ChartHelper aChartHelper = new ChartHelper( aHelper.createDrawingDocument()); 74*b1cdbd2cSJim Jagielski 75*b1cdbd2cSJim Jagielski // the unit for measures is 1/100th of a millimeter 76*b1cdbd2cSJim Jagielski // position at (1cm, 1cm) 77*b1cdbd2cSJim Jagielski Point aPos = new Point( 1000, 1000 ); 78*b1cdbd2cSJim Jagielski 79*b1cdbd2cSJim Jagielski // size of the chart is 15cm x 12cm 80*b1cdbd2cSJim Jagielski Size aExtent = new Size( 15000, 13000 ); 81*b1cdbd2cSJim Jagielski 82*b1cdbd2cSJim Jagielski // insert a new chart into the "Chart" sheet of the 83*b1cdbd2cSJim Jagielski // spreadsheet document 84*b1cdbd2cSJim Jagielski XChartDocument aChartDoc = aChartHelper.insertOLEChartInDraw( 85*b1cdbd2cSJim Jagielski "BarChart", 86*b1cdbd2cSJim Jagielski aPos, 87*b1cdbd2cSJim Jagielski aExtent, 88*b1cdbd2cSJim Jagielski "com.sun.star.chart.BarDiagram" ); 89*b1cdbd2cSJim Jagielski 90*b1cdbd2cSJim Jagielski // instantiate test class with newly created chart 91*b1cdbd2cSJim Jagielski ChartInDraw aTest = new ChartInDraw( aChartDoc ); 92*b1cdbd2cSJim Jagielski 93*b1cdbd2cSJim Jagielski try 94*b1cdbd2cSJim Jagielski { 95*b1cdbd2cSJim Jagielski aTest.lockControllers(); 96*b1cdbd2cSJim Jagielski 97*b1cdbd2cSJim Jagielski aTest.testArea(); 98*b1cdbd2cSJim Jagielski aTest.testWall(); 99*b1cdbd2cSJim Jagielski aTest.testTitle(); 100*b1cdbd2cSJim Jagielski aTest.testLegend(); 101*b1cdbd2cSJim Jagielski aTest.testThreeD(); 102*b1cdbd2cSJim Jagielski 103*b1cdbd2cSJim Jagielski aTest.unlockControllers(); 104*b1cdbd2cSJim Jagielski } 105*b1cdbd2cSJim Jagielski catch( Exception ex ) 106*b1cdbd2cSJim Jagielski { 107*b1cdbd2cSJim Jagielski System.out.println( "UNO Exception caught: " + ex ); 108*b1cdbd2cSJim Jagielski System.out.println( "Message: " + ex.getMessage() ); 109*b1cdbd2cSJim Jagielski } 110*b1cdbd2cSJim Jagielski 111*b1cdbd2cSJim Jagielski System.exit( 0 ); 112*b1cdbd2cSJim Jagielski } 113*b1cdbd2cSJim Jagielski 114*b1cdbd2cSJim Jagielski 115*b1cdbd2cSJim Jagielski // ________________________________________ 116*b1cdbd2cSJim Jagielski ChartInDraw( XChartDocument aChartDoc )117*b1cdbd2cSJim Jagielski public ChartInDraw( XChartDocument aChartDoc ) 118*b1cdbd2cSJim Jagielski { 119*b1cdbd2cSJim Jagielski maChartDocument = aChartDoc; 120*b1cdbd2cSJim Jagielski maDiagram = maChartDocument.getDiagram(); 121*b1cdbd2cSJim Jagielski } 122*b1cdbd2cSJim Jagielski 123*b1cdbd2cSJim Jagielski // ____________________ 124*b1cdbd2cSJim Jagielski lockControllers()125*b1cdbd2cSJim Jagielski public void lockControllers() 126*b1cdbd2cSJim Jagielski throws RuntimeException 127*b1cdbd2cSJim Jagielski { 128*b1cdbd2cSJim Jagielski ((XModel) UnoRuntime.queryInterface( XModel.class, maChartDocument )).lockControllers(); 129*b1cdbd2cSJim Jagielski } 130*b1cdbd2cSJim Jagielski 131*b1cdbd2cSJim Jagielski // ____________________ 132*b1cdbd2cSJim Jagielski unlockControllers()133*b1cdbd2cSJim Jagielski public void unlockControllers() 134*b1cdbd2cSJim Jagielski throws RuntimeException 135*b1cdbd2cSJim Jagielski { 136*b1cdbd2cSJim Jagielski ((XModel) UnoRuntime.queryInterface( XModel.class, maChartDocument )).unlockControllers(); 137*b1cdbd2cSJim Jagielski } 138*b1cdbd2cSJim Jagielski 139*b1cdbd2cSJim Jagielski // ____________________ 140*b1cdbd2cSJim Jagielski testArea()141*b1cdbd2cSJim Jagielski public void testArea() 142*b1cdbd2cSJim Jagielski throws RuntimeException, UnknownPropertyException, PropertyVetoException, 143*b1cdbd2cSJim Jagielski com.sun.star.lang.IllegalArgumentException, WrappedTargetException 144*b1cdbd2cSJim Jagielski { 145*b1cdbd2cSJim Jagielski XPropertySet aArea = maChartDocument.getArea(); 146*b1cdbd2cSJim Jagielski 147*b1cdbd2cSJim Jagielski if( aArea != null ) 148*b1cdbd2cSJim Jagielski { 149*b1cdbd2cSJim Jagielski // change background color of entire chart 150*b1cdbd2cSJim Jagielski aArea.setPropertyValue( "FillStyle", FillStyle.SOLID ); 151*b1cdbd2cSJim Jagielski aArea.setPropertyValue( "FillColor", new Integer( 0xeeeeee )); 152*b1cdbd2cSJim Jagielski } 153*b1cdbd2cSJim Jagielski } 154*b1cdbd2cSJim Jagielski 155*b1cdbd2cSJim Jagielski // ____________________ 156*b1cdbd2cSJim Jagielski testWall()157*b1cdbd2cSJim Jagielski public void testWall() 158*b1cdbd2cSJim Jagielski throws RuntimeException, UnknownPropertyException, PropertyVetoException, 159*b1cdbd2cSJim Jagielski com.sun.star.lang.IllegalArgumentException, WrappedTargetException 160*b1cdbd2cSJim Jagielski { 161*b1cdbd2cSJim Jagielski XPropertySet aWall = ((X3DDisplay) UnoRuntime.queryInterface( 162*b1cdbd2cSJim Jagielski X3DDisplay.class, maDiagram )).getWall(); 163*b1cdbd2cSJim Jagielski 164*b1cdbd2cSJim Jagielski // change background color of area 165*b1cdbd2cSJim Jagielski aWall.setPropertyValue( "FillColor", new Integer( 0xcccccc )); 166*b1cdbd2cSJim Jagielski aWall.setPropertyValue( "FillStyle", FillStyle.SOLID ); 167*b1cdbd2cSJim Jagielski } 168*b1cdbd2cSJim Jagielski 169*b1cdbd2cSJim Jagielski // ____________________ 170*b1cdbd2cSJim Jagielski testTitle()171*b1cdbd2cSJim Jagielski public void testTitle() 172*b1cdbd2cSJim Jagielski throws RuntimeException, UnknownPropertyException, PropertyVetoException, 173*b1cdbd2cSJim Jagielski com.sun.star.lang.IllegalArgumentException, WrappedTargetException 174*b1cdbd2cSJim Jagielski { 175*b1cdbd2cSJim Jagielski // change main title 176*b1cdbd2cSJim Jagielski XPropertySet aDocProp = (XPropertySet) UnoRuntime.queryInterface( 177*b1cdbd2cSJim Jagielski XPropertySet.class, maChartDocument ); 178*b1cdbd2cSJim Jagielski aDocProp.setPropertyValue( "HasMainTitle", new Boolean( true )); 179*b1cdbd2cSJim Jagielski 180*b1cdbd2cSJim Jagielski XShape aTitle = maChartDocument.getTitle(); 181*b1cdbd2cSJim Jagielski XPropertySet aTitleProp = (XPropertySet) UnoRuntime.queryInterface( XPropertySet.class, aTitle ); 182*b1cdbd2cSJim Jagielski 183*b1cdbd2cSJim Jagielski // set new text 184*b1cdbd2cSJim Jagielski if( aTitleProp != null ) 185*b1cdbd2cSJim Jagielski { 186*b1cdbd2cSJim Jagielski aTitleProp.setPropertyValue( "String", "Bar Chart in a Draw Document" ); 187*b1cdbd2cSJim Jagielski } 188*b1cdbd2cSJim Jagielski } 189*b1cdbd2cSJim Jagielski 190*b1cdbd2cSJim Jagielski // ____________________ 191*b1cdbd2cSJim Jagielski testLegend()192*b1cdbd2cSJim Jagielski public void testLegend() 193*b1cdbd2cSJim Jagielski throws RuntimeException, UnknownPropertyException, PropertyVetoException, 194*b1cdbd2cSJim Jagielski com.sun.star.lang.IllegalArgumentException, WrappedTargetException 195*b1cdbd2cSJim Jagielski { 196*b1cdbd2cSJim Jagielski XShape aLegend = maChartDocument.getLegend(); 197*b1cdbd2cSJim Jagielski XPropertySet aLegendProp = (XPropertySet) UnoRuntime.queryInterface( XPropertySet.class, aLegend ); 198*b1cdbd2cSJim Jagielski 199*b1cdbd2cSJim Jagielski aLegendProp.setPropertyValue( "Alignment", ChartLegendPosition.LEFT ); 200*b1cdbd2cSJim Jagielski aLegendProp.setPropertyValue( "FillStyle", FillStyle.SOLID ); 201*b1cdbd2cSJim Jagielski aLegendProp.setPropertyValue( "FillColor", new Integer( 0xeeddee )); 202*b1cdbd2cSJim Jagielski } 203*b1cdbd2cSJim Jagielski 204*b1cdbd2cSJim Jagielski // ____________________ 205*b1cdbd2cSJim Jagielski testThreeD()206*b1cdbd2cSJim Jagielski public void testThreeD() 207*b1cdbd2cSJim Jagielski throws RuntimeException, UnknownPropertyException, PropertyVetoException, 208*b1cdbd2cSJim Jagielski com.sun.star.lang.IllegalArgumentException, WrappedTargetException, 209*b1cdbd2cSJim Jagielski com.sun.star.lang.IndexOutOfBoundsException 210*b1cdbd2cSJim Jagielski { 211*b1cdbd2cSJim Jagielski XPropertySet aDiaProp = (XPropertySet) UnoRuntime.queryInterface( XPropertySet.class, maDiagram ); 212*b1cdbd2cSJim Jagielski Boolean aTrue = new Boolean( true ); 213*b1cdbd2cSJim Jagielski 214*b1cdbd2cSJim Jagielski aDiaProp.setPropertyValue( "Dim3D", aTrue ); 215*b1cdbd2cSJim Jagielski aDiaProp.setPropertyValue( "Deep", aTrue ); 216*b1cdbd2cSJim Jagielski // from Chart3DBarProperties: 217*b1cdbd2cSJim Jagielski aDiaProp.setPropertyValue( "SolidType", new Integer( ChartSolidType.CYLINDER )); 218*b1cdbd2cSJim Jagielski 219*b1cdbd2cSJim Jagielski // change floor color to Magenta6 220*b1cdbd2cSJim Jagielski XPropertySet aFloor = ((X3DDisplay) UnoRuntime.queryInterface( 221*b1cdbd2cSJim Jagielski X3DDisplay.class, maDiagram )).getFloor(); 222*b1cdbd2cSJim Jagielski aFloor.setPropertyValue( "FillColor", new Integer( 0x6b2394 )); 223*b1cdbd2cSJim Jagielski 224*b1cdbd2cSJim Jagielski // apply changes to get a 3d scene 225*b1cdbd2cSJim Jagielski unlockControllers(); 226*b1cdbd2cSJim Jagielski lockControllers(); 227*b1cdbd2cSJim Jagielski 228*b1cdbd2cSJim Jagielski 229*b1cdbd2cSJim Jagielski // rotate scene to a different angle 230*b1cdbd2cSJim Jagielski HomogenMatrix aMatrix = new HomogenMatrix(); 231*b1cdbd2cSJim Jagielski HomogenMatrixLine aLines[] = new HomogenMatrixLine[] 232*b1cdbd2cSJim Jagielski { 233*b1cdbd2cSJim Jagielski new HomogenMatrixLine( 1.0, 0.0, 0.0, 0.0 ), 234*b1cdbd2cSJim Jagielski new HomogenMatrixLine( 0.0, 1.0, 0.0, 0.0 ), 235*b1cdbd2cSJim Jagielski new HomogenMatrixLine( 0.0, 0.0, 1.0, 0.0 ), 236*b1cdbd2cSJim Jagielski new HomogenMatrixLine( 0.0, 0.0, 0.0, 1.0 ) 237*b1cdbd2cSJim Jagielski }; 238*b1cdbd2cSJim Jagielski 239*b1cdbd2cSJim Jagielski aMatrix.Line1 = aLines[ 0 ]; 240*b1cdbd2cSJim Jagielski aMatrix.Line2 = aLines[ 1 ]; 241*b1cdbd2cSJim Jagielski aMatrix.Line3 = aLines[ 2 ]; 242*b1cdbd2cSJim Jagielski aMatrix.Line4 = aLines[ 3 ]; 243*b1cdbd2cSJim Jagielski 244*b1cdbd2cSJim Jagielski // rotate 10 degrees along the x axis 245*b1cdbd2cSJim Jagielski double fAngle = 10.0; 246*b1cdbd2cSJim Jagielski double fCosX = java.lang.Math.cos( java.lang.Math.PI / 180.0 * fAngle ); 247*b1cdbd2cSJim Jagielski double fSinX = java.lang.Math.sin( java.lang.Math.PI / 180.0 * fAngle ); 248*b1cdbd2cSJim Jagielski 249*b1cdbd2cSJim Jagielski // rotate -20 degrees along the y axis 250*b1cdbd2cSJim Jagielski fAngle = -20.0; 251*b1cdbd2cSJim Jagielski double fCosY = java.lang.Math.cos( java.lang.Math.PI / 180.0 * fAngle ); 252*b1cdbd2cSJim Jagielski double fSinY = java.lang.Math.sin( java.lang.Math.PI / 180.0 * fAngle ); 253*b1cdbd2cSJim Jagielski 254*b1cdbd2cSJim Jagielski // rotate -5 degrees along the z axis 255*b1cdbd2cSJim Jagielski fAngle = -5.0; 256*b1cdbd2cSJim Jagielski double fCosZ = java.lang.Math.cos( java.lang.Math.PI / 180.0 * fAngle ); 257*b1cdbd2cSJim Jagielski double fSinZ = java.lang.Math.sin( java.lang.Math.PI / 180.0 * fAngle ); 258*b1cdbd2cSJim Jagielski 259*b1cdbd2cSJim Jagielski aMatrix.Line1.Column1 = fCosY * fCosZ; 260*b1cdbd2cSJim Jagielski aMatrix.Line1.Column2 = fCosY * -fSinZ; 261*b1cdbd2cSJim Jagielski aMatrix.Line1.Column3 = fSinY; 262*b1cdbd2cSJim Jagielski 263*b1cdbd2cSJim Jagielski aMatrix.Line2.Column1 = fSinX * fSinY * fCosZ + fCosX * fSinZ; 264*b1cdbd2cSJim Jagielski aMatrix.Line2.Column2 = -fSinX * fSinY * fSinZ + fCosX * fCosZ; 265*b1cdbd2cSJim Jagielski aMatrix.Line2.Column3 = -fSinX * fCosY; 266*b1cdbd2cSJim Jagielski 267*b1cdbd2cSJim Jagielski aMatrix.Line3.Column1 = -fCosX * fSinY * fCosZ + fSinX * fSinZ; 268*b1cdbd2cSJim Jagielski aMatrix.Line3.Column2 = fCosX * fSinY * fSinZ + fSinX * fCosZ; 269*b1cdbd2cSJim Jagielski aMatrix.Line3.Column3 = fCosX * fCosY; 270*b1cdbd2cSJim Jagielski 271*b1cdbd2cSJim Jagielski aDiaProp.setPropertyValue( "D3DTransformMatrix", aMatrix ); 272*b1cdbd2cSJim Jagielski 273*b1cdbd2cSJim Jagielski // add a red light source 274*b1cdbd2cSJim Jagielski 275*b1cdbd2cSJim Jagielski // in a chart by default only the second (non-specular) light source is switched on 276*b1cdbd2cSJim Jagielski // light source 1 is a specular light source 277*b1cdbd2cSJim Jagielski aDiaProp.setPropertyValue( "D3DSceneLightColor1", new Integer( 0xff3333 )); 278*b1cdbd2cSJim Jagielski 279*b1cdbd2cSJim Jagielski // set direction 280*b1cdbd2cSJim Jagielski com.sun.star.drawing.Direction3D aDirection = new com.sun.star.drawing.Direction3D(); 281*b1cdbd2cSJim Jagielski 282*b1cdbd2cSJim Jagielski aDirection.DirectionX = -0.75; 283*b1cdbd2cSJim Jagielski aDirection.DirectionY = 0.5; 284*b1cdbd2cSJim Jagielski aDirection.DirectionZ = 0.5; 285*b1cdbd2cSJim Jagielski 286*b1cdbd2cSJim Jagielski aDiaProp.setPropertyValue( "D3DSceneLightDirection1", aDirection ); 287*b1cdbd2cSJim Jagielski aDiaProp.setPropertyValue( "D3DSceneLightOn1", new Boolean( true )); 288*b1cdbd2cSJim Jagielski } 289*b1cdbd2cSJim Jagielski 290*b1cdbd2cSJim Jagielski // ______________________________ 291*b1cdbd2cSJim Jagielski // 292*b1cdbd2cSJim Jagielski // private members 293*b1cdbd2cSJim Jagielski // ______________________________ 294*b1cdbd2cSJim Jagielski 295*b1cdbd2cSJim Jagielski private XChartDocument maChartDocument; 296*b1cdbd2cSJim Jagielski private XDiagram maDiagram; 297*b1cdbd2cSJim Jagielski } 298