/**************************************************************
 * 
 * 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_accessibility.hxx"
#include <accessibility/extended/AccessibleBrowseBoxCheckBoxCell.hxx>
#include <com/sun/star/accessibility/AccessibleEventId.hpp>
#include <svtools/accessibletableprovider.hxx>

namespace accessibility
{
	using namespace com::sun::star::accessibility;
	using namespace com::sun::star::uno;
	using namespace com::sun::star::accessibility::AccessibleEventId;
    using namespace ::svt;

	AccessibleCheckBoxCell::AccessibleCheckBoxCell(const Reference<XAccessible >& _rxParent,
								IAccessibleTableProvider& _rBrowseBox,
								const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow >& _xFocusWindow,
								sal_Int32 _nRowPos,
								sal_uInt16 _nColPos
								,const TriState& _eState,
								sal_Bool _bEnabled,
								sal_Bool _bIsTriState)
        :AccessibleBrowseBoxCell(_rxParent, _rBrowseBox, _xFocusWindow, _nRowPos, _nColPos, BBTYPE_CHECKBOXCELL)
		,m_eState(_eState)
		,m_bEnabled(_bEnabled)
		,m_bIsTriState(_bIsTriState)
	{
	}
	// -----------------------------------------------------------------------------
	IMPLEMENT_FORWARD_XINTERFACE2( AccessibleCheckBoxCell, AccessibleBrowseBoxCell, AccessibleCheckBoxCell_BASE )
		// -----------------------------------------------------------------------------
	IMPLEMENT_FORWARD_XTYPEPROVIDER2( AccessibleCheckBoxCell, AccessibleBrowseBoxCell, AccessibleCheckBoxCell_BASE )
	//--------------------------------------------------------------------
	Reference< XAccessibleContext > SAL_CALL AccessibleCheckBoxCell::getAccessibleContext(  ) throw (RuntimeException)
	{
		ensureIsAlive();
		return this;
	}
	// -----------------------------------------------------------------------------
	::utl::AccessibleStateSetHelper* AccessibleCheckBoxCell::implCreateStateSetHelper()
	{
        ::utl::AccessibleStateSetHelper* pStateSetHelper =
            AccessibleBrowseBoxCell::implCreateStateSetHelper();
        if( isAlive() )
        {
            mpBrowseBox->FillAccessibleStateSetForCell(
                *pStateSetHelper, getRowPos(), static_cast< sal_uInt16 >( getColumnPos() ) );
            if ( m_eState == STATE_CHECK )
                pStateSetHelper->AddState( AccessibleStateType::CHECKED );
        }
        return pStateSetHelper;
	}
	// -----------------------------------------------------------------------------
	// -----------------------------------------------------------------------------
	// XAccessibleValue
	// -----------------------------------------------------------------------------

	Any SAL_CALL AccessibleCheckBoxCell::getCurrentValue(  ) throw (RuntimeException)
	{
		::osl::MutexGuard aGuard( getOslMutex() );

		sal_Int32 nValue = 0;
		switch( m_eState )
		{
			case STATE_NOCHECK:
				nValue = 0;
				break;
			case STATE_CHECK:
				nValue = 1;
				break;
			case STATE_DONTKNOW:
				nValue = 2;
				break;
		}
		return makeAny(nValue);
	}

	// -----------------------------------------------------------------------------

	sal_Bool SAL_CALL AccessibleCheckBoxCell::setCurrentValue( const Any& ) throw (RuntimeException)
	{
		return sal_False;
	}

	// -----------------------------------------------------------------------------

	Any SAL_CALL AccessibleCheckBoxCell::getMaximumValue(  ) throw (RuntimeException)
	{
		::osl::MutexGuard aGuard( getOslMutex() );

		Any aValue;

		if ( m_bIsTriState )
			aValue <<= (sal_Int32) 2;
		else
			aValue <<= (sal_Int32) 1;
					
		return aValue;
	}

	// -----------------------------------------------------------------------------

	Any SAL_CALL AccessibleCheckBoxCell::getMinimumValue(  ) throw (RuntimeException)
	{
		Any aValue;
		aValue <<= (sal_Int32) 0;
		
		return aValue;
	}
	// -----------------------------------------------------------------------------
	// XAccessibleContext
	sal_Int32 SAL_CALL AccessibleCheckBoxCell::getAccessibleChildCount(  ) throw (::com::sun::star::uno::RuntimeException)
	{
		return 0;
	}
	// -----------------------------------------------------------------------------
	::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > SAL_CALL AccessibleCheckBoxCell::getAccessibleChild( sal_Int32 ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException)
	{
		throw ::com::sun::star::lang::IndexOutOfBoundsException();
	}
	// -----------------------------------------------------------------------------
	::rtl::OUString SAL_CALL AccessibleCheckBoxCell::getImplementationName() throw ( ::com::sun::star::uno::RuntimeException )
	{
		return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.svtools.TableCheckBoxCell" ) );
	}
    // -----------------------------------------------------------------------------
    sal_Int32 SAL_CALL AccessibleCheckBoxCell::getAccessibleIndexInParent()
            throw ( ::com::sun::star::uno::RuntimeException )
    {
        ::osl::MutexGuard aGuard( getOslMutex() );

        return ( getRowPos() * mpBrowseBox->GetColumnCount() ) + getColumnPos();
    }
    // -----------------------------------------------------------------------------
    void AccessibleCheckBoxCell::SetChecked( sal_Bool _bChecked )
    {
        m_eState = _bChecked ? STATE_CHECK : STATE_NOCHECK;
        Any aOldValue, aNewValue;
        if ( _bChecked )
            aNewValue <<= AccessibleStateType::CHECKED;
        else
            aOldValue <<= AccessibleStateType::CHECKED;
        commitEvent( AccessibleEventId::STATE_CHANGED, aNewValue, aOldValue );
    }
}

