chart2/qa/extras/chart2import.cxx | 30 ++- chart2/source/inc/InternalDataProvider.hxx | 8 chart2/source/tools/InternalDataProvider.cxx | 200 ++++++++++++++------- dbaccess/source/core/inc/DatabaseDataProvider.hxx | 6 dbaccess/source/core/misc/DatabaseDataProvider.cxx | 8 include/oox/drawingml/chart/chartconverter.hxx | 8 offapi/com/sun/star/chart2/data/XDataProvider.idl | 3 oox/source/drawingml/chart/chartconverter.cxx | 6 oox/source/drawingml/chart/datasourceconverter.cxx | 4 oox/source/drawingml/chart/seriesconverter.cxx | 6 sc/inc/chart2uno.hxx | 4 sc/source/filter/inc/excelchartconverter.hxx | 8 sc/source/filter/oox/excelchartconverter.cxx | 3 sc/source/ui/unoobj/chart2uno.cxx | 8 sw/inc/unochart.hxx | 5 sw/source/core/unocore/unochart.cxx | 8 16 files changed, 235 insertions(+), 80 deletions(-)
New commits: commit 6c4e21a234f12e1310ba06f9859e08b424acf8bf Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Wed Jul 2 09:53:54 2014 -0400 bnc#812796: Correctly handle static value array for OOXML charts. We need to pass the role of the data sequence in order to avoid unreliable guess work when importing static value array. Also, not all Excel's scatter plots have real numeric X values; some have textural X values in which case Excel switch to generating 1, 2, 3, ... as X values. When importing to our chart implementation, using "categories" role in such cases instead of "values-x" results in a more faithful chart rendering. Change-Id: If4bc1f650bb024dcd1b1b36537f457fb38404a78 diff --git a/chart2/source/inc/InternalDataProvider.hxx b/chart2/source/inc/InternalDataProvider.hxx index 526ca2d..459ffb8 100644 --- a/chart2/source/inc/InternalDataProvider.hxx +++ b/chart2/source/inc/InternalDataProvider.hxx @@ -134,6 +134,11 @@ public: const OUString& aRangeRepresentation ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE; + + virtual css::uno::Reference<css::chart2::data::XDataSequence> SAL_CALL + createDataSequenceByValueArray( const OUString& aRole, const OUString& aRangeRepresentation ) + throw (css::lang::IllegalArgumentException, css::uno::RuntimeException, std::exception) SAL_OVERRIDE; + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XRangeSelection > SAL_CALL getRangeSelection() throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE; @@ -230,6 +235,9 @@ private: ::com::sun::star::chart2::data::XDataSequence > createDataSequenceAndAddToMap( const OUString & rRangeRepresentation ); + css::uno::Reference<css::chart2::data::XDataSequence> + createDataSequenceFromArray( const OUString& rArrayStr, const OUString& rRole ); + void deleteMapReferences( const OUString & rRangeRepresentation ); void adaptMapReferences( diff --git a/chart2/source/tools/InternalDataProvider.cxx b/chart2/source/tools/InternalDataProvider.cxx index 20886fa..ee2dcfe 100644 --- a/chart2/source/tools/InternalDataProvider.cxx +++ b/chart2/source/tools/InternalDataProvider.cxx @@ -491,79 +491,155 @@ void InternalDataProvider::decreaseMapReferences( Reference< chart2::data::XDataSequence > InternalDataProvider::createDataSequenceAndAddToMap( const OUString & rRangeRepresentation ) { - OUString aRangeRepresentation = rRangeRepresentation; - if( aRangeRepresentation.indexOf('{') >= 0 ) - { - ::std::vector< double > aNewData; - ::std::vector< uno::Any > aNewLabels; - OUString aToken; - sal_Int32 nCategories = 0; - sal_Int32 nIndex = 0; - bool bValues = true; - bool bLabelSet = false; - OUString str = aRangeRepresentation.replace('{',' ').replace('}',' '); - - m_aInternalData.clearDefaultData(); - sal_Int32 n = m_aInternalData.getColumnCount(); - if( n ) - n = n - 1; - - do + Reference<chart2::data::XDataSequence> xSeq = createDataSequenceFromArray(rRangeRepresentation, OUString()); + if (xSeq.is()) + return xSeq; + + xSeq.set(new UncachedDataSequence(this, rRangeRepresentation)); + addDataSequenceToMap(rRangeRepresentation, xSeq); + return xSeq; +} + +uno::Reference<chart2::data::XDataSequence> +InternalDataProvider::createDataSequenceFromArray( const OUString& rArrayStr, const OUString& rRole ) +{ + if (rArrayStr.indexOf('{') != 0 || rArrayStr[rArrayStr.getLength()-1] != '}') + { + // Not an array string. + return uno::Reference<chart2::data::XDataSequence>(); + } + + bool bAllNumeric = true; + uno::Reference<chart2::data::XDataSequence> xSeq; + + const sal_Unicode* p = rArrayStr.getStr(); + const sal_Unicode* pEnd = p + rArrayStr.getLength(); + const sal_Unicode* pElem = NULL; + OUString aElem; + + std::vector<OUString> aRawElems; + ++p; // Skip the first '{'. + --pEnd; // Skip the last '}'. + bool bInQuote = false; + for (; p != pEnd; ++p) + { + if (*p == '"') { - // TODO: This will be problematic if ';' is used in label names - // '"' character also needs to be considered in such cases - aToken = str.getToken(0,';',nIndex); - if( aToken.isEmpty() ) - break; - if( aToken.indexOf('"') < 0 ) + bInQuote = !bInQuote; + if (bInQuote) { - aNewData.push_back( aToken.toDouble() ); + // Opening quote. + bAllNumeric = false; + ++p; + if (p == pEnd) + break; + pElem = p; } else { - aNewLabels.push_back( uno::makeAny(aToken.replace('"', ' ').trim()) ); - if( !nCategories && - ( !m_aInternalData.getComplexColumnLabel(n).size() || - !m_aInternalData.getComplexColumnLabel(n).front().hasValue() ) ) - { - m_aInternalData.setComplexColumnLabel( n, aNewLabels ); - bLabelSet = true; - } - else - { - m_aInternalData.setComplexRowLabel(nCategories, aNewLabels); - if(nCategories==1 && bLabelSet) - { - ::std::vector< uno::Any > aLabels; - m_aInternalData.setComplexRowLabel( 0, m_aInternalData.getComplexColumnLabel( n ) ); - m_aInternalData.setComplexColumnLabel( n, aLabels ); - } - } - aNewLabels.pop_back(); - nCategories++; - bValues = false; + // Closing quote. + if (pElem) + aElem = OUString(pElem, p-pElem); + aRawElems.push_back(aElem); + pElem = NULL; + aElem = OUString(); + + ++p; // Skip '"'. + if (p == pEnd) + break; } - } while( nIndex >= 0 ); - - if( bValues ) + } + else if (bInQuote) + { + // Do nothing. + } + else if (*p == ';') { - m_aInternalData.insertColumn( n ); - m_aInternalData.setColumnValues( n, aNewData ); - aRangeRepresentation = OUString::number( n ); + // element separator. + if (pElem) + aElem = OUString(pElem, p-pElem); + aRawElems.push_back(aElem); + pElem = NULL; + aElem = OUString(); } - else if( nCategories > 1 ) + else if (!pElem) + pElem = p; + } + + if (pElem) + { + aElem = OUString(pElem, p-pElem); + aRawElems.push_back(aElem); + } + + if (rRole == "values-y" || rRole == "values-first" || rRole == "values-last" || + rRole == "values-min" || rRole == "values-max") + { + // Column values. Append a new data column and populate it. + + std::vector<double> aValues; + aValues.reserve(aRawElems.size()); + for (size_t i = 0; i < aRawElems.size(); ++i) + aValues.push_back(aRawElems[i].toDouble()); + sal_Int32 n = m_aInternalData.appendColumn(); + + m_aInternalData.setColumnValues(n, aValues); + + OUString aRangeRep = OUString::number(n); + xSeq.set(new UncachedDataSequence(this, aRangeRep)); + addDataSequenceToMap(aRangeRep, xSeq); + } + else if (rRole == "values-x") + { + std::vector<double> aValues; + aValues.reserve(aRawElems.size()); + if (bAllNumeric) { - aRangeRepresentation = lcl_aCategoriesRangeName; + for (size_t i = 0; i < aRawElems.size(); ++i) + aValues.push_back(aRawElems[i].toDouble()); } else { - aRangeRepresentation = lcl_aLabelRangePrefix+OUString::number( n ); + for (size_t i = 0; i < aRawElems.size(); ++i) + aValues.push_back(i+1); + } + + sal_Int32 n = m_aInternalData.appendColumn(); + m_aInternalData.setColumnValues(n, aValues); + + OUString aRangeRep = OUString::number(n); + xSeq.set(new UncachedDataSequence(this, aRangeRep)); + addDataSequenceToMap(aRangeRep, xSeq); + } + else if (rRole == "categories") + { + // Category labels. + + for (size_t i = 0; i < aRawElems.size(); ++i) + { + std::vector<uno::Any> aLabels(1, uno::makeAny(aRawElems[i])); + m_aInternalData.setComplexRowLabel(i, aLabels); + } + + xSeq.set(new UncachedDataSequence(this, lcl_aCategoriesRangeName)); + addDataSequenceToMap(lcl_aCategoriesRangeName, xSeq); + } + else if (rRole == "label") + { + // Data series label. There should be only one element. This always + // goes to the last data column. + sal_Int32 nColSize = m_aInternalData.getColumnCount(); + if (!aRawElems.empty() && nColSize) + { + std::vector<uno::Any> aLabels(1, uno::makeAny(aRawElems[0])); + m_aInternalData.setComplexColumnLabel(nColSize-1, aLabels); + + OUString aRangeRep = lcl_aLabelRangePrefix + OUString::number(nColSize-1); + xSeq.set(new UncachedDataSequence(this, aRangeRep)); + addDataSequenceToMap(aRangeRep, xSeq); } } - Reference< chart2::data::XDataSequence > xSeq( - new UncachedDataSequence( this, aRangeRepresentation )); - addDataSequenceToMap( aRangeRepresentation, xSeq ); return xSeq; } @@ -764,6 +840,14 @@ Reference< chart2::data::XDataSequence > SAL_CALL InternalDataProvider::createDa return Reference< chart2::data::XDataSequence >(); } +Reference<chart2::data::XDataSequence> SAL_CALL +InternalDataProvider::createDataSequenceByValueArray( + const OUString& aRole, const OUString& aRangeRepresentation ) + throw (lang::IllegalArgumentException, uno::RuntimeException, std::exception) +{ + return createDataSequenceFromArray(aRangeRepresentation, aRole); +} + Reference< sheet::XRangeSelection > SAL_CALL InternalDataProvider::getRangeSelection() throw (uno::RuntimeException, std::exception) { diff --git a/dbaccess/source/core/inc/DatabaseDataProvider.hxx b/dbaccess/source/core/inc/DatabaseDataProvider.hxx index 20c954e..665cebe 100644 --- a/dbaccess/source/core/inc/DatabaseDataProvider.hxx +++ b/dbaccess/source/core/inc/DatabaseDataProvider.hxx @@ -81,6 +81,12 @@ private: virtual ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > SAL_CALL detectArguments(const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XDataSource > & xDataSource) throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE; virtual sal_Bool SAL_CALL createDataSequenceByRangeRepresentationPossible(const OUString & aRangeRepresentation) throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE; virtual ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XDataSequence > SAL_CALL createDataSequenceByRangeRepresentation(const OUString & aRangeRepresentation) throw (::com::sun::star::uno::RuntimeException, ::com::sun::star::lang::IllegalArgumentException, std::exception) SAL_OVERRIDE; + + virtual css::uno::Reference<css::chart2::data::XDataSequence> SAL_CALL + createDataSequenceByValueArray( + const OUString& aRole, const OUString & aRangeRepresentation) + throw (css::uno::RuntimeException, css::lang::IllegalArgumentException, std::exception) SAL_OVERRIDE; + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XRangeSelection > SAL_CALL getRangeSelection() throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE; // ::com::sun::star::chart2::data::XRangeXMLConversion: diff --git a/dbaccess/source/core/misc/DatabaseDataProvider.cxx b/dbaccess/source/core/misc/DatabaseDataProvider.cxx index 11d08cf..19e800c 100644 --- a/dbaccess/source/core/misc/DatabaseDataProvider.cxx +++ b/dbaccess/source/core/misc/DatabaseDataProvider.cxx @@ -301,6 +301,14 @@ uno::Reference< chart2::data::XDataSequence > SAL_CALL DatabaseDataProvider::cre return xData; } +uno::Reference<chart2::data::XDataSequence> +SAL_CALL DatabaseDataProvider::createDataSequenceByValueArray( + const OUString& /*aRole*/, const OUString& /*aRangeRepresentation*/ ) + throw (uno::RuntimeException, lang::IllegalArgumentException, std::exception) +{ + return uno::Reference<chart2::data::XDataSequence>(); +} + uno::Sequence< uno::Sequence< OUString > > SAL_CALL DatabaseDataProvider::getComplexRowDescriptions() throw (uno::RuntimeException, std::exception) { return m_xComplexDescriptionAccess->getComplexRowDescriptions(); diff --git a/include/oox/drawingml/chart/chartconverter.hxx b/include/oox/drawingml/chart/chartconverter.hxx index 4807655..bbfe0ed 100644 --- a/include/oox/drawingml/chart/chartconverter.hxx +++ b/include/oox/drawingml/chart/chartconverter.hxx @@ -83,10 +83,10 @@ public: /** Creates a data sequence from a formula. Dummy implementation. Derived classes have to override this function to actually parse the formula. */ - virtual ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XDataSequence > - createDataSequence( - const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XDataProvider >& rxDataProvider, - const DataSequenceModel& rDataSeq ); + virtual css::uno::Reference<css::chart2::data::XDataSequence> + createDataSequence( + const css::uno::Reference<css::chart2::data::XDataProvider>& rxDataProvider, + const DataSequenceModel& rDataSeq, const OUString& rRole ); private: ChartConverter( const ChartConverter& ); diff --git a/offapi/com/sun/star/chart2/data/XDataProvider.idl b/offapi/com/sun/star/chart2/data/XDataProvider.idl index 3ed73e2..6ab3fd4 100644 --- a/offapi/com/sun/star/chart2/data/XDataProvider.idl +++ b/offapi/com/sun/star/chart2/data/XDataProvider.idl @@ -126,6 +126,9 @@ interface XDataProvider : ::com::sun::star::uno::XInterface [in] string aRangeRepresentation ) raises( com::sun::star::lang::IllegalArgumentException ); + XDataSequence createDataSequenceByValueArray( [in] string aRole, [in] string aValueArray ) + raises( com::sun::star::lang::IllegalArgumentException ); + /** Returns a component that is able to change a given range representation to another one. This usually is a controller-component that uses the GUI to allow a user to diff --git a/oox/source/drawingml/chart/chartconverter.cxx b/oox/source/drawingml/chart/chartconverter.cxx index 2d198f0..bfa9d5c 100644 --- a/oox/source/drawingml/chart/chartconverter.cxx +++ b/oox/source/drawingml/chart/chartconverter.cxx @@ -114,7 +114,9 @@ void ChartConverter::createDataProvider( const Reference< XChartDocument >& rxCh } } -Reference< XDataSequence > ChartConverter::createDataSequence( const Reference< XDataProvider >& rxDataProvider, const DataSequenceModel& rDataSeq ) +Reference< XDataSequence > ChartConverter::createDataSequence( + const Reference< XDataProvider >& rxDataProvider, const DataSequenceModel& rDataSeq, + const OUString& rRole ) { Reference< XDataSequence > xDataSeq; if( rxDataProvider.is() ) @@ -134,7 +136,7 @@ Reference< XDataSequence > ChartConverter::createDataSequence( const Reference< if( !aRangeRep.isEmpty() ) try { // create the data sequence - xDataSeq = rxDataProvider->createDataSequenceByRangeRepresentation( aRangeRep ); + xDataSeq = rxDataProvider->createDataSequenceByValueArray(rRole, aRangeRep); return xDataSeq; } catch( Exception& ) diff --git a/oox/source/drawingml/chart/datasourceconverter.cxx b/oox/source/drawingml/chart/datasourceconverter.cxx index 96a2038..8b1725f 100644 --- a/oox/source/drawingml/chart/datasourceconverter.cxx +++ b/oox/source/drawingml/chart/datasourceconverter.cxx @@ -74,9 +74,9 @@ Reference< XDataSequence > DataSequenceConverter::createDataSequence( const OUSt mrModel.maData.insert(std::make_pair<sal_Int32, Any>(1, Any(aTitle.makeStringAndClear()))); } } - xDataSeq = getChartConverter()->createDataSequence( getChartDocument()->getDataProvider(), mrModel ); + xDataSeq = getChartConverter()->createDataSequence(getChartDocument()->getDataProvider(), mrModel, rRole); - // set sequen ce role + // set sequence role PropertySet aSeqProp( xDataSeq ); aSeqProp.setProperty( PROP_Role, rRole ); } diff --git a/oox/source/drawingml/chart/seriesconverter.cxx b/oox/source/drawingml/chart/seriesconverter.cxx index 9f6737d..2389967 100644 --- a/oox/source/drawingml/chart/seriesconverter.cxx +++ b/oox/source/drawingml/chart/seriesconverter.cxx @@ -513,7 +513,7 @@ SeriesConverter::~SeriesConverter() Reference< XLabeledDataSequence > SeriesConverter::createCategorySequence( const OUString& rRole ) { - return createLabeledDataSequence( SeriesModel::CATEGORIES, rRole, false ); + return createLabeledDataSequence(SeriesModel::CATEGORIES, rRole, false); } Reference< XLabeledDataSequence > SeriesConverter::createValueSequence( const OUString& rRole ) diff --git a/sc/inc/chart2uno.hxx b/sc/inc/chart2uno.hxx index cb386f3..ab0b7ba 100644 --- a/sc/inc/chart2uno.hxx +++ b/sc/inc/chart2uno.hxx @@ -97,6 +97,10 @@ public: const OUString& aRangeRepresentation ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE; + virtual css::uno::Reference<css::chart2::data::XDataSequence> SAL_CALL + createDataSequenceByValueArray( const OUString& aRole, const OUString& aRangeRepresentation ) + throw (css::lang::IllegalArgumentException, css::uno::RuntimeException, std::exception) SAL_OVERRIDE; + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XRangeSelection > SAL_CALL getRangeSelection() throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE; diff --git a/sc/source/filter/inc/excelchartconverter.hxx b/sc/source/filter/inc/excelchartconverter.hxx index 383c1d5..c4afd77 100644 --- a/sc/source/filter/inc/excelchartconverter.hxx +++ b/sc/source/filter/inc/excelchartconverter.hxx @@ -37,10 +37,10 @@ public: const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XChartDocument >& rxChartDoc ) SAL_OVERRIDE; /** Creates a data sequence from the passed formula. */ - virtual ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XDataSequence > - createDataSequence( - const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XDataProvider >& rxDataProvider, - const ::oox::drawingml::chart::DataSequenceModel& rDataSeq ) SAL_OVERRIDE; + virtual css::uno::Reference<css::chart2::data::XDataSequence> + createDataSequence( + const css::uno::Reference<css::chart2::data::XDataProvider>& rxDataProvider, + const oox::drawingml::chart::DataSequenceModel& rDataSeq, const OUString& rRole ) SAL_OVERRIDE; }; } // namespace xls diff --git a/sc/source/filter/oox/excelchartconverter.cxx b/sc/source/filter/oox/excelchartconverter.cxx index fe22934..24fe4a2 100644 --- a/sc/source/filter/oox/excelchartconverter.cxx +++ b/sc/source/filter/oox/excelchartconverter.cxx @@ -64,7 +64,8 @@ void ExcelChartConverter::createDataProvider( const Reference< XChartDocument >& } Reference< XDataSequence > ExcelChartConverter::createDataSequence( - const Reference< XDataProvider >& rxDataProvider, const DataSequenceModel& rDataSeq ) + const Reference< XDataProvider >& rxDataProvider, const DataSequenceModel& rDataSeq, + const OUString& /*rRole*/ ) { Reference< XDataSequence > xDataSeq; if (!rxDataProvider.is()) diff --git a/sc/source/ui/unoobj/chart2uno.cxx b/sc/source/ui/unoobj/chart2uno.cxx index 41a1819..55d4c54 100644 --- a/sc/source/ui/unoobj/chart2uno.cxx +++ b/sc/source/ui/unoobj/chart2uno.cxx @@ -2098,6 +2098,14 @@ uno::Reference< chart2::data::XDataSequence > SAL_CALL return xResult; } +uno::Reference<chart2::data::XDataSequence> SAL_CALL +ScChart2DataProvider::createDataSequenceByValueArray( + const OUString& /*aRole*/, const OUString& /*aRangeRepresentation*/ ) + throw (css::lang::IllegalArgumentException, css::uno::RuntimeException, std::exception) +{ + return uno::Reference<chart2::data::XDataSequence>(); +} + uno::Reference< sheet::XRangeSelection > SAL_CALL ScChart2DataProvider::getRangeSelection() throw (uno::RuntimeException, std::exception) { diff --git a/sw/inc/unochart.hxx b/sw/inc/unochart.hxx index be1a674..a368955 100644 --- a/sw/inc/unochart.hxx +++ b/sw/inc/unochart.hxx @@ -172,6 +172,11 @@ public: virtual ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XDataSequence > SAL_CALL createDataSequenceByRangeRepresentation( const OUString& aRangeRepresentation ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE; virtual ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XRangeSelection > SAL_CALL getRangeSelection( ) throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE; + virtual css::uno::Reference<css::chart2::data::XDataSequence> + SAL_CALL createDataSequenceByValueArray( + const OUString& aRole, const OUString& aRangeRepresentation ) + throw (css::lang::IllegalArgumentException, css::uno::RuntimeException, std::exception) SAL_OVERRIDE; + // XRangeXMLConversion virtual OUString SAL_CALL convertRangeToXML( const OUString& aRangeRepresentation ) throw (::com::sun::star::lang::IllegalArgumentException, diff --git a/sw/source/core/unocore/unochart.cxx b/sw/source/core/unocore/unochart.cxx index af47cb7..0a34baf 100644 --- a/sw/source/core/unocore/unochart.cxx +++ b/sw/source/core/unocore/unochart.cxx @@ -1432,6 +1432,14 @@ uno::Reference< sheet::XRangeSelection > SAL_CALL SwChartDataProvider::getRangeS return uno::Reference< sheet::XRangeSelection >(); } +uno::Reference<css::chart2::data::XDataSequence> SAL_CALL + SwChartDataProvider::createDataSequenceByValueArray( + const OUString& /*aRole*/, const OUString& /*aRangeRepresentation*/ ) + throw (lang::IllegalArgumentException, uno::RuntimeException, std::exception) +{ + return uno::Reference<css::chart2::data::XDataSequence>(); +} + void SAL_CALL SwChartDataProvider::dispose( ) throw (uno::RuntimeException, std::exception) { commit 5e2b7e37a29edf45f829ccee2302a942b54568a1 Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Tue Jul 1 15:10:19 2014 -0400 bnc#812796: Don't create data series when the series has no values. Change-Id: I92e2d7a3fab0948aea0557cf3cb65d57d48f3f59 diff --git a/oox/source/drawingml/chart/seriesconverter.cxx b/oox/source/drawingml/chart/seriesconverter.cxx index 7c1a085..9f6737d 100644 --- a/oox/source/drawingml/chart/seriesconverter.cxx +++ b/oox/source/drawingml/chart/seriesconverter.cxx @@ -544,6 +544,10 @@ Reference< XDataSeries > SeriesConverter::createDataSeries( const TypeGroupConve Reference< XDataSequence > xValues = xYValueSeq->getValues(); if( xValues.is() ) nDataPointCount = xValues->getData().getLength(); + + if (!nDataPointCount) + // No values present. Don't create a data series. + return Reference<XDataSeries>(); } // add X values of scatter and bubble charts if( !rTypeInfo.mbCategoryAxis ) commit bdad8d9051c207b2eff0d5a7842da83e6119a600 Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Wed Jul 2 11:19:05 2014 -0400 More fine-grained check of data series labels in the unit test. Change-Id: I6b23126816bb114407f2b75545094bc297ee7cc3 diff --git a/chart2/qa/extras/chart2import.cxx b/chart2/qa/extras/chart2import.cxx index 16a0f03..b7c1e78 100644 --- a/chart2/qa/extras/chart2import.cxx +++ b/chart2/qa/extras/chart2import.cxx @@ -280,10 +280,17 @@ void Chart2ImportTest::testDOCChartSeries() void Chart2ImportTest::testDOCXChartSeries() { load("/chart2/qa/extras/data/docx/", "chart.docx"); - uno::Sequence< OUString > seriesList = getWriterChartColumnDescriptions(mxComponent); - CPPUNIT_ASSERT_EQUAL(OUString("Series 1"), seriesList[0]); - CPPUNIT_ASSERT_EQUAL(OUString("Series 2"), seriesList[1]); - CPPUNIT_ASSERT_EQUAL(OUString("Series 3"), seriesList[2]); + Reference<chart2::XChartDocument> xChartDoc(getChartDocFromWriter(0), uno::UNO_QUERY); + CPPUNIT_ASSERT(xChartDoc.is()); + + Reference<chart2::XChartType> xCT = getChartTypeFromDoc(xChartDoc, 0, 0); + CPPUNIT_ASSERT(xCT.is()); + + std::vector<uno::Sequence<uno::Any> > aLabels = getDataSeriesLabelsFromChartType(xCT); + CPPUNIT_ASSERT_EQUAL(size_t(3), aLabels.size()); + CPPUNIT_ASSERT_EQUAL(OUString("Series 1"), aLabels[0][0].get<OUString>()); + CPPUNIT_ASSERT_EQUAL(OUString("Series 2"), aLabels[1][0].get<OUString>()); + CPPUNIT_ASSERT_EQUAL(OUString("Series 3"), aLabels[2][0].get<OUString>()); } void Chart2ImportTest::testPPTChartSeries() @@ -300,11 +307,18 @@ void Chart2ImportTest::testPPTChartSeries() void Chart2ImportTest::testPPTXChartSeries() { //test chart series names for pptx - uno::Sequence < OUString > seriesList = getImpressChartColumnDescriptions("/chart2/qa/extras/data/pptx/", "chart.pptx"); - CPPUNIT_ASSERT_EQUAL(OUString("Column 1"), seriesList[1]); - CPPUNIT_ASSERT_EQUAL(OUString("Column 2"), seriesList[2]); - CPPUNIT_ASSERT_EQUAL(OUString("Column 3"), seriesList[3]); + load("/chart2/qa/extras/data/pptx/", "chart.pptx"); + Reference<chart2::XChartDocument> xChartDoc(getChartDocFromDrawImpress(0, 0), uno::UNO_QUERY); + CPPUNIT_ASSERT(xChartDoc.is()); + + Reference<chart2::XChartType> xCT = getChartTypeFromDoc(xChartDoc, 0, 0); + CPPUNIT_ASSERT(xCT.is()); + std::vector<uno::Sequence<uno::Any> > aLabels = getDataSeriesLabelsFromChartType(xCT); + CPPUNIT_ASSERT_EQUAL(size_t(3), aLabels.size()); + CPPUNIT_ASSERT_EQUAL(OUString("Column 1"), aLabels[0][0].get<OUString>()); + CPPUNIT_ASSERT_EQUAL(OUString("Column 2"), aLabels[1][0].get<OUString>()); + CPPUNIT_ASSERT_EQUAL(OUString("Column 3"), aLabels[2][0].get<OUString>()); } void Chart2ImportTest::testODPChartSeries() _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits