24#include <unonames.hxx>
26#include <rtl/ustrbuf.hxx>
28#include <com/sun/star/chart2/XDataSeries.hpp>
29#include <com/sun/star/chart2/data/LabeledDataSequence.hpp>
30#include <com/sun/star/chart2/data/XNumericalDataSequence.hpp>
31#include <com/sun/star/chart2/data/XDataProvider.hpp>
32#include <com/sun/star/chart2/data/XDataSink.hpp>
33#include <com/sun/star/chart/ErrorBarStyle.hpp>
39using ::com::sun::star::uno::Sequence;
40using ::com::sun::star::uno::Reference;
46double lcl_getVariance(
const Sequence< double > & rData, sal_Int32 & rOutValidCount )
48 const sal_Int32
nCount = rData.getLength();
52 double fQuadSum = 0.0;
54 for( sal_Int32 i = 0;
i <
nCount; ++
i )
56 const double fData = rData[
i];
57 if( std::isnan( fData ))
62 fQuadSum += fData * fData;
66 if( rOutValidCount == 0 )
67 return std::numeric_limits<double>::quiet_NaN();
69 const double fN =
static_cast< double >( rOutValidCount );
70 return (fQuadSum - fSum*fSum/fN) / fN;
73uno::Reference< chart2::data::XLabeledDataSequence > lcl_getErrorBarLabeledSequence(
74 const Reference< chart2::data::XDataSource > & xDataSource,
75 bool bPositiveValue,
bool bYError,
76 OUString & rOutRoleNameUsed )
78 OUStringBuffer aRole(
"error-bars-");
84 OUString aPlainRole = aRole.makeStringAndClear();
85 aRole.append( aPlainRole +
"-" );
88 aRole.append(
"positive" );
90 aRole.append(
"negative" );
92 OUString aLongRole = aRole.makeStringAndClear();
93 uno::Reference< chart2::data::XLabeledDataSequence > xLSeq =
97 rOutRoleNameUsed = aLongRole;
102 rOutRoleNameUsed = aPlainRole;
104 rOutRoleNameUsed = aLongRole;
111 const Reference< chart2::data::XDataSequence > & xNewSequence,
112 const OUString & rRole )
114 Reference< beans::XPropertySet > xSeqProp( xNewSequence, uno::UNO_QUERY );
116 xSeqProp->setPropertyValue(
"Role",
uno::Any( rRole ));
119void lcl_addSequenceToDataSource(
120 const Reference< chart2::data::XDataSource > & xDataSource,
121 const Reference< chart2::data::XDataSequence > & xNewSequence,
122 const OUString & rRole )
124 Reference< chart2::data::XDataSink >
xSink( xDataSource, uno::UNO_QUERY );
131 lcl_setRole( xNewSequence, rRole );
132 xLSeq->setValues( xNewSequence );
133 Sequence< Reference< chart2::data::XLabeledDataSequence > > aSequences(
134 xDataSource->getDataSequences());
135 aSequences.realloc( aSequences.getLength() + 1 );
136 auto pSequences = aSequences.getArray();
137 pSequences[ aSequences.getLength() - 1 ] = xLSeq;
138 xSink->setData( aSequences );
141void lcl_setXMLRangePropertyAtDataSequence(
142 const Reference< chart2::data::XDataSequence > & xDataSequence,
143 const OUString & rXMLRange )
147 static constexpr OUStringLiteral aXMLRangePropName( u
"CachedXMLRange");
148 Reference< beans::XPropertySet > xProp( xDataSequence, uno::UNO_QUERY_THROW );
149 Reference< beans::XPropertySetInfo > xInfo( xProp->getPropertySetInfo());
150 if( xInfo.is() && xInfo->hasPropertyByName( aXMLRangePropName ))
151 xProp->setPropertyValue( aXMLRangePropName,
uno::Any( rXMLRange ));
153 catch(
const uno::Exception & )
165 const Sequence< double > & rData )
168 return lcl_getVariance( rData, nValCount );
174 if( ! std::isnan( fResult ))
175 fResult = sqrt( fResult );
183 double fVar = lcl_getVariance( rData, nValCount );
185 if( nValCount == 0 || std::isnan( fVar ))
186 return std::numeric_limits<double>::quiet_NaN();
188 return sqrt( fVar ) / sqrt(
double(nValCount) );
192 const Reference< chart2::data::XDataSource > & xDataSource,
196 uno::Reference< chart2::data::XLabeledDataSequence > xResult;
197 if( !xDataSource.is())
201 uno::Reference< chart2::data::XLabeledDataSequence > xLSeq =
202 lcl_getErrorBarLabeledSequence( xDataSource, bPositiveValue, bYError, aRole );
210 const Reference< chart2::data::XDataSource > & xDataSource,
214 uno::Reference< chart2::data::XLabeledDataSequence > xLSeq =
216 xDataSource, bPositiveValue,
219 return Reference< chart2::data::XDataSequence >();
221 return xLSeq->getValues();
225 const Reference< chart2::data::XDataSource > & xDataSource,
230 double fResult = std::numeric_limits<double>::quiet_NaN();
232 Reference< chart2::data::XDataSequence > xValues(
235 Reference< chart2::data::XNumericalDataSequence > xNumValues( xValues, uno::UNO_QUERY );
238 Sequence< double >
aData( xNumValues->getNumericalData());
239 if( nIndex <
aData.getLength())
242 else if( xValues.is())
244 Sequence< uno::Any >
aData( xValues->getData());
245 if( nIndex <
aData.getLength())
253 const Reference< chart2::data::XDataSource > & xDataSource,
254 const Reference< chart2::data::XDataProvider > & xDataProvider,
255 const OUString & rNewRange,
258 OUString
const * pXMLRange )
260 Reference< chart2::data::XDataSink > xDataSink( xDataSource, uno::UNO_QUERY );
261 if( ! ( xDataSink.is() && xDataProvider.is()))
266 lcl_getErrorBarLabeledSequence( xDataSource, bPositiveValue, bYError, aRole ));
267 Reference< chart2::data::XDataSequence > xNewSequence(
268 xDataProvider->createDataSequenceByRangeRepresentation( rNewRange ));
269 if( xNewSequence.is())
272 lcl_setXMLRangePropertyAtDataSequence( xNewSequence, *pXMLRange );
275 lcl_setRole( xNewSequence, aRole );
276 xLSeq->setValues( xNewSequence );
279 lcl_addSequenceToDataSource( xDataSource, xNewSequence, aRole );
288 Reference< beans::XPropertySet > xErrorBar;
289 if( !xDataSeries.is())
294 if( !( xDataSeries->getPropertyValue( aPropName ) >>= xErrorBar ) ||
297 xErrorBar.set(
new ErrorBar );
300 OSL_ASSERT( xErrorBar.is());
303 xErrorBar->setPropertyValue(
"ErrorBarStyle",
uno::Any( nStyle ));
306 xDataSeries->setPropertyValue( aPropName,
uno::Any( xErrorBar ));
315 Reference< beans::XPropertySet > xErrorBar;
319 if ( xDataSeries.is())
320 xDataSeries->getPropertyValue( aPropName ) >>= xErrorBar;
329 Reference< beans::XPropertySet > xErrorBar(
getErrorBars( xDataSeries, bYError ));
330 sal_Int32 nStyle = css::chart::ErrorBarStyle::NONE;
332 return ( xErrorBar.is() &&
333 ( xErrorBar->getPropertyValue(
"ErrorBarStyle") >>= nStyle ) &&
334 nStyle != css::chart::ErrorBarStyle::NONE );
341 Reference< beans::XPropertySet > xErrorBar(
getErrorBars( xDataSeries, bYError ));
343 xErrorBar->setPropertyValue(
"ErrorBarStyle",
uno::Any(
344 css::chart::ErrorBarStyle::NONE ));
351 Reference< beans::XPropertySet > xErrorBar(
getErrorBars( xDataSeries, bYError ));
352 sal_Int32 nStyle = css::chart::ErrorBarStyle::NONE;
354 return ( xErrorBar.is() &&
355 ( xErrorBar->getPropertyValue(
"ErrorBarStyle") >>= nStyle ) &&
356 nStyle == css::chart::ErrorBarStyle::FROM_DATA );
#define DBG_UNHANDLED_EXCEPTION(...)
tools::SvRef< SvBaseLink > xSink
constexpr OUStringLiteral aData
OOO_DLLPUBLIC_CHARTTOOLS css::uno::Reference< css::chart2::data::XLabeledDataSequence > getDataSequenceByRole(const css::uno::Reference< css::chart2::data::XDataSource > &xSource, const OUString &aRole, bool bMatchPrefix=false)
Retrieves the data sequence in the given data source that matches the given role.
OOO_DLLPUBLIC_CHARTTOOLS void removeErrorBars(const rtl::Reference< ::chart::DataSeries > &xDataSeries, bool bYError=true)
OOO_DLLPUBLIC_CHARTTOOLS double getStandardDeviation(const css::uno::Sequence< double > &rData)
OOO_DLLPUBLIC_CHARTTOOLS css::uno::Reference< css::chart2::data::XDataSequence > getErrorDataSequenceFromDataSource(const css::uno::Reference< css::chart2::data::XDataSource > &xDataSource, bool bPositiveValue, bool bYError=true)
OOO_DLLPUBLIC_CHARTTOOLS css::uno::Reference< css::beans::XPropertySet > getErrorBars(const rtl::Reference< ::chart::DataSeries > &xDataSeries, bool bYError=true)
OOO_DLLPUBLIC_CHARTTOOLS bool usesErrorBarRanges(const rtl::Reference< ::chart::DataSeries > &xDataSeries, bool bYError=true)
OOO_DLLPUBLIC_CHARTTOOLS double getStandardError(const css::uno::Sequence< double > &rData)
OOO_DLLPUBLIC_CHARTTOOLS bool hasErrorBars(const rtl::Reference< ::chart::DataSeries > &xDataSeries, bool bYError=true)
OOO_DLLPUBLIC_CHARTTOOLS double getErrorFromDataSource(const css::uno::Reference< css::chart2::data::XDataSource > &xDataSource, sal_Int32 nIndex, bool bPositiveValue, bool bYError=true)
OOO_DLLPUBLIC_CHARTTOOLS css::uno::Reference< css::beans::XPropertySet > addErrorBars(const rtl::Reference< ::chart::DataSeries > &xDataSeries, sal_Int32 nStyle, bool bYError=true)
OOO_DLLPUBLIC_CHARTTOOLS void setErrorDataSequence(const css::uno::Reference< css::chart2::data::XDataSource > &xDataSource, const css::uno::Reference< css::chart2::data::XDataProvider > &xDataProvider, const OUString &rNewRange, bool bPositiveValue, bool bYError=true, OUString const *pXMLRange=nullptr)
OOO_DLLPUBLIC_CHARTTOOLS double getVariance(const css::uno::Sequence< double > &rData)
Calculates 1/n * sum (x_i - x_mean)^2.
OOO_DLLPUBLIC_CHARTTOOLS css::uno::Reference< css::chart2::data::XLabeledDataSequence > getErrorLabeledDataSequenceFromDataSource(const css::uno::Reference< css::chart2::data::XDataSource > &xDataSource, bool bPositiveValue, bool bYError=true)
Reference< XComponentContext > getProcessComponentContext()
constexpr OUStringLiteral CHART_UNONAME_ERRORBAR_Y
constexpr OUStringLiteral CHART_UNONAME_ERRORBAR_X