xref: /AOO41X/main/accessibility/source/extended/AccessibleToolPanelDeck.cxx (revision 79aad27f7f29270c03e208e3d687e8e3850af11d)
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