/**************************************************************
 * 
 * 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 "basecontrol.hxx"

//____________________________________________________________________________________________________________
//	includes of other projects
//____________________________________________________________________________________________________________
#include <com/sun/star/awt/XDevice.hpp>
#include <com/sun/star/awt/XDisplayBitmap.hpp>
#include <com/sun/star/awt/DeviceInfo.hpp>
#include <com/sun/star/awt/WindowAttribute.hpp>
#include <com/sun/star/awt/PosSize.hpp>
#include <cppuhelper/typeprovider.hxx>

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

//____________________________________________________________________________________________________________
//	namespaces
//____________________________________________________________________________________________________________

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

namespace unocontrols{

//____________________________________________________________________________________________________________
//	defines
//____________________________________________________________________________________________________________

#define	DEFAULT_PMULTIPLEXER				NULL
#define	DEFAULT_X							0
#define	DEFAULT_Y							0
#define	DEFAULT_WIDTH						100
#define	DEFAULT_HEIGHT						100
#define	DEFAULT_VISIBLE						sal_False
#define	DEFAULT_INDESIGNMODE				sal_False
#define	DEFAULT_ENABLE						sal_True
#define	SERVICE_VCLTOOLKIT					"com.sun.star.awt.Toolkit"

//____________________________________________________________________________________________________________
//	construct/destruct
//____________________________________________________________________________________________________________

BaseControl::BaseControl( const Reference< XMultiServiceFactory >& xFactory )
	: IMPL_MutexContainer		(						)
	, OComponentHelper			( m_aMutex				)
	, m_xFactory	( xFactory				)
	, m_pMultiplexer			( DEFAULT_PMULTIPLEXER	)
	, m_nX						( DEFAULT_X				)
	, m_nY						( DEFAULT_Y				)
	, m_nWidth					( DEFAULT_WIDTH			)
	, m_nHeight					( DEFAULT_HEIGHT		)
	, m_bVisible				( DEFAULT_VISIBLE		)
	, m_bInDesignMode			( DEFAULT_INDESIGNMODE	)
	, m_bEnable					( DEFAULT_ENABLE		)
{
}

BaseControl::~BaseControl()
{
}

//____________________________________________________________________________________________________________
//	XInterface
//____________________________________________________________________________________________________________

Any SAL_CALL BaseControl::queryInterface( const Type& rType ) throw( RuntimeException )
{
	Any aReturn ;
	if ( m_xDelegator.is() == sal_True )
	{
		// If an delegator exist, forward question to his queryInterface.
		// Delegator will ask his own queryAggregation!
		aReturn = m_xDelegator->queryInterface( rType );
	}
	else
	{
		// If an delegator unknown, forward question to own queryAggregation.
		aReturn = queryAggregation( rType );
	}

	return aReturn ;
}

//____________________________________________________________________________________________________________
//	XInterface
//____________________________________________________________________________________________________________

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

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

//____________________________________________________________________________________________________________
//	XInterface
//____________________________________________________________________________________________________________

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

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

//____________________________________________________________________________________________________________
//	XTypeProvider
//____________________________________________________________________________________________________________

Sequence< Type > SAL_CALL BaseControl::getTypes() throw( RuntimeException )
{
	// Optimize this method !
	// We initialize a static variable only one time. And we don't must use a mutex at every call!
	// For the first call; pTypeCollection is NULL - for the second call pTypeCollection is different from NULL!
	static OTypeCollection* pTypeCollection = NULL ;

	if ( pTypeCollection == NULL )
	{
		// Ready for multithreading; get global mutex for first call of this method only! see before
		MutexGuard aGuard( Mutex::getGlobalMutex() );

		// Control these pointer again ... it can be, that another instance will be faster then these!
		if ( pTypeCollection == NULL )
		{
			// Create a static typecollection ...
			static OTypeCollection aTypeCollection	(	::getCppuType(( const Reference< XPaintListener	>*)NULL )	,
												  		::getCppuType(( const Reference< XWindowListener>*)NULL )	,
												  		::getCppuType(( const Reference< XView			>*)NULL )	,
												  		::getCppuType(( const Reference< XWindow		>*)NULL )	,
												  		::getCppuType(( const Reference< XServiceInfo	>*)NULL )	,
												  		::getCppuType(( const Reference< XControl		>*)NULL )	,
														OComponentHelper::getTypes()
													);

			// ... and set his address to static pointer!
			pTypeCollection = &aTypeCollection ;
		}
	}

	return pTypeCollection->getTypes();
}

//____________________________________________________________________________________________________________
//	XTypeProvider
//____________________________________________________________________________________________________________

Sequence< sal_Int8 > SAL_CALL BaseControl::getImplementationId() throw( RuntimeException )
{
	// Create one Id for all instances of this class.
	// Use ethernet address to do this! (sal_True)

	// Optimize this method
	// We initialize a static variable only one time. And we don't must use a mutex at every call!
	// For the first call; pID is NULL - for the second call pID is different from NULL!
	static OImplementationId* pID = NULL ;

	if ( pID == NULL )
	{
		// Ready for multithreading; get global mutex for first call of this method only! see before
		MutexGuard aGuard( Mutex::getGlobalMutex() );

		// Control these pointer again ... it can be, that another instance will be faster then these!
		if ( pID == NULL )
		{
			// Create a new static ID ...
			static OImplementationId aID( sal_False );
			// ... and set his address to static pointer!
			pID = &aID ;
		}
	}

	return pID->getImplementationId();
}

//____________________________________________________________________________________________________________
//	XAggregation
//____________________________________________________________________________________________________________

void SAL_CALL BaseControl::setDelegator( const Reference< XInterface >& xDel ) throw( RuntimeException )
{
	// Ready for multithreading
	MutexGuard aGuard( m_aMutex );
	m_xDelegator = xDel;
}

//____________________________________________________________________________________________________________
//	XAggregation
//____________________________________________________________________________________________________________

Any SAL_CALL BaseControl::queryAggregation( const Type& aType ) throw( RuntimeException )
{
	// Ask for my own supported interfaces ...
	// Attention: XTypeProvider and XInterface are supported by OComponentHelper!
	Any aReturn	( ::cppu::queryInterface(	aType									,
									   		static_cast< XPaintListener*> ( this )	,
									   		static_cast< XWindowListener*> ( this )	,
									   		static_cast< XView*			> ( this )	,
									   		static_cast< XWindow*		> ( this )	,
									   		static_cast< XServiceInfo*	> ( this )	,
									   		static_cast< XControl*		> ( 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 OComponentHelper::queryAggregation( aType );
	}
}

//____________________________________________________________________________________________________________
//	XServiceInfo
//____________________________________________________________________________________________________________

OUString SAL_CALL BaseControl::getImplementationName() throw( RuntimeException )
{
	return impl_getStaticImplementationName();
}

//____________________________________________________________________________________________________________
//	XServiceInfo
//____________________________________________________________________________________________________________

sal_Bool SAL_CALL BaseControl::supportsService( const OUString& sServiceName ) throw( RuntimeException )
{
    Sequence< OUString >	seqServiceNames	=	getSupportedServiceNames();
    const OUString*			pArray			=	seqServiceNames.getConstArray();
    for ( sal_Int32 nCounter=0; nCounter<seqServiceNames.getLength(); nCounter++ )
	{
        if ( pArray[nCounter] == sServiceName )
		{
            return sal_True ;
		}
	}
    return sal_False ;
}

//____________________________________________________________________________________________________________
//	XServiceInfo
//____________________________________________________________________________________________________________

Sequence< OUString > SAL_CALL BaseControl::getSupportedServiceNames() throw( RuntimeException )
{
	return impl_getStaticSupportedServiceNames();
}

//____________________________________________________________________________________________________________
//	XComponent
//____________________________________________________________________________________________________________

void SAL_CALL BaseControl::dispose() throw( RuntimeException )
{
	// Ready for multithreading
	MutexGuard aGuard( m_aMutex );

	if ( m_pMultiplexer != NULL )
	{
		// to all other paint, focus, etc.
		m_pMultiplexer->disposeAndClear();
	}

	// set the service manager to disposed
	OComponentHelper::dispose();

	// release context and peer
	m_xContext = Reference< XInterface >();
	impl_releasePeer();

	// release view
	if ( m_xGraphicsView.is() == sal_True )
	{
		m_xGraphicsView = Reference< XGraphics >();
	}
}

//____________________________________________________________________________________________________________
//	XComponent
//____________________________________________________________________________________________________________

void SAL_CALL BaseControl::addEventListener( const Reference< XEventListener >& xListener ) throw( RuntimeException )
{
	// Ready for multithreading
	MutexGuard aGuard( m_aMutex );
	OComponentHelper::addEventListener( xListener );
}

//____________________________________________________________________________________________________________
//	XComponent
//____________________________________________________________________________________________________________

void SAL_CALL BaseControl::removeEventListener( const Reference< XEventListener >& xListener ) throw( RuntimeException )
{
	// Ready for multithreading
	MutexGuard aGuard( m_aMutex );
	OComponentHelper::removeEventListener( xListener );
}

//____________________________________________________________________________________________________________
//	XControl
//____________________________________________________________________________________________________________

void SAL_CALL BaseControl::createPeer(	const	Reference< XToolkit >&		xToolkit	,
										const	Reference< XWindowPeer >&	xParentPeer	) throw( RuntimeException )
{
	// Ready for multithreading
	MutexGuard aGuard( m_aMutex );

	if ( m_xPeer.is() == sal_False )
	{
		// use method "BaseControl::getWindowDescriptor()" fot change window attributes !!!
		WindowDescriptor* pDescriptor = impl_getWindowDescriptor( xParentPeer );

		if ( m_bVisible == sal_True )
		{
			pDescriptor->WindowAttributes |= WindowAttribute::SHOW ;
		}

		// very slow under remote conditions!
		// create the window on the server
		Reference< XToolkit > xLocalToolkit = xToolkit ;
		if ( xLocalToolkit.is() == sal_False )
		{
			// but first create wellknown toolkit, if it not exist
			xLocalToolkit = Reference< XToolkit > ( m_xFactory->createInstance( OUString::createFromAscii( SERVICE_VCLTOOLKIT ) ), UNO_QUERY );
		}
		m_xPeer			= xLocalToolkit->createWindow( *pDescriptor );
		m_xPeerWindow	= Reference< XWindow >( m_xPeer, UNO_QUERY );

		// don't forget to release the memory!
		delete pDescriptor ;

		if ( m_xPeerWindow.is() == sal_True )
		{
			if ( m_pMultiplexer != NULL )
			{
				m_pMultiplexer->setPeer( m_xPeerWindow );
			}

			// create new referenz to xgraphics for painting on a peer
			// and add a paint listener
			Reference< XDevice > xDevice( m_xPeerWindow, UNO_QUERY );

			if ( xDevice.is() == sal_True )
			{
				m_xGraphicsPeer = xDevice->createGraphics();
			}

			if ( m_xGraphicsPeer.is() == sal_True )
			{
				addPaintListener( this );
				addWindowListener( this );
			}

			// PosSize_POSSIZE defined in <stardiv/uno/awt/window.hxx>
			m_xPeerWindow->setPosSize(	m_nX, m_nY, m_nWidth, m_nHeight, PosSize::POSSIZE	);
			m_xPeerWindow->setEnable(	m_bEnable 											);
			m_xPeerWindow->setVisible(	m_bVisible && !m_bInDesignMode						);
		}
	}
}

//____________________________________________________________________________________________________________
//	XControl
//____________________________________________________________________________________________________________

void SAL_CALL BaseControl::setContext( const Reference< XInterface >& xContext ) throw( RuntimeException )
{
	// Ready for multithreading
	MutexGuard aGuard( m_aMutex );
	m_xContext = xContext ;
}

//____________________________________________________________________________________________________________
//	XControl
//____________________________________________________________________________________________________________

void SAL_CALL BaseControl::setDesignMode( sal_Bool bOn ) throw( RuntimeException )
{
	// Ready for multithreading
	MutexGuard aGuard( m_aMutex );
	m_bInDesignMode = bOn ;
}

//____________________________________________________________________________________________________________
//	XControl
//____________________________________________________________________________________________________________

Reference< XInterface > SAL_CALL BaseControl::getContext() throw( RuntimeException )
{
	// Ready for multithreading
	MutexGuard aGuard( m_aMutex );
	return m_xContext ;
}

//____________________________________________________________________________________________________________
//	XControl
//____________________________________________________________________________________________________________

Reference< XWindowPeer > SAL_CALL BaseControl::getPeer() throw( RuntimeException )
{
	// Ready for multithreading
	MutexGuard aGuard( m_aMutex );
	return m_xPeer ;
}

//____________________________________________________________________________________________________________
//	XControl
//____________________________________________________________________________________________________________

Reference< XView > SAL_CALL BaseControl::getView() throw( RuntimeException )
{
	// Ready for multithreading
	MutexGuard aGuard( m_aMutex );
	return Reference< XView >( (OWeakObject*)this, UNO_QUERY );
}

//____________________________________________________________________________________________________________
//	XControl
//____________________________________________________________________________________________________________

sal_Bool SAL_CALL BaseControl::isDesignMode() throw( RuntimeException )
{
	// Ready for multithreading
	MutexGuard aGuard( m_aMutex );
	return m_bInDesignMode ;
}

//____________________________________________________________________________________________________________
//	XControl
//____________________________________________________________________________________________________________

sal_Bool SAL_CALL BaseControl::isTransparent() throw( RuntimeException )
{
	return sal_False ;
}

//____________________________________________________________________________________________________________
//	XWindow
//____________________________________________________________________________________________________________

void SAL_CALL BaseControl::setPosSize(	sal_Int32	nX		,
										sal_Int32	nY		,
										sal_Int32	nWidth	,
										sal_Int32	nHeight	,
										sal_Int16	nFlags	) throw( RuntimeException )
{
	// - change size and position of window and save the values
	// - "nFlags" declared in <stardiv/uno/awt/window.hxx> ("#define PosSize_X .....")

	// Ready for multithreading
	MutexGuard aGuard( m_aMutex );

	sal_Bool bChanged = sal_False ;

	if ( nFlags & PosSize::X )
	{
		bChanged |= m_nX != nX, m_nX = nX ;
	}

	if ( nFlags & PosSize::Y )
	{
		bChanged |= m_nY != nY, m_nY = nY ;
	}

	if ( nFlags & PosSize::WIDTH )
	{
		bChanged |= m_nWidth != nWidth, m_nWidth  = nWidth ;
	}

	if ( nFlags & PosSize::HEIGHT )
	{
		bChanged |= m_nHeight != nHeight, m_nHeight = nHeight  ;
	}

	if ( bChanged && m_xPeerWindow.is() )
	{
		m_xPeerWindow->setPosSize( m_nX, m_nY, m_nWidth, m_nHeight, nFlags );
	}
}

//____________________________________________________________________________________________________________
//	XWindow
//____________________________________________________________________________________________________________

void SAL_CALL BaseControl::setVisible( sal_Bool bVisible ) throw( RuntimeException )
{
	// Ready for multithreading
	MutexGuard aGuard( m_aMutex );

	// Set new state of flag
	m_bVisible = bVisible ;

	if ( m_xPeerWindow.is() == sal_True )
	{
		// Set it also on peerwindow
		m_xPeerWindow->setVisible( m_bVisible );
	}
}

//____________________________________________________________________________________________________________
//	XWindow
//____________________________________________________________________________________________________________

void SAL_CALL BaseControl::setEnable( sal_Bool bEnable ) throw( RuntimeException )
{
	// Ready for multithreading
	MutexGuard aGuard( m_aMutex );

	// Set new state of flag
	m_bEnable = bEnable ;

	if ( m_xPeerWindow.is() == sal_True )
	{
		// Set it also on peerwindow
		m_xPeerWindow->setEnable( m_bEnable );
	}
}

//____________________________________________________________________________________________________________
//	XWindow
//____________________________________________________________________________________________________________

void SAL_CALL BaseControl::setFocus() throw( RuntimeException )
{
	// Ready for multithreading
	MutexGuard aGuard( m_aMutex );

	if ( m_xPeerWindow.is() == sal_True )
	{
		m_xPeerWindow->setFocus();
	}
}

//____________________________________________________________________________________________________________
//	XWindow
//____________________________________________________________________________________________________________

Rectangle SAL_CALL BaseControl::getPosSize() throw( RuntimeException )
{
	// Ready for multithreading
	MutexGuard aGuard( m_aMutex );
	return Rectangle( m_nX, m_nY , m_nWidth, m_nHeight );
}

//____________________________________________________________________________________________________________
//	XWindow
//____________________________________________________________________________________________________________

void SAL_CALL BaseControl::addWindowListener( const Reference< XWindowListener >& xListener ) throw( RuntimeException )
{
	impl_getMultiplexer()->advise( ::getCppuType(( const Reference< XWindowListener >*)0), xListener );
}

//____________________________________________________________________________________________________________
//	XWindow
//____________________________________________________________________________________________________________

void SAL_CALL BaseControl::addFocusListener( const Reference< XFocusListener >& xListener ) throw( RuntimeException )
{
	impl_getMultiplexer()->advise( ::getCppuType(( const Reference< XFocusListener >*)0), xListener );
}

//____________________________________________________________________________________________________________
//	XWindow
//____________________________________________________________________________________________________________

void SAL_CALL BaseControl::addKeyListener( const Reference< XKeyListener >& xListener ) throw( RuntimeException )
{
	impl_getMultiplexer()->advise( ::getCppuType(( const Reference< XKeyListener >*)0), xListener );
}

//____________________________________________________________________________________________________________
//	XWindow
//____________________________________________________________________________________________________________

void SAL_CALL BaseControl::addMouseListener( const Reference< XMouseListener >& xListener ) throw( RuntimeException )
{
	impl_getMultiplexer()->advise( ::getCppuType(( const Reference< XMouseListener >*)0), xListener );
}

//____________________________________________________________________________________________________________
//	XWindow
//____________________________________________________________________________________________________________

void SAL_CALL BaseControl::addMouseMotionListener( const Reference< XMouseMotionListener >& xListener ) throw( RuntimeException )
{
	impl_getMultiplexer()->advise( ::getCppuType(( const Reference< XMouseMotionListener >*)0), xListener );
}

//____________________________________________________________________________________________________________
//	XWindow
//____________________________________________________________________________________________________________

void SAL_CALL BaseControl::addPaintListener( const Reference< XPaintListener >& xListener ) throw( RuntimeException )
{
	impl_getMultiplexer()->advise( ::getCppuType(( const Reference< XPaintListener >*)0), xListener );
}

//____________________________________________________________________________________________________________
//	XWindow
//____________________________________________________________________________________________________________

void SAL_CALL BaseControl::removeWindowListener( const Reference< XWindowListener >& xListener ) throw( RuntimeException )
{
	impl_getMultiplexer()->unadvise( ::getCppuType(( const Reference< XWindowListener >*)0), xListener );
}

//____________________________________________________________________________________________________________
//	XWindow
//____________________________________________________________________________________________________________

void SAL_CALL BaseControl::removeFocusListener( const Reference< XFocusListener >& xListener ) throw( RuntimeException )
{
	impl_getMultiplexer()->unadvise( ::getCppuType(( const Reference< XFocusListener >*)0), xListener );
}

//____________________________________________________________________________________________________________
//	XWindow
//____________________________________________________________________________________________________________

void SAL_CALL BaseControl::removeKeyListener( const Reference< XKeyListener >& xListener ) throw( RuntimeException )
{
	impl_getMultiplexer()->unadvise( ::getCppuType(( const Reference< XKeyListener >*)0), xListener );
}

//____________________________________________________________________________________________________________
//	XWindow
//____________________________________________________________________________________________________________

void SAL_CALL BaseControl::removeMouseListener( const Reference< XMouseListener >& xListener ) throw( RuntimeException )
{
	impl_getMultiplexer()->unadvise( ::getCppuType(( const Reference< XMouseListener >*)0), xListener );
}

//____________________________________________________________________________________________________________
//	XWindow
//____________________________________________________________________________________________________________

void  SAL_CALL BaseControl::removeMouseMotionListener( const Reference< XMouseMotionListener >& xListener ) throw( RuntimeException )
{
	impl_getMultiplexer()->unadvise( ::getCppuType(( const Reference< XMouseMotionListener >*)0), xListener );
}

//____________________________________________________________________________________________________________
//	XWindow
//____________________________________________________________________________________________________________

void SAL_CALL BaseControl::removePaintListener( const Reference< XPaintListener >& xListener ) throw( RuntimeException )
{
	impl_getMultiplexer()->unadvise( ::getCppuType(( const Reference< XPaintListener >*)0), xListener );
}

//____________________________________________________________________________________________________________
//	XView
//____________________________________________________________________________________________________________

void SAL_CALL BaseControl::draw(	sal_Int32	nX	,
									sal_Int32	nY	) throw( RuntimeException )
{
	// Ready for multithreading
	MutexGuard aGuard( m_aMutex );

	// - paint to an view
	// - use the method "paint()"
	// - see also "windowPaint()"
	impl_paint( nX, nY, m_xGraphicsView );
}

//____________________________________________________________________________________________________________
//	XView
//____________________________________________________________________________________________________________

sal_Bool SAL_CALL BaseControl::setGraphics( const Reference< XGraphics >& xDevice ) throw( RuntimeException )
{
	// - set the graphics for an view
	// - in this class exist 2 graphics-member ... one for peer[_xGraphicsPeer] and one for view[_xGraphicsView]
	// - they are used by "windowPaint() and draw()", forwarded to "paint ()"
	sal_Bool bReturn = sal_False ;
	if ( xDevice.is() == sal_True )
	{
		// Ready for multithreading
		MutexGuard aGuard( m_aMutex );

		m_xGraphicsView	= xDevice	;
		bReturn			= sal_True	;
	}

	return bReturn ;
}

//____________________________________________________________________________________________________________
//	XView
//____________________________________________________________________________________________________________

void SAL_CALL BaseControl::setZoom(	float	/*fZoomX*/	,
									float	/*fZoomY*/	) throw( RuntimeException )
{
	// Not implemented yet
}

