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