Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*
3 : : * This file is part of the LibreOffice project.
4 : : *
5 : : * This Source Code Form is subject to the terms of the Mozilla Public
6 : : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : : *
9 : : * This file incorporates work covered by the following license notice:
10 : : *
11 : : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : : * contributor license agreements. See the NOTICE file distributed
13 : : * with this work for additional information regarding copyright
14 : : * ownership. The ASF licenses this file to you under the Apache
15 : : * License, Version 2.0 (the "License"); you may not use this file
16 : : * except in compliance with the License. You may obtain a copy of
17 : : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : : */
19 : :
20 : :
21 : : #include "ChartTypeHelper.hxx"
22 : : #include "DiagramHelper.hxx"
23 : : #include "DataSeriesHelper.hxx"
24 : : #include "macros.hxx"
25 : : #include "servicenames_charttypes.hxx"
26 : :
27 : : #include <com/sun/star/beans/XPropertySet.hpp>
28 : : #include <com/sun/star/chart/DataLabelPlacement.hpp>
29 : : #include <com/sun/star/chart2/XDataSeriesContainer.hpp>
30 : : #include <com/sun/star/chart/MissingValueTreatment.hpp>
31 : :
32 : : //.............................................................................
33 : : using namespace ::com::sun::star;
34 : : using namespace ::com::sun::star::chart2;
35 : :
36 : : //.............................................................................
37 : : namespace chart
38 : : {
39 : :
40 : 0 : bool ChartTypeHelper::isSupportingAxisSideBySide(
41 : : const uno::Reference< chart2::XChartType >& xChartType, sal_Int32 nDimensionCount )
42 : : {
43 : 0 : bool bResult = false;
44 : :
45 [ # # ][ # # ]: 0 : if( xChartType.is() &&
[ # # ]
46 : : nDimensionCount < 3 )
47 : : {
48 : 0 : bool bFound=false;
49 : 0 : bool bAmbiguous=false;
50 [ # # ][ # # ]: 0 : StackMode eStackMode = DiagramHelper::getStackModeFromChartType( xChartType, bFound, bAmbiguous, 0 );
51 [ # # ][ # # ]: 0 : if( eStackMode == StackMode_NONE && !bAmbiguous )
52 : : {
53 [ # # ][ # # ]: 0 : rtl::OUString aChartTypeName = xChartType->getChartType();
54 [ # # ][ # # ]: 0 : bResult = ( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_COLUMN) ||
[ # # ]
55 [ # # ][ # # ]: 0 : aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_BAR) );
[ # # ][ # # ]
[ # # ]
56 : : }
57 : : }
58 : :
59 : 0 : return bResult;
60 : : }
61 : :
62 : 0 : sal_Bool ChartTypeHelper::isSupportingGeometryProperties( const uno::Reference< XChartType >& xChartType, sal_Int32 nDimensionCount )
63 : : {
64 : : //form tab only for 3D-bar and 3D-column charts.
65 : :
66 : : //@todo ask charttype itself --> need model change first
67 [ # # ]: 0 : if(xChartType.is())
68 : : {
69 [ # # ]: 0 : if(nDimensionCount==3)
70 : : {
71 [ # # ][ # # ]: 0 : rtl::OUString aChartTypeName = xChartType->getChartType();
72 [ # # ][ # # ]: 0 : if( aChartTypeName.equals(CHART2_SERVICE_NAME_CHARTTYPE_BAR) )
73 : 0 : return sal_True;
74 [ # # ][ # # ]: 0 : if( aChartTypeName.equals(CHART2_SERVICE_NAME_CHARTTYPE_COLUMN) )
75 [ # # ]: 0 : return sal_True;
76 : : }
77 : : }
78 : 0 : return sal_False;
79 : : }
80 : :
81 : 16018 : sal_Bool ChartTypeHelper::isSupportingStatisticProperties( const uno::Reference< XChartType >& xChartType, sal_Int32 nDimensionCount )
82 : : {
83 : : //3D charts, pie, net and stock do not support statistic properties
84 : :
85 : : //@todo ask charttype itself (and series? --> stock chart?) --> need model change first
86 [ + + ]: 16018 : if(xChartType.is())
87 : : {
88 [ + + ]: 15982 : if(nDimensionCount==3)
89 : 88 : return sal_False;
90 : :
91 [ + - ][ + - ]: 15894 : rtl::OUString aChartTypeName = xChartType->getChartType();
92 [ + - ][ + + ]: 15894 : if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_PIE) )
93 : 78 : return sal_False;
94 [ + - ][ - + ]: 15816 : if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_NET) )
95 : 0 : return sal_False;
96 [ + - ][ - + ]: 15816 : if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_FILLED_NET) )
97 : 0 : return sal_False;
98 [ + - ][ + + ]: 15816 : if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_CANDLESTICK) )
99 : 20 : return sal_False;
100 [ + - ][ - + ]: 15796 : if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_BUBBLE) ) //todo: BubbleChart support error bars and trend lines
101 [ + + ]: 15982 : return sal_False;
102 : : }
103 : 16018 : return sal_True;
104 : : }
105 : :
106 : 0 : sal_Bool ChartTypeHelper::isSupportingRegressionProperties( const uno::Reference< XChartType >& xChartType, sal_Int32 nDimensionCount )
107 : : {
108 : : // note: old chart: only scatter chart
109 : 0 : return isSupportingStatisticProperties( xChartType, nDimensionCount );
110 : : }
111 : :
112 : 498 : sal_Bool ChartTypeHelper::isSupportingAreaProperties( const uno::Reference< XChartType >& xChartType, sal_Int32 nDimensionCount )
113 : : {
114 : : //2D line charts, net and stock do not support area properties
115 : :
116 : : //@todo ask charttype itself --> need model change first
117 [ + - ]: 498 : if(xChartType.is())
118 : : {
119 [ + - ]: 498 : if(nDimensionCount==2)
120 : : {
121 [ + - ][ + - ]: 498 : rtl::OUString aChartTypeName = xChartType->getChartType();
122 [ + - ][ - + ]: 498 : if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_LINE) )
123 : 0 : return sal_False;
124 [ + - ][ - + ]: 498 : if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_SCATTER) )
125 : 0 : return sal_False;
126 [ + - ][ - + ]: 498 : if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_NET) )
127 : 0 : return sal_False;
128 [ + - ][ - + ]: 498 : if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_CANDLESTICK) )
129 [ + - ]: 498 : return sal_False;
130 : : }
131 : : }
132 : 498 : return sal_True;
133 : : }
134 : :
135 : 146 : sal_Bool ChartTypeHelper::isSupportingSymbolProperties( const uno::Reference< XChartType >& xChartType, sal_Int32 nDimensionCount )
136 : : {
137 : : //2D line charts, 2D scatter charts and 2D net charts do support symbols
138 : :
139 : : //@todo ask charttype itself --> need model change first
140 [ + - ]: 146 : if(xChartType.is())
141 : : {
142 [ + + ]: 146 : if(nDimensionCount==3)
143 : 11 : return sal_False;
144 : :
145 [ + - ][ + - ]: 135 : rtl::OUString aChartTypeName = xChartType->getChartType();
146 [ + - ][ + + ]: 135 : if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_LINE) )
147 : 61 : return sal_True;
148 [ + - ][ - + ]: 74 : if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_SCATTER) )
149 : 0 : return sal_True;
150 [ + - ][ - + ]: 74 : if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_NET) )
151 [ + + ]: 146 : return sal_True;
152 : : }
153 : 146 : return sal_False;
154 : : }
155 : :
156 : 10808 : sal_Bool ChartTypeHelper::isSupportingMainAxis( const uno::Reference< XChartType >& xChartType, sal_Int32 nDimensionCount, sal_Int32 nDimensionIndex )
157 : : {
158 : : //pie charts do not support axis at all
159 : : //no 3rd axis for 2D charts
160 : :
161 : : //@todo ask charttype itself --> need model change first
162 [ + + ]: 10808 : if(xChartType.is())
163 : : {
164 [ + - ][ + - ]: 10696 : rtl::OUString aChartTypeName = xChartType->getChartType();
165 [ + - ][ + + ]: 10696 : if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_PIE) )
166 : 207 : return sal_False;
167 : :
168 [ + + ]: 10489 : if( nDimensionIndex == 2 )
169 [ + + ]: 10696 : return nDimensionCount == 3;
170 : : }
171 : 10808 : return sal_True;
172 : : }
173 : :
174 : 2020 : sal_Bool ChartTypeHelper::isSupportingSecondaryAxis( const uno::Reference< XChartType >& xChartType, sal_Int32 nDimensionCount, sal_Int32 /*nDimensionIndex*/ )
175 : : {
176 : : //3D, pie and net charts do not support a secondary axis at all
177 : :
178 : : //@todo ask charttype itself --> need model change first
179 [ + + ]: 2020 : if(xChartType.is())
180 : : {
181 [ + + ]: 1974 : if(nDimensionCount==3)
182 : 42 : return sal_False;
183 : :
184 [ + - ][ + - ]: 1932 : rtl::OUString aChartTypeName = xChartType->getChartType();
185 [ + - ][ + + ]: 1932 : if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_PIE) )
186 : 40 : return sal_False;
187 [ + - ][ - + ]: 1892 : if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_NET) )
188 : 0 : return sal_False;
189 [ + - ][ - + ]: 1892 : if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_FILLED_NET) )
190 [ + + ]: 1974 : return sal_False;
191 : : }
192 : 2020 : return sal_True;
193 : : }
194 : :
195 : 0 : sal_Bool ChartTypeHelper::isSupportingOverlapAndGapWidthProperties(
196 : : const uno::Reference< XChartType >& xChartType, sal_Int32 nDimensionCount )
197 : : {
198 : : //2D bar charts do support a this special properties
199 : :
200 : : //@todo ask charttype itself --> need model change first
201 [ # # ]: 0 : if(xChartType.is())
202 : : {
203 [ # # ]: 0 : if(nDimensionCount==3)
204 : 0 : return sal_False;
205 : :
206 [ # # ][ # # ]: 0 : rtl::OUString aChartTypeName = xChartType->getChartType();
207 [ # # ][ # # ]: 0 : if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_COLUMN) )
208 : 0 : return sal_True;
209 [ # # ][ # # ]: 0 : if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_BAR) )
210 [ # # ]: 0 : return sal_True;
211 : : }
212 : 0 : return sal_False;
213 : : }
214 : :
215 : 0 : sal_Bool ChartTypeHelper::isSupportingBarConnectors(
216 : : const uno::Reference< chart2::XChartType >& xChartType, sal_Int32 nDimensionCount )
217 : : {
218 : : //2D bar charts with stacked series support this
219 : :
220 : : //@todo ask charttype itself --> need model change first
221 [ # # ]: 0 : if(xChartType.is())
222 : : {
223 [ # # ]: 0 : if(nDimensionCount==3)
224 : 0 : return sal_False;
225 : :
226 : 0 : bool bFound=false;
227 : 0 : bool bAmbiguous=false;
228 [ # # ][ # # ]: 0 : StackMode eStackMode = DiagramHelper::getStackModeFromChartType( xChartType, bFound, bAmbiguous, 0 );
229 [ # # ][ # # ]: 0 : if( eStackMode != StackMode_Y_STACKED || bAmbiguous )
230 : 0 : return sal_False;
231 : :
232 [ # # ][ # # ]: 0 : rtl::OUString aChartTypeName = xChartType->getChartType();
233 [ # # ][ # # ]: 0 : if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_COLUMN) )
234 : 0 : return sal_True;
235 [ # # ][ # # ]: 0 : if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_BAR) )
236 [ # # ]: 0 : return sal_True; // note: old chart was false here
237 : : }
238 : 0 : return sal_False;
239 : : }
240 : :
241 : 2915 : uno::Sequence < sal_Int32 > ChartTypeHelper::getSupportedLabelPlacements( const uno::Reference< chart2::XChartType >& xChartType
242 : : , sal_Int32 nDimensionCount, sal_Bool bSwapXAndY
243 : : , const uno::Reference< chart2::XDataSeries >& xSeries )
244 : : {
245 : : (void)nDimensionCount;
246 : :
247 [ + - ]: 2915 : uno::Sequence < sal_Int32 > aRet;
248 [ + - ]: 2915 : if( !xChartType.is() )
249 : : return aRet;
250 : :
251 [ + - ][ + - ]: 2915 : rtl::OUString aChartTypeName = xChartType->getChartType();
252 [ + - ][ + + ]: 2915 : if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_PIE) )
253 : : {
254 : 12 : bool bDonut = false;
255 [ + - ]: 12 : uno::Reference< beans::XPropertySet > xChartTypeProp( xChartType, uno::UNO_QUERY_THROW );
256 [ + - ]: 12 : if(xChartTypeProp.is())
257 [ + - ][ + - ]: 12 : xChartTypeProp->getPropertyValue( C2U("UseRings")) >>= bDonut;
[ + - ]
258 : :
259 [ + - ]: 12 : if(!bDonut)
260 : : {
261 [ + - ]: 12 : aRet.realloc(4);
262 [ + - ]: 12 : sal_Int32* pSeq = aRet.getArray();
263 : 12 : *pSeq++ = ::com::sun::star::chart::DataLabelPlacement::AVOID_OVERLAP;
264 : 12 : *pSeq++ = ::com::sun::star::chart::DataLabelPlacement::OUTSIDE;
265 : 12 : *pSeq++ = ::com::sun::star::chart::DataLabelPlacement::INSIDE;
266 : 12 : *pSeq++ = ::com::sun::star::chart::DataLabelPlacement::CENTER;
267 : : }
268 : : else
269 : : {
270 [ # # ]: 0 : aRet.realloc(1);
271 [ # # ]: 0 : sal_Int32* pSeq = aRet.getArray();
272 : 0 : *pSeq++ = ::com::sun::star::chart::DataLabelPlacement::CENTER;
273 : 12 : }
274 : : }
275 [ + - ][ + + : 9294 : else if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_SCATTER)
+ + - + ]
[ + - ]
[ + + # # ]
276 [ + - ][ + + ]: 5690 : || aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_LINE)
[ # # ]
277 [ + - ][ + + ]: 3604 : || aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_BUBBLE)
[ # # ]
278 : : )
279 : : {
280 [ + - ]: 2202 : aRet.realloc(5);
281 [ + - ]: 2202 : sal_Int32* pSeq = aRet.getArray();
282 : 2202 : *pSeq++ = ::com::sun::star::chart::DataLabelPlacement::TOP;
283 : 2202 : *pSeq++ = ::com::sun::star::chart::DataLabelPlacement::BOTTOM;
284 : 2202 : *pSeq++ = ::com::sun::star::chart::DataLabelPlacement::LEFT;
285 : 2202 : *pSeq++ = ::com::sun::star::chart::DataLabelPlacement::RIGHT;
286 : 2202 : *pSeq++ = ::com::sun::star::chart::DataLabelPlacement::CENTER;
287 : : }
288 [ + - ]: 1442 : else if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_COLUMN)
[ + + - + ]
[ + - ]
[ + + # # ]
289 [ + - ][ + + ]: 741 : || aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_BAR) )
[ # # ]
290 : : {
291 : :
292 : 661 : bool bStacked = false;
293 : : {
294 [ + - ]: 661 : uno::Reference< beans::XPropertySet > xSeriesProp( xSeries, uno::UNO_QUERY );
295 : 661 : chart2::StackingDirection eStacking = chart2::StackingDirection_NO_STACKING;
296 [ + - ][ + - ]: 661 : xSeriesProp->getPropertyValue( C2U("StackingDirection") ) >>= eStacking;
[ + - ][ + - ]
297 : 661 : bStacked = (chart2::StackingDirection_Y_STACKING == eStacking);
298 : : }
299 : :
300 [ + - ][ - + ]: 661 : aRet.realloc( bStacked ? 3 : 6 );
301 [ + - ]: 661 : sal_Int32* pSeq = aRet.getArray();
302 [ + - ]: 661 : if(!bStacked)
303 : : {
304 [ - + ]: 661 : if(bSwapXAndY)
305 : : {
306 : 0 : *pSeq++ = ::com::sun::star::chart::DataLabelPlacement::RIGHT;
307 : 0 : *pSeq++ = ::com::sun::star::chart::DataLabelPlacement::LEFT;
308 : : }
309 : : else
310 : : {
311 : 661 : *pSeq++ = ::com::sun::star::chart::DataLabelPlacement::TOP;
312 : 661 : *pSeq++ = ::com::sun::star::chart::DataLabelPlacement::BOTTOM;
313 : : }
314 : : }
315 : 661 : *pSeq++ = ::com::sun::star::chart::DataLabelPlacement::CENTER;
316 [ + - ]: 661 : if(!bStacked)
317 : 661 : *pSeq++ = ::com::sun::star::chart::DataLabelPlacement::OUTSIDE;
318 : 661 : *pSeq++ = ::com::sun::star::chart::DataLabelPlacement::INSIDE;
319 : 661 : *pSeq++ = ::com::sun::star::chart::DataLabelPlacement::NEAR_ORIGIN;
320 : : }
321 [ + - ][ - + ]: 40 : else if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_AREA) )
322 : : {
323 [ # # ]: 0 : aRet.realloc(1);
324 [ # # ]: 0 : sal_Int32* pSeq = aRet.getArray();
325 : 0 : *pSeq++ = ::com::sun::star::chart::DataLabelPlacement::TOP;
326 : : }
327 [ + - ][ - + ]: 40 : else if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_NET) )
328 : : {
329 [ # # ]: 0 : aRet.realloc(6);
330 [ # # ]: 0 : sal_Int32* pSeq = aRet.getArray();
331 : 0 : *pSeq++ = ::com::sun::star::chart::DataLabelPlacement::OUTSIDE;
332 : 0 : *pSeq++ = ::com::sun::star::chart::DataLabelPlacement::TOP;
333 : 0 : *pSeq++ = ::com::sun::star::chart::DataLabelPlacement::BOTTOM;
334 : 0 : *pSeq++ = ::com::sun::star::chart::DataLabelPlacement::LEFT;
335 : 0 : *pSeq++ = ::com::sun::star::chart::DataLabelPlacement::RIGHT;
336 : 0 : *pSeq++ = ::com::sun::star::chart::DataLabelPlacement::CENTER;
337 : : }
338 [ + - ][ - + ]: 40 : else if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_FILLED_NET) )
339 : : {
340 [ # # ]: 0 : aRet.realloc(1);
341 [ # # ]: 0 : sal_Int32* pSeq = aRet.getArray();
342 : 0 : *pSeq++ = ::com::sun::star::chart::DataLabelPlacement::OUTSIDE;
343 : : }
344 [ + - ][ + - ]: 40 : else if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_CANDLESTICK) )
345 : : {
346 [ + - ]: 40 : aRet.realloc( 1 );
347 [ + - ]: 40 : sal_Int32* pSeq = aRet.getArray();
348 : 40 : *pSeq++ = ::com::sun::star::chart::DataLabelPlacement::OUTSIDE;
349 : : }
350 : : else
351 : : {
352 : : OSL_FAIL( "unknown charttype" );
353 : : }
354 : :
355 : 2915 : return aRet;
356 : : }
357 : :
358 : 80 : sal_Bool ChartTypeHelper::isSupportingRightAngledAxes( const uno::Reference< chart2::XChartType >& xChartType )
359 : : {
360 [ + - ]: 80 : if(xChartType.is())
361 : : {
362 [ + - ][ + - ]: 80 : rtl::OUString aChartTypeName = xChartType->getChartType();
363 [ + - ][ - + ]: 80 : if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_PIE) )
364 [ + - ]: 80 : return sal_False;
365 : : }
366 : 80 : return sal_True;
367 : : }
368 : :
369 : 0 : bool ChartTypeHelper::isSupportingStartingAngle( const uno::Reference< chart2::XChartType >& xChartType )
370 : : {
371 [ # # ]: 0 : if(xChartType.is())
372 : : {
373 [ # # ][ # # ]: 0 : rtl::OUString aChartTypeName = xChartType->getChartType();
374 [ # # ][ # # ]: 0 : if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_PIE) )
375 [ # # ]: 0 : return true;
376 : : }
377 : 0 : return false;
378 : : }
379 : 0 : bool ChartTypeHelper::isSupportingBaseValue( const uno::Reference< chart2::XChartType >& xChartType )
380 : : {
381 [ # # ]: 0 : if(xChartType.is())
382 : : {
383 [ # # ][ # # ]: 0 : rtl::OUString aChartTypeName = xChartType->getChartType();
384 [ # # ][ # # : 0 : if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_COLUMN)
# # # # ]
[ # # ]
[ # # # # ]
385 [ # # ][ # # ]: 0 : || aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_BAR)
[ # # ]
386 [ # # ][ # # ]: 0 : || aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_AREA)
[ # # ]
387 : : )
388 [ # # ]: 0 : return true;
389 : : }
390 : 0 : return false;
391 : : }
392 : :
393 : 0 : bool ChartTypeHelper::isSupportingAxisPositioning( const uno::Reference< chart2::XChartType >& xChartType, sal_Int32 nDimensionCount, sal_Int32 nDimensionIndex )
394 : : {
395 [ # # ]: 0 : if(xChartType.is())
396 : : {
397 [ # # ][ # # ]: 0 : rtl::OUString aChartTypeName = xChartType->getChartType();
398 [ # # ][ # # ]: 0 : if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_NET) )
399 : 0 : return false;
400 [ # # ][ # # ]: 0 : if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_FILLED_NET) )
401 [ # # ]: 0 : return false;
402 : : }
403 [ # # ]: 0 : if( nDimensionCount==3 )
404 : 0 : return nDimensionIndex<2;
405 : 0 : return true;
406 : : }
407 : :
408 : 8917 : bool ChartTypeHelper::isSupportingDateAxis( const uno::Reference< chart2::XChartType >& xChartType, sal_Int32 /*nDimensionCount*/, sal_Int32 nDimensionIndex )
409 : : {
410 [ + + ]: 8917 : if( nDimensionIndex!=0 )
411 : 998 : return false;
412 [ + + ]: 7919 : if( xChartType.is() )
413 : : {
414 [ + - ]: 7912 : sal_Int32 nType = ChartTypeHelper::getAxisType( xChartType, nDimensionIndex );
415 [ - + ]: 7912 : if( nType != AxisType::CATEGORY )
416 : 0 : return false;
417 [ + - ][ + - ]: 7912 : rtl::OUString aChartTypeName = xChartType->getChartType();
418 [ + - ][ + + ]: 7912 : if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_PIE) )
419 : 71 : return false;
420 [ + - ][ - + ]: 7841 : if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_NET) )
421 : 0 : return false;
422 [ + - ][ - + ]: 7841 : if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_FILLED_NET) )
423 [ + + ]: 7912 : return false;
424 : : }
425 : 8917 : return true;
426 : : }
427 : :
428 : 981 : bool ChartTypeHelper::shiftCategoryPosAtXAxisPerDefault( const uno::Reference< chart2::XChartType >& xChartType )
429 : : {
430 [ + - ]: 981 : if(xChartType.is())
431 : : {
432 [ + - ][ + - ]: 981 : rtl::OUString aChartTypeName = xChartType->getChartType();
433 [ + - ][ + + : 2152 : if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_COLUMN)
+ - + + ]
[ + - ]
[ + + # # ]
434 [ + - ][ + + ]: 1076 : || aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_BAR)
[ # # ]
435 [ + - ][ + + ]: 1076 : || aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_CANDLESTICK) )
[ # # ]
436 [ + + ]: 981 : return true;
437 : : }
438 : 981 : return false;
439 : : }
440 : :
441 : 0 : bool ChartTypeHelper::noBordersForSimpleScheme( const uno::Reference< chart2::XChartType >& xChartType )
442 : : {
443 [ # # ]: 0 : if(xChartType.is())
444 : : {
445 [ # # ][ # # ]: 0 : rtl::OUString aChartTypeName = xChartType->getChartType();
446 [ # # ][ # # ]: 0 : if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_PIE) )
447 [ # # ]: 0 : return sal_True;
448 : : }
449 : 0 : return sal_False;
450 : : }
451 : :
452 : 108 : sal_Int32 ChartTypeHelper::getDefaultDirectLightColor( bool bSimple, const uno::Reference< chart2::XChartType >& xChartType )
453 : : {
454 : 108 : sal_Int32 nRet = static_cast< sal_Int32 >( 0x808080 ); // grey
455 [ + + ]: 108 : if( xChartType .is() )
456 : : {
457 [ + - ][ + - ]: 94 : rtl::OUString aChartType = xChartType->getChartType();
458 [ + - ][ + + ]: 94 : if( aChartType.equals(CHART2_SERVICE_NAME_CHARTTYPE_PIE) )
459 : : {
460 [ - + ]: 4 : if( bSimple )
461 : 0 : nRet = static_cast< sal_Int32 >( 0x333333 ); // grey80
462 : : else
463 : 4 : nRet = static_cast< sal_Int32 >( 0xb3b3b3 ); // grey30
464 : : }
465 [ + - ]: 264 : else if( aChartType.equals(CHART2_SERVICE_NAME_CHARTTYPE_LINE)
[ + + + + ]
[ + - ]
[ + + # # ]
466 [ + - ][ + + ]: 174 : || aChartType.equals(CHART2_SERVICE_NAME_CHARTTYPE_SCATTER) )
[ # # ]
467 : 94 : nRet = static_cast< sal_Int32 >( 0x666666 ); // grey60
468 : : }
469 : 108 : return nRet;
470 : : }
471 : :
472 : 108 : sal_Int32 ChartTypeHelper::getDefaultAmbientLightColor( bool bSimple, const uno::Reference< chart2::XChartType >& xChartType )
473 : : {
474 : 108 : sal_Int32 nRet = static_cast< sal_Int32 >( 0x999999 ); // grey40
475 [ + + ]: 108 : if( xChartType .is() )
476 : : {
477 [ + - ][ + - ]: 94 : rtl::OUString aChartType = xChartType->getChartType();
478 [ + - ][ + + ]: 94 : if( aChartType.equals(CHART2_SERVICE_NAME_CHARTTYPE_PIE) )
479 : : {
480 [ - + ]: 4 : if( bSimple )
481 : 0 : nRet = static_cast< sal_Int32 >( 0xcccccc ); // grey20
482 : : else
483 : 4 : nRet = static_cast< sal_Int32 >( 0x666666 ); // grey60
484 : 94 : }
485 : : }
486 : 108 : return nRet;
487 : : }
488 : :
489 : 14 : drawing::Direction3D ChartTypeHelper::getDefaultSimpleLightDirection( const uno::Reference< chart2::XChartType >& xChartType )
490 : : {
491 : 14 : drawing::Direction3D aRet(0.0, 0.0, 1.0);
492 [ - + ]: 14 : if( xChartType .is() )
493 : : {
494 [ # # ][ # # ]: 0 : rtl::OUString aChartType = xChartType->getChartType();
495 [ # # ][ # # ]: 0 : if( aChartType.equals(CHART2_SERVICE_NAME_CHARTTYPE_PIE) )
496 : 0 : aRet = drawing::Direction3D(0.0, 0.8, 0.5);
497 [ # # ]: 0 : else if( aChartType.equals(CHART2_SERVICE_NAME_CHARTTYPE_LINE)
[ # # # # ]
[ # # ]
[ # # # # ]
498 [ # # ][ # # ]: 0 : || aChartType.equals(CHART2_SERVICE_NAME_CHARTTYPE_SCATTER) )
[ # # ]
499 : 0 : aRet = drawing::Direction3D(0.9, 0.5, 0.05);
500 : : }
501 : 14 : return aRet;
502 : : }
503 : :
504 : 94 : drawing::Direction3D ChartTypeHelper::getDefaultRealisticLightDirection( const uno::Reference< chart2::XChartType >& xChartType )
505 : : {
506 : 94 : drawing::Direction3D aRet(0.0, 0.0, 1.0);
507 [ + - ]: 94 : if( xChartType .is() )
508 : : {
509 [ + - ][ + - ]: 94 : rtl::OUString aChartType = xChartType->getChartType();
510 [ + - ][ + + ]: 94 : if( aChartType.equals(CHART2_SERVICE_NAME_CHARTTYPE_PIE) )
511 : 4 : aRet = drawing::Direction3D(0.6, 0.6, 0.6);
512 [ + - ]: 264 : else if( aChartType.equals(CHART2_SERVICE_NAME_CHARTTYPE_LINE)
[ + + + + ]
[ + - ]
[ + + # # ]
513 [ + - ][ + + ]: 174 : || aChartType.equals(CHART2_SERVICE_NAME_CHARTTYPE_SCATTER) )
[ # # ]
514 : 94 : aRet = drawing::Direction3D(0.9, 0.5, 0.05);
515 : : }
516 : 94 : return aRet;
517 : : }
518 : :
519 : 7912 : sal_Int32 ChartTypeHelper::getAxisType( const uno::Reference<
520 : : XChartType >& xChartType, sal_Int32 nDimensionIndex )
521 : : {
522 : : //retruned is a constant from constant group ::com::sun::star::chart2::AxisType
523 : :
524 : : //@todo ask charttype itself --> need model change first
525 [ - + ]: 7912 : if(!xChartType.is())
526 : 0 : return AxisType::CATEGORY;
527 : :
528 [ + - ][ + - ]: 7912 : rtl::OUString aChartTypeName = xChartType->getChartType();
529 [ - + ]: 7912 : if(2==nDimensionIndex)//z-axis
530 : 0 : return AxisType::SERIES;
531 [ - + ]: 7912 : if(1==nDimensionIndex)//y-axis
532 : 0 : return AxisType::REALNUMBER;
533 [ + - ]: 7912 : if(0==nDimensionIndex)//x-axis
534 : : {
535 [ + - ]: 23736 : if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_SCATTER)
[ + - - + ]
[ + - ]
[ - + # # ]
536 [ + - ][ + - ]: 15824 : || aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_BUBBLE) )
[ # # ]
537 : 0 : return AxisType::REALNUMBER;
538 : 7912 : return AxisType::CATEGORY;
539 : : }
540 : 7912 : return AxisType::CATEGORY;
541 : : }
542 : :
543 : 2258 : sal_Int32 ChartTypeHelper::getNumberOfDisplayedSeries(
544 : : const uno::Reference< XChartType >& xChartType,
545 : : sal_Int32 nNumberOfSeries )
546 : : {
547 [ + - ]: 2258 : if( xChartType.is() )
548 : : {
549 : : try
550 : : {
551 [ + - ][ + - ]: 2258 : rtl::OUString aChartTypeName = xChartType->getChartType();
552 [ + - ][ + + ]: 2258 : if( aChartTypeName.equals(CHART2_SERVICE_NAME_CHARTTYPE_PIE))
553 : : {
554 [ + - ]: 39 : uno::Reference< beans::XPropertySet > xChartTypeProp( xChartType, uno::UNO_QUERY_THROW );
555 : 39 : bool bDonut = false;
556 [ + - ][ + - ]: 39 : if( (xChartTypeProp->getPropertyValue( C2U("UseRings")) >>= bDonut)
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + -
# # # # ]
557 : 39 : && !bDonut )
558 : : {
559 [ + - ]: 39 : return nNumberOfSeries>0 ? 1 : 0;
560 [ - + ]: 2258 : }
561 [ + + ][ # # ]: 2258 : }
562 : : }
563 : 0 : catch( const uno::Exception & ex )
564 : : {
565 : : ASSERT_EXCEPTION( ex );
566 : : }
567 : : }
568 : 2258 : return nNumberOfSeries;
569 : : }
570 : :
571 : 1063 : uno::Sequence < sal_Int32 > ChartTypeHelper::getSupportedMissingValueTreatments( const uno::Reference< XChartType >& xChartType )
572 : : {
573 [ + - ]: 1063 : uno::Sequence < sal_Int32 > aRet;
574 [ + - ]: 1063 : if( !xChartType.is() )
575 : : return aRet;
576 : :
577 : 1063 : bool bStacked = false;
578 : 1063 : bool bFound=false;
579 : 1063 : bool bAmbiguous=false;
580 [ + - ][ + - ]: 1063 : StackMode eStackMode = DiagramHelper::getStackModeFromChartType( xChartType, bFound, bAmbiguous, 0 );
581 [ + + ][ + + ]: 1063 : bStacked = bFound && (StackMode_Y_STACKED == eStackMode);
582 : :
583 [ + - ][ + - ]: 1063 : rtl::OUString aChartTypeName = xChartType->getChartType();
584 [ + - ][ + + : 2356 : if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_COLUMN) ||
+ - - + ]
[ + - ]
[ + + # # ]
585 [ + - ][ + + ]: 1178 : aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_BAR) ||
[ # # ]
586 [ + - ][ + + ]: 1178 : aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_BUBBLE) )
[ # # ]
587 : : {
588 [ + - ]: 948 : aRet.realloc( 2 );
589 [ + - ]: 948 : sal_Int32* pSeq = aRet.getArray();
590 : 948 : *pSeq++ = ::com::sun::star::chart::MissingValueTreatment::LEAVE_GAP;
591 : 948 : *pSeq++ = ::com::sun::star::chart::MissingValueTreatment::USE_ZERO;
592 : : }
593 [ + - ][ - + ]: 115 : else if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_AREA) )
594 : : {
595 [ # # ][ # # ]: 0 : aRet.realloc( bStacked ? 1 : 2 );
596 [ # # ]: 0 : sal_Int32* pSeq = aRet.getArray();
597 : 0 : *pSeq++ = ::com::sun::star::chart::MissingValueTreatment::USE_ZERO;
598 [ # # ]: 0 : if( !bStacked )
599 : 0 : *pSeq++ = ::com::sun::star::chart::MissingValueTreatment::CONTINUE;
600 : : }
601 [ + - ][ + + : 304 : else if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_LINE) ||
+ - - + ]
[ + - ]
[ + + # # ]
602 [ + - ][ + + ]: 152 : aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_NET) ||
[ # # ]
603 [ + - ][ + + ]: 152 : aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_FILLED_NET) )
[ # # ]
604 : : {
605 [ + + ][ + - ]: 78 : aRet.realloc( bStacked ? 2 : 3 );
606 [ + - ]: 78 : sal_Int32* pSeq = aRet.getArray();
607 : 78 : *pSeq++ = ::com::sun::star::chart::MissingValueTreatment::LEAVE_GAP;
608 : 78 : *pSeq++ = ::com::sun::star::chart::MissingValueTreatment::USE_ZERO;
609 [ + + ]: 78 : if( !bStacked )
610 : 72 : *pSeq++ = ::com::sun::star::chart::MissingValueTreatment::CONTINUE;
611 : : }
612 [ + - ][ + + ]: 37 : else if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_SCATTER) )
613 : : {
614 [ + - ]: 6 : aRet.realloc( 3 );
615 [ + - ]: 6 : sal_Int32* pSeq = aRet.getArray();
616 : 6 : *pSeq++ = ::com::sun::star::chart::MissingValueTreatment::CONTINUE;
617 : 6 : *pSeq++ = ::com::sun::star::chart::MissingValueTreatment::LEAVE_GAP;
618 : 6 : *pSeq++ = ::com::sun::star::chart::MissingValueTreatment::USE_ZERO;
619 : : }
620 [ + - ]: 70 : else if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_PIE) ||
[ + + + - ]
[ + - ]
[ + - # # ]
621 [ + - ][ + + ]: 39 : aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_CANDLESTICK) )
[ # # ]
622 : : {
623 [ + - ]: 31 : aRet.realloc( 0 );
624 : : }
625 : : else
626 : : {
627 : : OSL_FAIL( "unknown charttype" );
628 : : }
629 : :
630 : 1063 : return aRet;
631 : : }
632 : :
633 : 981 : bool ChartTypeHelper::isSeriesInFrontOfAxisLine( const uno::Reference< XChartType >& xChartType )
634 : : {
635 [ + - ]: 981 : if( xChartType.is() )
636 : : {
637 [ + - ][ + - ]: 981 : rtl::OUString aChartTypeName = xChartType->getChartType();
638 [ + - ][ - + ]: 981 : if( aChartTypeName.match( CHART2_SERVICE_NAME_CHARTTYPE_FILLED_NET ) )
639 [ + - ]: 981 : return false;
640 : : }
641 : 981 : return true;
642 : : }
643 : :
644 : 638 : rtl::OUString ChartTypeHelper::getRoleOfSequenceForYAxisNumberFormatDetection( const uno::Reference< XChartType >& xChartType )
645 : : {
646 [ + - ]: 638 : rtl::OUString aRet( C2U( "values-y" ) );
647 [ + - ]: 638 : if( !xChartType.is() )
648 : : return aRet;
649 [ + - ][ + - ]: 638 : rtl::OUString aChartTypeName = xChartType->getChartType();
650 [ + - ][ + + ]: 638 : if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_CANDLESTICK) )
651 [ + - ][ + - ]: 4 : aRet = xChartType->getRoleOfSequenceForSeriesLabel();
652 : 638 : return aRet;
653 : : }
654 : :
655 : 3354 : rtl::OUString ChartTypeHelper::getRoleOfSequenceForDataLabelNumberFormatDetection( const uno::Reference< XChartType >& xChartType )
656 : : {
657 [ + - ]: 3354 : rtl::OUString aRet( C2U( "values-y" ) );
658 [ + - ]: 3354 : if( !xChartType.is() )
659 : : return aRet;
660 [ + - ][ + - ]: 3354 : rtl::OUString aChartTypeName = xChartType->getChartType();
661 [ + - ]: 10042 : if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_CANDLESTICK)
[ + + - + ]
[ + - ]
[ + + # # ]
662 [ + - ][ + + ]: 6688 : || aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_BUBBLE) )
[ # # ]
663 [ + - ][ + - ]: 20 : aRet = xChartType->getRoleOfSequenceForSeriesLabel();
664 : 3354 : return aRet;
665 : : }
666 : :
667 : 148 : bool ChartTypeHelper::shouldLabelNumberFormatKeyBeDetectedFromYAxis( const uno::Reference< XChartType >& xChartType )
668 : : {
669 : 148 : bool bRet = true;
670 [ + - ][ + - ]: 148 : rtl::OUString aChartTypeName = xChartType->getChartType();
671 [ + - ][ - + ]: 148 : if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_BUBBLE) )
672 : 0 : bRet = false;
673 : 148 : return bRet;
674 : : }
675 : :
676 : 12 : bool ChartTypeHelper::isSupportingOnlyDeepStackingFor3D( const uno::Reference< XChartType >& xChartType )
677 : : {
678 : 12 : bool bRet = false;
679 [ - + ]: 12 : if( !xChartType.is() )
680 : 0 : return bRet;
681 : :
682 [ + - ][ + - ]: 12 : rtl::OUString aChartTypeName = xChartType->getChartType();
683 [ + - ][ + + : 32 : if( aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_LINE) ||
+ - - + ]
[ + - ]
[ + + # # ]
684 [ + - ][ + + ]: 16 : aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_SCATTER) ||
[ # # ]
685 [ + - ][ + + ]: 16 : aChartTypeName.match(CHART2_SERVICE_NAME_CHARTTYPE_AREA) )
[ # # ]
686 : : {
687 : 8 : bRet = true;
688 : : }
689 : 12 : return bRet;
690 : : }
691 : :
692 : : //.............................................................................
693 : : } //namespace chart
694 : : //.............................................................................
695 : :
696 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|