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