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 "StatisticsItemConverter.hxx"
21 : #include "SchWhichPairs.hxx"
22 : #include "macros.hxx"
23 : #include "RegressionCurveHelper.hxx"
24 : #include "ItemPropertyMap.hxx"
25 : #include "ErrorBar.hxx"
26 : #include "PropertyHelper.hxx"
27 : #include "ChartModelHelper.hxx"
28 : #include "ChartTypeHelper.hxx"
29 : #include "StatisticsHelper.hxx"
30 :
31 : #include "GraphicPropertyItemConverter.hxx"
32 :
33 : #include <svl/stritem.hxx>
34 : #include <svx/chrtitem.hxx>
35 : #include <svl/intitem.hxx>
36 : #include <rtl/math.hxx>
37 :
38 : #include <com/sun/star/chart2/DataPointLabel.hpp>
39 : #include <com/sun/star/chart2/XInternalDataProvider.hpp>
40 : #include <com/sun/star/chart/ErrorBarStyle.hpp>
41 : #include <com/sun/star/lang/XServiceName.hpp>
42 :
43 : #include <functional>
44 : #include <algorithm>
45 : #include <vector>
46 :
47 : using namespace ::com::sun::star;
48 :
49 : namespace
50 : {
51 :
52 0 : uno::Reference< beans::XPropertySet > lcl_GetErrorBar(
53 : const uno::Reference< beans::XPropertySet > & xProp, bool bYError )
54 : {
55 0 : uno::Reference< beans::XPropertySet > xResult;
56 :
57 0 : if( xProp.is())
58 : try
59 : {
60 0 : ( xProp->getPropertyValue( bYError ? OUString( "ErrorBarY" ) : OUString("ErrorBarX") ) >>= xResult );
61 : }
62 0 : catch( const uno::Exception & ex )
63 : {
64 : ASSERT_EXCEPTION( ex );
65 : }
66 :
67 0 : return xResult;
68 : }
69 :
70 0 : ::chart::RegressionCurveHelper::tRegressionType lcl_convertRegressionType( SvxChartRegress eRegress )
71 : {
72 0 : ::chart::RegressionCurveHelper::tRegressionType eType = ::chart::RegressionCurveHelper::REGRESSION_TYPE_NONE;
73 0 : switch( eRegress )
74 : {
75 : case CHREGRESS_LINEAR:
76 0 : eType = ::chart::RegressionCurveHelper::REGRESSION_TYPE_LINEAR;
77 0 : break;
78 : case CHREGRESS_LOG:
79 0 : eType = ::chart::RegressionCurveHelper::REGRESSION_TYPE_LOG;
80 0 : break;
81 : case CHREGRESS_EXP:
82 0 : eType = ::chart::RegressionCurveHelper::REGRESSION_TYPE_EXP;
83 0 : break;
84 : case CHREGRESS_POWER:
85 0 : eType = ::chart::RegressionCurveHelper::REGRESSION_TYPE_POWER;
86 0 : break;
87 : case CHREGRESS_NONE:
88 0 : break;
89 : }
90 0 : return eType;
91 : }
92 :
93 :
94 0 : uno::Reference< beans::XPropertySet > lcl_GetDefaultErrorBar()
95 : {
96 : // todo: use a valid context
97 : return uno::Reference< beans::XPropertySet >(
98 0 : ::chart::createErrorBar( uno::Reference< uno::XComponentContext >()));
99 : }
100 :
101 0 : void lcl_getErrorValues( const uno::Reference< beans::XPropertySet > & xErrorBarProp,
102 : double & rOutPosError, double & rOutNegError )
103 : {
104 0 : if( ! xErrorBarProp.is())
105 0 : return;
106 :
107 : try
108 : {
109 0 : xErrorBarProp->getPropertyValue( "PositiveError" ) >>= rOutPosError;
110 0 : xErrorBarProp->getPropertyValue( "NegativeError" ) >>= rOutNegError;
111 : }
112 0 : catch( const uno::Exception & ex )
113 : {
114 : ASSERT_EXCEPTION( ex );
115 : }
116 : }
117 :
118 0 : void lcl_getErrorIndicatorValues(
119 : const uno::Reference< beans::XPropertySet > & xErrorBarProp,
120 : bool & rOutShowPosError, bool & rOutShowNegError )
121 : {
122 0 : if( ! xErrorBarProp.is())
123 0 : return;
124 :
125 : try
126 : {
127 0 : xErrorBarProp->getPropertyValue( "ShowPositiveError" ) >>= rOutShowPosError;
128 0 : xErrorBarProp->getPropertyValue( "ShowNegativeError" ) >>= rOutShowNegError;
129 : }
130 0 : catch( const uno::Exception & ex )
131 : {
132 : ASSERT_EXCEPTION( ex );
133 : }
134 : }
135 :
136 0 : uno::Reference< beans::XPropertySet > lcl_getEquationProperties(
137 : const uno::Reference< beans::XPropertySet > & xSeriesPropSet, const SfxItemSet * pItemSet )
138 : {
139 0 : bool bEquationExists = true;
140 :
141 : // ensure that a trendline is on
142 0 : if( pItemSet )
143 : {
144 0 : SvxChartRegress eRegress = CHREGRESS_NONE;
145 0 : const SfxPoolItem *pPoolItem = NULL;
146 0 : if( pItemSet->GetItemState( SCHATTR_REGRESSION_TYPE, sal_True, &pPoolItem ) == SFX_ITEM_SET )
147 : {
148 0 : eRegress = static_cast< const SvxChartRegressItem * >( pPoolItem )->GetValue();
149 0 : bEquationExists = ( eRegress != CHREGRESS_NONE );
150 : }
151 : }
152 :
153 0 : if( bEquationExists )
154 : {
155 0 : uno::Reference< chart2::XRegressionCurveContainer > xRegCnt( xSeriesPropSet, uno::UNO_QUERY );
156 : uno::Reference< chart2::XRegressionCurve > xCurve(
157 0 : ::chart::RegressionCurveHelper::getFirstCurveNotMeanValueLine( xRegCnt ));
158 0 : if( xCurve.is())
159 : {
160 0 : return xCurve->getEquationProperties();
161 0 : }
162 : }
163 :
164 0 : return uno::Reference< beans::XPropertySet >();
165 : }
166 :
167 : } // anonymous namespace
168 :
169 : namespace chart
170 : {
171 : namespace wrapper
172 : {
173 :
174 0 : StatisticsItemConverter::StatisticsItemConverter(
175 : const uno::Reference< frame::XModel > & xModel,
176 : const uno::Reference< beans::XPropertySet > & rPropertySet,
177 : SfxItemPool& rItemPool ) :
178 : ItemConverter( rPropertySet, rItemPool ),
179 0 : m_xModel( xModel )
180 : {
181 : OSL_ASSERT( static_cast< int >( RegressionCurveHelper::REGRESSION_TYPE_NONE ) ==
182 : static_cast< int >( CHREGRESS_NONE ));
183 : OSL_ASSERT( static_cast< int >( RegressionCurveHelper::REGRESSION_TYPE_LINEAR ) ==
184 : static_cast< int >( CHREGRESS_LINEAR ));
185 : OSL_ASSERT( static_cast< int >( RegressionCurveHelper::REGRESSION_TYPE_LOG ) ==
186 : static_cast< int >( CHREGRESS_LOG ));
187 : OSL_ASSERT( static_cast< int >( RegressionCurveHelper::REGRESSION_TYPE_EXP ) ==
188 : static_cast< int >( CHREGRESS_EXP ));
189 : OSL_ASSERT( static_cast< int >( RegressionCurveHelper::REGRESSION_TYPE_POWER ) ==
190 : static_cast< int >( CHREGRESS_POWER ));
191 0 : }
192 :
193 0 : StatisticsItemConverter::~StatisticsItemConverter()
194 0 : {}
195 :
196 0 : const sal_uInt16 * StatisticsItemConverter::GetWhichPairs() const
197 : {
198 : // must span all used items!
199 0 : return nStatWhichPairs;
200 : }
201 :
202 0 : bool StatisticsItemConverter::GetItemProperty(
203 : tWhichIdType /* nWhichId */,
204 : tPropertyNameWithMemberId & /* rOutProperty */ ) const
205 : {
206 0 : return false;
207 : }
208 :
209 0 : bool StatisticsItemConverter::ApplySpecialItem(
210 : sal_uInt16 nWhichId, const SfxItemSet & rItemSet )
211 : throw( uno::Exception )
212 : {
213 0 : bool bChanged = false;
214 0 : uno::Any aValue;
215 :
216 0 : switch( nWhichId )
217 : {
218 : case SCHATTR_STAT_AVERAGE:
219 : {
220 : uno::Reference< chart2::XRegressionCurveContainer > xRegCnt(
221 0 : GetPropertySet(), uno::UNO_QUERY );
222 0 : bool bOldHasMeanValueLine = RegressionCurveHelper::hasMeanValueLine( xRegCnt );
223 :
224 : bool bNewHasMeanValueLine =
225 0 : static_cast< const SfxBoolItem & >( rItemSet.Get( nWhichId )).GetValue();
226 :
227 0 : if( bOldHasMeanValueLine != bNewHasMeanValueLine )
228 : {
229 0 : if( ! bNewHasMeanValueLine )
230 0 : RegressionCurveHelper::removeMeanValueLine( xRegCnt );
231 : else
232 : RegressionCurveHelper::addMeanValueLine(
233 0 : xRegCnt, uno::Reference< uno::XComponentContext >(), GetPropertySet() );
234 0 : bChanged = true;
235 0 : }
236 : }
237 0 : break;
238 :
239 : // Attention !!! This case must be passed before SCHATTR_STAT_PERCENT,
240 : // SCHATTR_STAT_BIGERROR, SCHATTR_STAT_CONSTPLUS,
241 : // SCHATTR_STAT_CONSTMINUS and SCHATTR_STAT_INDICATE
242 : case SCHATTR_STAT_KIND_ERROR:
243 : {
244 : bool bYError =
245 0 : static_cast<const SfxBoolItem&>(rItemSet.Get(SCHATTR_STAT_ERRORBAR_TYPE)).GetValue();
246 :
247 : uno::Reference< beans::XPropertySet > xErrorBarProp(
248 0 : lcl_GetErrorBar( GetPropertySet(), bYError ));
249 :
250 : SvxChartKindError eErrorKind =
251 : static_cast< const SvxChartKindErrorItem & >(
252 0 : rItemSet.Get( nWhichId )).GetValue();
253 :
254 0 : if( !xErrorBarProp.is() && eErrorKind == CHERROR_NONE)
255 : {
256 : //nothing to do
257 : }
258 : else
259 : {
260 0 : sal_Int32 nStyle = ::com::sun::star::chart::ErrorBarStyle::NONE;
261 :
262 0 : switch( eErrorKind )
263 : {
264 : case CHERROR_NONE:
265 0 : nStyle = ::com::sun::star::chart::ErrorBarStyle::NONE; break;
266 : case CHERROR_VARIANT:
267 0 : nStyle = ::com::sun::star::chart::ErrorBarStyle::VARIANCE; break;
268 : case CHERROR_SIGMA:
269 0 : nStyle = ::com::sun::star::chart::ErrorBarStyle::STANDARD_DEVIATION; break;
270 : case CHERROR_PERCENT:
271 0 : nStyle = ::com::sun::star::chart::ErrorBarStyle::RELATIVE; break;
272 : case CHERROR_BIGERROR:
273 0 : nStyle = ::com::sun::star::chart::ErrorBarStyle::ERROR_MARGIN; break;
274 : case CHERROR_CONST:
275 0 : nStyle = ::com::sun::star::chart::ErrorBarStyle::ABSOLUTE; break;
276 : case CHERROR_STDERROR:
277 0 : nStyle = ::com::sun::star::chart::ErrorBarStyle::STANDARD_ERROR; break;
278 : case CHERROR_RANGE:
279 0 : nStyle = ::com::sun::star::chart::ErrorBarStyle::FROM_DATA; break;
280 : }
281 :
282 0 : if( !xErrorBarProp.is() )
283 : {
284 0 : xErrorBarProp = lcl_GetDefaultErrorBar();
285 0 : GetPropertySet()->setPropertyValue( bYError ? OUString( "ErrorBarY" ) : OUString("ErrorBarX"),
286 0 : uno::makeAny( xErrorBarProp ));
287 : }
288 :
289 0 : xErrorBarProp->setPropertyValue( "ErrorBarStyle" , uno::makeAny( nStyle ));
290 0 : bChanged = true;
291 0 : }
292 : }
293 0 : break;
294 :
295 : case SCHATTR_STAT_PERCENT:
296 : case SCHATTR_STAT_BIGERROR:
297 : {
298 : OSL_FAIL( "Deprecated item" );
299 : bool bYError =
300 0 : static_cast<const SfxBoolItem&>(rItemSet.Get(SCHATTR_STAT_ERRORBAR_TYPE)).GetValue();
301 :
302 : uno::Reference< beans::XPropertySet > xErrorBarProp(
303 0 : lcl_GetErrorBar( GetPropertySet(), bYError));
304 0 : bool bOldHasErrorBar = xErrorBarProp.is();
305 :
306 : double fValue =
307 : static_cast< const SvxDoubleItem & >(
308 0 : rItemSet.Get( nWhichId )).GetValue();
309 : double fPos, fNeg;
310 0 : lcl_getErrorValues( xErrorBarProp, fPos, fNeg );
311 :
312 0 : if( bOldHasErrorBar &&
313 0 : ! ( ::rtl::math::approxEqual( fPos, fValue ) &&
314 0 : ::rtl::math::approxEqual( fNeg, fValue )))
315 : {
316 0 : xErrorBarProp->setPropertyValue( "PositiveError" , uno::makeAny( fValue ));
317 0 : xErrorBarProp->setPropertyValue( "NegativeError" , uno::makeAny( fValue ));
318 0 : bChanged = true;
319 0 : }
320 : }
321 0 : break;
322 :
323 : case SCHATTR_STAT_CONSTPLUS:
324 : {
325 : bool bYError =
326 0 : static_cast<const SfxBoolItem&>(rItemSet.Get(SCHATTR_STAT_ERRORBAR_TYPE)).GetValue();
327 :
328 : uno::Reference< beans::XPropertySet > xErrorBarProp(
329 0 : lcl_GetErrorBar( GetPropertySet(),bYError));
330 0 : bool bOldHasErrorBar = xErrorBarProp.is();
331 :
332 : double fValue =
333 : static_cast< const SvxDoubleItem & >(
334 0 : rItemSet.Get( nWhichId )).GetValue();
335 : double fPos, fNeg;
336 0 : lcl_getErrorValues( xErrorBarProp, fPos, fNeg );
337 :
338 0 : if( bOldHasErrorBar &&
339 0 : ! ::rtl::math::approxEqual( fPos, fValue ))
340 : {
341 0 : xErrorBarProp->setPropertyValue( "PositiveError" , uno::makeAny( fValue ));
342 0 : bChanged = true;
343 0 : }
344 : }
345 0 : break;
346 :
347 : case SCHATTR_STAT_CONSTMINUS:
348 : {
349 : bool bYError =
350 0 : static_cast<const SfxBoolItem&>(rItemSet.Get(SCHATTR_STAT_ERRORBAR_TYPE)).GetValue();
351 : uno::Reference< beans::XPropertySet > xErrorBarProp(
352 0 : lcl_GetErrorBar( GetPropertySet(),bYError));
353 0 : bool bOldHasErrorBar = xErrorBarProp.is();
354 :
355 : double fValue =
356 : static_cast< const SvxDoubleItem & >(
357 0 : rItemSet.Get( nWhichId )).GetValue();
358 : double fPos, fNeg;
359 0 : lcl_getErrorValues( xErrorBarProp, fPos, fNeg );
360 :
361 0 : if( bOldHasErrorBar &&
362 0 : ! ::rtl::math::approxEqual( fNeg, fValue ))
363 : {
364 0 : xErrorBarProp->setPropertyValue( "NegativeError" , uno::makeAny( fValue ));
365 0 : bChanged = true;
366 0 : }
367 : }
368 0 : break;
369 :
370 : case SCHATTR_REGRESSION_TYPE:
371 : {
372 : SvxChartRegress eRegress =
373 : static_cast< const SvxChartRegressItem & >(
374 0 : rItemSet.Get( nWhichId )).GetValue();
375 :
376 : uno::Reference< chart2::XRegressionCurveContainer > xRegCnt(
377 0 : GetPropertySet(), uno::UNO_QUERY );
378 :
379 0 : if( eRegress == CHREGRESS_NONE )
380 : {
381 0 : bChanged = RegressionCurveHelper::removeAllExceptMeanValueLine( xRegCnt );
382 : }
383 : else
384 : {
385 : SvxChartRegress eOldRegress(
386 : static_cast< SvxChartRegress >(
387 : static_cast< sal_Int32 >(
388 0 : RegressionCurveHelper::getFirstRegressTypeNotMeanValueLine( xRegCnt ))));
389 0 : if( eOldRegress != eRegress )
390 : {
391 : RegressionCurveHelper::replaceOrAddCurveAndReduceToOne(
392 : lcl_convertRegressionType( eRegress ), xRegCnt,
393 0 : uno::Reference< uno::XComponentContext >());
394 0 : bChanged = true;
395 : }
396 0 : }
397 : }
398 0 : break;
399 :
400 : case SCHATTR_REGRESSION_SHOW_EQUATION:
401 : {
402 0 : uno::Reference< beans::XPropertySet > xEqProp( lcl_getEquationProperties( GetPropertySet(), &rItemSet ));
403 0 : if( xEqProp.is())
404 : {
405 0 : bool bShowEq = false;
406 0 : xEqProp->getPropertyValue( "ShowEquation" ) >>= bShowEq;
407 : bool bNewShowEq =
408 0 : static_cast< const SfxBoolItem & >( rItemSet.Get( nWhichId )).GetValue();
409 0 : if( bShowEq != bNewShowEq )
410 : {
411 0 : xEqProp->setPropertyValue( "ShowEquation" , uno::makeAny( bNewShowEq ));
412 0 : bChanged = true;
413 : }
414 0 : }
415 : }
416 0 : break;
417 :
418 : case SCHATTR_REGRESSION_SHOW_COEFF:
419 : {
420 0 : uno::Reference< beans::XPropertySet > xEqProp( lcl_getEquationProperties( GetPropertySet(), &rItemSet ));
421 0 : if( xEqProp.is())
422 : {
423 0 : bool bShowCoeff = false;
424 0 : xEqProp->getPropertyValue( "ShowCorrelationCoefficient" ) >>= bShowCoeff;
425 : bool bNewShowCoeff =
426 0 : static_cast< const SfxBoolItem & >( rItemSet.Get( nWhichId )).GetValue();
427 0 : if( bShowCoeff != bNewShowCoeff )
428 : {
429 0 : xEqProp->setPropertyValue( "ShowCorrelationCoefficient" , uno::makeAny( bNewShowCoeff ));
430 0 : bChanged = true;
431 : }
432 0 : }
433 : }
434 0 : break;
435 :
436 : case SCHATTR_STAT_INDICATE:
437 : {
438 : bool bYError =
439 0 : static_cast<const SfxBoolItem&>(rItemSet.Get(SCHATTR_STAT_ERRORBAR_TYPE)).GetValue();
440 : uno::Reference< beans::XPropertySet > xErrorBarProp(
441 0 : lcl_GetErrorBar( GetPropertySet(),bYError));
442 0 : bool bOldHasErrorBar = xErrorBarProp.is();
443 :
444 : SvxChartIndicate eIndicate =
445 : static_cast< const SvxChartIndicateItem & >(
446 0 : rItemSet.Get( nWhichId )).GetValue();
447 :
448 0 : bool bNewIndPos = (eIndicate == CHINDICATE_BOTH || eIndicate == CHINDICATE_UP );
449 0 : bool bNewIndNeg = (eIndicate == CHINDICATE_BOTH || eIndicate == CHINDICATE_DOWN );
450 :
451 : bool bShowPos, bShowNeg;
452 0 : lcl_getErrorIndicatorValues( xErrorBarProp, bShowPos, bShowNeg );
453 :
454 0 : if( bOldHasErrorBar &&
455 : ( bShowPos != bNewIndPos ||
456 : bShowNeg != bNewIndNeg ))
457 : {
458 0 : xErrorBarProp->setPropertyValue( "ShowPositiveError" , uno::makeAny( bNewIndPos ));
459 0 : xErrorBarProp->setPropertyValue( "ShowNegativeError" , uno::makeAny( bNewIndNeg ));
460 0 : bChanged = true;
461 0 : }
462 : }
463 0 : break;
464 :
465 : case SCHATTR_STAT_RANGE_POS:
466 : case SCHATTR_STAT_RANGE_NEG:
467 : {
468 : const bool bYError =
469 0 : static_cast<const SfxBoolItem&>(rItemSet.Get(SCHATTR_STAT_ERRORBAR_TYPE)).GetValue();
470 : uno::Reference< chart2::data::XDataSource > xErrorBarSource( lcl_GetErrorBar( GetPropertySet(), bYError),
471 0 : uno::UNO_QUERY );
472 0 : uno::Reference< chart2::XChartDocument > xChartDoc( m_xModel, uno::UNO_QUERY );
473 0 : uno::Reference< chart2::data::XDataProvider > xDataProvider;
474 :
475 0 : if( xChartDoc.is())
476 0 : xDataProvider.set( xChartDoc->getDataProvider());
477 0 : if( xErrorBarSource.is() && xDataProvider.is())
478 : {
479 0 : OUString aNewRange( static_cast< const SfxStringItem & >( rItemSet.Get( nWhichId )).GetValue());
480 0 : bool bApplyNewRange = false;
481 :
482 0 : bool bIsPositiveValue( nWhichId == SCHATTR_STAT_RANGE_POS );
483 0 : if( xChartDoc->hasInternalDataProvider())
484 : {
485 0 : if( !aNewRange.isEmpty())
486 : {
487 : uno::Reference< chart2::data::XDataSequence > xSeq(
488 : StatisticsHelper::getErrorDataSequenceFromDataSource(
489 0 : xErrorBarSource, bIsPositiveValue, bYError ));
490 0 : if( ! xSeq.is())
491 : {
492 : // no data range for error bars yet => create
493 0 : uno::Reference< chart2::XInternalDataProvider > xIntDataProvider( xDataProvider, uno::UNO_QUERY );
494 : OSL_ASSERT( xIntDataProvider.is());
495 0 : if( xIntDataProvider.is())
496 : {
497 0 : xIntDataProvider->appendSequence();
498 0 : aNewRange = "last";
499 0 : bApplyNewRange = true;
500 0 : }
501 0 : }
502 : }
503 : }
504 : else
505 : {
506 : uno::Reference< chart2::data::XDataSequence > xSeq(
507 : StatisticsHelper::getErrorDataSequenceFromDataSource(
508 0 : xErrorBarSource, bIsPositiveValue, bYError ));
509 : bApplyNewRange =
510 0 : ! ( xSeq.is() && (aNewRange == xSeq->getSourceRangeRepresentation()));
511 : }
512 :
513 0 : if( bApplyNewRange )
514 : StatisticsHelper::setErrorDataSequence(
515 0 : xErrorBarSource, xDataProvider, aNewRange, bIsPositiveValue, bYError );
516 0 : }
517 : }
518 0 : break;
519 : }
520 :
521 0 : return bChanged;
522 : }
523 :
524 0 : void StatisticsItemConverter::FillSpecialItem(
525 : sal_uInt16 nWhichId, SfxItemSet & rOutItemSet ) const
526 : throw( uno::Exception )
527 : {
528 0 : switch( nWhichId )
529 : {
530 : case SCHATTR_STAT_AVERAGE:
531 : rOutItemSet.Put(
532 : SfxBoolItem( nWhichId,
533 : RegressionCurveHelper::hasMeanValueLine(
534 : uno::Reference< chart2::XRegressionCurveContainer >(
535 0 : GetPropertySet(), uno::UNO_QUERY ))));
536 0 : break;
537 :
538 : case SCHATTR_STAT_KIND_ERROR:
539 : {
540 : bool bYError =
541 0 : static_cast<const SfxBoolItem&>(rOutItemSet.Get(SCHATTR_STAT_ERRORBAR_TYPE)).GetValue();
542 0 : SvxChartKindError eErrorKind = CHERROR_NONE;
543 : uno::Reference< beans::XPropertySet > xErrorBarProp(
544 0 : lcl_GetErrorBar( GetPropertySet(), bYError));
545 0 : if( xErrorBarProp.is() )
546 : {
547 0 : sal_Int32 nStyle = 0;
548 0 : if( xErrorBarProp->getPropertyValue( "ErrorBarStyle" ) >>= nStyle )
549 : {
550 0 : switch( nStyle )
551 : {
552 : case ::com::sun::star::chart::ErrorBarStyle::NONE:
553 0 : break;
554 : case ::com::sun::star::chart::ErrorBarStyle::VARIANCE:
555 0 : eErrorKind = CHERROR_VARIANT; break;
556 : case ::com::sun::star::chart::ErrorBarStyle::STANDARD_DEVIATION:
557 0 : eErrorKind = CHERROR_SIGMA; break;
558 : case ::com::sun::star::chart::ErrorBarStyle::ABSOLUTE:
559 0 : eErrorKind = CHERROR_CONST; break;
560 : case ::com::sun::star::chart::ErrorBarStyle::RELATIVE:
561 0 : eErrorKind = CHERROR_PERCENT; break;
562 : case ::com::sun::star::chart::ErrorBarStyle::ERROR_MARGIN:
563 0 : eErrorKind = CHERROR_BIGERROR; break;
564 : case ::com::sun::star::chart::ErrorBarStyle::STANDARD_ERROR:
565 0 : eErrorKind = CHERROR_STDERROR; break;
566 : case ::com::sun::star::chart::ErrorBarStyle::FROM_DATA:
567 0 : eErrorKind = CHERROR_RANGE; break;
568 : }
569 : }
570 : }
571 0 : rOutItemSet.Put( SvxChartKindErrorItem( eErrorKind, SCHATTR_STAT_KIND_ERROR ));
572 : }
573 0 : break;
574 :
575 : case SCHATTR_STAT_PERCENT:
576 : {
577 : bool bYError =
578 0 : static_cast<const SfxBoolItem&>(rOutItemSet.Get(SCHATTR_STAT_ERRORBAR_TYPE)).GetValue();
579 0 : uno::Reference< beans::XPropertySet > xErrorBarProp( lcl_GetErrorBar( GetPropertySet(),bYError));
580 0 : if( xErrorBarProp.is())
581 : {
582 : double fPos, fNeg;
583 0 : lcl_getErrorValues( xErrorBarProp, fPos, fNeg );
584 0 : rOutItemSet.Put( SvxDoubleItem( ( fPos + fNeg ) / 2.0, nWhichId ));
585 0 : }
586 : }
587 0 : break;
588 :
589 : case SCHATTR_STAT_BIGERROR:
590 : {
591 : bool bYError =
592 0 : static_cast<const SfxBoolItem&>(rOutItemSet.Get(SCHATTR_STAT_ERRORBAR_TYPE)).GetValue();
593 0 : uno::Reference< beans::XPropertySet > xErrorBarProp( lcl_GetErrorBar( GetPropertySet(),bYError));
594 0 : if( xErrorBarProp.is())
595 : {
596 : double fPos, fNeg;
597 0 : lcl_getErrorValues( xErrorBarProp, fPos, fNeg );
598 0 : rOutItemSet.Put( SvxDoubleItem( ( fPos + fNeg ) / 2.0, nWhichId ));
599 0 : }
600 : }
601 0 : break;
602 :
603 : case SCHATTR_STAT_CONSTPLUS:
604 : {
605 : bool bYError =
606 0 : static_cast<const SfxBoolItem&>(rOutItemSet.Get(SCHATTR_STAT_ERRORBAR_TYPE)).GetValue();
607 0 : uno::Reference< beans::XPropertySet > xErrorBarProp( lcl_GetErrorBar( GetPropertySet(),bYError));
608 0 : if( xErrorBarProp.is())
609 : {
610 : double fPos, fNeg;
611 0 : lcl_getErrorValues( xErrorBarProp, fPos, fNeg );
612 0 : rOutItemSet.Put( SvxDoubleItem( fPos, nWhichId ));
613 0 : }
614 : }
615 0 : break;
616 :
617 : case SCHATTR_STAT_CONSTMINUS:
618 : {
619 : bool bYError =
620 0 : static_cast<const SfxBoolItem&>(rOutItemSet.Get(SCHATTR_STAT_ERRORBAR_TYPE)).GetValue();
621 0 : uno::Reference< beans::XPropertySet > xErrorBarProp( lcl_GetErrorBar( GetPropertySet(),bYError));
622 0 : if( xErrorBarProp.is())
623 : {
624 : double fPos, fNeg;
625 0 : lcl_getErrorValues( xErrorBarProp, fPos, fNeg );
626 0 : rOutItemSet.Put( SvxDoubleItem( fNeg, nWhichId ));
627 0 : }
628 : }
629 0 : break;
630 :
631 : case SCHATTR_REGRESSION_TYPE:
632 : {
633 : SvxChartRegress eRegress = static_cast< SvxChartRegress >(
634 : static_cast< sal_Int32 >(
635 : RegressionCurveHelper::getFirstRegressTypeNotMeanValueLine(
636 : uno::Reference< chart2::XRegressionCurveContainer >(
637 0 : GetPropertySet(), uno::UNO_QUERY ) )));
638 0 : rOutItemSet.Put( SvxChartRegressItem( eRegress, SCHATTR_REGRESSION_TYPE ));
639 : }
640 0 : break;
641 :
642 : case SCHATTR_REGRESSION_SHOW_EQUATION:
643 : {
644 0 : bool bShowEq = false;
645 0 : uno::Reference< beans::XPropertySet > xEqProp( lcl_getEquationProperties( GetPropertySet(), 0 ));
646 0 : if( xEqProp.is())
647 0 : xEqProp->getPropertyValue( "ShowEquation" ) >>= bShowEq;
648 0 : rOutItemSet.Put( SfxBoolItem( nWhichId, bShowEq ));
649 : }
650 0 : break;
651 :
652 : case SCHATTR_REGRESSION_SHOW_COEFF:
653 : {
654 0 : bool bShowCoeff = false;
655 0 : uno::Reference< beans::XPropertySet > xEqProp( lcl_getEquationProperties( GetPropertySet(), 0 ));
656 0 : if( xEqProp.is())
657 0 : xEqProp->getPropertyValue( "ShowCorrelationCoefficient" ) >>= bShowCoeff;
658 0 : rOutItemSet.Put( SfxBoolItem( nWhichId, bShowCoeff ));
659 : }
660 0 : break;
661 :
662 : case SCHATTR_STAT_INDICATE:
663 : {
664 : bool bYError =
665 0 : static_cast<const SfxBoolItem&>(rOutItemSet.Get(SCHATTR_STAT_ERRORBAR_TYPE)).GetValue();
666 0 : uno::Reference< beans::XPropertySet > xErrorBarProp( lcl_GetErrorBar( GetPropertySet(),bYError));
667 0 : SvxChartIndicate eIndicate = CHINDICATE_BOTH;
668 0 : if( xErrorBarProp.is())
669 : {
670 : bool bShowPos, bShowNeg;
671 0 : lcl_getErrorIndicatorValues( xErrorBarProp, bShowPos, bShowNeg );
672 :
673 0 : if( bShowPos )
674 : {
675 0 : if( bShowNeg )
676 0 : eIndicate = CHINDICATE_BOTH;
677 : else
678 0 : eIndicate = CHINDICATE_UP;
679 : }
680 : else
681 : {
682 0 : if( bShowNeg )
683 0 : eIndicate = CHINDICATE_DOWN;
684 : else
685 0 : eIndicate = CHINDICATE_NONE;
686 : }
687 : }
688 0 : rOutItemSet.Put( SvxChartIndicateItem( eIndicate, SCHATTR_STAT_INDICATE ));
689 : }
690 0 : break;
691 :
692 : case SCHATTR_STAT_RANGE_POS:
693 : case SCHATTR_STAT_RANGE_NEG:
694 : {
695 : bool bYError =
696 0 : static_cast<const SfxBoolItem&>(rOutItemSet.Get(SCHATTR_STAT_ERRORBAR_TYPE)).GetValue();
697 : uno::Reference< chart2::data::XDataSource > xErrorBarSource( lcl_GetErrorBar( GetPropertySet(),bYError),
698 0 : uno::UNO_QUERY );
699 0 : if( xErrorBarSource.is())
700 : {
701 : uno::Reference< chart2::data::XDataSequence > xSeq(
702 : StatisticsHelper::getErrorDataSequenceFromDataSource(
703 0 : xErrorBarSource, (nWhichId == SCHATTR_STAT_RANGE_POS), bYError ));
704 0 : if( xSeq.is())
705 0 : rOutItemSet.Put( SfxStringItem( nWhichId, String( xSeq->getSourceRangeRepresentation())));
706 0 : }
707 : }
708 0 : break;
709 : }
710 0 : }
711 :
712 : } // namespace wrapper
713 : } // namespace chart
714 :
715 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|