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 // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_accessibility.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #ifndef ACCESSIBILITY_EXT_ACCESSIBLETABLISTBOXTABLE_HXX_
28*b1cdbd2cSJim Jagielski #include "accessibility/extended/accessibletablistboxtable.hxx"
29*b1cdbd2cSJim Jagielski #endif
30*b1cdbd2cSJim Jagielski #include "accessibility/extended/AccessibleBrowseBoxTableCell.hxx"
31*b1cdbd2cSJim Jagielski #include "accessibility/extended/AccessibleBrowseBoxCheckBoxCell.hxx"
32*b1cdbd2cSJim Jagielski #include <svtools/svtabbx.hxx>
33*b1cdbd2cSJim Jagielski #include <com/sun/star/accessibility/AccessibleEventId.hpp>
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski #ifndef _SVTOOLS_ACCESSIBILEBROWSEBOXTABLECELL_HXX
36*b1cdbd2cSJim Jagielski #include "accessibility/extended/AccessibleBrowseBoxTableCell.hxx"
37*b1cdbd2cSJim Jagielski #endif
38*b1cdbd2cSJim Jagielski //........................................................................
39*b1cdbd2cSJim Jagielski namespace accessibility
40*b1cdbd2cSJim Jagielski {
41*b1cdbd2cSJim Jagielski //........................................................................
42*b1cdbd2cSJim Jagielski 
43*b1cdbd2cSJim Jagielski 	// class TLBSolarGuard ---------------------------------------------------------
44*b1cdbd2cSJim Jagielski 
45*b1cdbd2cSJim Jagielski 	/** Aquire the solar mutex. */
46*b1cdbd2cSJim Jagielski 	class TLBSolarGuard : public ::vos::OGuard
47*b1cdbd2cSJim Jagielski 	{
48*b1cdbd2cSJim Jagielski 	public:
TLBSolarGuard()49*b1cdbd2cSJim Jagielski     	inline TLBSolarGuard() : ::vos::OGuard( Application::GetSolarMutex() ) {}
50*b1cdbd2cSJim Jagielski 	};
51*b1cdbd2cSJim Jagielski 
52*b1cdbd2cSJim Jagielski 	// class AccessibleTabListBoxTable ---------------------------------------------
53*b1cdbd2cSJim Jagielski 
54*b1cdbd2cSJim Jagielski 	using namespace ::com::sun::star::accessibility;
55*b1cdbd2cSJim Jagielski 	using namespace ::com::sun::star::uno;
56*b1cdbd2cSJim Jagielski 	using namespace ::com::sun::star::lang;
57*b1cdbd2cSJim Jagielski 	using namespace ::com::sun::star;
58*b1cdbd2cSJim Jagielski 
DBG_NAME(AccessibleTabListBoxTable)59*b1cdbd2cSJim Jagielski 	DBG_NAME(AccessibleTabListBoxTable)
60*b1cdbd2cSJim Jagielski 
61*b1cdbd2cSJim Jagielski 	// -----------------------------------------------------------------------------
62*b1cdbd2cSJim Jagielski 	// Ctor() and Dtor()
63*b1cdbd2cSJim Jagielski 	// -----------------------------------------------------------------------------
64*b1cdbd2cSJim Jagielski 	AccessibleTabListBoxTable::AccessibleTabListBoxTable( const Reference< XAccessible >& rxParent, SvHeaderTabListBox& rBox ) :
65*b1cdbd2cSJim Jagielski 
66*b1cdbd2cSJim Jagielski 		AccessibleBrowseBoxTable( rxParent, rBox ),
67*b1cdbd2cSJim Jagielski 
68*b1cdbd2cSJim Jagielski 		m_pTabListBox	( &rBox )
69*b1cdbd2cSJim Jagielski 
70*b1cdbd2cSJim Jagielski 	{
71*b1cdbd2cSJim Jagielski 		DBG_CTOR( AccessibleTabListBoxTable, NULL );
72*b1cdbd2cSJim Jagielski 
73*b1cdbd2cSJim Jagielski 		m_pTabListBox->AddEventListener( LINK( this, AccessibleTabListBoxTable, WindowEventListener ) );
74*b1cdbd2cSJim Jagielski 	}
75*b1cdbd2cSJim Jagielski 	// -----------------------------------------------------------------------------
~AccessibleTabListBoxTable()76*b1cdbd2cSJim Jagielski 	AccessibleTabListBoxTable::~AccessibleTabListBoxTable()
77*b1cdbd2cSJim Jagielski 	{
78*b1cdbd2cSJim Jagielski 		DBG_DTOR( AccessibleTabListBoxTable, NULL );
79*b1cdbd2cSJim Jagielski 
80*b1cdbd2cSJim Jagielski 		if ( isAlive() )
81*b1cdbd2cSJim Jagielski 		{
82*b1cdbd2cSJim Jagielski 			m_pTabListBox = NULL;
83*b1cdbd2cSJim Jagielski 
84*b1cdbd2cSJim Jagielski 			// increment ref count to prevent double call of Dtor
85*b1cdbd2cSJim Jagielski         	osl_incrementInterlockedCount( &m_refCount );
86*b1cdbd2cSJim Jagielski         	dispose();
87*b1cdbd2cSJim Jagielski 		}
88*b1cdbd2cSJim Jagielski 	}
89*b1cdbd2cSJim Jagielski 	// -----------------------------------------------------------------------------
ProcessWindowEvent(const VclWindowEvent & rVclWindowEvent)90*b1cdbd2cSJim Jagielski 	void AccessibleTabListBoxTable::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent )
91*b1cdbd2cSJim Jagielski 	{
92*b1cdbd2cSJim Jagielski     	if ( isAlive() )
93*b1cdbd2cSJim Jagielski 		{
94*b1cdbd2cSJim Jagielski             sal_uLong nEventId = rVclWindowEvent.GetId();
95*b1cdbd2cSJim Jagielski             switch ( nEventId )
96*b1cdbd2cSJim Jagielski             {
97*b1cdbd2cSJim Jagielski 				case  VCLEVENT_OBJECT_DYING :
98*b1cdbd2cSJim Jagielski 				{
99*b1cdbd2cSJim Jagielski 					m_pTabListBox->RemoveEventListener( LINK( this, AccessibleTabListBoxTable, WindowEventListener ) );
100*b1cdbd2cSJim Jagielski 					m_pTabListBox = NULL;
101*b1cdbd2cSJim Jagielski 					break;
102*b1cdbd2cSJim Jagielski 				}
103*b1cdbd2cSJim Jagielski 
104*b1cdbd2cSJim Jagielski                 case VCLEVENT_CONTROL_GETFOCUS :
105*b1cdbd2cSJim Jagielski                 case VCLEVENT_CONTROL_LOSEFOCUS :
106*b1cdbd2cSJim Jagielski                 {
107*b1cdbd2cSJim Jagielski                     uno::Any aOldValue, aNewValue;
108*b1cdbd2cSJim Jagielski                     if ( VCLEVENT_CONTROL_GETFOCUS == nEventId )
109*b1cdbd2cSJim Jagielski                         aNewValue <<= AccessibleStateType::FOCUSED;
110*b1cdbd2cSJim Jagielski                     else
111*b1cdbd2cSJim Jagielski                         aOldValue <<= AccessibleStateType::FOCUSED;
112*b1cdbd2cSJim Jagielski                     commitEvent( AccessibleEventId::STATE_CHANGED, aNewValue, aOldValue );
113*b1cdbd2cSJim Jagielski                     break;
114*b1cdbd2cSJim Jagielski                 }
115*b1cdbd2cSJim Jagielski 
116*b1cdbd2cSJim Jagielski                 case VCLEVENT_LISTBOX_SELECT :
117*b1cdbd2cSJim Jagielski 				{
118*b1cdbd2cSJim Jagielski                     // First send an event that tells the listeners of a
119*b1cdbd2cSJim Jagielski                     // modified selection.  The active descendant event is
120*b1cdbd2cSJim Jagielski                     // send after that so that the receiving AT has time to
121*b1cdbd2cSJim Jagielski                     // read the text or name of the active child.
122*b1cdbd2cSJim Jagielski 					commitEvent( AccessibleEventId::SELECTION_CHANGED, Any(), Any() );
123*b1cdbd2cSJim Jagielski 					if ( m_pTabListBox && m_pTabListBox->HasFocus() )
124*b1cdbd2cSJim Jagielski 					{
125*b1cdbd2cSJim Jagielski                         SvLBoxEntry* pEntry = static_cast< SvLBoxEntry* >( rVclWindowEvent.GetData() );
126*b1cdbd2cSJim Jagielski 						if ( pEntry )
127*b1cdbd2cSJim Jagielski 						{
128*b1cdbd2cSJim Jagielski 							sal_Int32 nRow = m_pTabListBox->GetEntryPos( pEntry );
129*b1cdbd2cSJim Jagielski                             sal_uInt16 nCol = m_pTabListBox->GetCurrColumn();
130*b1cdbd2cSJim Jagielski                             Reference< XAccessible > xChild =
131*b1cdbd2cSJim Jagielski                                 m_pTabListBox->CreateAccessibleCell( nRow, nCol );
132*b1cdbd2cSJim Jagielski 							uno::Any aOldValue, aNewValue;
133*b1cdbd2cSJim Jagielski 
134*b1cdbd2cSJim Jagielski                             if ( m_pTabListBox->IsTransientChildrenDisabled() )
135*b1cdbd2cSJim Jagielski                             {
136*b1cdbd2cSJim Jagielski                                 aNewValue <<= AccessibleStateType::FOCUSED;
137*b1cdbd2cSJim Jagielski                                 TriState eState = STATE_DONTKNOW;
138*b1cdbd2cSJim Jagielski                                 if ( m_pTabListBox->IsCellCheckBox( nRow, nCol, eState ) )
139*b1cdbd2cSJim Jagielski                                 {
140*b1cdbd2cSJim Jagielski                                     AccessibleCheckBoxCell* pCell =
141*b1cdbd2cSJim Jagielski                                         static_cast< AccessibleCheckBoxCell* >( xChild.get() );
142*b1cdbd2cSJim Jagielski                                     pCell->commitEvent( AccessibleEventId::STATE_CHANGED, aNewValue, aOldValue );
143*b1cdbd2cSJim Jagielski                                 }
144*b1cdbd2cSJim Jagielski                                 else
145*b1cdbd2cSJim Jagielski                                 {
146*b1cdbd2cSJim Jagielski                                     AccessibleBrowseBoxTableCell* pCell =
147*b1cdbd2cSJim Jagielski                                         static_cast< AccessibleBrowseBoxTableCell* >( xChild.get() );
148*b1cdbd2cSJim Jagielski                                     pCell->commitEvent( AccessibleEventId::STATE_CHANGED, aNewValue, aOldValue );
149*b1cdbd2cSJim Jagielski                                 }
150*b1cdbd2cSJim Jagielski                             }
151*b1cdbd2cSJim Jagielski                             else
152*b1cdbd2cSJim Jagielski                             {
153*b1cdbd2cSJim Jagielski                                 aNewValue <<= xChild;
154*b1cdbd2cSJim Jagielski                                 commitEvent( AccessibleEventId::ACTIVE_DESCENDANT_CHANGED, aNewValue, aOldValue );
155*b1cdbd2cSJim Jagielski                             }
156*b1cdbd2cSJim Jagielski 						}
157*b1cdbd2cSJim Jagielski 					}
158*b1cdbd2cSJim Jagielski 					break;
159*b1cdbd2cSJim Jagielski 				}
160*b1cdbd2cSJim Jagielski 				case VCLEVENT_WINDOW_GETFOCUS :
161*b1cdbd2cSJim Jagielski 				{
162*b1cdbd2cSJim Jagielski 					uno::Any aOldValue, aNewValue;
163*b1cdbd2cSJim Jagielski 					aNewValue <<= AccessibleStateType::FOCUSED;
164*b1cdbd2cSJim Jagielski 					commitEvent( AccessibleEventId::STATE_CHANGED, aNewValue, aOldValue );
165*b1cdbd2cSJim Jagielski 					break;
166*b1cdbd2cSJim Jagielski 
167*b1cdbd2cSJim Jagielski 				}
168*b1cdbd2cSJim Jagielski 				case VCLEVENT_WINDOW_LOSEFOCUS :
169*b1cdbd2cSJim Jagielski 				{
170*b1cdbd2cSJim Jagielski 					uno::Any aOldValue, aNewValue;
171*b1cdbd2cSJim Jagielski 					aOldValue <<= AccessibleStateType::FOCUSED;
172*b1cdbd2cSJim Jagielski 					commitEvent( AccessibleEventId::STATE_CHANGED, aNewValue, aOldValue );
173*b1cdbd2cSJim Jagielski 					break;
174*b1cdbd2cSJim Jagielski 				}
175*b1cdbd2cSJim Jagielski 				case VCLEVENT_LISTBOX_TREESELECT:
176*b1cdbd2cSJim Jagielski 					{
177*b1cdbd2cSJim Jagielski 						SvLBoxEntry* pEntry = static_cast< SvLBoxEntry* >( rVclWindowEvent.GetData() );
178*b1cdbd2cSJim Jagielski 						if (pEntry)
179*b1cdbd2cSJim Jagielski 						{
180*b1cdbd2cSJim Jagielski 							sal_Int32 nRow = m_pTabListBox->GetEntryPos( pEntry );
181*b1cdbd2cSJim Jagielski 							Reference< XAccessible > xChild = m_pTabListBox->CreateAccessibleCell( nRow, m_pTabListBox->GetCurrColumn() );
182*b1cdbd2cSJim Jagielski 							TriState eState = STATE_DONTKNOW;
183*b1cdbd2cSJim Jagielski 							if ( m_pTabListBox->IsCellCheckBox( nRow, m_pTabListBox->GetCurrColumn(), eState ) )
184*b1cdbd2cSJim Jagielski                             {
185*b1cdbd2cSJim Jagielski                                 AccessibleCheckBoxCell* pCell = static_cast< AccessibleCheckBoxCell* >( xChild.get() );
186*b1cdbd2cSJim Jagielski                                 pCell->commitEvent( AccessibleEventId::SELECTION_CHANGED, Any(), Any() );
187*b1cdbd2cSJim Jagielski                             }
188*b1cdbd2cSJim Jagielski                             else
189*b1cdbd2cSJim Jagielski                             {
190*b1cdbd2cSJim Jagielski                                 AccessibleBrowseBoxTableCell* pCell = static_cast< AccessibleBrowseBoxTableCell* >( xChild.get() );
191*b1cdbd2cSJim Jagielski                                 pCell->commitEvent( AccessibleEventId::SELECTION_CHANGED, Any(), Any() );
192*b1cdbd2cSJim Jagielski                             }
193*b1cdbd2cSJim Jagielski 						}
194*b1cdbd2cSJim Jagielski 					}
195*b1cdbd2cSJim Jagielski 					break;
196*b1cdbd2cSJim Jagielski 				case VCLEVENT_LISTBOX_TREEFOCUS:
197*b1cdbd2cSJim Jagielski 					{
198*b1cdbd2cSJim Jagielski 						if ( m_pTabListBox && m_pTabListBox->HasFocus() )
199*b1cdbd2cSJim Jagielski 						{
200*b1cdbd2cSJim Jagielski 							uno::Any aOldValue, aNewValue;
201*b1cdbd2cSJim Jagielski 							SvLBoxEntry* pEntry = static_cast< SvLBoxEntry* >( rVclWindowEvent.GetData() );
202*b1cdbd2cSJim Jagielski 							if ( pEntry )
203*b1cdbd2cSJim Jagielski 							{
204*b1cdbd2cSJim Jagielski 								sal_Int32 nRow = m_pTabListBox->GetEntryPos( pEntry );
205*b1cdbd2cSJim Jagielski 								m_xCurChild = m_pTabListBox->CreateAccessibleCell( nRow, m_pTabListBox->GetCurrColumn() );
206*b1cdbd2cSJim Jagielski 								aNewValue <<= m_xCurChild;
207*b1cdbd2cSJim Jagielski 								commitEvent( AccessibleEventId::ACTIVE_DESCENDANT_CHANGED, aNewValue ,aOldValue);
208*b1cdbd2cSJim Jagielski 							}
209*b1cdbd2cSJim Jagielski 							else
210*b1cdbd2cSJim Jagielski 							{
211*b1cdbd2cSJim Jagielski 								aNewValue <<= AccessibleStateType::FOCUSED;
212*b1cdbd2cSJim Jagielski 								commitEvent( AccessibleEventId::STATE_CHANGED, aNewValue ,aOldValue);
213*b1cdbd2cSJim Jagielski 							}
214*b1cdbd2cSJim Jagielski 						}
215*b1cdbd2cSJim Jagielski 					}
216*b1cdbd2cSJim Jagielski 					break;
217*b1cdbd2cSJim Jagielski 
218*b1cdbd2cSJim Jagielski                 case VCLEVENT_CHECKBOX_TOGGLE :
219*b1cdbd2cSJim Jagielski                 {
220*b1cdbd2cSJim Jagielski                     if ( m_pTabListBox && m_pTabListBox->HasFocus() )
221*b1cdbd2cSJim Jagielski                     {
222*b1cdbd2cSJim Jagielski                         SvLBoxEntry* pEntry = static_cast< SvLBoxEntry* >( rVclWindowEvent.GetData() );
223*b1cdbd2cSJim Jagielski                         if ( pEntry )
224*b1cdbd2cSJim Jagielski                         {
225*b1cdbd2cSJim Jagielski                             sal_Int32 nRow = m_pTabListBox->GetEntryPos( pEntry );
226*b1cdbd2cSJim Jagielski                             sal_uInt16 nCol = m_pTabListBox->GetCurrColumn();
227*b1cdbd2cSJim Jagielski                             TriState eState = STATE_DONTKNOW;
228*b1cdbd2cSJim Jagielski                             if ( m_pTabListBox->IsCellCheckBox( nRow, nCol, eState ) )
229*b1cdbd2cSJim Jagielski                             {
230*b1cdbd2cSJim Jagielski                                 Reference< XAccessible > xChild =
231*b1cdbd2cSJim Jagielski                                     m_pTabListBox->CreateAccessibleCell( nRow, nCol );
232*b1cdbd2cSJim Jagielski                                 AccessibleCheckBoxCell* pCell =
233*b1cdbd2cSJim Jagielski                                     static_cast< AccessibleCheckBoxCell* >( xChild.get() );
234*b1cdbd2cSJim Jagielski                                 pCell->SetChecked( m_pTabListBox->IsItemChecked( pEntry, nCol ) );
235*b1cdbd2cSJim Jagielski                             }
236*b1cdbd2cSJim Jagielski                         }
237*b1cdbd2cSJim Jagielski                     }
238*b1cdbd2cSJim Jagielski                     break;
239*b1cdbd2cSJim Jagielski                 }
240*b1cdbd2cSJim Jagielski 
241*b1cdbd2cSJim Jagielski                 case VCLEVENT_TABLECELL_NAMECHANGED :
242*b1cdbd2cSJim Jagielski                 {
243*b1cdbd2cSJim Jagielski                     if ( m_pTabListBox->IsTransientChildrenDisabled() )
244*b1cdbd2cSJim Jagielski                     {
245*b1cdbd2cSJim Jagielski                         commitEvent( AccessibleEventId::SELECTION_CHANGED, Any(), Any() );
246*b1cdbd2cSJim Jagielski                         TabListBoxEventData* pData = static_cast< TabListBoxEventData* >( rVclWindowEvent.GetData() );
247*b1cdbd2cSJim Jagielski                         SvLBoxEntry* pEntry = pData != NULL ? pData->m_pEntry : NULL;
248*b1cdbd2cSJim Jagielski                         if ( pEntry )
249*b1cdbd2cSJim Jagielski                         {
250*b1cdbd2cSJim Jagielski                             sal_Int32 nRow = m_pTabListBox->GetEntryPos( pEntry );
251*b1cdbd2cSJim Jagielski                             sal_uInt16 nCol = pData->m_nColumn;
252*b1cdbd2cSJim Jagielski                             Reference< XAccessible > xChild =
253*b1cdbd2cSJim Jagielski                                 m_pTabListBox->CreateAccessibleCell( nRow, nCol );
254*b1cdbd2cSJim Jagielski                             uno::Any aOldValue, aNewValue;
255*b1cdbd2cSJim Jagielski                             aOldValue <<= ::rtl::OUString( pData->m_sOldText );
256*b1cdbd2cSJim Jagielski                             ::rtl::OUString sNewText( m_pTabListBox->GetCellText( nRow, nCol ) );
257*b1cdbd2cSJim Jagielski                             aNewValue <<= sNewText;
258*b1cdbd2cSJim Jagielski                             TriState eState = STATE_DONTKNOW;
259*b1cdbd2cSJim Jagielski 
260*b1cdbd2cSJim Jagielski                             if ( m_pTabListBox->IsCellCheckBox( nRow, nCol, eState ) )
261*b1cdbd2cSJim Jagielski                             {
262*b1cdbd2cSJim Jagielski                                 AccessibleCheckBoxCell* pCell =
263*b1cdbd2cSJim Jagielski                                     static_cast< AccessibleCheckBoxCell* >( xChild.get() );
264*b1cdbd2cSJim Jagielski                                 pCell->commitEvent( AccessibleEventId::NAME_CHANGED, aOldValue, aNewValue );
265*b1cdbd2cSJim Jagielski                             }
266*b1cdbd2cSJim Jagielski                             else
267*b1cdbd2cSJim Jagielski                             {
268*b1cdbd2cSJim Jagielski                                 AccessibleBrowseBoxTableCell* pCell =
269*b1cdbd2cSJim Jagielski                                     static_cast< AccessibleBrowseBoxTableCell* >( xChild.get() );
270*b1cdbd2cSJim Jagielski                                 pCell->nameChanged( sNewText, pData->m_sOldText );
271*b1cdbd2cSJim Jagielski                             }
272*b1cdbd2cSJim Jagielski                         }
273*b1cdbd2cSJim Jagielski                     }
274*b1cdbd2cSJim Jagielski                     break;
275*b1cdbd2cSJim Jagielski                 }
276*b1cdbd2cSJim Jagielski 			}
277*b1cdbd2cSJim Jagielski 		}
278*b1cdbd2cSJim Jagielski 	}
279*b1cdbd2cSJim Jagielski 	// -----------------------------------------------------------------------------
IMPL_LINK(AccessibleTabListBoxTable,WindowEventListener,VclSimpleEvent *,pEvent)280*b1cdbd2cSJim Jagielski 	IMPL_LINK( AccessibleTabListBoxTable, WindowEventListener, VclSimpleEvent*, pEvent )
281*b1cdbd2cSJim Jagielski 	{
282*b1cdbd2cSJim Jagielski     	DBG_ASSERT( pEvent && pEvent->ISA( VclWindowEvent ), "Unknown WindowEvent!" );
283*b1cdbd2cSJim Jagielski     	if ( pEvent && pEvent->ISA( VclWindowEvent ) )
284*b1cdbd2cSJim Jagielski     	{
285*b1cdbd2cSJim Jagielski         	DBG_ASSERT( ( (VclWindowEvent*)pEvent )->GetWindow() && m_pTabListBox, "no event window" );
286*b1cdbd2cSJim Jagielski         	ProcessWindowEvent( *(VclWindowEvent*)pEvent );
287*b1cdbd2cSJim Jagielski     	}
288*b1cdbd2cSJim Jagielski     	return 0;
289*b1cdbd2cSJim Jagielski 	}
290*b1cdbd2cSJim Jagielski 	// helpers --------------------------------------------------------------------
291*b1cdbd2cSJim Jagielski 
ensureValidIndex(sal_Int32 _nIndex) const292*b1cdbd2cSJim Jagielski 	void AccessibleTabListBoxTable::ensureValidIndex( sal_Int32 _nIndex ) const
293*b1cdbd2cSJim Jagielski 	        SAL_THROW( ( IndexOutOfBoundsException ) )
294*b1cdbd2cSJim Jagielski 	{
295*b1cdbd2cSJim Jagielski 	    if ( ( _nIndex < 0 ) || ( _nIndex >= implGetCellCount() ) )
296*b1cdbd2cSJim Jagielski 	        throw IndexOutOfBoundsException();
297*b1cdbd2cSJim Jagielski 	}
298*b1cdbd2cSJim Jagielski 
implIsRowSelected(sal_Int32 _nRow) const299*b1cdbd2cSJim Jagielski 	sal_Bool AccessibleTabListBoxTable::implIsRowSelected( sal_Int32 _nRow ) const
300*b1cdbd2cSJim Jagielski 	{
301*b1cdbd2cSJim Jagielski 	    return m_pTabListBox ? m_pTabListBox->IsSelected( m_pTabListBox->GetEntry( _nRow ) ) : sal_False;
302*b1cdbd2cSJim Jagielski 	}
303*b1cdbd2cSJim Jagielski 
implSelectRow(sal_Int32 _nRow,sal_Bool _bSelect)304*b1cdbd2cSJim Jagielski 	void AccessibleTabListBoxTable::implSelectRow( sal_Int32 _nRow, sal_Bool _bSelect )
305*b1cdbd2cSJim Jagielski 	{
306*b1cdbd2cSJim Jagielski 		if ( m_pTabListBox )
307*b1cdbd2cSJim Jagielski 		    m_pTabListBox->Select( m_pTabListBox->GetEntry( _nRow ), _bSelect );
308*b1cdbd2cSJim Jagielski 	}
309*b1cdbd2cSJim Jagielski 
implGetRowCount() const310*b1cdbd2cSJim Jagielski 	sal_Int32 AccessibleTabListBoxTable::implGetRowCount() const
311*b1cdbd2cSJim Jagielski 	{
312*b1cdbd2cSJim Jagielski 	    return m_pTabListBox ? m_pTabListBox->GetEntryCount() : 0;
313*b1cdbd2cSJim Jagielski 	}
314*b1cdbd2cSJim Jagielski 
implGetColumnCount() const315*b1cdbd2cSJim Jagielski 	sal_Int32 AccessibleTabListBoxTable::implGetColumnCount() const
316*b1cdbd2cSJim Jagielski 	{
317*b1cdbd2cSJim Jagielski 	    return m_pTabListBox ? m_pTabListBox->GetColumnCount() : 0;
318*b1cdbd2cSJim Jagielski 	}
319*b1cdbd2cSJim Jagielski 
implGetSelRowCount() const320*b1cdbd2cSJim Jagielski 	sal_Int32 AccessibleTabListBoxTable::implGetSelRowCount() const
321*b1cdbd2cSJim Jagielski 	{
322*b1cdbd2cSJim Jagielski 	    return m_pTabListBox ? m_pTabListBox->GetSelectionCount() : 0;
323*b1cdbd2cSJim Jagielski 	}
324*b1cdbd2cSJim Jagielski 
implGetSelRow(sal_Int32 nSelRow) const325*b1cdbd2cSJim Jagielski 	sal_Int32 AccessibleTabListBoxTable::implGetSelRow( sal_Int32 nSelRow ) const
326*b1cdbd2cSJim Jagielski 	{
327*b1cdbd2cSJim Jagielski 		if ( m_pTabListBox )
328*b1cdbd2cSJim Jagielski 		{
329*b1cdbd2cSJim Jagielski 		    sal_Int32 nRow = 0;
330*b1cdbd2cSJim Jagielski 			SvLBoxEntry* pEntry = m_pTabListBox->FirstSelected();
331*b1cdbd2cSJim Jagielski 			while ( pEntry )
332*b1cdbd2cSJim Jagielski 			{
333*b1cdbd2cSJim Jagielski 				++nRow;
334*b1cdbd2cSJim Jagielski 				if ( nRow == nSelRow )
335*b1cdbd2cSJim Jagielski 					return m_pTabListBox->GetEntryPos( pEntry );
336*b1cdbd2cSJim Jagielski 				pEntry = m_pTabListBox->NextSelected( pEntry );
337*b1cdbd2cSJim Jagielski 			}
338*b1cdbd2cSJim Jagielski 		}
339*b1cdbd2cSJim Jagielski 
340*b1cdbd2cSJim Jagielski 		return 0;
341*b1cdbd2cSJim Jagielski 	}
342*b1cdbd2cSJim Jagielski 	// -----------------------------------------------------------------------------
343*b1cdbd2cSJim Jagielski 	// XInterface & XTypeProvider
344*b1cdbd2cSJim Jagielski 	// -----------------------------------------------------------------------------
IMPLEMENT_FORWARD_XINTERFACE2(AccessibleTabListBoxTable,AccessibleBrowseBoxTable,AccessibleTabListBoxTableImplHelper)345*b1cdbd2cSJim Jagielski 	IMPLEMENT_FORWARD_XINTERFACE2(AccessibleTabListBoxTable, AccessibleBrowseBoxTable, AccessibleTabListBoxTableImplHelper)
346*b1cdbd2cSJim Jagielski 	IMPLEMENT_FORWARD_XTYPEPROVIDER2(AccessibleTabListBoxTable, AccessibleBrowseBoxTable, AccessibleTabListBoxTableImplHelper)
347*b1cdbd2cSJim Jagielski 	// -----------------------------------------------------------------------------
348*b1cdbd2cSJim Jagielski 	// XServiceInfo
349*b1cdbd2cSJim Jagielski 	// -----------------------------------------------------------------------------
350*b1cdbd2cSJim Jagielski 	::rtl::OUString AccessibleTabListBoxTable::getImplementationName (void) throw (RuntimeException)
351*b1cdbd2cSJim Jagielski 	{
352*b1cdbd2cSJim Jagielski 		return ::rtl::OUString::createFromAscii("com.sun.star.comp.svtools.AccessibleTabListBoxTable");
353*b1cdbd2cSJim Jagielski 	}
354*b1cdbd2cSJim Jagielski 	// -----------------------------------------------------------------------------
355*b1cdbd2cSJim Jagielski 	// XAccessibleSelection
356*b1cdbd2cSJim Jagielski 	// -----------------------------------------------------------------------------
selectAccessibleChild(sal_Int32 nChildIndex)357*b1cdbd2cSJim Jagielski 	void SAL_CALL AccessibleTabListBoxTable::selectAccessibleChild( sal_Int32 nChildIndex ) throw (IndexOutOfBoundsException, RuntimeException)
358*b1cdbd2cSJim Jagielski 	{
359*b1cdbd2cSJim Jagielski     	TLBSolarGuard aSolarGuard;
360*b1cdbd2cSJim Jagielski 		::osl::MutexGuard aGuard( getOslMutex() );
361*b1cdbd2cSJim Jagielski 
362*b1cdbd2cSJim Jagielski 		ensureIsAlive();
363*b1cdbd2cSJim Jagielski 	    ensureValidIndex( nChildIndex );
364*b1cdbd2cSJim Jagielski 
365*b1cdbd2cSJim Jagielski 		implSelectRow( implGetRow( nChildIndex ), sal_True );
366*b1cdbd2cSJim Jagielski 	}
367*b1cdbd2cSJim Jagielski 	// -----------------------------------------------------------------------------
isAccessibleChildSelected(sal_Int32 nChildIndex)368*b1cdbd2cSJim Jagielski 	sal_Bool SAL_CALL AccessibleTabListBoxTable::isAccessibleChildSelected( sal_Int32 nChildIndex ) throw (IndexOutOfBoundsException, RuntimeException)
369*b1cdbd2cSJim Jagielski 	{
370*b1cdbd2cSJim Jagielski     	TLBSolarGuard aSolarGuard;
371*b1cdbd2cSJim Jagielski 		::osl::MutexGuard aGuard( getOslMutex() );
372*b1cdbd2cSJim Jagielski 
373*b1cdbd2cSJim Jagielski 		ensureIsAlive();
374*b1cdbd2cSJim Jagielski 	    ensureValidIndex( nChildIndex );
375*b1cdbd2cSJim Jagielski 
376*b1cdbd2cSJim Jagielski 	    return implIsRowSelected( implGetRow( nChildIndex ) );
377*b1cdbd2cSJim Jagielski 	}
378*b1cdbd2cSJim Jagielski 	// -----------------------------------------------------------------------------
clearAccessibleSelection()379*b1cdbd2cSJim Jagielski 	void SAL_CALL AccessibleTabListBoxTable::clearAccessibleSelection(  ) throw (RuntimeException)
380*b1cdbd2cSJim Jagielski 	{
381*b1cdbd2cSJim Jagielski     	TLBSolarGuard aSolarGuard;
382*b1cdbd2cSJim Jagielski 		::osl::MutexGuard aGuard( getOslMutex() );
383*b1cdbd2cSJim Jagielski 
384*b1cdbd2cSJim Jagielski 		ensureIsAlive();
385*b1cdbd2cSJim Jagielski 
386*b1cdbd2cSJim Jagielski 		m_pTabListBox->SetNoSelection();
387*b1cdbd2cSJim Jagielski 	}
388*b1cdbd2cSJim Jagielski 	// -----------------------------------------------------------------------------
selectAllAccessibleChildren()389*b1cdbd2cSJim Jagielski 	void SAL_CALL AccessibleTabListBoxTable::selectAllAccessibleChildren(  ) throw (RuntimeException)
390*b1cdbd2cSJim Jagielski 	{
391*b1cdbd2cSJim Jagielski     	TLBSolarGuard aSolarGuard;
392*b1cdbd2cSJim Jagielski 		::osl::MutexGuard aGuard( getOslMutex() );
393*b1cdbd2cSJim Jagielski 
394*b1cdbd2cSJim Jagielski 		ensureIsAlive();
395*b1cdbd2cSJim Jagielski 
396*b1cdbd2cSJim Jagielski 		m_pTabListBox->SelectAll();
397*b1cdbd2cSJim Jagielski 	}
398*b1cdbd2cSJim Jagielski 	// -----------------------------------------------------------------------------
getSelectedAccessibleChildCount()399*b1cdbd2cSJim Jagielski 	sal_Int32 SAL_CALL AccessibleTabListBoxTable::getSelectedAccessibleChildCount(  ) throw (RuntimeException)
400*b1cdbd2cSJim Jagielski 	{
401*b1cdbd2cSJim Jagielski     	TLBSolarGuard aSolarGuard;
402*b1cdbd2cSJim Jagielski 		::osl::MutexGuard aGuard( getOslMutex() );
403*b1cdbd2cSJim Jagielski 
404*b1cdbd2cSJim Jagielski 		ensureIsAlive();
405*b1cdbd2cSJim Jagielski 
406*b1cdbd2cSJim Jagielski 	    return implGetColumnCount() * implGetSelRowCount();
407*b1cdbd2cSJim Jagielski 	}
408*b1cdbd2cSJim Jagielski 	// -----------------------------------------------------------------------------
getSelectedAccessibleChild(sal_Int32 nSelectedChildIndex)409*b1cdbd2cSJim Jagielski 	Reference< XAccessible > SAL_CALL AccessibleTabListBoxTable::getSelectedAccessibleChild( sal_Int32 nSelectedChildIndex ) throw (IndexOutOfBoundsException, RuntimeException)
410*b1cdbd2cSJim Jagielski 	{
411*b1cdbd2cSJim Jagielski     	TLBSolarGuard aSolarGuard;
412*b1cdbd2cSJim Jagielski 		::osl::MutexGuard aGuard( getOslMutex() );
413*b1cdbd2cSJim Jagielski 
414*b1cdbd2cSJim Jagielski 		ensureIsAlive();
415*b1cdbd2cSJim Jagielski 
416*b1cdbd2cSJim Jagielski 	    sal_Int32 nRows = implGetSelRowCount();
417*b1cdbd2cSJim Jagielski 	    if ( nRows == 0 )
418*b1cdbd2cSJim Jagielski 	        throw IndexOutOfBoundsException();
419*b1cdbd2cSJim Jagielski 
420*b1cdbd2cSJim Jagielski 	    sal_Int32 nRow = implGetSelRow( nSelectedChildIndex % nRows );
421*b1cdbd2cSJim Jagielski 	    sal_Int32 nColumn = nSelectedChildIndex / nRows;
422*b1cdbd2cSJim Jagielski 	    return getAccessibleCellAt( nRow, nColumn );
423*b1cdbd2cSJim Jagielski 	}
424*b1cdbd2cSJim Jagielski 	// -----------------------------------------------------------------------------
deselectAccessibleChild(sal_Int32 nSelectedChildIndex)425*b1cdbd2cSJim Jagielski 	void SAL_CALL AccessibleTabListBoxTable::deselectAccessibleChild( sal_Int32 nSelectedChildIndex ) throw (IndexOutOfBoundsException, RuntimeException)
426*b1cdbd2cSJim Jagielski 	{
427*b1cdbd2cSJim Jagielski     	TLBSolarGuard aSolarGuard;
428*b1cdbd2cSJim Jagielski 		::osl::MutexGuard aGuard( getOslMutex() );
429*b1cdbd2cSJim Jagielski 
430*b1cdbd2cSJim Jagielski 		ensureIsAlive();
431*b1cdbd2cSJim Jagielski 	    ensureValidIndex( nSelectedChildIndex );
432*b1cdbd2cSJim Jagielski 
433*b1cdbd2cSJim Jagielski 		implSelectRow( implGetRow( nSelectedChildIndex ), sal_False );
434*b1cdbd2cSJim Jagielski 	}
435*b1cdbd2cSJim Jagielski 
436*b1cdbd2cSJim Jagielski //........................................................................
437*b1cdbd2cSJim Jagielski }// namespace accessibility
438*b1cdbd2cSJim Jagielski //........................................................................
439*b1cdbd2cSJim Jagielski 
440