1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski #ifndef SD_FRAMEWORK_CONFIGURATION_CONTROLLER_BROADCASTER_HXX 25*b1cdbd2cSJim Jagielski #define SD_FRAMEWORK_CONFIGURATION_CONTROLLER_BROADCASTER_HXX 26*b1cdbd2cSJim Jagielski 27*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/framework/XConfigurationChangeListener.hpp> 28*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/framework/XConfigurationController.hpp> 29*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/framework/ConfigurationChangeEvent.hpp> 30*b1cdbd2cSJim Jagielski 31*b1cdbd2cSJim Jagielski #include <comphelper/stl_types.hxx> 32*b1cdbd2cSJim Jagielski #include <vector> 33*b1cdbd2cSJim Jagielski #include <hash_map> 34*b1cdbd2cSJim Jagielski 35*b1cdbd2cSJim Jagielski namespace css = ::com::sun::star; 36*b1cdbd2cSJim Jagielski 37*b1cdbd2cSJim Jagielski namespace sd { namespace framework { 38*b1cdbd2cSJim Jagielski 39*b1cdbd2cSJim Jagielski /** This class manages the set of XConfigurationChangeListeners and 40*b1cdbd2cSJim Jagielski calls them when the ConfigurationController wants to broadcast an 41*b1cdbd2cSJim Jagielski event. 42*b1cdbd2cSJim Jagielski 43*b1cdbd2cSJim Jagielski For every registered combination of listener and event type a user data 44*b1cdbd2cSJim Jagielski object is stored. This user data object is then given to the listener 45*b1cdbd2cSJim Jagielski whenever it is called for an event. With this the listener can use 46*b1cdbd2cSJim Jagielski a switch statement to handle different event types. 47*b1cdbd2cSJim Jagielski */ 48*b1cdbd2cSJim Jagielski class ConfigurationControllerBroadcaster 49*b1cdbd2cSJim Jagielski { 50*b1cdbd2cSJim Jagielski public: 51*b1cdbd2cSJim Jagielski /** The given controller is used as origin of thrown exceptions. 52*b1cdbd2cSJim Jagielski */ 53*b1cdbd2cSJim Jagielski ConfigurationControllerBroadcaster ( 54*b1cdbd2cSJim Jagielski const css::uno::Reference< 55*b1cdbd2cSJim Jagielski css::drawing::framework::XConfigurationController>& rxController); 56*b1cdbd2cSJim Jagielski 57*b1cdbd2cSJim Jagielski /** Add a listener for one type of event. When one listener is 58*b1cdbd2cSJim Jagielski interested in more than one event type this method has to be called 59*b1cdbd2cSJim Jagielski once for every event type. Alternatively it can register as 60*b1cdbd2cSJim Jagielski universal listener that will be called for all event types. 61*b1cdbd2cSJim Jagielski @param rxListener 62*b1cdbd2cSJim Jagielski A valid reference to a listener. 63*b1cdbd2cSJim Jagielski @param rsEventType 64*b1cdbd2cSJim Jagielski The type of event that the listener will be called for. The 65*b1cdbd2cSJim Jagielski empty string is a special value in that the listener will be 66*b1cdbd2cSJim Jagielski called for all event types. 67*b1cdbd2cSJim Jagielski @param rUserData 68*b1cdbd2cSJim Jagielski This object is passed to the listener whenever it is called for 69*b1cdbd2cSJim Jagielski the specified event type. For different event types different 70*b1cdbd2cSJim Jagielski user data objects can be provided. 71*b1cdbd2cSJim Jagielski @throws IllegalArgumentException 72*b1cdbd2cSJim Jagielski when an empty listener reference is given. 73*b1cdbd2cSJim Jagielski */ 74*b1cdbd2cSJim Jagielski void AddListener( 75*b1cdbd2cSJim Jagielski const css::uno::Reference< 76*b1cdbd2cSJim Jagielski css::drawing::framework::XConfigurationChangeListener>& rxListener, 77*b1cdbd2cSJim Jagielski const ::rtl::OUString& rsEventType, 78*b1cdbd2cSJim Jagielski const css::uno::Any& rUserData); 79*b1cdbd2cSJim Jagielski 80*b1cdbd2cSJim Jagielski /** Remove all references to the given listener. When one listener has 81*b1cdbd2cSJim Jagielski been registered for more than one type of event then it is removed 82*b1cdbd2cSJim Jagielski for all of them. 83*b1cdbd2cSJim Jagielski @param rxListener 84*b1cdbd2cSJim Jagielski A valid reference to a listener. 85*b1cdbd2cSJim Jagielski @throws IllegalArgumentException 86*b1cdbd2cSJim Jagielski when an empty listener reference is given. 87*b1cdbd2cSJim Jagielski */ 88*b1cdbd2cSJim Jagielski void RemoveListener( 89*b1cdbd2cSJim Jagielski const css::uno::Reference< 90*b1cdbd2cSJim Jagielski css::drawing::framework::XConfigurationChangeListener>& rxListener); 91*b1cdbd2cSJim Jagielski 92*b1cdbd2cSJim Jagielski /** Broadcast the given event to all listeners that have been registered 93*b1cdbd2cSJim Jagielski for its type of event as well as all universal listeners. 94*b1cdbd2cSJim Jagielski 95*b1cdbd2cSJim Jagielski When calling a listener results in a DisposedException being thrown 96*b1cdbd2cSJim Jagielski the listener is unregistered automatically. 97*b1cdbd2cSJim Jagielski */ 98*b1cdbd2cSJim Jagielski void NotifyListeners ( 99*b1cdbd2cSJim Jagielski const css::drawing::framework::ConfigurationChangeEvent& rEvent); 100*b1cdbd2cSJim Jagielski 101*b1cdbd2cSJim Jagielski /** This convenience variant of NotifyListeners create the event from 102*b1cdbd2cSJim Jagielski the given arguments. 103*b1cdbd2cSJim Jagielski */ 104*b1cdbd2cSJim Jagielski void NotifyListeners ( 105*b1cdbd2cSJim Jagielski const ::rtl::OUString& rsEventType, 106*b1cdbd2cSJim Jagielski const ::css::uno::Reference<css::drawing::framework::XResourceId>& rxResourceId, 107*b1cdbd2cSJim Jagielski const ::css::uno::Reference<css::drawing::framework::XResource>& rxResourceObject); 108*b1cdbd2cSJim Jagielski 109*b1cdbd2cSJim Jagielski /** Call all listeners and inform them that the 110*b1cdbd2cSJim Jagielski ConfigurationController is being disposed. When this method returns 111*b1cdbd2cSJim Jagielski the list of registered listeners is empty. Further calls to 112*b1cdbd2cSJim Jagielski RemoveListener() are not necessary but do not result in an error. 113*b1cdbd2cSJim Jagielski */ 114*b1cdbd2cSJim Jagielski void DisposeAndClear (void); 115*b1cdbd2cSJim Jagielski 116*b1cdbd2cSJim Jagielski private: 117*b1cdbd2cSJim Jagielski css::uno::Reference< 118*b1cdbd2cSJim Jagielski com::sun::star::drawing::framework::XConfigurationController> mxConfigurationController; 119*b1cdbd2cSJim Jagielski class ListenerDescriptor {public: 120*b1cdbd2cSJim Jagielski css::uno::Reference< 121*b1cdbd2cSJim Jagielski css::drawing::framework::XConfigurationChangeListener> mxListener; 122*b1cdbd2cSJim Jagielski css::uno::Any maUserData; 123*b1cdbd2cSJim Jagielski }; 124*b1cdbd2cSJim Jagielski typedef ::std::vector<ListenerDescriptor> ListenerList; 125*b1cdbd2cSJim Jagielski typedef ::std::hash_map 126*b1cdbd2cSJim Jagielski <rtl::OUString, 127*b1cdbd2cSJim Jagielski ListenerList, 128*b1cdbd2cSJim Jagielski ::comphelper::UStringHash, 129*b1cdbd2cSJim Jagielski ::comphelper::UStringEqual> ListenerMap; 130*b1cdbd2cSJim Jagielski ListenerMap maListenerMap; 131*b1cdbd2cSJim Jagielski 132*b1cdbd2cSJim Jagielski /** Broadcast the given event to all listeners in the given list. 133*b1cdbd2cSJim Jagielski 134*b1cdbd2cSJim Jagielski When calling a listener results in a DisposedException being thrown 135*b1cdbd2cSJim Jagielski the listener is unregistered automatically. 136*b1cdbd2cSJim Jagielski */ 137*b1cdbd2cSJim Jagielski void NotifyListeners ( 138*b1cdbd2cSJim Jagielski const ListenerList& rList, 139*b1cdbd2cSJim Jagielski const css::drawing::framework::ConfigurationChangeEvent& rEvent); 140*b1cdbd2cSJim Jagielski }; 141*b1cdbd2cSJim Jagielski 142*b1cdbd2cSJim Jagielski 143*b1cdbd2cSJim Jagielski 144*b1cdbd2cSJim Jagielski 145*b1cdbd2cSJim Jagielski } } // end of namespace sd::framework 146*b1cdbd2cSJim Jagielski 147*b1cdbd2cSJim Jagielski #endif 148