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_POLYNOMIAL:
88 0 : eType = ::chart::RegressionCurveHelper::REGRESSION_TYPE_POLYNOMIAL;
89 0 : break;
90 : case CHREGRESS_MOVING_AVERAGE:
91 0 : eType = ::chart::RegressionCurveHelper::REGRESSION_TYPE_MOVING_AVERAGE;
92 0 : break;
93 : case CHREGRESS_NONE:
94 0 : break;
95 : }
96 0 : return eType;
97 : }
98 :
99 0 : uno::Reference< beans::XPropertySet > lcl_GetDefaultErrorBar()
100 : {
101 : // todo: use a valid context
102 : return uno::Reference< beans::XPropertySet >(
103 0 : ::chart::createErrorBar( uno::Reference< uno::XComponentContext >()));
104 : }
105 :
106 0 : void lcl_getErrorValues( const uno::Reference< beans::XPropertySet > & xErrorBarProp,
107 : double & rOutPosError, double & rOutNegError )
108 : {
109 0 : if( ! xErrorBarProp.is())
110 0 : return;
111 :
112 : try
113 : {
114 0 : xErrorBarProp->getPropertyValue( "PositiveError" ) >>= rOutPosError;
115 0 : xErrorBarProp->getPropertyValue( "NegativeError" ) >>= rOutNegError;
116 : }
117 0 : catch( const uno::Exception & ex )
118 : {
119 : ASSERT_EXCEPTION( ex );
120 : }
121 : }
122 :
123 0 : void lcl_getErrorIndicatorValues(
124 : const uno::Reference< beans::XPropertySet > & xErrorBarProp,
125 : bool & rOutShowPosError, bool & rOutShowNegError )
126 : {
127 0 : if( ! xErrorBarProp.is())
128 0 : return;
129 :
130 : try
131 : {
132 0 : xErrorBarProp->getPropertyValue( "ShowPositiveError" ) >>= rOutShowPosError;
133 0 : xErrorBarProp->getPropertyValue( "ShowNegativeError" ) >>= rOutShowNegError;
134 : }
135 0 : catch( const uno::Exception & ex )
136 : {
137 : ASSERT_EXCEPTION( ex );
138 : }
139 : }
140 :
141 0 : uno::Reference< beans::XPropertySet > lcl_getEquationProperties(
142 : const uno::Reference< beans::XPropertySet > & xSeriesPropSet, const SfxItemSet * pItemSet )
143 : {
144 0 : bool bEquationExists = true;
145 :
146 : // ensure that a trendline is on
147 0 : if( pItemSet )
148 : {
149 0 : SvxChartRegress eRegress = CHREGRESS_NONE;
150 0 : const SfxPoolItem *pPoolItem = NULL;
151 0 : if( pItemSet->GetItemState( SCHATTR_REGRESSION_TYPE, true, &pPoolItem ) == SFX_ITEM_SET )
152 : {
153 0 : eRegress = static_cast< const SvxChartRegressItem * >( pPoolItem )->GetValue();
154 0 : bEquationExists = ( eRegress != CHREGRESS_NONE );
155 : }
156 : }
157 :
158 0 : if( bEquationExists )
159 : {
160 0 : uno::Reference< chart2::XRegressionCurveContainer > xRegCnt( xSeriesPropSet, uno::UNO_QUERY );
161 : uno::Reference< chart2::XRegressionCurve > xCurve(
162 0 : ::chart::RegressionCurveHelper::getFirstCurveNotMeanValueLine( xRegCnt ));
163 0 : if( xCurve.is())
164 : {
165 0 : return xCurve->getEquationProperties();
166 0 : }
167 : }
168 :
169 0 : return uno::Reference< beans::XPropertySet >();
170 : }
171 :
172 0 : uno::Reference< beans::XPropertySet > lcl_getCurveProperties(
173 : const uno::Reference< beans::XPropertySet > & xSeriesPropSet, const SfxItemSet * pItemSet )
174 : {
175 0 : bool bExists = true;
176 :
177 : // ensure that a trendline is on
178 0 : if( pItemSet )
179 : {
180 0 : SvxChartRegress eRegress = CHREGRESS_NONE;
181 0 : const SfxPoolItem *pPoolItem = NULL;
182 0 : if( pItemSet->GetItemState( SCHATTR_REGRESSION_TYPE, true, &pPoolItem ) == SFX_ITEM_SET )
183 : {
184 0 : eRegress = static_cast< const SvxChartRegressItem * >( pPoolItem )->GetValue();
185 0 : bExists = ( eRegress != CHREGRESS_NONE );
186 : }
187 : }
188 :
189 0 : if( bExists )
190 : {
191 0 : uno::Reference< chart2::XRegressionCurveContainer > xRegCnt( xSeriesPropSet, uno::UNO_QUERY );
192 : uno::Reference< chart2::XRegressionCurve > xCurve(
193 0 : ::chart::RegressionCurveHelper::getFirstCurveNotMeanValueLine( xRegCnt ));
194 0 : if( xCurve.is())
195 : {
196 0 : uno::Reference< beans::XPropertySet > xProperties( xCurve, uno::UNO_QUERY );
197 0 : return xProperties;
198 0 : }
199 : }
200 :
201 0 : return uno::Reference< beans::XPropertySet >();
202 : }
203 :
204 : template <class T, class D>
205 0 : bool lclConvertToPropertySet(const SfxItemSet& rItemSet, sal_uInt16 nWhichId, uno::Reference<beans::XPropertySet> xProperties, const OUString& aPropertyID)
206 : {
207 : OSL_ASSERT(xProperties.is());
208 0 : if( xProperties.is() )
209 : {
210 0 : T aValue = static_cast<T>(static_cast<const D&>(rItemSet.Get( nWhichId )).GetValue());
211 0 : T aOldValue = aValue;
212 0 : bool aSuccess = xProperties->getPropertyValue( aPropertyID ) >>= aOldValue;
213 0 : if (!aSuccess || aOldValue != aValue)
214 : {
215 0 : xProperties->setPropertyValue( aPropertyID , uno::makeAny( aValue ));
216 0 : return true;
217 0 : }
218 : }
219 0 : return false;
220 : }
221 :
222 : template <class T, class D>
223 0 : void lclConvertToItemSet(SfxItemSet& rItemSet, sal_uInt16 nWhichId, uno::Reference<beans::XPropertySet> xProperties, const OUString& aPropertyID)
224 : {
225 : OSL_ASSERT(xProperties.is());
226 0 : if( xProperties.is() )
227 : {
228 0 : T aValue = static_cast<T>(static_cast<const D&>(rItemSet.Get( nWhichId )).GetValue());
229 0 : if(xProperties->getPropertyValue( aPropertyID ) >>= aValue)
230 : {
231 0 : rItemSet.Put(D( nWhichId, aValue ));
232 0 : }
233 : }
234 0 : }
235 :
236 0 : void lclConvertToItemSetDouble(SfxItemSet& rItemSet, sal_uInt16 nWhichId, uno::Reference<beans::XPropertySet> xProperties, const OUString& aPropertyID)
237 : {
238 : OSL_ASSERT(xProperties.is());
239 0 : if( xProperties.is() )
240 : {
241 0 : double aValue = static_cast<double>(static_cast<const SvxDoubleItem&>(rItemSet.Get( nWhichId )).GetValue());
242 0 : if(xProperties->getPropertyValue( aPropertyID ) >>= aValue)
243 : {
244 0 : rItemSet.Put(SvxDoubleItem( aValue, nWhichId ));
245 : }
246 : }
247 0 : }
248 :
249 :
250 : } // anonymous namespace
251 :
252 : namespace chart
253 : {
254 : namespace wrapper
255 : {
256 :
257 0 : StatisticsItemConverter::StatisticsItemConverter(
258 : const uno::Reference< frame::XModel > & xModel,
259 : const uno::Reference< beans::XPropertySet > & rPropertySet,
260 : SfxItemPool& rItemPool ) :
261 : ItemConverter( rPropertySet, rItemPool ),
262 0 : m_xModel( xModel )
263 : {
264 : OSL_ASSERT( static_cast< int >( RegressionCurveHelper::REGRESSION_TYPE_NONE ) ==
265 : static_cast< int >( CHREGRESS_NONE ));
266 : OSL_ASSERT( static_cast< int >( RegressionCurveHelper::REGRESSION_TYPE_LINEAR ) ==
267 : static_cast< int >( CHREGRESS_LINEAR ));
268 : OSL_ASSERT( static_cast< int >( RegressionCurveHelper::REGRESSION_TYPE_LOG ) ==
269 : static_cast< int >( CHREGRESS_LOG ));
270 : OSL_ASSERT( static_cast< int >( RegressionCurveHelper::REGRESSION_TYPE_EXP ) ==
271 : static_cast< int >( CHREGRESS_EXP ));
272 : OSL_ASSERT( static_cast< int >( RegressionCurveHelper::REGRESSION_TYPE_POWER ) ==
273 : static_cast< int >( CHREGRESS_POWER ));
274 : OSL_ASSERT( static_cast< int >( RegressionCurveHelper::REGRESSION_TYPE_POLYNOMIAL ) ==
275 : static_cast< int >( CHREGRESS_POLYNOMIAL ));
276 : OSL_ASSERT( static_cast< int >( RegressionCurveHelper::REGRESSION_TYPE_MOVING_AVERAGE ) ==
277 : static_cast< int >( CHREGRESS_MOVING_AVERAGE ));
278 0 : }
279 :
280 0 : StatisticsItemConverter::~StatisticsItemConverter()
281 0 : {}
282 :
283 0 : const sal_uInt16 * StatisticsItemConverter::GetWhichPairs() const
284 : {
285 : // must span all used items!
286 0 : return nStatWhichPairs;
287 : }
288 :
289 0 : bool StatisticsItemConverter::GetItemProperty(
290 : tWhichIdType /* nWhichId */,
291 : tPropertyNameWithMemberId & /* rOutProperty */ ) const
292 : {
293 0 : return false;
294 : }
295 :
296 0 : bool StatisticsItemConverter::ApplySpecialItem(
297 : sal_uInt16 nWhichId, const SfxItemSet & rItemSet )
298 : throw( uno::Exception )
299 : {
300 0 : bool bChanged = false;
301 :
302 0 : switch( nWhichId )
303 : {
304 : case SCHATTR_STAT_AVERAGE:
305 : {
306 : uno::Reference< chart2::XRegressionCurveContainer > xRegCnt(
307 0 : GetPropertySet(), uno::UNO_QUERY );
308 0 : bool bOldHasMeanValueLine = RegressionCurveHelper::hasMeanValueLine( xRegCnt );
309 :
310 : bool bNewHasMeanValueLine =
311 0 : static_cast< const SfxBoolItem & >( rItemSet.Get( nWhichId )).GetValue();
312 :
313 0 : if( bOldHasMeanValueLine != bNewHasMeanValueLine )
314 : {
315 0 : if( ! bNewHasMeanValueLine )
316 0 : RegressionCurveHelper::removeMeanValueLine( xRegCnt );
317 : else
318 : RegressionCurveHelper::addMeanValueLine(
319 0 : xRegCnt, uno::Reference< uno::XComponentContext >(), GetPropertySet() );
320 0 : bChanged = true;
321 0 : }
322 : }
323 0 : break;
324 :
325 : // Attention !!! This case must be passed before SCHATTR_STAT_PERCENT,
326 : // SCHATTR_STAT_BIGERROR, SCHATTR_STAT_CONSTPLUS,
327 : // SCHATTR_STAT_CONSTMINUS and SCHATTR_STAT_INDICATE
328 : case SCHATTR_STAT_KIND_ERROR:
329 : {
330 : bool bYError =
331 0 : static_cast<const SfxBoolItem&>(rItemSet.Get(SCHATTR_STAT_ERRORBAR_TYPE)).GetValue();
332 :
333 : uno::Reference< beans::XPropertySet > xErrorBarProp(
334 0 : lcl_GetErrorBar( GetPropertySet(), bYError ));
335 :
336 : SvxChartKindError eErrorKind =
337 : static_cast< const SvxChartKindErrorItem & >(
338 0 : rItemSet.Get( nWhichId )).GetValue();
339 :
340 0 : if( !xErrorBarProp.is() && eErrorKind == CHERROR_NONE)
341 : {
342 : //nothing to do
343 : }
344 : else
345 : {
346 0 : sal_Int32 nStyle = ::com::sun::star::chart::ErrorBarStyle::NONE;
347 :
348 0 : switch( eErrorKind )
349 : {
350 : case CHERROR_NONE:
351 0 : nStyle = ::com::sun::star::chart::ErrorBarStyle::NONE; break;
352 : case CHERROR_VARIANT:
353 0 : nStyle = ::com::sun::star::chart::ErrorBarStyle::VARIANCE; break;
354 : case CHERROR_SIGMA:
355 0 : nStyle = ::com::sun::star::chart::ErrorBarStyle::STANDARD_DEVIATION; break;
356 : case CHERROR_PERCENT:
357 0 : nStyle = ::com::sun::star::chart::ErrorBarStyle::RELATIVE; break;
358 : case CHERROR_BIGERROR:
359 0 : nStyle = ::com::sun::star::chart::ErrorBarStyle::ERROR_MARGIN; break;
360 : case CHERROR_CONST:
361 0 : nStyle = ::com::sun::star::chart::ErrorBarStyle::ABSOLUTE; break;
362 : case CHERROR_STDERROR:
363 0 : nStyle = ::com::sun::star::chart::ErrorBarStyle::STANDARD_ERROR; break;
364 : case CHERROR_RANGE:
365 0 : nStyle = ::com::sun::star::chart::ErrorBarStyle::FROM_DATA; break;
366 : }
367 :
368 0 : if( !xErrorBarProp.is() )
369 : {
370 0 : xErrorBarProp = lcl_GetDefaultErrorBar();
371 0 : GetPropertySet()->setPropertyValue( bYError ? OUString( "ErrorBarY" ) : OUString("ErrorBarX"),
372 0 : uno::makeAny( xErrorBarProp ));
373 : }
374 :
375 0 : xErrorBarProp->setPropertyValue( "ErrorBarStyle" , uno::makeAny( nStyle ));
376 0 : bChanged = true;
377 0 : }
378 : }
379 0 : break;
380 :
381 : case SCHATTR_STAT_PERCENT:
382 : case SCHATTR_STAT_BIGERROR:
383 : {
384 : OSL_FAIL( "Deprecated item" );
385 : bool bYError =
386 0 : static_cast<const SfxBoolItem&>(rItemSet.Get(SCHATTR_STAT_ERRORBAR_TYPE)).GetValue();
387 :
388 : uno::Reference< beans::XPropertySet > xErrorBarProp(
389 0 : lcl_GetErrorBar( GetPropertySet(), bYError));
390 0 : bool bOldHasErrorBar = xErrorBarProp.is();
391 :
392 : double fValue =
393 : static_cast< const SvxDoubleItem & >(
394 0 : rItemSet.Get( nWhichId )).GetValue();
395 : double fPos, fNeg;
396 0 : lcl_getErrorValues( xErrorBarProp, fPos, fNeg );
397 :
398 0 : if( bOldHasErrorBar &&
399 0 : ! ( ::rtl::math::approxEqual( fPos, fValue ) &&
400 0 : ::rtl::math::approxEqual( fNeg, fValue )))
401 : {
402 0 : xErrorBarProp->setPropertyValue( "PositiveError" , uno::makeAny( fValue ));
403 0 : xErrorBarProp->setPropertyValue( "NegativeError" , uno::makeAny( fValue ));
404 0 : bChanged = true;
405 0 : }
406 : }
407 0 : break;
408 :
409 : case SCHATTR_STAT_CONSTPLUS:
410 : {
411 : bool bYError =
412 0 : static_cast<const SfxBoolItem&>(rItemSet.Get(SCHATTR_STAT_ERRORBAR_TYPE)).GetValue();
413 :
414 : uno::Reference< beans::XPropertySet > xErrorBarProp(
415 0 : lcl_GetErrorBar( GetPropertySet(),bYError));
416 0 : bool bOldHasErrorBar = xErrorBarProp.is();
417 :
418 : double fValue =
419 : static_cast< const SvxDoubleItem & >(
420 0 : rItemSet.Get( nWhichId )).GetValue();
421 : double fPos, fNeg;
422 0 : lcl_getErrorValues( xErrorBarProp, fPos, fNeg );
423 :
424 0 : if( bOldHasErrorBar &&
425 0 : ! ::rtl::math::approxEqual( fPos, fValue ))
426 : {
427 0 : xErrorBarProp->setPropertyValue( "PositiveError" , uno::makeAny( fValue ));
428 0 : bChanged = true;
429 0 : }
430 : }
431 0 : break;
432 :
433 : case SCHATTR_STAT_CONSTMINUS:
434 : {
435 : bool bYError =
436 0 : static_cast<const SfxBoolItem&>(rItemSet.Get(SCHATTR_STAT_ERRORBAR_TYPE)).GetValue();
437 : uno::Reference< beans::XPropertySet > xErrorBarProp(
438 0 : lcl_GetErrorBar( GetPropertySet(),bYError));
439 0 : bool bOldHasErrorBar = xErrorBarProp.is();
440 :
441 : double fValue =
442 : static_cast< const SvxDoubleItem & >(
443 0 : rItemSet.Get( nWhichId )).GetValue();
444 : double fPos, fNeg;
445 0 : lcl_getErrorValues( xErrorBarProp, fPos, fNeg );
446 :
447 0 : if( bOldHasErrorBar &&
448 0 : ! ::rtl::math::approxEqual( fNeg, fValue ))
449 : {
450 0 : xErrorBarProp->setPropertyValue( "NegativeError" , uno::makeAny( fValue ));
451 0 : bChanged = true;
452 0 : }
453 : }
454 0 : break;
455 :
456 : case SCHATTR_REGRESSION_TYPE:
457 : {
458 : SvxChartRegress eRegress =
459 : static_cast< const SvxChartRegressItem& >(
460 0 : rItemSet.Get( nWhichId )).GetValue();
461 :
462 0 : uno::Reference< chart2::XRegressionCurve > xCurve( GetPropertySet(), uno::UNO_QUERY );
463 0 : uno::Reference< chart2::XRegressionCurveContainer > xContainer( GetPropertySet(), uno::UNO_QUERY );
464 :
465 0 : if( eRegress == CHREGRESS_NONE )
466 : {
467 0 : if ( xContainer.is() )
468 : {
469 0 : xContainer->removeRegressionCurve( xCurve );
470 0 : bChanged = true;
471 : }
472 : }
473 : else
474 : {
475 0 : if ( xCurve.is() )
476 : {
477 : SvxChartRegress eOldRegress(
478 : static_cast< SvxChartRegress >(
479 : static_cast< sal_Int32 >(
480 0 : RegressionCurveHelper::getRegressionType( xCurve ))));
481 :
482 0 : if( eOldRegress != eRegress )
483 : {
484 0 : xCurve = RegressionCurveHelper::changeRegressionCurveType(
485 : lcl_convertRegressionType( eRegress ),
486 : xContainer,
487 : xCurve,
488 0 : uno::Reference< uno::XComponentContext >());
489 0 : uno::Reference< beans::XPropertySet > xProperties( xCurve, uno::UNO_QUERY );
490 0 : resetPropertySet( xProperties );
491 0 : bChanged = true;
492 : }
493 : }
494 0 : }
495 : }
496 0 : break;
497 :
498 : case SCHATTR_REGRESSION_DEGREE:
499 : {
500 0 : uno::Reference< beans::XPropertySet > xProperties( lcl_getCurveProperties( GetPropertySet(), &rItemSet ));
501 0 : bChanged = lclConvertToPropertySet<sal_Int32, SfxInt32Item>(rItemSet, nWhichId, xProperties, "PolynomialDegree");
502 : }
503 0 : break;
504 :
505 : case SCHATTR_REGRESSION_PERIOD:
506 : {
507 0 : uno::Reference< beans::XPropertySet > xProperties( lcl_getCurveProperties( GetPropertySet(), &rItemSet ));
508 0 : bChanged = lclConvertToPropertySet<sal_Int32, SfxInt32Item>(rItemSet, nWhichId, xProperties, "MovingAveragePeriod");
509 : }
510 0 : break;
511 :
512 : case SCHATTR_REGRESSION_EXTRAPOLATE_FORWARD:
513 : {
514 0 : uno::Reference< beans::XPropertySet > xProperties( lcl_getCurveProperties( GetPropertySet(), &rItemSet ));
515 0 : bChanged = lclConvertToPropertySet<double, SvxDoubleItem>(rItemSet, nWhichId, xProperties, "ExtrapolateForward");
516 : }
517 0 : break;
518 :
519 : case SCHATTR_REGRESSION_EXTRAPOLATE_BACKWARD:
520 : {
521 0 : uno::Reference< beans::XPropertySet > xProperties( lcl_getCurveProperties( GetPropertySet(), &rItemSet ));
522 0 : bChanged = lclConvertToPropertySet<double, SvxDoubleItem>(rItemSet, nWhichId, xProperties, "ExtrapolateBackward");
523 : }
524 0 : break;
525 :
526 : case SCHATTR_REGRESSION_SET_INTERCEPT:
527 : {
528 0 : uno::Reference< beans::XPropertySet > xProperties( lcl_getCurveProperties( GetPropertySet(), &rItemSet ));
529 0 : bChanged = lclConvertToPropertySet<sal_Bool, SfxBoolItem>(rItemSet, nWhichId, xProperties, "ForceIntercept");
530 : }
531 0 : break;
532 :
533 : case SCHATTR_REGRESSION_INTERCEPT_VALUE:
534 : {
535 0 : uno::Reference< beans::XPropertySet > xProperties( lcl_getCurveProperties( GetPropertySet(), &rItemSet ));
536 0 : bChanged = lclConvertToPropertySet<double, SvxDoubleItem>(rItemSet, nWhichId, xProperties, "InterceptValue");
537 : }
538 0 : break;
539 :
540 : case SCHATTR_REGRESSION_CURVE_NAME:
541 : {
542 0 : uno::Reference< beans::XPropertySet > xProperties( lcl_getCurveProperties( GetPropertySet(), &rItemSet ));
543 0 : bChanged = lclConvertToPropertySet<OUString, SfxStringItem>(rItemSet, nWhichId, xProperties, "CurveName");
544 : }
545 0 : break;
546 :
547 : case SCHATTR_REGRESSION_SHOW_EQUATION:
548 : {
549 0 : uno::Reference< beans::XPropertySet > xEqProp( lcl_getEquationProperties( GetPropertySet(), &rItemSet ));
550 0 : bChanged = lclConvertToPropertySet<sal_Bool, SfxBoolItem>(rItemSet, nWhichId, xEqProp, "ShowEquation");
551 : }
552 0 : break;
553 :
554 : case SCHATTR_REGRESSION_SHOW_COEFF:
555 : {
556 0 : uno::Reference< beans::XPropertySet > xEqProp( lcl_getEquationProperties( GetPropertySet(), &rItemSet ));
557 0 : bChanged = lclConvertToPropertySet<sal_Bool, SfxBoolItem>(rItemSet, nWhichId, xEqProp, "ShowCorrelationCoefficient");
558 : }
559 0 : break;
560 :
561 : case SCHATTR_STAT_INDICATE:
562 : {
563 : bool bYError =
564 0 : static_cast<const SfxBoolItem&>(rItemSet.Get(SCHATTR_STAT_ERRORBAR_TYPE)).GetValue();
565 : uno::Reference< beans::XPropertySet > xErrorBarProp(
566 0 : lcl_GetErrorBar( GetPropertySet(),bYError));
567 0 : bool bOldHasErrorBar = xErrorBarProp.is();
568 :
569 : SvxChartIndicate eIndicate =
570 : static_cast< const SvxChartIndicateItem & >(
571 0 : rItemSet.Get( nWhichId )).GetValue();
572 :
573 0 : bool bNewIndPos = (eIndicate == CHINDICATE_BOTH || eIndicate == CHINDICATE_UP );
574 0 : bool bNewIndNeg = (eIndicate == CHINDICATE_BOTH || eIndicate == CHINDICATE_DOWN );
575 :
576 : bool bShowPos, bShowNeg;
577 0 : lcl_getErrorIndicatorValues( xErrorBarProp, bShowPos, bShowNeg );
578 :
579 0 : if( bOldHasErrorBar &&
580 0 : ( bShowPos != bNewIndPos ||
581 0 : bShowNeg != bNewIndNeg ))
582 : {
583 0 : xErrorBarProp->setPropertyValue( "ShowPositiveError" , uno::makeAny( bNewIndPos ));
584 0 : xErrorBarProp->setPropertyValue( "ShowNegativeError" , uno::makeAny( bNewIndNeg ));
585 0 : bChanged = true;
586 0 : }
587 : }
588 0 : break;
589 :
590 : case SCHATTR_STAT_RANGE_POS:
591 : case SCHATTR_STAT_RANGE_NEG:
592 : {
593 : const bool bYError =
594 0 : static_cast<const SfxBoolItem&>(rItemSet.Get(SCHATTR_STAT_ERRORBAR_TYPE)).GetValue();
595 : uno::Reference< chart2::data::XDataSource > xErrorBarSource( lcl_GetErrorBar( GetPropertySet(), bYError),
596 0 : uno::UNO_QUERY );
597 0 : uno::Reference< chart2::XChartDocument > xChartDoc( m_xModel, uno::UNO_QUERY );
598 0 : uno::Reference< chart2::data::XDataProvider > xDataProvider;
599 :
600 0 : if( xChartDoc.is())
601 0 : xDataProvider.set( xChartDoc->getDataProvider());
602 0 : if( xErrorBarSource.is() && xDataProvider.is())
603 : {
604 0 : OUString aNewRange( static_cast< const SfxStringItem & >( rItemSet.Get( nWhichId )).GetValue());
605 0 : bool bApplyNewRange = false;
606 :
607 0 : bool bIsPositiveValue( nWhichId == SCHATTR_STAT_RANGE_POS );
608 0 : if( xChartDoc->hasInternalDataProvider())
609 : {
610 0 : if( !aNewRange.isEmpty())
611 : {
612 : uno::Reference< chart2::data::XDataSequence > xSeq(
613 : StatisticsHelper::getErrorDataSequenceFromDataSource(
614 0 : xErrorBarSource, bIsPositiveValue, bYError ));
615 0 : if( ! xSeq.is())
616 : {
617 : // no data range for error bars yet => create
618 0 : uno::Reference< chart2::XInternalDataProvider > xIntDataProvider( xDataProvider, uno::UNO_QUERY );
619 : OSL_ASSERT( xIntDataProvider.is());
620 0 : if( xIntDataProvider.is())
621 : {
622 0 : xIntDataProvider->appendSequence();
623 0 : aNewRange = "last";
624 0 : bApplyNewRange = true;
625 0 : }
626 0 : }
627 : }
628 : }
629 : else
630 : {
631 : uno::Reference< chart2::data::XDataSequence > xSeq(
632 : StatisticsHelper::getErrorDataSequenceFromDataSource(
633 0 : xErrorBarSource, bIsPositiveValue, bYError ));
634 : bApplyNewRange =
635 0 : ! ( xSeq.is() && (aNewRange == xSeq->getSourceRangeRepresentation()));
636 : }
637 :
638 0 : if( bApplyNewRange )
639 : StatisticsHelper::setErrorDataSequence(
640 0 : xErrorBarSource, xDataProvider, aNewRange, bIsPositiveValue, bYError );
641 0 : }
642 : }
643 0 : break;
644 : }
645 :
646 0 : return bChanged;
647 : }
648 :
649 0 : void StatisticsItemConverter::FillSpecialItem(
650 : sal_uInt16 nWhichId, SfxItemSet & rOutItemSet ) const
651 : throw( uno::Exception )
652 : {
653 0 : switch( nWhichId )
654 : {
655 : case SCHATTR_STAT_AVERAGE:
656 : rOutItemSet.Put(
657 : SfxBoolItem( nWhichId,
658 : RegressionCurveHelper::hasMeanValueLine(
659 : uno::Reference< chart2::XRegressionCurveContainer >(
660 0 : GetPropertySet(), uno::UNO_QUERY ))));
661 0 : break;
662 :
663 : case SCHATTR_STAT_KIND_ERROR:
664 : {
665 : bool bYError =
666 0 : static_cast<const SfxBoolItem&>(rOutItemSet.Get(SCHATTR_STAT_ERRORBAR_TYPE)).GetValue();
667 0 : SvxChartKindError eErrorKind = CHERROR_NONE;
668 : uno::Reference< beans::XPropertySet > xErrorBarProp(
669 0 : lcl_GetErrorBar( GetPropertySet(), bYError));
670 0 : if( xErrorBarProp.is() )
671 : {
672 0 : sal_Int32 nStyle = 0;
673 0 : if( xErrorBarProp->getPropertyValue( "ErrorBarStyle" ) >>= nStyle )
674 : {
675 0 : switch( nStyle )
676 : {
677 : case ::com::sun::star::chart::ErrorBarStyle::NONE:
678 0 : break;
679 : case ::com::sun::star::chart::ErrorBarStyle::VARIANCE:
680 0 : eErrorKind = CHERROR_VARIANT; break;
681 : case ::com::sun::star::chart::ErrorBarStyle::STANDARD_DEVIATION:
682 0 : eErrorKind = CHERROR_SIGMA; break;
683 : case ::com::sun::star::chart::ErrorBarStyle::ABSOLUTE:
684 0 : eErrorKind = CHERROR_CONST; break;
685 : case ::com::sun::star::chart::ErrorBarStyle::RELATIVE:
686 0 : eErrorKind = CHERROR_PERCENT; break;
687 : case ::com::sun::star::chart::ErrorBarStyle::ERROR_MARGIN:
688 0 : eErrorKind = CHERROR_BIGERROR; break;
689 : case ::com::sun::star::chart::ErrorBarStyle::STANDARD_ERROR:
690 0 : eErrorKind = CHERROR_STDERROR; break;
691 : case ::com::sun::star::chart::ErrorBarStyle::FROM_DATA:
692 0 : eErrorKind = CHERROR_RANGE; break;
693 : }
694 : }
695 : }
696 0 : rOutItemSet.Put( SvxChartKindErrorItem( eErrorKind, SCHATTR_STAT_KIND_ERROR ));
697 : }
698 0 : break;
699 :
700 : case SCHATTR_STAT_PERCENT:
701 : {
702 : bool bYError =
703 0 : static_cast<const SfxBoolItem&>(rOutItemSet.Get(SCHATTR_STAT_ERRORBAR_TYPE)).GetValue();
704 0 : uno::Reference< beans::XPropertySet > xErrorBarProp( lcl_GetErrorBar( GetPropertySet(),bYError));
705 0 : if( xErrorBarProp.is())
706 : {
707 : double fPos, fNeg;
708 0 : lcl_getErrorValues( xErrorBarProp, fPos, fNeg );
709 0 : rOutItemSet.Put( SvxDoubleItem( ( fPos + fNeg ) / 2.0, nWhichId ));
710 0 : }
711 : }
712 0 : break;
713 :
714 : case SCHATTR_STAT_BIGERROR:
715 : {
716 : bool bYError =
717 0 : static_cast<const SfxBoolItem&>(rOutItemSet.Get(SCHATTR_STAT_ERRORBAR_TYPE)).GetValue();
718 0 : uno::Reference< beans::XPropertySet > xErrorBarProp( lcl_GetErrorBar( GetPropertySet(),bYError));
719 0 : if( xErrorBarProp.is())
720 : {
721 : double fPos, fNeg;
722 0 : lcl_getErrorValues( xErrorBarProp, fPos, fNeg );
723 0 : rOutItemSet.Put( SvxDoubleItem( ( fPos + fNeg ) / 2.0, nWhichId ));
724 0 : }
725 : }
726 0 : break;
727 :
728 : case SCHATTR_STAT_CONSTPLUS:
729 : {
730 : bool bYError =
731 0 : static_cast<const SfxBoolItem&>(rOutItemSet.Get(SCHATTR_STAT_ERRORBAR_TYPE)).GetValue();
732 0 : uno::Reference< beans::XPropertySet > xErrorBarProp( lcl_GetErrorBar( GetPropertySet(),bYError));
733 0 : if( xErrorBarProp.is())
734 : {
735 : double fPos, fNeg;
736 0 : lcl_getErrorValues( xErrorBarProp, fPos, fNeg );
737 0 : rOutItemSet.Put( SvxDoubleItem( fPos, nWhichId ));
738 0 : }
739 : }
740 0 : break;
741 :
742 : case SCHATTR_STAT_CONSTMINUS:
743 : {
744 : bool bYError =
745 0 : static_cast<const SfxBoolItem&>(rOutItemSet.Get(SCHATTR_STAT_ERRORBAR_TYPE)).GetValue();
746 0 : uno::Reference< beans::XPropertySet > xErrorBarProp( lcl_GetErrorBar( GetPropertySet(),bYError));
747 0 : if( xErrorBarProp.is())
748 : {
749 : double fPos, fNeg;
750 0 : lcl_getErrorValues( xErrorBarProp, fPos, fNeg );
751 0 : rOutItemSet.Put( SvxDoubleItem( fNeg, nWhichId ));
752 0 : }
753 : }
754 0 : break;
755 :
756 : case SCHATTR_REGRESSION_TYPE:
757 : {
758 : SvxChartRegress eRegress = static_cast< SvxChartRegress >(
759 : static_cast< sal_Int32 >(
760 : RegressionCurveHelper::getFirstRegressTypeNotMeanValueLine(
761 : uno::Reference< chart2::XRegressionCurveContainer >(
762 0 : GetPropertySet(), uno::UNO_QUERY ) )));
763 0 : rOutItemSet.Put( SvxChartRegressItem( eRegress, SCHATTR_REGRESSION_TYPE ));
764 : }
765 0 : break;
766 :
767 : case SCHATTR_REGRESSION_DEGREE:
768 : {
769 :
770 0 : uno::Reference<beans::XPropertySet> xProperties( lcl_getCurveProperties( GetPropertySet(), 0 ));
771 0 : lclConvertToItemSet<sal_Int32, SfxInt32Item>(rOutItemSet, nWhichId, xProperties, "PolynomialDegree");
772 : }
773 0 : break;
774 :
775 : case SCHATTR_REGRESSION_PERIOD:
776 : {
777 0 : uno::Reference< beans::XPropertySet > xProperties( lcl_getCurveProperties( GetPropertySet(), 0 ));
778 0 : lclConvertToItemSet<sal_Int32, SfxInt32Item>(rOutItemSet, nWhichId, xProperties, "MovingAveragePeriod");
779 : }
780 0 : break;
781 :
782 : case SCHATTR_REGRESSION_EXTRAPOLATE_FORWARD:
783 : {
784 0 : uno::Reference< beans::XPropertySet > xProperties( lcl_getCurveProperties( GetPropertySet(), 0 ));
785 0 : lclConvertToItemSetDouble(rOutItemSet, nWhichId, xProperties, "ExtrapolateForward");
786 : }
787 0 : break;
788 :
789 : case SCHATTR_REGRESSION_EXTRAPOLATE_BACKWARD:
790 : {
791 0 : uno::Reference< beans::XPropertySet > xProperties( lcl_getCurveProperties( GetPropertySet(), 0 ));
792 0 : lclConvertToItemSetDouble(rOutItemSet, nWhichId, xProperties, "ExtrapolateBackward");
793 : }
794 0 : break;
795 :
796 : case SCHATTR_REGRESSION_SET_INTERCEPT:
797 : {
798 0 : uno::Reference< beans::XPropertySet > xProperties( lcl_getCurveProperties( GetPropertySet(), 0 ));
799 0 : lclConvertToItemSet<sal_Bool, SfxBoolItem>(rOutItemSet, nWhichId, xProperties, "ForceIntercept");
800 : }
801 0 : break;
802 :
803 : case SCHATTR_REGRESSION_INTERCEPT_VALUE:
804 : {
805 0 : uno::Reference< beans::XPropertySet > xProperties( lcl_getCurveProperties( GetPropertySet(), 0 ));
806 0 : lclConvertToItemSetDouble(rOutItemSet, nWhichId, xProperties, "InterceptValue");
807 : }
808 0 : break;
809 :
810 : case SCHATTR_REGRESSION_CURVE_NAME:
811 : {
812 0 : uno::Reference< beans::XPropertySet > xProperties( lcl_getCurveProperties( GetPropertySet(), 0 ));
813 0 : lclConvertToItemSet<OUString, SfxStringItem>(rOutItemSet, nWhichId, xProperties, "CurveName");
814 : }
815 0 : break;
816 :
817 : case SCHATTR_REGRESSION_SHOW_EQUATION:
818 : {
819 0 : uno::Reference< beans::XPropertySet > xEqProp( lcl_getEquationProperties( GetPropertySet(), 0 ));
820 0 : lclConvertToItemSet<sal_Bool, SfxBoolItem>(rOutItemSet, nWhichId, xEqProp, "ShowEquation");
821 : }
822 0 : break;
823 :
824 : case SCHATTR_REGRESSION_SHOW_COEFF:
825 : {
826 0 : uno::Reference< beans::XPropertySet > xEqProp( lcl_getEquationProperties( GetPropertySet(), 0 ));
827 0 : lclConvertToItemSet<sal_Bool, SfxBoolItem>(rOutItemSet, nWhichId, xEqProp, "ShowCorrelationCoefficient");
828 : }
829 0 : break;
830 :
831 : case SCHATTR_STAT_INDICATE:
832 : {
833 : bool bYError =
834 0 : static_cast<const SfxBoolItem&>(rOutItemSet.Get(SCHATTR_STAT_ERRORBAR_TYPE)).GetValue();
835 0 : uno::Reference< beans::XPropertySet > xErrorBarProp( lcl_GetErrorBar( GetPropertySet(),bYError));
836 0 : SvxChartIndicate eIndicate = CHINDICATE_BOTH;
837 0 : if( xErrorBarProp.is())
838 : {
839 : bool bShowPos, bShowNeg;
840 0 : lcl_getErrorIndicatorValues( xErrorBarProp, bShowPos, bShowNeg );
841 :
842 0 : if( bShowPos )
843 : {
844 0 : if( bShowNeg )
845 0 : eIndicate = CHINDICATE_BOTH;
846 : else
847 0 : eIndicate = CHINDICATE_UP;
848 : }
849 : else
850 : {
851 0 : if( bShowNeg )
852 0 : eIndicate = CHINDICATE_DOWN;
853 : else
854 0 : eIndicate = CHINDICATE_NONE;
855 : }
856 : }
857 0 : rOutItemSet.Put( SvxChartIndicateItem( eIndicate, SCHATTR_STAT_INDICATE ));
858 : }
859 0 : break;
860 :
861 : case SCHATTR_STAT_RANGE_POS:
862 : case SCHATTR_STAT_RANGE_NEG:
863 : {
864 : bool bYError =
865 0 : static_cast<const SfxBoolItem&>(rOutItemSet.Get(SCHATTR_STAT_ERRORBAR_TYPE)).GetValue();
866 : uno::Reference< chart2::data::XDataSource > xErrorBarSource( lcl_GetErrorBar( GetPropertySet(),bYError),
867 0 : uno::UNO_QUERY );
868 0 : if( xErrorBarSource.is())
869 : {
870 : uno::Reference< chart2::data::XDataSequence > xSeq(
871 : StatisticsHelper::getErrorDataSequenceFromDataSource(
872 0 : xErrorBarSource, (nWhichId == SCHATTR_STAT_RANGE_POS), bYError ));
873 0 : if( xSeq.is())
874 0 : rOutItemSet.Put( SfxStringItem( nWhichId, xSeq->getSourceRangeRepresentation()));
875 0 : }
876 : }
877 0 : break;
878 : }
879 0 : }
880 :
881 : } // namespace wrapper
882 : } // namespace chart
883 :
884 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|