diff options
Diffstat (limited to 'chart2/source/tools/RegressionCurveHelper.cxx')
-rw-r--r-- | chart2/source/tools/RegressionCurveHelper.cxx | 344 |
1 files changed, 247 insertions, 97 deletions
diff --git a/chart2/source/tools/RegressionCurveHelper.cxx b/chart2/source/tools/RegressionCurveHelper.cxx index 66f56725133b..efb6bea5c3aa 100644 --- a/chart2/source/tools/RegressionCurveHelper.cxx +++ b/chart2/source/tools/RegressionCurveHelper.cxx @@ -17,6 +17,10 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ +#include <sal/config.h> + +#include <cstddef> + #include <RegressionCurveHelper.hxx> #include <MeanValueRegressionCurveCalculator.hxx> #include <LinearRegressionCurveCalculator.hxx> @@ -26,16 +30,20 @@ #include <ExponentialRegressionCurveCalculator.hxx> #include <PotentialRegressionCurveCalculator.hxx> #include <CommonConverters.hxx> -#include "RegressionCurveModel.hxx" +#include <RegressionCurveModel.hxx> #include <ChartTypeHelper.hxx> +#include <ChartType.hxx> +#include <ChartModel.hxx> #include <ChartModelHelper.hxx> +#include <DataSeries.hxx> #include <ResId.hxx> #include <strings.hrc> -#include <DiagramHelper.hxx> #include <com/sun/star/chart2/AxisType.hpp> #include <com/sun/star/chart2/XRegressionCurveCalculator.hpp> #include <com/sun/star/chart2/XRegressionCurveContainer.hpp> -#include <tools/diagnose_ex.h> +#include <com/sun/star/chart2/data/XDataSource.hpp> +#include <o3tl/safeint.hxx> +#include <comphelper/diagnose_ex.hxx> #include <comphelper/property.hxx> using namespace ::com::sun::star; @@ -85,15 +93,15 @@ OUString lcl_getServiceNameForType(SvxChartRegress eType) namespace chart { -Reference< XRegressionCurve > RegressionCurveHelper::createMeanValueLine() +rtl::Reference< RegressionCurveModel > RegressionCurveHelper::createMeanValueLine() { - return Reference< XRegressionCurve >( new MeanValueRegressionCurve ); + return new MeanValueRegressionCurve; } -Reference< XRegressionCurve > RegressionCurveHelper::createRegressionCurveByServiceName( +rtl::Reference< RegressionCurveModel > RegressionCurveHelper::createRegressionCurveByServiceName( std::u16string_view aServiceName ) { - Reference< XRegressionCurve > xResult; + rtl::Reference< RegressionCurveModel > xResult; // todo: use factory methods with service name if( aServiceName == u"com.sun.star.chart2.LinearRegressionCurve" ) @@ -124,10 +132,10 @@ Reference< XRegressionCurve > RegressionCurveHelper::createRegressionCurveByServ return xResult; } -Reference< XRegressionCurveCalculator > RegressionCurveHelper::createRegressionCurveCalculatorByServiceName( +rtl::Reference< RegressionCurveCalculator > RegressionCurveHelper::createRegressionCurveCalculatorByServiceName( std::u16string_view aServiceName ) { - Reference< XRegressionCurveCalculator > xResult; + rtl::Reference< RegressionCurveCalculator > xResult; // todo: use factory methods with service name if( aServiceName == u"com.sun.star.chart2.MeanValueRegressionCurve" ) @@ -211,8 +219,9 @@ void RegressionCurveHelper::initializeCurveCalculator( // initialize with 1, 2, ... //first category (index 0) matches with real number 1.0 aXValues.realloc( aYValues.getLength()); + auto pXValues = aXValues.getArray(); for( i=0; i<aXValues.getLength(); ++i ) - aXValues[i] = i+1; + pXValues[i] = i+1; bXValuesFound = true; } @@ -224,14 +233,14 @@ void RegressionCurveHelper::initializeCurveCalculator( void RegressionCurveHelper::initializeCurveCalculator( const Reference< XRegressionCurveCalculator > & xOutCurveCalculator, - const Reference< XDataSeries > & xSeries, - const Reference< frame::XModel > & xModel ) + const rtl::Reference< ::chart::DataSeries > & xSeries, + const rtl::Reference<::chart::ChartModel> & xModel ) { sal_Int32 nAxisType = ChartTypeHelper::getAxisType( ChartModelHelper::getChartTypeOfSeries( xModel, xSeries ), 0 ); // x-axis initializeCurveCalculator( xOutCurveCalculator, - uno::Reference< data::XDataSource >( xSeries, uno::UNO_QUERY ), + xSeries, (nAxisType == AxisType::REALNUMBER) ); } @@ -259,6 +268,28 @@ bool RegressionCurveHelper::hasMeanValueLine( return false; } +bool RegressionCurveHelper::hasMeanValueLine( + const rtl::Reference< DataSeries > & xRegCnt ) +{ + if( !xRegCnt.is()) + return false; + + try + { + for( rtl::Reference< RegressionCurveModel > const & curve : xRegCnt->getRegressionCurves2() ) + { + if( isMeanValueLine( curve )) + return true; + } + } + catch( const Exception & ) + { + DBG_UNHANDLED_EXCEPTION("chart2"); + } + + return false; +} + bool RegressionCurveHelper::isMeanValueLine( const uno::Reference< chart2::XRegressionCurve > & xRegCurve ) { @@ -268,7 +299,15 @@ bool RegressionCurveHelper::isMeanValueLine( "com.sun.star.chart2.MeanValueRegressionCurve"; } -uno::Reference< chart2::XRegressionCurve > +bool RegressionCurveHelper::isMeanValueLine( + const rtl::Reference< RegressionCurveModel > & xRegCurve ) +{ + return xRegCurve.is() && + xRegCurve->getServiceName() == + "com.sun.star.chart2.MeanValueRegressionCurve"; +} + +rtl::Reference< RegressionCurveModel > RegressionCurveHelper::getMeanValueLine( const uno::Reference< chart2::XRegressionCurveContainer > & xRegCnt ) { @@ -281,6 +320,29 @@ uno::Reference< chart2::XRegressionCurve > for( uno::Reference< XRegressionCurve > const & curve : aCurves ) { if( isMeanValueLine( curve )) + return dynamic_cast<RegressionCurveModel*>(curve.get()); + } + } + catch( const Exception & ) + { + DBG_UNHANDLED_EXCEPTION("chart2"); + } + } + + return nullptr; +} + +rtl::Reference< RegressionCurveModel > + RegressionCurveHelper::getMeanValueLine( + const rtl::Reference< DataSeries > & xRegCnt ) +{ + if( xRegCnt.is()) + { + try + { + for( rtl::Reference< RegressionCurveModel > const & curve : xRegCnt->getRegressionCurves2() ) + { + if( isMeanValueLine( curve )) return curve; } } @@ -290,7 +352,7 @@ uno::Reference< chart2::XRegressionCurve > } } - return uno::Reference< chart2::XRegressionCurve >(); + return nullptr; } void RegressionCurveHelper::addMeanValueLine( @@ -316,6 +378,25 @@ void RegressionCurveHelper::addMeanValueLine( } } +void RegressionCurveHelper::addMeanValueLine( + rtl::Reference< DataSeries > const & xRegCnt, + const uno::Reference< XPropertySet > & xSeriesProp ) +{ + if( !xRegCnt.is() || + ::chart::RegressionCurveHelper::hasMeanValueLine( xRegCnt ) ) + return; + + // todo: use a valid context + rtl::Reference< RegressionCurveModel > xCurve( createMeanValueLine() ); + xRegCnt->addRegressionCurve( xCurve ); + + if( xSeriesProp.is()) + { + xCurve->setPropertyValue( "LineColor", + xSeriesProp->getPropertyValue( "Color")); + } +} + void RegressionCurveHelper::removeMeanValueLine( Reference< XRegressionCurveContainer > const & xRegCnt ) { @@ -345,13 +426,40 @@ void RegressionCurveHelper::removeMeanValueLine( } } -uno::Reference< chart2::XRegressionCurve > RegressionCurveHelper::addRegressionCurve( +void RegressionCurveHelper::removeMeanValueLine( + rtl::Reference< DataSeries > const & xRegCnt ) +{ + if( !xRegCnt.is()) + return; + + try + { + for( rtl::Reference< RegressionCurveModel > const & curve : xRegCnt->getRegressionCurves2() ) + { + if( isMeanValueLine( curve )) + { + xRegCnt->removeRegressionCurve( curve ); + // attention: the iterator i has become invalid now + + // note: assume that there is only one mean-value curve + // to remove multiple mean-value curves remove the break + break; + } + } + } + catch( const Exception & ) + { + DBG_UNHANDLED_EXCEPTION("chart2"); + } +} + +rtl::Reference< RegressionCurveModel > RegressionCurveHelper::addRegressionCurve( SvxChartRegress eType, uno::Reference< XRegressionCurveContainer > const & xRegressionCurveContainer, const uno::Reference< beans::XPropertySet >& xPropertySource, const uno::Reference< beans::XPropertySet >& xEquationProperties ) { - uno::Reference< chart2::XRegressionCurve > xCurve; + rtl::Reference< RegressionCurveModel > xCurve; if( !xRegressionCurveContainer.is() ) return xCurve; @@ -366,24 +474,20 @@ uno::Reference< chart2::XRegressionCurve > RegressionCurveHelper::addRegressionC if( !aServiceName.isEmpty()) { // todo: use a valid context - xCurve.set( createRegressionCurveByServiceName( aServiceName ) ); + xCurve = createRegressionCurveByServiceName( aServiceName ); if( xEquationProperties.is()) xCurve->setEquationProperties( xEquationProperties ); - uno::Reference< beans::XPropertySet > xProperties( xCurve, uno::UNO_QUERY ); - if( xProperties.is()) + if( xPropertySource.is()) + comphelper::copyProperties( xPropertySource, xCurve ); + else { - if( xPropertySource.is()) - comphelper::copyProperties( xPropertySource, xProperties ); - else + uno::Reference< XPropertySet > xSeriesProp( xRegressionCurveContainer, uno::UNO_QUERY ); + if( xSeriesProp.is()) { - uno::Reference< XPropertySet > xSeriesProp( xRegressionCurveContainer, uno::UNO_QUERY ); - if( xSeriesProp.is()) - { - xProperties->setPropertyValue( "LineColor", - xSeriesProp->getPropertyValue( "Color")); - } + xCurve->setPropertyValue( "LineColor", + xSeriesProp->getPropertyValue( "Color")); } } } @@ -392,67 +496,98 @@ uno::Reference< chart2::XRegressionCurve > RegressionCurveHelper::addRegressionC return xCurve; } +rtl::Reference< RegressionCurveModel > RegressionCurveHelper::addRegressionCurve( + SvxChartRegress eType, + rtl::Reference< DataSeries > const & xRegressionCurveContainer, + const uno::Reference< beans::XPropertySet >& xPropertySource, + const uno::Reference< beans::XPropertySet >& xEquationProperties ) +{ + rtl::Reference< RegressionCurveModel > xCurve; + + if( !xRegressionCurveContainer.is() ) + return xCurve; + + if( eType == SvxChartRegress::NONE ) + { + OSL_FAIL("don't create a regression curve of type none"); + return xCurve; + } + + OUString aServiceName( lcl_getServiceNameForType( eType )); + if( !aServiceName.isEmpty()) + { + // todo: use a valid context + xCurve = createRegressionCurveByServiceName( aServiceName ); + + if( xEquationProperties.is()) + xCurve->setEquationProperties( xEquationProperties ); + + if( xPropertySource.is()) + comphelper::copyProperties( xPropertySource, xCurve ); + else + { + xCurve->setPropertyValue( "LineColor", + xRegressionCurveContainer->getPropertyValue( "Color")); + } + } + xRegressionCurveContainer->addRegressionCurve( xCurve ); + + return xCurve; +} + /** removes all regression curves that are not of type mean value and returns true, if anything was removed */ bool RegressionCurveHelper::removeAllExceptMeanValueLine( - uno::Reference< chart2::XRegressionCurveContainer > const & xRegCnt ) + rtl::Reference< DataSeries > const & xRegCnt ) { + if( !xRegCnt.is()) + return false; + bool bRemovedSomething = false; - if( xRegCnt.is()) + try { - try + std::vector< rtl::Reference< RegressionCurveModel > > aCurvesToDelete; + for( rtl::Reference< RegressionCurveModel > const & curve : xRegCnt->getRegressionCurves2() ) { - const uno::Sequence< uno::Reference< chart2::XRegressionCurve > > aCurves( - xRegCnt->getRegressionCurves()); - std::vector< uno::Reference< chart2::XRegressionCurve > > aCurvesToDelete; - for( uno::Reference< chart2::XRegressionCurve > const & curve : aCurves ) - { - if( ! isMeanValueLine( curve )) - { - aCurvesToDelete.push_back( curve ); - } - } - - for (auto const& curveToDelete : aCurvesToDelete) + if( ! isMeanValueLine( curve )) { - xRegCnt->removeRegressionCurve(curveToDelete); - bRemovedSomething = true; + aCurvesToDelete.push_back( curve ); } } - catch( const uno::Exception & ) + + for (auto const& curveToDelete : aCurvesToDelete) { - DBG_UNHANDLED_EXCEPTION("chart2"); + xRegCnt->removeRegressionCurve(curveToDelete); + bRemovedSomething = true; } } + catch( const uno::Exception & ) + { + DBG_UNHANDLED_EXCEPTION("chart2"); + } return bRemovedSomething; } void RegressionCurveHelper::removeEquations( - uno::Reference< chart2::XRegressionCurveContainer > const & xRegCnt ) + rtl::Reference< DataSeries > const & xRegCnt ) { if( !xRegCnt.is()) return; try { - const uno::Sequence< uno::Reference< chart2::XRegressionCurve > > aCurves( - xRegCnt->getRegressionCurves()); - for( uno::Reference< chart2::XRegressionCurve > const & curve : aCurves ) + for( rtl::Reference< RegressionCurveModel > const & curve : xRegCnt->getRegressionCurves2() ) { if( !isMeanValueLine( curve ) ) { - uno::Reference< chart2::XRegressionCurve > xRegCurve( curve ); - if( xRegCurve.is() ) + uno::Reference< beans::XPropertySet > xEqProp( curve->getEquationProperties() ) ; + if( xEqProp.is()) { - uno::Reference< beans::XPropertySet > xEqProp( xRegCurve->getEquationProperties() ) ; - if( xEqProp.is()) - { - xEqProp->setPropertyValue( "ShowEquation", uno::Any( false )); - xEqProp->setPropertyValue( "XName", uno::Any( OUString("x") )); - xEqProp->setPropertyValue( "YName", uno::Any( OUString("f(x) ") )); - xEqProp->setPropertyValue( "ShowCorrelationCoefficient", uno::Any( false )); - } + xEqProp->setPropertyValue( "ShowEquation", uno::Any( false )); + xEqProp->setPropertyValue( "XName", uno::Any( OUString("x") )); + xEqProp->setPropertyValue( "YName", uno::Any( OUString("f(x) ") )); + xEqProp->setPropertyValue( "ShowCorrelationCoefficient", uno::Any( false )); } } } @@ -463,7 +598,7 @@ void RegressionCurveHelper::removeEquations( } } -uno::Reference< XRegressionCurve > RegressionCurveHelper::changeRegressionCurveType( +rtl::Reference< RegressionCurveModel > RegressionCurveHelper::changeRegressionCurveType( SvxChartRegress eType, uno::Reference< XRegressionCurveContainer > const & xRegressionCurveContainer, uno::Reference< XRegressionCurve > const & xRegressionCurve ) @@ -476,7 +611,7 @@ uno::Reference< XRegressionCurve > RegressionCurveHelper::changeRegressionCurveT xRegressionCurve->getEquationProperties()); } -uno::Reference< chart2::XRegressionCurve > RegressionCurveHelper::getFirstCurveNotMeanValueLine( +rtl::Reference< RegressionCurveModel > RegressionCurveHelper::getFirstCurveNotMeanValueLine( const Reference< XRegressionCurveContainer > & xRegCnt ) { if( !xRegCnt.is()) @@ -490,6 +625,30 @@ uno::Reference< chart2::XRegressionCurve > RegressionCurveHelper::getFirstCurveN { if( ! isMeanValueLine( curve )) { + return dynamic_cast<RegressionCurveModel*>(curve.get()); + } + } + } + catch( const Exception & ) + { + DBG_UNHANDLED_EXCEPTION("chart2"); + } + + return nullptr; +} + +rtl::Reference< RegressionCurveModel > RegressionCurveHelper::getFirstCurveNotMeanValueLine( + const rtl::Reference< DataSeries > & xRegCnt ) +{ + if( !xRegCnt.is()) + return nullptr; + + try + { + for( rtl::Reference< RegressionCurveModel > const & curve : xRegCnt->getRegressionCurves2() ) + { + if( ! isMeanValueLine( curve )) + { return curve; } } @@ -502,8 +661,8 @@ uno::Reference< chart2::XRegressionCurve > RegressionCurveHelper::getFirstCurveN return nullptr; } -uno::Reference< chart2::XRegressionCurve > RegressionCurveHelper::getRegressionCurveAtIndex( - const Reference< XRegressionCurveContainer >& xCurveContainer, +rtl::Reference< RegressionCurveModel > RegressionCurveHelper::getRegressionCurveAtIndex( + const rtl::Reference< DataSeries >& xCurveContainer, sal_Int32 aIndex ) { if( !xCurveContainer.is()) @@ -511,8 +670,8 @@ uno::Reference< chart2::XRegressionCurve > RegressionCurveHelper::getRegressionC try { - uno::Sequence< uno::Reference< chart2::XRegressionCurve > > aCurves(xCurveContainer->getRegressionCurves()); - if(0 <= aIndex && aIndex < aCurves.getLength()) + const std::vector< rtl::Reference< RegressionCurveModel > > aCurves(xCurveContainer->getRegressionCurves2()); + if(0 <= aIndex && o3tl::make_unsigned(aIndex) < aCurves.size()) { if(!isMeanValueLine(aCurves[aIndex])) return aCurves[aIndex]; @@ -681,29 +840,6 @@ OUString RegressionCurveHelper::getRegressionCurveName( const Reference< XRegres return aResult; } -std::vector< Reference< chart2::XRegressionCurve > > - RegressionCurveHelper::getAllRegressionCurvesNotMeanValueLine( - const Reference< chart2::XDiagram > & xDiagram ) -{ - std::vector< Reference< chart2::XRegressionCurve > > aResult; - std::vector< Reference< chart2::XDataSeries > > aSeries( DiagramHelper::getDataSeriesFromDiagram( xDiagram )); - for (auto const& elem : aSeries) - { - Reference< chart2::XRegressionCurveContainer > xContainer(elem, uno::UNO_QUERY); - if(xContainer.is()) - { - const uno::Sequence< uno::Reference< chart2::XRegressionCurve > > aCurves(xContainer->getRegressionCurves()); - for( Reference< XRegressionCurve > const & curve : aCurves ) - { - if( ! isMeanValueLine( curve )) - aResult.push_back( curve ); - } - } - } - - return aResult; -} - void RegressionCurveHelper::resetEquationPosition( const Reference< chart2::XRegressionCurve > & xCurve ) { @@ -712,7 +848,7 @@ void RegressionCurveHelper::resetEquationPosition( try { - const OUString aPosPropertyName( "RelativePosition" ); + static constexpr OUString aPosPropertyName( u"RelativePosition"_ustr ); Reference< beans::XPropertySet > xEqProp( xCurve->getEquationProperties()); // since m233: , uno::UNO_SET_THROW ); if( xEqProp->getPropertyValue( aPosPropertyName ).hasValue()) xEqProp->setPropertyValue( aPosPropertyName, uno::Any()); @@ -724,15 +860,15 @@ void RegressionCurveHelper::resetEquationPosition( } sal_Int32 RegressionCurveHelper::getRegressionCurveIndex( - const Reference< chart2::XRegressionCurveContainer >& xContainer, - const Reference< chart2::XRegressionCurve >& xCurve ) + const rtl::Reference< DataSeries >& xContainer, + const rtl::Reference< RegressionCurveModel >& xCurve ) { if( xContainer.is()) { - uno::Sequence< uno::Reference< XRegressionCurve > > aCurves( - xContainer->getRegressionCurves()); + const std::vector< rtl::Reference< RegressionCurveModel > > & aCurves( + xContainer->getRegressionCurves2()); - for( sal_Int32 i = 0; i < aCurves.getLength(); ++i ) + for( std::size_t i = 0; i < aCurves.size(); ++i ) { if( xCurve == aCurves[i] ) return i; @@ -759,6 +895,20 @@ bool RegressionCurveHelper::hasEquation( const Reference< chart2::XRegressionCur return bHasEquation; } +bool RegressionCurveHelper::MayHaveCorrelationCoefficient( const Reference< chart2::XRegressionCurve > & xCurve ) +{ + bool bMayHaveCorrelationCoefficient = true; + if( xCurve.is()) + { + uno::Reference< beans::XPropertySet > xEquationProp( xCurve->getEquationProperties() ); + if( xEquationProp.is() ) + { + xEquationProp->getPropertyValue( "MayHaveCorrelationCoefficient") >>= bMayHaveCorrelationCoefficient; + } + } + return bMayHaveCorrelationCoefficient; +} + } //namespace chart /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |