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())

Reply via email to