xref: /AOO41X/main/comphelper/inc/comphelper/containermultiplexer.hxx (revision 9877b273795ec465a3ce9c15d738eb34c0455705)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef _COMPHELPER_CONTAINERMULTIPLEXER_HXX_
25 #define _COMPHELPER_CONTAINERMULTIPLEXER_HXX_
26 
27 #include <com/sun/star/container/XContainer.hpp>
28 #include <cppuhelper/implbase1.hxx>
29 #include <osl/mutex.hxx>
30 #include "comphelper/comphelperdllapi.h"
31 
32 //.........................................................................
33 namespace comphelper
34 {
35 //.........................................................................
36 
37     class OContainerListenerAdapter;
38     //=====================================================================
39     //= OContainerListener
40     //=====================================================================
41     /** a non-UNO container listener
42         <p>Usefull if you have a non-refcountable class which should act as container listener.<br/>
43         In this case, derive this class from OContainerListener, and create an adapter
44         <type>OContainerListenerAdapter</type> which multiplexes the changes.</p>
45     */
46     class COMPHELPER_DLLPUBLIC OContainerListener
47     {
48         friend class OContainerListenerAdapter;
49     protected:
50         OContainerListenerAdapter*  m_pAdapter;
51         ::osl::Mutex&               m_rMutex;
52 
53     public:
54         OContainerListener(::osl::Mutex& _rMutex);
55         virtual ~OContainerListener();
56 
57         virtual void _elementInserted( const ::com::sun::star::container::ContainerEvent& _rEvent ) throw(::com::sun::star::uno::RuntimeException);
58         virtual void _elementRemoved( const ::com::sun::star::container::ContainerEvent& _Event ) throw(::com::sun::star::uno::RuntimeException);
59         virtual void _elementReplaced( const ::com::sun::star::container::ContainerEvent& _rEvent ) throw(::com::sun::star::uno::RuntimeException);
60         virtual void _disposing(const ::com::sun::star::lang::EventObject& _rSource) throw( ::com::sun::star::uno::RuntimeException);
61 
62     protected:
63         void setAdapter(OContainerListenerAdapter* _pAdapter);
64     };
65 
66     //=====================================================================
67     //= OContainerListenerAdapter
68     //=====================================================================
69     class COMPHELPER_DLLPUBLIC OContainerListenerAdapter
70             :public cppu::WeakImplHelper1< ::com::sun::star::container::XContainerListener >
71     {
72         friend class OContainerListener;
73 
74     protected:
75         ::com::sun::star::uno::Reference< ::com::sun::star::container::XContainer >
76                                 m_xContainer;
77         OContainerListener*     m_pListener;
78         sal_Int32               m_nLockCount;
79 
80         virtual ~OContainerListenerAdapter();
81 
82     public:
83         OContainerListenerAdapter(OContainerListener* _pListener,
84             const  ::com::sun::star::uno::Reference< ::com::sun::star::container::XContainer >& _rxContainer);
85 
86         // XEventListener
87         virtual void SAL_CALL disposing( const  ::com::sun::star::lang::EventObject& Source ) throw( ::com::sun::star::uno::RuntimeException);
88 
89         // XContainerListener
90         virtual void SAL_CALL elementInserted( const ::com::sun::star::container::ContainerEvent& Event ) throw(::com::sun::star::uno::RuntimeException);
91         virtual void SAL_CALL elementRemoved( const ::com::sun::star::container::ContainerEvent& Event ) throw(::com::sun::star::uno::RuntimeException);
92         virtual void SAL_CALL elementReplaced( const ::com::sun::star::container::ContainerEvent& Event ) throw(::com::sun::star::uno::RuntimeException);
93 
94         // locking the multiplexer
95         void        lock();
96         void        unlock();
locked() const97         sal_Int32   locked() const { return m_nLockCount; }
98 
99         /// dispose the object. No multiplexing anymore
100         void        dispose();
101 
102         const ::com::sun::star::uno::Reference< ::com::sun::star::container::XContainer >&
getContainer() const103                     getContainer() const { return m_xContainer; }
104     };
105 
106 //.........................................................................
107 }   // namespace dbaui
108 //.........................................................................
109 
110 #endif // _COMPHELPER_CONTAINERMULTIPLEXER_HXX_
111 
112