//____________________________________________________________________________________________________________
//	XView
//____________________________________________________________________________________________________________

Reference< XGraphics > SAL_CALL BaseControl::getGraphics() throw( RuntimeException )
{
	// Ready for multithreading
	MutexGuard aGuard( m_aMutex );
	return m_xGraphicsView ;
}

//____________________________________________________________________________________________________________
//	XView
//____________________________________________________________________________________________________________

Size SAL_CALL BaseControl::getSize() throw( RuntimeException )
{
	// Ready for multithreading
	MutexGuard aGuard( m_aMutex );
	return Size( m_nWidth, m_nHeight );
}

//____________________________________________________________________________________________________________
//	XEventListener
//____________________________________________________________________________________________________________

void SAL_CALL BaseControl::disposing( const EventObject& /*aSource*/ ) throw( RuntimeException )
{
	// Ready for multithreading
	MutexGuard aGuard( m_aMutex );

	// - release ALL references
	// - it must be !!!
	if ( m_xGraphicsPeer.is() == sal_True )
	{
		removePaintListener( this );
		removeWindowListener( this );
		m_xGraphicsPeer = Reference< XGraphics >();
	}

	if ( m_xGraphicsView.is() == sal_True )
	{
		m_xGraphicsView = Reference< XGraphics >();
	}
}

