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/AccessibleBrowseBoxHeaderBar.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( AccessibleBrowseBoxHeaderBar ) 52 53 AccessibleBrowseBoxHeaderBar::AccessibleBrowseBoxHeaderBar( 54 const Reference< XAccessible >& rxParent, 55 IAccessibleTableProvider& rBrowseBox, 56 AccessibleBrowseBoxObjType eObjType ) : 57 AccessibleBrowseBoxTableBase( rxParent, rBrowseBox,eObjType ) 58 { 59 DBG_CTOR( AccessibleBrowseBoxHeaderBar, NULL ); 60 61 DBG_ASSERT( isRowBar() || isColumnBar(), 62 "accessibility/extended/AccessibleBrowseBoxHeaderBar - invalid object type" ); 63 } 64 65 AccessibleBrowseBoxHeaderBar::~AccessibleBrowseBoxHeaderBar() 66 { 67 DBG_DTOR( AccessibleBrowseBoxHeaderBar, NULL ); 68 } 69 70 // XAccessibleContext --------------------------------------------------------- 71 72 Reference< XAccessible > SAL_CALL 73 AccessibleBrowseBoxHeaderBar::getAccessibleChild( sal_Int32 nChildIndex ) 74 throw ( lang::IndexOutOfBoundsException, uno::RuntimeException ) 75 { 76 BBSolarGuard aSolarGuard; 77 ::osl::MutexGuard aGuard( getOslMutex() ); 78 ensureIsAlive(); 79 ensureIsValidHeaderIndex( nChildIndex ); 80 return implGetChild( nChildIndex, implToVCLColumnPos( nChildIndex ) ); 81 } 82 83 sal_Int32 SAL_CALL AccessibleBrowseBoxHeaderBar::getAccessibleIndexInParent() 84 throw ( uno::RuntimeException ) 85 { 86 return isRowBar() ? BBINDEX_ROWHEADERBAR : BBINDEX_COLUMNHEADERBAR; 87 } 88 89 // XAccessibleComponent ------------------------------------------------------- 90 91 Reference< XAccessible > SAL_CALL 92 AccessibleBrowseBoxHeaderBar::getAccessibleAtPoint( const awt::Point& rPoint ) 93 throw ( uno::RuntimeException ) 94 { 95 BBSolarGuard aSolarGuard; 96 ::osl::MutexGuard aGuard( getOslMutex() ); 97 ensureIsAlive(); 98 99 sal_Int32 nRow = 0; 100 sal_uInt16 nColumnPos = 0; 101 sal_Bool bConverted = isRowBar() ? 102 mpBrowseBox->ConvertPointToRowHeader( nRow, VCLPoint( rPoint ) ) : 103 mpBrowseBox->ConvertPointToColumnHeader( nColumnPos, VCLPoint( rPoint ) ); 104 105 return bConverted ? implGetChild( nRow, nColumnPos ) : Reference< XAccessible >(); 106 } 107 108 void SAL_CALL AccessibleBrowseBoxHeaderBar::grabFocus() 109 throw ( uno::RuntimeException ) 110 { 111 ensureIsAlive(); 112 // focus on header not supported 113 } 114 115 Any SAL_CALL AccessibleBrowseBoxHeaderBar::getAccessibleKeyBinding() 116 throw ( uno::RuntimeException ) 117 { 118 ensureIsAlive(); 119 return Any(); // no special key bindings for header 120 } 121 122 // XAccessibleTable ----------------------------------------------------------- 123 124 OUString SAL_CALL AccessibleBrowseBoxHeaderBar::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 OUString(); // no headers in headers 132 } 133 134 OUString SAL_CALL AccessibleBrowseBoxHeaderBar::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 OUString(); // no headers in headers 142 } 143 144 Reference< XAccessibleTable > SAL_CALL AccessibleBrowseBoxHeaderBar::getAccessibleRowHeaders() 145 throw ( uno::RuntimeException ) 146 { 147 ensureIsAlive(); 148 return NULL; // no headers in headers 149 } 150 151 Reference< XAccessibleTable > SAL_CALL AccessibleBrowseBoxHeaderBar::getAccessibleColumnHeaders() 152 throw ( uno::RuntimeException ) 153 { 154 ensureIsAlive(); 155 return NULL; // no headers in headers 156 } 157 158 Sequence< sal_Int32 > SAL_CALL AccessibleBrowseBoxHeaderBar::getSelectedAccessibleRows() 159 throw ( uno::RuntimeException ) 160 { 161 BBSolarGuard aSolarGuard; 162 ::osl::MutexGuard aGuard( getOslMutex() ); 163 ensureIsAlive(); 164 165 Sequence< sal_Int32 > aSelSeq; 166 // row of column header bar not selectable 167 if( isRowBar() ) 168 implGetSelectedRows( aSelSeq ); 169 return aSelSeq; 170 } 171 172 Sequence< sal_Int32 > SAL_CALL AccessibleBrowseBoxHeaderBar::getSelectedAccessibleColumns() 173 throw ( uno::RuntimeException ) 174 { 175 BBSolarGuard aSolarGuard; 176 ::osl::MutexGuard aGuard( getOslMutex() ); 177 ensureIsAlive(); 178 179 Sequence< sal_Int32 > aSelSeq; 180 // column of row header bar ("handle column") not selectable 181 if( isColumnBar() ) 182 implGetSelectedColumns( aSelSeq ); 183 return aSelSeq; 184 } 185 186 sal_Bool SAL_CALL AccessibleBrowseBoxHeaderBar::isAccessibleRowSelected( sal_Int32 nRow ) 187 throw ( lang::IndexOutOfBoundsException, uno::RuntimeException ) 188 { 189 BBSolarGuard aSolarGuard; 190 ::osl::MutexGuard aGuard( getOslMutex() ); 191 ensureIsAlive(); 192 ensureIsValidRow( nRow ); 193 return isRowBar() ? implIsRowSelected( nRow ) : sal_False; 194 } 195 196 sal_Bool SAL_CALL AccessibleBrowseBoxHeaderBar::isAccessibleColumnSelected( sal_Int32 nColumn ) 197 throw ( lang::IndexOutOfBoundsException, uno::RuntimeException ) 198 { 199 BBSolarGuard aSolarGuard; 200 ::osl::MutexGuard aGuard( getOslMutex() ); 201 ensureIsAlive(); 202 ensureIsValidColumn( nColumn ); 203 return isColumnBar() ? implIsColumnSelected( nColumn ) : sal_False; 204 } 205 206 Reference< XAccessible > SAL_CALL AccessibleBrowseBoxHeaderBar::getAccessibleCellAt( 207 sal_Int32 nRow, sal_Int32 nColumn ) 208 throw ( lang::IndexOutOfBoundsException, uno::RuntimeException ) 209 { 210 BBSolarGuard aSolarGuard; 211 ::osl::MutexGuard aGuard( getOslMutex() ); 212 ensureIsAlive(); 213 ensureIsValidAddress( nRow, nColumn ); 214 return implGetChild( nRow, implToVCLColumnPos( nColumn ) ); 215 } 216 217 sal_Bool SAL_CALL AccessibleBrowseBoxHeaderBar::isAccessibleSelected( 218 sal_Int32 nRow, sal_Int32 nColumn ) 219 throw ( lang::IndexOutOfBoundsException, uno::RuntimeException ) 220 { 221 BBSolarGuard aSolarGuard; 222 ::osl::MutexGuard aGuard( getOslMutex() ); 223 ensureIsAlive(); 224 ensureIsValidAddress( nRow, nColumn ); 225 return isRowBar() ? implIsRowSelected( nRow ) : implIsColumnSelected( nColumn ); 226 } 227 228 // XAccessibleSelection ------------------------------------------------------- 229 230 void SAL_CALL AccessibleBrowseBoxHeaderBar::selectAccessibleChild( sal_Int32 nChildIndex ) 231 throw ( lang::IndexOutOfBoundsException, uno::RuntimeException ) 232 { 233 BBSolarGuard aSolarGuard; 234 ::osl::MutexGuard aGuard( getOslMutex() ); 235 ensureIsAlive(); 236 ensureIsValidHeaderIndex( nChildIndex ); 237 if( isRowBar() ) 238 implSelectRow( nChildIndex, sal_True ); 239 else 240 implSelectColumn( implToVCLColumnPos( nChildIndex ), sal_True ); 241 } 242 243 sal_Bool SAL_CALL AccessibleBrowseBoxHeaderBar::isAccessibleChildSelected( sal_Int32 nChildIndex ) 244 throw ( lang::IndexOutOfBoundsException, uno::RuntimeException ) 245 { 246 // using interface methods - no mutex 247 return isRowBar() ? 248 isAccessibleRowSelected( nChildIndex ) : 249 isAccessibleColumnSelected( nChildIndex ); 250 } 251 252 void SAL_CALL AccessibleBrowseBoxHeaderBar::clearAccessibleSelection() 253 throw ( uno::RuntimeException ) 254 { 255 BBSolarGuard aSolarGuard; 256 ::osl::MutexGuard aGuard( getOslMutex() ); 257 ensureIsAlive(); 258 mpBrowseBox->SetNoSelection(); 259 } 260 261 void SAL_CALL AccessibleBrowseBoxHeaderBar::selectAllAccessibleChildren() 262 throw ( uno::RuntimeException ) 263 { 264 BBSolarGuard aSolarGuard; 265 ::osl::MutexGuard aGuard( getOslMutex() ); 266 ensureIsAlive(); 267 // no multiselection of columns possible 268 if( isRowBar() ) 269 mpBrowseBox->SelectAll(); 270 else 271 implSelectColumn( implToVCLColumnPos( 0 ), sal_True ); 272 } 273 274 sal_Int32 SAL_CALL AccessibleBrowseBoxHeaderBar::getSelectedAccessibleChildCount() 275 throw ( uno::RuntimeException ) 276 { 277 BBSolarGuard aSolarGuard; 278 ::osl::MutexGuard aGuard( getOslMutex() ); 279 ensureIsAlive(); 280 return isRowBar() ? implGetSelectedRowCount() : implGetSelectedColumnCount(); 281 } 282 283 Reference< XAccessible > SAL_CALL 284 AccessibleBrowseBoxHeaderBar::getSelectedAccessibleChild( sal_Int32 nSelectedChildIndex ) 285 throw ( lang::IndexOutOfBoundsException, uno::RuntimeException ) 286 { 287 BBSolarGuard aSolarGuard; 288 ::osl::MutexGuard aGuard( getOslMutex() ); 289 ensureIsAlive(); 290 291 // method may throw lang::IndexOutOfBoundsException 292 sal_Int32 nIndex = implGetChildIndexFromSelectedIndex( nSelectedChildIndex ); 293 return implGetChild( nIndex, implToVCLColumnPos( nIndex ) ); 294 } 295 296 void SAL_CALL AccessibleBrowseBoxHeaderBar::deselectAccessibleChild( 297 sal_Int32 nSelectedChildIndex ) 298 throw ( lang::IndexOutOfBoundsException, uno::RuntimeException ) 299 { 300 BBSolarGuard aSolarGuard; 301 ::osl::MutexGuard aGuard( getOslMutex() ); 302 ensureIsAlive(); 303 304 // method may throw lang::IndexOutOfBoundsException 305 if ( isAccessibleChildSelected(nSelectedChildIndex) ) 306 { 307 if( isRowBar() ) 308 implSelectRow( nSelectedChildIndex, sal_False ); 309 else 310 implSelectColumn( implToVCLColumnPos( nSelectedChildIndex ), sal_False ); 311 } 312 } 313 314 // XInterface ----------------------------------------------------------------- 315 316 Any SAL_CALL AccessibleBrowseBoxHeaderBar::queryInterface( const uno::Type& rType ) 317 throw ( uno::RuntimeException ) 318 { 319 Any aAny( AccessibleBrowseBoxTableBase::queryInterface( rType ) ); 320 return aAny.hasValue() ? 321 aAny : AccessibleBrowseBoxHeaderBarImplHelper::queryInterface( rType ); 322 } 323 324 void SAL_CALL AccessibleBrowseBoxHeaderBar::acquire() throw () 325 { 326 AccessibleBrowseBoxTableBase::acquire(); 327 } 328 329 void SAL_CALL AccessibleBrowseBoxHeaderBar::release() throw () 330 { 331 AccessibleBrowseBoxTableBase::release(); 332 } 333 334 // XServiceInfo --------------------------------------------------------------- 335 336 OUString SAL_CALL AccessibleBrowseBoxHeaderBar::getImplementationName() 337 throw ( uno::RuntimeException ) 338 { 339 return OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.svtools.AccessibleBrowseBoxHeaderBar" ) ); 340 } 341 342 Sequence< sal_Int8 > SAL_CALL AccessibleBrowseBoxHeaderBar::getImplementationId() 343 throw ( uno::RuntimeException ) 344 { 345 ::osl::MutexGuard aGuard( getOslGlobalMutex() ); 346 static Sequence< sal_Int8 > aId; 347 implCreateUuid( aId ); 348 return aId; 349 } 350 351 // internal virtual methods --------------------------------------------------- 352 353 Rectangle AccessibleBrowseBoxHeaderBar::implGetBoundingBox() 354 { 355 return mpBrowseBox->calcHeaderRect(isColumnBar(),sal_False); 356 } 357 358 Rectangle AccessibleBrowseBoxHeaderBar::implGetBoundingBoxOnScreen() 359 { 360 return mpBrowseBox->calcHeaderRect(isColumnBar(),sal_True); 361 } 362 363 sal_Int32 AccessibleBrowseBoxHeaderBar::implGetRowCount() const 364 { 365 // column header bar: only 1 row 366 return isRowBar() ? AccessibleBrowseBoxTableBase::implGetRowCount() : 1; 367 } 368 369 sal_Int32 AccessibleBrowseBoxHeaderBar::implGetColumnCount() const 370 { 371 // row header bar ("handle column"): only 1 column 372 return isColumnBar() ? AccessibleBrowseBoxTableBase::implGetColumnCount() : 1; 373 } 374 375 // internal helper methods ---------------------------------------------------- 376 377 Reference< XAccessible > AccessibleBrowseBoxHeaderBar::implGetChild( 378 sal_Int32 nRow, sal_uInt16 nColumnPos ) 379 { 380 return isRowBar() ? 381 mpBrowseBox->CreateAccessibleRowHeader( nRow ) : 382 mpBrowseBox->CreateAccessibleColumnHeader( nColumnPos ); 383 } 384 385 sal_Int32 AccessibleBrowseBoxHeaderBar::implGetChildIndexFromSelectedIndex( 386 sal_Int32 nSelectedChildIndex ) 387 throw ( lang::IndexOutOfBoundsException ) 388 { 389 Sequence< sal_Int32 > aSelSeq; 390 if( isRowBar() ) 391 implGetSelectedRows( aSelSeq ); 392 else 393 implGetSelectedColumns( aSelSeq ); 394 395 if( (nSelectedChildIndex < 0) || (nSelectedChildIndex >= aSelSeq.getLength()) ) 396 throw lang::IndexOutOfBoundsException(); 397 398 return aSelSeq[ nSelectedChildIndex ]; 399 } 400 401 void AccessibleBrowseBoxHeaderBar::ensureIsValidHeaderIndex( sal_Int32 nIndex ) 402 throw ( lang::IndexOutOfBoundsException ) 403 { 404 if( isRowBar() ) 405 ensureIsValidRow( nIndex ); 406 else 407 ensureIsValidColumn( nIndex ); 408 } 409 410 // ============================================================================ 411 412 } // namespace accessibility 413 414 // ============================================================================ 415 416