1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ 2 /* 3 * This file is part of the LibreOffice project. 4 * 5 * This Source Code Form is subject to the terms of the Mozilla Public 6 * License, v. 2.0. If a copy of the MPL was not distributed with this 7 * file, You can obtain one at http://mozilla.org/MPL/2.0/. 8 * 9 * This file incorporates work covered by the following license notice: 10 * 11 * Licensed to the Apache Software Foundation (ASF) under one or more 12 * contributor license agreements. See the NOTICE file distributed 13 * with this work for additional information regarding copyright 14 * ownership. The ASF licenses this file to you under the Apache 15 * License, Version 2.0 (the "License"); you may not use this file 16 * except in compliance with the License. You may obtain a copy of 17 * the License at http://www.apache.org/licenses/LICENSE-2.0 . 18 */ 19 20 #ifndef INCLUDED_SVX_SHAPEPROPERTYNOTIFIER_HXX 21 #define INCLUDED_SVX_SHAPEPROPERTYNOTIFIER_HXX 22 23 #include <svx/svxdllapi.h> 24 #include <svx/shapeproperty.hxx> 25 #include <rtl/ustring.hxx> 26 27 #include <memory> 28 29 namespace com::sun::star::beans { class XPropertyChangeListener; } 30 namespace com::sun::star::uno { class Any; } 31 namespace com::sun::star::uno { template <typename > class Reference; } 32 namespace osl { class Mutex; } 33 34 namespace cppu 35 { 36 class OWeakObject; 37 } 38 39 40 namespace svx 41 { 42 43 44 //= IPropertyValueProvider 45 46 /** a provider for a property value 47 */ 48 class SVX_DLLPUBLIC IPropertyValueProvider 49 { 50 public: 51 /** returns the name of the property which this provider is responsible for 52 */ 53 virtual OUString getPropertyName() const = 0; 54 55 /** returns the current value of the property which the provider is responsible for 56 */ 57 virtual void getCurrentValue( css::uno::Any& _out_rValue ) const = 0; 58 59 virtual ~IPropertyValueProvider(); 60 }; 61 62 //= PropertyValueProvider 63 64 /** default implementation of an IPropertyValueProvider 65 66 This default implementation queries the object which it is constructed with for the XPropertySet interface, 67 and calls the getPropertyValue method. 68 */ 69 class SVX_DLLPUBLIC PropertyValueProvider :public IPropertyValueProvider 70 { 71 public: PropertyValueProvider(::cppu::OWeakObject & _rContext,const sal_Char * _pAsciiPropertyName)72 PropertyValueProvider( ::cppu::OWeakObject& _rContext, const sal_Char* _pAsciiPropertyName ) 73 :m_rContext( _rContext ) 74 ,m_sPropertyName( OUString::createFromAscii( _pAsciiPropertyName ) ) 75 { 76 } 77 78 virtual OUString getPropertyName() const override; 79 virtual void getCurrentValue( css::uno::Any& _out_rValue ) const override; 80 81 protected: getContext() const82 ::cppu::OWeakObject& getContext() const { return m_rContext; } 83 PropertyValueProvider(const PropertyValueProvider&) = delete; 84 PropertyValueProvider& operator=(const PropertyValueProvider&) = delete; 85 86 private: 87 ::cppu::OWeakObject& m_rContext; 88 const OUString m_sPropertyName; 89 }; 90 91 92 //= PropertyChangeNotifier 93 94 struct PropertyChangeNotifier_Data; 95 96 /** helper class for notifying XPropertyChangeListeners 97 98 The class is intended to be held as member of the class which does the property change broadcasting. 99 */ 100 class SVX_DLLPUBLIC PropertyChangeNotifier 101 { 102 public: 103 /** constructs a notifier instance 104 105 @param _rOwner 106 the owner instance of the notifier. Will be used as css.lang.EventObject.Source when 107 notifying events. 108 */ 109 PropertyChangeNotifier( ::cppu::OWeakObject& _rOwner, ::osl::Mutex& _rMutex ); 110 ~PropertyChangeNotifier(); 111 112 // listener maintenance 113 void addPropertyChangeListener( const OUString& _rPropertyName, const css::uno::Reference< css::beans::XPropertyChangeListener >& _rxListener ); 114 void removePropertyChangeListener( const OUString& _rPropertyName, const css::uno::Reference< css::beans::XPropertyChangeListener >& _rxListener ); 115 116 /** registers an IPropertyValueProvider 117 */ 118 void registerProvider( const ShapeProperty _eProperty, const std::shared_ptr<IPropertyValueProvider>& _rProvider ); 119 120 /** notifies changes in the given property to all registered listeners 121 122 If no property value provider for the given property ID is registered, this is worth an assertion in a 123 non-product build, and otherwise ignored. 124 */ 125 void notifyPropertyChange( const ShapeProperty _eProperty ) const; 126 127 /** is called to dispose the instance 128 */ 129 void disposing(); 130 131 private: 132 PropertyChangeNotifier(const PropertyChangeNotifier&) = delete; 133 PropertyChangeNotifier& operator=(const PropertyChangeNotifier&) = delete; 134 135 std::unique_ptr< PropertyChangeNotifier_Data > m_xData; 136 }; 137 138 139 } 140 141 142 #endif // INCLUDED_SVX_SHAPEPROPERTYNOTIFIER_HXX 143 144 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ 145