//____________________________________________________________________________________________________________
//	XPaintListener
//____________________________________________________________________________________________________________

void SAL_CALL BaseControl::windowPaint( const PaintEvent& /*aEvent*/ ) throw( RuntimeException )
{
	// Ready for multithreading
	MutexGuard aGuard( m_aMutex );

	// - repaint the peer
	// - use the method "paint ()" for painting on a peer and a print device !!!
	// - see also "draw ()"
	impl_paint( 0, 0, m_xGraphicsPeer );
}

//____________________________________________________________________________________________________________
//	XWindowListener
//____________________________________________________________________________________________________________

void SAL_CALL BaseControl::windowResized( const WindowEvent& aEvent ) throw( RuntimeException )
{
	// Ready for multithreading
	MutexGuard aGuard( m_aMutex );

	m_nWidth	=	aEvent.Width	;
	m_nHeight	=	aEvent.Height	;
	WindowEvent aMappedEvent = aEvent;
	aMappedEvent.X = 0;
	aMappedEvent.Y = 0;
	impl_recalcLayout( aMappedEvent );
}

//____________________________________________________________________________________________________________
//	XWindowListener
//____________________________________________________________________________________________________________

void SAL_CALL BaseControl::windowMoved( const WindowEvent& aEvent ) throw( RuntimeException )
{
	// Ready for multithreading
	MutexGuard aGuard( m_aMutex );

	m_nWidth	=	aEvent.Width	;
	m_nHeight	=	aEvent.Height	;
	WindowEvent aMappedEvent = aEvent;
	aMappedEvent.X = 0;
	aMappedEvent.Y = 0;
	impl_recalcLayout( aMappedEvent );
}

