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 package fvt.uno.sd.chart;
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski import static org.junit.Assert.assertEquals;
24*b1cdbd2cSJim Jagielski 
25*b1cdbd2cSJim Jagielski import org.junit.After;
26*b1cdbd2cSJim Jagielski import org.junit.Before;
27*b1cdbd2cSJim Jagielski import org.junit.Test;
28*b1cdbd2cSJim Jagielski import org.openoffice.test.common.FileUtil;
29*b1cdbd2cSJim Jagielski import org.openoffice.test.common.Testspace;
30*b1cdbd2cSJim Jagielski import org.openoffice.test.uno.UnoApp;
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski import testlib.uno.ChartUtil;
33*b1cdbd2cSJim Jagielski import testlib.uno.PageUtil;
34*b1cdbd2cSJim Jagielski import testlib.uno.ShapeUtil;
35*b1cdbd2cSJim Jagielski import testlib.uno.TestUtil;
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski import com.sun.star.awt.FontRelief;
38*b1cdbd2cSJim Jagielski import com.sun.star.awt.FontUnderline;
39*b1cdbd2cSJim Jagielski import com.sun.star.awt.FontWeight;
40*b1cdbd2cSJim Jagielski import com.sun.star.awt.Gradient;
41*b1cdbd2cSJim Jagielski import com.sun.star.awt.GradientStyle;
42*b1cdbd2cSJim Jagielski import com.sun.star.awt.Point;
43*b1cdbd2cSJim Jagielski import com.sun.star.awt.Size;
44*b1cdbd2cSJim Jagielski import com.sun.star.beans.PropertyValue;
45*b1cdbd2cSJim Jagielski import com.sun.star.beans.XPropertySet;
46*b1cdbd2cSJim Jagielski import com.sun.star.chart.ChartDataCaption;
47*b1cdbd2cSJim Jagielski import com.sun.star.chart.ChartLegendPosition;
48*b1cdbd2cSJim Jagielski import com.sun.star.chart.XAxisYSupplier;
49*b1cdbd2cSJim Jagielski import com.sun.star.chart.XChartData;
50*b1cdbd2cSJim Jagielski import com.sun.star.chart.XChartDataArray;
51*b1cdbd2cSJim Jagielski import com.sun.star.chart.XChartDocument;
52*b1cdbd2cSJim Jagielski import com.sun.star.chart.XDiagram;
53*b1cdbd2cSJim Jagielski import com.sun.star.chart2.data.XDataSource;
54*b1cdbd2cSJim Jagielski import com.sun.star.chart2.data.XLabeledDataSequence;
55*b1cdbd2cSJim Jagielski import com.sun.star.drawing.DashStyle;
56*b1cdbd2cSJim Jagielski import com.sun.star.drawing.FillStyle;
57*b1cdbd2cSJim Jagielski import com.sun.star.drawing.LineDash;
58*b1cdbd2cSJim Jagielski import com.sun.star.drawing.LineStyle;
59*b1cdbd2cSJim Jagielski import com.sun.star.drawing.XDrawPage;
60*b1cdbd2cSJim Jagielski import com.sun.star.drawing.XDrawPages;
61*b1cdbd2cSJim Jagielski import com.sun.star.drawing.XDrawPagesSupplier;
62*b1cdbd2cSJim Jagielski import com.sun.star.drawing.XShape;
63*b1cdbd2cSJim Jagielski import com.sun.star.drawing.XShapes;
64*b1cdbd2cSJim Jagielski import com.sun.star.frame.XStorable;
65*b1cdbd2cSJim Jagielski import com.sun.star.lang.XComponent;
66*b1cdbd2cSJim Jagielski import com.sun.star.presentation.XPresentation;
67*b1cdbd2cSJim Jagielski import com.sun.star.presentation.XPresentationSupplier;
68*b1cdbd2cSJim Jagielski import com.sun.star.uno.AnyConverter;
69*b1cdbd2cSJim Jagielski import com.sun.star.uno.UnoRuntime;
70*b1cdbd2cSJim Jagielski import com.sun.star.util.XCloseable;
71*b1cdbd2cSJim Jagielski import com.sun.star.util.XModifiable;
72*b1cdbd2cSJim Jagielski 
73*b1cdbd2cSJim Jagielski public class ChartData {
74*b1cdbd2cSJim Jagielski 	UnoApp unoApp = new UnoApp();
75*b1cdbd2cSJim Jagielski 	XPresentationSupplier sdDocument = null;
76*b1cdbd2cSJim Jagielski 	XPresentation pre = null;
77*b1cdbd2cSJim Jagielski 	XComponent precomp = null;
78*b1cdbd2cSJim Jagielski 	XComponent impressDocument = null;
79*b1cdbd2cSJim Jagielski 	XComponent reLoadFile = null;
80*b1cdbd2cSJim Jagielski 	XDrawPagesSupplier drawsupplier = null;
81*b1cdbd2cSJim Jagielski 	XDrawPages drawpages = null;
82*b1cdbd2cSJim Jagielski 	XShapes xShapes = null;
83*b1cdbd2cSJim Jagielski 	XDrawPage xpage = null;
84*b1cdbd2cSJim Jagielski 	String filePath = null;
85*b1cdbd2cSJim Jagielski 	XChartDocument xChartDoc = null;
86*b1cdbd2cSJim Jagielski 	com.sun.star.chart2.XChartDocument xChart2Doc = null;
87*b1cdbd2cSJim Jagielski 
88*b1cdbd2cSJim Jagielski 	@Before
setUp()89*b1cdbd2cSJim Jagielski 	public void setUp() throws Exception {
90*b1cdbd2cSJim Jagielski 		unoApp.start();
91*b1cdbd2cSJim Jagielski 		createDocumentAndSlide();
92*b1cdbd2cSJim Jagielski 	}
93*b1cdbd2cSJim Jagielski 
94*b1cdbd2cSJim Jagielski 	@After
tearDown()95*b1cdbd2cSJim Jagielski 	public void tearDown() throws Exception {
96*b1cdbd2cSJim Jagielski 		unoApp.closeDocument(impressDocument);
97*b1cdbd2cSJim Jagielski 		unoApp.closeDocument(reLoadFile);
98*b1cdbd2cSJim Jagielski 		unoApp.close();
99*b1cdbd2cSJim Jagielski 		 if (filePath != null)
100*b1cdbd2cSJim Jagielski 		 FileUtil.deleteFile(filePath);
101*b1cdbd2cSJim Jagielski 	}
102*b1cdbd2cSJim Jagielski 
103*b1cdbd2cSJim Jagielski 	/**
104*b1cdbd2cSJim Jagielski 	 * create a new presentation document and insert a new slide.
105*b1cdbd2cSJim Jagielski 	 *
106*b1cdbd2cSJim Jagielski 	 * @throws Exception
107*b1cdbd2cSJim Jagielski 	 */
createDocumentAndSlide()108*b1cdbd2cSJim Jagielski 	public void createDocumentAndSlide() throws Exception {
109*b1cdbd2cSJim Jagielski 		impressDocument = (XComponent) UnoRuntime.queryInterface(
110*b1cdbd2cSJim Jagielski 				XComponent.class, unoApp.newDocument("simpress"));
111*b1cdbd2cSJim Jagielski 		drawsupplier = (XDrawPagesSupplier) UnoRuntime.queryInterface(
112*b1cdbd2cSJim Jagielski 				XDrawPagesSupplier.class, impressDocument);
113*b1cdbd2cSJim Jagielski 		drawpages = drawsupplier.getDrawPages();
114*b1cdbd2cSJim Jagielski 		drawpages.insertNewByIndex(1);
115*b1cdbd2cSJim Jagielski 		xpage = PageUtil.getDrawPageByIndex(impressDocument, 1);
116*b1cdbd2cSJim Jagielski 	}
117*b1cdbd2cSJim Jagielski 
118*b1cdbd2cSJim Jagielski 	/**
119*b1cdbd2cSJim Jagielski 	 * Insert default Column Chart to slide.
120*b1cdbd2cSJim Jagielski 	 *
121*b1cdbd2cSJim Jagielski 	 * @return
122*b1cdbd2cSJim Jagielski 	 * @throws Exception
123*b1cdbd2cSJim Jagielski 	 */
insertDefaultChart()124*b1cdbd2cSJim Jagielski 	public XChartDocument insertDefaultChart() throws Exception {
125*b1cdbd2cSJim Jagielski 		Point po = new Point(1000, 1000);
126*b1cdbd2cSJim Jagielski 		xShapes = (XShapes) UnoRuntime.queryInterface(XShapes.class, xpage);
127*b1cdbd2cSJim Jagielski 		XShape xShape = ShapeUtil.createShape(impressDocument, po, new Size(
128*b1cdbd2cSJim Jagielski 				15000, 9271), "com.sun.star.drawing.OLE2Shape");
129*b1cdbd2cSJim Jagielski 		xShapes.add(xShape);
130*b1cdbd2cSJim Jagielski 		xChartDoc = ChartUtil.retrieveChartDocument(xShape);
131*b1cdbd2cSJim Jagielski 		return xChartDoc;
132*b1cdbd2cSJim Jagielski 	}
133*b1cdbd2cSJim Jagielski 
134*b1cdbd2cSJim Jagielski 	/**
135*b1cdbd2cSJim Jagielski 	 * test data series
136*b1cdbd2cSJim Jagielski 	 * @throws Exception
137*b1cdbd2cSJim Jagielski 	 */
138*b1cdbd2cSJim Jagielski 	@Test
testDataSeries()139*b1cdbd2cSJim Jagielski 	public void testDataSeries() throws Exception {
140*b1cdbd2cSJim Jagielski 		XShape xShape = null;
141*b1cdbd2cSJim Jagielski 		insertDefaultChart();
142*b1cdbd2cSJim Jagielski 		// get the second data series.
143*b1cdbd2cSJim Jagielski 		XPropertySet aDiaProp = (XPropertySet) UnoRuntime.queryInterface(
144*b1cdbd2cSJim Jagielski 				XPropertySet.class, xChartDoc.getDiagram()
145*b1cdbd2cSJim Jagielski 						.getDataRowProperties(1));
146*b1cdbd2cSJim Jagielski 		aDiaProp.setPropertyValue("FillStyle", FillStyle.SOLID);
147*b1cdbd2cSJim Jagielski 		aDiaProp.setPropertyValue("FillColor", 0xffff00);
148*b1cdbd2cSJim Jagielski 		// --------------------------
149*b1cdbd2cSJim Jagielski 		xShape = saveAndLoadShape(1, 0);
150*b1cdbd2cSJim Jagielski 		xChartDoc = ChartUtil.getChartDocument(xShape);
151*b1cdbd2cSJim Jagielski 		aDiaProp = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class,
152*b1cdbd2cSJim Jagielski 				xChartDoc.getDiagram().getDataRowProperties(1));
153*b1cdbd2cSJim Jagielski 		assertEquals("the second DataSeries fill color isn't yellow", 0xffff00,
154*b1cdbd2cSJim Jagielski 				aDiaProp.getPropertyValue("FillColor"));
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski 	}
157*b1cdbd2cSJim Jagielski 	/**
158*b1cdbd2cSJim Jagielski 	 * test data point
159*b1cdbd2cSJim Jagielski 	 * @throws Exception
160*b1cdbd2cSJim Jagielski 	 */
161*b1cdbd2cSJim Jagielski 	@Test
testDataPoint()162*b1cdbd2cSJim Jagielski 	public void testDataPoint() throws Exception {
163*b1cdbd2cSJim Jagielski 		XShape xShape = null;
164*b1cdbd2cSJim Jagielski 		insertDefaultChart();
165*b1cdbd2cSJim Jagielski 		// set data label to the fourth points, the second series.
166*b1cdbd2cSJim Jagielski 		XPropertySet aDiaProp = (XPropertySet) UnoRuntime.queryInterface(
167*b1cdbd2cSJim Jagielski 				XPropertySet.class, xChartDoc.getDiagram()
168*b1cdbd2cSJim Jagielski 						.getDataPointProperties(3, 1));
169*b1cdbd2cSJim Jagielski 		aDiaProp.setPropertyValue("FillStyle", FillStyle.SOLID);
170*b1cdbd2cSJim Jagielski 		aDiaProp.setPropertyValue("FillColor", 0xffff00);
171*b1cdbd2cSJim Jagielski 		// --------------------------
172*b1cdbd2cSJim Jagielski 		xShape = saveAndLoadShape(1, 0);
173*b1cdbd2cSJim Jagielski 		xChartDoc = ChartUtil.getChartDocument(xShape);
174*b1cdbd2cSJim Jagielski 		aDiaProp = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class,
175*b1cdbd2cSJim Jagielski 				xChartDoc.getDiagram().getDataPointProperties(3, 1));
176*b1cdbd2cSJim Jagielski 
177*b1cdbd2cSJim Jagielski 		assertEquals(
178*b1cdbd2cSJim Jagielski 				"the fourth point of the second series's fill color isn't yellow",
179*b1cdbd2cSJim Jagielski 				0xffff00, aDiaProp.getPropertyValue("FillColor"));
180*b1cdbd2cSJim Jagielski 
181*b1cdbd2cSJim Jagielski 	}
182*b1cdbd2cSJim Jagielski 	/**
183*b1cdbd2cSJim Jagielski 	 * test data of chart, update it with chart
184*b1cdbd2cSJim Jagielski 	 * @throws Exception
185*b1cdbd2cSJim Jagielski 	 */
186*b1cdbd2cSJim Jagielski 	@Test
testDataTable()187*b1cdbd2cSJim Jagielski 	public void testDataTable() throws Exception {
188*b1cdbd2cSJim Jagielski 		XShape xShape = null;
189*b1cdbd2cSJim Jagielski 		insertDefaultChart();
190*b1cdbd2cSJim Jagielski 		// get data object from chart
191*b1cdbd2cSJim Jagielski 		XChartDataArray array = (XChartDataArray) UnoRuntime.queryInterface(
192*b1cdbd2cSJim Jagielski 				XChartDataArray.class, xChartDoc.getData());
193*b1cdbd2cSJim Jagielski 
194*b1cdbd2cSJim Jagielski 		// set new chart data
195*b1cdbd2cSJim Jagielski 		double[][] data = new double[][] { { 2, 2 }, { 2, 2 }, { 2, 2 } };
196*b1cdbd2cSJim Jagielski 		array.setData(data);
197*b1cdbd2cSJim Jagielski 		// update chart with data
198*b1cdbd2cSJim Jagielski 		xChartDoc.attachData(xChartDoc.getData());
199*b1cdbd2cSJim Jagielski 		// --------------------------
200*b1cdbd2cSJim Jagielski 		xShape = saveAndLoadShape(1, 0);
201*b1cdbd2cSJim Jagielski 		xChartDoc = ChartUtil.getChartDocument(xShape);
202*b1cdbd2cSJim Jagielski 		array = (XChartDataArray) UnoRuntime.queryInterface(
203*b1cdbd2cSJim Jagielski 				XChartDataArray.class, xChartDoc.getData());
204*b1cdbd2cSJim Jagielski 		data = array.getData();
205*b1cdbd2cSJim Jagielski 		assertEquals(2, data[0][0], 0.0);
206*b1cdbd2cSJim Jagielski 
207*b1cdbd2cSJim Jagielski 	}
208*b1cdbd2cSJim Jagielski 
209*b1cdbd2cSJim Jagielski 	/**
210*b1cdbd2cSJim Jagielski 	 * Save presentation and reLoad the presentation and shape in it.
211*b1cdbd2cSJim Jagielski 	 *
212*b1cdbd2cSJim Jagielski 	 * @param po
213*b1cdbd2cSJim Jagielski 	 * @param shapeType
214*b1cdbd2cSJim Jagielski 	 * @return
215*b1cdbd2cSJim Jagielski 	 * @throws Exception
216*b1cdbd2cSJim Jagielski 	 */
saveAndLoadShape(int pageIndex, int shapeIndex)217*b1cdbd2cSJim Jagielski 	public XShape saveAndLoadShape(int pageIndex, int shapeIndex)
218*b1cdbd2cSJim Jagielski 			throws Exception {
219*b1cdbd2cSJim Jagielski 		reLoadFile = saveAsAndReloadDoc(impressDocument, "impress8", "odp");
220*b1cdbd2cSJim Jagielski 		xShapes = ShapeUtil.getShapes(reLoadFile, pageIndex);
221*b1cdbd2cSJim Jagielski 		return (XShape) UnoRuntime.queryInterface(XShape.class,
222*b1cdbd2cSJim Jagielski 				xShapes.getByIndex(shapeIndex));
223*b1cdbd2cSJim Jagielski 	}
224*b1cdbd2cSJim Jagielski 
225*b1cdbd2cSJim Jagielski 	/**
226*b1cdbd2cSJim Jagielski 	 * save and reload Presentation document.
227*b1cdbd2cSJim Jagielski 	 *
228*b1cdbd2cSJim Jagielski 	 * @param presentationDocument
229*b1cdbd2cSJim Jagielski 	 * @param sFilter
230*b1cdbd2cSJim Jagielski 	 * @param sExtension
231*b1cdbd2cSJim Jagielski 	 * @return
232*b1cdbd2cSJim Jagielski 	 * @throws Exception
233*b1cdbd2cSJim Jagielski 	 */
saveAsAndReloadDoc(XComponent presentationDocument, String sFilter, String sExtension)234*b1cdbd2cSJim Jagielski 	private XComponent saveAsAndReloadDoc(XComponent presentationDocument,
235*b1cdbd2cSJim Jagielski 			String sFilter, String sExtension) throws Exception {
236*b1cdbd2cSJim Jagielski 		filePath = Testspace.getPath("tmp/chartdata." + sExtension);
237*b1cdbd2cSJim Jagielski 		PropertyValue[] aStoreProperties = new PropertyValue[2];
238*b1cdbd2cSJim Jagielski 		aStoreProperties[0] = new PropertyValue();
239*b1cdbd2cSJim Jagielski 		aStoreProperties[1] = new PropertyValue();
240*b1cdbd2cSJim Jagielski 		aStoreProperties[0].Name = "Override";
241*b1cdbd2cSJim Jagielski 		aStoreProperties[0].Value = true;
242*b1cdbd2cSJim Jagielski 		aStoreProperties[1].Name = "FilterName";
243*b1cdbd2cSJim Jagielski 		aStoreProperties[1].Value = sFilter;
244*b1cdbd2cSJim Jagielski 		XStorable xStorable = (XStorable) UnoRuntime.queryInterface(
245*b1cdbd2cSJim Jagielski 				XStorable.class, presentationDocument);
246*b1cdbd2cSJim Jagielski 		xStorable.storeToURL(FileUtil.getUrl(filePath), aStoreProperties);
247*b1cdbd2cSJim Jagielski 
248*b1cdbd2cSJim Jagielski 		return (XComponent) UnoRuntime.queryInterface(XComponent.class,
249*b1cdbd2cSJim Jagielski 				unoApp.loadDocument(filePath));
250*b1cdbd2cSJim Jagielski 	}
251*b1cdbd2cSJim Jagielski 
252*b1cdbd2cSJim Jagielski }
253