1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_accessibility.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir // includes -------------------------------------------------------------- 32*cdf0e10cSrcweir #include <accessibility/standard/vclxaccessibletoolbox.hxx> 33*cdf0e10cSrcweir #include <accessibility/standard/vclxaccessibletoolboxitem.hxx> 34*cdf0e10cSrcweir #include <toolkit/helper/convert.hxx> 35*cdf0e10cSrcweir 36*cdf0e10cSrcweir #include <unotools/accessiblestatesethelper.hxx> 37*cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleEventId.hpp> 38*cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleStateType.hpp> 39*cdf0e10cSrcweir #include <com/sun/star/lang/XUnoTunnel.hpp> 40*cdf0e10cSrcweir #include <com/sun/star/lang/XUnoTunnel.hpp> 41*cdf0e10cSrcweir #include <tools/debug.hxx> 42*cdf0e10cSrcweir #include <vcl/toolbox.hxx> 43*cdf0e10cSrcweir #include <comphelper/accessiblewrapper.hxx> 44*cdf0e10cSrcweir #include <comphelper/processfactory.hxx> 45*cdf0e10cSrcweir 46*cdf0e10cSrcweir using namespace ::comphelper; 47*cdf0e10cSrcweir using namespace ::com::sun::star; 48*cdf0e10cSrcweir using namespace ::com::sun::star::uno; 49*cdf0e10cSrcweir using namespace ::com::sun::star::lang; 50*cdf0e10cSrcweir using namespace ::com::sun::star::accessibility; 51*cdf0e10cSrcweir 52*cdf0e10cSrcweir namespace 53*cdf0e10cSrcweir { 54*cdf0e10cSrcweir // ========================================================================= 55*cdf0e10cSrcweir // = OToolBoxWindowItemContext 56*cdf0e10cSrcweir // ========================================================================= 57*cdf0e10cSrcweir /** XAccessibleContext implementation for a toolbox item which is represented by a VCL Window 58*cdf0e10cSrcweir */ 59*cdf0e10cSrcweir class OToolBoxWindowItemContext : public OAccessibleContextWrapper 60*cdf0e10cSrcweir { 61*cdf0e10cSrcweir sal_Int32 m_nIndexInParent; 62*cdf0e10cSrcweir public: 63*cdf0e10cSrcweir OToolBoxWindowItemContext(sal_Int32 _nIndexInParent, 64*cdf0e10cSrcweir const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB, 65*cdf0e10cSrcweir const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleContext >& _rxInnerAccessibleContext, 66*cdf0e10cSrcweir const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >& _rxOwningAccessible, 67*cdf0e10cSrcweir const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >& _rxParentAccessible 68*cdf0e10cSrcweir ) : OAccessibleContextWrapper( 69*cdf0e10cSrcweir _rxORB, 70*cdf0e10cSrcweir _rxInnerAccessibleContext, 71*cdf0e10cSrcweir _rxOwningAccessible, 72*cdf0e10cSrcweir _rxParentAccessible ) 73*cdf0e10cSrcweir ,m_nIndexInParent(_nIndexInParent) 74*cdf0e10cSrcweir { 75*cdf0e10cSrcweir } 76*cdf0e10cSrcweir virtual sal_Int32 SAL_CALL getAccessibleIndexInParent( ) throw (::com::sun::star::uno::RuntimeException); 77*cdf0e10cSrcweir }; 78*cdf0e10cSrcweir 79*cdf0e10cSrcweir // ------------------------------------------------------------------------- 80*cdf0e10cSrcweir sal_Int32 SAL_CALL OToolBoxWindowItemContext::getAccessibleIndexInParent( ) throw (::com::sun::star::uno::RuntimeException) 81*cdf0e10cSrcweir { 82*cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex ); 83*cdf0e10cSrcweir return m_nIndexInParent; 84*cdf0e10cSrcweir } 85*cdf0e10cSrcweir 86*cdf0e10cSrcweir // ========================================================================= 87*cdf0e10cSrcweir // = OToolBoxWindowItem 88*cdf0e10cSrcweir // ========================================================================= 89*cdf0e10cSrcweir typedef ::cppu::ImplHelper1 < XUnoTunnel 90*cdf0e10cSrcweir > OToolBoxWindowItem_Base; 91*cdf0e10cSrcweir 92*cdf0e10cSrcweir /** XAccessible implementation for a toolbox item which is represented by a VCL Window 93*cdf0e10cSrcweir */ 94*cdf0e10cSrcweir class OToolBoxWindowItem 95*cdf0e10cSrcweir :public OAccessibleWrapper 96*cdf0e10cSrcweir ,public OToolBoxWindowItem_Base 97*cdf0e10cSrcweir { 98*cdf0e10cSrcweir private: 99*cdf0e10cSrcweir sal_Int32 m_nIndexInParent; 100*cdf0e10cSrcweir 101*cdf0e10cSrcweir public: 102*cdf0e10cSrcweir inline sal_Int32 getIndexInParent() const { return m_nIndexInParent; } 103*cdf0e10cSrcweir inline void setIndexInParent( sal_Int32 _nNewIndex ) { m_nIndexInParent = _nNewIndex; } 104*cdf0e10cSrcweir 105*cdf0e10cSrcweir static sal_Bool isWindowItem( const Reference< XAccessible >& _rxAcc, OToolBoxWindowItem** /* [out] */ _ppImplementation = NULL ); 106*cdf0e10cSrcweir 107*cdf0e10cSrcweir public: 108*cdf0e10cSrcweir OToolBoxWindowItem(sal_Int32 _nIndexInParent, 109*cdf0e10cSrcweir const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB, 110*cdf0e10cSrcweir const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >& _rxInnerAccessible, 111*cdf0e10cSrcweir const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >& _rxParentAccessible 112*cdf0e10cSrcweir ) : OAccessibleWrapper( 113*cdf0e10cSrcweir _rxORB, 114*cdf0e10cSrcweir _rxInnerAccessible, 115*cdf0e10cSrcweir _rxParentAccessible) 116*cdf0e10cSrcweir ,m_nIndexInParent(_nIndexInParent) 117*cdf0e10cSrcweir { 118*cdf0e10cSrcweir } 119*cdf0e10cSrcweir 120*cdf0e10cSrcweir protected: 121*cdf0e10cSrcweir // XInterface 122*cdf0e10cSrcweir DECLARE_XINTERFACE( ) 123*cdf0e10cSrcweir DECLARE_XTYPEPROVIDER( ) 124*cdf0e10cSrcweir 125*cdf0e10cSrcweir // OAccessibleWrapper 126*cdf0e10cSrcweir virtual OAccessibleContextWrapper* createAccessibleContext( 127*cdf0e10cSrcweir const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleContext >& _rxInnerContext 128*cdf0e10cSrcweir ); 129*cdf0e10cSrcweir 130*cdf0e10cSrcweir // XUnoTunnel 131*cdf0e10cSrcweir virtual sal_Int64 SAL_CALL getSomething( const Sequence< sal_Int8 >& aIdentifier ) throw (RuntimeException); 132*cdf0e10cSrcweir static Sequence< sal_Int8 > getUnoTunnelImplementationId(); 133*cdf0e10cSrcweir }; 134*cdf0e10cSrcweir 135*cdf0e10cSrcweir // ------------------------------------------------------------------------- 136*cdf0e10cSrcweir IMPLEMENT_FORWARD_XINTERFACE2( OToolBoxWindowItem, OAccessibleWrapper, OToolBoxWindowItem_Base ) 137*cdf0e10cSrcweir IMPLEMENT_FORWARD_XTYPEPROVIDER2( OToolBoxWindowItem, OAccessibleWrapper, OToolBoxWindowItem_Base ) 138*cdf0e10cSrcweir 139*cdf0e10cSrcweir // ------------------------------------------------------------------------- 140*cdf0e10cSrcweir OAccessibleContextWrapper* OToolBoxWindowItem::createAccessibleContext( 141*cdf0e10cSrcweir const Reference< XAccessibleContext >& _rxInnerContext ) 142*cdf0e10cSrcweir { 143*cdf0e10cSrcweir return new OToolBoxWindowItemContext( m_nIndexInParent,getORB(), _rxInnerContext, this, getParent() ); 144*cdf0e10cSrcweir } 145*cdf0e10cSrcweir 146*cdf0e10cSrcweir //-------------------------------------------------------------------- 147*cdf0e10cSrcweir sal_Bool OToolBoxWindowItem::isWindowItem( const Reference< XAccessible >& _rxAcc, OToolBoxWindowItem** /* [out] */ _ppImplementation ) 148*cdf0e10cSrcweir { 149*cdf0e10cSrcweir OToolBoxWindowItem* pImplementation = NULL; 150*cdf0e10cSrcweir 151*cdf0e10cSrcweir Reference< XUnoTunnel > xTunnel( _rxAcc, UNO_QUERY ); 152*cdf0e10cSrcweir if ( xTunnel.is() ) 153*cdf0e10cSrcweir pImplementation = reinterpret_cast< OToolBoxWindowItem* >( xTunnel->getSomething( getUnoTunnelImplementationId() ) ); 154*cdf0e10cSrcweir 155*cdf0e10cSrcweir if ( _ppImplementation ) 156*cdf0e10cSrcweir *_ppImplementation = pImplementation; 157*cdf0e10cSrcweir 158*cdf0e10cSrcweir return NULL != pImplementation; 159*cdf0e10cSrcweir } 160*cdf0e10cSrcweir 161*cdf0e10cSrcweir //-------------------------------------------------------------------- 162*cdf0e10cSrcweir Sequence< sal_Int8 > OToolBoxWindowItem::getUnoTunnelImplementationId() 163*cdf0e10cSrcweir { 164*cdf0e10cSrcweir static ::cppu::OImplementationId * pId = 0; 165*cdf0e10cSrcweir if (! pId) 166*cdf0e10cSrcweir { 167*cdf0e10cSrcweir ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() ); 168*cdf0e10cSrcweir if (! pId) 169*cdf0e10cSrcweir { 170*cdf0e10cSrcweir static ::cppu::OImplementationId aId; 171*cdf0e10cSrcweir pId = &aId; 172*cdf0e10cSrcweir } 173*cdf0e10cSrcweir } 174*cdf0e10cSrcweir return pId->getImplementationId(); 175*cdf0e10cSrcweir } 176*cdf0e10cSrcweir 177*cdf0e10cSrcweir //-------------------------------------------------------------------- 178*cdf0e10cSrcweir sal_Int64 SAL_CALL OToolBoxWindowItem::getSomething( const Sequence< sal_Int8 >& _rId ) throw (RuntimeException) 179*cdf0e10cSrcweir { 180*cdf0e10cSrcweir if ( ( 16 == _rId.getLength() ) 181*cdf0e10cSrcweir && ( 0 == rtl_compareMemory( getUnoTunnelImplementationId().getConstArray(), _rId.getConstArray(), 16 ) ) 182*cdf0e10cSrcweir ) 183*cdf0e10cSrcweir return reinterpret_cast< sal_Int64>( this ); 184*cdf0e10cSrcweir 185*cdf0e10cSrcweir return 0; 186*cdf0e10cSrcweir } 187*cdf0e10cSrcweir } 188*cdf0e10cSrcweir 189*cdf0e10cSrcweir DBG_NAME(VCLXAccessibleToolBox) 190*cdf0e10cSrcweir 191*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 192*cdf0e10cSrcweir // VCLXAccessibleToolBox 193*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 194*cdf0e10cSrcweir VCLXAccessibleToolBox::VCLXAccessibleToolBox( VCLXWindow* pVCLXWindow ) : 195*cdf0e10cSrcweir 196*cdf0e10cSrcweir VCLXAccessibleComponent( pVCLXWindow ) 197*cdf0e10cSrcweir 198*cdf0e10cSrcweir { 199*cdf0e10cSrcweir DBG_CTOR(VCLXAccessibleToolBox,NULL); 200*cdf0e10cSrcweir } 201*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 202*cdf0e10cSrcweir VCLXAccessibleToolBox::~VCLXAccessibleToolBox() 203*cdf0e10cSrcweir { 204*cdf0e10cSrcweir DBG_DTOR(VCLXAccessibleToolBox,NULL); 205*cdf0e10cSrcweir } 206*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 207*cdf0e10cSrcweir VCLXAccessibleToolBoxItem* VCLXAccessibleToolBox::GetItem_Impl( sal_Int32 _nPos, bool _bMustHaveFocus ) 208*cdf0e10cSrcweir { 209*cdf0e10cSrcweir VCLXAccessibleToolBoxItem* pItem = NULL; 210*cdf0e10cSrcweir ToolBox* pToolBox = static_cast< ToolBox* >( GetWindow() ); 211*cdf0e10cSrcweir if ( pToolBox && ( !_bMustHaveFocus || pToolBox->HasFocus() ) ) 212*cdf0e10cSrcweir { 213*cdf0e10cSrcweir ToolBoxItemsMap::iterator aIter = m_aAccessibleChildren.find( _nPos ); 214*cdf0e10cSrcweir // returns only toolbox buttons, not windows 215*cdf0e10cSrcweir if ( aIter != m_aAccessibleChildren.end() && !aIter->second.is()) 216*cdf0e10cSrcweir pItem = static_cast< VCLXAccessibleToolBoxItem* >( aIter->second.get() ); 217*cdf0e10cSrcweir } 218*cdf0e10cSrcweir 219*cdf0e10cSrcweir return pItem; 220*cdf0e10cSrcweir } 221*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 222*cdf0e10cSrcweir 223*cdf0e10cSrcweir void VCLXAccessibleToolBox::UpdateFocus_Impl() 224*cdf0e10cSrcweir { 225*cdf0e10cSrcweir ToolBox* pToolBox = static_cast< ToolBox* >( GetWindow() ); 226*cdf0e10cSrcweir if( !pToolBox ) 227*cdf0e10cSrcweir return; 228*cdf0e10cSrcweir 229*cdf0e10cSrcweir // submit events only if toolbox has the focus to avoid sending events due to mouse move 230*cdf0e10cSrcweir sal_Bool bHasFocus = sal_False; 231*cdf0e10cSrcweir if ( pToolBox->HasFocus() ) 232*cdf0e10cSrcweir bHasFocus = sal_True; 233*cdf0e10cSrcweir else 234*cdf0e10cSrcweir { 235*cdf0e10cSrcweir // check for subtoolbar, i.e. check if our parent is a toolbar 236*cdf0e10cSrcweir ToolBox* pToolBoxParent = dynamic_cast< ToolBox* >( pToolBox->GetParent() ); 237*cdf0e10cSrcweir // subtoolbars never get the focus as key input is just forwarded, so check if the parent toolbar has it 238*cdf0e10cSrcweir if ( pToolBoxParent && pToolBoxParent->HasFocus() ) 239*cdf0e10cSrcweir bHasFocus = sal_True; 240*cdf0e10cSrcweir } 241*cdf0e10cSrcweir 242*cdf0e10cSrcweir if ( bHasFocus ) 243*cdf0e10cSrcweir { 244*cdf0e10cSrcweir sal_uInt16 nHighlightItemId = pToolBox->GetHighlightItemId(); 245*cdf0e10cSrcweir sal_uInt16 nFocusCount = 0; 246*cdf0e10cSrcweir for ( ToolBoxItemsMap::iterator aIter = m_aAccessibleChildren.begin(); 247*cdf0e10cSrcweir aIter != m_aAccessibleChildren.end(); ++aIter ) 248*cdf0e10cSrcweir { 249*cdf0e10cSrcweir sal_uInt16 nItemId = pToolBox->GetItemId( (sal_uInt16)aIter->first ); 250*cdf0e10cSrcweir 251*cdf0e10cSrcweir if ( aIter->second.is() ) 252*cdf0e10cSrcweir { 253*cdf0e10cSrcweir VCLXAccessibleToolBoxItem* pItem = 254*cdf0e10cSrcweir static_cast< VCLXAccessibleToolBoxItem* >( aIter->second.get() ); 255*cdf0e10cSrcweir if ( pItem->HasFocus() && nItemId != nHighlightItemId ) 256*cdf0e10cSrcweir { 257*cdf0e10cSrcweir // reset the old focused item 258*cdf0e10cSrcweir pItem->SetFocus( sal_False ); 259*cdf0e10cSrcweir nFocusCount++; 260*cdf0e10cSrcweir } 261*cdf0e10cSrcweir if ( nItemId == nHighlightItemId ) 262*cdf0e10cSrcweir { 263*cdf0e10cSrcweir // set the new focused item 264*cdf0e10cSrcweir pItem->SetFocus( sal_True ); 265*cdf0e10cSrcweir nFocusCount++; 266*cdf0e10cSrcweir } 267*cdf0e10cSrcweir } 268*cdf0e10cSrcweir // both items changed? 269*cdf0e10cSrcweir if ( nFocusCount > 1 ) 270*cdf0e10cSrcweir break; 271*cdf0e10cSrcweir } 272*cdf0e10cSrcweir } 273*cdf0e10cSrcweir } 274*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 275*cdf0e10cSrcweir void VCLXAccessibleToolBox::ReleaseFocus_Impl( sal_Int32 _nPos ) 276*cdf0e10cSrcweir { 277*cdf0e10cSrcweir ToolBox* pToolBox = static_cast< ToolBox* >( GetWindow() ); 278*cdf0e10cSrcweir if ( pToolBox ) // #107124#, do not check for focus because this message is also handled in losefocus 279*cdf0e10cSrcweir { 280*cdf0e10cSrcweir ToolBoxItemsMap::iterator aIter = m_aAccessibleChildren.find( _nPos ); 281*cdf0e10cSrcweir if ( aIter != m_aAccessibleChildren.end() && aIter->second.is() ) 282*cdf0e10cSrcweir { 283*cdf0e10cSrcweir VCLXAccessibleToolBoxItem* pItem = 284*cdf0e10cSrcweir static_cast< VCLXAccessibleToolBoxItem* >( aIter->second.get() ); 285*cdf0e10cSrcweir if ( pItem->HasFocus() ) 286*cdf0e10cSrcweir pItem->SetFocus( sal_False ); 287*cdf0e10cSrcweir } 288*cdf0e10cSrcweir } 289*cdf0e10cSrcweir } 290*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 291*cdf0e10cSrcweir void VCLXAccessibleToolBox::UpdateChecked_Impl( sal_Int32 ) 292*cdf0e10cSrcweir { 293*cdf0e10cSrcweir ToolBox* pToolBox = static_cast< ToolBox* >( GetWindow() ); 294*cdf0e10cSrcweir if ( pToolBox ) 295*cdf0e10cSrcweir { 296*cdf0e10cSrcweir for ( ToolBoxItemsMap::iterator aIter = m_aAccessibleChildren.begin(); 297*cdf0e10cSrcweir aIter != m_aAccessibleChildren.end(); ++aIter ) 298*cdf0e10cSrcweir { 299*cdf0e10cSrcweir sal_uInt16 nItemId = pToolBox->GetItemId( (sal_uInt16)aIter->first ); 300*cdf0e10cSrcweir 301*cdf0e10cSrcweir VCLXAccessibleToolBoxItem* pItem = 302*cdf0e10cSrcweir static_cast< VCLXAccessibleToolBoxItem* >( aIter->second.get() ); 303*cdf0e10cSrcweir pItem->SetChecked( pToolBox->IsItemChecked( nItemId ) ); 304*cdf0e10cSrcweir } 305*cdf0e10cSrcweir } 306*cdf0e10cSrcweir } 307*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 308*cdf0e10cSrcweir void VCLXAccessibleToolBox::UpdateIndeterminate_Impl( sal_Int32 _nPos ) 309*cdf0e10cSrcweir { 310*cdf0e10cSrcweir ToolBox* pToolBox = static_cast< ToolBox* >( GetWindow() ); 311*cdf0e10cSrcweir if ( pToolBox ) 312*cdf0e10cSrcweir { 313*cdf0e10cSrcweir sal_uInt16 nItemId = pToolBox->GetItemId( (sal_uInt16)_nPos ); 314*cdf0e10cSrcweir 315*cdf0e10cSrcweir ToolBoxItemsMap::iterator aIter = m_aAccessibleChildren.find( _nPos ); 316*cdf0e10cSrcweir if ( aIter != m_aAccessibleChildren.end() && aIter->second.is() ) 317*cdf0e10cSrcweir { 318*cdf0e10cSrcweir VCLXAccessibleToolBoxItem* pItem = 319*cdf0e10cSrcweir static_cast< VCLXAccessibleToolBoxItem* >( aIter->second.get() ); 320*cdf0e10cSrcweir if ( pItem ) 321*cdf0e10cSrcweir pItem->SetIndeterminate( pToolBox->GetItemState( nItemId ) == STATE_DONTKNOW ); 322*cdf0e10cSrcweir } 323*cdf0e10cSrcweir } 324*cdf0e10cSrcweir } 325*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 326*cdf0e10cSrcweir void VCLXAccessibleToolBox::implReleaseToolboxItem( ToolBoxItemsMap::iterator& _rMapPos, 327*cdf0e10cSrcweir bool _bNotifyRemoval, bool _bDispose ) 328*cdf0e10cSrcweir { 329*cdf0e10cSrcweir Reference< XAccessible > xItemAcc( _rMapPos->second ); 330*cdf0e10cSrcweir if ( !xItemAcc.is() ) 331*cdf0e10cSrcweir return; 332*cdf0e10cSrcweir 333*cdf0e10cSrcweir if ( _bNotifyRemoval ) 334*cdf0e10cSrcweir { 335*cdf0e10cSrcweir NotifyAccessibleEvent( AccessibleEventId::CHILD, makeAny( xItemAcc ), Any() ); 336*cdf0e10cSrcweir } 337*cdf0e10cSrcweir 338*cdf0e10cSrcweir OToolBoxWindowItem* pWindowItem = NULL; 339*cdf0e10cSrcweir if ( !OToolBoxWindowItem::isWindowItem( xItemAcc, &pWindowItem ) ) 340*cdf0e10cSrcweir { 341*cdf0e10cSrcweir static_cast< VCLXAccessibleToolBoxItem* >( xItemAcc.get() )->ReleaseToolBox(); 342*cdf0e10cSrcweir if ( _bDispose ) 343*cdf0e10cSrcweir ::comphelper::disposeComponent( xItemAcc ); 344*cdf0e10cSrcweir } 345*cdf0e10cSrcweir else 346*cdf0e10cSrcweir { 347*cdf0e10cSrcweir if ( _bDispose ) 348*cdf0e10cSrcweir { 349*cdf0e10cSrcweir if ( pWindowItem ) 350*cdf0e10cSrcweir { 351*cdf0e10cSrcweir Reference< XAccessibleContext > xContext( pWindowItem->getContextNoCreate() ); 352*cdf0e10cSrcweir ::comphelper::disposeComponent( xContext ); 353*cdf0e10cSrcweir } 354*cdf0e10cSrcweir } 355*cdf0e10cSrcweir } 356*cdf0e10cSrcweir } 357*cdf0e10cSrcweir 358*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 359*cdf0e10cSrcweir void VCLXAccessibleToolBox::UpdateItem_Impl( sal_Int32 _nPos, sal_Bool _bItemAdded ) 360*cdf0e10cSrcweir { 361*cdf0e10cSrcweir if ( _nPos < sal_Int32( m_aAccessibleChildren.size() ) ) 362*cdf0e10cSrcweir { 363*cdf0e10cSrcweir UpdateAllItems_Impl(); 364*cdf0e10cSrcweir return; 365*cdf0e10cSrcweir } 366*cdf0e10cSrcweir 367*cdf0e10cSrcweir ToolBox* pToolBox = static_cast< ToolBox* >( GetWindow() ); 368*cdf0e10cSrcweir if ( pToolBox ) 369*cdf0e10cSrcweir { 370*cdf0e10cSrcweir if ( !_bItemAdded ) 371*cdf0e10cSrcweir { // the item was removed 372*cdf0e10cSrcweir // -> destroy the old item 373*cdf0e10cSrcweir ToolBoxItemsMap::iterator aItemPos = m_aAccessibleChildren.find( _nPos ); 374*cdf0e10cSrcweir if ( m_aAccessibleChildren.end() != aItemPos ) 375*cdf0e10cSrcweir { 376*cdf0e10cSrcweir implReleaseToolboxItem( aItemPos, true, true ); 377*cdf0e10cSrcweir m_aAccessibleChildren.erase( aItemPos ); 378*cdf0e10cSrcweir } 379*cdf0e10cSrcweir } 380*cdf0e10cSrcweir 381*cdf0e10cSrcweir // adjust the "index-in-parent"s 382*cdf0e10cSrcweir ToolBoxItemsMap::iterator aIndexAdjust = m_aAccessibleChildren.upper_bound( _nPos ); 383*cdf0e10cSrcweir while ( m_aAccessibleChildren.end() != aIndexAdjust ) 384*cdf0e10cSrcweir { 385*cdf0e10cSrcweir Reference< XAccessible > xItemAcc( aIndexAdjust->second ); 386*cdf0e10cSrcweir 387*cdf0e10cSrcweir OToolBoxWindowItem* pWindowItem = NULL; 388*cdf0e10cSrcweir if ( !OToolBoxWindowItem::isWindowItem( xItemAcc, &pWindowItem ) ) 389*cdf0e10cSrcweir { 390*cdf0e10cSrcweir VCLXAccessibleToolBoxItem* pItem = static_cast< VCLXAccessibleToolBoxItem* >( xItemAcc.get() ); 391*cdf0e10cSrcweir if ( pItem ) 392*cdf0e10cSrcweir { 393*cdf0e10cSrcweir sal_Int32 nIndex = pItem->getIndexInParent( ); 394*cdf0e10cSrcweir nIndex += _bItemAdded ? +1 : -1; 395*cdf0e10cSrcweir pItem->setIndexInParent( nIndex ); 396*cdf0e10cSrcweir } 397*cdf0e10cSrcweir } 398*cdf0e10cSrcweir else 399*cdf0e10cSrcweir { 400*cdf0e10cSrcweir if ( pWindowItem ) 401*cdf0e10cSrcweir { 402*cdf0e10cSrcweir sal_Int32 nIndex = pWindowItem->getIndexInParent( ); 403*cdf0e10cSrcweir nIndex += _bItemAdded ? +1 : -1; 404*cdf0e10cSrcweir pWindowItem->setIndexInParent( nIndex ); 405*cdf0e10cSrcweir } 406*cdf0e10cSrcweir } 407*cdf0e10cSrcweir 408*cdf0e10cSrcweir ++aIndexAdjust; 409*cdf0e10cSrcweir } 410*cdf0e10cSrcweir 411*cdf0e10cSrcweir if ( _bItemAdded ) 412*cdf0e10cSrcweir { 413*cdf0e10cSrcweir // TODO: we should make this dependent on the existence of event listeners 414*cdf0e10cSrcweir // with the current implementation, we always create accessible object 415*cdf0e10cSrcweir Any aNewChild = makeAny( getAccessibleChild( (sal_Int32)_nPos ) ); 416*cdf0e10cSrcweir NotifyAccessibleEvent( AccessibleEventId::CHILD, Any(), aNewChild ); 417*cdf0e10cSrcweir } 418*cdf0e10cSrcweir } 419*cdf0e10cSrcweir } 420*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 421*cdf0e10cSrcweir void VCLXAccessibleToolBox::UpdateAllItems_Impl() 422*cdf0e10cSrcweir { 423*cdf0e10cSrcweir ToolBox* pToolBox = static_cast< ToolBox* >( GetWindow() ); 424*cdf0e10cSrcweir if ( pToolBox ) 425*cdf0e10cSrcweir { 426*cdf0e10cSrcweir // deregister the old items 427*cdf0e10cSrcweir for ( ToolBoxItemsMap::iterator aIter = m_aAccessibleChildren.begin(); 428*cdf0e10cSrcweir aIter != m_aAccessibleChildren.end(); ++aIter ) 429*cdf0e10cSrcweir { 430*cdf0e10cSrcweir implReleaseToolboxItem( aIter, true, true ); 431*cdf0e10cSrcweir } 432*cdf0e10cSrcweir m_aAccessibleChildren.clear(); 433*cdf0e10cSrcweir 434*cdf0e10cSrcweir // register the new items 435*cdf0e10cSrcweir sal_uInt16 i, nCount = pToolBox->GetItemCount(); 436*cdf0e10cSrcweir for ( i = 0; i < nCount; ++i ) 437*cdf0e10cSrcweir { 438*cdf0e10cSrcweir Any aNewValue; 439*cdf0e10cSrcweir aNewValue <<= getAccessibleChild( (sal_Int32)i );; 440*cdf0e10cSrcweir NotifyAccessibleEvent( AccessibleEventId::CHILD, Any(), aNewValue ); 441*cdf0e10cSrcweir } 442*cdf0e10cSrcweir } 443*cdf0e10cSrcweir } 444*cdf0e10cSrcweir 445*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 446*cdf0e10cSrcweir 447*cdf0e10cSrcweir void VCLXAccessibleToolBox::UpdateCustomPopupItemp_Impl( Window* pWindow, bool bOpen ) 448*cdf0e10cSrcweir { 449*cdf0e10cSrcweir ToolBox* pToolBox = static_cast< ToolBox* >( GetWindow() ); 450*cdf0e10cSrcweir if( pWindow && pToolBox ) 451*cdf0e10cSrcweir { 452*cdf0e10cSrcweir Reference< XAccessible > xChild( pWindow->GetAccessible() ); 453*cdf0e10cSrcweir if( xChild.is() ) 454*cdf0e10cSrcweir { 455*cdf0e10cSrcweir Reference< XAccessible > xChildItem( getAccessibleChild( static_cast< sal_Int32 >( pToolBox->GetItemPos( pToolBox->GetDownItemId() ) ) ) ); 456*cdf0e10cSrcweir VCLXAccessibleToolBoxItem* pItem = static_cast< VCLXAccessibleToolBoxItem* >( xChildItem.get() ); 457*cdf0e10cSrcweir 458*cdf0e10cSrcweir pItem->SetChild( xChild ); 459*cdf0e10cSrcweir pItem->NotifyChildEvent( xChild, bOpen ); 460*cdf0e10cSrcweir } 461*cdf0e10cSrcweir } 462*cdf0e10cSrcweir } 463*cdf0e10cSrcweir 464*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 465*cdf0e10cSrcweir void VCLXAccessibleToolBox::UpdateItemName_Impl( sal_Int32 _nPos ) 466*cdf0e10cSrcweir { 467*cdf0e10cSrcweir VCLXAccessibleToolBoxItem* pItem = GetItem_Impl( _nPos, false ); 468*cdf0e10cSrcweir if ( pItem ) 469*cdf0e10cSrcweir pItem->NameChanged(); 470*cdf0e10cSrcweir } 471*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 472*cdf0e10cSrcweir void VCLXAccessibleToolBox::UpdateItemEnabled_Impl( sal_Int32 _nPos ) 473*cdf0e10cSrcweir { 474*cdf0e10cSrcweir VCLXAccessibleToolBoxItem* pItem = GetItem_Impl( _nPos, false ); 475*cdf0e10cSrcweir if ( pItem ) 476*cdf0e10cSrcweir pItem->ToggleEnableState(); 477*cdf0e10cSrcweir } 478*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 479*cdf0e10cSrcweir void VCLXAccessibleToolBox::HandleSubToolBarEvent( const VclWindowEvent& rVclWindowEvent, bool _bShow ) 480*cdf0e10cSrcweir { 481*cdf0e10cSrcweir Window* pChildWindow = (Window *) rVclWindowEvent.GetData(); 482*cdf0e10cSrcweir ToolBox* pToolBox = static_cast< ToolBox* >( GetWindow() ); 483*cdf0e10cSrcweir if ( pChildWindow 484*cdf0e10cSrcweir && pToolBox 485*cdf0e10cSrcweir && pToolBox == pChildWindow->GetParent() 486*cdf0e10cSrcweir && pChildWindow->GetType() == WINDOW_TOOLBOX ) 487*cdf0e10cSrcweir { 488*cdf0e10cSrcweir sal_Int32 nIndex = pToolBox->GetItemPos( pToolBox->GetCurItemId() ); 489*cdf0e10cSrcweir Reference< XAccessible > xItem = getAccessibleChild( nIndex ); 490*cdf0e10cSrcweir if ( xItem.is() ) 491*cdf0e10cSrcweir { 492*cdf0e10cSrcweir Reference< XAccessible > xChild = pChildWindow->GetAccessible(); 493*cdf0e10cSrcweir VCLXAccessibleToolBoxItem* pItem = 494*cdf0e10cSrcweir static_cast< VCLXAccessibleToolBoxItem* >( xItem.get() ); 495*cdf0e10cSrcweir pItem->SetChild( xChild ); 496*cdf0e10cSrcweir pItem->NotifyChildEvent( xChild, _bShow ); 497*cdf0e10cSrcweir } 498*cdf0e10cSrcweir } 499*cdf0e10cSrcweir } 500*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 501*cdf0e10cSrcweir void VCLXAccessibleToolBox::ReleaseSubToolBox( ToolBox* _pSubToolBox ) 502*cdf0e10cSrcweir { 503*cdf0e10cSrcweir ToolBox* pToolBox = static_cast< ToolBox* >( GetWindow() ); 504*cdf0e10cSrcweir if ( pToolBox ) 505*cdf0e10cSrcweir { 506*cdf0e10cSrcweir sal_Int32 nIndex = pToolBox->GetItemPos( pToolBox->GetCurItemId() ); 507*cdf0e10cSrcweir Reference< XAccessible > xItem = getAccessibleChild( nIndex ); 508*cdf0e10cSrcweir if ( xItem.is() ) 509*cdf0e10cSrcweir { 510*cdf0e10cSrcweir Reference< XAccessible > xChild = _pSubToolBox->GetAccessible(); 511*cdf0e10cSrcweir VCLXAccessibleToolBoxItem* pItem = 512*cdf0e10cSrcweir static_cast< VCLXAccessibleToolBoxItem* >( xItem.get() ); 513*cdf0e10cSrcweir if ( pItem->GetChild() == xChild ) 514*cdf0e10cSrcweir { 515*cdf0e10cSrcweir pItem->SetChild( Reference< XAccessible >() ); 516*cdf0e10cSrcweir pItem->NotifyChildEvent( xChild, false ); 517*cdf0e10cSrcweir } 518*cdf0e10cSrcweir } 519*cdf0e10cSrcweir } 520*cdf0e10cSrcweir } 521*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 522*cdf0e10cSrcweir void VCLXAccessibleToolBox::FillAccessibleStateSet( utl::AccessibleStateSetHelper& rStateSet ) 523*cdf0e10cSrcweir { 524*cdf0e10cSrcweir VCLXAccessibleComponent::FillAccessibleStateSet( rStateSet ); 525*cdf0e10cSrcweir 526*cdf0e10cSrcweir ToolBox* pToolBox = static_cast< ToolBox* >( GetWindow() ); 527*cdf0e10cSrcweir if ( pToolBox ) 528*cdf0e10cSrcweir { 529*cdf0e10cSrcweir rStateSet.AddState( AccessibleStateType::FOCUSABLE ); 530*cdf0e10cSrcweir if ( pToolBox->IsHorizontal() ) 531*cdf0e10cSrcweir rStateSet.AddState( AccessibleStateType::HORIZONTAL ); 532*cdf0e10cSrcweir else 533*cdf0e10cSrcweir rStateSet.AddState( AccessibleStateType::VERTICAL ); 534*cdf0e10cSrcweir } 535*cdf0e10cSrcweir } 536*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 537*cdf0e10cSrcweir void VCLXAccessibleToolBox::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent ) 538*cdf0e10cSrcweir { 539*cdf0e10cSrcweir // to prevent an early release of the toolbox (VCLEVENT_OBJECT_DYING) 540*cdf0e10cSrcweir Reference< XAccessibleContext > xTemp = this; 541*cdf0e10cSrcweir 542*cdf0e10cSrcweir switch ( rVclWindowEvent.GetId() ) 543*cdf0e10cSrcweir { 544*cdf0e10cSrcweir case VCLEVENT_TOOLBOX_CLICK: 545*cdf0e10cSrcweir { 546*cdf0e10cSrcweir if ( rVclWindowEvent.GetData() ) 547*cdf0e10cSrcweir { 548*cdf0e10cSrcweir UpdateChecked_Impl( (sal_Int32)(sal_IntPtr)rVclWindowEvent.GetData() ); 549*cdf0e10cSrcweir UpdateIndeterminate_Impl( (sal_Int32)(sal_IntPtr)rVclWindowEvent.GetData() ); 550*cdf0e10cSrcweir } 551*cdf0e10cSrcweir break; 552*cdf0e10cSrcweir } 553*cdf0e10cSrcweir case VCLEVENT_TOOLBOX_DOUBLECLICK: 554*cdf0e10cSrcweir case VCLEVENT_TOOLBOX_ACTIVATE: 555*cdf0e10cSrcweir case VCLEVENT_TOOLBOX_DEACTIVATE: 556*cdf0e10cSrcweir case VCLEVENT_TOOLBOX_SELECT: 557*cdf0e10cSrcweir break; 558*cdf0e10cSrcweir 559*cdf0e10cSrcweir case VCLEVENT_TOOLBOX_HIGHLIGHT: 560*cdf0e10cSrcweir UpdateFocus_Impl(); 561*cdf0e10cSrcweir break; 562*cdf0e10cSrcweir 563*cdf0e10cSrcweir case VCLEVENT_TOOLBOX_HIGHLIGHTOFF: 564*cdf0e10cSrcweir ReleaseFocus_Impl( (sal_Int32)(sal_IntPtr)rVclWindowEvent.GetData() ); 565*cdf0e10cSrcweir break; 566*cdf0e10cSrcweir 567*cdf0e10cSrcweir case VCLEVENT_TOOLBOX_ITEMADDED : 568*cdf0e10cSrcweir // UpdateItem_Impl( (sal_Int32)(sal_IntPtr)rVclWindowEvent.GetData(), VCLEVENT_TOOLBOX_ITEMADDED == rVclWindowEvent.GetId() ); 569*cdf0e10cSrcweir UpdateItem_Impl( (sal_Int32)(sal_IntPtr)rVclWindowEvent.GetData(), sal_True ); 570*cdf0e10cSrcweir break; 571*cdf0e10cSrcweir 572*cdf0e10cSrcweir case VCLEVENT_TOOLBOX_ITEMREMOVED : 573*cdf0e10cSrcweir case VCLEVENT_TOOLBOX_ALLITEMSCHANGED : 574*cdf0e10cSrcweir { 575*cdf0e10cSrcweir UpdateAllItems_Impl(); 576*cdf0e10cSrcweir break; 577*cdf0e10cSrcweir } 578*cdf0e10cSrcweir 579*cdf0e10cSrcweir case VCLEVENT_TOOLBOX_ITEMWINDOWCHANGED: 580*cdf0e10cSrcweir { 581*cdf0e10cSrcweir sal_Int32 nPos = (sal_Int32)(sal_IntPtr)rVclWindowEvent.GetData(); 582*cdf0e10cSrcweir ToolBoxItemsMap::iterator aAccessiblePos( m_aAccessibleChildren.find( nPos ) ); 583*cdf0e10cSrcweir if ( m_aAccessibleChildren.end() != aAccessiblePos ) 584*cdf0e10cSrcweir { 585*cdf0e10cSrcweir implReleaseToolboxItem( aAccessiblePos, false, true ); 586*cdf0e10cSrcweir m_aAccessibleChildren.erase (aAccessiblePos); 587*cdf0e10cSrcweir } 588*cdf0e10cSrcweir 589*cdf0e10cSrcweir Any aNewValue; 590*cdf0e10cSrcweir aNewValue <<= getAccessibleChild(nPos); 591*cdf0e10cSrcweir NotifyAccessibleEvent( AccessibleEventId::CHILD, Any(), aNewValue ); 592*cdf0e10cSrcweir break; 593*cdf0e10cSrcweir } 594*cdf0e10cSrcweir case VCLEVENT_TOOLBOX_ITEMTEXTCHANGED : 595*cdf0e10cSrcweir UpdateItemName_Impl( (sal_Int32)(sal_IntPtr)rVclWindowEvent.GetData() ); 596*cdf0e10cSrcweir break; 597*cdf0e10cSrcweir 598*cdf0e10cSrcweir case VCLEVENT_TOOLBOX_ITEMENABLED : 599*cdf0e10cSrcweir case VCLEVENT_TOOLBOX_ITEMDISABLED : 600*cdf0e10cSrcweir { 601*cdf0e10cSrcweir UpdateItemEnabled_Impl( (sal_Int32)(sal_IntPtr)rVclWindowEvent.GetData() ); 602*cdf0e10cSrcweir break; 603*cdf0e10cSrcweir } 604*cdf0e10cSrcweir 605*cdf0e10cSrcweir case VCLEVENT_DROPDOWN_OPEN: 606*cdf0e10cSrcweir case VCLEVENT_DROPDOWN_CLOSE: 607*cdf0e10cSrcweir { 608*cdf0e10cSrcweir UpdateCustomPopupItemp_Impl( static_cast< Window* >( rVclWindowEvent.GetData() ), rVclWindowEvent.GetId() == VCLEVENT_DROPDOWN_OPEN ); 609*cdf0e10cSrcweir break; 610*cdf0e10cSrcweir } 611*cdf0e10cSrcweir 612*cdf0e10cSrcweir case VCLEVENT_OBJECT_DYING : 613*cdf0e10cSrcweir { 614*cdf0e10cSrcweir // if this toolbox is a subtoolbox, we have to relese it from its parent 615*cdf0e10cSrcweir ToolBox* pToolBox = static_cast< ToolBox* >( GetWindow() ); 616*cdf0e10cSrcweir if ( pToolBox && pToolBox->GetParent() && 617*cdf0e10cSrcweir pToolBox->GetParent()->GetType() == WINDOW_TOOLBOX ) 618*cdf0e10cSrcweir { 619*cdf0e10cSrcweir VCLXAccessibleToolBox* pParent = static_cast< VCLXAccessibleToolBox* >( 620*cdf0e10cSrcweir pToolBox->GetParent()->GetAccessible()->getAccessibleContext().get() ); 621*cdf0e10cSrcweir if ( pParent ) 622*cdf0e10cSrcweir pParent->ReleaseSubToolBox( pToolBox ); 623*cdf0e10cSrcweir } 624*cdf0e10cSrcweir 625*cdf0e10cSrcweir // dispose all items 626*cdf0e10cSrcweir for ( ToolBoxItemsMap::iterator aIter = m_aAccessibleChildren.begin(); 627*cdf0e10cSrcweir aIter != m_aAccessibleChildren.end(); ++aIter ) 628*cdf0e10cSrcweir { 629*cdf0e10cSrcweir implReleaseToolboxItem( aIter, false, true ); 630*cdf0e10cSrcweir } 631*cdf0e10cSrcweir m_aAccessibleChildren.clear(); 632*cdf0e10cSrcweir 633*cdf0e10cSrcweir //!!! no break to call base class 634*cdf0e10cSrcweir } 635*cdf0e10cSrcweir 636*cdf0e10cSrcweir default: 637*cdf0e10cSrcweir VCLXAccessibleComponent::ProcessWindowEvent( rVclWindowEvent ); 638*cdf0e10cSrcweir } 639*cdf0e10cSrcweir } 640*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 641*cdf0e10cSrcweir void VCLXAccessibleToolBox::ProcessWindowChildEvent( const VclWindowEvent& rVclWindowEvent ) 642*cdf0e10cSrcweir { 643*cdf0e10cSrcweir switch ( rVclWindowEvent.GetId() ) 644*cdf0e10cSrcweir { 645*cdf0e10cSrcweir case VCLEVENT_WINDOW_SHOW: // send create on show for direct accessible children 646*cdf0e10cSrcweir { 647*cdf0e10cSrcweir Reference< XAccessible > xReturn = GetItemWindowAccessible(rVclWindowEvent); 648*cdf0e10cSrcweir if ( xReturn.is() ) 649*cdf0e10cSrcweir NotifyAccessibleEvent( AccessibleEventId::CHILD, Any(), makeAny(xReturn) ); 650*cdf0e10cSrcweir else 651*cdf0e10cSrcweir HandleSubToolBarEvent( rVclWindowEvent, true ); 652*cdf0e10cSrcweir } 653*cdf0e10cSrcweir break; 654*cdf0e10cSrcweir 655*cdf0e10cSrcweir default: 656*cdf0e10cSrcweir VCLXAccessibleComponent::ProcessWindowChildEvent( rVclWindowEvent ); 657*cdf0e10cSrcweir 658*cdf0e10cSrcweir } 659*cdf0e10cSrcweir } 660*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 661*cdf0e10cSrcweir // XInterface 662*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 663*cdf0e10cSrcweir IMPLEMENT_FORWARD_XINTERFACE2( VCLXAccessibleToolBox, VCLXAccessibleComponent, VCLXAccessibleToolBox_BASE ) 664*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 665*cdf0e10cSrcweir // XTypeProvider 666*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 667*cdf0e10cSrcweir IMPLEMENT_FORWARD_XTYPEPROVIDER2( VCLXAccessibleToolBox, VCLXAccessibleComponent, VCLXAccessibleToolBox_BASE ) 668*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 669*cdf0e10cSrcweir // XComponent 670*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 671*cdf0e10cSrcweir void SAL_CALL VCLXAccessibleToolBox::disposing() 672*cdf0e10cSrcweir { 673*cdf0e10cSrcweir VCLXAccessibleComponent::disposing(); 674*cdf0e10cSrcweir 675*cdf0e10cSrcweir // release the items 676*cdf0e10cSrcweir for ( ToolBoxItemsMap::iterator aIter = m_aAccessibleChildren.begin(); 677*cdf0e10cSrcweir aIter != m_aAccessibleChildren.end(); ++aIter ) 678*cdf0e10cSrcweir { 679*cdf0e10cSrcweir implReleaseToolboxItem( aIter, false, true ); 680*cdf0e10cSrcweir } 681*cdf0e10cSrcweir m_aAccessibleChildren.clear(); 682*cdf0e10cSrcweir } 683*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 684*cdf0e10cSrcweir // XServiceInfo 685*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 686*cdf0e10cSrcweir ::rtl::OUString VCLXAccessibleToolBox::getImplementationName() throw (RuntimeException) 687*cdf0e10cSrcweir { 688*cdf0e10cSrcweir return ::rtl::OUString::createFromAscii( "com.sun.star.comp.toolkit.AccessibleToolBox" ); 689*cdf0e10cSrcweir } 690*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 691*cdf0e10cSrcweir Sequence< ::rtl::OUString > VCLXAccessibleToolBox::getSupportedServiceNames() throw (RuntimeException) 692*cdf0e10cSrcweir { 693*cdf0e10cSrcweir Sequence< ::rtl::OUString > aNames = VCLXAccessibleComponent::getSupportedServiceNames(); 694*cdf0e10cSrcweir sal_Int32 nLength = aNames.getLength(); 695*cdf0e10cSrcweir aNames.realloc( nLength + 1 ); 696*cdf0e10cSrcweir aNames[nLength] = ::rtl::OUString::createFromAscii( "com.sun.star.accessibility.AccessibleToolBox" ); 697*cdf0e10cSrcweir return aNames; 698*cdf0e10cSrcweir } 699*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 700*cdf0e10cSrcweir // XAccessibleContext 701*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 702*cdf0e10cSrcweir sal_Int32 SAL_CALL VCLXAccessibleToolBox::getAccessibleChildCount( ) throw (RuntimeException) 703*cdf0e10cSrcweir { 704*cdf0e10cSrcweir comphelper::OExternalLockGuard aGuard( this ); 705*cdf0e10cSrcweir 706*cdf0e10cSrcweir sal_Int32 nCount = 0; 707*cdf0e10cSrcweir ToolBox* pToolBox = static_cast< ToolBox* >( GetWindow() ); 708*cdf0e10cSrcweir if ( pToolBox ) 709*cdf0e10cSrcweir nCount = pToolBox->GetItemCount(); 710*cdf0e10cSrcweir 711*cdf0e10cSrcweir return nCount; 712*cdf0e10cSrcweir } 713*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 714*cdf0e10cSrcweir Reference< XAccessible > SAL_CALL VCLXAccessibleToolBox::getAccessibleChild( sal_Int32 i ) throw (IndexOutOfBoundsException, RuntimeException) 715*cdf0e10cSrcweir { 716*cdf0e10cSrcweir if ( i < 0 || i >= getAccessibleChildCount() ) 717*cdf0e10cSrcweir throw IndexOutOfBoundsException(); 718*cdf0e10cSrcweir 719*cdf0e10cSrcweir comphelper::OExternalLockGuard aGuard( this ); 720*cdf0e10cSrcweir 721*cdf0e10cSrcweir ToolBox* pToolBox = static_cast< ToolBox* >( GetWindow() ); 722*cdf0e10cSrcweir if ( pToolBox ) 723*cdf0e10cSrcweir { 724*cdf0e10cSrcweir Reference< XAccessible > xChild; 725*cdf0e10cSrcweir // search for the child 726*cdf0e10cSrcweir ToolBoxItemsMap::iterator aIter = m_aAccessibleChildren.find(i); 727*cdf0e10cSrcweir if ( m_aAccessibleChildren.end() == aIter ) 728*cdf0e10cSrcweir { 729*cdf0e10cSrcweir sal_uInt16 nItemId = pToolBox->GetItemId( (sal_uInt16)i ); 730*cdf0e10cSrcweir sal_uInt16 nHighlightItemId = pToolBox->GetHighlightItemId(); 731*cdf0e10cSrcweir Window* pItemWindow = pToolBox->GetItemWindow( nItemId ); 732*cdf0e10cSrcweir // not found -> create a new child 733*cdf0e10cSrcweir VCLXAccessibleToolBoxItem* pChild = new VCLXAccessibleToolBoxItem( pToolBox, i ); 734*cdf0e10cSrcweir Reference< XAccessible> xParent = pChild; 735*cdf0e10cSrcweir if ( pItemWindow ) 736*cdf0e10cSrcweir { 737*cdf0e10cSrcweir xChild = new OToolBoxWindowItem(0,::comphelper::getProcessServiceFactory(),pItemWindow->GetAccessible(),xParent); 738*cdf0e10cSrcweir pItemWindow->SetAccessible(xChild); 739*cdf0e10cSrcweir pChild->SetChild( xChild ); 740*cdf0e10cSrcweir } 741*cdf0e10cSrcweir xChild = pChild; 742*cdf0e10cSrcweir if ( nHighlightItemId > 0 && nItemId == nHighlightItemId ) 743*cdf0e10cSrcweir pChild->SetFocus( sal_True ); 744*cdf0e10cSrcweir if ( pToolBox->IsItemChecked( nItemId ) ) 745*cdf0e10cSrcweir pChild->SetChecked( sal_True ); 746*cdf0e10cSrcweir if ( pToolBox->GetItemState( nItemId ) == STATE_DONTKNOW ) 747*cdf0e10cSrcweir pChild->SetIndeterminate( true ); 748*cdf0e10cSrcweir m_aAccessibleChildren.insert( ToolBoxItemsMap::value_type( i, xChild ) ); 749*cdf0e10cSrcweir } 750*cdf0e10cSrcweir else 751*cdf0e10cSrcweir { 752*cdf0e10cSrcweir // found it 753*cdf0e10cSrcweir xChild = aIter->second; 754*cdf0e10cSrcweir } 755*cdf0e10cSrcweir return xChild; 756*cdf0e10cSrcweir } 757*cdf0e10cSrcweir 758*cdf0e10cSrcweir return NULL; 759*cdf0e10cSrcweir } 760*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 761*cdf0e10cSrcweir Reference< XAccessible > SAL_CALL VCLXAccessibleToolBox::getAccessibleAtPoint( const awt::Point& _rPoint ) throw (RuntimeException) 762*cdf0e10cSrcweir { 763*cdf0e10cSrcweir comphelper::OExternalLockGuard aGuard( this ); 764*cdf0e10cSrcweir 765*cdf0e10cSrcweir Reference< XAccessible > xAccessible; 766*cdf0e10cSrcweir ToolBox* pToolBox = static_cast< ToolBox* >( GetWindow() ); 767*cdf0e10cSrcweir if ( pToolBox ) 768*cdf0e10cSrcweir { 769*cdf0e10cSrcweir sal_uInt16 nItemPos = pToolBox->GetItemPos( VCLPoint( _rPoint ) ); 770*cdf0e10cSrcweir if ( nItemPos != TOOLBOX_ITEM_NOTFOUND ) 771*cdf0e10cSrcweir xAccessible = getAccessibleChild( nItemPos ); 772*cdf0e10cSrcweir } 773*cdf0e10cSrcweir 774*cdf0e10cSrcweir return xAccessible; 775*cdf0e10cSrcweir } 776*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 777*cdf0e10cSrcweir Reference< XAccessible > VCLXAccessibleToolBox::GetItemWindowAccessible( const VclWindowEvent& rVclWindowEvent ) 778*cdf0e10cSrcweir { 779*cdf0e10cSrcweir Reference< XAccessible > xReturn; 780*cdf0e10cSrcweir Window* pChildWindow = (Window *) rVclWindowEvent.GetData(); 781*cdf0e10cSrcweir ToolBox* pToolBox = static_cast< ToolBox* >( GetWindow() ); 782*cdf0e10cSrcweir if ( pChildWindow && pToolBox ) 783*cdf0e10cSrcweir { 784*cdf0e10cSrcweir sal_uInt16 nCount = pToolBox->GetItemCount(); 785*cdf0e10cSrcweir for (sal_uInt16 i = 0 ; i < nCount && !xReturn.is() ; ++i) 786*cdf0e10cSrcweir { 787*cdf0e10cSrcweir sal_uInt16 nItemId = pToolBox->GetItemId( i ); 788*cdf0e10cSrcweir Window* pItemWindow = pToolBox->GetItemWindow( nItemId ); 789*cdf0e10cSrcweir if ( pItemWindow == pChildWindow ) 790*cdf0e10cSrcweir xReturn = getAccessibleChild(i); 791*cdf0e10cSrcweir } 792*cdf0e10cSrcweir } 793*cdf0e10cSrcweir return xReturn; 794*cdf0e10cSrcweir } 795*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 796*cdf0e10cSrcweir Reference< XAccessible > VCLXAccessibleToolBox::GetChildAccessible( const VclWindowEvent& rVclWindowEvent ) 797*cdf0e10cSrcweir { 798*cdf0e10cSrcweir Reference< XAccessible > xReturn = GetItemWindowAccessible(rVclWindowEvent); 799*cdf0e10cSrcweir 800*cdf0e10cSrcweir if ( !xReturn.is() ) 801*cdf0e10cSrcweir xReturn = VCLXAccessibleComponent::GetChildAccessible(rVclWindowEvent); 802*cdf0e10cSrcweir return xReturn; 803*cdf0e10cSrcweir } 804*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 805*cdf0e10cSrcweir // XAccessibleSelection 806*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 807*cdf0e10cSrcweir void VCLXAccessibleToolBox::selectAccessibleChild( sal_Int32 nChildIndex ) throw (IndexOutOfBoundsException, RuntimeException) 808*cdf0e10cSrcweir { 809*cdf0e10cSrcweir OExternalLockGuard aGuard( this ); 810*cdf0e10cSrcweir if ( nChildIndex < 0 || nChildIndex >= getAccessibleChildCount() ) 811*cdf0e10cSrcweir throw IndexOutOfBoundsException(); 812*cdf0e10cSrcweir ToolBox * pToolBox = static_cast < ToolBox * > ( GetWindow() ); 813*cdf0e10cSrcweir sal_uInt16 nPos = static_cast < sal_uInt16 > (nChildIndex); 814*cdf0e10cSrcweir pToolBox->ChangeHighlight( nPos ); 815*cdf0e10cSrcweir } 816*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 817*cdf0e10cSrcweir sal_Bool VCLXAccessibleToolBox::isAccessibleChildSelected( sal_Int32 nChildIndex ) throw (IndexOutOfBoundsException, RuntimeException) 818*cdf0e10cSrcweir { 819*cdf0e10cSrcweir OExternalLockGuard aGuard( this ); 820*cdf0e10cSrcweir if ( nChildIndex < 0 || nChildIndex >= getAccessibleChildCount() ) 821*cdf0e10cSrcweir throw IndexOutOfBoundsException(); 822*cdf0e10cSrcweir ToolBox * pToolBox = static_cast < ToolBox * > ( GetWindow() ); 823*cdf0e10cSrcweir sal_uInt16 nPos = static_cast < sal_uInt16 > (nChildIndex); 824*cdf0e10cSrcweir if ( pToolBox != NULL && pToolBox->GetHighlightItemId() == pToolBox->GetItemId( nPos ) ) 825*cdf0e10cSrcweir return sal_True; 826*cdf0e10cSrcweir else 827*cdf0e10cSrcweir return sal_False; 828*cdf0e10cSrcweir } 829*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 830*cdf0e10cSrcweir void VCLXAccessibleToolBox::clearAccessibleSelection( ) throw (RuntimeException) 831*cdf0e10cSrcweir { 832*cdf0e10cSrcweir OExternalLockGuard aGuard( this ); 833*cdf0e10cSrcweir ToolBox * pToolBox = static_cast < ToolBox * > ( GetWindow() ); 834*cdf0e10cSrcweir pToolBox -> LoseFocus(); 835*cdf0e10cSrcweir } 836*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 837*cdf0e10cSrcweir void VCLXAccessibleToolBox::selectAllAccessibleChildren( ) throw (RuntimeException) 838*cdf0e10cSrcweir { 839*cdf0e10cSrcweir OExternalLockGuard aGuard( this ); 840*cdf0e10cSrcweir // intentionally empty. makes no sense for a toolbox 841*cdf0e10cSrcweir } 842*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 843*cdf0e10cSrcweir sal_Int32 VCLXAccessibleToolBox::getSelectedAccessibleChildCount( ) throw (RuntimeException) 844*cdf0e10cSrcweir { 845*cdf0e10cSrcweir OExternalLockGuard aGuard( this ); 846*cdf0e10cSrcweir sal_Int32 nRet = 0; 847*cdf0e10cSrcweir for ( sal_Int32 i = 0, nCount = getAccessibleChildCount(); i < nCount; i++ ) 848*cdf0e10cSrcweir { 849*cdf0e10cSrcweir if ( isAccessibleChildSelected( i ) ) 850*cdf0e10cSrcweir { 851*cdf0e10cSrcweir nRet = 1; 852*cdf0e10cSrcweir break; // a toolbox can only have (n)one selected child 853*cdf0e10cSrcweir } 854*cdf0e10cSrcweir } 855*cdf0e10cSrcweir return nRet; 856*cdf0e10cSrcweir } 857*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 858*cdf0e10cSrcweir Reference< XAccessible > VCLXAccessibleToolBox::getSelectedAccessibleChild( sal_Int32 nSelectedChildIndex ) throw (IndexOutOfBoundsException, RuntimeException) 859*cdf0e10cSrcweir { 860*cdf0e10cSrcweir OExternalLockGuard aGuard( this ); 861*cdf0e10cSrcweir if ( nSelectedChildIndex < 0 || nSelectedChildIndex >= getSelectedAccessibleChildCount() ) 862*cdf0e10cSrcweir throw IndexOutOfBoundsException(); 863*cdf0e10cSrcweir Reference< XAccessible > xChild; 864*cdf0e10cSrcweir for ( sal_Int32 i = 0, j = 0, nCount = getAccessibleChildCount(); i < nCount; i++ ) 865*cdf0e10cSrcweir { 866*cdf0e10cSrcweir if ( isAccessibleChildSelected( i ) && ( j++ == nSelectedChildIndex ) ) 867*cdf0e10cSrcweir { 868*cdf0e10cSrcweir xChild = getAccessibleChild( i ); 869*cdf0e10cSrcweir break; 870*cdf0e10cSrcweir } 871*cdf0e10cSrcweir } 872*cdf0e10cSrcweir return xChild; 873*cdf0e10cSrcweir } 874*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 875*cdf0e10cSrcweir void VCLXAccessibleToolBox::deselectAccessibleChild( sal_Int32 nChildIndex ) throw (IndexOutOfBoundsException, RuntimeException) 876*cdf0e10cSrcweir { 877*cdf0e10cSrcweir OExternalLockGuard aGuard( this ); 878*cdf0e10cSrcweir if ( nChildIndex < 0 || nChildIndex >= getAccessibleChildCount() ) 879*cdf0e10cSrcweir throw IndexOutOfBoundsException(); 880*cdf0e10cSrcweir clearAccessibleSelection(); // a toolbox can only have (n)one selected child 881*cdf0e10cSrcweir } 882*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 883