xref: /trunk/main/dbaccess/source/ui/inc/sbamultiplex.hxx (revision 914d351e5f5b84e4342a86d6ab8d4aca7308b9bd)
1*2e2212a7SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*2e2212a7SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*2e2212a7SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*2e2212a7SAndrew Rist  * distributed with this work for additional information
6*2e2212a7SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*2e2212a7SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*2e2212a7SAndrew Rist  * "License"); you may not use this file except in compliance
9*2e2212a7SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*2e2212a7SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*2e2212a7SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*2e2212a7SAndrew Rist  * software distributed under the License is distributed on an
15*2e2212a7SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*2e2212a7SAndrew Rist  * KIND, either express or implied.  See the License for the
17*2e2212a7SAndrew Rist  * specific language governing permissions and limitations
18*2e2212a7SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*2e2212a7SAndrew Rist  *************************************************************/
21*2e2212a7SAndrew Rist 
22*2e2212a7SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir #ifndef _SBA_MULTIPLEX_HXX
25cdf0e10cSrcweir #define _SBA_MULTIPLEX_HXX
26cdf0e10cSrcweir 
27cdf0e10cSrcweir //#ifndef _SDB_TOOLS_HXX
28cdf0e10cSrcweir //#include <sdb/tools.hxx>
29cdf0e10cSrcweir //#endif
30cdf0e10cSrcweir 
31cdf0e10cSrcweir #ifndef _COM_SUN_STAR_BEANS_XVETOABLECHANGELISTENER_HPP_
32cdf0e10cSrcweir #include <com/sun/star/beans/XVetoableChangeListener.hpp>
33cdf0e10cSrcweir #endif
34cdf0e10cSrcweir #ifndef _COM_SUN_STAR_FORM_XUPDATELISTENER_HPP_
35cdf0e10cSrcweir #include <com/sun/star/form/XUpdateListener.hpp>
36cdf0e10cSrcweir #endif
37cdf0e10cSrcweir #ifndef _COM_SUN_STAR_FORM_XERRORLISTENER_HPP_
38cdf0e10cSrcweir #include <com/sun/star/form/XErrorListener.hpp>
39cdf0e10cSrcweir #endif
40cdf0e10cSrcweir #ifndef _COM_SUN_STAR_FORM_XRESTORELISTENER_HPP_
41cdf0e10cSrcweir #include <com/sun/star/form/XRestoreListener.hpp>
42cdf0e10cSrcweir #endif
43cdf0e10cSrcweir #ifndef _COM_SUN_STAR_FORM_XINSERTLISTENER_HPP_
44cdf0e10cSrcweir #include <com/sun/star/form/XInsertListener.hpp>
45cdf0e10cSrcweir #endif
46cdf0e10cSrcweir #ifndef _COM_SUN_STAR_FORM_XDELETELISTENER_HPP_
47cdf0e10cSrcweir #include <com/sun/star/form/XDeleteListener.hpp>
48cdf0e10cSrcweir #endif
49cdf0e10cSrcweir #ifndef _COM_SUN_STAR_FORM_XPOSITIONINGLISTENER_HPP_
50cdf0e10cSrcweir #include <com/sun/star/form/XPositioningListener.hpp>
51cdf0e10cSrcweir #endif
52cdf0e10cSrcweir #ifndef _COM_SUN_STAR_FORM_XDATABASEPARAMETERLISTENER_HPP_
53cdf0e10cSrcweir #include <com/sun/star/form/XDatabaseParameterListener.hpp>
54cdf0e10cSrcweir #endif
55cdf0e10cSrcweir #ifndef _COM_SUN_STAR_FORM_XLOADLISTENER_HPP_
56cdf0e10cSrcweir #include <com/sun/star/form/XLoadListener.hpp>
57cdf0e10cSrcweir #endif
58cdf0e10cSrcweir #ifndef _COM_SUN_STAR_BEANS_XPROPERTYSTATECHANGELISTENER_HPP_
59cdf0e10cSrcweir #include <com/sun/star/beans/XPropertyStateChangeListener.hpp>
60cdf0e10cSrcweir #endif
61cdf0e10cSrcweir #ifndef _COM_SUN_STAR_BEANS_XPROPERTIESCHANGELISTENER_HPP_
62cdf0e10cSrcweir #include <com/sun/star/beans/XPropertiesChangeListener.hpp>
63cdf0e10cSrcweir #endif
64cdf0e10cSrcweir #ifndef _COM_SUN_STAR_BEANS_XPROPERTYCHANGELISTENER_HPP_
65cdf0e10cSrcweir #include <com/sun/star/beans/XPropertyChangeListener.hpp>
66cdf0e10cSrcweir #endif
67cdf0e10cSrcweir #ifndef _COM_SUN_STAR_FORM_XSUBMITLISTENER_HPP_
68cdf0e10cSrcweir #include <com/sun/star/form/XSubmitListener.hpp>
69cdf0e10cSrcweir #endif
70cdf0e10cSrcweir #ifndef _COM_SUN_STAR_FORM_XRESETLISTENER_HPP_
71cdf0e10cSrcweir #include <com/sun/star/form/XResetListener.hpp>
72cdf0e10cSrcweir #endif
73cdf0e10cSrcweir #ifndef _COM_SUN_STAR_UTIL_XREFRESHLISTENER_HPP_
74cdf0e10cSrcweir #include <com/sun/star/util/XRefreshListener.hpp>
75cdf0e10cSrcweir #endif
76cdf0e10cSrcweir #ifndef _COM_SUN_STAR_SDBC_XSQLERRORLISTENER_HPP_
77cdf0e10cSrcweir #include <com/sun/star/sdb/XSQLErrorListener.hpp>
78cdf0e10cSrcweir #endif
79cdf0e10cSrcweir #ifndef _COM_SUN_STAR_SDB_XROWSETAPPROVELISTENER_HPP_
80cdf0e10cSrcweir #include <com/sun/star/sdb/XRowSetApproveListener.hpp>
81cdf0e10cSrcweir #endif
82cdf0e10cSrcweir #ifndef _COM_SUN_STAR_SDBC_XROWSETLISTENER_HPP_
83cdf0e10cSrcweir #include <com/sun/star/sdbc/XRowSetListener.hpp>
84cdf0e10cSrcweir #endif
85cdf0e10cSrcweir #ifndef _COM_SUN_STAR_FRAME_XSTATUSLISTENER_HPP_
86cdf0e10cSrcweir #include <com/sun/star/frame/XStatusListener.hpp>
87cdf0e10cSrcweir #endif
88cdf0e10cSrcweir #ifndef _COMPHELPER_STLTYPES_HXX_
89cdf0e10cSrcweir #include <comphelper/stl_types.hxx>
90cdf0e10cSrcweir #endif
91cdf0e10cSrcweir #ifndef _COMPHELPER_UNO3_HXX_
92cdf0e10cSrcweir #include <comphelper/uno3.hxx>
93cdf0e10cSrcweir #endif
94cdf0e10cSrcweir #ifndef _CPPUHELPER_INTERFACECONTAINER_HXX_
95cdf0e10cSrcweir #include <cppuhelper/interfacecontainer.hxx>
96cdf0e10cSrcweir #endif
97cdf0e10cSrcweir #ifndef _CPPUHELPER_QUERYINTERFACE_HXX_
98cdf0e10cSrcweir #include <cppuhelper/queryinterface.hxx>
99cdf0e10cSrcweir #endif
100cdf0e10cSrcweir #ifndef _CPPUHELPER_WEAK_HXX_
101cdf0e10cSrcweir #include <cppuhelper/weak.hxx>
102cdf0e10cSrcweir #endif
103cdf0e10cSrcweir 
104cdf0e10cSrcweir namespace dbaui
105cdf0e10cSrcweir {
106cdf0e10cSrcweir     //------------------------------------------------------------------
107cdf0e10cSrcweir     // TODO : replace this class if MM provides an WeakSubObject in cppu
108cdf0e10cSrcweir     class OSbaWeakSubObject : public ::cppu::OWeakObject
109cdf0e10cSrcweir     {
110cdf0e10cSrcweir     protected:
111cdf0e10cSrcweir         ::cppu::OWeakObject&    m_rParent;
112cdf0e10cSrcweir 
113cdf0e10cSrcweir     public:
OSbaWeakSubObject(::cppu::OWeakObject & rParent)114cdf0e10cSrcweir         OSbaWeakSubObject(::cppu::OWeakObject& rParent) : m_rParent(rParent) { }
115cdf0e10cSrcweir 
acquire()116cdf0e10cSrcweir         virtual void SAL_CALL acquire() throw() { m_rParent.acquire(); }
release()117cdf0e10cSrcweir         virtual void SAL_CALL release() throw() { m_rParent.release(); }
118cdf0e10cSrcweir     };
119cdf0e10cSrcweir 
120cdf0e10cSrcweir     //------------------------------------------------------------------
121cdf0e10cSrcweir     // declaration of a listener multiplexer class
122cdf0e10cSrcweir     #define BEGIN_DECLARE_LISTENER_MULTIPLEXER(classname, listenerclass)                    \
123cdf0e10cSrcweir     class classname                                                                         \
124cdf0e10cSrcweir             :public OSbaWeakSubObject                                                           \
125cdf0e10cSrcweir             ,public listenerclass                                                           \
126cdf0e10cSrcweir             ,public ::cppu::OInterfaceContainerHelper                                       \
127cdf0e10cSrcweir     {                                                                                       \
128cdf0e10cSrcweir     public:                                                                                 \
129cdf0e10cSrcweir         classname( ::cppu::OWeakObject& rSource,                                            \
130cdf0e10cSrcweir             ::osl::Mutex& rMutex);                                                          \
131cdf0e10cSrcweir         DECLARE_UNO3_DEFAULTS(classname, OSbaWeakSubObject);                                    \
132cdf0e10cSrcweir         virtual ::com::sun::star::uno::Any  SAL_CALL queryInterface(                        \
133cdf0e10cSrcweir             const ::com::sun::star::uno::Type& _rType) throw (::com::sun::star::uno::RuntimeException); \
134cdf0e10cSrcweir                                                                                             \
135cdf0e10cSrcweir         /* ::com::sun::star::lang::XEventListener */                                        \
136cdf0e10cSrcweir         virtual void SAL_CALL disposing(const ::com::sun::star::lang::EventObject& Source) throw(::com::sun::star::uno::RuntimeException);  \
137cdf0e10cSrcweir 
138cdf0e10cSrcweir 
139cdf0e10cSrcweir     #define DECLARE_MULTIPLEXER_VOID_METHOD(methodname, eventtype)                          \
140cdf0e10cSrcweir         virtual void SAL_CALL methodname(const eventtype& e) throw (::com::sun::star::uno::RuntimeException); \
141cdf0e10cSrcweir 
142cdf0e10cSrcweir     #define DECLARE_MULTIPLEXER_BOOL_METHOD(methodname, eventtype)                          \
143cdf0e10cSrcweir         virtual sal_Bool SAL_CALL methodname(const eventtype& e) throw (::com::sun::star::uno::RuntimeException);   \
144cdf0e10cSrcweir 
145cdf0e10cSrcweir 
146cdf0e10cSrcweir     #define END_DECLARE_LISTENER_MULTIPLEXER()                                              \
147cdf0e10cSrcweir     /* resolve ambiguity : both OWeakObject and OInterfaceContainerHelper have these memory operators */    \
148cdf0e10cSrcweir         void * SAL_CALL operator new( size_t size ) throw() { return OSbaWeakSubObject::operator new(size); }   \
149cdf0e10cSrcweir         void SAL_CALL operator delete( void * p ) throw() { OSbaWeakSubObject::operator delete(p); }    \
150cdf0e10cSrcweir     };                                                                                      \
151cdf0e10cSrcweir 
152cdf0e10cSrcweir     //------------------------------------------------------------------
153cdf0e10cSrcweir     // implementation of a listener multiplexer class
154cdf0e10cSrcweir 
155cdf0e10cSrcweir     #define IMPLEMENT_LISTENER_MULTIPLEXER_CORE(classname, listenerclass)                   \
156cdf0e10cSrcweir                                                                                             \
157cdf0e10cSrcweir     /*................................................................*/                    \
158cdf0e10cSrcweir     classname::classname(::cppu::OWeakObject& rSource, ::osl::Mutex& _rMutex)               \
159cdf0e10cSrcweir             :OSbaWeakSubObject(rSource)                                                     \
160cdf0e10cSrcweir             ,OInterfaceContainerHelper(_rMutex)                                             \
161cdf0e10cSrcweir     {                                                                                       \
162cdf0e10cSrcweir     }                                                                                       \
163cdf0e10cSrcweir                                                                                             \
164cdf0e10cSrcweir     ::com::sun::star::uno::Any  SAL_CALL classname::queryInterface(                         \
165cdf0e10cSrcweir         const ::com::sun::star::uno::Type& _rType) throw (::com::sun::star::uno::RuntimeException) \
166cdf0e10cSrcweir     {                                                                                       \
167cdf0e10cSrcweir         ::com::sun::star::uno::Any aReturn =                                                \
168cdf0e10cSrcweir             OSbaWeakSubObject::queryInterface(_rType);                                          \
169cdf0e10cSrcweir         if (!aReturn.hasValue())                                                            \
170cdf0e10cSrcweir             aReturn = ::cppu::queryInterface(_rType,                                        \
171cdf0e10cSrcweir                 static_cast< listenerclass* >(this),                                        \
172cdf0e10cSrcweir                 static_cast< ::com::sun::star::lang::XEventListener* >(static_cast< listenerclass* >(this)) \
173cdf0e10cSrcweir             );                                                                              \
174cdf0e10cSrcweir                                                                                             \
175cdf0e10cSrcweir         return aReturn;                                                                     \
176cdf0e10cSrcweir     }                                                                                       \
177cdf0e10cSrcweir     /*................................................................*/                    \
178cdf0e10cSrcweir     void SAL_CALL classname::disposing(const ::com::sun::star::lang::EventObject& ) throw(::com::sun::star::uno::RuntimeException)\
179cdf0e10cSrcweir     {                                                                                       \
180cdf0e10cSrcweir     }                                                                                       \
181cdf0e10cSrcweir 
182cdf0e10cSrcweir 
183cdf0e10cSrcweir     #define IMPLEMENT_LISTENER_MULTIPLEXER_VOID_METHOD(classname, listenerclass, methodname, eventtype) \
184cdf0e10cSrcweir     void SAL_CALL classname::methodname(const eventtype& e) throw (::com::sun::star::uno::RuntimeException) \
185cdf0e10cSrcweir     {                                                                                       \
186cdf0e10cSrcweir         eventtype aMulti(e);                                                                \
187cdf0e10cSrcweir         aMulti.Source = &m_rParent;                                                         \
188cdf0e10cSrcweir         ::cppu::OInterfaceIteratorHelper aIt(*this);                                        \
189cdf0e10cSrcweir         while (aIt.hasMoreElements())                                                       \
190cdf0e10cSrcweir             static_cast< listenerclass*>(aIt.next())->methodname(aMulti);               \
191cdf0e10cSrcweir     }                                                                                       \
192cdf0e10cSrcweir 
193cdf0e10cSrcweir     #define IMPLEMENT_LISTENER_MULTIPLEXER_BOOL_METHOD(classname, listenerclass, methodname, eventtype) \
194cdf0e10cSrcweir     /*................................................................*/                    \
195cdf0e10cSrcweir     sal_Bool SAL_CALL classname::methodname(const eventtype& e) throw (::com::sun::star::uno::RuntimeException) \
196cdf0e10cSrcweir     {                                                                                       \
197cdf0e10cSrcweir         eventtype aMulti(e);                                                                \
198cdf0e10cSrcweir         aMulti.Source = &m_rParent;                                                         \
199cdf0e10cSrcweir         ::cppu::OInterfaceIteratorHelper aIt(*this);                                        \
200cdf0e10cSrcweir         sal_Bool bResult = sal_True;                                                        \
201cdf0e10cSrcweir         while (bResult && aIt.hasMoreElements())                                            \
202cdf0e10cSrcweir             bResult = static_cast< listenerclass*>(aIt.next())->methodname(aMulti);     \
203cdf0e10cSrcweir         return bResult;                                                                     \
204cdf0e10cSrcweir     }                                                                                       \
205cdf0e10cSrcweir 
206cdf0e10cSrcweir     //------------------------------------------------------------------
207cdf0e10cSrcweir     // helper for classes which do event multiplexing
208cdf0e10cSrcweir     #define IMPLEMENT_LISTENER_ADMINISTRATION(classname, listenernamespace, listenerdesc, multiplexer, braodcasterclass, broadcaster) \
209cdf0e10cSrcweir     /*................................................................*/                    \
210cdf0e10cSrcweir     void SAL_CALL classname::add##listenerdesc(const ::com::sun::star::uno::Reference< ::com::sun::star::listenernamespace::X##listenerdesc >& l) throw(::com::sun::star::uno::RuntimeException)\
211cdf0e10cSrcweir     {                                                                                       \
212cdf0e10cSrcweir         multiplexer.addInterface(l);                                                            \
213cdf0e10cSrcweir         if (multiplexer.getLength() == 1)                                                   \
214cdf0e10cSrcweir         {                                                                                   \
215cdf0e10cSrcweir             ::com::sun::star::uno::Reference< braodcasterclass > xBroadcaster(broadcaster, ::com::sun::star::uno::UNO_QUERY);   \
216cdf0e10cSrcweir             if (xBroadcaster.is())                                                          \
217cdf0e10cSrcweir                 xBroadcaster->add##listenerdesc(&multiplexer);                              \
218cdf0e10cSrcweir         }                                                                                   \
219cdf0e10cSrcweir     }                                                                                       \
220cdf0e10cSrcweir     /*................................................................*/                    \
221cdf0e10cSrcweir     void SAL_CALL classname::remove##listenerdesc(const ::com::sun::star::uno::Reference< ::com::sun::star::listenernamespace::X##listenerdesc >& l) throw(::com::sun::star::uno::RuntimeException)\
222cdf0e10cSrcweir     {                                                                                       \
223cdf0e10cSrcweir         if (multiplexer.getLength() == 1)                                                   \
224cdf0e10cSrcweir         {                                                                                   \
225cdf0e10cSrcweir             ::com::sun::star::uno::Reference< braodcasterclass > xBroadcaster(broadcaster, ::com::sun::star::uno::UNO_QUERY);   \
226cdf0e10cSrcweir             if (xBroadcaster.is())                                                          \
227cdf0e10cSrcweir                 xBroadcaster->remove##listenerdesc(&multiplexer);                           \
228cdf0e10cSrcweir         }                                                                                   \
229cdf0e10cSrcweir         multiplexer.removeInterface(l);                                                     \
230cdf0e10cSrcweir     }                                                                                       \
231cdf0e10cSrcweir 
232cdf0e10cSrcweir 
233cdf0e10cSrcweir     #define STOP_MULTIPLEXER_LISTENING(listenerdesc, multiplexer, braodcasterclass, broadcaster) \
234cdf0e10cSrcweir     if (multiplexer.getLength())                                                            \
235cdf0e10cSrcweir     {                                                                                   \
236cdf0e10cSrcweir         ::com::sun::star::uno::Reference< braodcasterclass > xBroadcaster(broadcaster, ::com::sun::star::uno::UNO_QUERY);   \
237cdf0e10cSrcweir         if (xBroadcaster.is())                                                          \
238cdf0e10cSrcweir             xBroadcaster->remove##listenerdesc(&multiplexer);                           \
239cdf0e10cSrcweir     }                                                                                   \
240cdf0e10cSrcweir 
241cdf0e10cSrcweir     #define START_MULTIPLEXER_LISTENING(listenerdesc, multiplexer, braodcasterclass, broadcaster) \
242cdf0e10cSrcweir     if (multiplexer.getLength())                                                        \
243cdf0e10cSrcweir     {                                                                                   \
244cdf0e10cSrcweir         ::com::sun::star::uno::Reference< braodcasterclass > xBroadcaster(broadcaster, ::com::sun::star::uno::UNO_QUERY);   \
245cdf0e10cSrcweir         if (xBroadcaster.is())                                                          \
246cdf0e10cSrcweir             xBroadcaster->add##listenerdesc(&multiplexer);                              \
247cdf0e10cSrcweir     }                                                                                   \
248cdf0e10cSrcweir 
249cdf0e10cSrcweir 
250cdf0e10cSrcweir 
251cdf0e10cSrcweir     //------------------------------------------------------------------
252cdf0e10cSrcweir     // declaration of property listener multiplexers
253cdf0e10cSrcweir     // (with support for specialized and unspecialized property listeners)
254cdf0e10cSrcweir 
255cdf0e10cSrcweir     #define DECLARE_PROPERTY_MULTIPLEXER(classname, listenerclass, methodname, eventtype, exceptions)   \
256cdf0e10cSrcweir     class classname                                                                         \
257cdf0e10cSrcweir             :public OSbaWeakSubObject                                                           \
258cdf0e10cSrcweir             ,public listenerclass                                                           \
259cdf0e10cSrcweir     {                                                                                       \
260cdf0e10cSrcweir         typedef ::cppu::OMultiTypeInterfaceContainerHelperVar<                              \
261cdf0e10cSrcweir                 ::rtl::OUString, ::comphelper::UStringHash, ::comphelper::UStringEqual >    ListenerContainerMap;   \
262cdf0e10cSrcweir         ListenerContainerMap    m_aListeners;                                               \
263cdf0e10cSrcweir                                                                                             \
264cdf0e10cSrcweir     public:                                                                                 \
265cdf0e10cSrcweir         classname( ::cppu::OWeakObject& rSource, ::osl::Mutex& rMutex );                    \
266cdf0e10cSrcweir         DECLARE_UNO3_DEFAULTS(classname, OSbaWeakSubObject);                                    \
267cdf0e10cSrcweir         virtual ::com::sun::star::uno::Any  SAL_CALL queryInterface(                        \
268cdf0e10cSrcweir             const ::com::sun::star::uno::Type& _rType) throw (::com::sun::star::uno::RuntimeException); \
269cdf0e10cSrcweir                                                                                             \
270cdf0e10cSrcweir         /* ::com::sun::star::lang::XEventListener */                                        \
271cdf0e10cSrcweir         virtual void SAL_CALL disposing(const ::com::sun::star::lang::EventObject& Source) throw(::com::sun::star::uno::RuntimeException);  \
272cdf0e10cSrcweir                                                                                             \
273cdf0e10cSrcweir         virtual void SAL_CALL methodname(const eventtype& e)  throw exceptions;             \
274cdf0e10cSrcweir                                                                                             \
275cdf0e10cSrcweir     public:                                                                                 \
276cdf0e10cSrcweir         void addInterface(const ::rtl::OUString& rName, const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& rListener);    \
277cdf0e10cSrcweir         void removeInterface(const ::rtl::OUString& rName, const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& rListener); \
278cdf0e10cSrcweir                                                                                             \
279cdf0e10cSrcweir         void disposeAndClear();                                                             \
280cdf0e10cSrcweir                                                                                             \
281cdf0e10cSrcweir         sal_Int32 getOverallLen() const;                                                    \
282cdf0e10cSrcweir                                                                                             \
283cdf0e10cSrcweir         ::cppu::OInterfaceContainerHelper* getContainer(const ::rtl::OUString& rName)       \
284cdf0e10cSrcweir             { return m_aListeners.getContainer(rName); }                                    \
285cdf0e10cSrcweir                                                                                             \
286cdf0e10cSrcweir     protected:                                                                              \
287cdf0e10cSrcweir         void Notify(::cppu::OInterfaceContainerHelper& rListeners, const eventtype& e);     \
288cdf0e10cSrcweir     };                                                                                      \
289cdf0e10cSrcweir 
290cdf0e10cSrcweir 
291cdf0e10cSrcweir     //------------------------------------------------------------------
292cdf0e10cSrcweir     // implementation of property listener multiplexers
293cdf0e10cSrcweir     #define IMPLEMENT_PROPERTY_MULTIPLEXER(classname, listenerclass, methodname, eventtype, exceptions) \
294cdf0e10cSrcweir     /*................................................................*/                    \
295cdf0e10cSrcweir     classname::classname(::cppu::OWeakObject& rSource, ::osl::Mutex& rMutex)                \
296cdf0e10cSrcweir             :OSbaWeakSubObject(rSource)                                                     \
297cdf0e10cSrcweir             ,m_aListeners(rMutex)                                                           \
298cdf0e10cSrcweir     {                                                                                       \
299cdf0e10cSrcweir     }                                                                                       \
300cdf0e10cSrcweir                                                                                             \
301cdf0e10cSrcweir     ::com::sun::star::uno::Any  SAL_CALL classname::queryInterface(                         \
302cdf0e10cSrcweir         const ::com::sun::star::uno::Type& _rType) throw (::com::sun::star::uno::RuntimeException) \
303cdf0e10cSrcweir     {                                                                                       \
304cdf0e10cSrcweir         ::com::sun::star::uno::Any aReturn =                                                \
305cdf0e10cSrcweir             OSbaWeakSubObject::queryInterface(_rType);                                          \
306cdf0e10cSrcweir         if (!aReturn.hasValue())                                                            \
307cdf0e10cSrcweir             aReturn = ::cppu::queryInterface(_rType,                                        \
308cdf0e10cSrcweir                 static_cast< listenerclass* >(this),                                        \
309cdf0e10cSrcweir                 static_cast< ::com::sun::star::lang::XEventListener* >(static_cast< listenerclass* >(this)) \
310cdf0e10cSrcweir             );                                                                              \
311cdf0e10cSrcweir                                                                                             \
312cdf0e10cSrcweir         return aReturn;                                                                     \
313cdf0e10cSrcweir     }                                                                                       \
314cdf0e10cSrcweir     /*................................................................*/                    \
315cdf0e10cSrcweir     void SAL_CALL classname::disposing(const ::com::sun::star::lang::EventObject& ) throw(::com::sun::star::uno::RuntimeException)\
316cdf0e10cSrcweir     {                                                                                       \
317cdf0e10cSrcweir     }                                                                                       \
318cdf0e10cSrcweir                                                                                             \
319cdf0e10cSrcweir     void SAL_CALL classname::methodname(const eventtype& e) throw exceptions                \
320cdf0e10cSrcweir     {                                                                                       \
321cdf0e10cSrcweir         ::cppu::OInterfaceContainerHelper* pListeners = m_aListeners.getContainer(e.PropertyName);  \
322cdf0e10cSrcweir         if (pListeners)                                                                     \
323cdf0e10cSrcweir             Notify(*pListeners, e);                                                         \
324cdf0e10cSrcweir                                                                                             \
325cdf0e10cSrcweir         /* do the notification for the unspecialized listeners, too */                      \
326cdf0e10cSrcweir         pListeners = m_aListeners.getContainer(::rtl::OUString());                          \
327cdf0e10cSrcweir         if (pListeners)                                                                     \
328cdf0e10cSrcweir             Notify(*pListeners, e);                                                         \
329cdf0e10cSrcweir     }                                                                                       \
330cdf0e10cSrcweir                                                                                             \
331cdf0e10cSrcweir     void classname::addInterface(const ::rtl::OUString& rName,                              \
332cdf0e10cSrcweir             const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > & rListener)    \
333cdf0e10cSrcweir     {                                                                                       \
334cdf0e10cSrcweir         m_aListeners.addInterface(rName, rListener);                                        \
335cdf0e10cSrcweir     }                                                                                       \
336cdf0e10cSrcweir                                                                                             \
337cdf0e10cSrcweir     void classname::removeInterface(const ::rtl::OUString& rName,                           \
338cdf0e10cSrcweir             const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > & rListener)    \
339cdf0e10cSrcweir     {                                                                                       \
340cdf0e10cSrcweir         m_aListeners.removeInterface(rName, rListener);                                     \
341cdf0e10cSrcweir     }                                                                                       \
342cdf0e10cSrcweir                                                                                             \
343cdf0e10cSrcweir     void classname::disposeAndClear()                                                       \
344cdf0e10cSrcweir     {                                                                                       \
345cdf0e10cSrcweir         ::com::sun::star::lang::EventObject aEvt(m_rParent);                                \
346cdf0e10cSrcweir         m_aListeners.disposeAndClear(aEvt);                                                             \
347cdf0e10cSrcweir     }                                                                                       \
348cdf0e10cSrcweir                                                                                             \
349cdf0e10cSrcweir     sal_Int32 classname::getOverallLen() const                                              \
350cdf0e10cSrcweir     {                                                                                       \
351cdf0e10cSrcweir         sal_Int32 nLen = 0;                                                                 \
352cdf0e10cSrcweir         ::com::sun::star::uno::Sequence< ::rtl::OUString > aContained = m_aListeners.getContainedTypes();   \
353cdf0e10cSrcweir         const ::rtl::OUString* pContained = aContained.getConstArray();                     \
354cdf0e10cSrcweir         for (   sal_Int32 i=0; i<aContained.getLength(); ++i, ++pContained)                 \
355cdf0e10cSrcweir             nLen += m_aListeners.getContainer(*pContained)->getLength();                    \
356cdf0e10cSrcweir         return nLen;                                                                        \
357cdf0e10cSrcweir     }                                                                                       \
358cdf0e10cSrcweir                                                                                             \
359cdf0e10cSrcweir     void classname::Notify(::cppu::OInterfaceContainerHelper& rListeners, const eventtype& e)   \
360cdf0e10cSrcweir     {                                                                                       \
361cdf0e10cSrcweir         eventtype aMulti(e);                                                                \
362cdf0e10cSrcweir         aMulti.Source = &m_rParent;                                                         \
363cdf0e10cSrcweir         ::cppu::OInterfaceIteratorHelper aIt(rListeners);                                   \
364cdf0e10cSrcweir         while (aIt.hasMoreElements())                                                       \
365cdf0e10cSrcweir             static_cast< listenerclass*>(aIt.next())->methodname(aMulti);               \
366cdf0e10cSrcweir     }                                                                                       \
367cdf0e10cSrcweir 
368cdf0e10cSrcweir     //------------------------------------------------------------------
369cdf0e10cSrcweir     // helper for classes which do property event multiplexing
370cdf0e10cSrcweir     #define IMPLEMENT_PROPERTY_LISTENER_ADMINISTRATION(classname, listenerdesc, multiplexer, braodcasterclass, broadcaster) \
371cdf0e10cSrcweir     /*................................................................*/                    \
372cdf0e10cSrcweir     void SAL_CALL classname::add##listenerdesc(const ::rtl::OUString& rName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::X##listenerdesc >& l ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException)\
373cdf0e10cSrcweir     {                                                                                       \
374cdf0e10cSrcweir         multiplexer.addInterface(rName, l);                                                 \
375cdf0e10cSrcweir         if (multiplexer.getOverallLen() == 1)                                               \
376cdf0e10cSrcweir         {                                                                                   \
377cdf0e10cSrcweir             ::com::sun::star::uno::Reference< braodcasterclass > xBroadcaster(broadcaster, ::com::sun::star::uno::UNO_QUERY);   \
378cdf0e10cSrcweir             if (xBroadcaster.is())                                                          \
379cdf0e10cSrcweir                 xBroadcaster->add##listenerdesc(::rtl::OUString(), &multiplexer);                           \
380cdf0e10cSrcweir         }                                                                                   \
381cdf0e10cSrcweir     }                                                                                       \
382cdf0e10cSrcweir     /*................................................................*/                    \
383cdf0e10cSrcweir     void SAL_CALL classname::remove##listenerdesc(const ::rtl::OUString& rName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::X##listenerdesc >& l ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException)\
384cdf0e10cSrcweir     {                                                                                       \
385cdf0e10cSrcweir         if (multiplexer.getOverallLen() == 1)                                               \
386cdf0e10cSrcweir         {                                                                                   \
387cdf0e10cSrcweir             ::com::sun::star::uno::Reference< braodcasterclass > xBroadcaster(broadcaster, ::com::sun::star::uno::UNO_QUERY);   \
388cdf0e10cSrcweir             if (xBroadcaster.is())                                                          \
389cdf0e10cSrcweir                 xBroadcaster->remove##listenerdesc(::rtl::OUString(), &multiplexer);                        \
390cdf0e10cSrcweir         }                                                                                   \
391cdf0e10cSrcweir         multiplexer.removeInterface(rName, l);                                              \
392cdf0e10cSrcweir     }                                                                                       \
393cdf0e10cSrcweir 
394cdf0e10cSrcweir     #define STOP_PROPERTY_MULTIPLEXER_LISTENING(listenerdesc, multiplexer, braodcasterclass, broadcaster) \
395cdf0e10cSrcweir     if (multiplexer.getOverallLen())                                                        \
396cdf0e10cSrcweir     {                                                                                       \
397cdf0e10cSrcweir         ::com::sun::star::uno::Reference< braodcasterclass > xBroadcaster(broadcaster, ::com::sun::star::uno::UNO_QUERY);   \
398cdf0e10cSrcweir         if (xBroadcaster.is())                                                              \
399cdf0e10cSrcweir             xBroadcaster->remove##listenerdesc(::rtl::OUString(), &multiplexer);                            \
400cdf0e10cSrcweir     }                                                                                       \
401cdf0e10cSrcweir 
402cdf0e10cSrcweir     #define START_PROPERTY_MULTIPLEXER_LISTENING(listenerdesc, multiplexer, braodcasterclass, broadcaster) \
403cdf0e10cSrcweir     if (multiplexer.getOverallLen())                                                        \
404cdf0e10cSrcweir     {                                                                                       \
405cdf0e10cSrcweir         ::com::sun::star::uno::Reference< braodcasterclass > xBroadcaster(broadcaster, ::com::sun::star::uno::UNO_QUERY);   \
406cdf0e10cSrcweir         if (xBroadcaster.is())                                                              \
407cdf0e10cSrcweir             xBroadcaster->add##listenerdesc(::rtl::OUString(), &multiplexer);                               \
408cdf0e10cSrcweir     }                                                                                       \
409cdf0e10cSrcweir 
410cdf0e10cSrcweir 
411cdf0e10cSrcweir 
412cdf0e10cSrcweir     //==================================================================
413cdf0e10cSrcweir     // some listener multiplexers
414cdf0e10cSrcweir     //==================================================================
415cdf0e10cSrcweir     // ::com::sun::star::frame::XStatusListener
416cdf0e10cSrcweir     BEGIN_DECLARE_LISTENER_MULTIPLEXER(SbaXStatusMultiplexer, ::com::sun::star::frame::XStatusListener)
417cdf0e10cSrcweir         DECLARE_MULTIPLEXER_VOID_METHOD(statusChanged, ::com::sun::star::frame::FeatureStateEvent)
418cdf0e10cSrcweir 
419cdf0e10cSrcweir     private:
420cdf0e10cSrcweir         ::com::sun::star::frame::FeatureStateEvent  m_aLastKnownStatus;
421cdf0e10cSrcweir     public:                                                                                 \
422cdf0e10cSrcweir         inline ::com::sun::star::frame::FeatureStateEvent getLastEvent( ) const { return m_aLastKnownStatus; }
423cdf0e10cSrcweir     END_DECLARE_LISTENER_MULTIPLEXER()
424cdf0e10cSrcweir 
425cdf0e10cSrcweir     // ::com::sun::star::form::XLoadListener
426cdf0e10cSrcweir     BEGIN_DECLARE_LISTENER_MULTIPLEXER(SbaXLoadMultiplexer, ::com::sun::star::form::XLoadListener)
427cdf0e10cSrcweir         DECLARE_MULTIPLEXER_VOID_METHOD(loaded, ::com::sun::star::lang::EventObject)
428cdf0e10cSrcweir         DECLARE_MULTIPLEXER_VOID_METHOD(unloaded, ::com::sun::star::lang::EventObject)
429cdf0e10cSrcweir         DECLARE_MULTIPLEXER_VOID_METHOD(unloading, ::com::sun::star::lang::EventObject)
430cdf0e10cSrcweir         DECLARE_MULTIPLEXER_VOID_METHOD(reloading, ::com::sun::star::lang::EventObject)
431cdf0e10cSrcweir         DECLARE_MULTIPLEXER_VOID_METHOD(reloaded, ::com::sun::star::lang::EventObject)
432cdf0e10cSrcweir     END_DECLARE_LISTENER_MULTIPLEXER()
433cdf0e10cSrcweir 
434cdf0e10cSrcweir     // ::com::sun::star::form::XDatabaseParameterListener
435cdf0e10cSrcweir     BEGIN_DECLARE_LISTENER_MULTIPLEXER(SbaXParameterMultiplexer, ::com::sun::star::form::XDatabaseParameterListener)
436cdf0e10cSrcweir         DECLARE_MULTIPLEXER_BOOL_METHOD(approveParameter, ::com::sun::star::form::DatabaseParameterEvent)
437cdf0e10cSrcweir     END_DECLARE_LISTENER_MULTIPLEXER()
438cdf0e10cSrcweir 
439cdf0e10cSrcweir     // ::com::sun::star::form::XSubmitListener
440cdf0e10cSrcweir     BEGIN_DECLARE_LISTENER_MULTIPLEXER(SbaXSubmitMultiplexer, ::com::sun::star::form::XSubmitListener)
441cdf0e10cSrcweir         DECLARE_MULTIPLEXER_BOOL_METHOD(approveSubmit, ::com::sun::star::lang::EventObject)
442cdf0e10cSrcweir     END_DECLARE_LISTENER_MULTIPLEXER()
443cdf0e10cSrcweir 
444cdf0e10cSrcweir     // ::com::sun::star::form::XResetListener
445cdf0e10cSrcweir     BEGIN_DECLARE_LISTENER_MULTIPLEXER(SbaXResetMultiplexer, ::com::sun::star::form::XResetListener)
446cdf0e10cSrcweir         DECLARE_MULTIPLEXER_BOOL_METHOD(approveReset, ::com::sun::star::lang::EventObject)
447cdf0e10cSrcweir         DECLARE_MULTIPLEXER_VOID_METHOD(resetted, ::com::sun::star::lang::EventObject)
448cdf0e10cSrcweir     END_DECLARE_LISTENER_MULTIPLEXER()
449cdf0e10cSrcweir 
450cdf0e10cSrcweir     // ::com::sun::star::sdbc::XRowSetListener
451cdf0e10cSrcweir     BEGIN_DECLARE_LISTENER_MULTIPLEXER(SbaXRowSetMultiplexer, ::com::sun::star::sdbc::XRowSetListener)
452cdf0e10cSrcweir         DECLARE_MULTIPLEXER_VOID_METHOD(cursorMoved, ::com::sun::star::lang::EventObject)
453cdf0e10cSrcweir         DECLARE_MULTIPLEXER_VOID_METHOD(rowChanged, ::com::sun::star::lang::EventObject)
454cdf0e10cSrcweir         DECLARE_MULTIPLEXER_VOID_METHOD(rowSetChanged, ::com::sun::star::lang::EventObject)
455cdf0e10cSrcweir     END_DECLARE_LISTENER_MULTIPLEXER()
456cdf0e10cSrcweir 
457cdf0e10cSrcweir     // ::com::sun::star::sdb::XRowSetApproveListener
458cdf0e10cSrcweir     BEGIN_DECLARE_LISTENER_MULTIPLEXER(SbaXRowSetApproveMultiplexer, ::com::sun::star::sdb::XRowSetApproveListener)
459cdf0e10cSrcweir         DECLARE_MULTIPLEXER_BOOL_METHOD(approveCursorMove, ::com::sun::star::lang::EventObject)
460cdf0e10cSrcweir         DECLARE_MULTIPLEXER_BOOL_METHOD(approveRowChange, ::com::sun::star::sdb::RowChangeEvent)
461cdf0e10cSrcweir         DECLARE_MULTIPLEXER_BOOL_METHOD(approveRowSetChange, ::com::sun::star::lang::EventObject)
462cdf0e10cSrcweir     END_DECLARE_LISTENER_MULTIPLEXER()
463cdf0e10cSrcweir 
464cdf0e10cSrcweir     // ::com::sun::star::sdb::XSQLErrorListener
465cdf0e10cSrcweir     BEGIN_DECLARE_LISTENER_MULTIPLEXER(SbaXSQLErrorMultiplexer, ::com::sun::star::sdb::XSQLErrorListener)
466cdf0e10cSrcweir         DECLARE_MULTIPLEXER_VOID_METHOD(errorOccured, ::com::sun::star::sdb::SQLErrorEvent)
467cdf0e10cSrcweir     END_DECLARE_LISTENER_MULTIPLEXER()
468cdf0e10cSrcweir 
469cdf0e10cSrcweir     // ::com::sun::star::beans::XPropertyChangeListener
470cdf0e10cSrcweir     DECLARE_PROPERTY_MULTIPLEXER(SbaXPropertyChangeMultiplexer, ::com::sun::star::beans::XPropertyChangeListener, propertyChange, ::com::sun::star::beans::PropertyChangeEvent, (::com::sun::star::uno::RuntimeException))
471cdf0e10cSrcweir 
472cdf0e10cSrcweir     // ::com::sun::star::beans::XVetoableChangeListener
473cdf0e10cSrcweir     DECLARE_PROPERTY_MULTIPLEXER(SbaXVetoableChangeMultiplexer, ::com::sun::star::beans::XVetoableChangeListener, vetoableChange, ::com::sun::star::beans::PropertyChangeEvent, (::com::sun::star::beans::PropertyVetoException, ::com::sun::star::uno::RuntimeException))
474cdf0e10cSrcweir 
475cdf0e10cSrcweir     // ::com::sun::star::beans::XPropertiesChangeListener
476cdf0e10cSrcweir     BEGIN_DECLARE_LISTENER_MULTIPLEXER(SbaXPropertiesChangeMultiplexer, ::com::sun::star::beans::XPropertiesChangeListener)
477cdf0e10cSrcweir         DECLARE_MULTIPLEXER_VOID_METHOD(propertiesChange, ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyChangeEvent >)
478cdf0e10cSrcweir     END_DECLARE_LISTENER_MULTIPLEXER()
479cdf0e10cSrcweir     // the SbaXPropertiesChangeMultiplexer doesn't care about the property names a listener logs on for, it simply
480cdf0e10cSrcweir     // forwards _all_ changes to _all_ listeners
481cdf0e10cSrcweir }
482cdf0e10cSrcweir 
483cdf0e10cSrcweir #endif // _SBA_MULTIPLEXER_HXX
484