xref: /trunk/main/accessibility/source/standard/vclxaccessibletoolbox.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_accessibility.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir // includes --------------------------------------------------------------
32*cdf0e10cSrcweir #include <accessibility/standard/vclxaccessibletoolbox.hxx>
33*cdf0e10cSrcweir #include <accessibility/standard/vclxaccessibletoolboxitem.hxx>
34*cdf0e10cSrcweir #include <toolkit/helper/convert.hxx>
35*cdf0e10cSrcweir 
36*cdf0e10cSrcweir #include <unotools/accessiblestatesethelper.hxx>
37*cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleEventId.hpp>
38*cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleStateType.hpp>
39*cdf0e10cSrcweir #include <com/sun/star/lang/XUnoTunnel.hpp>
40*cdf0e10cSrcweir #include <com/sun/star/lang/XUnoTunnel.hpp>
41*cdf0e10cSrcweir #include <tools/debug.hxx>
42*cdf0e10cSrcweir #include <vcl/toolbox.hxx>
43*cdf0e10cSrcweir #include <comphelper/accessiblewrapper.hxx>
44*cdf0e10cSrcweir #include <comphelper/processfactory.hxx>
45*cdf0e10cSrcweir 
46*cdf0e10cSrcweir using namespace ::comphelper;
47*cdf0e10cSrcweir using namespace ::com::sun::star;
48*cdf0e10cSrcweir using namespace ::com::sun::star::uno;
49*cdf0e10cSrcweir using namespace ::com::sun::star::lang;
50*cdf0e10cSrcweir using namespace ::com::sun::star::accessibility;
51*cdf0e10cSrcweir 
52*cdf0e10cSrcweir namespace
53*cdf0e10cSrcweir {
54*cdf0e10cSrcweir     // =========================================================================
55*cdf0e10cSrcweir     // = OToolBoxWindowItemContext
56*cdf0e10cSrcweir     // =========================================================================
57*cdf0e10cSrcweir     /** XAccessibleContext implementation for a toolbox item which is represented by a VCL Window
58*cdf0e10cSrcweir     */
59*cdf0e10cSrcweir     class OToolBoxWindowItemContext : public OAccessibleContextWrapper
60*cdf0e10cSrcweir     {
61*cdf0e10cSrcweir         sal_Int32 m_nIndexInParent;
62*cdf0e10cSrcweir     public:
63*cdf0e10cSrcweir         OToolBoxWindowItemContext(sal_Int32 _nIndexInParent,
64*cdf0e10cSrcweir             const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB,
65*cdf0e10cSrcweir             const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleContext >& _rxInnerAccessibleContext,
66*cdf0e10cSrcweir             const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >& _rxOwningAccessible,
67*cdf0e10cSrcweir             const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >& _rxParentAccessible
68*cdf0e10cSrcweir             ) : OAccessibleContextWrapper(
69*cdf0e10cSrcweir             _rxORB,
70*cdf0e10cSrcweir             _rxInnerAccessibleContext,
71*cdf0e10cSrcweir             _rxOwningAccessible,
72*cdf0e10cSrcweir             _rxParentAccessible     )
73*cdf0e10cSrcweir             ,m_nIndexInParent(_nIndexInParent)
74*cdf0e10cSrcweir         {
75*cdf0e10cSrcweir         }
76*cdf0e10cSrcweir         virtual sal_Int32 SAL_CALL getAccessibleIndexInParent(  ) throw (::com::sun::star::uno::RuntimeException);
77*cdf0e10cSrcweir     };
78*cdf0e10cSrcweir 
79*cdf0e10cSrcweir     // -------------------------------------------------------------------------
80*cdf0e10cSrcweir     sal_Int32 SAL_CALL OToolBoxWindowItemContext::getAccessibleIndexInParent(  ) throw (::com::sun::star::uno::RuntimeException)
81*cdf0e10cSrcweir     {
82*cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
83*cdf0e10cSrcweir         return m_nIndexInParent;
84*cdf0e10cSrcweir     }
85*cdf0e10cSrcweir 
86*cdf0e10cSrcweir     // =========================================================================
87*cdf0e10cSrcweir     // = OToolBoxWindowItem
88*cdf0e10cSrcweir     // =========================================================================
89*cdf0e10cSrcweir     typedef ::cppu::ImplHelper1 <   XUnoTunnel
90*cdf0e10cSrcweir                                 >   OToolBoxWindowItem_Base;
91*cdf0e10cSrcweir 
92*cdf0e10cSrcweir     /** XAccessible implementation for a toolbox item which is represented by a VCL Window
93*cdf0e10cSrcweir     */
94*cdf0e10cSrcweir     class OToolBoxWindowItem
95*cdf0e10cSrcweir             :public OAccessibleWrapper
96*cdf0e10cSrcweir             ,public OToolBoxWindowItem_Base
97*cdf0e10cSrcweir     {
98*cdf0e10cSrcweir     private:
99*cdf0e10cSrcweir         sal_Int32 m_nIndexInParent;
100*cdf0e10cSrcweir 
101*cdf0e10cSrcweir     public:
102*cdf0e10cSrcweir         inline sal_Int32    getIndexInParent() const                    { return m_nIndexInParent; }
103*cdf0e10cSrcweir         inline void         setIndexInParent( sal_Int32 _nNewIndex )    { m_nIndexInParent = _nNewIndex; }
104*cdf0e10cSrcweir 
105*cdf0e10cSrcweir         static  sal_Bool    isWindowItem( const Reference< XAccessible >& _rxAcc, OToolBoxWindowItem** /* [out] */ _ppImplementation = NULL );
106*cdf0e10cSrcweir 
107*cdf0e10cSrcweir     public:
108*cdf0e10cSrcweir         OToolBoxWindowItem(sal_Int32 _nIndexInParent,
109*cdf0e10cSrcweir             const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB,
110*cdf0e10cSrcweir             const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >& _rxInnerAccessible,
111*cdf0e10cSrcweir             const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >& _rxParentAccessible
112*cdf0e10cSrcweir             ) : OAccessibleWrapper(
113*cdf0e10cSrcweir             _rxORB,
114*cdf0e10cSrcweir             _rxInnerAccessible,
115*cdf0e10cSrcweir             _rxParentAccessible)
116*cdf0e10cSrcweir             ,m_nIndexInParent(_nIndexInParent)
117*cdf0e10cSrcweir         {
118*cdf0e10cSrcweir         }
119*cdf0e10cSrcweir 
120*cdf0e10cSrcweir     protected:
121*cdf0e10cSrcweir         // XInterface
122*cdf0e10cSrcweir         DECLARE_XINTERFACE( )
123*cdf0e10cSrcweir         DECLARE_XTYPEPROVIDER( )
124*cdf0e10cSrcweir 
125*cdf0e10cSrcweir         // OAccessibleWrapper
126*cdf0e10cSrcweir         virtual OAccessibleContextWrapper* createAccessibleContext(
127*cdf0e10cSrcweir                 const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleContext >& _rxInnerContext
128*cdf0e10cSrcweir             );
129*cdf0e10cSrcweir 
130*cdf0e10cSrcweir         // XUnoTunnel
131*cdf0e10cSrcweir         virtual sal_Int64 SAL_CALL getSomething( const Sequence< sal_Int8 >& aIdentifier ) throw (RuntimeException);
132*cdf0e10cSrcweir         static Sequence< sal_Int8 > getUnoTunnelImplementationId();
133*cdf0e10cSrcweir     };
134*cdf0e10cSrcweir 
135*cdf0e10cSrcweir     // -------------------------------------------------------------------------
136*cdf0e10cSrcweir     IMPLEMENT_FORWARD_XINTERFACE2( OToolBoxWindowItem, OAccessibleWrapper, OToolBoxWindowItem_Base )
137*cdf0e10cSrcweir     IMPLEMENT_FORWARD_XTYPEPROVIDER2( OToolBoxWindowItem, OAccessibleWrapper, OToolBoxWindowItem_Base )
138*cdf0e10cSrcweir 
139*cdf0e10cSrcweir     // -------------------------------------------------------------------------
140*cdf0e10cSrcweir     OAccessibleContextWrapper* OToolBoxWindowItem::createAccessibleContext(
141*cdf0e10cSrcweir             const Reference< XAccessibleContext >& _rxInnerContext )
142*cdf0e10cSrcweir     {
143*cdf0e10cSrcweir         return new OToolBoxWindowItemContext( m_nIndexInParent,getORB(), _rxInnerContext, this, getParent() );
144*cdf0e10cSrcweir     }
145*cdf0e10cSrcweir 
146*cdf0e10cSrcweir     //--------------------------------------------------------------------
147*cdf0e10cSrcweir     sal_Bool OToolBoxWindowItem::isWindowItem( const Reference< XAccessible >& _rxAcc, OToolBoxWindowItem** /* [out] */ _ppImplementation )
148*cdf0e10cSrcweir     {
149*cdf0e10cSrcweir         OToolBoxWindowItem* pImplementation = NULL;
150*cdf0e10cSrcweir 
151*cdf0e10cSrcweir         Reference< XUnoTunnel > xTunnel( _rxAcc, UNO_QUERY );
152*cdf0e10cSrcweir         if ( xTunnel.is() )
153*cdf0e10cSrcweir             pImplementation = reinterpret_cast< OToolBoxWindowItem* >( xTunnel->getSomething( getUnoTunnelImplementationId() ) );
154*cdf0e10cSrcweir 
155*cdf0e10cSrcweir         if ( _ppImplementation )
156*cdf0e10cSrcweir             *_ppImplementation = pImplementation;
157*cdf0e10cSrcweir 
158*cdf0e10cSrcweir         return NULL != pImplementation;
159*cdf0e10cSrcweir     }
160*cdf0e10cSrcweir 
161*cdf0e10cSrcweir     //--------------------------------------------------------------------
162*cdf0e10cSrcweir     Sequence< sal_Int8 > OToolBoxWindowItem::getUnoTunnelImplementationId()
163*cdf0e10cSrcweir     {
164*cdf0e10cSrcweir         static ::cppu::OImplementationId * pId = 0;
165*cdf0e10cSrcweir         if (! pId)
166*cdf0e10cSrcweir         {
167*cdf0e10cSrcweir             ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );
168*cdf0e10cSrcweir             if (! pId)
169*cdf0e10cSrcweir             {
170*cdf0e10cSrcweir                 static ::cppu::OImplementationId aId;
171*cdf0e10cSrcweir                 pId = &aId;
172*cdf0e10cSrcweir             }
173*cdf0e10cSrcweir         }
174*cdf0e10cSrcweir         return pId->getImplementationId();
175*cdf0e10cSrcweir     }
176*cdf0e10cSrcweir 
177*cdf0e10cSrcweir     //--------------------------------------------------------------------
178*cdf0e10cSrcweir     sal_Int64 SAL_CALL OToolBoxWindowItem::getSomething( const Sequence< sal_Int8 >& _rId ) throw (RuntimeException)
179*cdf0e10cSrcweir     {
180*cdf0e10cSrcweir         if  (   ( 16 == _rId.getLength() )
181*cdf0e10cSrcweir             &&  ( 0 == rtl_compareMemory( getUnoTunnelImplementationId().getConstArray(),  _rId.getConstArray(), 16 ) )
182*cdf0e10cSrcweir             )
183*cdf0e10cSrcweir             return reinterpret_cast< sal_Int64>( this );
184*cdf0e10cSrcweir 
185*cdf0e10cSrcweir         return 0;
186*cdf0e10cSrcweir     }
187*cdf0e10cSrcweir }
188*cdf0e10cSrcweir 
189*cdf0e10cSrcweir DBG_NAME(VCLXAccessibleToolBox)
190*cdf0e10cSrcweir 
191*cdf0e10cSrcweir // -----------------------------------------------------------------------------
192*cdf0e10cSrcweir // VCLXAccessibleToolBox
193*cdf0e10cSrcweir // -----------------------------------------------------------------------------
194*cdf0e10cSrcweir VCLXAccessibleToolBox::VCLXAccessibleToolBox( VCLXWindow* pVCLXWindow ) :
195*cdf0e10cSrcweir 
196*cdf0e10cSrcweir     VCLXAccessibleComponent( pVCLXWindow )
197*cdf0e10cSrcweir 
198*cdf0e10cSrcweir {
199*cdf0e10cSrcweir     DBG_CTOR(VCLXAccessibleToolBox,NULL);
200*cdf0e10cSrcweir }
201*cdf0e10cSrcweir // -----------------------------------------------------------------------------
202*cdf0e10cSrcweir VCLXAccessibleToolBox::~VCLXAccessibleToolBox()
203*cdf0e10cSrcweir {
204*cdf0e10cSrcweir     DBG_DTOR(VCLXAccessibleToolBox,NULL);
205*cdf0e10cSrcweir }
206*cdf0e10cSrcweir // -----------------------------------------------------------------------------
207*cdf0e10cSrcweir VCLXAccessibleToolBoxItem* VCLXAccessibleToolBox::GetItem_Impl( sal_Int32 _nPos, bool _bMustHaveFocus )
208*cdf0e10cSrcweir {
209*cdf0e10cSrcweir     VCLXAccessibleToolBoxItem* pItem = NULL;
210*cdf0e10cSrcweir     ToolBox* pToolBox = static_cast< ToolBox* >( GetWindow() );
211*cdf0e10cSrcweir     if ( pToolBox && ( !_bMustHaveFocus || pToolBox->HasFocus() ) )
212*cdf0e10cSrcweir     {
213*cdf0e10cSrcweir         ToolBoxItemsMap::iterator aIter = m_aAccessibleChildren.find( _nPos );
214*cdf0e10cSrcweir         // returns only toolbox buttons, not windows
215*cdf0e10cSrcweir         if ( aIter != m_aAccessibleChildren.end()  && !aIter->second.is())
216*cdf0e10cSrcweir             pItem = static_cast< VCLXAccessibleToolBoxItem* >( aIter->second.get() );
217*cdf0e10cSrcweir     }
218*cdf0e10cSrcweir 
219*cdf0e10cSrcweir     return pItem;
220*cdf0e10cSrcweir }
221*cdf0e10cSrcweir // -----------------------------------------------------------------------------
222*cdf0e10cSrcweir 
223*cdf0e10cSrcweir void VCLXAccessibleToolBox::UpdateFocus_Impl()
224*cdf0e10cSrcweir {
225*cdf0e10cSrcweir     ToolBox* pToolBox = static_cast< ToolBox* >( GetWindow() );
226*cdf0e10cSrcweir     if( !pToolBox )
227*cdf0e10cSrcweir         return;
228*cdf0e10cSrcweir 
229*cdf0e10cSrcweir     // submit events only if toolbox has the focus to avoid sending events due to mouse move
230*cdf0e10cSrcweir     sal_Bool bHasFocus = sal_False;
231*cdf0e10cSrcweir     if ( pToolBox->HasFocus() )
232*cdf0e10cSrcweir         bHasFocus = sal_True;
233*cdf0e10cSrcweir     else
234*cdf0e10cSrcweir     {
235*cdf0e10cSrcweir         // check for subtoolbar, i.e. check if our parent is a toolbar
236*cdf0e10cSrcweir         ToolBox* pToolBoxParent = dynamic_cast< ToolBox* >( pToolBox->GetParent() );
237*cdf0e10cSrcweir         // subtoolbars never get the focus as key input is just forwarded, so check if the parent toolbar has it
238*cdf0e10cSrcweir         if ( pToolBoxParent && pToolBoxParent->HasFocus() )
239*cdf0e10cSrcweir             bHasFocus = sal_True;
240*cdf0e10cSrcweir     }
241*cdf0e10cSrcweir 
242*cdf0e10cSrcweir     if ( bHasFocus )
243*cdf0e10cSrcweir     {
244*cdf0e10cSrcweir         sal_uInt16 nHighlightItemId = pToolBox->GetHighlightItemId();
245*cdf0e10cSrcweir         sal_uInt16 nFocusCount = 0;
246*cdf0e10cSrcweir         for ( ToolBoxItemsMap::iterator aIter = m_aAccessibleChildren.begin();
247*cdf0e10cSrcweir               aIter != m_aAccessibleChildren.end(); ++aIter )
248*cdf0e10cSrcweir         {
249*cdf0e10cSrcweir             sal_uInt16 nItemId = pToolBox->GetItemId( (sal_uInt16)aIter->first );
250*cdf0e10cSrcweir 
251*cdf0e10cSrcweir             if ( aIter->second.is() )
252*cdf0e10cSrcweir             {
253*cdf0e10cSrcweir                 VCLXAccessibleToolBoxItem* pItem =
254*cdf0e10cSrcweir                     static_cast< VCLXAccessibleToolBoxItem* >( aIter->second.get() );
255*cdf0e10cSrcweir                 if ( pItem->HasFocus() && nItemId != nHighlightItemId )
256*cdf0e10cSrcweir                 {
257*cdf0e10cSrcweir                     // reset the old focused item
258*cdf0e10cSrcweir                     pItem->SetFocus( sal_False );
259*cdf0e10cSrcweir                     nFocusCount++;
260*cdf0e10cSrcweir                 }
261*cdf0e10cSrcweir                 if ( nItemId == nHighlightItemId )
262*cdf0e10cSrcweir                 {
263*cdf0e10cSrcweir                     // set the new focused item
264*cdf0e10cSrcweir                     pItem->SetFocus( sal_True );
265*cdf0e10cSrcweir                     nFocusCount++;
266*cdf0e10cSrcweir                 }
267*cdf0e10cSrcweir             }
268*cdf0e10cSrcweir         // both items changed?
269*cdf0e10cSrcweir         if ( nFocusCount > 1 )
270*cdf0e10cSrcweir             break;
271*cdf0e10cSrcweir         }
272*cdf0e10cSrcweir     }
273*cdf0e10cSrcweir }
274*cdf0e10cSrcweir // -----------------------------------------------------------------------------
275*cdf0e10cSrcweir void VCLXAccessibleToolBox::ReleaseFocus_Impl( sal_Int32 _nPos )
276*cdf0e10cSrcweir {
277*cdf0e10cSrcweir     ToolBox* pToolBox = static_cast< ToolBox* >( GetWindow() );
278*cdf0e10cSrcweir     if ( pToolBox ) // #107124#, do not check for focus because this message is also handled in losefocus
279*cdf0e10cSrcweir     {
280*cdf0e10cSrcweir         ToolBoxItemsMap::iterator aIter = m_aAccessibleChildren.find( _nPos );
281*cdf0e10cSrcweir         if ( aIter != m_aAccessibleChildren.end() && aIter->second.is() )
282*cdf0e10cSrcweir         {
283*cdf0e10cSrcweir             VCLXAccessibleToolBoxItem* pItem =
284*cdf0e10cSrcweir                 static_cast< VCLXAccessibleToolBoxItem* >( aIter->second.get() );
285*cdf0e10cSrcweir             if ( pItem->HasFocus() )
286*cdf0e10cSrcweir                 pItem->SetFocus( sal_False );
287*cdf0e10cSrcweir         }
288*cdf0e10cSrcweir     }
289*cdf0e10cSrcweir }
290*cdf0e10cSrcweir // -----------------------------------------------------------------------------
291*cdf0e10cSrcweir void VCLXAccessibleToolBox::UpdateChecked_Impl( sal_Int32  )
292*cdf0e10cSrcweir {
293*cdf0e10cSrcweir     ToolBox* pToolBox = static_cast< ToolBox* >( GetWindow() );
294*cdf0e10cSrcweir     if ( pToolBox )
295*cdf0e10cSrcweir     {
296*cdf0e10cSrcweir         for ( ToolBoxItemsMap::iterator aIter = m_aAccessibleChildren.begin();
297*cdf0e10cSrcweir               aIter != m_aAccessibleChildren.end(); ++aIter )
298*cdf0e10cSrcweir         {
299*cdf0e10cSrcweir                 sal_uInt16 nItemId = pToolBox->GetItemId( (sal_uInt16)aIter->first );
300*cdf0e10cSrcweir 
301*cdf0e10cSrcweir                 VCLXAccessibleToolBoxItem* pItem =
302*cdf0e10cSrcweir                     static_cast< VCLXAccessibleToolBoxItem* >( aIter->second.get() );
303*cdf0e10cSrcweir                 pItem->SetChecked( pToolBox->IsItemChecked( nItemId ) );
304*cdf0e10cSrcweir         }
305*cdf0e10cSrcweir     }
306*cdf0e10cSrcweir }
307*cdf0e10cSrcweir // -----------------------------------------------------------------------------
308*cdf0e10cSrcweir void VCLXAccessibleToolBox::UpdateIndeterminate_Impl( sal_Int32 _nPos )
309*cdf0e10cSrcweir {
310*cdf0e10cSrcweir     ToolBox* pToolBox = static_cast< ToolBox* >( GetWindow() );
311*cdf0e10cSrcweir     if ( pToolBox )
312*cdf0e10cSrcweir     {
313*cdf0e10cSrcweir         sal_uInt16 nItemId = pToolBox->GetItemId( (sal_uInt16)_nPos );
314*cdf0e10cSrcweir 
315*cdf0e10cSrcweir         ToolBoxItemsMap::iterator aIter = m_aAccessibleChildren.find( _nPos );
316*cdf0e10cSrcweir         if ( aIter != m_aAccessibleChildren.end() && aIter->second.is() )
317*cdf0e10cSrcweir         {
318*cdf0e10cSrcweir             VCLXAccessibleToolBoxItem* pItem =
319*cdf0e10cSrcweir                 static_cast< VCLXAccessibleToolBoxItem* >( aIter->second.get() );
320*cdf0e10cSrcweir             if ( pItem )
321*cdf0e10cSrcweir                 pItem->SetIndeterminate( pToolBox->GetItemState( nItemId ) == STATE_DONTKNOW );
322*cdf0e10cSrcweir         }
323*cdf0e10cSrcweir     }
324*cdf0e10cSrcweir }
325*cdf0e10cSrcweir // -----------------------------------------------------------------------------
326*cdf0e10cSrcweir void VCLXAccessibleToolBox::implReleaseToolboxItem( ToolBoxItemsMap::iterator& _rMapPos,
327*cdf0e10cSrcweir         bool _bNotifyRemoval, bool _bDispose )
328*cdf0e10cSrcweir {
329*cdf0e10cSrcweir     Reference< XAccessible > xItemAcc( _rMapPos->second );
330*cdf0e10cSrcweir     if ( !xItemAcc.is() )
331*cdf0e10cSrcweir         return;
332*cdf0e10cSrcweir 
333*cdf0e10cSrcweir     if ( _bNotifyRemoval )
334*cdf0e10cSrcweir     {
335*cdf0e10cSrcweir         NotifyAccessibleEvent( AccessibleEventId::CHILD, makeAny( xItemAcc ), Any() );
336*cdf0e10cSrcweir     }
337*cdf0e10cSrcweir 
338*cdf0e10cSrcweir     OToolBoxWindowItem* pWindowItem = NULL;
339*cdf0e10cSrcweir     if ( !OToolBoxWindowItem::isWindowItem( xItemAcc, &pWindowItem ) )
340*cdf0e10cSrcweir     {
341*cdf0e10cSrcweir         static_cast< VCLXAccessibleToolBoxItem* >( xItemAcc.get() )->ReleaseToolBox();
342*cdf0e10cSrcweir         if ( _bDispose )
343*cdf0e10cSrcweir             ::comphelper::disposeComponent( xItemAcc );
344*cdf0e10cSrcweir     }
345*cdf0e10cSrcweir     else
346*cdf0e10cSrcweir     {
347*cdf0e10cSrcweir         if ( _bDispose )
348*cdf0e10cSrcweir         {
349*cdf0e10cSrcweir             if ( pWindowItem )
350*cdf0e10cSrcweir             {
351*cdf0e10cSrcweir                 Reference< XAccessibleContext > xContext( pWindowItem->getContextNoCreate() );
352*cdf0e10cSrcweir                 ::comphelper::disposeComponent( xContext );
353*cdf0e10cSrcweir             }
354*cdf0e10cSrcweir         }
355*cdf0e10cSrcweir     }
356*cdf0e10cSrcweir }
357*cdf0e10cSrcweir 
358*cdf0e10cSrcweir // -----------------------------------------------------------------------------
359*cdf0e10cSrcweir void VCLXAccessibleToolBox::UpdateItem_Impl( sal_Int32 _nPos, sal_Bool _bItemAdded )
360*cdf0e10cSrcweir {
361*cdf0e10cSrcweir     if ( _nPos < sal_Int32( m_aAccessibleChildren.size() ) )
362*cdf0e10cSrcweir     {
363*cdf0e10cSrcweir         UpdateAllItems_Impl();
364*cdf0e10cSrcweir         return;
365*cdf0e10cSrcweir     }
366*cdf0e10cSrcweir 
367*cdf0e10cSrcweir     ToolBox* pToolBox = static_cast< ToolBox* >( GetWindow() );
368*cdf0e10cSrcweir     if ( pToolBox )
369*cdf0e10cSrcweir     {
370*cdf0e10cSrcweir         if ( !_bItemAdded )
371*cdf0e10cSrcweir         {   // the item was removed
372*cdf0e10cSrcweir             // -> destroy the old item
373*cdf0e10cSrcweir             ToolBoxItemsMap::iterator aItemPos = m_aAccessibleChildren.find( _nPos );
374*cdf0e10cSrcweir             if ( m_aAccessibleChildren.end() != aItemPos )
375*cdf0e10cSrcweir             {
376*cdf0e10cSrcweir                 implReleaseToolboxItem( aItemPos, true, true );
377*cdf0e10cSrcweir                 m_aAccessibleChildren.erase( aItemPos );
378*cdf0e10cSrcweir             }
379*cdf0e10cSrcweir         }
380*cdf0e10cSrcweir 
381*cdf0e10cSrcweir         // adjust the "index-in-parent"s
382*cdf0e10cSrcweir         ToolBoxItemsMap::iterator aIndexAdjust = m_aAccessibleChildren.upper_bound( _nPos );
383*cdf0e10cSrcweir         while ( m_aAccessibleChildren.end() != aIndexAdjust )
384*cdf0e10cSrcweir         {
385*cdf0e10cSrcweir             Reference< XAccessible > xItemAcc( aIndexAdjust->second );
386*cdf0e10cSrcweir 
387*cdf0e10cSrcweir             OToolBoxWindowItem* pWindowItem = NULL;
388*cdf0e10cSrcweir             if ( !OToolBoxWindowItem::isWindowItem( xItemAcc, &pWindowItem ) )
389*cdf0e10cSrcweir             {
390*cdf0e10cSrcweir                 VCLXAccessibleToolBoxItem* pItem = static_cast< VCLXAccessibleToolBoxItem* >( xItemAcc.get() );
391*cdf0e10cSrcweir                 if ( pItem )
392*cdf0e10cSrcweir                 {
393*cdf0e10cSrcweir                     sal_Int32 nIndex = pItem->getIndexInParent( );
394*cdf0e10cSrcweir                     nIndex += _bItemAdded ? +1 : -1;
395*cdf0e10cSrcweir                     pItem->setIndexInParent( nIndex );
396*cdf0e10cSrcweir                 }
397*cdf0e10cSrcweir             }
398*cdf0e10cSrcweir             else
399*cdf0e10cSrcweir             {
400*cdf0e10cSrcweir                 if ( pWindowItem )
401*cdf0e10cSrcweir                 {
402*cdf0e10cSrcweir                     sal_Int32 nIndex = pWindowItem->getIndexInParent( );
403*cdf0e10cSrcweir                     nIndex += _bItemAdded ? +1 : -1;
404*cdf0e10cSrcweir                     pWindowItem->setIndexInParent( nIndex );
405*cdf0e10cSrcweir                 }
406*cdf0e10cSrcweir             }
407*cdf0e10cSrcweir 
408*cdf0e10cSrcweir             ++aIndexAdjust;
409*cdf0e10cSrcweir         }
410*cdf0e10cSrcweir 
411*cdf0e10cSrcweir         if ( _bItemAdded )
412*cdf0e10cSrcweir         {
413*cdf0e10cSrcweir             // TODO: we should make this dependent on the existence of event listeners
414*cdf0e10cSrcweir             // with the current implementation, we always create accessible object
415*cdf0e10cSrcweir             Any aNewChild = makeAny( getAccessibleChild( (sal_Int32)_nPos ) );
416*cdf0e10cSrcweir             NotifyAccessibleEvent( AccessibleEventId::CHILD, Any(), aNewChild );
417*cdf0e10cSrcweir         }
418*cdf0e10cSrcweir     }
419*cdf0e10cSrcweir }
420*cdf0e10cSrcweir // -----------------------------------------------------------------------------
421*cdf0e10cSrcweir void VCLXAccessibleToolBox::UpdateAllItems_Impl()
422*cdf0e10cSrcweir {
423*cdf0e10cSrcweir     ToolBox* pToolBox = static_cast< ToolBox* >( GetWindow() );
424*cdf0e10cSrcweir     if ( pToolBox )
425*cdf0e10cSrcweir     {
426*cdf0e10cSrcweir         // deregister the old items
427*cdf0e10cSrcweir         for ( ToolBoxItemsMap::iterator aIter = m_aAccessibleChildren.begin();
428*cdf0e10cSrcweir               aIter != m_aAccessibleChildren.end(); ++aIter )
429*cdf0e10cSrcweir         {
430*cdf0e10cSrcweir             implReleaseToolboxItem( aIter, true, true );
431*cdf0e10cSrcweir         }
432*cdf0e10cSrcweir         m_aAccessibleChildren.clear();
433*cdf0e10cSrcweir 
434*cdf0e10cSrcweir         // register the new items
435*cdf0e10cSrcweir         sal_uInt16 i, nCount = pToolBox->GetItemCount();
436*cdf0e10cSrcweir         for ( i = 0; i < nCount; ++i )
437*cdf0e10cSrcweir         {
438*cdf0e10cSrcweir             Any aNewValue;
439*cdf0e10cSrcweir             aNewValue <<= getAccessibleChild( (sal_Int32)i );;
440*cdf0e10cSrcweir             NotifyAccessibleEvent( AccessibleEventId::CHILD, Any(), aNewValue );
441*cdf0e10cSrcweir         }
442*cdf0e10cSrcweir     }
443*cdf0e10cSrcweir }
444*cdf0e10cSrcweir 
445*cdf0e10cSrcweir // -----------------------------------------------------------------------------
446*cdf0e10cSrcweir 
447*cdf0e10cSrcweir void VCLXAccessibleToolBox::UpdateCustomPopupItemp_Impl( Window* pWindow, bool bOpen )
448*cdf0e10cSrcweir {
449*cdf0e10cSrcweir     ToolBox* pToolBox = static_cast< ToolBox* >( GetWindow() );
450*cdf0e10cSrcweir     if( pWindow && pToolBox )
451*cdf0e10cSrcweir     {
452*cdf0e10cSrcweir         Reference< XAccessible > xChild( pWindow->GetAccessible() );
453*cdf0e10cSrcweir         if( xChild.is() )
454*cdf0e10cSrcweir         {
455*cdf0e10cSrcweir             Reference< XAccessible > xChildItem( getAccessibleChild( static_cast< sal_Int32 >( pToolBox->GetItemPos( pToolBox->GetDownItemId() ) ) ) );
456*cdf0e10cSrcweir             VCLXAccessibleToolBoxItem* pItem = static_cast< VCLXAccessibleToolBoxItem* >( xChildItem.get() );
457*cdf0e10cSrcweir 
458*cdf0e10cSrcweir             pItem->SetChild( xChild );
459*cdf0e10cSrcweir             pItem->NotifyChildEvent( xChild, bOpen );
460*cdf0e10cSrcweir         }
461*cdf0e10cSrcweir     }
462*cdf0e10cSrcweir }
463*cdf0e10cSrcweir 
464*cdf0e10cSrcweir // -----------------------------------------------------------------------------
465*cdf0e10cSrcweir void VCLXAccessibleToolBox::UpdateItemName_Impl( sal_Int32 _nPos )
466*cdf0e10cSrcweir {
467*cdf0e10cSrcweir     VCLXAccessibleToolBoxItem* pItem = GetItem_Impl( _nPos, false );
468*cdf0e10cSrcweir     if ( pItem )
469*cdf0e10cSrcweir         pItem->NameChanged();
470*cdf0e10cSrcweir }
471*cdf0e10cSrcweir // -----------------------------------------------------------------------------
472*cdf0e10cSrcweir void VCLXAccessibleToolBox::UpdateItemEnabled_Impl( sal_Int32 _nPos )
473*cdf0e10cSrcweir {
474*cdf0e10cSrcweir     VCLXAccessibleToolBoxItem* pItem = GetItem_Impl( _nPos, false );
475*cdf0e10cSrcweir     if ( pItem )
476*cdf0e10cSrcweir         pItem->ToggleEnableState();
477*cdf0e10cSrcweir }
478*cdf0e10cSrcweir // -----------------------------------------------------------------------------
479*cdf0e10cSrcweir void VCLXAccessibleToolBox::HandleSubToolBarEvent( const VclWindowEvent& rVclWindowEvent, bool _bShow )
480*cdf0e10cSrcweir {
481*cdf0e10cSrcweir     Window* pChildWindow = (Window *) rVclWindowEvent.GetData();
482*cdf0e10cSrcweir     ToolBox* pToolBox = static_cast< ToolBox* >( GetWindow() );
483*cdf0e10cSrcweir     if ( pChildWindow
484*cdf0e10cSrcweir         && pToolBox
485*cdf0e10cSrcweir         && pToolBox == pChildWindow->GetParent()
486*cdf0e10cSrcweir         && pChildWindow->GetType() == WINDOW_TOOLBOX )
487*cdf0e10cSrcweir     {
488*cdf0e10cSrcweir         sal_Int32 nIndex = pToolBox->GetItemPos( pToolBox->GetCurItemId() );
489*cdf0e10cSrcweir         Reference< XAccessible > xItem = getAccessibleChild( nIndex );
490*cdf0e10cSrcweir         if ( xItem.is() )
491*cdf0e10cSrcweir         {
492*cdf0e10cSrcweir             Reference< XAccessible > xChild = pChildWindow->GetAccessible();
493*cdf0e10cSrcweir             VCLXAccessibleToolBoxItem* pItem =
494*cdf0e10cSrcweir                 static_cast< VCLXAccessibleToolBoxItem* >( xItem.get() );
495*cdf0e10cSrcweir             pItem->SetChild( xChild );
496*cdf0e10cSrcweir             pItem->NotifyChildEvent( xChild, _bShow );
497*cdf0e10cSrcweir         }
498*cdf0e10cSrcweir     }
499*cdf0e10cSrcweir }
500*cdf0e10cSrcweir // -----------------------------------------------------------------------------
501*cdf0e10cSrcweir void VCLXAccessibleToolBox::ReleaseSubToolBox( ToolBox* _pSubToolBox )
502*cdf0e10cSrcweir {
503*cdf0e10cSrcweir     ToolBox* pToolBox = static_cast< ToolBox* >( GetWindow() );
504*cdf0e10cSrcweir     if ( pToolBox )
505*cdf0e10cSrcweir     {
506*cdf0e10cSrcweir         sal_Int32 nIndex = pToolBox->GetItemPos( pToolBox->GetCurItemId() );
507*cdf0e10cSrcweir         Reference< XAccessible > xItem = getAccessibleChild( nIndex );
508*cdf0e10cSrcweir         if ( xItem.is() )
509*cdf0e10cSrcweir         {
510*cdf0e10cSrcweir             Reference< XAccessible > xChild = _pSubToolBox->GetAccessible();
511*cdf0e10cSrcweir             VCLXAccessibleToolBoxItem* pItem =
512*cdf0e10cSrcweir                 static_cast< VCLXAccessibleToolBoxItem* >( xItem.get() );
513*cdf0e10cSrcweir             if ( pItem->GetChild() == xChild )
514*cdf0e10cSrcweir             {
515*cdf0e10cSrcweir                 pItem->SetChild( Reference< XAccessible >() );
516*cdf0e10cSrcweir                 pItem->NotifyChildEvent( xChild, false );
517*cdf0e10cSrcweir             }
518*cdf0e10cSrcweir         }
519*cdf0e10cSrcweir     }
520*cdf0e10cSrcweir }
521*cdf0e10cSrcweir // -----------------------------------------------------------------------------
522*cdf0e10cSrcweir void VCLXAccessibleToolBox::FillAccessibleStateSet( utl::AccessibleStateSetHelper& rStateSet )
523*cdf0e10cSrcweir {
524*cdf0e10cSrcweir     VCLXAccessibleComponent::FillAccessibleStateSet( rStateSet );
525*cdf0e10cSrcweir 
526*cdf0e10cSrcweir     ToolBox* pToolBox = static_cast< ToolBox* >( GetWindow() );
527*cdf0e10cSrcweir     if ( pToolBox )
528*cdf0e10cSrcweir     {
529*cdf0e10cSrcweir         rStateSet.AddState( AccessibleStateType::FOCUSABLE );
530*cdf0e10cSrcweir         if ( pToolBox->IsHorizontal() )
531*cdf0e10cSrcweir             rStateSet.AddState( AccessibleStateType::HORIZONTAL );
532*cdf0e10cSrcweir         else
533*cdf0e10cSrcweir             rStateSet.AddState( AccessibleStateType::VERTICAL );
534*cdf0e10cSrcweir     }
535*cdf0e10cSrcweir }
536*cdf0e10cSrcweir // -----------------------------------------------------------------------------
537*cdf0e10cSrcweir void VCLXAccessibleToolBox::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent )
538*cdf0e10cSrcweir {
539*cdf0e10cSrcweir     // to prevent an early release of the toolbox (VCLEVENT_OBJECT_DYING)
540*cdf0e10cSrcweir     Reference< XAccessibleContext > xTemp = this;
541*cdf0e10cSrcweir 
542*cdf0e10cSrcweir     switch ( rVclWindowEvent.GetId() )
543*cdf0e10cSrcweir     {
544*cdf0e10cSrcweir         case VCLEVENT_TOOLBOX_CLICK:
545*cdf0e10cSrcweir         {
546*cdf0e10cSrcweir             if ( rVclWindowEvent.GetData() )
547*cdf0e10cSrcweir             {
548*cdf0e10cSrcweir                 UpdateChecked_Impl( (sal_Int32)(sal_IntPtr)rVclWindowEvent.GetData() );
549*cdf0e10cSrcweir                 UpdateIndeterminate_Impl( (sal_Int32)(sal_IntPtr)rVclWindowEvent.GetData() );
550*cdf0e10cSrcweir             }
551*cdf0e10cSrcweir             break;
552*cdf0e10cSrcweir         }
553*cdf0e10cSrcweir         case VCLEVENT_TOOLBOX_DOUBLECLICK:
554*cdf0e10cSrcweir         case VCLEVENT_TOOLBOX_ACTIVATE:
555*cdf0e10cSrcweir         case VCLEVENT_TOOLBOX_DEACTIVATE:
556*cdf0e10cSrcweir         case VCLEVENT_TOOLBOX_SELECT:
557*cdf0e10cSrcweir             break;
558*cdf0e10cSrcweir 
559*cdf0e10cSrcweir         case VCLEVENT_TOOLBOX_HIGHLIGHT:
560*cdf0e10cSrcweir             UpdateFocus_Impl();
561*cdf0e10cSrcweir             break;
562*cdf0e10cSrcweir 
563*cdf0e10cSrcweir         case VCLEVENT_TOOLBOX_HIGHLIGHTOFF:
564*cdf0e10cSrcweir             ReleaseFocus_Impl( (sal_Int32)(sal_IntPtr)rVclWindowEvent.GetData() );
565*cdf0e10cSrcweir             break;
566*cdf0e10cSrcweir 
567*cdf0e10cSrcweir         case VCLEVENT_TOOLBOX_ITEMADDED :
568*cdf0e10cSrcweir //            UpdateItem_Impl( (sal_Int32)(sal_IntPtr)rVclWindowEvent.GetData(), VCLEVENT_TOOLBOX_ITEMADDED == rVclWindowEvent.GetId() );
569*cdf0e10cSrcweir             UpdateItem_Impl( (sal_Int32)(sal_IntPtr)rVclWindowEvent.GetData(), sal_True );
570*cdf0e10cSrcweir             break;
571*cdf0e10cSrcweir 
572*cdf0e10cSrcweir         case VCLEVENT_TOOLBOX_ITEMREMOVED :
573*cdf0e10cSrcweir         case VCLEVENT_TOOLBOX_ALLITEMSCHANGED :
574*cdf0e10cSrcweir         {
575*cdf0e10cSrcweir             UpdateAllItems_Impl();
576*cdf0e10cSrcweir             break;
577*cdf0e10cSrcweir         }
578*cdf0e10cSrcweir 
579*cdf0e10cSrcweir         case VCLEVENT_TOOLBOX_ITEMWINDOWCHANGED:
580*cdf0e10cSrcweir         {
581*cdf0e10cSrcweir             sal_Int32 nPos = (sal_Int32)(sal_IntPtr)rVclWindowEvent.GetData();
582*cdf0e10cSrcweir             ToolBoxItemsMap::iterator aAccessiblePos( m_aAccessibleChildren.find( nPos ) );
583*cdf0e10cSrcweir             if ( m_aAccessibleChildren.end() != aAccessiblePos )
584*cdf0e10cSrcweir             {
585*cdf0e10cSrcweir                 implReleaseToolboxItem( aAccessiblePos, false, true );
586*cdf0e10cSrcweir                 m_aAccessibleChildren.erase (aAccessiblePos);
587*cdf0e10cSrcweir             }
588*cdf0e10cSrcweir 
589*cdf0e10cSrcweir             Any aNewValue;
590*cdf0e10cSrcweir             aNewValue <<= getAccessibleChild(nPos);
591*cdf0e10cSrcweir             NotifyAccessibleEvent( AccessibleEventId::CHILD, Any(), aNewValue );
592*cdf0e10cSrcweir             break;
593*cdf0e10cSrcweir         }
594*cdf0e10cSrcweir         case VCLEVENT_TOOLBOX_ITEMTEXTCHANGED :
595*cdf0e10cSrcweir             UpdateItemName_Impl( (sal_Int32)(sal_IntPtr)rVclWindowEvent.GetData() );
596*cdf0e10cSrcweir             break;
597*cdf0e10cSrcweir 
598*cdf0e10cSrcweir         case VCLEVENT_TOOLBOX_ITEMENABLED :
599*cdf0e10cSrcweir         case VCLEVENT_TOOLBOX_ITEMDISABLED :
600*cdf0e10cSrcweir         {
601*cdf0e10cSrcweir             UpdateItemEnabled_Impl( (sal_Int32)(sal_IntPtr)rVclWindowEvent.GetData() );
602*cdf0e10cSrcweir             break;
603*cdf0e10cSrcweir         }
604*cdf0e10cSrcweir 
605*cdf0e10cSrcweir         case VCLEVENT_DROPDOWN_OPEN:
606*cdf0e10cSrcweir         case VCLEVENT_DROPDOWN_CLOSE:
607*cdf0e10cSrcweir         {
608*cdf0e10cSrcweir             UpdateCustomPopupItemp_Impl( static_cast< Window* >( rVclWindowEvent.GetData() ), rVclWindowEvent.GetId() == VCLEVENT_DROPDOWN_OPEN );
609*cdf0e10cSrcweir             break;
610*cdf0e10cSrcweir         }
611*cdf0e10cSrcweir 
612*cdf0e10cSrcweir         case VCLEVENT_OBJECT_DYING :
613*cdf0e10cSrcweir         {
614*cdf0e10cSrcweir             // if this toolbox is a subtoolbox, we have to relese it from its parent
615*cdf0e10cSrcweir             ToolBox* pToolBox = static_cast< ToolBox* >( GetWindow() );
616*cdf0e10cSrcweir             if ( pToolBox && pToolBox->GetParent() &&
617*cdf0e10cSrcweir                  pToolBox->GetParent()->GetType() == WINDOW_TOOLBOX )
618*cdf0e10cSrcweir             {
619*cdf0e10cSrcweir                 VCLXAccessibleToolBox* pParent = static_cast< VCLXAccessibleToolBox* >(
620*cdf0e10cSrcweir                     pToolBox->GetParent()->GetAccessible()->getAccessibleContext().get() );
621*cdf0e10cSrcweir                 if ( pParent )
622*cdf0e10cSrcweir                     pParent->ReleaseSubToolBox( pToolBox );
623*cdf0e10cSrcweir             }
624*cdf0e10cSrcweir 
625*cdf0e10cSrcweir             // dispose all items
626*cdf0e10cSrcweir             for ( ToolBoxItemsMap::iterator aIter = m_aAccessibleChildren.begin();
627*cdf0e10cSrcweir                   aIter != m_aAccessibleChildren.end(); ++aIter )
628*cdf0e10cSrcweir             {
629*cdf0e10cSrcweir                 implReleaseToolboxItem( aIter, false, true );
630*cdf0e10cSrcweir             }
631*cdf0e10cSrcweir             m_aAccessibleChildren.clear();
632*cdf0e10cSrcweir 
633*cdf0e10cSrcweir             //!!! no break to call base class
634*cdf0e10cSrcweir         }
635*cdf0e10cSrcweir 
636*cdf0e10cSrcweir         default:
637*cdf0e10cSrcweir             VCLXAccessibleComponent::ProcessWindowEvent( rVclWindowEvent );
638*cdf0e10cSrcweir     }
639*cdf0e10cSrcweir }
640*cdf0e10cSrcweir // -----------------------------------------------------------------------------
641*cdf0e10cSrcweir void VCLXAccessibleToolBox::ProcessWindowChildEvent( const VclWindowEvent& rVclWindowEvent )
642*cdf0e10cSrcweir {
643*cdf0e10cSrcweir     switch ( rVclWindowEvent.GetId() )
644*cdf0e10cSrcweir     {
645*cdf0e10cSrcweir         case VCLEVENT_WINDOW_SHOW:  // send create on show for direct accessible children
646*cdf0e10cSrcweir         {
647*cdf0e10cSrcweir             Reference< XAccessible > xReturn = GetItemWindowAccessible(rVclWindowEvent);
648*cdf0e10cSrcweir             if ( xReturn.is() )
649*cdf0e10cSrcweir                 NotifyAccessibleEvent( AccessibleEventId::CHILD, Any(), makeAny(xReturn) );
650*cdf0e10cSrcweir             else
651*cdf0e10cSrcweir                 HandleSubToolBarEvent( rVclWindowEvent, true );
652*cdf0e10cSrcweir         }
653*cdf0e10cSrcweir         break;
654*cdf0e10cSrcweir 
655*cdf0e10cSrcweir         default:
656*cdf0e10cSrcweir            VCLXAccessibleComponent::ProcessWindowChildEvent( rVclWindowEvent );
657*cdf0e10cSrcweir 
658*cdf0e10cSrcweir     }
659*cdf0e10cSrcweir }
660*cdf0e10cSrcweir // -----------------------------------------------------------------------------
661*cdf0e10cSrcweir // XInterface
662*cdf0e10cSrcweir // -----------------------------------------------------------------------------
663*cdf0e10cSrcweir IMPLEMENT_FORWARD_XINTERFACE2( VCLXAccessibleToolBox, VCLXAccessibleComponent, VCLXAccessibleToolBox_BASE )
664*cdf0e10cSrcweir // -----------------------------------------------------------------------------
665*cdf0e10cSrcweir // XTypeProvider
666*cdf0e10cSrcweir // -----------------------------------------------------------------------------
667*cdf0e10cSrcweir IMPLEMENT_FORWARD_XTYPEPROVIDER2( VCLXAccessibleToolBox, VCLXAccessibleComponent, VCLXAccessibleToolBox_BASE )
668*cdf0e10cSrcweir // -----------------------------------------------------------------------------
669*cdf0e10cSrcweir // XComponent
670*cdf0e10cSrcweir // -----------------------------------------------------------------------------
671*cdf0e10cSrcweir void SAL_CALL VCLXAccessibleToolBox::disposing()
672*cdf0e10cSrcweir {
673*cdf0e10cSrcweir     VCLXAccessibleComponent::disposing();
674*cdf0e10cSrcweir 
675*cdf0e10cSrcweir     // release the items
676*cdf0e10cSrcweir     for ( ToolBoxItemsMap::iterator aIter = m_aAccessibleChildren.begin();
677*cdf0e10cSrcweir           aIter != m_aAccessibleChildren.end(); ++aIter )
678*cdf0e10cSrcweir     {
679*cdf0e10cSrcweir         implReleaseToolboxItem( aIter, false, true );
680*cdf0e10cSrcweir     }
681*cdf0e10cSrcweir     m_aAccessibleChildren.clear();
682*cdf0e10cSrcweir }
683*cdf0e10cSrcweir // -----------------------------------------------------------------------------
684*cdf0e10cSrcweir // XServiceInfo
685*cdf0e10cSrcweir // -----------------------------------------------------------------------------
686*cdf0e10cSrcweir ::rtl::OUString VCLXAccessibleToolBox::getImplementationName() throw (RuntimeException)
687*cdf0e10cSrcweir {
688*cdf0e10cSrcweir     return ::rtl::OUString::createFromAscii( "com.sun.star.comp.toolkit.AccessibleToolBox" );
689*cdf0e10cSrcweir }
690*cdf0e10cSrcweir // -----------------------------------------------------------------------------
691*cdf0e10cSrcweir Sequence< ::rtl::OUString > VCLXAccessibleToolBox::getSupportedServiceNames() throw (RuntimeException)
692*cdf0e10cSrcweir {
693*cdf0e10cSrcweir     Sequence< ::rtl::OUString > aNames = VCLXAccessibleComponent::getSupportedServiceNames();
694*cdf0e10cSrcweir     sal_Int32 nLength = aNames.getLength();
695*cdf0e10cSrcweir     aNames.realloc( nLength + 1 );
696*cdf0e10cSrcweir     aNames[nLength] = ::rtl::OUString::createFromAscii( "com.sun.star.accessibility.AccessibleToolBox" );
697*cdf0e10cSrcweir     return aNames;
698*cdf0e10cSrcweir }
699*cdf0e10cSrcweir // -----------------------------------------------------------------------------
700*cdf0e10cSrcweir // XAccessibleContext
701*cdf0e10cSrcweir // -----------------------------------------------------------------------------
702*cdf0e10cSrcweir sal_Int32 SAL_CALL VCLXAccessibleToolBox::getAccessibleChildCount(  ) throw (RuntimeException)
703*cdf0e10cSrcweir {
704*cdf0e10cSrcweir     comphelper::OExternalLockGuard aGuard( this );
705*cdf0e10cSrcweir 
706*cdf0e10cSrcweir     sal_Int32 nCount = 0;
707*cdf0e10cSrcweir     ToolBox* pToolBox = static_cast< ToolBox* >( GetWindow() );
708*cdf0e10cSrcweir     if ( pToolBox )
709*cdf0e10cSrcweir         nCount = pToolBox->GetItemCount();
710*cdf0e10cSrcweir 
711*cdf0e10cSrcweir     return nCount;
712*cdf0e10cSrcweir }
713*cdf0e10cSrcweir // -----------------------------------------------------------------------------
714*cdf0e10cSrcweir Reference< XAccessible > SAL_CALL VCLXAccessibleToolBox::getAccessibleChild( sal_Int32 i ) throw (IndexOutOfBoundsException, RuntimeException)
715*cdf0e10cSrcweir {
716*cdf0e10cSrcweir     if ( i < 0 || i >= getAccessibleChildCount() )
717*cdf0e10cSrcweir         throw IndexOutOfBoundsException();
718*cdf0e10cSrcweir 
719*cdf0e10cSrcweir     comphelper::OExternalLockGuard aGuard( this );
720*cdf0e10cSrcweir 
721*cdf0e10cSrcweir     ToolBox* pToolBox = static_cast< ToolBox* >( GetWindow() );
722*cdf0e10cSrcweir     if ( pToolBox )
723*cdf0e10cSrcweir     {
724*cdf0e10cSrcweir         Reference< XAccessible > xChild;
725*cdf0e10cSrcweir         // search for the child
726*cdf0e10cSrcweir         ToolBoxItemsMap::iterator aIter = m_aAccessibleChildren.find(i);
727*cdf0e10cSrcweir         if ( m_aAccessibleChildren.end() == aIter )
728*cdf0e10cSrcweir         {
729*cdf0e10cSrcweir             sal_uInt16 nItemId = pToolBox->GetItemId( (sal_uInt16)i );
730*cdf0e10cSrcweir             sal_uInt16 nHighlightItemId = pToolBox->GetHighlightItemId();
731*cdf0e10cSrcweir             Window* pItemWindow = pToolBox->GetItemWindow( nItemId );
732*cdf0e10cSrcweir             // not found -> create a new child
733*cdf0e10cSrcweir             VCLXAccessibleToolBoxItem* pChild = new VCLXAccessibleToolBoxItem( pToolBox, i );
734*cdf0e10cSrcweir             Reference< XAccessible> xParent = pChild;
735*cdf0e10cSrcweir             if ( pItemWindow )
736*cdf0e10cSrcweir             {
737*cdf0e10cSrcweir                 xChild = new OToolBoxWindowItem(0,::comphelper::getProcessServiceFactory(),pItemWindow->GetAccessible(),xParent);
738*cdf0e10cSrcweir                 pItemWindow->SetAccessible(xChild);
739*cdf0e10cSrcweir                 pChild->SetChild( xChild );
740*cdf0e10cSrcweir             }
741*cdf0e10cSrcweir             xChild = pChild;
742*cdf0e10cSrcweir             if ( nHighlightItemId > 0 && nItemId == nHighlightItemId )
743*cdf0e10cSrcweir                 pChild->SetFocus( sal_True );
744*cdf0e10cSrcweir             if ( pToolBox->IsItemChecked( nItemId ) )
745*cdf0e10cSrcweir                 pChild->SetChecked( sal_True );
746*cdf0e10cSrcweir             if ( pToolBox->GetItemState( nItemId ) == STATE_DONTKNOW )
747*cdf0e10cSrcweir                 pChild->SetIndeterminate( true );
748*cdf0e10cSrcweir             m_aAccessibleChildren.insert( ToolBoxItemsMap::value_type( i, xChild ) );
749*cdf0e10cSrcweir         }
750*cdf0e10cSrcweir         else
751*cdf0e10cSrcweir         {
752*cdf0e10cSrcweir             // found it
753*cdf0e10cSrcweir             xChild = aIter->second;
754*cdf0e10cSrcweir         }
755*cdf0e10cSrcweir         return xChild;
756*cdf0e10cSrcweir     }
757*cdf0e10cSrcweir 
758*cdf0e10cSrcweir     return NULL;
759*cdf0e10cSrcweir }
760*cdf0e10cSrcweir // -----------------------------------------------------------------------------
761*cdf0e10cSrcweir Reference< XAccessible > SAL_CALL VCLXAccessibleToolBox::getAccessibleAtPoint( const awt::Point& _rPoint ) throw (RuntimeException)
762*cdf0e10cSrcweir {
763*cdf0e10cSrcweir     comphelper::OExternalLockGuard aGuard( this );
764*cdf0e10cSrcweir 
765*cdf0e10cSrcweir     Reference< XAccessible > xAccessible;
766*cdf0e10cSrcweir     ToolBox* pToolBox = static_cast< ToolBox* >( GetWindow() );
767*cdf0e10cSrcweir     if ( pToolBox )
768*cdf0e10cSrcweir     {
769*cdf0e10cSrcweir         sal_uInt16 nItemPos = pToolBox->GetItemPos( VCLPoint( _rPoint ) );
770*cdf0e10cSrcweir         if ( nItemPos != TOOLBOX_ITEM_NOTFOUND )
771*cdf0e10cSrcweir             xAccessible = getAccessibleChild( nItemPos );
772*cdf0e10cSrcweir     }
773*cdf0e10cSrcweir 
774*cdf0e10cSrcweir     return xAccessible;
775*cdf0e10cSrcweir }
776*cdf0e10cSrcweir // -----------------------------------------------------------------------------
777*cdf0e10cSrcweir Reference< XAccessible > VCLXAccessibleToolBox::GetItemWindowAccessible( const VclWindowEvent& rVclWindowEvent )
778*cdf0e10cSrcweir {
779*cdf0e10cSrcweir     Reference< XAccessible > xReturn;
780*cdf0e10cSrcweir     Window* pChildWindow = (Window *) rVclWindowEvent.GetData();
781*cdf0e10cSrcweir     ToolBox* pToolBox = static_cast< ToolBox* >( GetWindow() );
782*cdf0e10cSrcweir     if ( pChildWindow && pToolBox )
783*cdf0e10cSrcweir     {
784*cdf0e10cSrcweir         sal_uInt16 nCount = pToolBox->GetItemCount();
785*cdf0e10cSrcweir         for (sal_uInt16 i = 0 ; i < nCount && !xReturn.is() ; ++i)
786*cdf0e10cSrcweir         {
787*cdf0e10cSrcweir             sal_uInt16 nItemId = pToolBox->GetItemId( i );
788*cdf0e10cSrcweir             Window* pItemWindow = pToolBox->GetItemWindow( nItemId );
789*cdf0e10cSrcweir             if ( pItemWindow == pChildWindow )
790*cdf0e10cSrcweir                 xReturn = getAccessibleChild(i);
791*cdf0e10cSrcweir         }
792*cdf0e10cSrcweir     }
793*cdf0e10cSrcweir     return xReturn;
794*cdf0e10cSrcweir }
795*cdf0e10cSrcweir // -----------------------------------------------------------------------------
796*cdf0e10cSrcweir Reference< XAccessible > VCLXAccessibleToolBox::GetChildAccessible( const VclWindowEvent& rVclWindowEvent )
797*cdf0e10cSrcweir {
798*cdf0e10cSrcweir     Reference< XAccessible > xReturn = GetItemWindowAccessible(rVclWindowEvent);
799*cdf0e10cSrcweir 
800*cdf0e10cSrcweir     if ( !xReturn.is() )
801*cdf0e10cSrcweir         xReturn = VCLXAccessibleComponent::GetChildAccessible(rVclWindowEvent);
802*cdf0e10cSrcweir     return xReturn;
803*cdf0e10cSrcweir }
804*cdf0e10cSrcweir // -----------------------------------------------------------------------------
805*cdf0e10cSrcweir // XAccessibleSelection
806*cdf0e10cSrcweir // -----------------------------------------------------------------------------
807*cdf0e10cSrcweir void VCLXAccessibleToolBox::selectAccessibleChild( sal_Int32 nChildIndex ) throw (IndexOutOfBoundsException, RuntimeException)
808*cdf0e10cSrcweir {
809*cdf0e10cSrcweir     OExternalLockGuard aGuard( this );
810*cdf0e10cSrcweir     if ( nChildIndex < 0 || nChildIndex >= getAccessibleChildCount() )
811*cdf0e10cSrcweir         throw IndexOutOfBoundsException();
812*cdf0e10cSrcweir     ToolBox * pToolBox = static_cast < ToolBox * > ( GetWindow() );
813*cdf0e10cSrcweir     sal_uInt16 nPos = static_cast < sal_uInt16 > (nChildIndex);
814*cdf0e10cSrcweir     pToolBox->ChangeHighlight( nPos );
815*cdf0e10cSrcweir }
816*cdf0e10cSrcweir // -----------------------------------------------------------------------------
817*cdf0e10cSrcweir sal_Bool VCLXAccessibleToolBox::isAccessibleChildSelected( sal_Int32 nChildIndex ) throw (IndexOutOfBoundsException, RuntimeException)
818*cdf0e10cSrcweir {
819*cdf0e10cSrcweir     OExternalLockGuard aGuard( this );
820*cdf0e10cSrcweir     if ( nChildIndex < 0 || nChildIndex >= getAccessibleChildCount() )
821*cdf0e10cSrcweir         throw IndexOutOfBoundsException();
822*cdf0e10cSrcweir     ToolBox * pToolBox = static_cast < ToolBox * > ( GetWindow() );
823*cdf0e10cSrcweir     sal_uInt16 nPos = static_cast < sal_uInt16 > (nChildIndex);
824*cdf0e10cSrcweir     if ( pToolBox != NULL && pToolBox->GetHighlightItemId() == pToolBox->GetItemId( nPos ) )
825*cdf0e10cSrcweir         return sal_True;
826*cdf0e10cSrcweir     else
827*cdf0e10cSrcweir         return sal_False;
828*cdf0e10cSrcweir }
829*cdf0e10cSrcweir // -----------------------------------------------------------------------------
830*cdf0e10cSrcweir void VCLXAccessibleToolBox::clearAccessibleSelection(  ) throw (RuntimeException)
831*cdf0e10cSrcweir {
832*cdf0e10cSrcweir     OExternalLockGuard aGuard( this );
833*cdf0e10cSrcweir     ToolBox * pToolBox = static_cast < ToolBox * > ( GetWindow() );
834*cdf0e10cSrcweir     pToolBox -> LoseFocus();
835*cdf0e10cSrcweir }
836*cdf0e10cSrcweir // -----------------------------------------------------------------------------
837*cdf0e10cSrcweir void VCLXAccessibleToolBox::selectAllAccessibleChildren(  ) throw (RuntimeException)
838*cdf0e10cSrcweir {
839*cdf0e10cSrcweir     OExternalLockGuard aGuard( this );
840*cdf0e10cSrcweir     // intentionally empty. makes no sense for a toolbox
841*cdf0e10cSrcweir }
842*cdf0e10cSrcweir // -----------------------------------------------------------------------------
843*cdf0e10cSrcweir sal_Int32 VCLXAccessibleToolBox::getSelectedAccessibleChildCount(  ) throw (RuntimeException)
844*cdf0e10cSrcweir {
845*cdf0e10cSrcweir     OExternalLockGuard aGuard( this );
846*cdf0e10cSrcweir     sal_Int32 nRet = 0;
847*cdf0e10cSrcweir     for ( sal_Int32 i = 0, nCount = getAccessibleChildCount(); i < nCount; i++ )
848*cdf0e10cSrcweir     {
849*cdf0e10cSrcweir         if ( isAccessibleChildSelected( i ) )
850*cdf0e10cSrcweir         {
851*cdf0e10cSrcweir             nRet = 1;
852*cdf0e10cSrcweir             break; // a toolbox can only have (n)one selected child
853*cdf0e10cSrcweir         }
854*cdf0e10cSrcweir     }
855*cdf0e10cSrcweir     return nRet;
856*cdf0e10cSrcweir }
857*cdf0e10cSrcweir // -----------------------------------------------------------------------------
858*cdf0e10cSrcweir Reference< XAccessible > VCLXAccessibleToolBox::getSelectedAccessibleChild( sal_Int32 nSelectedChildIndex ) throw (IndexOutOfBoundsException, RuntimeException)
859*cdf0e10cSrcweir {
860*cdf0e10cSrcweir     OExternalLockGuard aGuard( this );
861*cdf0e10cSrcweir     if ( nSelectedChildIndex < 0 || nSelectedChildIndex >= getSelectedAccessibleChildCount() )
862*cdf0e10cSrcweir         throw IndexOutOfBoundsException();
863*cdf0e10cSrcweir     Reference< XAccessible > xChild;
864*cdf0e10cSrcweir     for ( sal_Int32 i = 0, j = 0, nCount = getAccessibleChildCount(); i < nCount; i++ )
865*cdf0e10cSrcweir     {
866*cdf0e10cSrcweir         if ( isAccessibleChildSelected( i ) && ( j++ == nSelectedChildIndex ) )
867*cdf0e10cSrcweir         {
868*cdf0e10cSrcweir             xChild = getAccessibleChild( i );
869*cdf0e10cSrcweir             break;
870*cdf0e10cSrcweir         }
871*cdf0e10cSrcweir     }
872*cdf0e10cSrcweir     return xChild;
873*cdf0e10cSrcweir }
874*cdf0e10cSrcweir // -----------------------------------------------------------------------------
875*cdf0e10cSrcweir void VCLXAccessibleToolBox::deselectAccessibleChild( sal_Int32 nChildIndex ) throw (IndexOutOfBoundsException, RuntimeException)
876*cdf0e10cSrcweir {
877*cdf0e10cSrcweir     OExternalLockGuard aGuard( this );
878*cdf0e10cSrcweir     if ( nChildIndex < 0 || nChildIndex >= getAccessibleChildCount() )
879*cdf0e10cSrcweir         throw IndexOutOfBoundsException();
880*cdf0e10cSrcweir     clearAccessibleSelection(); // a toolbox can only have (n)one selected child
881*cdf0e10cSrcweir }
882*cdf0e10cSrcweir // -----------------------------------------------------------------------------
883