/**************************************************************
 * 
 * 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_dbui.hxx"
#ifndef DBACCESS_TABLEWINDOWACCESS_HXX
#include "TableWindowAccess.hxx"
#endif
#ifndef DBACCESS_JACCESS_HXX
#include "JAccess.hxx"
#endif
#ifndef DBAUI_TABLEWINDOW_HXX
#include "TableWindow.hxx"
#endif
#ifndef DBAUI_TABLEWINDOWLISTBOX_HXX
#include "TableWindowListBox.hxx"
#endif
#ifndef DBAUI_JOINDESIGNVIEW_HXX
#include "JoinDesignView.hxx"
#endif
#ifndef DBAUI_JOINCONTROLLER_HXX
#include "JoinController.hxx"
#endif
#ifndef DBAUI_JOINTABLEVIEW_HXX
#include "JoinTableView.hxx"
#endif
#ifndef _COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLEROLE_HPP_
#include <com/sun/star/accessibility/AccessibleRole.hpp>
#endif												 
#ifndef _COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLERELATIONTYPE_HPP_
#include <com/sun/star/accessibility/AccessibleRelationType.hpp>
#endif
#ifndef _COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLESTATETYPE_HPP_
#include <com/sun/star/accessibility/AccessibleStateType.hpp>
#endif
#ifndef _COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLEEVENTID_HPP_
#include <com/sun/star/accessibility/AccessibleEventId.hpp>
#endif
#ifndef _COMPHELPER_SEQUENCE_HXX_
#include <comphelper/sequence.hxx>
#endif
#ifndef _DBU_QRY_HRC_
#include "dbu_qry.hrc"
#endif


namespace dbaui
{
	using namespace ::com::sun::star::accessibility;
	using namespace ::com::sun::star::uno;
	using namespace ::com::sun::star::beans;
	using namespace ::com::sun::star::lang;
	//	using namespace ::com::sun::star::awt;
	using namespace ::com::sun::star;

	OTableWindowAccess::OTableWindowAccess(OTableWindow* _pTable)
		:VCLXAccessibleComponent(_pTable->GetComponentInterface().is() ? _pTable->GetWindowPeer() : NULL) 
		,m_pTable(_pTable)
	{
	}
	// -----------------------------------------------------------------------------
    void SAL_CALL OTableWindowAccess::disposing()
	{
		m_pTable = NULL;
		VCLXAccessibleComponent::disposing();
	}
    // -----------------------------------------------------------------------------
    void OTableWindowAccess::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent )
	{
        if ( rVclWindowEvent.GetId() == VCLEVENT_OBJECT_DYING )
		{
        	::osl::MutexGuard aGuard( m_aMutex );
            m_pTable = NULL;
		}

        VCLXAccessibleComponent::ProcessWindowEvent( rVclWindowEvent );
	}
	// -----------------------------------------------------------------------------
	Any SAL_CALL OTableWindowAccess::queryInterface( const Type& aType ) throw (RuntimeException)
	{
		Any aRet(VCLXAccessibleComponent::queryInterface( aType ));
		return aRet.hasValue() ? aRet : OTableWindowAccess_BASE::queryInterface( aType );
	}
	// -----------------------------------------------------------------------------
	Sequence< Type > SAL_CALL OTableWindowAccess::getTypes(  ) throw (RuntimeException)
	{
		return ::comphelper::concatSequences(VCLXAccessibleComponent::getTypes(),OTableWindowAccess_BASE::getTypes());
	}
	// -----------------------------------------------------------------------------
	::rtl::OUString SAL_CALL OTableWindowAccess::getImplementationName() throw(RuntimeException)
	{
		return getImplementationName_Static();
	}
	// -----------------------------------------------------------------------------
	Sequence< ::rtl::OUString > SAL_CALL OTableWindowAccess::getSupportedServiceNames() throw(RuntimeException)
	{
		return getSupportedServiceNames_Static();
	}
	// -----------------------------------------------------------------------------
	// XServiceInfo - static methods
	Sequence< ::rtl::OUString > OTableWindowAccess::getSupportedServiceNames_Static(void) throw( RuntimeException )
	{
		Sequence< ::rtl::OUString > aSupported(2);
		aSupported[0] = ::rtl::OUString::createFromAscii("com.sun.star.accessibility.Accessible");
		aSupported[1] = ::rtl::OUString::createFromAscii("com.sun.star.accessibility.AccessibleContext");
		return aSupported;
	}
	// -----------------------------------------------------------------------------
	::rtl::OUString OTableWindowAccess::getImplementationName_Static(void) throw( RuntimeException )
	{
		return ::rtl::OUString::createFromAscii("org.openoffice.comp.dbu.TableWindowAccessibility");
	}
	// -----------------------------------------------------------------------------
	// XAccessibleContext
    sal_Int32 SAL_CALL OTableWindowAccess::getAccessibleChildCount(  ) throw (RuntimeException)
    {
        ::osl::MutexGuard aGuard( m_aMutex );
        sal_Int32 nCount = 0;
        if(m_pTable)
        {
            if(m_pTable->GetTitleCtrl())
                ++nCount;
            if(m_pTable->GetListBox())
                ++nCount;
        }
		return nCount;
	}
    // -----------------------------------------------------------------------------
    Reference< XAccessible > SAL_CALL OTableWindowAccess::getAccessibleChild( sal_Int32 i ) throw (IndexOutOfBoundsException,RuntimeException)
    {
        ::osl::MutexGuard aGuard( m_aMutex );
        Reference< XAccessible > aRet;
        if(m_pTable)
        {
            switch(i)
            {
                case 0:
                    if(m_pTable->GetTitleCtrl())
                    {
                        aRet = m_pTable->GetTitleCtrl()->GetAccessible();
                        break;
                    } // fall through if title control does not exist
                case 1:
                    if(m_pTable->GetListBox())
                        aRet = m_pTable->GetListBox()->GetAccessible();
                    break;
                default:
                    throw IndexOutOfBoundsException();
            }
        }
        return aRet;
    }
	// -----------------------------------------------------------------------------
	sal_Int32 SAL_CALL OTableWindowAccess::getAccessibleIndexInParent(  ) throw (RuntimeException)
	{
		::osl::MutexGuard aGuard( m_aMutex  );
		sal_Int32 nIndex = -1;
		if( m_pTable )
		{
			// search the postion of our table window in the table window map
			OJoinTableView::OTableWindowMap* pMap = m_pTable->getTableView()->GetTabWinMap();
			OJoinTableView::OTableWindowMap::iterator aIter = pMap->begin();
            OJoinTableView::OTableWindowMap::iterator aEnd = pMap->end();
			for (nIndex = 0; aIter != aEnd && aIter->second != m_pTable; ++nIndex,++aIter)
				;
			nIndex = aIter != aEnd ? nIndex : -1;
		}
		return nIndex;
	}
	// -----------------------------------------------------------------------------
	sal_Int16 SAL_CALL OTableWindowAccess::getAccessibleRole(  ) throw (RuntimeException)
	{
		return AccessibleRole::PANEL; // ? or may be an AccessibleRole::WINDOW
	}
	// -----------------------------------------------------------------------------
	Reference< XAccessibleRelationSet > SAL_CALL OTableWindowAccess::getAccessibleRelationSet(  ) throw (RuntimeException)
	{
		::osl::MutexGuard aGuard( m_aMutex  );
		return this;
	}
	// -----------------------------------------------------------------------------
	// XAccessibleComponent
	Reference< XAccessible > SAL_CALL OTableWindowAccess::getAccessibleAtPoint( const awt::Point& _aPoint ) throw (RuntimeException)
	{
		::osl::MutexGuard aGuard( m_aMutex  );
		Reference< XAccessible > aRet;
		if( m_pTable )
		{
			Point aPoint(_aPoint.X,_aPoint.Y);
			Rectangle aRect(m_pTable->GetDesktopRectPixel());
			if( aRect.IsInside(aPoint) )
				aRet = this;
			else if( m_pTable->GetListBox()->GetDesktopRectPixel().IsInside(aPoint))
				aRet = m_pTable->GetListBox()->GetAccessible();
		}
		return aRet;
	}
	// -----------------------------------------------------------------------------
	Reference< XAccessible > OTableWindowAccess::getParentChild(sal_Int32 _nIndex)
	{
		Reference< XAccessible > xReturn;
		Reference< XAccessible > xParent = getAccessibleParent();
		if ( xParent.is() )
		{
			Reference< XAccessibleContext > xParentContext = xParent->getAccessibleContext();
			if ( xParentContext.is() )
			{
				xReturn = xParentContext->getAccessibleChild(_nIndex);
			}
		}
		return xReturn;
	}	
	// -----------------------------------------------------------------------------

	sal_Int32 SAL_CALL OTableWindowAccess::getRelationCount(  ) throw (RuntimeException)
	{
		::osl::MutexGuard aGuard( m_aMutex  );
		return m_pTable ? m_pTable->getTableView()->getConnectionCount(m_pTable) : sal_Int32(0);
	}
	// -----------------------------------------------------------------------------
	AccessibleRelation SAL_CALL OTableWindowAccess::getRelation( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException)
	{
		::osl::MutexGuard aGuard( m_aMutex  );
		if( nIndex < 0 || nIndex >= getRelationCount() )
			throw IndexOutOfBoundsException();

		AccessibleRelation aRet;
		if( m_pTable )
		{
			OJoinTableView* pView = m_pTable->getTableView();
			::std::vector<OTableConnection*>::const_iterator aIter = pView->getTableConnections(m_pTable) + nIndex;
			aRet.TargetSet.realloc(1);
			aRet.TargetSet[0] = getParentChild(aIter - pView->getTableConnections()->begin());
			aRet.RelationType = AccessibleRelationType::CONTROLLER_FOR;
		}
		return aRet;
	}
	// -----------------------------------------------------------------------------
	sal_Bool SAL_CALL OTableWindowAccess::containsRelation( sal_Int16 aRelationType ) throw (RuntimeException)
	{
		::osl::MutexGuard aGuard( m_aMutex  );
		return		AccessibleRelationType::CONTROLLER_FOR == aRelationType 
				&&	m_pTable && m_pTable->getTableView()->ExistsAConn(m_pTable);
	}
	// -----------------------------------------------------------------------------
	AccessibleRelation SAL_CALL OTableWindowAccess::getRelationByType( sal_Int16 aRelationType ) throw (RuntimeException)
	{
		::osl::MutexGuard aGuard( m_aMutex  );
		if( AccessibleRelationType::CONTROLLER_FOR == aRelationType && m_pTable)
		{
			OJoinTableView* pView = m_pTable->getTableView();
			const ::std::vector<OTableConnection*>* pConnectionList = pView->getTableConnections();
			
			::std::vector<OTableConnection*>::const_iterator aIter = pView->getTableConnections(m_pTable);
            ::std::vector<OTableConnection*>::const_iterator aEnd = pConnectionList->end();
			::std::vector< Reference<XInterface> > aRelations;
			aRelations.reserve(5); // just guessing
			for (; aIter != aEnd ; ++aIter )
				aRelations.push_back(getParentChild(aIter - pConnectionList->begin()));
			
			Reference<XInterface> *pRelations = aRelations.empty() ? 0 : &aRelations[0];
			Sequence< Reference<XInterface> > aSeq(pRelations, aRelations.size());
			return AccessibleRelation(AccessibleRelationType::CONTROLLER_FOR,aSeq);
		}
		return AccessibleRelation();
	}
	// -----------------------------------------------------------------------------
	sal_Bool OTableWindowAccess::isEditable() const
	{
		return m_pTable && !m_pTable->getTableView()->getDesignView()->getController().isReadOnly();
	}
	// -----------------------------------------------------------------------------
	::rtl::OUString SAL_CALL OTableWindowAccess::getTitledBorderText(  ) throw (RuntimeException)
	{
		return getAccessibleName(  );
	}
	// -----------------------------------------------------------------------------
	::rtl::OUString SAL_CALL OTableWindowAccess::getAccessibleName(  ) throw (RuntimeException)
	{
		::osl::MutexGuard aGuard( m_aMutex  );
		::rtl::OUString sAccessibleName;
		if ( m_pTable )
			sAccessibleName = m_pTable->getTitle();
		return sAccessibleName;
	}
	// -----------------------------------------------------------------------------
	Reference< XAccessibleContext > SAL_CALL OTableWindowAccess::getAccessibleContext(  ) throw (::com::sun::star::uno::RuntimeException)
	{
		return this;
	}
	// -----------------------------------------------------------------------------

}
// -----------------------------------------------------------------------------