//____________________________________________________________________________________________________________
//	XWindowListener
//____________________________________________________________________________________________________________

void SAL_CALL BaseControl::windowShown( const EventObject& /*aEvent*/ ) throw( RuntimeException )
{
}

//____________________________________________________________________________________________________________
//	XWindowListener
//____________________________________________________________________________________________________________

void SAL_CALL BaseControl::windowHidden( const EventObject& /*aEvent*/ ) throw( RuntimeException )
{
}

//____________________________________________________________________________________________________________
//	impl but public method to register service in DLL
//	(In this BASE-implementation not implemented! Overwrite it in derived classes.)
//____________________________________________________________________________________________________________

const Sequence< OUString > BaseControl::impl_getStaticSupportedServiceNames()
{
	return Sequence< OUString >();
}

//____________________________________________________________________________________________________________
//	impl but public method to register service in DLL
//	(In this BASE-implementation not implemented! Overwrite it in derived classes.)
//____________________________________________________________________________________________________________

const OUString BaseControl::impl_getStaticImplementationName()
{
	return OUString();
}

//____________________________________________________________________________________________________________
//	protected method
//____________________________________________________________________________________________________________

const Reference< XMultiServiceFactory > BaseControl::impl_getMultiServiceFactory()
{
	return m_xFactory ;
}

