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