1*0841af79SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*0841af79SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*0841af79SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*0841af79SAndrew Rist * distributed with this work for additional information 6*0841af79SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*0841af79SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*0841af79SAndrew Rist * "License"); you may not use this file except in compliance 9*0841af79SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*0841af79SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*0841af79SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*0841af79SAndrew Rist * software distributed under the License is distributed on an 15*0841af79SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*0841af79SAndrew Rist * KIND, either express or implied. See the License for the 17*0841af79SAndrew Rist * specific language governing permissions and limitations 18*0841af79SAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*0841af79SAndrew Rist *************************************************************/ 21*0841af79SAndrew Rist 22*0841af79SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir #include "precompiled_accessibility.hxx" 25cdf0e10cSrcweir 26cdf0e10cSrcweir #include "accessibility/extended/AccessibleToolPanelDeck.hxx" 27cdf0e10cSrcweir 28cdf0e10cSrcweir /** === begin UNO includes === **/ 29cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleRole.hpp> 30cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleEventId.hpp> 31cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleStateType.hpp> 32cdf0e10cSrcweir #include <com/sun/star/lang/DisposedException.hpp> 33cdf0e10cSrcweir /** === end UNO includes === **/ 34cdf0e10cSrcweir 35cdf0e10cSrcweir #include <svtools/toolpanel/toolpaneldeck.hxx> 36cdf0e10cSrcweir #include <toolkit/awt/vclxwindow.hxx> 37cdf0e10cSrcweir #include <toolkit/helper/vclunohelper.hxx> 38cdf0e10cSrcweir #include <vcl/svapp.hxx> 39cdf0e10cSrcweir #include <vos/mutex.hxx> 40cdf0e10cSrcweir #include <unotools/accessiblestatesethelper.hxx> 41cdf0e10cSrcweir #include <tools/diagnose_ex.h> 42cdf0e10cSrcweir 43cdf0e10cSrcweir #include <boost/noncopyable.hpp> 44cdf0e10cSrcweir #include <vector> 45cdf0e10cSrcweir 46cdf0e10cSrcweir //...................................................................................................................... 47cdf0e10cSrcweir namespace accessibility 48cdf0e10cSrcweir { 49cdf0e10cSrcweir //...................................................................................................................... 50cdf0e10cSrcweir 51cdf0e10cSrcweir /** === begin UNO using === **/ 52cdf0e10cSrcweir using ::com::sun::star::uno::Reference; 53cdf0e10cSrcweir using ::com::sun::star::uno::XInterface; 54cdf0e10cSrcweir using ::com::sun::star::uno::UNO_QUERY; 55cdf0e10cSrcweir using ::com::sun::star::uno::UNO_QUERY_THROW; 56cdf0e10cSrcweir using ::com::sun::star::uno::UNO_SET_THROW; 57cdf0e10cSrcweir using ::com::sun::star::uno::Exception; 58cdf0e10cSrcweir using ::com::sun::star::uno::RuntimeException; 59cdf0e10cSrcweir using ::com::sun::star::uno::Any; 60cdf0e10cSrcweir using ::com::sun::star::uno::makeAny; 61cdf0e10cSrcweir using ::com::sun::star::uno::Sequence; 62cdf0e10cSrcweir using ::com::sun::star::uno::Type; 63cdf0e10cSrcweir using ::com::sun::star::accessibility::XAccessible; 64cdf0e10cSrcweir using ::com::sun::star::accessibility::XAccessibleContext; 65cdf0e10cSrcweir using ::com::sun::star::lang::DisposedException; 66cdf0e10cSrcweir using ::com::sun::star::lang::IndexOutOfBoundsException; 67cdf0e10cSrcweir using ::com::sun::star::lang::Locale; 68cdf0e10cSrcweir using ::com::sun::star::accessibility::XAccessibleRelationSet; 69cdf0e10cSrcweir using ::com::sun::star::accessibility::XAccessibleStateSet; 70cdf0e10cSrcweir using ::com::sun::star::accessibility::IllegalAccessibleComponentStateException; 71cdf0e10cSrcweir using ::com::sun::star::awt::XFont; 72cdf0e10cSrcweir /** === end UNO using === **/ 73cdf0e10cSrcweir namespace AccessibleRole = ::com::sun::star::accessibility::AccessibleRole; 74cdf0e10cSrcweir namespace AccessibleEventId = ::com::sun::star::accessibility::AccessibleEventId; 75cdf0e10cSrcweir namespace AccessibleStateType = ::com::sun::star::accessibility::AccessibleStateType; 76cdf0e10cSrcweir 77cdf0e10cSrcweir typedef ::com::sun::star::awt::Rectangle UnoRectangle; 78cdf0e10cSrcweir typedef ::com::sun::star::awt::Point UnoPoint; 79cdf0e10cSrcweir 80cdf0e10cSrcweir //================================================================================================================== 81cdf0e10cSrcweir //= AccessibleToolPanelDeck_Impl - declaration 82cdf0e10cSrcweir //================================================================================================================== 83cdf0e10cSrcweir class AccessibleToolPanelDeck_Impl :public ::boost::noncopyable 84cdf0e10cSrcweir ,public ::svt::IToolPanelDeckListener 85cdf0e10cSrcweir { 86cdf0e10cSrcweir public: 87cdf0e10cSrcweir AccessibleToolPanelDeck_Impl( 88cdf0e10cSrcweir AccessibleToolPanelDeck& i_rAntiImpl, 89cdf0e10cSrcweir const Reference< XAccessible >& i_rAccessibleParent, 90cdf0e10cSrcweir ::svt::ToolPanelDeck& i_rPanelDeck 91cdf0e10cSrcweir ); 92cdf0e10cSrcweir 93cdf0e10cSrcweir void checkDisposed(); isDisposed() const94cdf0e10cSrcweir bool isDisposed() const { return m_pPanelDeck == NULL; } 95cdf0e10cSrcweir void dispose(); 96cdf0e10cSrcweir 97cdf0e10cSrcweir ~AccessibleToolPanelDeck_Impl(); 98cdf0e10cSrcweir 99cdf0e10cSrcweir Reference< XAccessible > getOwnAccessible() const; 100cdf0e10cSrcweir Reference< XAccessible > getActivePanelAccessible(); 101cdf0e10cSrcweir 102cdf0e10cSrcweir protected: 103cdf0e10cSrcweir // IToolPanelDeckListener 104cdf0e10cSrcweir virtual void PanelInserted( const ::svt::PToolPanel& i_pPanel, const size_t i_nPosition ); 105cdf0e10cSrcweir virtual void PanelRemoved( const size_t i_nPosition ); 106cdf0e10cSrcweir virtual void ActivePanelChanged( const ::boost::optional< size_t >& i_rOldActive, const ::boost::optional< size_t >& i_rNewActive ); 107cdf0e10cSrcweir virtual void LayouterChanged( const ::svt::PDeckLayouter& i_rNewLayouter ); 108cdf0e10cSrcweir virtual void Dying(); 109cdf0e10cSrcweir 110cdf0e10cSrcweir public: 111cdf0e10cSrcweir AccessibleToolPanelDeck& m_rAntiImpl; 112cdf0e10cSrcweir Reference< XAccessible > m_xAccessibleParent; 113cdf0e10cSrcweir ::svt::ToolPanelDeck* m_pPanelDeck; 114cdf0e10cSrcweir 115cdf0e10cSrcweir typedef ::std::vector< Reference< XAccessible > > AccessibleChildren; 116cdf0e10cSrcweir Reference< XAccessible > m_xActivePanelAccessible; 117cdf0e10cSrcweir }; 118cdf0e10cSrcweir 119cdf0e10cSrcweir //================================================================================================================== 120cdf0e10cSrcweir //= MethodGuard 121cdf0e10cSrcweir //================================================================================================================== 122cdf0e10cSrcweir namespace 123cdf0e10cSrcweir { 124cdf0e10cSrcweir class MethodGuard 125cdf0e10cSrcweir { 126cdf0e10cSrcweir public: MethodGuard(AccessibleToolPanelDeck_Impl & i_rImpl)127cdf0e10cSrcweir MethodGuard( AccessibleToolPanelDeck_Impl& i_rImpl ) 128cdf0e10cSrcweir :m_aGuard( Application::GetSolarMutex() ) 129cdf0e10cSrcweir { 130cdf0e10cSrcweir i_rImpl.checkDisposed(); 131cdf0e10cSrcweir } ~MethodGuard()132cdf0e10cSrcweir ~MethodGuard() 133cdf0e10cSrcweir { 134cdf0e10cSrcweir } 135cdf0e10cSrcweir clear()136cdf0e10cSrcweir void clear() 137cdf0e10cSrcweir { 138cdf0e10cSrcweir m_aGuard.clear(); 139cdf0e10cSrcweir } 140cdf0e10cSrcweir 141cdf0e10cSrcweir private: 142cdf0e10cSrcweir ::vos::OClearableGuard m_aGuard; 143cdf0e10cSrcweir }; 144cdf0e10cSrcweir } 145cdf0e10cSrcweir 146cdf0e10cSrcweir //================================================================================================================== 147cdf0e10cSrcweir //= AccessibleToolPanelDeck_Impl - implementation 148cdf0e10cSrcweir //================================================================================================================== 149cdf0e10cSrcweir //------------------------------------------------------------------------------------------------------------------ AccessibleToolPanelDeck_Impl(AccessibleToolPanelDeck & i_rAntiImpl,const Reference<XAccessible> & i_rAccessibleParent,::svt::ToolPanelDeck & i_rPanelDeck)150cdf0e10cSrcweir AccessibleToolPanelDeck_Impl::AccessibleToolPanelDeck_Impl( AccessibleToolPanelDeck& i_rAntiImpl, const Reference< XAccessible >& i_rAccessibleParent, 151cdf0e10cSrcweir ::svt::ToolPanelDeck& i_rPanelDeck ) 152cdf0e10cSrcweir :m_rAntiImpl( i_rAntiImpl ) 153cdf0e10cSrcweir ,m_xAccessibleParent( i_rAccessibleParent ) 154cdf0e10cSrcweir ,m_pPanelDeck( &i_rPanelDeck ) 155cdf0e10cSrcweir ,m_xActivePanelAccessible() 156cdf0e10cSrcweir { 157cdf0e10cSrcweir m_pPanelDeck->AddListener( *this ); 158cdf0e10cSrcweir } 159cdf0e10cSrcweir 160cdf0e10cSrcweir //------------------------------------------------------------------------------------------------------------------ ~AccessibleToolPanelDeck_Impl()161cdf0e10cSrcweir AccessibleToolPanelDeck_Impl::~AccessibleToolPanelDeck_Impl() 162cdf0e10cSrcweir { 163cdf0e10cSrcweir if ( !isDisposed() ) 164cdf0e10cSrcweir dispose(); 165cdf0e10cSrcweir } 166cdf0e10cSrcweir 167cdf0e10cSrcweir //------------------------------------------------------------------------------------------------------------------ dispose()168cdf0e10cSrcweir void AccessibleToolPanelDeck_Impl::dispose() 169cdf0e10cSrcweir { 170cdf0e10cSrcweir ENSURE_OR_RETURN_VOID( !isDisposed(), "disposed twice" ); 171cdf0e10cSrcweir m_pPanelDeck->RemoveListener( *this ); 172cdf0e10cSrcweir m_pPanelDeck = NULL; 173cdf0e10cSrcweir m_xAccessibleParent.clear(); 174cdf0e10cSrcweir } 175cdf0e10cSrcweir 176cdf0e10cSrcweir //------------------------------------------------------------------------------------------------------------------ checkDisposed()177cdf0e10cSrcweir void AccessibleToolPanelDeck_Impl::checkDisposed() 178cdf0e10cSrcweir { 179cdf0e10cSrcweir if ( isDisposed() ) 180cdf0e10cSrcweir throw DisposedException( ::rtl::OUString(), *&m_rAntiImpl ); 181cdf0e10cSrcweir } 182cdf0e10cSrcweir 183cdf0e10cSrcweir //------------------------------------------------------------------------------------------------------------------ getOwnAccessible() const184cdf0e10cSrcweir Reference< XAccessible > AccessibleToolPanelDeck_Impl::getOwnAccessible() const 185cdf0e10cSrcweir { 186cdf0e10cSrcweir Reference< XAccessible > xOwnAccessible( static_cast< XAccessible* >( m_rAntiImpl.GetVCLXWindow() ) ); 187cdf0e10cSrcweir OSL_ENSURE( xOwnAccessible->getAccessibleContext() == Reference< XAccessibleContext >( &m_rAntiImpl ), 188cdf0e10cSrcweir "AccessibleToolPanelDeck_Impl::getOwnAccessible: could not retrieve proper XAccessible for /myself!" ); 189cdf0e10cSrcweir return xOwnAccessible; 190cdf0e10cSrcweir } 191cdf0e10cSrcweir 192cdf0e10cSrcweir //------------------------------------------------------------------------------------------------------------------ getActivePanelAccessible()193cdf0e10cSrcweir Reference< XAccessible > AccessibleToolPanelDeck_Impl::getActivePanelAccessible() 194cdf0e10cSrcweir { 195cdf0e10cSrcweir ENSURE_OR_RETURN( !isDisposed(), "AccessibleToolPanelDeck_Impl::getActivePanelAccessible: already disposed!", NULL ); 196cdf0e10cSrcweir 197cdf0e10cSrcweir if ( !m_xActivePanelAccessible.is() ) 198cdf0e10cSrcweir { 199cdf0e10cSrcweir ::boost::optional< size_t > aActivePanel( m_pPanelDeck->GetActivePanel() ); 200cdf0e10cSrcweir ENSURE_OR_RETURN( !!aActivePanel, "AccessibleToolPanelDeck_Impl::getActivePanelAccessible: this should not be called without an active panel!", NULL ); 201cdf0e10cSrcweir ::svt::PToolPanel pActivePanel( m_pPanelDeck->GetPanel( *aActivePanel ) ); 202cdf0e10cSrcweir ENSURE_OR_RETURN( pActivePanel.get() != NULL, "AccessibleToolPanelDeck_Impl::getActivePanelAccessible: no active panel!", NULL ); 203cdf0e10cSrcweir m_xActivePanelAccessible = pActivePanel->CreatePanelAccessible( getOwnAccessible() ); 204cdf0e10cSrcweir OSL_ENSURE( m_xActivePanelAccessible.is(), "AccessibleToolPanelDeck_Impl::getActivePanelAccessible: illegal accessible returned by the panel!" ); 205cdf0e10cSrcweir } 206cdf0e10cSrcweir 207cdf0e10cSrcweir return m_xActivePanelAccessible; 208cdf0e10cSrcweir } 209cdf0e10cSrcweir 210cdf0e10cSrcweir //------------------------------------------------------------------------------------------------------------------ PanelInserted(const::svt::PToolPanel & i_pPanel,const size_t i_nPosition)211cdf0e10cSrcweir void AccessibleToolPanelDeck_Impl::PanelInserted( const ::svt::PToolPanel& i_pPanel, const size_t i_nPosition ) 212cdf0e10cSrcweir { 213cdf0e10cSrcweir (void)i_pPanel; 214cdf0e10cSrcweir (void)i_nPosition; 215cdf0e10cSrcweir } 216cdf0e10cSrcweir 217cdf0e10cSrcweir //------------------------------------------------------------------------------------------------------------------ PanelRemoved(const size_t i_nPosition)218cdf0e10cSrcweir void AccessibleToolPanelDeck_Impl::PanelRemoved( const size_t i_nPosition ) 219cdf0e10cSrcweir { 220cdf0e10cSrcweir (void)i_nPosition; 221cdf0e10cSrcweir } 222cdf0e10cSrcweir 223cdf0e10cSrcweir //------------------------------------------------------------------------------------------------------------------ ActivePanelChanged(const::boost::optional<size_t> & i_rOldActive,const::boost::optional<size_t> & i_rNewActive)224cdf0e10cSrcweir void AccessibleToolPanelDeck_Impl::ActivePanelChanged( const ::boost::optional< size_t >& i_rOldActive, const ::boost::optional< size_t >& i_rNewActive ) 225cdf0e10cSrcweir { 226cdf0e10cSrcweir if ( !!i_rOldActive ) 227cdf0e10cSrcweir { 228cdf0e10cSrcweir if ( !m_xActivePanelAccessible.is() ) 229cdf0e10cSrcweir { 230cdf0e10cSrcweir // again, this might in theory happen if the XAccessible for the active panel has never before been requested. 231cdf0e10cSrcweir // In this case, just say that all our children are invalid, so they all must be re-requested. 232cdf0e10cSrcweir m_rAntiImpl.NotifyAccessibleEvent( AccessibleEventId::INVALIDATE_ALL_CHILDREN, Any(), Any() ); 233cdf0e10cSrcweir } 234cdf0e10cSrcweir else 235cdf0e10cSrcweir { 236cdf0e10cSrcweir m_rAntiImpl.NotifyAccessibleEvent( AccessibleEventId::CHILD, makeAny( m_xActivePanelAccessible ), Any() ); 237cdf0e10cSrcweir } 238cdf0e10cSrcweir } 239cdf0e10cSrcweir 240cdf0e10cSrcweir m_xActivePanelAccessible.clear(); 241cdf0e10cSrcweir 242cdf0e10cSrcweir if ( !!i_rNewActive ) 243cdf0e10cSrcweir { 244cdf0e10cSrcweir m_rAntiImpl.NotifyAccessibleEvent( AccessibleEventId::CHILD, Any(), makeAny( getActivePanelAccessible() ) ); 245cdf0e10cSrcweir } 246cdf0e10cSrcweir } 247cdf0e10cSrcweir 248cdf0e10cSrcweir //------------------------------------------------------------------------------------------------------------------ LayouterChanged(const::svt::PDeckLayouter & i_rNewLayouter)249cdf0e10cSrcweir void AccessibleToolPanelDeck_Impl::LayouterChanged( const ::svt::PDeckLayouter& i_rNewLayouter ) 250cdf0e10cSrcweir { 251cdf0e10cSrcweir MethodGuard aGuard( *this ); 252cdf0e10cSrcweir 253cdf0e10cSrcweir (void)i_rNewLayouter; 254cdf0e10cSrcweir m_rAntiImpl.NotifyAccessibleEvent( AccessibleEventId::INVALIDATE_ALL_CHILDREN, Any(), Any() ); 255cdf0e10cSrcweir } 256cdf0e10cSrcweir 257cdf0e10cSrcweir //------------------------------------------------------------------------------------------------------------------ Dying()258cdf0e10cSrcweir void AccessibleToolPanelDeck_Impl::Dying() 259cdf0e10cSrcweir { 260cdf0e10cSrcweir // the tool panel deck is dying, so dispose ourself 261cdf0e10cSrcweir m_rAntiImpl.dispose(); 262cdf0e10cSrcweir } 263cdf0e10cSrcweir 264cdf0e10cSrcweir //================================================================================================================== 265cdf0e10cSrcweir //= AccessibleToolPanelDeck 266cdf0e10cSrcweir //================================================================================================================== 267cdf0e10cSrcweir //------------------------------------------------------------------------------------------------------------------ AccessibleToolPanelDeck(const Reference<XAccessible> & i_rAccessibleParent,::svt::ToolPanelDeck & i_rPanelDeck)268cdf0e10cSrcweir AccessibleToolPanelDeck::AccessibleToolPanelDeck( const Reference< XAccessible >& i_rAccessibleParent, 269cdf0e10cSrcweir ::svt::ToolPanelDeck& i_rPanelDeck ) 270cdf0e10cSrcweir :AccessibleToolPanelDeck_Base( i_rPanelDeck.GetWindowPeer() ) 271cdf0e10cSrcweir ,m_pImpl( new AccessibleToolPanelDeck_Impl( *this, i_rAccessibleParent, i_rPanelDeck ) ) 272cdf0e10cSrcweir { 273cdf0e10cSrcweir } 274cdf0e10cSrcweir 275cdf0e10cSrcweir //------------------------------------------------------------------------------------------------------------------ ~AccessibleToolPanelDeck()276cdf0e10cSrcweir AccessibleToolPanelDeck::~AccessibleToolPanelDeck() 277cdf0e10cSrcweir { 278cdf0e10cSrcweir } 279cdf0e10cSrcweir 280cdf0e10cSrcweir //------------------------------------------------------------------------------------------------------------------ getAccessibleChildCount()281cdf0e10cSrcweir sal_Int32 SAL_CALL AccessibleToolPanelDeck::getAccessibleChildCount( ) throw (RuntimeException) 282cdf0e10cSrcweir { 283cdf0e10cSrcweir MethodGuard aGuard( *m_pImpl ); 284cdf0e10cSrcweir 285cdf0e10cSrcweir sal_Int32 nChildCount( m_pImpl->m_pPanelDeck->GetLayouter()->GetAccessibleChildCount() ); 286cdf0e10cSrcweir 287cdf0e10cSrcweir ::boost::optional< size_t > aActivePanel( m_pImpl->m_pPanelDeck->GetActivePanel() ); 288cdf0e10cSrcweir if ( !!aActivePanel ) 289cdf0e10cSrcweir return ++nChildCount; 290cdf0e10cSrcweir 291cdf0e10cSrcweir return nChildCount; 292cdf0e10cSrcweir } 293cdf0e10cSrcweir 294cdf0e10cSrcweir //------------------------------------------------------------------------------------------------------------------ getAccessibleChild(sal_Int32 i_nIndex)295cdf0e10cSrcweir Reference< XAccessible > SAL_CALL AccessibleToolPanelDeck::getAccessibleChild( sal_Int32 i_nIndex ) throw (IndexOutOfBoundsException, RuntimeException) 296cdf0e10cSrcweir { 297cdf0e10cSrcweir MethodGuard aGuard( *m_pImpl ); 298cdf0e10cSrcweir 299cdf0e10cSrcweir const sal_Int32 nChildCount( getAccessibleChildCount() ); 300cdf0e10cSrcweir if ( ( i_nIndex < 0 ) || ( i_nIndex >= nChildCount ) ) 301cdf0e10cSrcweir throw IndexOutOfBoundsException( ::rtl::OUString(), *this ); 302cdf0e10cSrcweir 303cdf0e10cSrcweir // first "n" children are provided by the layouter 304cdf0e10cSrcweir const size_t nLayouterCount( m_pImpl->m_pPanelDeck->GetLayouter()->GetAccessibleChildCount() ); 305cdf0e10cSrcweir if ( size_t( i_nIndex ) < nLayouterCount ) 306cdf0e10cSrcweir return m_pImpl->m_pPanelDeck->GetLayouter()->GetAccessibleChild( 307cdf0e10cSrcweir size_t( i_nIndex ), 308cdf0e10cSrcweir m_pImpl->getOwnAccessible() 309cdf0e10cSrcweir ); 310cdf0e10cSrcweir 311cdf0e10cSrcweir // the last child is the XAccessible of the active panel 312cdf0e10cSrcweir return m_pImpl->getActivePanelAccessible(); 313cdf0e10cSrcweir } 314cdf0e10cSrcweir 315cdf0e10cSrcweir //------------------------------------------------------------------------------------------------------------------ getAccessibleParent()316cdf0e10cSrcweir Reference< XAccessible > SAL_CALL AccessibleToolPanelDeck::getAccessibleParent( ) throw (RuntimeException) 317cdf0e10cSrcweir { 318cdf0e10cSrcweir MethodGuard aGuard( *m_pImpl ); 319cdf0e10cSrcweir const Reference< XAccessible > xParent = implGetForeignControlledParent(); 320cdf0e10cSrcweir if ( xParent.is() ) 321cdf0e10cSrcweir return xParent; 322cdf0e10cSrcweir return m_pImpl->m_xAccessibleParent; 323cdf0e10cSrcweir } 324cdf0e10cSrcweir 325cdf0e10cSrcweir //------------------------------------------------------------------------------------------------------------------ getAccessibleRole()326cdf0e10cSrcweir sal_Int16 SAL_CALL AccessibleToolPanelDeck::getAccessibleRole( ) throw (RuntimeException) 327cdf0e10cSrcweir { 328cdf0e10cSrcweir MethodGuard aGuard( *m_pImpl ); 329cdf0e10cSrcweir return AccessibleRole::PANEL; 330cdf0e10cSrcweir } 331cdf0e10cSrcweir 332cdf0e10cSrcweir //------------------------------------------------------------------------------------------------------------------ getAccessibleAtPoint(const UnoPoint & i_rPoint)333cdf0e10cSrcweir Reference< XAccessible > SAL_CALL AccessibleToolPanelDeck::getAccessibleAtPoint( const UnoPoint& i_rPoint ) throw (RuntimeException) 334cdf0e10cSrcweir { 335cdf0e10cSrcweir MethodGuard aGuard( *m_pImpl ); 336cdf0e10cSrcweir 337cdf0e10cSrcweir const ::Point aRequestedPoint( VCLUnoHelper::ConvertToVCLPoint( i_rPoint ) ); 338cdf0e10cSrcweir // check the panel window itself 339cdf0e10cSrcweir const ::Window& rActivePanelAnchor( m_pImpl->m_pPanelDeck->GetPanelWindowAnchor() ); 340cdf0e10cSrcweir const Rectangle aPanelAnchorArea( rActivePanelAnchor.GetPosPixel(), rActivePanelAnchor.GetOutputSizePixel() ); 341cdf0e10cSrcweir if ( aPanelAnchorArea.IsInside( aRequestedPoint ) ) 342cdf0e10cSrcweir // note that this assumes that the Window which actually implements the concrete panel covers 343cdf0e10cSrcweir // the complete area of its "anchor" Window. But this is ensured by the ToolPanelDeck implementation. 344cdf0e10cSrcweir return m_pImpl->getActivePanelAccessible(); 345cdf0e10cSrcweir 346cdf0e10cSrcweir // check the XAccessible instances provided by the layouter 347cdf0e10cSrcweir try 348cdf0e10cSrcweir { 349cdf0e10cSrcweir const ::svt::PDeckLayouter pLayouter( m_pImpl->m_pPanelDeck->GetLayouter() ); 350cdf0e10cSrcweir ENSURE_OR_THROW( pLayouter.get() != NULL, "invalid layouter" ); 351cdf0e10cSrcweir 352cdf0e10cSrcweir const size_t nLayouterChildren = pLayouter->GetAccessibleChildCount(); 353cdf0e10cSrcweir for ( size_t i=0; i<nLayouterChildren; ++i ) 354cdf0e10cSrcweir { 355cdf0e10cSrcweir const Reference< XAccessible > xLayoutItemAccessible( pLayouter->GetAccessibleChild( i, m_pImpl->getOwnAccessible() ), UNO_SET_THROW ); 356cdf0e10cSrcweir const Reference< XAccessibleComponent > xLayoutItemComponent( xLayoutItemAccessible->getAccessibleContext(), UNO_QUERY_THROW ); 357cdf0e10cSrcweir const ::Rectangle aLayoutItemBounds( VCLUnoHelper::ConvertToVCLRect( xLayoutItemComponent->getBounds() ) ); 358cdf0e10cSrcweir if ( aLayoutItemBounds.IsInside( aRequestedPoint ) ) 359cdf0e10cSrcweir return xLayoutItemAccessible; 360cdf0e10cSrcweir } 361cdf0e10cSrcweir } 362cdf0e10cSrcweir catch( const Exception& ) 363cdf0e10cSrcweir { 364cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION(); 365cdf0e10cSrcweir } 366cdf0e10cSrcweir 367cdf0e10cSrcweir return NULL; 368cdf0e10cSrcweir } 369cdf0e10cSrcweir 370cdf0e10cSrcweir //------------------------------------------------------------------------------------------------------------------ grabFocus()371cdf0e10cSrcweir void SAL_CALL AccessibleToolPanelDeck::grabFocus( ) throw (RuntimeException) 372cdf0e10cSrcweir { 373cdf0e10cSrcweir MethodGuard aGuard( *m_pImpl ); 374cdf0e10cSrcweir m_pImpl->m_pPanelDeck->GrabFocus(); 375cdf0e10cSrcweir } 376cdf0e10cSrcweir 377cdf0e10cSrcweir //------------------------------------------------------------------------------------------------------------------ disposing()378cdf0e10cSrcweir void SAL_CALL AccessibleToolPanelDeck::disposing() 379cdf0e10cSrcweir { 380cdf0e10cSrcweir AccessibleToolPanelDeck_Base::disposing(); 381cdf0e10cSrcweir m_pImpl->dispose(); 382cdf0e10cSrcweir } 383cdf0e10cSrcweir 384cdf0e10cSrcweir //------------------------------------------------------------------------------------------------------------------ GetChildAccessible(const VclWindowEvent & i_rVclWindowEvent)385cdf0e10cSrcweir Reference< XAccessible > AccessibleToolPanelDeck::GetChildAccessible( const VclWindowEvent& i_rVclWindowEvent ) 386cdf0e10cSrcweir { 387cdf0e10cSrcweir // don't let the base class generate any A11Y events from VclWindowEvent, we completely manage those 388cdf0e10cSrcweir // A11Y events ourself 389cdf0e10cSrcweir (void)i_rVclWindowEvent; 390cdf0e10cSrcweir return NULL; 391cdf0e10cSrcweir } 392cdf0e10cSrcweir 393cdf0e10cSrcweir //------------------------------------------------------------------------------------------------------------------ FillAccessibleStateSet(::utl::AccessibleStateSetHelper & i_rStateSet)394cdf0e10cSrcweir void AccessibleToolPanelDeck::FillAccessibleStateSet( ::utl::AccessibleStateSetHelper& i_rStateSet ) 395cdf0e10cSrcweir { 396cdf0e10cSrcweir AccessibleToolPanelDeck_Base::FillAccessibleStateSet( i_rStateSet ); 397cdf0e10cSrcweir if ( m_pImpl->isDisposed() ) 398cdf0e10cSrcweir { 399cdf0e10cSrcweir i_rStateSet.AddState( AccessibleStateType::DEFUNC ); 400cdf0e10cSrcweir } 401cdf0e10cSrcweir else 402cdf0e10cSrcweir { 403cdf0e10cSrcweir i_rStateSet.AddState( AccessibleStateType::FOCUSABLE ); 404cdf0e10cSrcweir } 405cdf0e10cSrcweir } 406cdf0e10cSrcweir 407cdf0e10cSrcweir //...................................................................................................................... 408cdf0e10cSrcweir } // namespace accessibility 409cdf0e10cSrcweir //...................................................................................................................... 410