23 #include <com/sun/star/beans/XPropertySet.hpp>
29 #include <unordered_map>
34 struct ShapePropertyHash
48 using ::com::sun::star::uno::Reference;
49 using ::com::sun::star::uno::UNO_QUERY_THROW;
50 using ::com::sun::star::uno::Exception;
51 using ::com::sun::star::uno::Any;
52 using ::com::sun::star::beans::PropertyChangeEvent;
53 using ::com::sun::star::beans::XPropertyChangeListener;
54 using ::com::sun::star::lang::EventObject;
57 typedef std::unordered_map< ShapeProperty, std::shared_ptr<IPropertyValueProvider>, ShapePropertyHash >
PropertyProviders;
73 :m_rContext( _rContext )
74 ,m_aPropertyChangeListeners( _rMutex )
90 Reference< XPropertySet > xContextProps( const_cast< PropertyValueProvider* >(
this )->
m_rContext, UNO_QUERY_THROW );
107 OSL_ENSURE(
m_xData->m_aProviders.find( _eProperty ) ==
m_xData->m_aProviders.end(),
108 "PropertyChangeNotifier::registerProvider: factory for this ID already present!" );
110 m_xData->m_aProviders[ _eProperty ] = _rProvider;
115 PropertyProviders::const_iterator provPos =
m_xData->m_aProviders.find( _eProperty );
116 OSL_ENSURE( provPos !=
m_xData->m_aProviders.end(),
"PropertyChangeNotifier::notifyPropertyChange: no factory!" );
117 if ( provPos ==
m_xData->m_aProviders.end() )
120 OUString sPropertyName( provPos->second->getPropertyName() );
124 if ( !pPropListeners && !pAllListeners )
129 PropertyChangeEvent
aEvent;
130 aEvent.Source =
m_xData->m_rContext;
132 aEvent.PropertyName = provPos->second->getPropertyName();
133 provPos->second->getCurrentValue( aEvent.NewValue );
135 if ( pPropListeners )
136 pPropListeners->notifyEach( &XPropertyChangeListener::propertyChange, aEvent );
138 pAllListeners->
notifyEach( &XPropertyChangeListener::propertyChange, aEvent );
149 m_xData->m_aPropertyChangeListeners.addInterface( _rPropertyName, _rxListener );
155 m_xData->m_aPropertyChangeListeners.removeInterface( _rPropertyName, _rxListener );
162 aEvent.Source =
m_xData->m_rContext;
163 m_xData->m_aPropertyChangeListeners.disposeAndClear( aEvent );
void removePropertyChangeListener(const OUString &_rPropertyName, const css::uno::Reference< css::beans::XPropertyChangeListener > &_rxListener)
void disposing()
is called to dispose the instance
virtual OUString getPropertyName() const override
returns the name of the property which this provider is responsible for
std::unique_ptr< PropertyChangeNotifier_Data > m_xData
virtual ~IPropertyValueProvider()
void addPropertyChangeListener(const OUString &_rPropertyName, const css::uno::Reference< css::beans::XPropertyChangeListener > &_rxListener)
PropertyProviders m_aProviders
void notifyPropertyChange(const ShapeProperty _eProperty) const
notifies changes in the given property to all registered listeners
virtual void getCurrentValue(css::uno::Any &_out_rValue) const override
returns the current value of the property which the provider is responsible for
cppu::OMultiTypeInterfaceContainerHelperVar< OUString > PropertyChangeListenerContainer
#define DBG_UNHANDLED_EXCEPTION(...)
class SAL_NO_VTABLE XPropertySet
void registerProvider(const ShapeProperty _eProperty, const std::shared_ptr< IPropertyValueProvider > &_rProvider)
registers an IPropertyValueProvider
const OUString m_sPropertyName
::cppu::OWeakObject & m_rContext
PropertyChangeListenerContainer m_aPropertyChangeListeners
#define ENSURE_OR_THROW(c, m)
std::unordered_map< ShapeProperty, std::shared_ptr< IPropertyValueProvider >, ShapePropertyHash > PropertyProviders
void notifyEach(void(SAL_CALL ListenerT::*NotificationMethod)(const EventT &), const EventT &Event)
::cppu::OWeakObject & m_rContext
PropertyChangeNotifier_Data(::cppu::OWeakObject &_rContext,::osl::Mutex &_rMutex)
PropertyChangeNotifier(::cppu::OWeakObject &_rOwner,::osl::Mutex &_rMutex)
constructs a notifier instance
~PropertyChangeNotifier()