1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_chart2.hxx" 30*cdf0e10cSrcweir #include "RegressionCurveHelper.hxx" 31*cdf0e10cSrcweir #include "MeanValueRegressionCurveCalculator.hxx" 32*cdf0e10cSrcweir #include "LinearRegressionCurveCalculator.hxx" 33*cdf0e10cSrcweir #include "LogarithmicRegressionCurveCalculator.hxx" 34*cdf0e10cSrcweir #include "ExponentialRegressionCurveCalculator.hxx" 35*cdf0e10cSrcweir #include "PotentialRegressionCurveCalculator.hxx" 36*cdf0e10cSrcweir #include "CommonConverters.hxx" 37*cdf0e10cSrcweir #include "RegressionCurveModel.hxx" 38*cdf0e10cSrcweir #include "ChartTypeHelper.hxx" 39*cdf0e10cSrcweir #include "ChartModelHelper.hxx" 40*cdf0e10cSrcweir #include "macros.hxx" 41*cdf0e10cSrcweir #include "PropertyHelper.hxx" 42*cdf0e10cSrcweir #include "ResId.hxx" 43*cdf0e10cSrcweir #include "Strings.hrc" 44*cdf0e10cSrcweir #include "DiagramHelper.hxx" 45*cdf0e10cSrcweir #include <com/sun/star/chart2/XChartDocument.hpp> 46*cdf0e10cSrcweir 47*cdf0e10cSrcweir using namespace ::com::sun::star; 48*cdf0e10cSrcweir using namespace ::com::sun::star::chart2; 49*cdf0e10cSrcweir 50*cdf0e10cSrcweir using ::com::sun::star::uno::Reference; 51*cdf0e10cSrcweir using ::com::sun::star::uno::Sequence; 52*cdf0e10cSrcweir using ::com::sun::star::uno::XComponentContext; 53*cdf0e10cSrcweir using ::com::sun::star::lang::XServiceName; 54*cdf0e10cSrcweir using ::com::sun::star::beans::XPropertySet; 55*cdf0e10cSrcweir using ::com::sun::star::uno::Exception; 56*cdf0e10cSrcweir using ::rtl::OUString; 57*cdf0e10cSrcweir 58*cdf0e10cSrcweir namespace 59*cdf0e10cSrcweir { 60*cdf0e10cSrcweir OUString lcl_getServiceNameForType( ::chart::RegressionCurveHelper::tRegressionType eType ) 61*cdf0e10cSrcweir { 62*cdf0e10cSrcweir OUString aServiceName; 63*cdf0e10cSrcweir switch( eType ) 64*cdf0e10cSrcweir { 65*cdf0e10cSrcweir case ::chart::RegressionCurveHelper::REGRESSION_TYPE_LINEAR: 66*cdf0e10cSrcweir aServiceName = C2U( "com.sun.star.chart2.LinearRegressionCurve" ); 67*cdf0e10cSrcweir break; 68*cdf0e10cSrcweir case ::chart::RegressionCurveHelper::REGRESSION_TYPE_LOG: 69*cdf0e10cSrcweir aServiceName = C2U( "com.sun.star.chart2.LogarithmicRegressionCurve" ); 70*cdf0e10cSrcweir break; 71*cdf0e10cSrcweir case ::chart::RegressionCurveHelper::REGRESSION_TYPE_EXP: 72*cdf0e10cSrcweir aServiceName = C2U( "com.sun.star.chart2.ExponentialRegressionCurve" ); 73*cdf0e10cSrcweir break; 74*cdf0e10cSrcweir case ::chart::RegressionCurveHelper::REGRESSION_TYPE_POWER: 75*cdf0e10cSrcweir aServiceName = C2U( "com.sun.star.chart2.PotentialRegressionCurve" ); 76*cdf0e10cSrcweir break; 77*cdf0e10cSrcweir default: 78*cdf0e10cSrcweir OSL_ENSURE(false,"unknown regression curve type - use linear instead"); 79*cdf0e10cSrcweir aServiceName = C2U( "com.sun.star.chart2.LinearRegressionCurve" ); 80*cdf0e10cSrcweir break; 81*cdf0e10cSrcweir } 82*cdf0e10cSrcweir return aServiceName; 83*cdf0e10cSrcweir } 84*cdf0e10cSrcweir } // anonymous namespace 85*cdf0e10cSrcweir 86*cdf0e10cSrcweir //............................................................................. 87*cdf0e10cSrcweir namespace chart 88*cdf0e10cSrcweir { 89*cdf0e10cSrcweir //............................................................................. 90*cdf0e10cSrcweir 91*cdf0e10cSrcweir Reference< XRegressionCurve > RegressionCurveHelper::createMeanValueLine( 92*cdf0e10cSrcweir const Reference< XComponentContext > & xContext ) 93*cdf0e10cSrcweir { 94*cdf0e10cSrcweir return Reference< XRegressionCurve >( 95*cdf0e10cSrcweir new MeanValueRegressionCurve( xContext )); 96*cdf0e10cSrcweir } 97*cdf0e10cSrcweir 98*cdf0e10cSrcweir Reference< XRegressionCurve > RegressionCurveHelper::createRegressionCurveByServiceName( 99*cdf0e10cSrcweir const Reference< XComponentContext > & xContext, 100*cdf0e10cSrcweir ::rtl::OUString aServiceName ) 101*cdf0e10cSrcweir { 102*cdf0e10cSrcweir Reference< XRegressionCurve > xResult; 103*cdf0e10cSrcweir 104*cdf0e10cSrcweir // todo: use factory methods with service name 105*cdf0e10cSrcweir if( aServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( 106*cdf0e10cSrcweir "com.sun.star.chart2.LinearRegressionCurve" ))) 107*cdf0e10cSrcweir { 108*cdf0e10cSrcweir xResult.set( 109*cdf0e10cSrcweir new LinearRegressionCurve( xContext )); 110*cdf0e10cSrcweir } 111*cdf0e10cSrcweir else if( aServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( 112*cdf0e10cSrcweir "com.sun.star.chart2.LogarithmicRegressionCurve" ))) 113*cdf0e10cSrcweir { 114*cdf0e10cSrcweir xResult.set( 115*cdf0e10cSrcweir new LogarithmicRegressionCurve( xContext )); 116*cdf0e10cSrcweir } 117*cdf0e10cSrcweir else if( aServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( 118*cdf0e10cSrcweir "com.sun.star.chart2.ExponentialRegressionCurve" ))) 119*cdf0e10cSrcweir { 120*cdf0e10cSrcweir xResult.set( 121*cdf0e10cSrcweir new ExponentialRegressionCurve( xContext )); 122*cdf0e10cSrcweir } 123*cdf0e10cSrcweir else if( aServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( 124*cdf0e10cSrcweir "com.sun.star.chart2.PotentialRegressionCurve" ))) 125*cdf0e10cSrcweir { 126*cdf0e10cSrcweir xResult.set( 127*cdf0e10cSrcweir new PotentialRegressionCurve( xContext )); 128*cdf0e10cSrcweir } 129*cdf0e10cSrcweir 130*cdf0e10cSrcweir return xResult; 131*cdf0e10cSrcweir } 132*cdf0e10cSrcweir 133*cdf0e10cSrcweir // ------------------------------------------------------------ 134*cdf0e10cSrcweir 135*cdf0e10cSrcweir Reference< XRegressionCurveCalculator > RegressionCurveHelper::createRegressionCurveCalculatorByServiceName( 136*cdf0e10cSrcweir ::rtl::OUString aServiceName ) 137*cdf0e10cSrcweir { 138*cdf0e10cSrcweir Reference< XRegressionCurveCalculator > xResult; 139*cdf0e10cSrcweir 140*cdf0e10cSrcweir // todo: use factory methods with service name 141*cdf0e10cSrcweir if( aServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( 142*cdf0e10cSrcweir "com.sun.star.chart2.MeanValueRegressionCurve" ))) 143*cdf0e10cSrcweir { 144*cdf0e10cSrcweir xResult.set( new MeanValueRegressionCurveCalculator()); 145*cdf0e10cSrcweir } 146*cdf0e10cSrcweir if( aServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( 147*cdf0e10cSrcweir "com.sun.star.chart2.LinearRegressionCurve" ))) 148*cdf0e10cSrcweir { 149*cdf0e10cSrcweir xResult.set( new LinearRegressionCurveCalculator()); 150*cdf0e10cSrcweir } 151*cdf0e10cSrcweir else if( aServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( 152*cdf0e10cSrcweir "com.sun.star.chart2.LogarithmicRegressionCurve" ))) 153*cdf0e10cSrcweir { 154*cdf0e10cSrcweir xResult.set( new LogarithmicRegressionCurveCalculator()); 155*cdf0e10cSrcweir } 156*cdf0e10cSrcweir else if( aServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( 157*cdf0e10cSrcweir "com.sun.star.chart2.ExponentialRegressionCurve" ))) 158*cdf0e10cSrcweir { 159*cdf0e10cSrcweir xResult.set( new ExponentialRegressionCurveCalculator()); 160*cdf0e10cSrcweir } 161*cdf0e10cSrcweir else if( aServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( 162*cdf0e10cSrcweir "com.sun.star.chart2.PotentialRegressionCurve" ))) 163*cdf0e10cSrcweir { 164*cdf0e10cSrcweir xResult.set( new PotentialRegressionCurveCalculator()); 165*cdf0e10cSrcweir } 166*cdf0e10cSrcweir 167*cdf0e10cSrcweir return xResult; 168*cdf0e10cSrcweir } 169*cdf0e10cSrcweir 170*cdf0e10cSrcweir void RegressionCurveHelper::initializeCurveCalculator( 171*cdf0e10cSrcweir const Reference< XRegressionCurveCalculator > & xOutCurveCalculator, 172*cdf0e10cSrcweir const Reference< data::XDataSource > & xSource, 173*cdf0e10cSrcweir bool bUseXValuesIfAvailable /* = true */ ) 174*cdf0e10cSrcweir { 175*cdf0e10cSrcweir if( ! (xOutCurveCalculator.is() && 176*cdf0e10cSrcweir xSource.is() )) 177*cdf0e10cSrcweir return; 178*cdf0e10cSrcweir 179*cdf0e10cSrcweir Sequence< double > aXValues, aYValues; 180*cdf0e10cSrcweir bool bXValuesFound = false, bYValuesFound = false; 181*cdf0e10cSrcweir 182*cdf0e10cSrcweir Sequence< Reference< data::XLabeledDataSequence > > aDataSeqs( xSource->getDataSequences()); 183*cdf0e10cSrcweir sal_Int32 i = 0; 184*cdf0e10cSrcweir for( i=0; 185*cdf0e10cSrcweir ! (bXValuesFound && bYValuesFound) && i<aDataSeqs.getLength(); 186*cdf0e10cSrcweir ++i ) 187*cdf0e10cSrcweir { 188*cdf0e10cSrcweir try 189*cdf0e10cSrcweir { 190*cdf0e10cSrcweir Reference< data::XDataSequence > xSeq( aDataSeqs[i]->getValues()); 191*cdf0e10cSrcweir Reference< XPropertySet > xProp( xSeq, uno::UNO_QUERY_THROW ); 192*cdf0e10cSrcweir ::rtl::OUString aRole; 193*cdf0e10cSrcweir if( xProp->getPropertyValue( 194*cdf0e10cSrcweir ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Role" ))) >>= aRole ) 195*cdf0e10cSrcweir { 196*cdf0e10cSrcweir if( bUseXValuesIfAvailable && 197*cdf0e10cSrcweir ! bXValuesFound && 198*cdf0e10cSrcweir aRole.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "values-x" ))) 199*cdf0e10cSrcweir { 200*cdf0e10cSrcweir aXValues = DataSequenceToDoubleSequence( xSeq ); 201*cdf0e10cSrcweir bXValuesFound = true; 202*cdf0e10cSrcweir } 203*cdf0e10cSrcweir else if( ! bYValuesFound && 204*cdf0e10cSrcweir aRole.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "values-y" ))) 205*cdf0e10cSrcweir { 206*cdf0e10cSrcweir aYValues = DataSequenceToDoubleSequence( xSeq ); 207*cdf0e10cSrcweir bYValuesFound = true; 208*cdf0e10cSrcweir } 209*cdf0e10cSrcweir } 210*cdf0e10cSrcweir } 211*cdf0e10cSrcweir catch( Exception & ex ) 212*cdf0e10cSrcweir { 213*cdf0e10cSrcweir ASSERT_EXCEPTION( ex ); 214*cdf0e10cSrcweir } 215*cdf0e10cSrcweir } 216*cdf0e10cSrcweir 217*cdf0e10cSrcweir if( ! bXValuesFound && 218*cdf0e10cSrcweir bYValuesFound ) 219*cdf0e10cSrcweir { 220*cdf0e10cSrcweir // initialize with 1, 2, ... 221*cdf0e10cSrcweir //first category (index 0) matches with real number 1.0 222*cdf0e10cSrcweir aXValues.realloc( aYValues.getLength()); 223*cdf0e10cSrcweir for( i=0; i<aXValues.getLength(); ++i ) 224*cdf0e10cSrcweir aXValues[i] = i+1; 225*cdf0e10cSrcweir bXValuesFound = true; 226*cdf0e10cSrcweir } 227*cdf0e10cSrcweir 228*cdf0e10cSrcweir if( bXValuesFound && bYValuesFound && 229*cdf0e10cSrcweir aXValues.getLength() > 0 && 230*cdf0e10cSrcweir aYValues.getLength() > 0 ) 231*cdf0e10cSrcweir xOutCurveCalculator->recalculateRegression( aXValues, aYValues ); 232*cdf0e10cSrcweir } 233*cdf0e10cSrcweir 234*cdf0e10cSrcweir void RegressionCurveHelper::initializeCurveCalculator( 235*cdf0e10cSrcweir const Reference< XRegressionCurveCalculator > & xOutCurveCalculator, 236*cdf0e10cSrcweir const Reference< XDataSeries > & xSeries, 237*cdf0e10cSrcweir const Reference< frame::XModel > & xModel ) 238*cdf0e10cSrcweir { 239*cdf0e10cSrcweir sal_Int32 nAxisType = ChartTypeHelper::getAxisType( 240*cdf0e10cSrcweir ChartModelHelper::getChartTypeOfSeries( xModel, xSeries ), 0 ); // x-axis 241*cdf0e10cSrcweir 242*cdf0e10cSrcweir initializeCurveCalculator( xOutCurveCalculator, 243*cdf0e10cSrcweir uno::Reference< data::XDataSource >( xSeries, uno::UNO_QUERY ), 244*cdf0e10cSrcweir (nAxisType == AxisType::REALNUMBER) ); 245*cdf0e10cSrcweir } 246*cdf0e10cSrcweir 247*cdf0e10cSrcweir // ---------------------------------------- 248*cdf0e10cSrcweir 249*cdf0e10cSrcweir bool RegressionCurveHelper::hasMeanValueLine( 250*cdf0e10cSrcweir const uno::Reference< XRegressionCurveContainer > & xRegCnt ) 251*cdf0e10cSrcweir { 252*cdf0e10cSrcweir if( !xRegCnt.is()) 253*cdf0e10cSrcweir return false; 254*cdf0e10cSrcweir 255*cdf0e10cSrcweir try 256*cdf0e10cSrcweir { 257*cdf0e10cSrcweir uno::Sequence< uno::Reference< XRegressionCurve > > aCurves( 258*cdf0e10cSrcweir xRegCnt->getRegressionCurves()); 259*cdf0e10cSrcweir for( sal_Int32 i = 0; i < aCurves.getLength(); ++i ) 260*cdf0e10cSrcweir { 261*cdf0e10cSrcweir if( isMeanValueLine( aCurves[i] )) 262*cdf0e10cSrcweir return true; 263*cdf0e10cSrcweir } 264*cdf0e10cSrcweir } 265*cdf0e10cSrcweir catch( Exception & ex ) 266*cdf0e10cSrcweir { 267*cdf0e10cSrcweir ASSERT_EXCEPTION( ex ); 268*cdf0e10cSrcweir } 269*cdf0e10cSrcweir 270*cdf0e10cSrcweir return false; 271*cdf0e10cSrcweir } 272*cdf0e10cSrcweir 273*cdf0e10cSrcweir bool RegressionCurveHelper::isMeanValueLine( 274*cdf0e10cSrcweir const uno::Reference< chart2::XRegressionCurve > & xRegCurve ) 275*cdf0e10cSrcweir { 276*cdf0e10cSrcweir uno::Reference< XServiceName > xServName( xRegCurve, uno::UNO_QUERY ); 277*cdf0e10cSrcweir if( xServName.is() && 278*cdf0e10cSrcweir xServName->getServiceName().equals( 279*cdf0e10cSrcweir C2U( "com.sun.star.chart2.MeanValueRegressionCurve" ))) 280*cdf0e10cSrcweir return true; 281*cdf0e10cSrcweir return false; 282*cdf0e10cSrcweir } 283*cdf0e10cSrcweir 284*cdf0e10cSrcweir uno::Reference< chart2::XRegressionCurve > 285*cdf0e10cSrcweir RegressionCurveHelper::getMeanValueLine( 286*cdf0e10cSrcweir const uno::Reference< chart2::XRegressionCurveContainer > & xRegCnt ) 287*cdf0e10cSrcweir { 288*cdf0e10cSrcweir if( xRegCnt.is()) 289*cdf0e10cSrcweir { 290*cdf0e10cSrcweir try 291*cdf0e10cSrcweir { 292*cdf0e10cSrcweir uno::Sequence< uno::Reference< XRegressionCurve > > aCurves( 293*cdf0e10cSrcweir xRegCnt->getRegressionCurves()); 294*cdf0e10cSrcweir for( sal_Int32 i = 0; i < aCurves.getLength(); ++i ) 295*cdf0e10cSrcweir { 296*cdf0e10cSrcweir if( isMeanValueLine( aCurves[i] )) 297*cdf0e10cSrcweir return aCurves[i]; 298*cdf0e10cSrcweir } 299*cdf0e10cSrcweir } 300*cdf0e10cSrcweir catch( Exception & ex ) 301*cdf0e10cSrcweir { 302*cdf0e10cSrcweir ASSERT_EXCEPTION( ex ); 303*cdf0e10cSrcweir } 304*cdf0e10cSrcweir } 305*cdf0e10cSrcweir 306*cdf0e10cSrcweir return uno::Reference< chart2::XRegressionCurve >(); 307*cdf0e10cSrcweir } 308*cdf0e10cSrcweir 309*cdf0e10cSrcweir void RegressionCurveHelper::addMeanValueLine( 310*cdf0e10cSrcweir uno::Reference< XRegressionCurveContainer > & xRegCnt, 311*cdf0e10cSrcweir const uno::Reference< XComponentContext > & xContext, 312*cdf0e10cSrcweir const uno::Reference< XPropertySet > & xSeriesProp ) 313*cdf0e10cSrcweir { 314*cdf0e10cSrcweir if( !xRegCnt.is() || 315*cdf0e10cSrcweir ::chart::RegressionCurveHelper::hasMeanValueLine( xRegCnt ) ) 316*cdf0e10cSrcweir return; 317*cdf0e10cSrcweir 318*cdf0e10cSrcweir // todo: use a valid context 319*cdf0e10cSrcweir uno::Reference< XRegressionCurve > xCurve( createMeanValueLine( xContext )); 320*cdf0e10cSrcweir xRegCnt->addRegressionCurve( xCurve ); 321*cdf0e10cSrcweir 322*cdf0e10cSrcweir if( xSeriesProp.is()) 323*cdf0e10cSrcweir { 324*cdf0e10cSrcweir uno::Reference< XPropertySet > xProp( xCurve, uno::UNO_QUERY ); 325*cdf0e10cSrcweir if( xProp.is()) 326*cdf0e10cSrcweir { 327*cdf0e10cSrcweir xProp->setPropertyValue( C2U( "LineColor" ), 328*cdf0e10cSrcweir xSeriesProp->getPropertyValue( C2U( "Color" ))); 329*cdf0e10cSrcweir } 330*cdf0e10cSrcweir } 331*cdf0e10cSrcweir } 332*cdf0e10cSrcweir 333*cdf0e10cSrcweir void RegressionCurveHelper::removeMeanValueLine( 334*cdf0e10cSrcweir Reference< XRegressionCurveContainer > & xRegCnt ) 335*cdf0e10cSrcweir { 336*cdf0e10cSrcweir if( !xRegCnt.is()) 337*cdf0e10cSrcweir return; 338*cdf0e10cSrcweir 339*cdf0e10cSrcweir try 340*cdf0e10cSrcweir { 341*cdf0e10cSrcweir Sequence< Reference< XRegressionCurve > > aCurves( 342*cdf0e10cSrcweir xRegCnt->getRegressionCurves()); 343*cdf0e10cSrcweir for( sal_Int32 i = 0; i < aCurves.getLength(); ++i ) 344*cdf0e10cSrcweir { 345*cdf0e10cSrcweir if( isMeanValueLine( aCurves[i] )) 346*cdf0e10cSrcweir { 347*cdf0e10cSrcweir xRegCnt->removeRegressionCurve( aCurves[i] ); 348*cdf0e10cSrcweir // attention: the iterator i has become invalid now 349*cdf0e10cSrcweir 350*cdf0e10cSrcweir // note: assume that there is only one mean-value curve 351*cdf0e10cSrcweir // to remove multiple mean-value curves remove the break 352*cdf0e10cSrcweir break; 353*cdf0e10cSrcweir } 354*cdf0e10cSrcweir } 355*cdf0e10cSrcweir } 356*cdf0e10cSrcweir catch( Exception & ex ) 357*cdf0e10cSrcweir { 358*cdf0e10cSrcweir ASSERT_EXCEPTION( ex ); 359*cdf0e10cSrcweir } 360*cdf0e10cSrcweir } 361*cdf0e10cSrcweir 362*cdf0e10cSrcweir void RegressionCurveHelper::addRegressionCurve( 363*cdf0e10cSrcweir tRegressionType eType, 364*cdf0e10cSrcweir uno::Reference< XRegressionCurveContainer > & xRegCnt, 365*cdf0e10cSrcweir const uno::Reference< XComponentContext > & /* xContext */, 366*cdf0e10cSrcweir const uno::Reference< beans::XPropertySet >& xPropertySource, 367*cdf0e10cSrcweir const uno::Reference< beans::XPropertySet >& xEquationProperties ) 368*cdf0e10cSrcweir { 369*cdf0e10cSrcweir if( !xRegCnt.is() ) 370*cdf0e10cSrcweir return; 371*cdf0e10cSrcweir 372*cdf0e10cSrcweir if( eType == REGRESSION_TYPE_NONE ) 373*cdf0e10cSrcweir { 374*cdf0e10cSrcweir OSL_ENSURE(false,"don't create a regression curve of type none"); 375*cdf0e10cSrcweir return; 376*cdf0e10cSrcweir } 377*cdf0e10cSrcweir 378*cdf0e10cSrcweir uno::Reference< chart2::XRegressionCurve > xCurve; 379*cdf0e10cSrcweir ::rtl::OUString aServiceName( lcl_getServiceNameForType( eType )); 380*cdf0e10cSrcweir 381*cdf0e10cSrcweir if( aServiceName.getLength()) 382*cdf0e10cSrcweir { 383*cdf0e10cSrcweir // todo: use a valid context 384*cdf0e10cSrcweir xCurve.set( createRegressionCurveByServiceName( 385*cdf0e10cSrcweir uno::Reference< uno::XComponentContext >(), aServiceName )); 386*cdf0e10cSrcweir 387*cdf0e10cSrcweir if( xEquationProperties.is()) 388*cdf0e10cSrcweir xCurve->setEquationProperties( xEquationProperties ); 389*cdf0e10cSrcweir 390*cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xProp( xCurve, uno::UNO_QUERY ); 391*cdf0e10cSrcweir if( xProp.is()) 392*cdf0e10cSrcweir { 393*cdf0e10cSrcweir if( xPropertySource.is()) 394*cdf0e10cSrcweir comphelper::copyProperties( xPropertySource, xProp ); 395*cdf0e10cSrcweir else 396*cdf0e10cSrcweir { 397*cdf0e10cSrcweir uno::Reference< XPropertySet > xSeriesProp( xRegCnt, uno::UNO_QUERY ); 398*cdf0e10cSrcweir if( xSeriesProp.is()) 399*cdf0e10cSrcweir { 400*cdf0e10cSrcweir xProp->setPropertyValue( C2U( "LineColor" ), 401*cdf0e10cSrcweir xSeriesProp->getPropertyValue( C2U( "Color" ))); 402*cdf0e10cSrcweir } 403*cdf0e10cSrcweir // xProp->setPropertyValue( C2U( "LineWidth" ), uno::makeAny( sal_Int32( 100 ))); 404*cdf0e10cSrcweir } 405*cdf0e10cSrcweir } 406*cdf0e10cSrcweir } 407*cdf0e10cSrcweir xRegCnt->addRegressionCurve( xCurve ); 408*cdf0e10cSrcweir } 409*cdf0e10cSrcweir 410*cdf0e10cSrcweir /** removes all regression curves that are not of type mean value 411*cdf0e10cSrcweir and returns true, if anything was removed 412*cdf0e10cSrcweir */ 413*cdf0e10cSrcweir bool RegressionCurveHelper::removeAllExceptMeanValueLine( 414*cdf0e10cSrcweir uno::Reference< chart2::XRegressionCurveContainer > & xRegCnt ) 415*cdf0e10cSrcweir { 416*cdf0e10cSrcweir bool bRemovedSomething = false; 417*cdf0e10cSrcweir if( xRegCnt.is()) 418*cdf0e10cSrcweir { 419*cdf0e10cSrcweir try 420*cdf0e10cSrcweir { 421*cdf0e10cSrcweir uno::Sequence< uno::Reference< chart2::XRegressionCurve > > aCurves( 422*cdf0e10cSrcweir xRegCnt->getRegressionCurves()); 423*cdf0e10cSrcweir ::std::vector< uno::Reference< chart2::XRegressionCurve > > aCurvesToDelete; 424*cdf0e10cSrcweir for( sal_Int32 i = 0; i < aCurves.getLength(); ++i ) 425*cdf0e10cSrcweir { 426*cdf0e10cSrcweir if( ! isMeanValueLine( aCurves[i] )) 427*cdf0e10cSrcweir { 428*cdf0e10cSrcweir aCurvesToDelete.push_back( aCurves[ i ] ); 429*cdf0e10cSrcweir } 430*cdf0e10cSrcweir } 431*cdf0e10cSrcweir 432*cdf0e10cSrcweir for( ::std::vector< uno::Reference< chart2::XRegressionCurve > >::const_iterator aIt = aCurvesToDelete.begin(); 433*cdf0e10cSrcweir aIt != aCurvesToDelete.end(); ++aIt ) 434*cdf0e10cSrcweir { 435*cdf0e10cSrcweir xRegCnt->removeRegressionCurve( *aIt ); 436*cdf0e10cSrcweir bRemovedSomething = true; 437*cdf0e10cSrcweir } 438*cdf0e10cSrcweir } 439*cdf0e10cSrcweir catch( uno::Exception & ex ) 440*cdf0e10cSrcweir { 441*cdf0e10cSrcweir ASSERT_EXCEPTION( ex ); 442*cdf0e10cSrcweir } 443*cdf0e10cSrcweir } 444*cdf0e10cSrcweir return bRemovedSomething; 445*cdf0e10cSrcweir } 446*cdf0e10cSrcweir 447*cdf0e10cSrcweir void RegressionCurveHelper::removeEquations( 448*cdf0e10cSrcweir uno::Reference< chart2::XRegressionCurveContainer > & xRegCnt ) 449*cdf0e10cSrcweir { 450*cdf0e10cSrcweir if( xRegCnt.is()) 451*cdf0e10cSrcweir { 452*cdf0e10cSrcweir try 453*cdf0e10cSrcweir { 454*cdf0e10cSrcweir uno::Sequence< uno::Reference< chart2::XRegressionCurve > > aCurves( 455*cdf0e10cSrcweir xRegCnt->getRegressionCurves()); 456*cdf0e10cSrcweir for( sal_Int32 i = 0; i < aCurves.getLength(); ++i ) 457*cdf0e10cSrcweir { 458*cdf0e10cSrcweir if( !isMeanValueLine( aCurves[i] ) ) 459*cdf0e10cSrcweir { 460*cdf0e10cSrcweir uno::Reference< chart2::XRegressionCurve > xRegCurve( aCurves[ i ] ); 461*cdf0e10cSrcweir if( xRegCurve.is() ) 462*cdf0e10cSrcweir { 463*cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xEqProp( xRegCurve->getEquationProperties() ) ; 464*cdf0e10cSrcweir if( xEqProp.is()) 465*cdf0e10cSrcweir { 466*cdf0e10cSrcweir xEqProp->setPropertyValue( C2U("ShowEquation"), uno::makeAny( false )); 467*cdf0e10cSrcweir xEqProp->setPropertyValue( C2U("ShowCorrelationCoefficient"), uno::makeAny( false )); 468*cdf0e10cSrcweir } 469*cdf0e10cSrcweir } 470*cdf0e10cSrcweir } 471*cdf0e10cSrcweir } 472*cdf0e10cSrcweir } 473*cdf0e10cSrcweir catch( uno::Exception & ex ) 474*cdf0e10cSrcweir { 475*cdf0e10cSrcweir ASSERT_EXCEPTION( ex ); 476*cdf0e10cSrcweir } 477*cdf0e10cSrcweir } 478*cdf0e10cSrcweir } 479*cdf0e10cSrcweir 480*cdf0e10cSrcweir void RegressionCurveHelper::replaceOrAddCurveAndReduceToOne( 481*cdf0e10cSrcweir tRegressionType eType, 482*cdf0e10cSrcweir uno::Reference< XRegressionCurveContainer > & xRegCnt, 483*cdf0e10cSrcweir const uno::Reference< XComponentContext > & xContext ) 484*cdf0e10cSrcweir { 485*cdf0e10cSrcweir uno::Reference< chart2::XRegressionCurve > xRegressionCurve( getFirstCurveNotMeanValueLine( xRegCnt )); 486*cdf0e10cSrcweir if( ! xRegressionCurve.is()) 487*cdf0e10cSrcweir RegressionCurveHelper::addRegressionCurve( eType, xRegCnt, xContext ); 488*cdf0e10cSrcweir else 489*cdf0e10cSrcweir { 490*cdf0e10cSrcweir OUString aServiceName( lcl_getServiceNameForType( eType )); 491*cdf0e10cSrcweir if( aServiceName.getLength()) 492*cdf0e10cSrcweir { 493*cdf0e10cSrcweir RegressionCurveHelper::removeAllExceptMeanValueLine( xRegCnt ); 494*cdf0e10cSrcweir RegressionCurveHelper::addRegressionCurve( 495*cdf0e10cSrcweir eType, xRegCnt, xContext, 496*cdf0e10cSrcweir Reference< beans::XPropertySet >( xRegressionCurve, uno::UNO_QUERY ), 497*cdf0e10cSrcweir xRegressionCurve->getEquationProperties()); 498*cdf0e10cSrcweir } 499*cdf0e10cSrcweir } 500*cdf0e10cSrcweir } 501*cdf0e10cSrcweir 502*cdf0e10cSrcweir uno::Reference< chart2::XRegressionCurve > RegressionCurveHelper::getFirstCurveNotMeanValueLine( 503*cdf0e10cSrcweir const Reference< XRegressionCurveContainer > & xRegCnt ) 504*cdf0e10cSrcweir { 505*cdf0e10cSrcweir if( !xRegCnt.is()) 506*cdf0e10cSrcweir return NULL; 507*cdf0e10cSrcweir 508*cdf0e10cSrcweir try 509*cdf0e10cSrcweir { 510*cdf0e10cSrcweir uno::Sequence< uno::Reference< chart2::XRegressionCurve > > aCurves( 511*cdf0e10cSrcweir xRegCnt->getRegressionCurves()); 512*cdf0e10cSrcweir ::std::vector< uno::Reference< chart2::XRegressionCurve > > aCurvesToDelete; 513*cdf0e10cSrcweir for( sal_Int32 i = 0; i < aCurves.getLength(); ++i ) 514*cdf0e10cSrcweir { 515*cdf0e10cSrcweir if( ! isMeanValueLine( aCurves[i] )) 516*cdf0e10cSrcweir { 517*cdf0e10cSrcweir return aCurves[ i ]; 518*cdf0e10cSrcweir } 519*cdf0e10cSrcweir } 520*cdf0e10cSrcweir } 521*cdf0e10cSrcweir catch( Exception & ex ) 522*cdf0e10cSrcweir { 523*cdf0e10cSrcweir ASSERT_EXCEPTION( ex ); 524*cdf0e10cSrcweir } 525*cdf0e10cSrcweir 526*cdf0e10cSrcweir return NULL; 527*cdf0e10cSrcweir } 528*cdf0e10cSrcweir 529*cdf0e10cSrcweir RegressionCurveHelper::tRegressionType RegressionCurveHelper::getRegressionType( 530*cdf0e10cSrcweir const Reference< XRegressionCurve > & xCurve ) 531*cdf0e10cSrcweir { 532*cdf0e10cSrcweir tRegressionType eResult = REGRESSION_TYPE_UNKNOWN; 533*cdf0e10cSrcweir 534*cdf0e10cSrcweir try 535*cdf0e10cSrcweir { 536*cdf0e10cSrcweir Reference< lang::XServiceName > xServName( xCurve, uno::UNO_QUERY ); 537*cdf0e10cSrcweir if( xServName.is()) 538*cdf0e10cSrcweir { 539*cdf0e10cSrcweir ::rtl::OUString aServiceName( xServName->getServiceName() ); 540*cdf0e10cSrcweir 541*cdf0e10cSrcweir if( aServiceName.equalsAsciiL( 542*cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM( "com.sun.star.chart2.LinearRegressionCurve" ))) 543*cdf0e10cSrcweir { 544*cdf0e10cSrcweir eResult = REGRESSION_TYPE_LINEAR; 545*cdf0e10cSrcweir } 546*cdf0e10cSrcweir else if( aServiceName.equalsAsciiL( 547*cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM( "com.sun.star.chart2.LogarithmicRegressionCurve" ))) 548*cdf0e10cSrcweir { 549*cdf0e10cSrcweir eResult = REGRESSION_TYPE_LOG; 550*cdf0e10cSrcweir } 551*cdf0e10cSrcweir else if( aServiceName.equalsAsciiL( 552*cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM( "com.sun.star.chart2.ExponentialRegressionCurve" ))) 553*cdf0e10cSrcweir { 554*cdf0e10cSrcweir eResult = REGRESSION_TYPE_EXP; 555*cdf0e10cSrcweir } 556*cdf0e10cSrcweir else if( aServiceName.equalsAsciiL( 557*cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM( "com.sun.star.chart2.PotentialRegressionCurve" ))) 558*cdf0e10cSrcweir { 559*cdf0e10cSrcweir eResult = REGRESSION_TYPE_POWER; 560*cdf0e10cSrcweir } 561*cdf0e10cSrcweir else if( aServiceName.equalsAsciiL( 562*cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM( "com.sun.star.chart2.MeanValueRegressionCurve" ))) 563*cdf0e10cSrcweir { 564*cdf0e10cSrcweir eResult = REGRESSION_TYPE_MEAN_VALUE; 565*cdf0e10cSrcweir } 566*cdf0e10cSrcweir } 567*cdf0e10cSrcweir } 568*cdf0e10cSrcweir catch( Exception & ex ) 569*cdf0e10cSrcweir { 570*cdf0e10cSrcweir ASSERT_EXCEPTION( ex ); 571*cdf0e10cSrcweir } 572*cdf0e10cSrcweir 573*cdf0e10cSrcweir return eResult; 574*cdf0e10cSrcweir } 575*cdf0e10cSrcweir 576*cdf0e10cSrcweir RegressionCurveHelper::tRegressionType RegressionCurveHelper::getFirstRegressTypeNotMeanValueLine( 577*cdf0e10cSrcweir const Reference< XRegressionCurveContainer > & xRegCnt ) 578*cdf0e10cSrcweir { 579*cdf0e10cSrcweir tRegressionType eResult = REGRESSION_TYPE_NONE; 580*cdf0e10cSrcweir 581*cdf0e10cSrcweir if( xRegCnt.is()) 582*cdf0e10cSrcweir { 583*cdf0e10cSrcweir Sequence< Reference< XRegressionCurve > > aCurves( 584*cdf0e10cSrcweir xRegCnt->getRegressionCurves()); 585*cdf0e10cSrcweir for( sal_Int32 i = 0; i < aCurves.getLength(); ++i ) 586*cdf0e10cSrcweir { 587*cdf0e10cSrcweir tRegressionType eType = getRegressionType( aCurves[i] ); 588*cdf0e10cSrcweir if( eType != REGRESSION_TYPE_MEAN_VALUE && 589*cdf0e10cSrcweir eType != REGRESSION_TYPE_UNKNOWN ) 590*cdf0e10cSrcweir { 591*cdf0e10cSrcweir eResult = eType; 592*cdf0e10cSrcweir break; 593*cdf0e10cSrcweir } 594*cdf0e10cSrcweir } 595*cdf0e10cSrcweir } 596*cdf0e10cSrcweir 597*cdf0e10cSrcweir return eResult; 598*cdf0e10cSrcweir } 599*cdf0e10cSrcweir 600*cdf0e10cSrcweir OUString RegressionCurveHelper::getUINameForRegressionCurve( const Reference< XRegressionCurve >& xRegressionCurve ) 601*cdf0e10cSrcweir { 602*cdf0e10cSrcweir OUString aResult; 603*cdf0e10cSrcweir Reference< lang::XServiceName > xServiceName( xRegressionCurve, uno::UNO_QUERY ); 604*cdf0e10cSrcweir if( ! xServiceName.is()) 605*cdf0e10cSrcweir return aResult; 606*cdf0e10cSrcweir 607*cdf0e10cSrcweir OUString aServiceName( xServiceName->getServiceName()); 608*cdf0e10cSrcweir if( aServiceName.equalsAsciiL( 609*cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM( "com.sun.star.chart2.MeanValueRegressionCurve" ))) 610*cdf0e10cSrcweir { 611*cdf0e10cSrcweir aResult = ::chart::SchResId::getResString( STR_REGRESSION_MEAN ); 612*cdf0e10cSrcweir } 613*cdf0e10cSrcweir else if( aServiceName.equalsAsciiL( 614*cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM( "com.sun.star.chart2.LinearRegressionCurve" ))) 615*cdf0e10cSrcweir { 616*cdf0e10cSrcweir aResult = ::chart::SchResId::getResString( STR_REGRESSION_LINEAR ); 617*cdf0e10cSrcweir } 618*cdf0e10cSrcweir else if( aServiceName.equalsAsciiL( 619*cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM( "com.sun.star.chart2.LogarithmicRegressionCurve" ))) 620*cdf0e10cSrcweir { 621*cdf0e10cSrcweir aResult = ::chart::SchResId::getResString( STR_REGRESSION_LOG ); 622*cdf0e10cSrcweir } 623*cdf0e10cSrcweir else if( aServiceName.equalsAsciiL( 624*cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM( "com.sun.star.chart2.ExponentialRegressionCurve" ))) 625*cdf0e10cSrcweir { 626*cdf0e10cSrcweir aResult = ::chart::SchResId::getResString( STR_REGRESSION_EXP ); 627*cdf0e10cSrcweir } 628*cdf0e10cSrcweir else if( aServiceName.equalsAsciiL( 629*cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM( "com.sun.star.chart2.PotentialRegressionCurve" ))) 630*cdf0e10cSrcweir { 631*cdf0e10cSrcweir aResult = ::chart::SchResId::getResString( STR_REGRESSION_POWER ); 632*cdf0e10cSrcweir } 633*cdf0e10cSrcweir 634*cdf0e10cSrcweir return aResult; 635*cdf0e10cSrcweir } 636*cdf0e10cSrcweir 637*cdf0e10cSrcweir ::std::vector< Reference< chart2::XRegressionCurve > > 638*cdf0e10cSrcweir RegressionCurveHelper::getAllRegressionCurvesNotMeanValueLine( 639*cdf0e10cSrcweir const Reference< chart2::XDiagram > & xDiagram ) 640*cdf0e10cSrcweir { 641*cdf0e10cSrcweir ::std::vector< Reference< chart2::XRegressionCurve > > aResult; 642*cdf0e10cSrcweir ::std::vector< Reference< chart2::XDataSeries > > aSeries( DiagramHelper::getDataSeriesFromDiagram( xDiagram )); 643*cdf0e10cSrcweir for( ::std::vector< Reference< chart2::XDataSeries > >::iterator aIt( aSeries.begin()); 644*cdf0e10cSrcweir aIt != aSeries.end(); ++aIt ) 645*cdf0e10cSrcweir { 646*cdf0e10cSrcweir Reference< chart2::XRegressionCurveContainer > xCurveCnt( *aIt, uno::UNO_QUERY ); 647*cdf0e10cSrcweir if( xCurveCnt.is()) 648*cdf0e10cSrcweir { 649*cdf0e10cSrcweir uno::Sequence< uno::Reference< chart2::XRegressionCurve > > aCurves( 650*cdf0e10cSrcweir xCurveCnt->getRegressionCurves()); 651*cdf0e10cSrcweir for( sal_Int32 i = 0; i < aCurves.getLength(); ++i ) 652*cdf0e10cSrcweir { 653*cdf0e10cSrcweir if( ! isMeanValueLine( aCurves[i] )) 654*cdf0e10cSrcweir aResult.push_back( aCurves[i] ); 655*cdf0e10cSrcweir } 656*cdf0e10cSrcweir } 657*cdf0e10cSrcweir } 658*cdf0e10cSrcweir 659*cdf0e10cSrcweir return aResult; 660*cdf0e10cSrcweir } 661*cdf0e10cSrcweir 662*cdf0e10cSrcweir void RegressionCurveHelper::resetEquationPosition( 663*cdf0e10cSrcweir const Reference< chart2::XRegressionCurve > & xCurve ) 664*cdf0e10cSrcweir { 665*cdf0e10cSrcweir if( xCurve.is()) 666*cdf0e10cSrcweir { 667*cdf0e10cSrcweir try 668*cdf0e10cSrcweir { 669*cdf0e10cSrcweir const OUString aPosPropertyName( RTL_CONSTASCII_USTRINGPARAM( "RelativePosition" )); 670*cdf0e10cSrcweir Reference< beans::XPropertySet > xEqProp( xCurve->getEquationProperties()); // since m233: , uno::UNO_SET_THROW ); 671*cdf0e10cSrcweir if( xEqProp->getPropertyValue( aPosPropertyName ).hasValue()) 672*cdf0e10cSrcweir xEqProp->setPropertyValue( aPosPropertyName, uno::Any()); 673*cdf0e10cSrcweir } 674*cdf0e10cSrcweir catch( const uno::Exception & ex ) 675*cdf0e10cSrcweir { 676*cdf0e10cSrcweir ASSERT_EXCEPTION( ex ); 677*cdf0e10cSrcweir } 678*cdf0e10cSrcweir } 679*cdf0e10cSrcweir } 680*cdf0e10cSrcweir 681*cdf0e10cSrcweir sal_Int32 RegressionCurveHelper::getRegressionCurveIndex( 682*cdf0e10cSrcweir const Reference< chart2::XRegressionCurveContainer > & xContainer, 683*cdf0e10cSrcweir const Reference< chart2::XRegressionCurve > & xCurve ) 684*cdf0e10cSrcweir { 685*cdf0e10cSrcweir if( xContainer.is()) 686*cdf0e10cSrcweir { 687*cdf0e10cSrcweir uno::Sequence< uno::Reference< XRegressionCurve > > aCurves( 688*cdf0e10cSrcweir xContainer->getRegressionCurves()); 689*cdf0e10cSrcweir for( sal_Int32 i = 0; i < aCurves.getLength(); ++i ) 690*cdf0e10cSrcweir { 691*cdf0e10cSrcweir if( xCurve == aCurves[i] ) 692*cdf0e10cSrcweir return i; 693*cdf0e10cSrcweir } 694*cdf0e10cSrcweir } 695*cdf0e10cSrcweir return -1; 696*cdf0e10cSrcweir } 697*cdf0e10cSrcweir 698*cdf0e10cSrcweir bool RegressionCurveHelper::hasEquation( const Reference< chart2::XRegressionCurve > & xCurve ) 699*cdf0e10cSrcweir { 700*cdf0e10cSrcweir bool bHasEquation = false; 701*cdf0e10cSrcweir if( xCurve.is()) 702*cdf0e10cSrcweir { 703*cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xEquationProp( xCurve->getEquationProperties()); 704*cdf0e10cSrcweir if( xEquationProp.is()) 705*cdf0e10cSrcweir { 706*cdf0e10cSrcweir bool bShowEquation = false; 707*cdf0e10cSrcweir bool bShowCoefficient = false; 708*cdf0e10cSrcweir xEquationProp->getPropertyValue( C2U("ShowEquation")) >>= bShowEquation; 709*cdf0e10cSrcweir xEquationProp->getPropertyValue( C2U("ShowCorrelationCoefficient")) >>= bShowCoefficient; 710*cdf0e10cSrcweir bHasEquation = bShowEquation || bShowCoefficient; 711*cdf0e10cSrcweir } 712*cdf0e10cSrcweir } 713*cdf0e10cSrcweir return bHasEquation; 714*cdf0e10cSrcweir } 715*cdf0e10cSrcweir 716*cdf0e10cSrcweir //............................................................................. 717*cdf0e10cSrcweir } //namespace chart 718*cdf0e10cSrcweir //............................................................................. 719