1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_accessibility.hxx" 26 27 28 #include "accessibility/extended/AccessibleBrowseBoxTable.hxx" 29 #include <svtools/accessibletableprovider.hxx> 30 31 // ============================================================================ 32 33 using ::rtl::OUString; 34 35 using ::com::sun::star::uno::Reference; 36 using ::com::sun::star::uno::Sequence; 37 using ::com::sun::star::uno::Any; 38 39 using namespace ::com::sun::star; 40 using namespace ::com::sun::star::accessibility; 41 using namespace ::svt; 42 43 // ============================================================================ 44 45 namespace accessibility { 46 47 // ============================================================================ 48 49 // Ctor/Dtor/disposing -------------------------------------------------------- 50 51 DBG_NAME( AccessibleBrowseBoxTable ) 52 53 AccessibleBrowseBoxTable::AccessibleBrowseBoxTable( 54 const Reference< XAccessible >& rxParent, 55 IAccessibleTableProvider& rBrowseBox ) : 56 AccessibleBrowseBoxTableBase( rxParent, rBrowseBox, BBTYPE_TABLE ) 57 { 58 DBG_CTOR( AccessibleBrowseBoxTable, NULL ); 59 } 60 61 AccessibleBrowseBoxTable::~AccessibleBrowseBoxTable() 62 { 63 DBG_DTOR( AccessibleBrowseBoxTable, NULL ); 64 } 65 66 // XAccessibleContext --------------------------------------------------------- 67 68 Reference< XAccessible > SAL_CALL 69 AccessibleBrowseBoxTable::getAccessibleChild( sal_Int32 nChildIndex ) 70 throw ( lang::IndexOutOfBoundsException, uno::RuntimeException ) 71 { 72 BBSolarGuard aSolarGuard; 73 ::osl::MutexGuard aGuard( getOslMutex() ); 74 ensureIsAlive(); 75 ensureIsValidIndex( nChildIndex ); 76 return mpBrowseBox->CreateAccessibleCell( 77 implGetRow( nChildIndex ), (sal_Int16)implGetColumn( nChildIndex ) ); 78 } 79 80 sal_Int32 SAL_CALL AccessibleBrowseBoxTable::getAccessibleIndexInParent() 81 throw ( uno::RuntimeException ) 82 { 83 ensureIsAlive(); 84 return BBINDEX_TABLE; 85 } 86 87 // XAccessibleComponent ------------------------------------------------------- 88 89 Reference< XAccessible > SAL_CALL 90 AccessibleBrowseBoxTable::getAccessibleAtPoint( const awt::Point& rPoint ) 91 throw ( uno::RuntimeException ) 92 { 93 BBSolarGuard aSolarGuard; 94 ::osl::MutexGuard aGuard( getOslMutex() ); 95 ensureIsAlive(); 96 97 Reference< XAccessible > xChild; 98 sal_Int32 nRow = 0; 99 sal_uInt16 nColumnPos = 0; 100 if( mpBrowseBox->ConvertPointToCellAddress( nRow, nColumnPos, VCLPoint( rPoint ) ) ) 101 xChild = mpBrowseBox->CreateAccessibleCell( nRow, nColumnPos ); 102 103 return xChild; 104 } 105 106 void SAL_CALL AccessibleBrowseBoxTable::grabFocus() 107 throw ( uno::RuntimeException ) 108 { 109 BBSolarGuard aSolarGuard; 110 ::osl::MutexGuard aGuard( getOslMutex() ); 111 ensureIsAlive(); 112 mpBrowseBox->GrabTableFocus(); 113 } 114 115 Any SAL_CALL AccessibleBrowseBoxTable::getAccessibleKeyBinding() 116 throw ( uno::RuntimeException ) 117 { 118 ensureIsAlive(); 119 return Any(); // no special key bindings for data table 120 } 121 122 // XAccessibleTable ----------------------------------------------------------- 123 124 OUString SAL_CALL AccessibleBrowseBoxTable::getAccessibleRowDescription( sal_Int32 nRow ) 125 throw ( lang::IndexOutOfBoundsException, uno::RuntimeException ) 126 { 127 BBSolarGuard aSolarGuard; 128 ::osl::MutexGuard aGuard( getOslMutex() ); 129 ensureIsAlive(); 130 ensureIsValidRow( nRow ); 131 return mpBrowseBox->GetRowDescription( nRow ); 132 } 133 134 OUString SAL_CALL AccessibleBrowseBoxTable::getAccessibleColumnDescription( sal_Int32 nColumn ) 135 throw ( lang::IndexOutOfBoundsException, uno::RuntimeException ) 136 { 137 BBSolarGuard aSolarGuard; 138 ::osl::MutexGuard aGuard( getOslMutex() ); 139 ensureIsAlive(); 140 ensureIsValidColumn( nColumn ); 141 return mpBrowseBox->GetColumnDescription( (sal_uInt16)nColumn ); 142 } 143 144 Reference< XAccessibleTable > SAL_CALL AccessibleBrowseBoxTable::getAccessibleRowHeaders() 145 throw ( uno::RuntimeException ) 146 { 147 ::osl::MutexGuard aGuard( getOslMutex() ); 148 ensureIsAlive(); 149 return implGetHeaderBar( BBINDEX_ROWHEADERBAR ); 150 } 151 152 Reference< XAccessibleTable > SAL_CALL AccessibleBrowseBoxTable::getAccessibleColumnHeaders() 153 throw ( uno::RuntimeException ) 154 { 155 ::osl::MutexGuard aGuard( getOslMutex() ); 156 ensureIsAlive(); 157 return implGetHeaderBar( BBINDEX_COLUMNHEADERBAR ); 158 } 159 160 Sequence< sal_Int32 > SAL_CALL AccessibleBrowseBoxTable::getSelectedAccessibleRows() 161 throw ( uno::RuntimeException ) 162 { 163 BBSolarGuard aSolarGuard; 164 ::osl::MutexGuard aGuard( getOslMutex() ); 165 ensureIsAlive(); 166 167 Sequence< sal_Int32 > aSelSeq; 168 implGetSelectedRows( aSelSeq ); 169 return aSelSeq; 170 } 171 172 Sequence< sal_Int32 > SAL_CALL AccessibleBrowseBoxTable::getSelectedAccessibleColumns() 173 throw ( uno::RuntimeException ) 174 { 175 BBSolarGuard aSolarGuard; 176 ::osl::MutexGuard aGuard( getOslMutex() ); 177 ensureIsAlive(); 178 179 Sequence< sal_Int32 > aSelSeq; 180 implGetSelectedColumns( aSelSeq ); 181 return aSelSeq; 182 } 183 184 sal_Bool SAL_CALL AccessibleBrowseBoxTable::isAccessibleRowSelected( sal_Int32 nRow ) 185 throw ( lang::IndexOutOfBoundsException, uno::RuntimeException ) 186 { 187 BBSolarGuard aSolarGuard; 188 ::osl::MutexGuard aGuard( getOslMutex() ); 189 ensureIsAlive(); 190 ensureIsValidRow( nRow ); 191 return implIsRowSelected( nRow ); 192 } 193 194 sal_Bool SAL_CALL AccessibleBrowseBoxTable::isAccessibleColumnSelected( sal_Int32 nColumn ) 195 throw ( lang::IndexOutOfBoundsException, uno::RuntimeException ) 196 { 197 BBSolarGuard aSolarGuard; 198 ::osl::MutexGuard aGuard( getOslMutex() ); 199 ensureIsAlive(); 200 ensureIsValidColumn( nColumn ); 201 return implIsColumnSelected( nColumn ); 202 } 203 204 Reference< XAccessible > SAL_CALL AccessibleBrowseBoxTable::getAccessibleCellAt( 205 sal_Int32 nRow, sal_Int32 nColumn ) 206 throw ( lang::IndexOutOfBoundsException, uno::RuntimeException ) 207 { 208 BBSolarGuard aSolarGuard; 209 ::osl::MutexGuard aGuard( getOslMutex() ); 210 ensureIsAlive(); 211 ensureIsValidAddress( nRow, nColumn ); 212 return mpBrowseBox->CreateAccessibleCell( nRow, (sal_Int16)nColumn ); 213 } 214 215 sal_Bool SAL_CALL AccessibleBrowseBoxTable::isAccessibleSelected( 216 sal_Int32 nRow, sal_Int32 nColumn ) 217 throw ( lang::IndexOutOfBoundsException, uno::RuntimeException ) 218 { 219 BBSolarGuard aSolarGuard; 220 ::osl::MutexGuard aGuard( getOslMutex() ); 221 ensureIsAlive(); 222 ensureIsValidAddress( nRow, nColumn ); 223 return implIsRowSelected( nRow ) || implIsColumnSelected( nColumn ); 224 } 225 226 // XServiceInfo --------------------------------------------------------------- 227 228 OUString SAL_CALL AccessibleBrowseBoxTable::getImplementationName() 229 throw ( uno::RuntimeException ) 230 { 231 return OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.svtools.AccessibleBrowseBoxTable" ) ); 232 } 233 234 // internal virtual methods --------------------------------------------------- 235 236 Rectangle AccessibleBrowseBoxTable::implGetBoundingBox() 237 { 238 return mpBrowseBox->calcTableRect(sal_False); 239 } 240 241 Rectangle AccessibleBrowseBoxTable::implGetBoundingBoxOnScreen() 242 { 243 return mpBrowseBox->calcTableRect(); 244 } 245 246 // internal helper methods ---------------------------------------------------- 247 248 Reference< XAccessibleTable > AccessibleBrowseBoxTable::implGetHeaderBar( 249 sal_Int32 nChildIndex ) 250 throw ( uno::RuntimeException ) 251 { 252 Reference< XAccessible > xRet; 253 Reference< XAccessibleContext > xContext( mxParent, uno::UNO_QUERY ); 254 if( xContext.is() ) 255 { 256 try 257 { 258 xRet = xContext->getAccessibleChild( nChildIndex ); 259 } 260 catch( lang::IndexOutOfBoundsException& ) 261 { 262 DBG_ERROR( "implGetHeaderBar - wrong child index" ); 263 } 264 // RuntimeException goes to caller 265 } 266 return Reference< XAccessibleTable >( xRet, uno::UNO_QUERY ); 267 } 268 269 // ============================================================================ 270 271 } // namespace accessibility 272 273 // ============================================================================ 274 275