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