diff options
Diffstat (limited to 'chart2/source/model/main/BaseCoordinateSystem.cxx')
-rw-r--r-- | chart2/source/model/main/BaseCoordinateSystem.cxx | 173 |
1 files changed, 107 insertions, 66 deletions
diff --git a/chart2/source/model/main/BaseCoordinateSystem.cxx b/chart2/source/model/main/BaseCoordinateSystem.cxx index 3729c32bd281..8af32fa09678 100644 --- a/chart2/source/model/main/BaseCoordinateSystem.cxx +++ b/chart2/source/model/main/BaseCoordinateSystem.cxx @@ -22,12 +22,13 @@ #include <UserDefinedProperties.hxx> #include <CloneHelper.hxx> #include <ModifyListenerHelper.hxx> -#include "Axis.hxx" +#include <Axis.hxx> +#include <ChartType.hxx> #include <com/sun/star/chart2/AxisType.hpp> #include <com/sun/star/container/NoSuchElementException.hpp> #include <com/sun/star/lang/IndexOutOfBoundsException.hpp> #include <o3tl/safeint.hxx> -#include <tools/diagnose_ex.h> +#include <comphelper/diagnose_ex.hxx> #include <algorithm> @@ -55,58 +56,31 @@ void lcl_AddPropertiesToVector( | beans::PropertyAttribute::MAYBEVOID ); } -struct StaticCooSysDefaults_Initializer +const ::chart::tPropertyValueMap & StaticCooSysDefaults() { - ::chart::tPropertyValueMap* operator()() + static ::chart::tPropertyValueMap aStaticDefaults = []() { - static ::chart::tPropertyValueMap aStaticDefaults; - ::chart::PropertyHelper::setPropertyValueDefault( aStaticDefaults, PROP_COORDINATESYSTEM_SWAPXANDYAXIS, false ); - return &aStaticDefaults; - } -}; - -struct StaticCooSysDefaults : public rtl::StaticAggregate< ::chart::tPropertyValueMap, StaticCooSysDefaults_Initializer > -{ + ::chart::tPropertyValueMap aMap; + ::chart::PropertyHelper::setPropertyValueDefault( aMap, PROP_COORDINATESYSTEM_SWAPXANDYAXIS, false ); + return aMap; + }(); + return aStaticDefaults; }; -struct StaticCooSysInfoHelper_Initializer +::cppu::OPropertyArrayHelper& StaticCooSysInfoHelper() { - ::cppu::OPropertyArrayHelper* operator()() - { - static ::cppu::OPropertyArrayHelper aPropHelper( lcl_GetPropertySequence() ); - return &aPropHelper; - } - -private: - static Sequence< Property > lcl_GetPropertySequence() - { - std::vector< css::beans::Property > aProperties; - lcl_AddPropertiesToVector( aProperties ); - ::chart::UserDefinedProperties::AddPropertiesToVector( aProperties ); - - std::sort( aProperties.begin(), aProperties.end(), - ::chart::PropertyNameLess() ); - - return comphelper::containerToSequence( aProperties ); - } -}; - -struct StaticCooSysInfoHelper : public rtl::StaticAggregate< ::cppu::OPropertyArrayHelper, StaticCooSysInfoHelper_Initializer > -{ -}; + static ::cppu::OPropertyArrayHelper aPropHelper = []() + { + std::vector< css::beans::Property > aProperties; + lcl_AddPropertiesToVector( aProperties ); + ::chart::UserDefinedProperties::AddPropertiesToVector( aProperties ); -struct StaticCooSysInfo_Initializer -{ - uno::Reference< beans::XPropertySetInfo >* operator()() - { - static uno::Reference< beans::XPropertySetInfo > xPropertySetInfo( - ::cppu::OPropertySetHelper::createPropertySetInfo(*StaticCooSysInfoHelper::get() ) ); - return &xPropertySetInfo; - } -}; + std::sort( aProperties.begin(), aProperties.end(), + ::chart::PropertyNameLess() ); -struct StaticCooSysInfo : public rtl::StaticAggregate< uno::Reference< beans::XPropertySetInfo >, StaticCooSysInfo_Initializer > -{ + return comphelper::containerToSequence( aProperties ); + }(); + return aPropHelper; }; } // anonymous namespace @@ -116,7 +90,6 @@ namespace chart BaseCoordinateSystem::BaseCoordinateSystem( sal_Int32 nDimensionCount /* = 2 */ ) : - ::property::OPropertySet( m_aMutex ), m_xModifyEventForwarder( new ModifyEventForwarder() ), m_nDimensionCount( nDimensionCount ) { @@ -124,7 +97,7 @@ BaseCoordinateSystem::BaseCoordinateSystem( for( sal_Int32 nN=0; nN<m_nDimensionCount; nN++ ) { m_aAllAxis[nN].resize( 1 ); - Reference< chart2::XAxis > xAxis( new Axis ); + rtl::Reference< Axis > xAxis( new Axis ); m_aAllAxis[nN][0] = xAxis; ModifyListenerHelper::addListenerToAllElements( m_aAllAxis[nN], m_xModifyEventForwarder ); @@ -151,19 +124,21 @@ BaseCoordinateSystem::BaseCoordinateSystem( BaseCoordinateSystem::BaseCoordinateSystem( const BaseCoordinateSystem & rSource ) : impl::BaseCoordinateSystem_Base(rSource), - ::property::OPropertySet( rSource, m_aMutex ), + ::property::OPropertySet( rSource ), m_xModifyEventForwarder( new ModifyEventForwarder() ), m_nDimensionCount( rSource.m_nDimensionCount ) { m_aAllAxis.resize(rSource.m_aAllAxis.size()); tAxisVecVecType::size_type nN=0; for( nN=0; nN<m_aAllAxis.size(); nN++ ) - CloneHelper::CloneRefVector<chart2::XAxis>( rSource.m_aAllAxis[nN], m_aAllAxis[nN] ); - CloneHelper::CloneRefVector<chart2::XChartType>( rSource.m_aChartTypes, m_aChartTypes ); + CloneHelper::CloneRefVector( rSource.m_aAllAxis[nN], m_aAllAxis[nN] ); + for (const auto & rxChartType : rSource.m_aChartTypes) + m_aChartTypes.push_back(rxChartType->cloneChartType()); for( nN=0; nN<m_aAllAxis.size(); nN++ ) ModifyListenerHelper::addListenerToAllElements( m_aAllAxis[nN], m_xModifyEventForwarder ); - ModifyListenerHelper::addListenerToAllElements( m_aChartTypes, m_xModifyEventForwarder ); + for (const auto & rxChartType : m_aChartTypes) + rxChartType->addModifyListener( m_xModifyEventForwarder ); } BaseCoordinateSystem::~BaseCoordinateSystem() @@ -172,7 +147,8 @@ BaseCoordinateSystem::~BaseCoordinateSystem() { for(const tAxisVecVecType::value_type & i : m_aAllAxis) ModifyListenerHelper::removeListenerFromAllElements( i, m_xModifyEventForwarder ); - ModifyListenerHelper::removeListenerFromAllElements( m_aChartTypes, m_xModifyEventForwarder ); + for (const auto & rxChartType : m_aChartTypes) + rxChartType->removeModifyListener( m_xModifyEventForwarder ); } catch( const uno::Exception & ) { @@ -197,13 +173,41 @@ void SAL_CALL BaseCoordinateSystem::setAxisByDimension( if( nIndex < 0 ) throw lang::IndexOutOfBoundsException(); + assert(!xAxis || dynamic_cast<Axis*>(xAxis.get())); + + if( m_aAllAxis[ nDimensionIndex ].size() < o3tl::make_unsigned( nIndex+1 )) + { + m_aAllAxis[ nDimensionIndex ].resize( nIndex+1 ); + m_aAllAxis[ nDimensionIndex ][nIndex] = nullptr; + } + + rtl::Reference< Axis > xOldAxis( m_aAllAxis[ nDimensionIndex ][nIndex] ); + if( xOldAxis.is()) + ModifyListenerHelper::removeListener( xOldAxis, m_xModifyEventForwarder ); + m_aAllAxis[ nDimensionIndex ][nIndex] = dynamic_cast<Axis*>(xAxis.get()); + if( xAxis.is()) + ModifyListenerHelper::addListener( xAxis, m_xModifyEventForwarder ); + fireModifyEvent(); +} + +void BaseCoordinateSystem::setAxisByDimension( + sal_Int32 nDimensionIndex, + const rtl::Reference< Axis >& xAxis, + sal_Int32 nIndex ) +{ + if( nDimensionIndex < 0 || nDimensionIndex >= getDimension() ) + throw lang::IndexOutOfBoundsException(); + + if( nIndex < 0 ) + throw lang::IndexOutOfBoundsException(); + if( m_aAllAxis[ nDimensionIndex ].size() < o3tl::make_unsigned( nIndex+1 )) { m_aAllAxis[ nDimensionIndex ].resize( nIndex+1 ); m_aAllAxis[ nDimensionIndex ][nIndex] = nullptr; } - Reference< chart2::XAxis > xOldAxis( m_aAllAxis[ nDimensionIndex ][nIndex] ); + rtl::Reference< Axis > xOldAxis( m_aAllAxis[ nDimensionIndex ][nIndex] ); if( xOldAxis.is()) ModifyListenerHelper::removeListener( xOldAxis, m_xModifyEventForwarder ); m_aAllAxis[ nDimensionIndex ][nIndex] = xAxis; @@ -226,6 +230,20 @@ Reference< chart2::XAxis > SAL_CALL BaseCoordinateSystem::getAxisByDimension( return m_aAllAxis[ nDimensionIndex ][nAxisIndex]; } +const rtl::Reference< Axis > & BaseCoordinateSystem::getAxisByDimension2( + sal_Int32 nDimensionIndex, sal_Int32 nAxisIndex ) const +{ + if( nDimensionIndex < 0 || nDimensionIndex >= m_nDimensionCount ) + throw lang::IndexOutOfBoundsException(); + + OSL_ASSERT( m_aAllAxis.size() == static_cast< size_t >( m_nDimensionCount)); + + if( nAxisIndex < 0 || o3tl::make_unsigned(nAxisIndex) > m_aAllAxis[ nDimensionIndex ].size() ) + throw lang::IndexOutOfBoundsException(); + + return m_aAllAxis[ nDimensionIndex ][nAxisIndex]; +} + sal_Int32 SAL_CALL BaseCoordinateSystem::getMaximumAxisIndexByDimension( sal_Int32 nDimensionIndex ) { if( nDimensionIndex < 0 || nDimensionIndex >= getDimension() ) @@ -243,19 +261,23 @@ sal_Int32 SAL_CALL BaseCoordinateSystem::getMaximumAxisIndexByDimension( sal_Int // ____ XChartTypeContainer ____ void SAL_CALL BaseCoordinateSystem::addChartType( const Reference< chart2::XChartType >& aChartType ) { - if( std::find( m_aChartTypes.begin(), m_aChartTypes.end(), aChartType ) + auto pChartType = dynamic_cast<ChartType*>(aChartType.get()); + assert(pChartType); + + if( std::find( m_aChartTypes.begin(), m_aChartTypes.end(), pChartType ) != m_aChartTypes.end()) throw lang::IllegalArgumentException("type not found", static_cast<cppu::OWeakObject*>(this), 1); - m_aChartTypes.push_back( aChartType ); + m_aChartTypes.push_back( pChartType ); ModifyListenerHelper::addListener( aChartType, m_xModifyEventForwarder ); fireModifyEvent(); } void SAL_CALL BaseCoordinateSystem::removeChartType( const Reference< chart2::XChartType >& aChartType ) { - std::vector< uno::Reference< chart2::XChartType > >::iterator - aIt( std::find( m_aChartTypes.begin(), m_aChartTypes.end(), aChartType )); + auto pChartType = dynamic_cast<ChartType*>(aChartType.get()); + assert(pChartType); + auto aIt( std::find( m_aChartTypes.begin(), m_aChartTypes.end(), pChartType )); if( aIt == m_aChartTypes.end()) throw container::NoSuchElementException( "The given chart type is no element of the container", @@ -268,14 +290,31 @@ void SAL_CALL BaseCoordinateSystem::removeChartType( const Reference< chart2::XC Sequence< Reference< chart2::XChartType > > SAL_CALL BaseCoordinateSystem::getChartTypes() { - return comphelper::containerToSequence( m_aChartTypes ); + return comphelper::containerToSequence< Reference< chart2::XChartType > >( m_aChartTypes ); } void SAL_CALL BaseCoordinateSystem::setChartTypes( const Sequence< Reference< chart2::XChartType > >& aChartTypes ) { - ModifyListenerHelper::removeListenerFromAllElements( m_aChartTypes, m_xModifyEventForwarder ); - m_aChartTypes = comphelper::sequenceToContainer<std::vector< css::uno::Reference< css::chart2::XChartType > >>( aChartTypes ); - ModifyListenerHelper::addListenerToAllElements( m_aChartTypes, m_xModifyEventForwarder ); + for (auto const & aChartType : m_aChartTypes) + aChartType->removeModifyListener( m_xModifyEventForwarder ); + m_aChartTypes.clear(); + for (auto const & aChartType : aChartTypes) + { + auto pChartType = dynamic_cast<ChartType*>(aChartType.get()); + assert(pChartType); + m_aChartTypes.push_back(pChartType); + pChartType->addModifyListener( m_xModifyEventForwarder ); + } + fireModifyEvent(); +} + +void BaseCoordinateSystem::setChartTypes( const std::vector< rtl::Reference< ChartType > >& aChartTypes ) +{ + for (auto const & aChartType : m_aChartTypes) + aChartType->removeModifyListener( m_xModifyEventForwarder ); + m_aChartTypes = aChartTypes; + for (auto const & aChartType : m_aChartTypes) + aChartType->addModifyListener( m_xModifyEventForwarder ); fireModifyEvent(); } @@ -316,7 +355,7 @@ void BaseCoordinateSystem::fireModifyEvent() // ____ OPropertySet ____ void BaseCoordinateSystem::GetDefaultValue( sal_Int32 nHandle, uno::Any& rAny ) const { - const tPropertyValueMap& rStaticDefaults = *StaticCooSysDefaults::get(); + const tPropertyValueMap& rStaticDefaults = StaticCooSysDefaults(); tPropertyValueMap::const_iterator aFound( rStaticDefaults.find( nHandle ) ); if( aFound == rStaticDefaults.end() ) rAny.clear(); @@ -327,13 +366,15 @@ void BaseCoordinateSystem::GetDefaultValue( sal_Int32 nHandle, uno::Any& rAny ) // ____ OPropertySet ____ ::cppu::IPropertyArrayHelper & SAL_CALL BaseCoordinateSystem::getInfoHelper() { - return *StaticCooSysInfoHelper::get(); + return StaticCooSysInfoHelper(); } // ____ XPropertySet ____ Reference< beans::XPropertySetInfo > SAL_CALL BaseCoordinateSystem::getPropertySetInfo() { - return *StaticCooSysInfo::get(); + static uno::Reference< beans::XPropertySetInfo > xPropertySetInfo( + ::cppu::OPropertySetHelper::createPropertySetInfo(StaticCooSysInfoHelper() ) ); + return xPropertySetInfo; } using impl::BaseCoordinateSystem_Base; |