1*d3553c6bSHerbert Dürr /**************************************************************
22bfcd321SSteve Yin  *
3*d3553c6bSHerbert Dürr  * Licensed to the Apache Software Foundation (ASF) under one
4*d3553c6bSHerbert Dürr  * or more contributor license agreements.  See the NOTICE file
5*d3553c6bSHerbert Dürr  * distributed with this work for additional information
6*d3553c6bSHerbert Dürr  * regarding copyright ownership.  The ASF licenses this file
7*d3553c6bSHerbert Dürr  * to you under the Apache License, Version 2.0 (the
8*d3553c6bSHerbert Dürr  * "License"); you may not use this file except in compliance
9*d3553c6bSHerbert Dürr  * with the License.  You may obtain a copy of the License at
10*d3553c6bSHerbert Dürr  *
11*d3553c6bSHerbert Dürr  *   http://www.apache.org/licenses/LICENSE-2.0
12*d3553c6bSHerbert Dürr  *
13*d3553c6bSHerbert Dürr  * Unless required by applicable law or agreed to in writing,
14*d3553c6bSHerbert Dürr  * software distributed under the License is distributed on an
15*d3553c6bSHerbert Dürr  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*d3553c6bSHerbert Dürr  * KIND, either express or implied.  See the License for the
17*d3553c6bSHerbert Dürr  * specific language governing permissions and limitations
18*d3553c6bSHerbert Dürr  * under the License.
19*d3553c6bSHerbert Dürr  *
20*d3553c6bSHerbert Dürr  *************************************************************/
212bfcd321SSteve Yin 
222bfcd321SSteve Yin 
232bfcd321SSteve Yin // MARKER(update_precomp.py): autogen include statement, do not remove
242bfcd321SSteve Yin #include "precompiled_svtools.hxx"
252bfcd321SSteve Yin 
262bfcd321SSteve Yin #ifndef _SVTOOLS_VCLXACCESSIBLEHEADERBAR_HXX_
272bfcd321SSteve Yin #include <svtools/vclxaccessibleheaderbar.hxx>
282bfcd321SSteve Yin #endif
292bfcd321SSteve Yin #ifndef _SVTOOLS_VCLACCESSIBLEHEADBARITEM_HXX_
302bfcd321SSteve Yin #include <svtools/vclxaccessibleheaderbaritem.hxx>
312bfcd321SSteve Yin #endif
322bfcd321SSteve Yin 
332bfcd321SSteve Yin #ifndef _TOOLKIT_AWT_VCLXWINDOWS_HXX_
342bfcd321SSteve Yin #include <toolkit/awt/vclxwindows.hxx>
352bfcd321SSteve Yin #endif
362bfcd321SSteve Yin #ifndef _HEADBAR_HXX
372bfcd321SSteve Yin #include <headbar.hxx>
382bfcd321SSteve Yin #endif
392bfcd321SSteve Yin #ifndef _UTL_ACCESSIBLESTATESETHELPER_HXX_
402bfcd321SSteve Yin #include <unotools/accessiblestatesethelper.hxx>
412bfcd321SSteve Yin #endif
422bfcd321SSteve Yin #ifndef _COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLESTATETYPE_HPP_
432bfcd321SSteve Yin #include <com/sun/star/accessibility/AccessibleStateType.hpp>
442bfcd321SSteve Yin #endif
452bfcd321SSteve Yin #ifndef _COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLEEVENTID_HPP_
462bfcd321SSteve Yin #include <com/sun/star/accessibility/AccessibleEventId.hpp>
472bfcd321SSteve Yin #endif
482bfcd321SSteve Yin #ifndef _CPPUHELPER_TYPEPROVIDER_HXX_
492bfcd321SSteve Yin #include <cppuhelper/typeprovider.hxx>
502bfcd321SSteve Yin #endif
512bfcd321SSteve Yin #ifndef _COMPHELPER_SEQUENCE_HXX_
522bfcd321SSteve Yin #include <comphelper/sequence.hxx>
532bfcd321SSteve Yin #endif
542bfcd321SSteve Yin #ifndef _COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLEROLE_HPP_
552bfcd321SSteve Yin #include <com/sun/star/accessibility/AccessibleRole.hpp>
562bfcd321SSteve Yin #endif
572bfcd321SSteve Yin 
582bfcd321SSteve Yin using namespace ::com::sun::star;
592bfcd321SSteve Yin using namespace ::com::sun::star::uno;
602bfcd321SSteve Yin using namespace ::com::sun::star::awt;
612bfcd321SSteve Yin using namespace ::com::sun::star::lang;
622bfcd321SSteve Yin using namespace ::com::sun::star::beans;
632bfcd321SSteve Yin using namespace ::com::sun::star::accessibility;
642bfcd321SSteve Yin using namespace ::comphelper;
652bfcd321SSteve Yin 
VCLXHeaderBar(Window * pHeaderBar)662bfcd321SSteve Yin VCLXHeaderBar::VCLXHeaderBar(Window* pHeaderBar)
672bfcd321SSteve Yin {
682bfcd321SSteve Yin 	SetWindow(pHeaderBar);
692bfcd321SSteve Yin }
702bfcd321SSteve Yin 
~VCLXHeaderBar()712bfcd321SSteve Yin VCLXHeaderBar::~VCLXHeaderBar()
722bfcd321SSteve Yin {
732bfcd321SSteve Yin }
742bfcd321SSteve Yin 
CreateAccessibleContext()752bfcd321SSteve Yin ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleContext > VCLXHeaderBar::CreateAccessibleContext()
762bfcd321SSteve Yin {
772bfcd321SSteve Yin 	return new VCLXAccessibleHeaderBar(this);
782bfcd321SSteve Yin }
792bfcd321SSteve Yin 
802bfcd321SSteve Yin 
VCLXAccessibleHeaderBar(VCLXWindow * pVCLWindow)812bfcd321SSteve Yin VCLXAccessibleHeaderBar::VCLXAccessibleHeaderBar( VCLXWindow* pVCLWindow )
822bfcd321SSteve Yin 	:VCLXAccessibleComponent( pVCLWindow )
832bfcd321SSteve Yin 	,m_pHeadBar(NULL)
842bfcd321SSteve Yin {
852bfcd321SSteve Yin 	m_pHeadBar = static_cast< HeaderBar* >( GetWindow() );
862bfcd321SSteve Yin }
872bfcd321SSteve Yin 
882bfcd321SSteve Yin // -----------------------------------------------------------------------------
892bfcd321SSteve Yin 
~VCLXAccessibleHeaderBar()902bfcd321SSteve Yin VCLXAccessibleHeaderBar::~VCLXAccessibleHeaderBar()
912bfcd321SSteve Yin {
922bfcd321SSteve Yin }
932bfcd321SSteve Yin 
942bfcd321SSteve Yin // -----------------------------------------------------------------------------
952bfcd321SSteve Yin 
ProcessWindowEvent(const VclWindowEvent & rVclWindowEvent)962bfcd321SSteve Yin void VCLXAccessibleHeaderBar::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent )
972bfcd321SSteve Yin {
982bfcd321SSteve Yin 	VCLXAccessibleComponent::ProcessWindowEvent( rVclWindowEvent );
992bfcd321SSteve Yin }
1002bfcd321SSteve Yin 
1012bfcd321SSteve Yin // -----------------------------------------------------------------------------
1022bfcd321SSteve Yin 
FillAccessibleStateSet(utl::AccessibleStateSetHelper & rStateSet)1032bfcd321SSteve Yin void VCLXAccessibleHeaderBar::FillAccessibleStateSet( utl::AccessibleStateSetHelper& rStateSet )
1042bfcd321SSteve Yin {
1052bfcd321SSteve Yin 	VCLXAccessibleComponent::FillAccessibleStateSet( rStateSet );
1062bfcd321SSteve Yin }
1072bfcd321SSteve Yin 
1082bfcd321SSteve Yin // -----------------------------------------------------------------------------
1092bfcd321SSteve Yin // XServiceInfo
1102bfcd321SSteve Yin // -----------------------------------------------------------------------------
1112bfcd321SSteve Yin 
getImplementationName()1122bfcd321SSteve Yin ::rtl::OUString VCLXAccessibleHeaderBar::getImplementationName() throw (RuntimeException)
1132bfcd321SSteve Yin {
1142bfcd321SSteve Yin 	return ::rtl::OUString::createFromAscii( "com.sun.star.comp.toolkit.AccessibleHeaderBar" );
1152bfcd321SSteve Yin }
1162bfcd321SSteve Yin 
1172bfcd321SSteve Yin // -----------------------------------------------------------------------------
1182bfcd321SSteve Yin 
getSupportedServiceNames()1192bfcd321SSteve Yin Sequence< ::rtl::OUString > VCLXAccessibleHeaderBar::getSupportedServiceNames() throw (RuntimeException)
1202bfcd321SSteve Yin {
1212bfcd321SSteve Yin 	Sequence< ::rtl::OUString > aNames(1);
1222bfcd321SSteve Yin 	aNames[0] = ::rtl::OUString::createFromAscii( "com.sun.star.awt.AccessibleHeaderBar" );
1232bfcd321SSteve Yin 	return aNames;
1242bfcd321SSteve Yin }
1252bfcd321SSteve Yin 
1262bfcd321SSteve Yin // =======XAccessibleContext=======
1272bfcd321SSteve Yin 
getAccessibleChildCount()1282bfcd321SSteve Yin sal_Int32 SAL_CALL VCLXAccessibleHeaderBar::getAccessibleChildCount(  )
1292bfcd321SSteve Yin 		throw (::com::sun::star::uno::RuntimeException)
1302bfcd321SSteve Yin {
1312bfcd321SSteve Yin 	sal_Int32 nCount = 0;
1322bfcd321SSteve Yin 	if ( m_pHeadBar )
1332bfcd321SSteve Yin 		nCount = m_pHeadBar->GetItemCount();
1342bfcd321SSteve Yin 
1352bfcd321SSteve Yin     return nCount;
1362bfcd321SSteve Yin }
1372bfcd321SSteve Yin ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > SAL_CALL
getAccessibleChild(sal_Int32 i)1382bfcd321SSteve Yin 		VCLXAccessibleHeaderBar::getAccessibleChild( sal_Int32 i ) 	throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException)
1392bfcd321SSteve Yin {
1402bfcd321SSteve Yin 	if ( i < 0 || i >= getAccessibleChildCount() )
1412bfcd321SSteve Yin 		throw IndexOutOfBoundsException();
1422bfcd321SSteve Yin 
1432bfcd321SSteve Yin     Reference< XAccessible > xChild;
1442bfcd321SSteve Yin     // search for the child
1452bfcd321SSteve Yin 	if ( static_cast<sal_uInt16>(i) >= m_aAccessibleChildren.size() )
1462bfcd321SSteve Yin 		xChild = CreateChild (i);
1472bfcd321SSteve Yin 	else
1482bfcd321SSteve Yin 	{
1492bfcd321SSteve Yin 		xChild = m_aAccessibleChildren[i];
1502bfcd321SSteve Yin 		if ( !xChild.is() )
1512bfcd321SSteve Yin 			xChild = CreateChild (i);
1522bfcd321SSteve Yin 	}
1532bfcd321SSteve Yin     return xChild;
1542bfcd321SSteve Yin }
1552bfcd321SSteve Yin 
getAccessibleRole()1562bfcd321SSteve Yin sal_Int16 SAL_CALL VCLXAccessibleHeaderBar::getAccessibleRole(  ) throw (::com::sun::star::uno::RuntimeException)
1572bfcd321SSteve Yin {
1582bfcd321SSteve Yin 	return com::sun::star::accessibility::AccessibleRole::LIST;
1592bfcd321SSteve Yin }
1602bfcd321SSteve Yin 
disposing(void)1612bfcd321SSteve Yin void SAL_CALL VCLXAccessibleHeaderBar::disposing (void)
1622bfcd321SSteve Yin {
1632bfcd321SSteve Yin 	ListItems().swap(m_aAccessibleChildren);
1642bfcd321SSteve Yin 	VCLXAccessibleComponent::disposing();
1652bfcd321SSteve Yin }
1662bfcd321SSteve Yin 
CreateChild(sal_Int32 i)1672bfcd321SSteve Yin ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > VCLXAccessibleHeaderBar::CreateChild (sal_Int32 i)
1682bfcd321SSteve Yin {
1692bfcd321SSteve Yin 	Reference<XAccessible> xChild;
1702bfcd321SSteve Yin 
1712bfcd321SSteve Yin 	sal_uInt16 nPos = static_cast<sal_uInt16>(i);
1722bfcd321SSteve Yin 	if ( nPos >= m_aAccessibleChildren.size() )
1732bfcd321SSteve Yin 	{
1742bfcd321SSteve Yin 		m_aAccessibleChildren.resize(nPos + 1);
1752bfcd321SSteve Yin 
1762bfcd321SSteve Yin 		// insert into the container
1772bfcd321SSteve Yin 		xChild = new VCLXAccessibleHeaderBarItem(m_pHeadBar, i);
1782bfcd321SSteve Yin 		m_aAccessibleChildren[nPos] = xChild;
1792bfcd321SSteve Yin 	}
1802bfcd321SSteve Yin 	else
1812bfcd321SSteve Yin 	{
1822bfcd321SSteve Yin 		xChild = m_aAccessibleChildren[nPos];
1832bfcd321SSteve Yin 		// check if position is empty and can be used else we have to adjust all entries behind this
1842bfcd321SSteve Yin 		if ( !xChild.is() )
1852bfcd321SSteve Yin 		{
1862bfcd321SSteve Yin 			xChild = new VCLXAccessibleHeaderBarItem(m_pHeadBar, i);
1872bfcd321SSteve Yin 			m_aAccessibleChildren[nPos] = xChild;
1882bfcd321SSteve Yin 		}
1892bfcd321SSteve Yin 	}
1902bfcd321SSteve Yin     return xChild;
1912bfcd321SSteve Yin }
192