/**************************************************************
 * 
 * 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.
 * 
 *************************************************************/


//____________________________________________________________________________________________________________
//	my own include
//____________________________________________________________________________________________________________

#include "multiplexer.hxx"

//____________________________________________________________________________________________________________
//	includes of other projects
//____________________________________________________________________________________________________________
#include <vos/diagnose.hxx>

//____________________________________________________________________________________________________________
//	includes of my own project
//____________________________________________________________________________________________________________

//____________________________________________________________________________________________________________
//	namespaces
//____________________________________________________________________________________________________________

using namespace	::cppu					;
using namespace	::osl					;
using namespace	::com::sun::star::uno	;
using namespace	::com::sun::star::awt	;
using namespace	::com::sun::star::lang	;

namespace unocontrols{

//____________________________________________________________________________________________________________
//	macros
//____________________________________________________________________________________________________________

#define MULTIPLEX( INTERFACE, METHOD, EVENTTYP, EVENT )																				\
																																	\
	/* First get all interfaces from container with right type.*/																	\
	OInterfaceContainerHelper* pContainer = m_aListenerHolder.getContainer( ::getCppuType((const Reference< INTERFACE >*)0) );	\
	/* Do the follow only, if elements in container exist.*/																		\
	if( pContainer != NULL )																										\
	{																																\
		OInterfaceIteratorHelper aIterator( *pContainer );																			\
		EVENTTYP aLocalEvent = EVENT;																								\
		/* Remark: The control is the event source not the peer.*/																	\
		/*         We must change the source of the event.		*/																	\
		aLocalEvent.Source = m_xControl ;																							\
		/* Is the control not destroyed? */																							\
		if( aLocalEvent.Source.is() == sal_True )																					\
		{																															\
			if( aIterator.hasMoreElements() )																						\
			{																														\
				INTERFACE * pListener = (INTERFACE *)aIterator.next();															\
				try																													\
				{																													\
					pListener->METHOD( aLocalEvent );																				\
				}																													\
				catch( RuntimeException& )																							\
				{																													\
					/* Ignore all system exceptions from the listener! */															\
				}																													\
			}																														\
		}																															\
	}

//____________________________________________________________________________________________________________
//	construct/destruct
//____________________________________________________________________________________________________________

OMRCListenerMultiplexerHelper::OMRCListenerMultiplexerHelper(	const	Reference< XWindow >&	xControl	,
																const	Reference< XWindow >&	xPeer		)
	: m_xPeer			( xPeer		)
	, m_xControl		( xControl	)
	, m_aListenerHolder	( m_aMutex	)
{
}

OMRCListenerMultiplexerHelper::OMRCListenerMultiplexerHelper( const OMRCListenerMultiplexerHelper& /*aCopyInstance*/ )
	: XFocusListener()
    , XWindowListener()
    , XKeyListener()
    , XMouseListener()
    , XMouseMotionListener()
    , XPaintListener()
    , XTopWindowListener()
    , OWeakObject()
    , m_aListenerHolder	( m_aMutex	)
{
}

OMRCListenerMultiplexerHelper::~OMRCListenerMultiplexerHelper()
{
}

//____________________________________________________________________________________________________________
//	XInterface
//____________________________________________________________________________________________________________

Any SAL_CALL OMRCListenerMultiplexerHelper::queryInterface( const Type& rType ) throw( RuntimeException )
{
	// Attention:
	//	Don't use mutex or guard in this method!!! Is a method of XInterface.

	// Ask for my own supported interfaces ...
	// Attention: XTypeProvider and XInterface are supported by OComponentHelper!
	Any aReturn	( ::cppu::queryInterface(	rType											,
											static_cast< XWindowListener*		> ( this )	,
											static_cast< XKeyListener*			> ( this )	,
											static_cast< XFocusListener*		> ( this )	,
											static_cast< XMouseListener*		> ( this )	,
											static_cast< XMouseMotionListener*	> ( this )	,
											static_cast< XPaintListener*		> ( this )	,
											static_cast< XTopWindowListener*	> ( this )	,
											static_cast< XTopWindowListener*	> ( this )
										)
				);

	// If searched interface supported by this class ...
	if ( aReturn.hasValue() == sal_True )
	{
		// ... return this information.
		return aReturn ;
	}
	else
	{
		// Else; ... ask baseclass for interfaces!
		return OWeakObject::queryInterface( rType );
	}
}

//____________________________________________________________________________________________________________
//	XInterface
//____________________________________________________________________________________________________________

void SAL_CALL OMRCListenerMultiplexerHelper::acquire() throw()
{
	// Attention:
	//	Don't use mutex or guard in this method!!! Is a method of XInterface.

	// Forward to baseclass
	OWeakObject::acquire();
}

//____________________________________________________________________________________________________________
//	XInterface
//____________________________________________________________________________________________________________

void SAL_CALL OMRCListenerMultiplexerHelper::release() throw()
{
	// Attention:
	//	Don't use mutex or guard in this method!!! Is a method of XInterface.

	// Forward to baseclass
	OWeakObject::release();
}

//____________________________________________________________________________________________________________
//	operator
//____________________________________________________________________________________________________________

OMRCListenerMultiplexerHelper::operator Reference< XInterface >() const
{
	return ((OWeakObject*)this) ;
}

//____________________________________________________________________________________________________________
//	operator
//____________________________________________________________________________________________________________

//OMRCListenerMultiplexerHelper& OMRCListenerMultiplexerHelper::operator= ( const OMRCListenerMultiplexerHelper& aCopyInstance )
//{
//	return this ;
//}

//____________________________________________________________________________________________________________
//	container method
//____________________________________________________________________________________________________________

void OMRCListenerMultiplexerHelper::setPeer( const Reference< XWindow >& xPeer )
{
	MutexGuard aGuard( m_aMutex );
	if( m_xPeer != xPeer )
	{
		if( m_xPeer.is() )
		{
			// get all types from the listener added to the peer
			Sequence< Type >	aContainedTypes	= m_aListenerHolder.getContainedTypes();
			const Type*			pArray			= aContainedTypes.getConstArray();
			sal_Int32			nCount			= aContainedTypes.getLength();
			// loop over all listener types and remove the listeners from the peer
			for( sal_Int32 i=0; i<nCount; i++ )
				impl_unadviseFromPeer( m_xPeer, pArray[i] );
		}
		m_xPeer = xPeer;
		if( m_xPeer.is() )
		{
			// get all types from the listener added to the peer
			Sequence< Type >	aContainedTypes	= m_aListenerHolder.getContainedTypes();
			const Type*			pArray			= aContainedTypes.getConstArray();
			sal_Int32			nCount			= aContainedTypes.getLength();
			// loop over all listener types and add the listeners to the peer
			for( sal_Int32 i = 0; i < nCount; i++ )
				impl_adviseToPeer( m_xPeer, pArray[i] );
		}
	}
}

//____________________________________________________________________________________________________________
//	container method
//____________________________________________________________________________________________________________

void OMRCListenerMultiplexerHelper::disposeAndClear()
{
	EventObject aEvent ;
	aEvent.Source = m_xControl ;
	m_aListenerHolder.disposeAndClear( aEvent );
}

//____________________________________________________________________________________________________________
//	container method
//____________________________________________________________________________________________________________

void OMRCListenerMultiplexerHelper::advise(	const	Type&						aType		,
											const	Reference< XInterface >&	xListener	)
{
	MutexGuard aGuard( m_aMutex );
	if( m_aListenerHolder.addInterface( aType, xListener ) == 1 )
	{
		// the first listener is added
		if( m_xPeer.is() )
		{
			impl_adviseToPeer( m_xPeer, aType );
		}
	}
}

//____________________________________________________________________________________________________________
//	container method
//____________________________________________________________________________________________________________

void OMRCListenerMultiplexerHelper::unadvise(	const	Type&						aType		,
												const	Reference< XInterface >&	xListener	)
{
	MutexGuard aGuard( m_aMutex );
	if( m_aListenerHolder.removeInterface( aType, xListener ) == 0 )
	{
		// the last listener is removed
		if ( m_xPeer.is() )
		{
			impl_unadviseFromPeer( m_xPeer, aType );
		}
	}
}

//____________________________________________________________________________________________________________
//	XEventListener
//____________________________________________________________________________________________________________

void SAL_CALL OMRCListenerMultiplexerHelper::disposing( const EventObject& /*aSource*/ ) throw( RuntimeException )
{
	MutexGuard aGuard( m_aMutex );
	// peer is disposed, clear the reference
	m_xPeer = Reference< XWindow >();
}

//____________________________________________________________________________________________________________
//	XFcousListener
//____________________________________________________________________________________________________________

void OMRCListenerMultiplexerHelper::focusGained(const FocusEvent& aEvent ) throw( UNO3_RUNTIMEEXCEPTION )
{
/*
	OInterfaceContainerHelper * pCont = aListenerHolder.getContainer( ::getCppuType((const Reference< XFocusListener >*)0) );
	if( pCont )
	{
		OInterfaceIteratorHelper	aIt( *pCont );
		FocusEvent aEvt = e;
		// Reamark: The control is the event source not the peer. We must change
		// the source of the event
		xControl.queryHardRef( ((XInterface*)NULL)->getSmartUik(), aEvt.Source );
		//.is the control not destroyed
		if( aEvt.Source.is() )
		{
			if( aIt.hasMoreElements() )
			{
				XFocusListener * pListener = (XFocusListener *)aIt.next();
				try
				{
					pListener->focusGained( aEvt );
				}
				catch( RuntimeException, e )
				{
					// ignore all usr system exceptions from the listener
				}
			}
		}
	}
*/
	MULTIPLEX( XFocusListener, focusGained, FocusEvent, aEvent )
}

//____________________________________________________________________________________________________________
//	XFcousListener
//____________________________________________________________________________________________________________

void OMRCListenerMultiplexerHelper::focusLost(const FocusEvent& aEvent ) throw( UNO3_RUNTIMEEXCEPTION )
{
	MULTIPLEX( XFocusListener, focusLost, FocusEvent, aEvent )
}

//____________________________________________________________________________________________________________
//	XWindowListener
//____________________________________________________________________________________________________________

void OMRCListenerMultiplexerHelper::windowResized(const WindowEvent& aEvent ) throw( UNO3_RUNTIMEEXCEPTION )
{
	MULTIPLEX( XWindowListener, windowResized, WindowEvent, aEvent )
}

//____________________________________________________________________________________________________________
//	XWindowListener
//____________________________________________________________________________________________________________

void OMRCListenerMultiplexerHelper::windowMoved(const WindowEvent& aEvent ) throw( UNO3_RUNTIMEEXCEPTION )
{
	MULTIPLEX( XWindowListener, windowMoved, WindowEvent, aEvent )
}

//____________________________________________________________________________________________________________
//	XWindowListener
//____________________________________________________________________________________________________________

void OMRCListenerMultiplexerHelper::windowShown(const EventObject& aEvent ) throw( UNO3_RUNTIMEEXCEPTION )
{
	MULTIPLEX( XWindowListener, windowShown, EventObject, aEvent )
}

//____________________________________________________________________________________________________________
//	XWindowListener
//____________________________________________________________________________________________________________

void OMRCListenerMultiplexerHelper::windowHidden(const EventObject& aEvent ) throw( UNO3_RUNTIMEEXCEPTION )
{
	MULTIPLEX( XWindowListener, windowHidden, EventObject, aEvent )
}

//____________________________________________________________________________________________________________
//	XKeyListener
//____________________________________________________________________________________________________________

void OMRCListenerMultiplexerHelper::keyPressed(const KeyEvent& aEvent) throw( UNO3_RUNTIMEEXCEPTION )
{
	MULTIPLEX( XKeyListener, keyPressed, KeyEvent, aEvent )
}

//____________________________________________________________________________________________________________
//	XKeyListener
//____________________________________________________________________________________________________________

void OMRCListenerMultiplexerHelper::keyReleased(const KeyEvent& aEvent) throw( UNO3_RUNTIMEEXCEPTION )
{
	MULTIPLEX( XKeyListener, keyReleased, KeyEvent, aEvent )
}

//____________________________________________________________________________________________________________
//	XMouseListener
//____________________________________________________________________________________________________________

void OMRCListenerMultiplexerHelper::mousePressed(const MouseEvent& aEvent) throw( UNO3_RUNTIMEEXCEPTION )
{
	MULTIPLEX( XMouseListener, mousePressed, MouseEvent, aEvent )
}

//____________________________________________________________________________________________________________
//	XMouseListener
//____________________________________________________________________________________________________________

void OMRCListenerMultiplexerHelper::mouseReleased(const MouseEvent& aEvent) throw( UNO3_RUNTIMEEXCEPTION )
{
	MULTIPLEX( XMouseListener, mouseReleased, MouseEvent, aEvent )
}

//____________________________________________________________________________________________________________
//	XMouseListener
//____________________________________________________________________________________________________________

void OMRCListenerMultiplexerHelper::mouseEntered(const MouseEvent& aEvent) throw( UNO3_RUNTIMEEXCEPTION )
{
	MULTIPLEX( XMouseListener, mouseEntered, MouseEvent, aEvent )
}

//____________________________________________________________________________________________________________
//	XMouseListener
//____________________________________________________________________________________________________________

void OMRCListenerMultiplexerHelper::mouseExited(const MouseEvent& aEvent) throw( UNO3_RUNTIMEEXCEPTION )
{
	MULTIPLEX( XMouseListener, mouseExited, MouseEvent, aEvent )
}

//____________________________________________________________________________________________________________
//	XMouseMotionListener
//____________________________________________________________________________________________________________

void OMRCListenerMultiplexerHelper::mouseDragged(const MouseEvent& aEvent) throw( UNO3_RUNTIMEEXCEPTION )
{
	MULTIPLEX( XMouseMotionListener, mouseDragged, MouseEvent, aEvent )
}

//____________________________________________________________________________________________________________
//	XMouseMotionListener
//____________________________________________________________________________________________________________

void OMRCListenerMultiplexerHelper::mouseMoved(const MouseEvent& aEvent) throw( UNO3_RUNTIMEEXCEPTION )
{
	MULTIPLEX( XMouseMotionListener, mouseMoved, MouseEvent, aEvent )
}

//____________________________________________________________________________________________________________
//	XPaintListener
//____________________________________________________________________________________________________________

void OMRCListenerMultiplexerHelper::windowPaint(const PaintEvent& aEvent) throw( UNO3_RUNTIMEEXCEPTION )
{
	MULTIPLEX( XPaintListener, windowPaint, PaintEvent, aEvent )
}

//____________________________________________________________________________________________________________
//	XTopWindowListener
//____________________________________________________________________________________________________________

void OMRCListenerMultiplexerHelper::windowOpened(const EventObject& aEvent) throw( UNO3_RUNTIMEEXCEPTION )
{
	MULTIPLEX( XTopWindowListener, windowOpened, EventObject, aEvent )
}

//____________________________________________________________________________________________________________
//	XTopWindowListener
//____________________________________________________________________________________________________________

void OMRCListenerMultiplexerHelper::windowClosing( const EventObject& aEvent ) throw( UNO3_RUNTIMEEXCEPTION )
{
	MULTIPLEX( XTopWindowListener, windowClosing, EventObject, aEvent )
}

//____________________________________________________________________________________________________________
//	XTopWindowListener
//____________________________________________________________________________________________________________

void OMRCListenerMultiplexerHelper::windowClosed( const EventObject& aEvent ) throw( UNO3_RUNTIMEEXCEPTION )
{
	MULTIPLEX( XTopWindowListener, windowClosed, EventObject, aEvent )
}

//____________________________________________________________________________________________________________
//	XTopWindowListener
//____________________________________________________________________________________________________________

void OMRCListenerMultiplexerHelper::windowMinimized( const EventObject& aEvent ) throw( UNO3_RUNTIMEEXCEPTION )
{
	MULTIPLEX( XTopWindowListener, windowMinimized, EventObject, aEvent )
}

//____________________________________________________________________________________________________________
//	XTopWindowListener
//____________________________________________________________________________________________________________

void OMRCListenerMultiplexerHelper::windowNormalized( const EventObject& aEvent ) throw( UNO3_RUNTIMEEXCEPTION )
{
	MULTIPLEX( XTopWindowListener, windowNormalized, EventObject, aEvent )
}

//____________________________________________________________________________________________________________
//	XTopWindowListener
//____________________________________________________________________________________________________________

void OMRCListenerMultiplexerHelper::windowActivated( const EventObject& aEvent ) throw( UNO3_RUNTIMEEXCEPTION )
{
	MULTIPLEX( XTopWindowListener, windowActivated, EventObject, aEvent )
}

//____________________________________________________________________________________________________________
//	XTopWindowListener
//____________________________________________________________________________________________________________

void OMRCListenerMultiplexerHelper::windowDeactivated( const EventObject& aEvent ) throw( UNO3_RUNTIMEEXCEPTION )
{
	MULTIPLEX( XTopWindowListener, windowDeactivated, EventObject, aEvent )
}

//____________________________________________________________________________________________________________
//	protected method
//____________________________________________________________________________________________________________

void OMRCListenerMultiplexerHelper::impl_adviseToPeer(	const	Reference< XWindow >&	xPeer	,
														const	Type&					aType	)
{
	// add a listener to the source (peer)
	if( aType == ::getCppuType((const Reference< XWindowListener >*)0) )
		xPeer->addWindowListener( this );
	else if( aType == ::getCppuType((const Reference< XKeyListener >*)0) )
		xPeer->addKeyListener( this );
	else if( aType == ::getCppuType((const Reference< XFocusListener >*)0) )
		xPeer->addFocusListener( this );
	else if( aType == ::getCppuType((const Reference< XMouseListener >*)0) )
		xPeer->addMouseListener( this );
	else if( aType == ::getCppuType((const Reference< XMouseMotionListener >*)0) )
		xPeer->addMouseMotionListener( this );
	else if( aType == ::getCppuType((const Reference< XPaintListener >*)0) )
		xPeer->addPaintListener( this );
	else if( aType == ::getCppuType((const Reference< XTopWindowListener >*)0) )
	{
		Reference< XTopWindow > xTop( xPeer, UNO_QUERY );
		if( xTop.is() )
			xTop->addTopWindowListener( this );
	}
	else
	{
		VOS_ENSHURE( sal_False, "unknown listener" );
	}
}

//____________________________________________________________________________________________________________
//	protected method
//____________________________________________________________________________________________________________

void OMRCListenerMultiplexerHelper::impl_unadviseFromPeer(	const	Reference< XWindow >&	xPeer	,
															const	Type&					aType	)
{
	// the last listener is removed, remove the listener from the source (peer)
	if( aType == ::getCppuType((const Reference< XWindowListener >*)0) )
		xPeer->removeWindowListener( this );
	else if( aType == ::getCppuType((const Reference< XKeyListener >*)0) )
		xPeer->removeKeyListener( this );
	else if( aType == ::getCppuType((const Reference< XFocusListener >*)0) )
		xPeer->removeFocusListener( this );
	else if( aType == ::getCppuType((const Reference< XMouseListener >*)0) )
		xPeer->removeMouseListener( this );
	else if( aType == ::getCppuType((const Reference< XMouseMotionListener >*)0) )
		xPeer->removeMouseMotionListener( this );
	else if( aType == ::getCppuType((const Reference< XPaintListener >*)0) )
		xPeer->removePaintListener( this );
	else if( aType == ::getCppuType((const Reference< XTopWindowListener >*)0) )
	{
		Reference< XTopWindow >  xTop( xPeer, UNO_QUERY );
		if( xTop.is() )
			xTop->removeTopWindowListener( this );
	}
	else
	{
		VOS_ENSHURE( sal_False, "unknown listener" );
	}
}

} // namespace unocontrols
