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