chart2/source/controller/dialogs/DataBrowserModel.cxx | 14 ++-- chart2/source/controller/dialogs/DialogModel.cxx | 4 - chart2/source/controller/dialogs/dlg_ObjectProperties.cxx | 5 - chart2/source/inc/DataSeries.hxx | 9 ++ chart2/source/inc/DataSeriesHelper.hxx | 14 +++- chart2/source/inc/DataSource.hxx | 5 + chart2/source/inc/LabeledDataSequence.hxx | 1 chart2/source/model/main/DataSeries.cxx | 39 ++++-------- chart2/source/model/template/BubbleDataInterpreter.cxx | 17 ++--- chart2/source/model/template/DataInterpreter.cxx | 4 - chart2/source/model/template/StockDataInterpreter.cxx | 45 ++++++-------- chart2/source/model/template/XYDataInterpreter.cxx | 15 ++-- chart2/source/tools/DataSeriesHelper.cxx | 40 +++++++++--- chart2/source/tools/DataSource.cxx | 8 ++ chart2/source/tools/DataSourceHelper.cxx | 9 +- chart2/source/tools/InternalDataProvider.cxx | 11 +-- chart2/source/tools/LabeledDataSequence.cxx | 22 ++++++ chart2/source/tools/RangeHighlighter.cxx | 5 - chart2/source/view/main/VDataSeries.cxx | 10 +-- 19 files changed, 166 insertions(+), 111 deletions(-)
New commits: commit ccbd2b0c663fa19be5301f0ea8ac74caa055fe47 Author: Noel Grandin <noelgran...@gmail.com> AuthorDate: Thu Feb 3 18:12:01 2022 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Fri Feb 4 14:40:10 2022 +0100 use more concrete types in chart2, LabeledDataSequence Change-Id: Iecc22ad488fff7d0536ffa37f4cde7da460c2c7d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/129458 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/chart2/source/controller/dialogs/DataBrowserModel.cxx b/chart2/source/controller/dialogs/DataBrowserModel.cxx index a25af6ca5a9f..e0b1fe6c9edf 100644 --- a/chart2/source/controller/dialogs/DataBrowserModel.cxx +++ b/chart2/source/controller/dialogs/DataBrowserModel.cxx @@ -33,7 +33,7 @@ #include <chartview/ExplicitValueProvider.hxx> #include <ExplicitCategoriesProvider.hxx> #include <BaseCoordinateSystem.hxx> - +#include <LabeledDataSequence.hxx> #include <ChartModel.hxx> #include <unonames.hxx> @@ -129,7 +129,7 @@ bool lcl_SequenceOfSeriesIsShared( return bResult; } -typedef std::vector< Reference< chart2::data::XLabeledDataSequence > > lcl_tSharedSeqVec; +typedef std::vector< rtl::Reference< ::chart::LabeledDataSequence > > lcl_tSharedSeqVec; lcl_tSharedSeqVec lcl_getSharedSequences( const Sequence< Reference< chart2::XDataSeries > > & rSeries ) { @@ -153,7 +153,7 @@ lcl_tSharedSeqVec lcl_getSharedSequences( const Sequence< Reference< chart2::XDa break; } if( bShared ) - aResult.push_back( labeledDataSeq ); + aResult.push_back( dynamic_cast<LabeledDataSequence*>(labeledDataSeq.get()) ); } return aResult; @@ -195,10 +195,10 @@ private: struct lcl_RolesOfLSeqMatch { - explicit lcl_RolesOfLSeqMatch( const Reference< chart2::data::XLabeledDataSequence > & xLSeq ) : + explicit lcl_RolesOfLSeqMatch( const rtl::Reference< LabeledDataSequence > & xLSeq ) : m_aRole(DataSeriesHelper::getRole(xLSeq)) {} - bool operator() ( const Reference< chart2::data::XLabeledDataSequence > & xLSeq ) + bool operator() ( const rtl::Reference< LabeledDataSequence > & xLSeq ) { return DataSeriesHelper::getRole(xLSeq) == m_aRole; } @@ -341,9 +341,9 @@ void DataBrowserModel::insertDataSeries( sal_Int32 nAfterColumnIndex ) // Failed to insert new data series to the model. Bail out. return; - Sequence<Reference<chart2::data::XLabeledDataSequence> > aLSequences = xNewSeries->getDataSequences(); + const std::vector<rtl::Reference<LabeledDataSequence> > & aLSequences = xNewSeries->getDataSequences2(); sal_Int32 nSeqIdx = 0; - sal_Int32 nSeqSize = aLSequences.getLength(); + sal_Int32 nSeqSize = aLSequences.size(); for (sal_Int32 nIndex = nStartCol; nSeqIdx < nSeqSize; ++nSeqIdx) { lcl_tSharedSeqVec::const_iterator aSharedIt( diff --git a/chart2/source/controller/dialogs/DialogModel.cxx b/chart2/source/controller/dialogs/DialogModel.cxx index cef69be4ecc3..8128b2c2d343 100644 --- a/chart2/source/controller/dialogs/DialogModel.cxx +++ b/chart2/source/controller/dialogs/DialogModel.cxx @@ -266,7 +266,7 @@ rtl::Reference< ::chart::DataSeries > lcl_CreateNewSeries( // set chart type specific roles if( xChartType.is() ) { - std::vector< Reference< data::XLabeledDataSequence > > aNewSequences; + std::vector< rtl::Reference< ::chart::LabeledDataSequence > > aNewSequences; const OUString aRoleOfSeqForSeriesLabel = xChartType->getRoleOfSequenceForSeriesLabel(); const OUString aLabel(::chart::SchResId(STR_DATA_UNNAMED_SERIES)); Sequence< OUString > aPossibleRoles( xChartType->getSupportedMandatoryRoles()); @@ -319,7 +319,7 @@ rtl::Reference< ::chart::DataSeries > lcl_CreateNewSeries( aNewSequences.push_back( ::chart::DataSourceHelper::createLabeledDataSequence( xSeq )); } - xResult->setData( comphelper::containerToSequence( aNewSequences )); + xResult->setData( aNewSequences ); } } diff --git a/chart2/source/controller/dialogs/dlg_ObjectProperties.cxx b/chart2/source/controller/dialogs/dlg_ObjectProperties.cxx index ed2f5569b1b5..f16eb8f42807 100644 --- a/chart2/source/controller/dialogs/dlg_ObjectProperties.cxx +++ b/chart2/source/controller/dialogs/dlg_ObjectProperties.cxx @@ -47,6 +47,7 @@ #include <CommonConverters.hxx> #include <RegressionCalculationHelper.hxx> #include <BaseCoordinateSystem.hxx> +#include <LabeledDataSequence.hxx> #include <com/sun/star/chart2/AxisType.hpp> #include <com/sun/star/chart2/XAxis.hpp> @@ -214,13 +215,13 @@ void ObjectPropertiesDialogParameter::init( const rtl::Reference<::chart::ChartM if( m_eObjectType == OBJECTTYPE_DATA_CURVE ) { - Sequence< Reference< data::XLabeledDataSequence > > aDataSeqs( xSeries->getDataSequences()); + const std::vector< rtl::Reference< LabeledDataSequence > > & aDataSeqs( xSeries->getDataSequences2()); Sequence< double > aXValues, aYValues; bool bXValuesFound = false, bYValuesFound = false; m_nNbPoints = 0; sal_Int32 i = 0; for( i=0; - ! (bXValuesFound && bYValuesFound) && i<aDataSeqs.getLength(); + ! (bXValuesFound && bYValuesFound) && i<static_cast<sal_Int32>(aDataSeqs.size()); ++i ) { try diff --git a/chart2/source/inc/DataSeries.hxx b/chart2/source/inc/DataSeries.hxx index 79f3032d132a..e1859f817fcd 100644 --- a/chart2/source/inc/DataSeries.hxx +++ b/chart2/source/inc/DataSeries.hxx @@ -43,6 +43,7 @@ namespace com::sun::star::beans { class XPropertySet; } namespace chart { +class LabeledDataSequence; class RegressionCurveModel; namespace impl @@ -87,6 +88,7 @@ public: virtual void SAL_CALL resetDataPoint( sal_Int32 nIndex ) override; virtual void SAL_CALL resetAllDataPoints() override; +private: // ____ XDataSink ____ /// @see css::chart2::data::XDataSink virtual void SAL_CALL setData( const css::uno::Sequence< css::uno::Reference< css::chart2::data::XLabeledDataSequence > >& aData ) override; @@ -94,6 +96,7 @@ public: // ____ XDataSource ____ /// @see css::chart2::data::XDataSource virtual css::uno::Sequence< css::uno::Reference< css::chart2::data::XLabeledDataSequence > > SAL_CALL getDataSequences() override; +public: // ____ OPropertySet ____ virtual void GetDefaultValue( sal_Int32 nHandle, css::uno::Any& rAny ) const override; @@ -131,7 +134,10 @@ public: virtual void SAL_CALL removeModifyListener( const css::uno::Reference< css::util::XModifyListener >& aListener ) override; - void setData( const std::vector< css::uno::Reference< css::chart2::data::XLabeledDataSequence > >& aData ); + typedef std::vector< rtl::Reference< LabeledDataSequence > > tDataSequenceContainer; + + void setData( const tDataSequenceContainer& aData ); + const tDataSequenceContainer & getDataSequences2() const { return m_aDataSequences; } typedef std::vector< rtl::Reference< ::chart::RegressionCurveModel > > @@ -158,7 +164,6 @@ private: void fireModifyEvent(); - typedef std::vector< css::uno::Reference< css::chart2::data::XLabeledDataSequence > > tDataSequenceContainer; tDataSequenceContainer m_aDataSequences; typedef std::map< sal_Int32, diff --git a/chart2/source/inc/DataSeriesHelper.hxx b/chart2/source/inc/DataSeriesHelper.hxx index f0f439f2bc8f..90c5e0f40c0e 100644 --- a/chart2/source/inc/DataSeriesHelper.hxx +++ b/chart2/source/inc/DataSeriesHelper.hxx @@ -38,14 +38,18 @@ namespace com::sun::star::uno { class Any; } namespace com::sun::star::uno { template <class E> class Sequence; } namespace chart { class BaseCoordinateSystem; } namespace chart { class ChartType; } +namespace chart { class DataSource; } namespace chart { class Diagram; } namespace chart { class DataSeries; } +namespace chart { class LabeledDataSequence; } namespace chart::DataSeriesHelper { OOO_DLLPUBLIC_CHARTTOOLS OUString getRole( const css::uno::Reference<css::chart2::data::XLabeledDataSequence>& xLabeledDataSequence ); +OOO_DLLPUBLIC_CHARTTOOLS OUString + getRole( const rtl::Reference<::chart::LabeledDataSequence>& xLabeledDataSequence ); /** Retrieves the data sequence in the given data source that matches the given role. If more than one sequences match the role, the first match @@ -75,13 +79,17 @@ OOO_DLLPUBLIC_CHARTTOOLS std::vector< css::uno::Reference< css::chart2::data::XLabeledDataSequence > > getAllDataSequencesByRole( const css::uno::Sequence< css::uno::Reference< css::chart2::data::XLabeledDataSequence > > & aDataSequences, const OUString& aRole ); +OOO_DLLPUBLIC_CHARTTOOLS std::vector< + rtl::Reference< ::chart::LabeledDataSequence > > + getAllDataSequencesByRole( const std::vector< rtl::Reference< ::chart::LabeledDataSequence > > & aDataSequences, + const OUString& aRole ); OOO_DLLPUBLIC_CHARTTOOLS std::vector<css::uno::Reference<css::chart2::data::XLabeledDataSequence> > getAllDataSequences( const css::uno::Sequence<css::uno::Reference<css::chart2::XDataSeries> >& aSeries ); OOO_DLLPUBLIC_CHARTTOOLS -std::vector<css::uno::Reference<css::chart2::data::XLabeledDataSequence> > +std::vector<rtl::Reference<::chart::LabeledDataSequence> > getAllDataSequences( const std::vector<rtl::Reference<::chart::DataSeries> >& aSeries ); @@ -89,9 +97,9 @@ getAllDataSequences( into a data source. The order of sequences will match the order of the data series. */ -OOO_DLLPUBLIC_CHARTTOOLS css::uno::Reference< css::chart2::data::XDataSource > +OOO_DLLPUBLIC_CHARTTOOLS rtl::Reference< ::chart::DataSource > getDataSource( const css::uno::Sequence< css::uno::Reference< css::chart2::XDataSeries > > & aSeries ); -OOO_DLLPUBLIC_CHARTTOOLS css::uno::Reference< css::chart2::data::XDataSource > +OOO_DLLPUBLIC_CHARTTOOLS rtl::Reference< ::chart::DataSource > getDataSource( const std::vector< rtl::Reference< ::chart::DataSeries > > & aSeries ); /** Get the label of a series (e.g. for the legend) diff --git a/chart2/source/inc/DataSource.hxx b/chart2/source/inc/DataSource.hxx index 56c740bc0d2c..1ab8b68c161a 100644 --- a/chart2/source/inc/DataSource.hxx +++ b/chart2/source/inc/DataSource.hxx @@ -22,9 +22,12 @@ #include <com/sun/star/chart2/data/XDataSource.hpp> #include <com/sun/star/chart2/data/XDataSink.hpp> #include <cppuhelper/implbase.hxx> +#include <rtl/ref.hxx> +#include <vector> namespace chart { +class LabeledDataSequence; class DataSource final : public ::cppu::WeakImplHelper< @@ -36,6 +39,8 @@ public: explicit DataSource(); explicit DataSource( const css::uno::Sequence< css::uno::Reference< css::chart2::data::XLabeledDataSequence > > & rSequences ); + explicit DataSource( + const std::vector< rtl::Reference< ::chart::LabeledDataSequence > > & rSequences ); virtual ~DataSource() override; diff --git a/chart2/source/inc/LabeledDataSequence.hxx b/chart2/source/inc/LabeledDataSequence.hxx index 48a06dd7d0d2..9f9e1c793a71 100644 --- a/chart2/source/inc/LabeledDataSequence.hxx +++ b/chart2/source/inc/LabeledDataSequence.hxx @@ -47,6 +47,7 @@ class OOO_DLLPUBLIC_CHARTTOOLS LabeledDataSequence final : { public: explicit LabeledDataSequence(); + explicit LabeledDataSequence(const LabeledDataSequence &); explicit LabeledDataSequence( const css::uno::Reference< css::chart2::data::XDataSequence > & rValues ); explicit LabeledDataSequence( diff --git a/chart2/source/model/main/DataSeries.cxx b/chart2/source/model/main/DataSeries.cxx index 4407367e9fab..4b10f5ef06bb 100644 --- a/chart2/source/model/main/DataSeries.cxx +++ b/chart2/source/model/main/DataSeries.cxx @@ -24,6 +24,7 @@ #include <UserDefinedProperties.hxx> #include "DataPoint.hxx" #include <DataSeriesHelper.hxx> +#include <LabeledDataSequence.hxx> #include <CloneHelper.hxx> #include <RegressionCurveModel.hxx> #include <ModifyListenerHelper.hxx> @@ -140,8 +141,7 @@ DataSeries::DataSeries( const DataSeries & rOther ) : { if( ! rOther.m_aDataSequences.empty()) { - CloneHelper::CloneRefVector<css::chart2::data::XLabeledDataSequence>( - rOther.m_aDataSequences, m_aDataSequences ); + CloneHelper::CloneRefVector(rOther.m_aDataSequences, m_aDataSequences ); ModifyListenerHelper::addListenerToAllElements( m_aDataSequences, m_xModifyEventForwarder ); } @@ -166,9 +166,6 @@ DataSeries::DataSeries( const DataSeries & rOther ) : // late initialization to call after copy-constructing void DataSeries::Init( const DataSeries & rOther ) { - if( ! rOther.m_aDataSequences.empty()) - EventListenerHelper::addListenerToAllElements( m_aDataSequences, this ); - Reference< uno::XInterface > xThisInterface( static_cast< ::cppu::OWeakObject * >( this )); if( ! rOther.m_aAttributedDataPoints.empty()) { @@ -301,13 +298,13 @@ Reference< beans::XPropertySet > { Reference< beans::XPropertySet > xResult; - Sequence< Reference< chart2::data::XLabeledDataSequence > > aSequences; + std::vector< rtl::Reference< LabeledDataSequence > > aSequences; { MutexGuard aGuard( m_aMutex ); - aSequences = comphelper::containerToSequence( m_aDataSequences ); + aSequences = m_aDataSequences; } - std::vector< Reference< chart2::data::XLabeledDataSequence > > aValuesSeries( + std::vector< rtl::Reference< LabeledDataSequence > > aValuesSeries( DataSeriesHelper::getAllDataSequencesByRole( aSequences , "values" ) ); if (aValuesSeries.empty()) @@ -389,39 +386,36 @@ void SAL_CALL DataSeries::setData( const uno::Sequence< Reference< chart2::data: tDataSequenceContainer aOldDataSequences; tDataSequenceContainer aNewDataSequences; Reference< util::XModifyListener > xModifyEventForwarder; - Reference< lang::XEventListener > xListener; { MutexGuard aGuard( m_aMutex ); xModifyEventForwarder = m_xModifyEventForwarder; - xListener = this; std::swap( aOldDataSequences, m_aDataSequences ); - aNewDataSequences = comphelper::sequenceToContainer<tDataSequenceContainer>( aData ); + for (const auto & i : aData) + { + auto p = dynamic_cast<LabeledDataSequence*>(i.get()); + assert(p); + aNewDataSequences.push_back(p); + } m_aDataSequences = aNewDataSequences; } ModifyListenerHelper::removeListenerFromAllElements( aOldDataSequences, xModifyEventForwarder ); - EventListenerHelper::removeListenerFromAllElements( aOldDataSequences, xListener ); - EventListenerHelper::addListenerToAllElements( aNewDataSequences, xListener ); ModifyListenerHelper::addListenerToAllElements( aNewDataSequences, xModifyEventForwarder ); fireModifyEvent(); } -void DataSeries::setData( const std::vector< Reference< chart2::data::XLabeledDataSequence > >& aData ) +void DataSeries::setData( const std::vector< rtl::Reference< LabeledDataSequence > >& aData ) { tDataSequenceContainer aOldDataSequences; tDataSequenceContainer aNewDataSequences; Reference< util::XModifyListener > xModifyEventForwarder; - Reference< lang::XEventListener > xListener; { MutexGuard aGuard( m_aMutex ); xModifyEventForwarder = m_xModifyEventForwarder; - xListener = this; std::swap( aOldDataSequences, m_aDataSequences ); aNewDataSequences = aData; m_aDataSequences = aNewDataSequences; } ModifyListenerHelper::removeListenerFromAllElements( aOldDataSequences, xModifyEventForwarder ); - EventListenerHelper::removeListenerFromAllElements( aOldDataSequences, xListener ); - EventListenerHelper::addListenerToAllElements( aNewDataSequences, xListener ); ModifyListenerHelper::addListenerToAllElements( aNewDataSequences, xModifyEventForwarder ); fireModifyEvent(); } @@ -430,7 +424,7 @@ void DataSeries::setData( const std::vector< Reference< chart2::data::XLabeledDa Sequence< Reference< chart2::data::XLabeledDataSequence > > SAL_CALL DataSeries::getDataSequences() { MutexGuard aGuard( m_aMutex ); - return comphelper::containerToSequence( m_aDataSequences ); + return comphelper::containerToSequence<Reference< chart2::data::XLabeledDataSequence >>( m_aDataSequences ); } // ____ XRegressionCurveContainer ____ @@ -524,13 +518,8 @@ void SAL_CALL DataSeries::modified( const lang::EventObject& aEvent ) } // ____ XEventListener (base of XModifyListener) ____ -void SAL_CALL DataSeries::disposing( const lang::EventObject& rEventObject ) +void SAL_CALL DataSeries::disposing( const lang::EventObject& ) { - // forget disposed data sequences - tDataSequenceContainer::iterator aIt( - std::find( m_aDataSequences.begin(), m_aDataSequences.end(), rEventObject.Source )); - if( aIt != m_aDataSequences.end()) - m_aDataSequences.erase( aIt ); } // ____ OPropertySet ____ diff --git a/chart2/source/model/template/BubbleDataInterpreter.cxx b/chart2/source/model/template/BubbleDataInterpreter.cxx index 8868fbb6ca89..1ebf56056712 100644 --- a/chart2/source/model/template/BubbleDataInterpreter.cxx +++ b/chart2/source/model/template/BubbleDataInterpreter.cxx @@ -55,9 +55,9 @@ InterpretedData BubbleDataInterpreter::interpretDataSource( std::vector< rtl::Reference< LabeledDataSequence > > aData = DataInterpreter::getDataSequences(xSource); - Reference< data::XLabeledDataSequence > xValuesX; - vector< Reference< data::XLabeledDataSequence > > aYValuesVector; - vector< Reference< data::XLabeledDataSequence > > aSizeValuesVector; + rtl::Reference< LabeledDataSequence > xValuesX; + vector< rtl::Reference< LabeledDataSequence > > aYValuesVector; + vector< rtl::Reference< LabeledDataSequence > > aSizeValuesVector; rtl::Reference< LabeledDataSequence > xCategories; bool bHasCategories = HasCategories( aArguments, aData ); @@ -90,7 +90,7 @@ InterpretedData BubbleDataInterpreter::interpretDataSource( } else if( !xValuesX.is() && bSetXValues ) { - xValuesX.set( aData[nDataIdx] ); + xValuesX = aData[nDataIdx]; if( xValuesX.is()) SetRole( xValuesX->getValues(), "values-x"); } @@ -120,16 +120,15 @@ InterpretedData BubbleDataInterpreter::interpretDataSource( vector< Reference< XDataSeries > > aSeriesVec; aSeriesVec.reserve( aSizeValuesVector.size()); - Reference< data::XLabeledDataSequence > xClonedXValues = xValuesX; - Reference< util::XCloneable > xCloneableX( xValuesX, uno::UNO_QUERY ); + rtl::Reference< LabeledDataSequence > xClonedXValues = xValuesX; for( size_t nN = 0; nN < aSizeValuesVector.size(); ++nN, ++nSeriesIndex ) { - vector< Reference< data::XLabeledDataSequence > > aNewData; + vector< rtl::Reference< LabeledDataSequence > > aNewData; if( xValuesX.is() ) { - if( nN > 0 && xCloneableX.is() ) - xClonedXValues.set( xCloneableX->createClone(), uno::UNO_QUERY ); + if( nN > 0 ) + xClonedXValues = new LabeledDataSequence(*xValuesX); aNewData.push_back( xClonedXValues ); } if( aYValuesVector.size() > nN ) diff --git a/chart2/source/model/template/DataInterpreter.cxx b/chart2/source/model/template/DataInterpreter.cxx index 38d1ff5be1c1..6155fa7e7144 100644 --- a/chart2/source/model/template/DataInterpreter.cxx +++ b/chart2/source/model/template/DataInterpreter.cxx @@ -143,7 +143,7 @@ InterpretedData DataInterpreter::interpretDataSource( std::vector< rtl::Reference< LabeledDataSequence > > aData = getDataSequences(xSource); rtl::Reference< LabeledDataSequence > xCategories; - vector< Reference< data::XLabeledDataSequence > > aSequencesVec; + vector< rtl::Reference< LabeledDataSequence > > aSequencesVec; // check if we should use categories @@ -182,7 +182,7 @@ InterpretedData DataInterpreter::interpretDataSource( for (auto const& elem : aSequencesVec) { - Sequence< Reference< data::XLabeledDataSequence > > aNewData( &elem, 1 ); + std::vector< rtl::Reference< LabeledDataSequence > > aNewData { elem }; rtl::Reference< DataSeries > xSeries; if( nSeriesIndex < static_cast<sal_Int32>(aSeriesToReUse.size())) xSeries = aSeriesToReUse[nSeriesIndex]; diff --git a/chart2/source/model/template/StockDataInterpreter.cxx b/chart2/source/model/template/StockDataInterpreter.cxx index addf3f71e3f8..df7f6d7f70cc 100644 --- a/chart2/source/model/template/StockDataInterpreter.cxx +++ b/chart2/source/model/template/StockDataInterpreter.cxx @@ -88,16 +88,15 @@ InterpretedData StockDataInterpreter::interpretDataSource( sal_Int32 nNumberOfGroups( bHasVolume ? 2 : 1 ); // sequences of data::XLabeledDataSequence per series per group - Sequence< Sequence< Sequence< Reference< data::XLabeledDataSequence > > > > aSequences( nNumberOfGroups ); - auto pSequences = aSequences.getArray(); + std::vector< std::vector< std::vector< rtl::Reference< LabeledDataSequence > > > > aSequences( nNumberOfGroups ); const sal_Int32 nBarGroupIndex( 0 ); const sal_Int32 nCandleStickGroupIndex( nNumberOfGroups - 1 ); // allocate space for labeled sequences if( nRemaining > 0 ) ++nCandleStickSeries; - pSequences[nCandleStickGroupIndex].realloc( nCandleStickSeries ); - auto pCandleStickGroup = pSequences[nCandleStickGroupIndex].getArray(); + aSequences[nCandleStickGroupIndex].resize( nCandleStickSeries ); + auto & pCandleStickGroup = aSequences[nCandleStickGroupIndex]; if( bHasVolume ) { // if there are remaining sequences, the first one is taken for @@ -105,9 +104,9 @@ InterpretedData StockDataInterpreter::interpretDataSource( // is used if( nRemaining > 1 ) ++nVolumeSeries; - pSequences[nBarGroupIndex].realloc( nVolumeSeries ); + aSequences[nBarGroupIndex].resize( nVolumeSeries ); } - auto pBarGroup = pSequences[nBarGroupIndex].getArray(); + auto & pBarGroup = aSequences[nBarGroupIndex]; // create data sal_Int32 nSourceIndex = 0; // index into aData sequence @@ -125,8 +124,8 @@ InterpretedData StockDataInterpreter::interpretDataSource( // bar if( bHasVolume ) { - pBarGroup[nLabeledSeqIdx].realloc( 1 ); - pBarGroup[nLabeledSeqIdx].getArray()[0].set( aData[nSourceIndex] ); + pBarGroup[nLabeledSeqIdx].resize( 1 ); + pBarGroup[nLabeledSeqIdx][0] = aData[nSourceIndex]; if( aData[nSourceIndex].is()) SetRole( aData[nSourceIndex]->getValues(), "values-y"); ++nSourceIndex; @@ -135,30 +134,30 @@ InterpretedData StockDataInterpreter::interpretDataSource( sal_Int32 nSeqIdx = 0; if( bHasOpenValues ) { - pCandleStickGroup[nLabeledSeqIdx].realloc( 4 ); - pCandleStickGroup[nLabeledSeqIdx].getArray()[nSeqIdx].set( aData[nSourceIndex] ); + pCandleStickGroup[nLabeledSeqIdx].resize( 4 ); + pCandleStickGroup[nLabeledSeqIdx][nSeqIdx] = aData[nSourceIndex]; if( aData[nSourceIndex].is()) SetRole( aData[nSourceIndex]->getValues(), "values-first"); ++nSourceIndex; ++nSeqIdx; } else - pCandleStickGroup[nLabeledSeqIdx].realloc( 3 ); - auto pLabeledSeq = pCandleStickGroup[nLabeledSeqIdx].getArray(); + pCandleStickGroup[nLabeledSeqIdx].resize( 3 ); + auto & pLabeledSeq = pCandleStickGroup[nLabeledSeqIdx]; - pLabeledSeq[nSeqIdx].set( aData[nSourceIndex] ); + pLabeledSeq[nSeqIdx] = aData[nSourceIndex]; if( aData[nSourceIndex].is()) SetRole( aData[nSourceIndex]->getValues(), "values-min"); ++nSourceIndex; ++nSeqIdx; - pLabeledSeq[nSeqIdx].set( aData[nSourceIndex] ); + pLabeledSeq[nSeqIdx] = aData[nSourceIndex]; if( aData[nSourceIndex].is()) SetRole( aData[nSourceIndex]->getValues(), "values-max"); ++nSourceIndex; ++nSeqIdx; - pLabeledSeq[nSeqIdx].set( aData[nSourceIndex] ); + pLabeledSeq[nSeqIdx] = aData[nSourceIndex]; if( aData[nSourceIndex].is()) SetRole( aData[nSourceIndex]->getValues(), "values-last"); ++nSourceIndex; @@ -169,11 +168,11 @@ InterpretedData StockDataInterpreter::interpretDataSource( if( bHasVolume && nRemaining > 1 ) { OSL_ASSERT( nVolumeSeries > nNumOfFullSeries ); - pBarGroup[nVolumeSeries - 1].realloc( 1 ); + pBarGroup[nVolumeSeries - 1].resize( 1 ); OSL_ASSERT( nDataCount > nSourceIndex ); if( aData[nSourceIndex].is()) SetRole( aData[nSourceIndex]->getValues(), "values-y"); - pBarGroup[nVolumeSeries - 1].getArray()[0].set( aData[nSourceIndex] ); + pBarGroup[nVolumeSeries - 1][0] = aData[nSourceIndex]; ++nSourceIndex; --nRemaining; OSL_ENSURE( nRemaining, "additional bar should only be used if there is at least one more sequence for a candle stick" ); @@ -184,13 +183,13 @@ InterpretedData StockDataInterpreter::interpretDataSource( { OSL_ASSERT( nCandleStickSeries > nNumOfFullSeries ); const sal_Int32 nSeriesIndex = nCandleStickSeries - 1; - pCandleStickGroup[nSeriesIndex].realloc( nRemaining ); - auto pLabeledSeq = pCandleStickGroup[nSeriesIndex].getArray(); + pCandleStickGroup[nSeriesIndex].resize( nRemaining ); + auto & pLabeledSeq = pCandleStickGroup[nSeriesIndex]; OSL_ASSERT( nDataCount > nSourceIndex ); // 1. low sal_Int32 nSeqIdx( 0 ); - pLabeledSeq[nSeqIdx].set( aData[nSourceIndex] ); + pLabeledSeq[nSeqIdx] = aData[nSourceIndex]; if( aData[nSourceIndex].is()) SetRole( aData[nSourceIndex]->getValues(), "values-min"); ++nSourceIndex; @@ -199,7 +198,7 @@ InterpretedData StockDataInterpreter::interpretDataSource( // 2. high if( nSeqIdx < nRemaining ) { - pLabeledSeq[nSeqIdx].set( aData[nSourceIndex] ); + pLabeledSeq[nSeqIdx] = aData[nSourceIndex]; if( aData[nSourceIndex].is()) SetRole( aData[nSourceIndex]->getValues(), "values-max"); ++nSourceIndex; @@ -210,7 +209,7 @@ InterpretedData StockDataInterpreter::interpretDataSource( OSL_ENSURE( bHasOpenValues || nSeqIdx >= nRemaining, "could have created full series" ); if( nSeqIdx < nRemaining ) { - pLabeledSeq[nSeqIdx].set( aData[nSourceIndex] ); + pLabeledSeq[nSeqIdx] = aData[nSourceIndex]; if( aData[nSourceIndex].is()) SetRole( aData[nSourceIndex]->getValues(), "values-last"); ++nSourceIndex; @@ -227,7 +226,7 @@ InterpretedData StockDataInterpreter::interpretDataSource( sal_Int32 nGroupIndex, nReUsedSeriesIdx = 0; for( nGroupIndex=0; nGroupIndex<nNumberOfGroups; ++nGroupIndex ) { - const sal_Int32 nNumSeriesData = aSequences[nGroupIndex].getLength(); + const sal_Int32 nNumSeriesData = aSequences[nGroupIndex].size(); pResultSeries[nGroupIndex].realloc( nNumSeriesData ); auto pResultSerie = pResultSeries[nGroupIndex].getArray(); for( sal_Int32 nSeriesIdx = 0; nSeriesIdx < nNumSeriesData; ++nSeriesIdx, ++nReUsedSeriesIdx ) diff --git a/chart2/source/model/template/XYDataInterpreter.cxx b/chart2/source/model/template/XYDataInterpreter.cxx index 090e77b609d5..59ab45451fdb 100644 --- a/chart2/source/model/template/XYDataInterpreter.cxx +++ b/chart2/source/model/template/XYDataInterpreter.cxx @@ -56,8 +56,8 @@ InterpretedData XYDataInterpreter::interpretDataSource( std::vector< rtl::Reference< LabeledDataSequence > > aData = DataInterpreter::getDataSequences(xSource); - Reference< data::XLabeledDataSequence > xValuesX; - vector< Reference< data::XLabeledDataSequence > > aSequencesVec; + rtl::Reference< LabeledDataSequence > xValuesX; + vector< rtl::Reference< LabeledDataSequence > > aSequencesVec; rtl::Reference< LabeledDataSequence > xCategories; bool bHasCategories = HasCategories( aArguments, aData ); @@ -83,7 +83,7 @@ InterpretedData XYDataInterpreter::interpretDataSource( } else if( !xValuesX.is() && bSetXValues ) { - xValuesX.set( labelData ); + xValuesX = labelData; if( xValuesX.is()) SetRole( xValuesX->getValues(), "values-x"); } @@ -104,16 +104,15 @@ InterpretedData XYDataInterpreter::interpretDataSource( vector< Reference< XDataSeries > > aSeriesVec; aSeriesVec.reserve( aSequencesVec.size()); - Reference< data::XLabeledDataSequence > xClonedXValues = xValuesX; - Reference< util::XCloneable > xCloneable( xValuesX, uno::UNO_QUERY ); + rtl::Reference< LabeledDataSequence > xClonedXValues = xValuesX; sal_Int32 nSeriesIndex = 0; for (auto const& elem : aSequencesVec) { - vector< Reference< data::XLabeledDataSequence > > aNewData; + vector< rtl::Reference< LabeledDataSequence > > aNewData; - if( nSeriesIndex && xCloneable.is() ) - xClonedXValues.set( xCloneable->createClone(), uno::UNO_QUERY ); + if( nSeriesIndex ) + xClonedXValues = new LabeledDataSequence(*xValuesX); if( xValuesX.is() ) aNewData.push_back( xClonedXValues ); diff --git a/chart2/source/tools/DataSeriesHelper.cxx b/chart2/source/tools/DataSeriesHelper.cxx index 2649238128da..9f449e92d66f 100644 --- a/chart2/source/tools/DataSeriesHelper.cxx +++ b/chart2/source/tools/DataSeriesHelper.cxx @@ -24,6 +24,7 @@ #include <unonames.hxx> #include <Diagram.hxx> #include <BaseCoordinateSystem.hxx> +#include <LabeledDataSequence.hxx> #include <com/sun/star/beans/XPropertySet.hpp> #include <com/sun/star/chart2/DataPointLabel.hpp> @@ -200,6 +201,18 @@ OUString getRole( const uno::Reference< chart2::data::XLabeledDataSequence >& xL return aRet; } +OUString getRole( const rtl::Reference< ::chart::LabeledDataSequence >& xLabeledDataSequence ) +{ + OUString aRet; + if( xLabeledDataSequence.is() ) + { + Reference< beans::XPropertySet > xProp( xLabeledDataSequence->getValues(), uno::UNO_QUERY ); + if( xProp.is() ) + xProp->getPropertyValue( "Role" ) >>= aRet; + } + return aRet; +} + Reference< chart2::data::XLabeledDataSequence > getDataSequenceByRole( const Reference< chart2::data::XDataSource > & xSource, @@ -233,6 +246,17 @@ std::vector< Reference< chart2::data::XLabeledDataSequence > > return aResultVec; } +std::vector< rtl::Reference< LabeledDataSequence > > + getAllDataSequencesByRole( const std::vector< rtl::Reference< LabeledDataSequence > > & aDataSequences, + const OUString& aRole ) +{ + std::vector< rtl::Reference< LabeledDataSequence > > aResultVec; + std::copy_if( aDataSequences.begin(), aDataSequences.end(), + std::back_inserter( aResultVec ), + lcl_MatchesRole(aRole, /*bMatchPrefix*/true) ); + return aResultVec; +} + std::vector<Reference<css::chart2::data::XLabeledDataSequence> > getAllDataSequences( const uno::Sequence<uno::Reference<chart2::XDataSeries> >& aSeries ) { @@ -251,32 +275,30 @@ getAllDataSequences( const uno::Sequence<uno::Reference<chart2::XDataSeries> >& return aSeqVec; } -std::vector<Reference<css::chart2::data::XLabeledDataSequence> > +std::vector<rtl::Reference<::chart::LabeledDataSequence> > getAllDataSequences( const std::vector<rtl::Reference<DataSeries> >& aSeries ) { - std::vector< Reference< chart2::data::XLabeledDataSequence > > aSeqVec; + std::vector< rtl::Reference< LabeledDataSequence > > aSeqVec; for( rtl::Reference<DataSeries> const & dataSeries : aSeries ) { - const Sequence< Reference< chart2::data::XLabeledDataSequence > > aSeq( dataSeries->getDataSequences()); + const std::vector< rtl::Reference< LabeledDataSequence > > & aSeq( dataSeries->getDataSequences2()); aSeqVec.insert( aSeqVec.end(), aSeq.begin(), aSeq.end() ); } return aSeqVec; } -Reference< chart2::data::XDataSource > +rtl::Reference< ::chart::DataSource > getDataSource( const Sequence< Reference< chart2::XDataSeries > > & aSeries ) { - return Reference< chart2::data::XDataSource >( - new DataSource(comphelper::containerToSequence(getAllDataSequences(aSeries)))); + return new DataSource(comphelper::containerToSequence(getAllDataSequences(aSeries))); } -Reference< chart2::data::XDataSource > +rtl::Reference< DataSource > getDataSource( const std::vector< rtl::Reference< DataSeries > > & aSeries ) { - return Reference< chart2::data::XDataSource >( - new DataSource(comphelper::containerToSequence(getAllDataSequences(aSeries)))); + return new DataSource(getAllDataSequences(aSeries)); } namespace diff --git a/chart2/source/tools/DataSource.cxx b/chart2/source/tools/DataSource.cxx index bdcac98ef1e6..d695fb3b4013 100644 --- a/chart2/source/tools/DataSource.cxx +++ b/chart2/source/tools/DataSource.cxx @@ -19,6 +19,8 @@ #include <DataSource.hxx> #include <cppuhelper/supportsservice.hxx> +#include <comphelper/sequence.hxx> +#include <LabeledDataSequence.hxx> namespace com::sun::star::uno { class XComponentContext; } @@ -39,6 +41,12 @@ DataSource::DataSource( m_aDataSeq( rSequences ) {} +DataSource::DataSource( + const std::vector< rtl::Reference< ::chart::LabeledDataSequence > > & rSequences ) +{ + m_aDataSeq = comphelper::containerToSequence< Reference< chart2::data::XLabeledDataSequence > >(rSequences); +} + DataSource::~DataSource() {} diff --git a/chart2/source/tools/DataSourceHelper.cxx b/chart2/source/tools/DataSourceHelper.cxx index 8fb6c8fa7ed8..fa0b4ebfcf1a 100644 --- a/chart2/source/tools/DataSourceHelper.cxx +++ b/chart2/source/tools/DataSourceHelper.cxx @@ -291,22 +291,21 @@ uno::Reference< chart2::data::XDataSource > DataSourceHelper::getUsedData( uno::Reference< chart2::data::XDataSource > DataSourceHelper::getUsedData( ChartModel& rModel ) { - std::vector< uno::Reference< chart2::data::XLabeledDataSequence > > aResult; + std::vector< rtl::Reference< LabeledDataSequence > > aResult; rtl::Reference< Diagram > xDiagram = rModel.getFirstChartDiagram(); - uno::Reference< data::XLabeledDataSequence > xCategories( DiagramHelper::getCategoriesFromDiagram( xDiagram ) ); + rtl::Reference< LabeledDataSequence > xCategories( DiagramHelper::getCategoriesFromDiagram( xDiagram ) ); if( xCategories.is() ) aResult.push_back( xCategories ); std::vector< rtl::Reference< DataSeries > > aSeriesVector = ChartModelHelper::getDataSeries( &rModel ); for (auto const& series : aSeriesVector) { - const uno::Sequence< uno::Reference< data::XLabeledDataSequence > > aDataSequences( series->getDataSequences() ); + const std::vector< rtl::Reference< LabeledDataSequence > > & aDataSequences( series->getDataSequences2() ); aResult.insert( aResult.end(), aDataSequences.begin(), aDataSequences.end() ); } - return uno::Reference< chart2::data::XDataSource >( - new DataSource( comphelper::containerToSequence( aResult ))); + return new DataSource( aResult ); } bool DataSourceHelper::detectRangeSegmentation( diff --git a/chart2/source/tools/InternalDataProvider.cxx b/chart2/source/tools/InternalDataProvider.cxx index 13f9bca3786c..7bcdc0cf8785 100644 --- a/chart2/source/tools/InternalDataProvider.cxx +++ b/chart2/source/tools/InternalDataProvider.cxx @@ -117,10 +117,9 @@ struct lcl_internalizeSeries {} void operator() ( const rtl::Reference< DataSeries > & xSeries ) { - Sequence< Reference< chart2::data::XLabeledDataSequence > > aOldSeriesData = xSeries->getDataSequences(); - Sequence< Reference< chart2::data::XLabeledDataSequence > > aNewSeriesData( aOldSeriesData.getLength() ); - auto aNewSeriesDataRange = asNonConstRange(aNewSeriesData); - for( sal_Int32 i=0; i<aOldSeriesData.getLength(); ++i ) + const std::vector< rtl::Reference< LabeledDataSequence > > & aOldSeriesData = xSeries->getDataSequences2(); + std::vector< rtl::Reference< LabeledDataSequence > > aNewSeriesData( aOldSeriesData.size() ); + for( sal_Int32 i=0; i<static_cast<sal_Int32>(aOldSeriesData.size()); ++i ) { sal_Int32 nNewIndex( m_bDataInColumns ? m_rInternalData.appendColumn() : m_rInternalData.appendRow() ); OUString aIdentifier( OUString::number( nNewIndex )); @@ -158,13 +157,13 @@ struct lcl_internalizeSeries comphelper::copyProperties( Reference< beans::XPropertySet >( xLabel, uno::UNO_QUERY ), Reference< beans::XPropertySet >( xNewLabel, uno::UNO_QUERY )); - aNewSeriesDataRange[i].set( new LabeledDataSequence( xNewValues, xNewLabel ) ); + aNewSeriesData[i].set( new LabeledDataSequence( xNewValues, xNewLabel ) ); } } else { if( m_bConnectToModel ) - aNewSeriesDataRange[i].set( new LabeledDataSequence( xNewValues ) ); + aNewSeriesData[i].set( new LabeledDataSequence( xNewValues ) ); } } if( m_bConnectToModel ) diff --git a/chart2/source/tools/LabeledDataSequence.cxx b/chart2/source/tools/LabeledDataSequence.cxx index 93680f4bbace..c0dafceb79fc 100644 --- a/chart2/source/tools/LabeledDataSequence.cxx +++ b/chart2/source/tools/LabeledDataSequence.cxx @@ -55,6 +55,28 @@ LabeledDataSequence::LabeledDataSequence( ModifyListenerHelper::addListener( m_xLabel, m_xModifyEventForwarder ); } +LabeledDataSequence::LabeledDataSequence( const LabeledDataSequence& rSource ) : + impl::LabeledDataSequence_Base(), + m_xModifyEventForwarder( new ModifyEventForwarder() ) +{ + uno::Reference< chart2::data::XDataSequence > xNewValues( rSource.m_xData ); + uno::Reference< chart2::data::XDataSequence > xNewLabel( rSource.m_xLabel ); + + uno::Reference< util::XCloneable > xLabelCloneable( rSource.m_xLabel, uno::UNO_QUERY ); + if( xLabelCloneable.is()) + xNewLabel.set( xLabelCloneable->createClone(), uno::UNO_QUERY ); + + uno::Reference< util::XCloneable > xValuesCloneable( rSource.m_xData, uno::UNO_QUERY ); + if( xValuesCloneable.is()) + xNewValues.set( xValuesCloneable->createClone(), uno::UNO_QUERY ); + + m_xData = xNewValues; + m_xLabel = xNewLabel; + + ModifyListenerHelper::addListener( m_xData, m_xModifyEventForwarder ); + ModifyListenerHelper::addListener( m_xLabel, m_xModifyEventForwarder ); +} + LabeledDataSequence::~LabeledDataSequence() { if( m_xModifyEventForwarder.is()) diff --git a/chart2/source/tools/RangeHighlighter.cxx b/chart2/source/tools/RangeHighlighter.cxx index 2f8db4b588b7..06d46efee17a 100644 --- a/chart2/source/tools/RangeHighlighter.cxx +++ b/chart2/source/tools/RangeHighlighter.cxx @@ -26,6 +26,7 @@ #include <DataSeries.hxx> #include <DataSeriesHelper.hxx> #include <Diagram.hxx> +#include <LabeledDataSequence.hxx> #include <com/sun/star/chart2/ScaleData.hpp> #include <com/sun/star/chart2/XAxis.hpp> @@ -271,8 +272,8 @@ void RangeHighlighter::fillRangesForDataPoint( const rtl::Reference< DataSeries Color nPreferredColor = defaultPreferredColor; std::vector< chart2::data::HighlightedRange > aHilightedRanges; - const Sequence< Reference< chart2::data::XLabeledDataSequence > > aLSeqSeq( xDataSeries->getDataSequences()); - for( Reference< chart2::data::XLabeledDataSequence > const & labelDataSeq : aLSeqSeq ) + const std::vector< rtl::Reference< LabeledDataSequence > > & aLSeqSeq( xDataSeries->getDataSequences2()); + for( rtl::Reference< LabeledDataSequence > const & labelDataSeq : aLSeqSeq ) { Reference< chart2::data::XDataSequence > xLabel( labelDataSeq->getLabel()); Reference< chart2::data::XDataSequence > xValues( labelDataSeq->getValues()); diff --git a/chart2/source/view/main/VDataSeries.cxx b/chart2/source/view/main/VDataSeries.cxx index 1f29f8802b82..33a73927a1e2 100644 --- a/chart2/source/view/main/VDataSeries.cxx +++ b/chart2/source/view/main/VDataSeries.cxx @@ -28,6 +28,7 @@ #include <ChartTypeHelper.hxx> #include <RegressionCurveHelper.hxx> #include <unonames.hxx> +#include <LabeledDataSequence.hxx> #include <com/sun/star/chart/MissingValueTreatment.hpp> #include <com/sun/star/chart2/DataPointLabel.hpp> @@ -163,14 +164,11 @@ VDataSeries::VDataSeries( const rtl::Reference< DataSeries >& xDataSeries ) { m_xDataSeriesProps = m_xDataSeries; - uno::Sequence< uno::Reference< - chart2::data::XLabeledDataSequence > > aDataSequences = - m_xDataSeries->getDataSequences(); + const std::vector< rtl::Reference< LabeledDataSequence > > & aDataSequences = + m_xDataSeries->getDataSequences2(); - for(sal_Int32 nN = aDataSequences.getLength();nN--;) + for(sal_Int32 nN = aDataSequences.size();nN--;) { - if(!aDataSequences[nN].is()) - continue; uno::Reference<data::XDataSequence> xDataSequence( aDataSequences[nN]->getValues()); uno::Reference<beans::XPropertySet> xProp(xDataSequence, uno::UNO_QUERY ); if( xProp.is())