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