summaryrefslogtreecommitdiff
path: root/framework/source
diff options
context:
space:
mode:
authorOliver-Rainer Wittmann <orw@apache.org>2013-04-10 08:20:16 +0000
committerOliver-Rainer Wittmann <orw@apache.org>2013-04-10 08:20:16 +0000
commit0a0a9b32aa5bf1ce2554ad37cbba3c7a105db2b5 (patch)
treef5c258d25d3719c8f719a944043b5220377e9f9c /framework/source
parentbcfee75544246db6788715d98efd6d33c12f933d (diff)
121420: merge sidebar feature from branch into trunk
Notes
Notes: merged as: d50ce284c9674c45acd40d017cc44c260da722a2
Diffstat (limited to 'framework/source')
-rw-r--r--framework/source/register/registerservices.cxx38
-rw-r--r--framework/source/services/ContextChangeEventMultiplexer.cxx389
-rw-r--r--framework/source/services/EventMultiplexer.cxx270
3 files changed, 662 insertions, 35 deletions
diff --git a/framework/source/register/registerservices.cxx b/framework/source/register/registerservices.cxx
index d8cfd95c1eff..813cf48981c6 100644
--- a/framework/source/register/registerservices.cxx
+++ b/framework/source/register/registerservices.cxx
@@ -53,26 +53,14 @@
#include <services/tabwindowservice.hxx>
#include <services/frame.hxx>
#include <services/modulemanager.hxx>
-//#include <dispatch/oxt_handler.hxx>
#include <jobs/jobexecutor.hxx>
-//#include <recording/dispatchrecordersupplier.hxx>
-//#include <recording/dispatchrecorder.hxx>
-//#include <dispatch/mailtodispatcher.hxx>
-//#include <dispatch/servicehandler.hxx>
#include <jobs/jobdispatch.hxx>
#include <services/backingcomp.hxx>
-//#include <services/dispatchhelper.hxx>
#include <services/layoutmanager.hxx>
-//#include <services/license.hxx>
#include <uifactory/uielementfactorymanager.hxx>
#include <uifactory/popupmenucontrollerfactory.hxx>
-//#include <uielement/fontmenucontroller.hxx>
-//#include <uielement/fontsizemenucontroller.hxx>
#include <uielement/objectmenucontroller.hxx>
-//#include <uielement/headermenucontroller.hxx>
-//#include <uielement/footermenucontroller.hxx>
#include <uielement/controlmenucontroller.hxx>
-//#include <uielement/macrosmenucontroller.hxx>
#include <uielement/uicommanddescription.hxx>
#include <uiconfiguration/uiconfigurationmanager.hxx>
#include <uiconfiguration/moduleuicfgsupplier.hxx>
@@ -84,7 +72,6 @@
#include <uifactory/toolboxfactory.hxx>
#include <uifactory/addonstoolboxfactory.hxx>
#include "uiconfiguration/windowstateconfiguration.hxx"
-//#include <uielement/toolbarsmenucontroller.hxx>
#include "uifactory/toolbarcontrollerfactory.hxx"
#include "uifactory/statusbarcontrollerfactory.hxx"
#include <services/autorecovery.hxx>
@@ -93,42 +80,27 @@
#include <uifactory/statusbarfactory.hxx>
#include <uiconfiguration/uicategorydescription.hxx>
#include <services/sessionlistener.hxx>
-//#include <uielement/newmenucontroller.hxx>
#include <services/taskcreatorsrv.hxx>
-//#include <services/uriabbreviation.hxx>
-
#include <uielement/langselectionstatusbarcontroller.hxx>
-//#include <uielement/langselectionmenucontroller.hxx>
#include <uiconfiguration/imagemanager.hxx>
#include <uifactory/windowcontentfactorymanager.hxx>
#include <services/substitutepathvars.hxx>
#include <services/pathsettings.hxx>
+#include <services/ContextChangeEventMultiplexer.hxx>
COMPONENTGETIMPLEMENTATIONENVIRONMENT
COMPONENTGETFACTORY ( IFFACTORY( ::framework::URLTransformer ) else
IFFACTORY( ::framework::Desktop ) else
IFFACTORY( ::framework::Frame ) else
- //IFFACTORY( ::framework::Oxt_Handler ) else
IFFACTORY( ::framework::JobExecutor ) else
- //IFFACTORY( ::framework::DispatchRecorderSupplier ) else
- //IFFACTORY( ::framework::DispatchRecorder ) else
- //IFFACTORY( ::framework::MailToDispatcher ) else
- //IFFACTORY( ::framework::ServiceHandler ) else
IFFACTORY( ::framework::JobDispatch ) else
IFFACTORY( ::framework::BackingComp ) else
- //IFFACTORY( ::framework::DispatchHelper ) else
IFFACTORY( ::framework::LayoutManager ) else
- //IFFACTORY( ::framework::License ) else
IFFACTORY( ::framework::UIElementFactoryManager ) else
IFFACTORY( ::framework::PopupMenuControllerFactory ) else
- //IFFACTORY( ::framework::FontMenuController ) else
- //IFFACTORY( ::framework::FontSizeMenuController ) else
IFFACTORY( ::framework::ObjectMenuController ) else
- //IFFACTORY( ::framework::HeaderMenuController ) else
- //IFFACTORY( ::framework::FooterMenuController ) else
IFFACTORY( ::framework::ControlMenuController ) else
- //IFFACTORY( ::framework::MacrosMenuController ) else
IFFACTORY( ::framework::UICommandDescription ) else
IFFACTORY( ::framework::ModuleManager ) else
IFFACTORY( ::framework::UIConfigurationManager ) else
@@ -142,7 +114,6 @@ COMPONENTGETFACTORY ( IFFACTORY( ::framework::URLTransformer
IFFACTORY( ::framework::AddonsToolBoxFactory ) else
IFFACTORY( ::framework::WindowStateConfiguration ) else
IFFACTORY( ::framework::ToolbarControllerFactory ) else
- //IFFACTORY( ::framework::ToolbarsMenuController ) else
IFFACTORY( ::framework::AutoRecovery ) else
IFFACTORY( ::framework::StatusIndicatorFactory ) else
IFFACTORY( ::framework::RecentFilesMenuController ) else
@@ -152,15 +123,12 @@ COMPONENTGETFACTORY ( IFFACTORY( ::framework::URLTransformer
IFFACTORY( ::framework::StatusbarControllerFactory ) else
IFFACTORY( ::framework::SessionListener ) else
IFFACTORY( ::framework::TaskCreatorService ) else
- //IFFACTORY( ::framework::NewMenuController ) else
- //IFFACTORY( ::framework::UriAbbreviation ) else
- //IFFACTORY( ::framework::PopupMenuDispatcher ) else
IFFACTORY( ::framework::ImageManager ) else
IFFACTORY( ::framework::LangSelectionStatusbarController ) else
- //IFFACTORY( ::framework::LanguageSelectionMenuController ) else
IFFACTORY( ::framework::WindowContentFactoryManager ) else
IFFACTORY( ::framework::TabWindowService ) else
IFFACTORY( ::framework::SubstitutePathVariables ) else
- IFFACTORY( ::framework::PathSettings )
+ IFFACTORY( ::framework::PathSettings ) else
+ IFFACTORY( ::framework::ContextChangeEventMultiplexer )
)
diff --git a/framework/source/services/ContextChangeEventMultiplexer.cxx b/framework/source/services/ContextChangeEventMultiplexer.cxx
new file mode 100644
index 000000000000..f3861a607d10
--- /dev/null
+++ b/framework/source/services/ContextChangeEventMultiplexer.cxx
@@ -0,0 +1,389 @@
+/**************************************************************
+ *
+ * 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/ContextChangeEventMultiplexer.hxx"
+#include "services.h"
+
+using ::rtl::OUString;
+
+#define A2S(s) ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(s))
+
+using namespace css;
+using namespace cssu;
+
+namespace framework {
+
+#define IMPLEMENTATION_NAME "org.apache.openoffice.comp.framework.ContextChangeEventMultiplexer"
+#define SERVICE_NAME "com.sun.star.ui.ContextChangeEventMultiplexer"
+#define SINGLETON_NAME "org.apache.openoffice.comp.framework.ContextChangeEventMultiplexerSigleton"
+
+
+ContextChangeEventMultiplexer::ContextChangeEventMultiplexer (
+ const cssu::Reference<cssu::XComponentContext>& rxContext)
+ : ContextChangeEventMultiplexerInterfaceBase(m_aMutex),
+ maListeners()
+{
+ (void)rxContext;
+}
+
+
+
+
+ContextChangeEventMultiplexer::~ContextChangeEventMultiplexer (void)
+{
+}
+
+
+
+
+void SAL_CALL ContextChangeEventMultiplexer::disposing (void)
+{
+ ListenerMap aListeners;
+ aListeners.swap(maListeners);
+
+ cssu::Reference<cssu::XInterface> xThis (static_cast<XWeak*>(this));
+ css::lang::EventObject aEvent (xThis);
+ for (ListenerMap::const_iterator iContainer(aListeners.begin()), iEnd(aListeners.end());
+ iContainer!=iEnd;
+ ++iContainer)
+ {
+ // Unregister from the focus object.
+ Reference<lang::XComponent> xComponent (iContainer->first, UNO_QUERY);
+ if (xComponent.is())
+ xComponent->removeEventListener(this);
+
+ // Tell all listeners that we are being disposed.
+ const FocusDescriptor& rFocusDescriptor (iContainer->second);
+ for (ListenerContainer::const_iterator
+ iListener(rFocusDescriptor.maListeners.begin()),
+ iContainerEnd(rFocusDescriptor.maListeners.end());
+ iListener!=iContainerEnd;
+ ++iListener)
+ {
+ (*iListener)->disposing(aEvent);
+ }
+ }
+}
+
+
+
+
+// XContextChangeEventMultiplexer
+
+void SAL_CALL ContextChangeEventMultiplexer::addContextChangeEventListener (
+ const cssu::Reference<css::ui::XContextChangeEventListener>& 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);
+
+ FocusDescriptor* pFocusDescriptor = GetFocusDescriptor(rxEventFocus, true);
+ if (pFocusDescriptor != NULL)
+ {
+ ListenerContainer& rContainer (pFocusDescriptor->maListeners);
+ 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);
+ }
+ }
+
+ // Send out an initial event that informs the new listener about
+ // the current context.
+ if (rxEventFocus.is() && pFocusDescriptor!=NULL)
+ {
+ css::ui::ContextChangeEventObject aEvent (
+ NULL,
+ pFocusDescriptor->msCurrentApplicationName,
+ pFocusDescriptor->msCurrentContextName);
+ rxListener->notifyContextChangeEvent(aEvent);
+ }
+}
+
+
+
+
+void SAL_CALL ContextChangeEventMultiplexer::removeContextChangeEventListener (
+ const cssu::Reference<css::ui::XContextChangeEventListener>& 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);
+
+ FocusDescriptor* pFocusDescriptor = GetFocusDescriptor(rxEventFocus, false);
+ if (pFocusDescriptor != NULL)
+ {
+ ListenerContainer& rContainer (pFocusDescriptor->maListeners);
+ const ListenerContainer::iterator iListener (
+ ::std::find(rContainer.begin(), rContainer.end(), rxListener));
+ if (iListener != rContainer.end())
+ {
+ rContainer.erase(iListener);
+
+ // We hold on to the focus descriptor even when the last listener has been removed.
+ // This allows us to keep track of the current context and send it to new listeners.
+ }
+ }
+
+}
+
+
+
+
+void SAL_CALL ContextChangeEventMultiplexer::removeAllContextChangeEventListeners (
+ const cssu::Reference<css::ui::XContextChangeEventListener>& 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.maListeners.begin(), iContainer->second.maListeners.end(), rxListener));
+ if (iListener != iContainer->second.maListeners.end())
+ {
+ iContainer->second.maListeners.erase(iListener);
+
+ // We hold on to the focus descriptor even when the last listener has been removed.
+ // This allows us to keep track of the current context and send it to new listeners.
+ }
+ }
+}
+
+
+
+
+void SAL_CALL ContextChangeEventMultiplexer::broadcastContextChangeEvent (
+ const css::ui::ContextChangeEventObject& rEventObject,
+ const cssu::Reference<cssu::XInterface>& rxEventFocus)
+ throw(cssu::RuntimeException)
+{
+ // Remember the current context.
+ if (rxEventFocus.is())
+ {
+ FocusDescriptor* pFocusDescriptor = GetFocusDescriptor(rxEventFocus, true);
+ if (pFocusDescriptor != NULL)
+ {
+ pFocusDescriptor->msCurrentApplicationName = rEventObject.ApplicationName;
+ pFocusDescriptor->msCurrentContextName = rEventObject.ContextName;
+ }
+ }
+
+ BroadcastEventToSingleContainer(rEventObject, rxEventFocus);
+ if (rxEventFocus.is())
+ BroadcastEventToSingleContainer(rEventObject, NULL);
+}
+
+
+
+
+void ContextChangeEventMultiplexer::BroadcastEventToSingleContainer (
+ const css::ui::ContextChangeEventObject& rEventObject,
+ const cssu::Reference<cssu::XInterface>& rxEventFocus)
+{
+ FocusDescriptor* pFocusDescriptor = GetFocusDescriptor(rxEventFocus, false);
+ if (pFocusDescriptor != NULL)
+ {
+ // Create a copy of the listener container to avoid problems
+ // when one of the called listeners calls add... or remove...
+ ListenerContainer aContainer (pFocusDescriptor->maListeners);
+ for (ListenerContainer::const_iterator
+ iListener(aContainer.begin()),
+ iEnd(aContainer.end());
+ iListener!=iEnd;
+ ++iListener)
+ {
+ (*iListener)->notifyContextChangeEvent(rEventObject);
+ }
+ }
+}
+
+
+
+
+ContextChangeEventMultiplexer::FocusDescriptor* ContextChangeEventMultiplexer::GetFocusDescriptor (
+ const cssu::Reference<cssu::XInterface>& rxEventFocus,
+ const bool bCreateWhenMissing)
+{
+ ListenerMap::iterator iDescriptor (maListeners.find(rxEventFocus));
+ if (iDescriptor == maListeners.end() && bCreateWhenMissing)
+ {
+ // Listen for the focus being disposed.
+ Reference<lang::XComponent> xComponent (rxEventFocus, UNO_QUERY);
+ if (xComponent.is())
+ xComponent->addEventListener(this);
+
+ // Create a new listener container for the event focus.
+ iDescriptor = maListeners.insert(
+ ListenerMap::value_type(
+ rxEventFocus,
+ FocusDescriptor())).first;
+ }
+ if (iDescriptor != maListeners.end())
+ return &iDescriptor->second;
+ else
+ return NULL;
+}
+
+
+
+
+// XSingleComponentFactory
+
+cssu::Reference<cssu::XInterface> SAL_CALL ContextChangeEventMultiplexer::createInstanceWithContext (
+ const cssu::Reference<cssu::XComponentContext>& rxContext)
+ throw (cssu::Exception, cssu::RuntimeException)
+{
+ (void)rxContext;
+ return cssu::Reference<cssu::XInterface>();
+}
+
+
+
+
+cssu::Reference<cssu::XInterface > SAL_CALL ContextChangeEventMultiplexer::createInstanceWithArgumentsAndContext (
+ const cssu::Sequence<cssu::Any>& rArguments,
+ const cssu::Reference<cssu::XComponentContext>& rxContext)
+ throw (cssu::Exception, cssu::RuntimeException)
+{
+ (void)rArguments;
+ (void)rxContext;
+ return cssu::Reference<cssu::XInterface>();
+}
+
+
+
+
+// XServiceInfo
+
+::rtl::OUString SAL_CALL ContextChangeEventMultiplexer::getImplementationName (void)
+ throw(cssu::RuntimeException)
+{
+ return impl_getStaticImplementationName();
+}
+
+
+
+
+
+sal_Bool SAL_CALL ContextChangeEventMultiplexer::supportsService (
+ const ::rtl::OUString& rsServiceName)
+ throw (cssu::RuntimeException)
+{
+ return ::comphelper::findValue(static_GetSupportedServiceNames(), rsServiceName, sal_True).getLength() != 0;
+}
+
+
+
+
+cssu::Sequence<OUString> SAL_CALL ContextChangeEventMultiplexer::getSupportedServiceNames (void)
+ throw (cssu::RuntimeException)
+{
+ return static_GetSupportedServiceNames();
+}
+
+
+
+
+void SAL_CALL ContextChangeEventMultiplexer::disposing (
+ const css::lang::EventObject& rEvent)
+ throw (cssu::RuntimeException)
+{
+ ListenerMap::iterator iDescriptor (maListeners.find(rEvent.Source));
+
+ if (iDescriptor == maListeners.end())
+ {
+ OSL_ASSERT(iDescriptor != maListeners.end());
+ return;
+ }
+
+ // Should we notify the remaining listeners?
+
+ maListeners.erase(iDescriptor);
+}
+
+
+
+
+// Local and static methods.
+
+OUString SAL_CALL ContextChangeEventMultiplexer::impl_getStaticImplementationName (void)
+{
+ return A2S(IMPLEMENTATION_NAME);
+}
+
+
+
+
+cssu::Sequence<OUString> SAL_CALL ContextChangeEventMultiplexer::static_GetSupportedServiceNames (void)
+{
+ cssu::Sequence<OUString> aServiceNames (2);
+ aServiceNames[0] = A2S(SERVICE_NAME);
+ aServiceNames[1] = A2S(SINGLETON_NAME);
+ return aServiceNames;
+}
+
+
+
+
+cssu::Reference<cssu::XInterface> ContextChangeEventMultiplexer::impl_createFactory (
+ const cssu::Reference<cssl::XMultiServiceFactory>& rxServiceManager)
+{
+ (void)rxServiceManager;
+ return cppu::createSingleComponentFactory(
+ ContextChangeEventMultiplexer::static_CreateInstance,
+ ContextChangeEventMultiplexer::impl_getStaticImplementationName(),
+ ContextChangeEventMultiplexer::static_GetSupportedServiceNames()
+ );
+}
+
+
+
+
+cssu::Reference<cssu::XInterface> SAL_CALL ContextChangeEventMultiplexer::static_CreateInstance (
+ const cssu::Reference<cssu::XComponentContext>& rxComponentContext)
+ throw (cssu::Exception)
+{
+ ContextChangeEventMultiplexer* pObject = new ContextChangeEventMultiplexer(rxComponentContext);
+ cssu::Reference<cssu::XInterface> xService (static_cast<XWeak*>(pObject), cssu::UNO_QUERY);
+ return xService;
+}
+
+} // end of namespace framework
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