diff options
author | Vladimir Glazounov <vg@openoffice.org> | 2007-05-22 17:58:02 +0000 |
---|---|---|
committer | Vladimir Glazounov <vg@openoffice.org> | 2007-05-22 17:58:02 +0000 |
commit | aeba9f664152831c23240d6fd73fa2e3aaf58773 (patch) | |
tree | 90a06303b301852b579753f37f595003e5dc64bf /chart2/source/tools/DataSourceHelper.cxx | |
parent | 986c8766a23935c10c2efbb11ef40ab7d8fa3d55 (diff) |
INTEGRATION: CWS chart2mst3 (1.1.2); FILE ADDED
2007/02/08 21:25:42 iha 1.1.2.25: resync m195 -> m202
2007/02/02 16:00:30 bm 1.1.2.24: #i68229# use the same method for determining used ranges in XChartDocument::getUsedData() as in the range-chooser dialog
2006/11/17 16:32:43 bm 1.1.2.23: in ChartModel::setParent migrate the data from one data provider to the new one, if it is the same implementation and no temporary document. This is needed for solving the current clipboard problems
2006/04/27 13:03:08 bm 1.1.2.22: allArgumentsForRectRangeDetected: HasCategories is not mandatory for this
2006/04/13 14:51:04 bm 1.1.2.21: catch exceptions that might be thrown by data provider
2006/03/17 13:28:15 bm 1.1.2.20: +allArgumentsForRectRangeDetected
2006/03/07 12:33:11 bm 1.1.2.19: underscore variables removed
2005/12/02 15:24:06 bm 1.1.2.18: +getUsedDataRanges for XDiagram, +getRangesFromLabeledDataSequence, +getRangesFromDataSource
2005/11/02 13:49:22 bm 1.1.2.17: scene properties changed from SceneDescriptor property to the D3D properties offered by SceneProperties.hxx (this way XML im-/export works with the xmloff helper)
2005/11/01 13:09:02 iha 1.1.2.16: support sequence mapping
2005/10/27 17:44:42 iha 1.1.2.15: support SequenceMapping
2005/10/25 16:26:26 iha 1.1.2.14: support SequenceMapping
2005/10/11 09:20:52 bm 1.1.2.13: license header change
2005/08/19 15:28:06 bm 1.1.2.12: GetUsedData for XChartDocument
2005/08/03 16:36:27 bm 1.1.2.11: algohelper.hxx split up into CommonFunctors.hxx ContainerHelper.hxx CloneHelper.hxx
2005/07/29 14:54:28 bm 1.1.2.10: detectRangeSegmentation: allow including unused data for calculation of data range
2005/07/14 14:48:46 bm 1.1.2.9: detectRangeSegmentation: return only true if the data provider returns a valid range
2005/05/27 12:20:43 bm 1.1.2.8: +getUsedDataRanges
2005/05/12 13:56:42 bm 1.1.2.7: API change XDataProvider
2005/05/09 09:51:33 bm 1.1.2.6: moved parts of API to data namespace
2005/04/04 16:12:37 iha 1.1.2.5: added helping methods for ranges
2004/09/16 14:43:27 iha 1.1.2.4: implement api redesign
2004/06/29 12:46:48 bm 1.1.2.3: -getRangeIdentifiers
+addRangeRepresentationsFromLabeledDataSequence (was local before as helper for
the above)
2004/06/23 14:09:51 bm 1.1.2.2: do not overwrite parameters where there are no corresponding arguments found
2004/05/07 16:26:38 iha 1.1.2.1: #i20344# new
Diffstat (limited to 'chart2/source/tools/DataSourceHelper.cxx')
-rw-r--r-- | chart2/source/tools/DataSourceHelper.cxx | 550 |
1 files changed, 550 insertions, 0 deletions
diff --git a/chart2/source/tools/DataSourceHelper.cxx b/chart2/source/tools/DataSourceHelper.cxx new file mode 100644 index 000000000000..a4afcb949bb3 --- /dev/null +++ b/chart2/source/tools/DataSourceHelper.cxx @@ -0,0 +1,550 @@ +/************************************************************************* + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: DataSourceHelper.cxx,v $ + * + * $Revision: 1.2 $ + * + * last change: $Author: vg $ $Date: 2007-05-22 18:58:02 $ + * + * The Contents of this file are made available subject to + * the terms of GNU Lesser General Public License Version 2.1. + * + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2005 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_chart2.hxx" + +#include "DataSourceHelper.hxx" +#include "macros.hxx" +#include "ChartModelHelper.hxx" +#include "DiagramHelper.hxx" +#include "DataSeriesHelper.hxx" +#include "DataSource.hxx" +#include "ContainerHelper.hxx" +#include "ControllerLockGuard.hxx" +#include "PropertyHelper.hxx" + +#ifndef _COM_SUN_STAR_CHART2_XCHARTDOCUMENT_HPP_ +#include <com/sun/star/chart2/XChartDocument.hpp> +#endif +#ifndef _COM_SUN_STAR_CHART2_DATA_XDATASOURCE_HPP_ +#include <com/sun/star/chart2/data/XDataSource.hpp> +#endif +#ifndef _COM_SUN_STAR_CHART2_DATA_XLABELEDDATASEQUENCE_HPP_ +#include <com/sun/star/chart2/data/XLabeledDataSequence.hpp> +#endif + +#ifndef _COM_SUN_STAR_CHART_CHARTDATAROWSOURCE_HPP_ +#include <com/sun/star/chart/ChartDataRowSource.hpp> +#endif + +//............................................................................. +namespace chart +{ +//............................................................................. +using namespace ::com::sun::star; +using namespace ::com::sun::star::chart2; +using ::com::sun::star::uno::Reference; +using ::com::sun::star::uno::Sequence; +using ::rtl::OUString; + +namespace +{ +void lcl_addRanges( ::std::vector< ::rtl::OUString > & rOutResult, + const uno::Reference< data::XLabeledDataSequence > & xLabeledSeq ) +{ + if( ! xLabeledSeq.is()) + return; + uno::Reference< data::XDataSequence > xSeq( xLabeledSeq->getLabel()); + if( xSeq.is()) + rOutResult.push_back( xSeq->getSourceRangeRepresentation()); + xSeq.set( xLabeledSeq->getValues()); + if( xSeq.is()) + rOutResult.push_back( xSeq->getSourceRangeRepresentation()); +} + +struct lcl_migrateData : public ::std::unary_function< + Reference< chart2::data::XLabeledDataSequence >, void > +{ + lcl_migrateData( const Reference< chart2::data::XDataProvider > & xDataProvider ) : + m_xDataProvider( xDataProvider ) + {} + + Reference< chart2::data::XDataSequence > migrateData( + const Reference< chart2::data::XDataSequence > & xOldData ) + { + if( ! xOldData.is()) + return xOldData; + + OSL_ASSERT( m_xDataProvider.is()); + Reference< chart2::data::XDataSequence > xNewData( + m_xDataProvider->createDataSequenceByRangeRepresentation( + xOldData->getSourceRangeRepresentation())); + PropertyHelper::copyProperties( + Reference< beans::XPropertySet >( xOldData, uno::UNO_QUERY ), + Reference< beans::XPropertySet >( xNewData, uno::UNO_QUERY )); + return xNewData; + } + + void operator()( const Reference< chart2::data::XLabeledDataSequence > & xLSeq ) + { + if( m_xDataProvider.is() && xLSeq.is()) + { + xLSeq->setValues( migrateData( xLSeq->getValues())); + xLSeq->setLabel( migrateData( xLSeq->getLabel())); + } + } + +private: + Reference< chart2::data::XDataProvider > m_xDataProvider; +}; + + +} // anonymous namespace + +uno::Sequence< beans::PropertyValue > DataSourceHelper::createArguments( + bool bUseColumns, bool bFirstCellAsLabel, bool bHasCategories ) +{ + ::com::sun::star::chart::ChartDataRowSource eRowSource = ::com::sun::star::chart::ChartDataRowSource_ROWS; + if( bUseColumns ) + eRowSource = ::com::sun::star::chart::ChartDataRowSource_COLUMNS; + + uno::Sequence< beans::PropertyValue > aArguments(3); + aArguments[0] = beans::PropertyValue( C2U("DataRowSource") + , -1, uno::makeAny( eRowSource ) + , beans::PropertyState_DIRECT_VALUE ); + aArguments[1] = beans::PropertyValue( C2U("FirstCellAsLabel") + , -1, uno::makeAny( bFirstCellAsLabel ) + , beans::PropertyState_DIRECT_VALUE ); + aArguments[2] = beans::PropertyValue( C2U("HasCategories") + , -1, uno::makeAny( bHasCategories ) + , beans::PropertyState_DIRECT_VALUE ); + + return aArguments; +} + +uno::Sequence< beans::PropertyValue > DataSourceHelper::createArguments( + const ::rtl::OUString & rRangeRepresentation, + const uno::Sequence< sal_Int32 >& rSequenceMapping, + bool bUseColumns, bool bFirstCellAsLabel, bool bHasCategories ) +{ + uno::Sequence< beans::PropertyValue > aArguments( createArguments( bUseColumns, bFirstCellAsLabel, bHasCategories )); + aArguments.realloc( aArguments.getLength() + 1 ); + aArguments[aArguments.getLength() - 1] = + beans::PropertyValue( C2U("CellRangeRepresentation") + , -1, uno::makeAny( rRangeRepresentation ) + , beans::PropertyState_DIRECT_VALUE ); + if( rSequenceMapping.getLength() ) + { + aArguments.realloc( aArguments.getLength() + 1 ); + aArguments[aArguments.getLength() - 1] = + beans::PropertyValue( C2U("SequenceMapping") + , -1, uno::makeAny( rSequenceMapping ) + , beans::PropertyState_DIRECT_VALUE ); + } + return aArguments; +} + +void DataSourceHelper::readArguments( const uno::Sequence< beans::PropertyValue >& rArguments + , ::rtl::OUString & rRangeRepresentation, uno::Sequence< sal_Int32 >& rSequenceMapping + , bool& bUseColumns, bool& bFirstCellAsLabel, bool& bHasCategories ) +{ + const beans::PropertyValue* pArguments = rArguments.getConstArray(); + for(sal_Int32 i=0; i<rArguments.getLength(); ++i, ++pArguments) + { + const beans::PropertyValue& aProperty = *pArguments; + if( aProperty.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "DataRowSource" ) )) + { + ::com::sun::star::chart::ChartDataRowSource eRowSource; + if( aProperty.Value >>= eRowSource ) + bUseColumns = (eRowSource==::com::sun::star::chart::ChartDataRowSource_COLUMNS); + } + else if( aProperty.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "FirstCellAsLabel" ) )) + { + aProperty.Value >>= bFirstCellAsLabel; + } + else if( aProperty.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "HasCategories" ) )) + { + aProperty.Value >>= bHasCategories; + } + else if( aProperty.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "CellRangeRepresentation" ) )) + { + aProperty.Value >>= rRangeRepresentation; + } + else if( aProperty.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "SequenceMapping" ) )) + { + aProperty.Value >>= rSequenceMapping; + } + } +} + +uno::Reference< chart2::data::XDataSource > DataSourceHelper::pressUsedDataIntoRectangularFormat( + const uno::Reference< chart2::XChartDocument >& xChartDoc, bool bWithCategories ) +{ + ::std::vector< Reference< chart2::data::XLabeledDataSequence > > aResultVector; + + //categories are always the first sequence + Reference< chart2::XDiagram > xDiagram( xChartDoc->getFirstDiagram()); + + if( bWithCategories ) + { + Reference< chart2::data::XLabeledDataSequence > xCategories( DiagramHelper::getCategoriesFromDiagram( xDiagram ) ); + if( xCategories.is() ) + aResultVector.push_back( xCategories ); + } + + ::std::vector< Reference< chart2::XDataSeries > > xSeriesVector( DiagramHelper::getDataSeriesFromDiagram( xDiagram ) ); + uno::Reference< chart2::data::XDataSource > xSeriesSource( + DataSeriesHelper::getDataSource( ContainerHelper::ContainerToSequence(xSeriesVector) ) ); + Sequence< Reference< chart2::data::XLabeledDataSequence > > aDataSeqences( xSeriesSource->getDataSequences() ); + + //the first x-values is always the next sequence //todo ... other x-values get lost for old format + Reference< chart2::data::XLabeledDataSequence > xXValues( + DataSeriesHelper::getDataSequenceByRole( xSeriesSource, C2U("values-x") ) ); + if( xXValues.is() ) + aResultVector.push_back( xXValues ); + + //add all other sequences now without x-values + for( sal_Int32 nN=0; nN<aDataSeqences.getLength(); nN++ ) + { + OUString aRole( DataSeriesHelper::GetRole( aDataSeqences[nN] ) ); + if( !aRole.equals(C2U("values-x")) ) + aResultVector.push_back( aDataSeqences[nN] ); + } + + Sequence< Reference< chart2::data::XLabeledDataSequence > > aResultSequence( aResultVector.size() ); + ::std::copy( aResultVector.begin(), aResultVector.end(), aResultSequence.getArray() ); + + return new DataSource( aResultSequence ); +} + +uno::Sequence< ::rtl::OUString > DataSourceHelper::getUsedDataRanges( + const uno::Reference< chart2::XDiagram > & xDiagram ) +{ + ::std::vector< ::rtl::OUString > aResult; + + if( xDiagram.is()) + { + uno::Reference< data::XLabeledDataSequence > xCategories( DiagramHelper::getCategoriesFromDiagram( xDiagram ) ); + if( xCategories.is() ) + lcl_addRanges( aResult, xCategories ); + + ::std::vector< uno::Reference< XDataSeries > > aSeriesVector( DiagramHelper::getDataSeriesFromDiagram( xDiagram ) ); + for( ::std::vector< uno::Reference< XDataSeries > >::const_iterator aSeriesIt( aSeriesVector.begin() ) + ; aSeriesIt != aSeriesVector.end(); ++aSeriesIt ) + { + uno::Reference< data::XDataSource > xDataSource( *aSeriesIt, uno::UNO_QUERY ); + if( !xDataSource.is() ) + continue; + uno::Sequence< uno::Reference< data::XLabeledDataSequence > > aDataSequences( xDataSource->getDataSequences() ); + for( sal_Int32 i=0; i<aDataSequences.getLength(); ++i) + lcl_addRanges( aResult, aDataSequences[i] ); + } + } + + return ContainerHelper::ContainerToSequence( aResult ); +} + +uno::Sequence< ::rtl::OUString > DataSourceHelper::getUsedDataRanges( const uno::Reference< frame::XModel > & xChartModel ) +{ + uno::Reference< XDiagram > xDiagram( ChartModelHelper::findDiagram( xChartModel ) ); + return getUsedDataRanges( xDiagram ); +} + +uno::Reference< chart2::data::XDataSource > DataSourceHelper::getUsedData( + const uno::Reference< chart2::XChartDocument >& xChartDoc, + bool bIncludeUnusedData /* = false */ ) +{ + if( bIncludeUnusedData ) + return getUsedData( uno::Reference< frame::XModel >( xChartDoc, uno::UNO_QUERY ), bIncludeUnusedData ); + else + return pressUsedDataIntoRectangularFormat( xChartDoc ); +} + +uno::Reference< chart2::data::XDataSource > DataSourceHelper::getUsedData( + const uno::Reference< frame::XModel >& xChartModel, + bool bIncludeUnusedData /* = false */ ) +{ + ::std::vector< uno::Reference< chart2::data::XLabeledDataSequence > > aResult; + + uno::Reference< XDiagram > xDiagram( ChartModelHelper::findDiagram( xChartModel ) ); + uno::Reference< data::XLabeledDataSequence > xCategories( DiagramHelper::getCategoriesFromDiagram( xDiagram ) ); + if( xCategories.is() ) + aResult.push_back( xCategories ); + + ::std::vector< uno::Reference< XDataSeries > > aSeriesVector( ChartModelHelper::getDataSeries( xChartModel ) ); + for( ::std::vector< uno::Reference< XDataSeries > >::const_iterator aSeriesIt( aSeriesVector.begin() ) + ; aSeriesIt != aSeriesVector.end(); ++aSeriesIt ) + { + uno::Reference< data::XDataSource > xDataSource( *aSeriesIt, uno::UNO_QUERY ); + if( !xDataSource.is() ) + continue; + uno::Sequence< uno::Reference< data::XLabeledDataSequence > > aDataSequences( xDataSource->getDataSequences() ); + ::std::copy( aDataSequences.getConstArray(), aDataSequences.getConstArray() + aDataSequences.getLength(), + ::std::back_inserter( aResult )); + } + + if( bIncludeUnusedData && xDiagram.is()) + { + uno::Sequence< uno::Reference< data::XLabeledDataSequence > > aUnusedData( xDiagram->getUnusedData()); + ::std::copy( aUnusedData.getConstArray(), + aUnusedData.getConstArray() + aUnusedData.getLength(), + ::std::back_inserter( aResult )); + } + + return uno::Reference< chart2::data::XDataSource >( + new DataSource( ContainerHelper::ContainerToSequence( aResult ))); +} + +bool DataSourceHelper::detectRangeSegmentation( + const uno::Reference< + frame::XModel >& xChartModel + , ::rtl::OUString& rOutRangeString + , ::com::sun::star::uno::Sequence< sal_Int32 >& rSequenceMapping + , bool& rOutUseColumns + , bool& rOutFirstCellAsLabel + , bool& rOutHasCategories + , bool bIncludeUnusedData /* = false */) +{ + bool bSomethingDetected = false; + + uno::Reference< XChartDocument > xChartDocument( xChartModel, uno::UNO_QUERY ); + if( !xChartDocument.is() ) + return bSomethingDetected; + uno::Reference< data::XDataProvider > xDataProvider( xChartDocument->getDataProvider() ); + if( !xDataProvider.is() ) + return bSomethingDetected; + + OSL_ASSERT( !bIncludeUnusedData ); //bIncludeUnusedData is not supported currently + + try + { + DataSourceHelper::readArguments( + xDataProvider->detectArguments( pressUsedDataIntoRectangularFormat( xChartDocument ) ), + rOutRangeString, rSequenceMapping, rOutUseColumns, rOutFirstCellAsLabel, rOutHasCategories ); + bSomethingDetected = (rOutRangeString.getLength() > 0); + + uno::Reference< chart2::data::XLabeledDataSequence > xCategories( + DiagramHelper::getCategoriesFromDiagram( xChartDocument->getFirstDiagram() )); + rOutHasCategories = xCategories.is(); + } + catch( uno::Exception & ex ) + { + ASSERT_EXCEPTION( ex ); + } + return bSomethingDetected; +} + +bool DataSourceHelper::allArgumentsForRectRangeDetected( + const uno::Reference< chart2::XChartDocument >& xChartDocument ) +{ + bool bHasDataRowSource = false; + bool bHasFirstCellAsLabel = false; +// bool bHasHasCategories = false; + bool bHasCellRangeRepresentation = false; +// bool bHasSequenceMapping = false; + + uno::Reference< data::XDataProvider > xDataProvider( xChartDocument->getDataProvider() ); + if( !xDataProvider.is() ) + return false; + + try + { + const uno::Sequence< beans::PropertyValue > aArguments( + xDataProvider->detectArguments( pressUsedDataIntoRectangularFormat( xChartDocument ))); + const beans::PropertyValue* pArguments = aArguments.getConstArray(); + for(sal_Int32 i=0; i<aArguments.getLength(); ++i, ++pArguments) + { + const beans::PropertyValue& aProperty = *pArguments; + if( aProperty.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "DataRowSource" ) )) + { + bHasDataRowSource = + (aProperty.Value.hasValue() && aProperty.Value.isExtractableTo( + ::getCppuType( reinterpret_cast< + const ::com::sun::star::chart::ChartDataRowSource * >(0)))); + } + else if( aProperty.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "FirstCellAsLabel" ) )) + { + bHasFirstCellAsLabel = + (aProperty.Value.hasValue() && aProperty.Value.isExtractableTo(::getBooleanCppuType())); + } +// else if( aProperty.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "HasCategories" ) )) +// { +// bHasHasCategories = +// (aProperty.Value.hasValue() && aProperty.Value.isExtractableTo(::getBooleanCppuType())); +// } + else if( aProperty.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "CellRangeRepresentation" ) )) + { + ::rtl::OUString aRange; + bHasCellRangeRepresentation = + (aProperty.Value.hasValue() && (aProperty.Value >>= aRange) && aRange.getLength() > 0); + } +// else if( aProperty.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "SequenceMapping" ) )) +// { +// bHasSequenceMapping = +// (aProperty.Value.hasValue() && aProperty.Value.isExtractableTo( +// ::getCppuType( reinterpret_cast< +// const uno::Sequence< sal_Int32 > * >(0)))); +// } + } + } + catch( const uno::Exception & ex ) + { + ASSERT_EXCEPTION( ex ); + } + + return (bHasCellRangeRepresentation && bHasDataRowSource && bHasFirstCellAsLabel); +} + +void DataSourceHelper::setRangeSegmentation( + const uno::Reference< frame::XModel >& xChartModel + , const ::com::sun::star::uno::Sequence< sal_Int32 >& rSequenceMapping + , bool bUseColumns , bool bFirstCellAsLabel, bool bUseCategories ) +{ + uno::Reference< XChartDocument > xChartDocument( xChartModel, uno::UNO_QUERY ); + if( !xChartDocument.is() ) + return; + uno::Reference< data::XDataProvider > xDataProvider( xChartDocument->getDataProvider() ); + if( !xDataProvider.is() ) + return; + uno::Reference< XDiagram > xDiagram( ChartModelHelper::findDiagram( xChartModel ) ); + if( !xDiagram.is() ) + return; + uno::Reference< chart2::XChartTypeManager > xChartTypeManager( xChartDocument->getChartTypeManager() ); + if( !xChartTypeManager.is() ) + return; + uno::Reference< lang::XMultiServiceFactory > xTemplateFactory( xChartTypeManager, uno::UNO_QUERY ); + if( !xTemplateFactory.is() ) + return; + + ::rtl::OUString aRangeString; + bool bDummy; + uno::Sequence< sal_Int32 > aDummy; + readArguments( xDataProvider->detectArguments( pressUsedDataIntoRectangularFormat( xChartDocument )), + aRangeString, aDummy, bDummy, bDummy, bDummy ); + + uno::Sequence< beans::PropertyValue > aArguments( + createArguments( aRangeString, rSequenceMapping, bUseColumns, bFirstCellAsLabel, bUseCategories ) ); + + uno::Reference< chart2::data::XDataSource > xDataSource( xDataProvider->createDataSource( + aArguments ) ); + if( !xDataSource.is() ) + return; + + DiagramHelper::tTemplateWithServiceName aTemplateAndService = + DiagramHelper::getTemplateForDiagram( xDiagram, xTemplateFactory ); + + rtl::OUString aServiceName( aTemplateAndService.second ); + uno::Reference< chart2::XChartTypeTemplate > xTemplate = aTemplateAndService.first; + + if( !xTemplate.is() ) + { + if( aServiceName.getLength() == 0 ) + aServiceName = C2U("com.sun.star.chart2.template.Column"); + xTemplate.set( xTemplateFactory->createInstance( aServiceName ), uno::UNO_QUERY ); + } + if( !xTemplate.is() ) + return; + + // /-- locked controllers + ControllerLockGuard aCtrlLockGuard( xChartModel ); + xTemplate->changeDiagramData( xDiagram, xDataSource, aArguments ); + // \-- locked controllers +} + +Sequence< OUString > DataSourceHelper::getRangesFromLabeledDataSequence( + const Reference< data::XLabeledDataSequence > & xLSeq ) +{ + Sequence< OUString > aResult; + if( xLSeq.is()) + { + Reference< data::XDataSequence > xLabel( xLSeq->getLabel()); + Reference< data::XDataSequence > xValues( xLSeq->getValues()); + + if( xLabel.is()) + { + if( xValues.is()) + { + aResult.realloc( 2 ); + aResult[0] = xLabel->getSourceRangeRepresentation(); + aResult[1] = xValues->getSourceRangeRepresentation(); + } + else + { + aResult.realloc( 1 ); + aResult[0] = xLabel->getSourceRangeRepresentation(); + } + } + else if( xValues.is()) + { + aResult.realloc( 1 ); + aResult[0] = xValues->getSourceRangeRepresentation(); + } + } + return aResult; +} + +Sequence< OUString > DataSourceHelper::getRangesFromDataSource( const Reference< data::XDataSource > & xSource ) +{ + ::std::vector< OUString > aResult; + if( xSource.is()) + { + Sequence< Reference< data::XLabeledDataSequence > > aLSeqSeq( xSource->getDataSequences()); + for( sal_Int32 i=0; i<aLSeqSeq.getLength(); ++i ) + { + Reference< data::XDataSequence > xLabel( aLSeqSeq[i]->getLabel()); + Reference< data::XDataSequence > xValues( aLSeqSeq[i]->getValues()); + + if( xLabel.is()) + aResult.push_back( xLabel->getSourceRangeRepresentation()); + if( xValues.is()) + aResult.push_back( xValues->getSourceRangeRepresentation()); + } + } + return ContainerHelper::ContainerToSequence( aResult ); +} + +bool DataSourceHelper::migrateData( + const Reference< chart2::XChartDocument > & xChartDoc, + const Reference< chart2::data::XDataProvider > & xNewDataProvider ) +{ + if( ! ( xChartDoc.is() && xNewDataProvider.is())) + return false; + + bool bCouldMigrate = true; + Reference< chart2::data::XDataSource > xDataSource( + DataSourceHelper::getUsedData( xChartDoc, true /* bIncludeUnusedData */ )); + Sequence< Reference< chart2::data::XLabeledDataSequence > > aLSeq( + xDataSource->getDataSequences()); + ::std::for_each( aLSeq.getArray(), aLSeq.getArray() + aLSeq.getLength(), + lcl_migrateData( xNewDataProvider )); + + return bCouldMigrate; +} + + +//............................................................................. +} //namespace chart +//............................................................................. |