/**************************************************************
 * 
 * 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_dbaccess.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;
	}
	// -----------------------------------------------------------------------------

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

