diff options
Diffstat (limited to 'framework/source/services/EventMultiplexer.cxx')
-rw-r--r-- | framework/source/services/EventMultiplexer.cxx | 270 |
1 files changed, 270 insertions, 0 deletions
diff --git a/framework/source/services/EventMultiplexer.cxx b/framework/source/services/EventMultiplexer.cxx new file mode 100644 index 000000000000..9f5b05dabe16 --- /dev/null +++ b/framework/source/services/EventMultiplexer.cxx @@ -0,0 +1,270 @@ +/************************************************************** + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + *************************************************************/ + +#include "precompiled_framework.hxx" + +#include "services/EventMultiplexer.hxx" +#include "services.h" + +using ::rtl::OUString; + +#define A2S(s) ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(s)) + +namespace framework { + +#define IMPLEMENTATION_NAME "org.apache.openoffice.comp.framework.EventMultiplexer" +#define SERVICE_NAME "com.sun.star.ui.ContextChangeEventMultiplexer" +#define SINGLETON_NAME "org.apache.openoffice.comp.framework.EventMultiplexer" + + +EventMultiplexer::EventMultiplexer (const cssu::Reference<css::uno::XComponentContext>& rxContext) + : EventMultiplexerInterfaceBase(m_aMutex), + maListeners() +{ + (void)rxContext; +} + + + + +EventMultiplexer::~EventMultiplexer (void) +{ + maListeners.clear(); +} + + + + +// XEventMultiplexer + +void SAL_CALL EventMultiplexer::addEventListener ( + const cssu::Reference<css::util::XEventListener>& rxListener, + const cssu::Reference<cssu::XInterface>& rxEventFocus) + throw(cssu::RuntimeException,cssl::IllegalArgumentException) +{ + if ( ! rxListener.is()) + throw css::lang::IllegalArgumentException(A2S("can not add an empty reference"), static_cast<XWeak*>(this), 0); + + ListenerMap::iterator iListenerContainer (maListeners.find(rxEventFocus)); + if (iListenerContainer == maListeners.end()) + { + // Create a new listener container for the event focus. + iListenerContainer = maListeners.insert( + ListenerMap::value_type( + rxEventFocus, + ListenerContainer())).first; + } + if (iListenerContainer != maListeners.end()) + { + ListenerContainer& rContainer (iListenerContainer->second); + if (::std::find(rContainer.begin(), rContainer.end(), rxListener) == rContainer.end()) + rContainer.push_back(rxListener); + else + { + // The listener was added for the same event focus + // previously. That is an error. + throw cssl::IllegalArgumentException(A2S("listener added twice"), static_cast<XWeak*>(this), 0); + } + } +} + + + + +void SAL_CALL EventMultiplexer::removeEventListener ( + const cssu::Reference<css::util::XEventListener>& rxListener, + const cssu::Reference<cssu::XInterface>& rxEventFocus) + throw(cssu::RuntimeException,cssl::IllegalArgumentException) +{ + if ( ! rxListener.is()) + throw cssl::IllegalArgumentException(A2S("can not remove an empty reference"), static_cast<XWeak*>(this), 0); + + ListenerMap::iterator iListenerContainer (maListeners.find(rxEventFocus)); + if (iListenerContainer != maListeners.end()) + { + ListenerContainer& rContainer (iListenerContainer->second); + const ListenerContainer::iterator iListener (::std::find(rContainer.begin(), rContainer.end(), rxListener)); + if (iListener != rContainer.end()) + rContainer.erase(iListener); + } + +} + + + + +void SAL_CALL EventMultiplexer::removeAllEventListeners ( + const cssu::Reference<css::util::XEventListener>& rxListener) + throw(cssu::RuntimeException,cssl::IllegalArgumentException) +{ + if ( ! rxListener.is()) + throw cssl::IllegalArgumentException(A2S("can not remove an empty reference"), static_cast<XWeak*>(this), 0); + + for (ListenerMap::iterator + iContainer(maListeners.begin()), + iEnd(maListeners.end()); + iContainer!=iEnd; + ++iContainer) + { + const ListenerContainer::iterator iListener (::std::find(iContainer->second.begin(), iContainer->second.end(), rxListener)); + if (iListener != iContainer->second.end()) + iContainer->second.erase(iListener); + } +} + + + + + +void SAL_CALL EventMultiplexer::broadcastEvent ( + const cssl::EventObject& rEventObject, + const cssu::Reference<cssu::XInterface>& rxEventFocus) + throw(cssu::RuntimeException) +{ + BroadcastEventToSingleContainer(rEventObject, rxEventFocus); + if (rxEventFocus.is()) + BroadcastEventToSingleContainer(rEventObject, NULL); +} + + + + +void EventMultiplexer::BroadcastEventToSingleContainer ( + const cssl::EventObject& rEventObject, + const cssu::Reference<cssu::XInterface>& rxEventFocus) +{ + ListenerMap::iterator iListenerContainer (maListeners.find(rxEventFocus)); + if (iListenerContainer != maListeners.end()) + { + // Create a copy of the listener container to avoid problems + // when one of the called listeners calls add... or remove... + ListenerContainer aContainer (iListenerContainer->second); + for (ListenerContainer::const_iterator + iListener(aContainer.begin()), + iEnd(aContainer.end()); + iListener!=iEnd; + ++iListener) + { + (*iListener)->notifyEvent(rEventObject); + } + } +} + + + + +// XSingleComponentFactory +cssu::Reference<cssu::XInterface> SAL_CALL EventMultiplexer::createInstanceWithContext ( + const cssu::Reference<cssu::XComponentContext>& rxContext) + throw (cssu::Exception, cssu::RuntimeException) +{ + return cssu::Reference<cssu::XInterface>(); +} + + + + +cssu::Reference<cssu::XInterface > SAL_CALL EventMultiplexer::createInstanceWithArgumentsAndContext ( + const cssu::Sequence<cssu::Any>& rArguments, + const cssu::Reference<cssu::XComponentContext>& rxContext) + throw (cssu::Exception, cssu::RuntimeException) +{ + return cssu::Reference<cssu::XInterface>(); +} + + + + +// XServiceInfo + +::rtl::OUString SAL_CALL EventMultiplexer::getImplementationName (void) + throw(cssu::RuntimeException) +{ + return impl_getStaticImplementationName(); +} + + + + + +sal_Bool SAL_CALL EventMultiplexer::supportsService ( + const ::rtl::OUString& rsServiceName) + throw (cssu::RuntimeException) +{ + return ::comphelper::findValue(static_GetSupportedServiceNames(), rsServiceName, sal_True).getLength() != 0; +} + + + + +cssu::Sequence<OUString> SAL_CALL EventMultiplexer::getSupportedServiceNames (void) + throw (cssu::RuntimeException) +{ + return static_GetSupportedServiceNames(); +} + + + + +// Local and static methods. + +OUString SAL_CALL EventMultiplexer::impl_getStaticImplementationName (void) +{ + return A2S(IMPLEMENTATION_NAME); +} + + + + +cssu::Sequence<OUString> SAL_CALL EventMultiplexer::static_GetSupportedServiceNames (void) +{ + cssu::Sequence<OUString> aServiceNames (2); + aServiceNames[0] = A2S(SERVICE_NAME); + aServiceNames[1] = A2S(SINGLETON_NAME); + return aServiceNames; +} + + + + +cssu::Reference<cssu::XInterface> EventMultiplexer::impl_createFactory ( + const cssu::Reference<cssl::XMultiServiceFactory>& rxServiceManager) +{ + return cppu::createSingleComponentFactory( + EventMultiplexer::static_CreateInstance, + EventMultiplexer::impl_getStaticImplementationName(), + EventMultiplexer::static_GetSupportedServiceNames() + ); +} + + + + +cssu::Reference<cssu::XInterface> SAL_CALL EventMultiplexer::static_CreateInstance ( + const cssu::Reference<cssu::XComponentContext>& rxComponentContext) + throw (cssu::Exception) +{ + EventMultiplexer* pObject = new EventMultiplexer(rxComponentContext); + cssu::Reference<cssu::XInterface> xService (static_cast<XWeak*>(pObject), cssu::UNO_QUERY); + return xService; +} + +} // end of namespace framework |