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