diff options
Diffstat (limited to 'xmloff/source/chart/SchXMLExport.cxx')
-rw-r--r-- | xmloff/source/chart/SchXMLExport.cxx | 141 |
1 files changed, 105 insertions, 36 deletions
diff --git a/xmloff/source/chart/SchXMLExport.cxx b/xmloff/source/chart/SchXMLExport.cxx index c74abe953d2f..9e9ea12d40e2 100644 --- a/xmloff/source/chart/SchXMLExport.cxx +++ b/xmloff/source/chart/SchXMLExport.cxx @@ -602,24 +602,20 @@ OUString lcl_flattenStringSequence( const Sequence< OUString > & rSequence ) return aResult.makeStringAndClear(); } -OUString lcl_getLabelString( const Reference< chart2::data::XDataSequence > & xLabelSeq ) +void lcl_getLabelStringSequence( Sequence< OUString >& rOutLabels, const Reference< chart2::data::XDataSequence > & xLabelSeq ) { - Sequence< OUString > aLabels; - uno::Reference< chart2::data::XTextualDataSequence > xTextualDataSequence( xLabelSeq, uno::UNO_QUERY ); if( xTextualDataSequence.is()) { - aLabels = xTextualDataSequence->getTextualData(); + rOutLabels = xTextualDataSequence->getTextualData(); } else if( xLabelSeq.is()) { Sequence< uno::Any > aAnies( xLabelSeq->getData()); - aLabels.realloc( aAnies.getLength()); + rOutLabels.realloc( aAnies.getLength()); for( sal_Int32 i=0; i<aAnies.getLength(); ++i ) - aAnies[i] >>= aLabels[i]; + aAnies[i] >>= rOutLabels[i]; } - - return lcl_flattenStringSequence( aLabels ); } sal_Int32 lcl_getMaxSequenceLength( @@ -639,46 +635,96 @@ sal_Int32 lcl_getMaxSequenceLength( return nResult; } -double lcl_getValueFromSequence( const Reference< chart2::data::XDataSequence > & xSeq, sal_Int32 nIndex ) +uno::Sequence< rtl::OUString > lcl_DataSequenceToStringSequence( + const uno::Reference< chart2::data::XDataSequence >& xDataSequence ) { - double fResult = 0.0; - ::rtl::math::setNan( &fResult ); - Reference< chart2::data::XNumericalDataSequence > xNumSeq( xSeq, uno::UNO_QUERY ); - if( xNumSeq.is()) + uno::Sequence< rtl::OUString > aResult; + if(!xDataSequence.is()) + return aResult; + + uno::Reference< chart2::data::XTextualDataSequence > xTextualDataSequence( xDataSequence, uno::UNO_QUERY ); + if( xTextualDataSequence.is() ) { - Sequence< double > aValues( xNumSeq->getNumericalData()); - if( nIndex < aValues.getLength() ) - fResult = aValues[nIndex]; + aResult = xTextualDataSequence->getTextualData(); } else { - Sequence< uno::Any > aAnies( xSeq->getData()); - if( nIndex < aAnies.getLength() ) - aAnies[nIndex] >>= fResult; + uno::Sequence< uno::Any > aValues = xDataSequence->getData(); + aResult.realloc(aValues.getLength()); + + for(sal_Int32 nN=aValues.getLength();nN--;) + aValues[nN] >>= aResult[nN]; } - return fResult; -} + return aResult; +} ::std::vector< double > lcl_getAllValuesFromSequence( const Reference< chart2::data::XDataSequence > & xSeq ) { double fNan = 0.0; ::rtl::math::setNan( &fNan ); ::std::vector< double > aResult; + if(!xSeq.is()) + return aResult; + uno::Sequence< double > aValuesSequence; Reference< chart2::data::XNumericalDataSequence > xNumSeq( xSeq, uno::UNO_QUERY ); - if( xNumSeq.is()) + if( xNumSeq.is() ) { - Sequence< double > aValues( xNumSeq->getNumericalData()); - ::std::copy( aValues.getConstArray(), aValues.getConstArray() + aValues.getLength(), - ::std::back_inserter( aResult )); + aValuesSequence = xNumSeq->getNumericalData(); } - else if( xSeq.is()) + else { - Sequence< uno::Any > aAnies( xSeq->getData()); - aResult.resize( aAnies.getLength(), fNan ); + Sequence< uno::Any > aAnies( xSeq->getData() ); + aValuesSequence.realloc( aAnies.getLength() ); for( sal_Int32 i=0; i<aAnies.getLength(); ++i ) - aAnies[i] >>= aResult[i]; + aAnies[i] >>= aValuesSequence[i]; + } + + //special handling for x-values (if x-values do point to categories, indices are used instead ) + Reference< beans::XPropertySet > xProp( xSeq, uno::UNO_QUERY ); + if( xProp.is() ) + { + OUString aRole; + xProp->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Role") ) ) >>= aRole; + if( aRole.match( OUString( RTL_CONSTASCII_USTRINGPARAM( "values-x") ) ) ) + { + //lcl_clearIfNoValuesButTextIsContained - replace by indices if the values are not appropriate + bool bHasValue=false; + bool bHasText=false; + sal_Int32 nCount = aValuesSequence.getLength(); + for( sal_Int32 j = 0; j < nCount; ++j ) + { + if( !::rtl::math::isNan( aValuesSequence[j] ) ) + { + bHasValue=true; + break; + } + } + if(!bHasValue) + { + //no double value is countained + //is there any text? + uno::Sequence< rtl::OUString > aStrings( lcl_DataSequenceToStringSequence( xSeq ) ); + sal_Int32 nTextCount = aStrings.getLength(); + for( sal_Int32 j = 0; j < nTextCount; ++j ) + { + if( aStrings[j].getLength() ) + { + bHasText=true; + break; + } + } + } + if( !bHasValue && bHasText ) + { + for( sal_Int32 j = 0; j < nCount; ++j ) + aValuesSequence[j] = j+1; + } + } } + + ::std::copy( aValuesSequence.getConstArray(), aValuesSequence.getConstArray() + aValuesSequence.getLength(), + ::std::back_inserter( aResult )); return aResult; } @@ -803,15 +849,20 @@ lcl_TableData lcl_getDataForLocalTable( Sequence< OUString > aSimpleCategories; if( xAnyDescriptionAccess.is() ) { + //categories if( bSeriesFromColumns ) + { aSimpleCategories = xAnyDescriptionAccess->getRowDescriptions(); + aResult.aComplexRowDescriptions = xAnyDescriptionAccess->getAnyRowDescriptions(); + } else + { aSimpleCategories = xAnyDescriptionAccess->getColumnDescriptions(); - - aResult.aComplexColumnDescriptions = xAnyDescriptionAccess->getAnyColumnDescriptions(); - aResult.aComplexRowDescriptions = xAnyDescriptionAccess->getAnyRowDescriptions(); + aResult.aComplexColumnDescriptions = xAnyDescriptionAccess->getAnyColumnDescriptions(); + } } + //series values and series labels SchXMLExportHelper_Impl::tDataSequenceCont::size_type nNumSequences = aSequencesToExport.size(); SchXMLExportHelper_Impl::tDataSequenceCont::const_iterator aBegin( aSequencesToExport.begin()); SchXMLExportHelper_Impl::tDataSequenceCont::const_iterator aEnd( aSequencesToExport.end()); @@ -856,19 +907,25 @@ lcl_TableData lcl_getDataForLocalTable( // iterate over all sequences size_t nSeqIdx = 0; + Sequence< Sequence< OUString > > aComplexLabels(nNumSequences); for( ; aIt != aEnd; ++aIt, ++nSeqIdx ) { OUString aRange; + Sequence< OUString >& rCurrentComplexLabel = aComplexLabels[nSeqIdx]; if( aIt->first.is()) { - rLabels[nSeqIdx] = lcl_getLabelString( aIt->first ); + lcl_getLabelStringSequence( rCurrentComplexLabel, aIt->first ); + rLabels[nSeqIdx] = lcl_flattenStringSequence( rCurrentComplexLabel ); aRange = aIt->first->getSourceRangeRepresentation(); if( xRangeConversion.is()) aRange = xRangeConversion->convertRangeToXML( aRange ); } else if( aIt->second.is()) - rLabels[nSeqIdx] = lcl_flattenStringSequence( + { + rCurrentComplexLabel.realloc(1); + rLabels[nSeqIdx] = rCurrentComplexLabel[0] = lcl_flattenStringSequence( aIt->second->generateLabel( chart2::data::LabelOrigin_SHORT_SIDE )); + } if( bSeriesFromColumns ) aResult.aColumnDescriptions_Ranges.push_back( aRange ); else @@ -896,6 +953,16 @@ lcl_TableData lcl_getDataForLocalTable( if( !lcl_SequenceHasUnhiddenData(aIt->first) && !lcl_SequenceHasUnhiddenData(aIt->second) ) aResult.aHiddenColumns.push_back(nSeqIdx); } + Sequence< Sequence< Any > >& rComplexAnyLabels = bSeriesFromColumns ? aResult.aComplexColumnDescriptions : aResult.aComplexRowDescriptions;//#i116544# + rComplexAnyLabels.realloc(aComplexLabels.getLength()); + for( sal_Int32 nN=0; nN<aComplexLabels.getLength();nN++ ) + { + Sequence< OUString >& rSource = aComplexLabels[nN]; + Sequence< Any >& rTarget = rComplexAnyLabels[nN]; + rTarget.realloc( rSource.getLength() ); + for( sal_Int32 i=0; i<rSource.getLength(); i++ ) + rTarget[i] = uno::makeAny( rSource[i] ); + } } catch( uno::Exception & rEx ) { @@ -1769,7 +1836,7 @@ void SchXMLExportHelper_Impl::exportTable() for( t2DNumberContainer::const_iterator aRowIt( aData.aDataInRows.begin()) ; aRowIt != aData.aDataInRows.end() - ; aRowIt++, nC++, aRowDescriptionsIter++ ) + ; ++aRowIt, ++nC ) { SvXMLElementExport aRow( mrExport, XML_NAMESPACE_TABLE, XML_TABLE_ROW, sal_True, sal_True ); @@ -1807,8 +1874,10 @@ void SchXMLExportHelper_Impl::exportTable() if( !bHasOwnData && aRowDescriptions_RangeIter != aRowDescriptions_RangeEnd ) { // remind the original range to allow a correct re-association when copying via clipboard - SchXMLTools::exportRangeToSomewhere( mrExport, *aRowDescriptions_RangeIter++ ); + SchXMLTools::exportRangeToSomewhere( mrExport, *aRowDescriptions_RangeIter ); + ++aRowDescriptions_RangeIter; } + ++aRowDescriptionsIter; } } |