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



// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_comphelper.hxx"
#include <comphelper/accessiblecomponenthelper.hxx>

//.........................................................................
namespace comphelper
{
//.........................................................................

	using namespace ::com::sun::star::uno;
	using namespace ::com::sun::star::awt;
	using namespace ::com::sun::star::lang;
	using namespace ::com::sun::star::accessibility;

	//=====================================================================
	//= OCommonAccessibleComponent
	//=====================================================================
	//---------------------------------------------------------------------
	OCommonAccessibleComponent::OCommonAccessibleComponent( )
	{
	}

	//---------------------------------------------------------------------
	OCommonAccessibleComponent::OCommonAccessibleComponent( IMutex* _pExternalLock )
		:OAccessibleContextHelper( _pExternalLock )
	{
	}

	//---------------------------------------------------------------------
	OCommonAccessibleComponent::~OCommonAccessibleComponent( )
	{
		forgetExternalLock();
			// this ensures that the lock, which may be already destroyed as part of the derivee,
			// is not used anymore
	}

	//--------------------------------------------------------------------
	sal_Bool SAL_CALL OCommonAccessibleComponent::containsPoint( const Point& _rPoint ) throw (RuntimeException)
	{
		OExternalLockGuard aGuard( this );
		Rectangle aBounds( implGetBounds() );
		return	( _rPoint.X >= 0 )
			&&	( _rPoint.Y >= 0 )
			&&	( _rPoint.X < aBounds.Width )
			&&	( _rPoint.Y < aBounds.Height );
	}

	//--------------------------------------------------------------------
	Point SAL_CALL OCommonAccessibleComponent::getLocation(  ) throw (RuntimeException)
	{
		OExternalLockGuard aGuard( this );
		Rectangle aBounds( implGetBounds() );
		return Point( aBounds.X, aBounds.Y );
	}

	//--------------------------------------------------------------------
	Point SAL_CALL OCommonAccessibleComponent::getLocationOnScreen(  ) throw (RuntimeException)
	{
		OExternalLockGuard aGuard( this );
		Rectangle aBounds( implGetBounds() );

		Point aScreenLoc( 0, 0 );

		Reference< XAccessibleComponent > xParentComponent( implGetParentContext(), UNO_QUERY );
		OSL_ENSURE( xParentComponent.is(), "OCommonAccessibleComponent::getLocationOnScreen: no parent component!" );
		if ( xParentComponent.is() )
		{
			Point aParentScreenLoc( xParentComponent->getLocationOnScreen() );
			Point aOwnRelativeLoc( getLocation() );
			aScreenLoc.X = aParentScreenLoc.X + aOwnRelativeLoc.X;
			aScreenLoc.Y = aParentScreenLoc.Y + aOwnRelativeLoc.Y;
		}

		return aScreenLoc;
	}

	//--------------------------------------------------------------------
	Size SAL_CALL OCommonAccessibleComponent::getSize(  ) throw (RuntimeException)
	{
		OExternalLockGuard aGuard( this );
		Rectangle aBounds( implGetBounds() );
		return Size( aBounds.Width, aBounds.Height );
	}

	//--------------------------------------------------------------------
	Rectangle SAL_CALL OCommonAccessibleComponent::getBounds(  ) throw (RuntimeException)
	{
		OExternalLockGuard aGuard( this );
		return implGetBounds();
	}

	//=====================================================================
	//= OAccessibleComponentHelper
	//=====================================================================
	//---------------------------------------------------------------------
	OAccessibleComponentHelper::OAccessibleComponentHelper( )
	{
	}

	//---------------------------------------------------------------------
	OAccessibleComponentHelper::OAccessibleComponentHelper( IMutex* _pExternalLock )
		:OCommonAccessibleComponent( _pExternalLock )
	{
	}

	//--------------------------------------------------------------------
	IMPLEMENT_FORWARD_XINTERFACE2( OAccessibleComponentHelper, OCommonAccessibleComponent, OAccessibleComponentHelper_Base )
	IMPLEMENT_FORWARD_XTYPEPROVIDER2( OAccessibleComponentHelper, OCommonAccessibleComponent, OAccessibleComponentHelper_Base )
		// (order matters: the first is the class name, the second is the class doing the ref counting)

	//--------------------------------------------------------------------
	sal_Bool SAL_CALL OAccessibleComponentHelper::containsPoint( const Point& _rPoint ) throw (RuntimeException)
	{
		return OCommonAccessibleComponent::containsPoint( _rPoint );
	}

	//--------------------------------------------------------------------
	Point SAL_CALL OAccessibleComponentHelper::getLocation(  ) throw (RuntimeException)
	{
		return OCommonAccessibleComponent::getLocation( );
	}

	//--------------------------------------------------------------------
	Point SAL_CALL OAccessibleComponentHelper::getLocationOnScreen(  ) throw (RuntimeException)
	{
		return OCommonAccessibleComponent::getLocationOnScreen( );
	}

	//--------------------------------------------------------------------
	Size SAL_CALL OAccessibleComponentHelper::getSize(  ) throw (RuntimeException)
	{
		return OCommonAccessibleComponent::getSize( );
	}

	//--------------------------------------------------------------------
	Rectangle SAL_CALL OAccessibleComponentHelper::getBounds(  ) throw (RuntimeException)
	{
		return OCommonAccessibleComponent::getBounds( );
	}

	//=====================================================================
	//= OAccessibleExtendedComponentHelper
	//=====================================================================
	//---------------------------------------------------------------------
	OAccessibleExtendedComponentHelper::OAccessibleExtendedComponentHelper( )
	{
	}

	//---------------------------------------------------------------------
	OAccessibleExtendedComponentHelper::OAccessibleExtendedComponentHelper( IMutex* _pExternalLock )
		:OCommonAccessibleComponent( _pExternalLock )
	{
	}

	//--------------------------------------------------------------------
	IMPLEMENT_FORWARD_XINTERFACE2( OAccessibleExtendedComponentHelper, OCommonAccessibleComponent, OAccessibleExtendedComponentHelper_Base )
	IMPLEMENT_FORWARD_XTYPEPROVIDER2( OAccessibleExtendedComponentHelper, OCommonAccessibleComponent, OAccessibleExtendedComponentHelper_Base )
		// (order matters: the first is the class name, the second is the class doing the ref counting)

	//--------------------------------------------------------------------
	sal_Bool SAL_CALL OAccessibleExtendedComponentHelper::containsPoint( const Point& _rPoint ) throw (RuntimeException)
	{
		return OCommonAccessibleComponent::containsPoint( _rPoint );
	}

	//--------------------------------------------------------------------
	Point SAL_CALL OAccessibleExtendedComponentHelper::getLocation(  ) throw (RuntimeException)
	{
		return OCommonAccessibleComponent::getLocation( );
	}

	//--------------------------------------------------------------------
	Point SAL_CALL OAccessibleExtendedComponentHelper::getLocationOnScreen(  ) throw (RuntimeException)
	{
		return OCommonAccessibleComponent::getLocationOnScreen( );
	}

	//--------------------------------------------------------------------
	Size SAL_CALL OAccessibleExtendedComponentHelper::getSize(  ) throw (RuntimeException)
	{
		return OCommonAccessibleComponent::getSize( );
	}

	//--------------------------------------------------------------------
	Rectangle SAL_CALL OAccessibleExtendedComponentHelper::getBounds(  ) throw (RuntimeException)
	{
		return OCommonAccessibleComponent::getBounds( );
	}

//.........................................................................
}	// namespace comphelper
//.........................................................................


