diff options
Diffstat (limited to 'chart2/source/inc/EventListenerHelper.hxx')
-rw-r--r-- | chart2/source/inc/EventListenerHelper.hxx | 222 |
1 files changed, 222 insertions, 0 deletions
diff --git a/chart2/source/inc/EventListenerHelper.hxx b/chart2/source/inc/EventListenerHelper.hxx new file mode 100644 index 000000000000..79840a2bd2e4 --- /dev/null +++ b/chart2/source/inc/EventListenerHelper.hxx @@ -0,0 +1,222 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org 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 version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#ifndef CHART2_EVENTLISTENERHELPER_HXX +#define CHART2_EVENTLISTENERHELPER_HXX + +#include <com/sun/star/lang/XEventListener.hpp> +#include <com/sun/star/lang/XComponent.hpp> + +#include <list> +#include <algorithm> +#include <functional> +#include <utility> + +namespace chart +{ +namespace EventListenerHelper +{ + +namespace impl +{ + +template< class InterfaceRef > +struct addListenerFunctor : public ::std::unary_function< InterfaceRef, void > +{ + explicit addListenerFunctor( const ::com::sun::star::uno::Reference< + ::com::sun::star::lang::XEventListener > & xListener ) : + m_xListener( xListener ) + {} + + void operator() ( const InterfaceRef & xObject ) + { + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent > + xBroadcaster( xObject, ::com::sun::star::uno::UNO_QUERY ); + if( xBroadcaster.is() && m_xListener.is()) + xBroadcaster->addEventListener( m_xListener ); + } +private: + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > m_xListener; +}; + +template< class InterfaceRef > +struct removeListenerFunctor : public ::std::unary_function< InterfaceRef, void > +{ + explicit removeListenerFunctor( const ::com::sun::star::uno::Reference< + ::com::sun::star::lang::XEventListener > & xListener ) : + m_xListener( xListener ) + {} + + void operator() ( const InterfaceRef & xObject ) + { + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent > + xBroadcaster( xObject, ::com::sun::star::uno::UNO_QUERY ); + if( xBroadcaster.is() && m_xListener.is()) + xBroadcaster->removeEventListener( m_xListener ); + } +private: + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > m_xListener; +}; + +template< class Pair > +struct addListenerToMappedElementFunctor : public ::std::unary_function< Pair, void > +{ + explicit addListenerToMappedElementFunctor( const ::com::sun::star::uno::Reference< + ::com::sun::star::lang::XEventListener > & xListener ) : + m_xListener( xListener ) + {} + + void operator() ( const Pair & aPair ) + { + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent > + xBroadcaster( aPair.second, ::com::sun::star::uno::UNO_QUERY ); + if( xBroadcaster.is() && m_xListener.is()) + xBroadcaster->addEventListener( m_xListener ); + } +private: + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > m_xListener; +}; + +template< class Pair > +struct removeListenerFromMappedElementFunctor : public ::std::unary_function< Pair, void > +{ + explicit removeListenerFromMappedElementFunctor( const ::com::sun::star::uno::Reference< + ::com::sun::star::lang::XEventListener > & xListener ) : + m_xListener( xListener ) + {} + + void operator() ( const Pair & aPair ) + { + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent > + xBroadcaster( aPair.second, ::com::sun::star::uno::UNO_QUERY ); + if( xBroadcaster.is() && m_xListener.is()) + xBroadcaster->removeEventListener( m_xListener ); + } +private: + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > m_xListener; +}; + +} // namespace impl + +// -------------------------------------------------------------------------------- + +template< class InterfaceRef > +void addListener( + const InterfaceRef & xObject, + const ::com::sun::star::uno::Reference< + ::com::sun::star::lang::XEventListener > & xListener ) +{ + if( xListener.is()) + { + impl::addListenerFunctor< InterfaceRef > aFunctor( xListener ); + aFunctor( xObject ); + } +} + +template< class Container > +void addListenerToAllElements( + const Container & rContainer, + const ::com::sun::star::uno::Reference< + ::com::sun::star::lang::XEventListener > & xListener ) +{ + if( xListener.is()) + ::std::for_each( rContainer.begin(), rContainer.end(), + impl::addListenerFunctor< typename Container::value_type >( xListener )); +} + +template< class Container > +void addListenerToAllMapElements( + const Container & rContainer, + const ::com::sun::star::uno::Reference< + ::com::sun::star::lang::XEventListener > & xListener ) +{ + if( xListener.is()) + ::std::for_each( rContainer.begin(), rContainer.end(), + impl::addListenerToMappedElementFunctor< typename Container::value_type >( xListener )); +} + +template< typename T > +void addListenerToAllSequenceElements( + const ::com::sun::star::uno::Sequence< T > & rSequence, + const ::com::sun::star::uno::Reference< + ::com::sun::star::lang::XEventListener > & xListener ) +{ + if( xListener.is()) + ::std::for_each( rSequence.getConstArray(), rSequence.getConstArray() + rSequence.getLength(), + impl::addListenerFunctor< T >( xListener )); +} + +template< class InterfaceRef > +void removeListener( + const InterfaceRef & xObject, + const ::com::sun::star::uno::Reference< + ::com::sun::star::lang::XEventListener > & xListener ) +{ + if( xListener.is()) + { + impl::removeListenerFunctor< InterfaceRef > aFunctor( xListener ); + aFunctor( xObject ); + } +} + +template< class Container > +void removeListenerFromAllElements( + const Container & rContainer, + const ::com::sun::star::uno::Reference< + ::com::sun::star::lang::XEventListener > & xListener ) +{ + if( xListener.is()) + ::std::for_each( rContainer.begin(), rContainer.end(), + impl::removeListenerFunctor< typename Container::value_type >( xListener )); +} + +template< class Container > +void removeListenerFromAllMapElements( + const Container & rContainer, + const ::com::sun::star::uno::Reference< + ::com::sun::star::lang::XEventListener > & xListener ) +{ + if( xListener.is()) + ::std::for_each( rContainer.begin(), rContainer.end(), + impl::removeListenerFromMappedElementFunctor< typename Container::value_type >( xListener )); +} + +template< typename T > +void removeListenerFromAllSequenceElements( + const ::com::sun::star::uno::Sequence< T > & rSequence, + const ::com::sun::star::uno::Reference< + ::com::sun::star::lang::XEventListener > & xListener ) +{ + if( xListener.is()) + ::std::for_each( rSequence.getConstArray(), rSequence.getConstArray() + rSequence.getLength(), + impl::removeListenerFunctor< T >( xListener )); +} + +} // namespace EventListenerHelper +} // namespace chart + +// CHART2_EVENTLISTENERHELPER_HXX +#endif |