//____________________________________________________________________________________________________________
//	protected method
//____________________________________________________________________________________________________________

const Reference< XWindow > BaseControl::impl_getPeerWindow()
{
	return m_xPeerWindow ;
}

//____________________________________________________________________________________________________________
//	protected method
//____________________________________________________________________________________________________________

const Reference< XGraphics > BaseControl::impl_getGraphicsPeer()
{
	return m_xGraphicsPeer ;
}

//____________________________________________________________________________________________________________
//	protected method
//____________________________________________________________________________________________________________

const sal_Int32& BaseControl::impl_getWidth()
{
	return m_nWidth ;
}

//____________________________________________________________________________________________________________
//	protected method
//____________________________________________________________________________________________________________

const sal_Int32& BaseControl::impl_getHeight()
{
	return m_nHeight ;
}

//____________________________________________________________________________________________________________
//	protected method
//____________________________________________________________________________________________________________

WindowDescriptor* BaseControl::impl_getWindowDescriptor( const Reference< XWindowPeer >& xParentPeer )
{
	// - used from "createPeer()" to set the values of an ::com::sun::star::awt::WindowDescriptor !!!
	// - if you will change the descriptor-values, you must override this virtuell function
	// - the caller must release the memory for this dynamical descriptor !!!

	WindowDescriptor* pDescriptor = new WindowDescriptor ;

	pDescriptor->Type				= WindowClass_SIMPLE					;
	pDescriptor->WindowServiceName	= OUString::createFromAscii( "window" )	;
	pDescriptor->ParentIndex		= -1									;
	pDescriptor->Parent				= xParentPeer							;
	pDescriptor->Bounds				= getPosSize ()							;
	pDescriptor->WindowAttributes	= 0										;

	return pDescriptor ;
}

