diff options
author | Laurent Balland-Poirier <laurent.balland-poirier@laposte.net> | 2016-05-23 21:17:29 +0200 |
---|---|---|
committer | jan iversen <jani@documentfoundation.org> | 2016-06-09 10:23:06 +0000 |
commit | 9a9c778d81e8ae54dcc42290241a5fc72be29bf2 (patch) | |
tree | a518b7fcd9d18344fb29edeec19bcb570ffc8c90 /chart2/source/tools | |
parent | 19baa61e1d7b140b9e24717f7080617ab3d324d4 (diff) |
tdf#94004 Wrap Exponential trendline equation
Wrap equation trendline if it is longer than chart width
Continue https://gerrit.libreoffice.org/18397/
Change-Id: I3938aaeec6c56582ecfe50dbfc54ec711f1b963d
Reviewed-on: https://gerrit.libreoffice.org/25393
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: jan iversen <jani@documentfoundation.org>
Diffstat (limited to 'chart2/source/tools')
-rw-r--r-- | chart2/source/tools/ExponentialRegressionCurveCalculator.cxx | 69 |
1 files changed, 51 insertions, 18 deletions
diff --git a/chart2/source/tools/ExponentialRegressionCurveCalculator.cxx b/chart2/source/tools/ExponentialRegressionCurveCalculator.cxx index 75e92aa79536..f6a75716eb80 100644 --- a/chart2/source/tools/ExponentialRegressionCurveCalculator.cxx +++ b/chart2/source/tools/ExponentialRegressionCurveCalculator.cxx @@ -20,6 +20,7 @@ #include "ExponentialRegressionCurveCalculator.hxx" #include "macros.hxx" #include "RegressionCalculationHelper.hxx" +#include <SpecialUnicodes.hxx> #include <rtl/math.hxx> #include <rtl/ustrbuf.hxx> @@ -154,40 +155,72 @@ uno::Sequence< geometry::RealPoint2D > SAL_CALL ExponentialRegressionCurveCalcul OUString ExponentialRegressionCurveCalculator::ImplGetRepresentation( const uno::Reference< util::XNumberFormatter >& xNumFormatter, - sal_Int32 nNumberFormatKey, sal_Int32* /*pFormulaLength = nullptr */ ) const + sal_Int32 nNumberFormatKey, sal_Int32* pFormulaMaxWidth /* = nullptr */ ) const { - double fIntercept = m_fSign * exp(m_fLogIntercept); + double fIntercept = exp(m_fLogIntercept); bool bHasSlope = !rtl::math::approxEqual( exp(m_fLogSlope), 1.0 ); bool bHasLogSlope = !rtl::math::approxEqual( fabs(m_fLogSlope), 1.0 ); - bool bHasIntercept = !rtl::math::approxEqual( m_fSign*fIntercept, 1.0 ) && fIntercept != 0.0; + bool bHasIntercept = !rtl::math::approxEqual( fIntercept, 1.0 ) && fIntercept != 0.0; OUStringBuffer aBuf( "f(x) = " ); - + sal_Int32 nLineLength = aBuf.getLength(); + sal_Int32 nValueLength=0; + if ( pFormulaMaxWidth && *pFormulaMaxWidth > 0 ) + { // count characters different from coefficients + sal_Int32 nCharMin = nLineLength + 11; // 11 = "exp( ", " x )" + 2 extra characters + if ( m_fSign < 0.0 ) + nCharMin += 2; + if ( fIntercept == 0.0 || ( !bHasSlope && m_fLogIntercept != 0.0 ) ) + nCharMin += 3; // " + " special case where equation is writen exp( a + b x ) + if ( ( bHasIntercept || fIntercept == 0.0 || ( !bHasSlope && m_fLogIntercept != 0.0 ) ) && + bHasLogSlope ) + nValueLength = ( *pFormulaMaxWidth - nCharMin ) / 2; + else + nValueLength = *pFormulaMaxWidth - nCharMin; + if ( nValueLength <= 0 ) + nValueLength = 1; + } + // temporary buffer + OUStringBuffer aTmpBuf(""); + // if nValueLength not calculated then nullptr + sal_Int32* pValueLength = nValueLength ? &nValueLength : nullptr; + if ( m_fSign < 0.0 ) + aTmpBuf.append( aMinusSign + " " ); if ( bHasIntercept ) { - aBuf.append( getFormattedString( xNumFormatter, nNumberFormatKey, fIntercept) ); - aBuf.append( " exp( " ); + OUString aValueString = getFormattedString( xNumFormatter, nNumberFormatKey, fIntercept, pValueLength ); + if ( aValueString != "1" ) // aValueString may be rounded to 1 if nValueLength is small + { + aTmpBuf.append( aValueString + " " ); + addStringToEquation( aBuf, nLineLength, aTmpBuf, pFormulaMaxWidth ); + aTmpBuf.truncate(); + } } - else + aTmpBuf.append( "exp( " ); + if ( !bHasIntercept ) { - if ( m_fSign < 0.0 ) - aBuf.append( "- " ); - aBuf.append( "exp( " ); - if ( fIntercept == 0.0 || // underflow, a true zero is impossible - ( !bHasSlope && m_fLogIntercept != 0.0 ) ) // show logarithmic output, if intercept and slope both are near one + if ( fIntercept == 0.0 || // underflow, a true zero is impossible + ( !bHasSlope && m_fLogIntercept != 0.0 ) ) // show logarithmic output, if intercept and slope both are near one { // otherwise drop output of intercept, which is 1 here - aBuf.append( getFormattedString( xNumFormatter, nNumberFormatKey, m_fLogIntercept) ); - aBuf.append( (m_fLogSlope < 0.0) ? OUStringLiteral(" ") : OUStringLiteral(" + ")); + OUString aValueString = getFormattedString( xNumFormatter, nNumberFormatKey, m_fLogIntercept, pValueLength ); + if ( aValueString != "0" ) // aValueString may be rounded to 0 if nValueLength is small + { + aTmpBuf.append( aValueString + ( (m_fLogSlope < 0.0) ? OUStringBuffer(" ") : OUStringBuffer(" + ") ) ); + } } } if ( m_fLogSlope < 0.0 ) - aBuf.append( "- "); + aTmpBuf.append( aMinusSign + " " ); if ( bHasLogSlope ) { - aBuf.append( getFormattedString( xNumFormatter, nNumberFormatKey, fabs(m_fLogSlope)) ); - aBuf.append( ' ' ); + OUString aValueString = getFormattedString( xNumFormatter, nNumberFormatKey, fabs(m_fLogSlope), pValueLength ); + if ( aValueString != "1" ) // aValueString may be rounded to 1 if nValueLength is small + { + aTmpBuf.append( aValueString + " " ); + } } - aBuf.append( "x )"); + aTmpBuf.append( "x )"); + addStringToEquation( aBuf, nLineLength, aTmpBuf, pFormulaMaxWidth ); return aBuf.makeStringAndClear(); } |