122de8995SAndre Fischer /**************************************************************
222de8995SAndre Fischer  *
322de8995SAndre Fischer  * Licensed to the Apache Software Foundation (ASF) under one
422de8995SAndre Fischer  * or more contributor license agreements.  See the NOTICE file
522de8995SAndre Fischer  * distributed with this work for additional information
622de8995SAndre Fischer  * regarding copyright ownership.  The ASF licenses this file
722de8995SAndre Fischer  * to you under the Apache License, Version 2.0 (the
822de8995SAndre Fischer  * "License"); you may not use this file except in compliance
922de8995SAndre Fischer  * with the License.  You may obtain a copy of the License at
1022de8995SAndre Fischer  *
1122de8995SAndre Fischer  *   http://www.apache.org/licenses/LICENSE-2.0
1222de8995SAndre Fischer  *
1322de8995SAndre Fischer  * Unless required by applicable law or agreed to in writing,
1422de8995SAndre Fischer  * software distributed under the License is distributed on an
1522de8995SAndre Fischer  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
1622de8995SAndre Fischer  * KIND, either express or implied.  See the License for the
1722de8995SAndre Fischer  * specific language governing permissions and limitations
1822de8995SAndre Fischer  * under the License.
1922de8995SAndre Fischer  *
2022de8995SAndre Fischer  *************************************************************/
2122de8995SAndre Fischer 
2222de8995SAndre Fischer 
2322de8995SAndre Fischer 
2422de8995SAndre Fischer #ifndef __FRAMEWORK_SERVICES_CONTEXT_CHANGE_EVENT_MULTIPLEXER_HXX_
2522de8995SAndre Fischer #define __FRAMEWORK_SERVICES_CONTEXT_CHANGE_EVENT_MULTIPLEXER_HXX_
2622de8995SAndre Fischer 
2722de8995SAndre Fischer #include <com/sun/star/ui/XContextChangeEventMultiplexer.hpp>
2822de8995SAndre Fischer 
29*7a32b0c8SAndre Fischer #include <cppuhelper/compbase4.hxx>
3022de8995SAndre Fischer #include <cppuhelper/basemutex.hxx>
3122de8995SAndre Fischer 
3222de8995SAndre Fischer #include "macros/xserviceinfo.hxx"
3322de8995SAndre Fischer 
3495a18594SAndre Fischer #include <map>
3595a18594SAndre Fischer #include <boost/noncopyable.hpp>
3695a18594SAndre Fischer 
3795a18594SAndre Fischer 
3822de8995SAndre Fischer namespace
3922de8995SAndre Fischer {
40*7a32b0c8SAndre Fischer     typedef ::cppu::WeakComponentImplHelper4 <
4122de8995SAndre Fischer         css::ui::XContextChangeEventMultiplexer,
4222de8995SAndre Fischer         css::lang::XSingleComponentFactory,
43*7a32b0c8SAndre Fischer         css::lang::XServiceInfo,
44*7a32b0c8SAndre Fischer         css::lang::XEventListener
4522de8995SAndre Fischer         > ContextChangeEventMultiplexerInterfaceBase;
4622de8995SAndre Fischer }
4722de8995SAndre Fischer 
4822de8995SAndre Fischer 
4922de8995SAndre Fischer namespace css = ::com::sun::star;
5022de8995SAndre Fischer namespace cssu = ::com::sun::star::uno;
5122de8995SAndre Fischer namespace cssl = ::com::sun::star::lang;
5222de8995SAndre Fischer 
5322de8995SAndre Fischer namespace framework {
5422de8995SAndre Fischer 
5522de8995SAndre Fischer class ContextChangeEventMultiplexer
5622de8995SAndre Fischer     : private ::boost::noncopyable,
5722de8995SAndre Fischer       private ::cppu::BaseMutex,
5822de8995SAndre Fischer       public ContextChangeEventMultiplexerInterfaceBase
5922de8995SAndre Fischer {
6022de8995SAndre Fischer public:
6122de8995SAndre Fischer     ContextChangeEventMultiplexer(const cssu::Reference<css::uno::XComponentContext>& rxContext);
6222de8995SAndre Fischer     virtual ~ContextChangeEventMultiplexer (void);
63b9e67834SAndre Fischer 
64b9e67834SAndre Fischer     virtual void SAL_CALL disposing (void);
65b9e67834SAndre Fischer 
6622de8995SAndre Fischer     // XContextChangeEventMultiplexer
6722de8995SAndre Fischer     virtual void SAL_CALL addContextChangeEventListener (
6822de8995SAndre Fischer         const cssu::Reference<css::ui::XContextChangeEventListener>& rxListener,
6922de8995SAndre Fischer         const cssu::Reference<cssu::XInterface>& rxEventFocus)
7022de8995SAndre Fischer         throw(cssu::RuntimeException, cssl::IllegalArgumentException);
7122de8995SAndre Fischer     virtual void SAL_CALL removeContextChangeEventListener (
7222de8995SAndre Fischer         const cssu::Reference<css::ui::XContextChangeEventListener>& rxListener,
7322de8995SAndre Fischer         const cssu::Reference<cssu::XInterface>& rxEventFocus)
7422de8995SAndre Fischer         throw(cssu::RuntimeException, cssl::IllegalArgumentException);
7522de8995SAndre Fischer     virtual void SAL_CALL removeAllContextChangeEventListeners (
7622de8995SAndre Fischer         const cssu::Reference<css::ui::XContextChangeEventListener>& rxListener)
7722de8995SAndre Fischer         throw(cssu::RuntimeException, cssl::IllegalArgumentException);
7822de8995SAndre Fischer     virtual void SAL_CALL broadcastContextChangeEvent (
7922de8995SAndre Fischer         const css::ui::ContextChangeEventObject& rContextChangeEventObject,
8022de8995SAndre Fischer         const cssu::Reference<cssu::XInterface>& rxEventFocus)
8122de8995SAndre Fischer         throw(cssu::RuntimeException);
8222de8995SAndre Fischer 
8322de8995SAndre Fischer     // XSingleComponentFactory
8422de8995SAndre Fischer     virtual cssu::Reference<cssu::XInterface> SAL_CALL createInstanceWithContext (
8522de8995SAndre Fischer         const cssu::Reference<cssu::XComponentContext>& rxContext)
8622de8995SAndre Fischer         throw (cssu::Exception, cssu::RuntimeException);
8722de8995SAndre Fischer     virtual cssu::Reference<cssu::XInterface > SAL_CALL createInstanceWithArgumentsAndContext (
8822de8995SAndre Fischer         const cssu::Sequence<cssu::Any>& rArguments,
8922de8995SAndre Fischer         const cssu::Reference<cssu::XComponentContext>& rxContext)
9022de8995SAndre Fischer         throw (cssu::Exception, cssu::RuntimeException);
9122de8995SAndre Fischer 
9222de8995SAndre Fischer     // XServiceInfo
9322de8995SAndre Fischer     virtual ::rtl::OUString SAL_CALL getImplementationName (void)
9422de8995SAndre Fischer         throw (cssu::RuntimeException);
9522de8995SAndre Fischer     virtual sal_Bool SAL_CALL supportsService  (
9622de8995SAndre Fischer         const ::rtl::OUString& rsServiceName)
9722de8995SAndre Fischer         throw (cssu::RuntimeException);
9822de8995SAndre Fischer     virtual cssu::Sequence< ::rtl::OUString> SAL_CALL getSupportedServiceNames (void)
9922de8995SAndre Fischer         throw (cssu::RuntimeException);
10022de8995SAndre Fischer 
101*7a32b0c8SAndre Fischer     // XEventListener
102*7a32b0c8SAndre Fischer     virtual void SAL_CALL disposing (
103*7a32b0c8SAndre Fischer         const css::lang::EventObject& rEvent)
104*7a32b0c8SAndre Fischer         throw (cssu::RuntimeException);
105*7a32b0c8SAndre Fischer 
10622de8995SAndre Fischer     static ::rtl::OUString SAL_CALL impl_getStaticImplementationName (void);
10722de8995SAndre Fischer     static cssu::Reference<cssu::XInterface> SAL_CALL impl_createFactory (
10822de8995SAndre Fischer         const cssu::Reference<cssl::XMultiServiceFactory>& xServiceManager);
10922de8995SAndre Fischer 
11022de8995SAndre Fischer private:
11122de8995SAndre Fischer     typedef ::std::vector<cssu::Reference<css::ui::XContextChangeEventListener> > ListenerContainer;
11295a18594SAndre Fischer     class FocusDescriptor
11395a18594SAndre Fischer     {
11495a18594SAndre Fischer     public:
11595a18594SAndre Fischer         ListenerContainer maListeners;
11695a18594SAndre Fischer         ::rtl::OUString msCurrentApplicationName;
11795a18594SAndre Fischer         ::rtl::OUString msCurrentContextName;
11895a18594SAndre Fischer     };
11995a18594SAndre Fischer     typedef ::std::map<cssu::Reference<cssu::XInterface>, FocusDescriptor> ListenerMap;
12022de8995SAndre Fischer     ListenerMap maListeners;
12122de8995SAndre Fischer 
12222de8995SAndre Fischer     /** Notify all listeners in the container that is associated with
12322de8995SAndre Fischer         the given event focus.
12422de8995SAndre Fischer 
12522de8995SAndre Fischer         Typically called twice from broadcastEvent(), once for the
12622de8995SAndre Fischer         given event focus and onece for NULL.
12722de8995SAndre Fischer     */
12822de8995SAndre Fischer     void BroadcastEventToSingleContainer (
12922de8995SAndre Fischer         const css::ui::ContextChangeEventObject& rEventObject,
13022de8995SAndre Fischer         const cssu::Reference<cssu::XInterface>& rxEventFocus);
131*7a32b0c8SAndre Fischer     FocusDescriptor* GetFocusDescriptor (
132*7a32b0c8SAndre Fischer         const cssu::Reference<cssu::XInterface>& rxEventFocus,
133*7a32b0c8SAndre Fischer         const bool bCreateWhenMissing);
134*7a32b0c8SAndre Fischer 
13522de8995SAndre Fischer     static cssu::Sequence< ::rtl::OUString > SAL_CALL static_GetSupportedServiceNames (void);
13622de8995SAndre Fischer     static cssu::Reference<cssu::XInterface> SAL_CALL static_CreateInstance (
13722de8995SAndre Fischer         const cssu::Reference<cssu::XComponentContext>& rxComponentContext)
13822de8995SAndre Fischer         throw (cssu::Exception);
13922de8995SAndre Fischer };
14022de8995SAndre Fischer 
14122de8995SAndre Fischer } // end of namespace framework
14222de8995SAndre Fischer 
14322de8995SAndre Fischer #endif
14422de8995SAndre Fischer 
145