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