//____________________________________________________________________________________________________________
//	protected method
//____________________________________________________________________________________________________________

void BaseControl::impl_paint(			sal_Int32				/*nX*/			,
										sal_Int32				/*nY*/			,
								const	Reference< XGraphics >&	/*xGraphics*/	)
{
	// - one paint method for peer AND view !!!
	//   (see also => "windowPaint()" and "draw()")
	// - not used in this implementation, but its not necessary to make it pure virtual !!!
}

//____________________________________________________________________________________________________________
//	protected method
//____________________________________________________________________________________________________________

void BaseControl::impl_recalcLayout( const WindowEvent& /*aEvent*/ )
{
	// We need as virtual function to support automatically resizing of derived controls!
	// But we make it not pure virtual because it's not necessary for all derived classes!
}

//____________________________________________________________________________________________________________
//	protected method
//____________________________________________________________________________________________________________

Reference< XInterface > BaseControl::impl_getDelegator()
{
	return m_xDelegator ;
}

//____________________________________________________________________________________________________________
//	private method
//____________________________________________________________________________________________________________

void BaseControl::impl_releasePeer()
{
	if ( m_xPeer.is() == sal_True )
	{
		if ( m_xGraphicsPeer.is() == sal_True )
		{
			removePaintListener( this );
			removeWindowListener( this );
			m_xGraphicsPeer = Reference< XGraphics >();
		}

		m_xPeer->dispose();
		m_xPeerWindow	= Reference< XWindow >();
		m_xPeer			= Reference< XWindowPeer >();

		if ( m_pMultiplexer != NULL )
		{
			// take changes on multiplexer
			m_pMultiplexer->setPeer( Reference< XWindow >() );
		}
	}
}

//____________________________________________________________________________________________________________
//	private method
//____________________________________________________________________________________________________________

OMRCListenerMultiplexerHelper* BaseControl::impl_getMultiplexer()
{
	if ( m_pMultiplexer == NULL )
	{
		m_pMultiplexer = new OMRCListenerMultiplexerHelper( (XWindow*)this, m_xPeerWindow );
		m_xMultiplexer = Reference< XInterface >( (OWeakObject*)m_pMultiplexer, UNO_QUERY );
	}

	return m_pMultiplexer ;
}

} // namespace unocontrols
