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/AccessibleBrowseBoxTableBase.hxx" 29 #include <svtools/accessibletableprovider.hxx> 30 #include <tools/multisel.hxx> 31 #include <comphelper/sequence.hxx> 32 33 // ============================================================================ 34 35 using ::rtl::OUString; 36 37 using ::com::sun::star::uno::Reference; 38 using ::com::sun::star::uno::Sequence; 39 using ::com::sun::star::uno::Any; 40 41 using namespace ::com::sun::star; 42 using namespace ::com::sun::star::accessibility; 43 using namespace ::svt; 44 45 // ============================================================================ 46 47 namespace accessibility { 48 49 // ============================================================================ 50 51 // Ctor/Dtor/disposing -------------------------------------------------------- 52 53 DBG_NAME( AccessibleBrowseBoxTableBase ) 54 55 AccessibleBrowseBoxTableBase::AccessibleBrowseBoxTableBase( 56 const Reference< XAccessible >& rxParent, 57 IAccessibleTableProvider& rBrowseBox, 58 AccessibleBrowseBoxObjType eObjType ) : 59 BrowseBoxAccessibleElement( rxParent, rBrowseBox,NULL, eObjType ) 60 { 61 DBG_CTOR( AccessibleBrowseBoxTableBase, NULL ); 62 } 63 64 AccessibleBrowseBoxTableBase::~AccessibleBrowseBoxTableBase() 65 { 66 DBG_DTOR( AccessibleBrowseBoxTableBase, NULL ); 67 } 68 69 // XAccessibleContext --------------------------------------------------------- 70 71 sal_Int32 SAL_CALL AccessibleBrowseBoxTableBase::getAccessibleChildCount() 72 { 73 BBSolarGuard aSolarGuard; 74 ::osl::MutexGuard aGuard( getOslMutex() ); 75 ensureIsAlive(); 76 return implGetChildCount(); 77 } 78 79 sal_Int16 SAL_CALL AccessibleBrowseBoxTableBase::getAccessibleRole() 80 { 81 ensureIsAlive(); 82 return AccessibleRole::TABLE; 83 } 84 85 // XAccessibleTable ----------------------------------------------------------- 86 87 sal_Int32 SAL_CALL AccessibleBrowseBoxTableBase::getAccessibleRowCount() 88 { 89 BBSolarGuard aSolarGuard; 90 ::osl::MutexGuard aGuard( getOslMutex() ); 91 ensureIsAlive(); 92 return implGetRowCount(); 93 } 94 95 sal_Int32 SAL_CALL AccessibleBrowseBoxTableBase::getAccessibleColumnCount() 96 { 97 BBSolarGuard aSolarGuard; 98 ::osl::MutexGuard aGuard( getOslMutex() ); 99 ensureIsAlive(); 100 return implGetColumnCount(); 101 } 102 103 sal_Int32 SAL_CALL AccessibleBrowseBoxTableBase::getAccessibleRowExtentAt( 104 sal_Int32 nRow, sal_Int32 nColumn ) 105 { 106 BBSolarGuard aSolarGuard; 107 ::osl::MutexGuard aGuard( getOslMutex() ); 108 ensureIsAlive(); 109 ensureIsValidAddress( nRow, nColumn ); 110 return 1; // merged cells not supported 111 } 112 113 sal_Int32 SAL_CALL AccessibleBrowseBoxTableBase::getAccessibleColumnExtentAt( 114 sal_Int32 nRow, sal_Int32 nColumn ) 115 { 116 BBSolarGuard aSolarGuard; 117 ::osl::MutexGuard aGuard( getOslMutex() ); 118 ensureIsAlive(); 119 ensureIsValidAddress( nRow, nColumn ); 120 return 1; // merged cells not supported 121 } 122 123 Reference< XAccessible > SAL_CALL AccessibleBrowseBoxTableBase::getAccessibleCaption() 124 { 125 ensureIsAlive(); 126 return NULL; // not supported 127 } 128 129 Reference< XAccessible > SAL_CALL AccessibleBrowseBoxTableBase::getAccessibleSummary() 130 { 131 ensureIsAlive(); 132 return NULL; // not supported 133 } 134 135 sal_Int32 SAL_CALL AccessibleBrowseBoxTableBase::getAccessibleIndex( 136 sal_Int32 nRow, sal_Int32 nColumn ) 137 { 138 BBSolarGuard aSolarGuard; 139 ::osl::MutexGuard aGuard( getOslMutex() ); 140 ensureIsAlive(); 141 ensureIsValidAddress( nRow, nColumn ); 142 return implGetChildIndex( nRow, nColumn ); 143 } 144 145 sal_Int32 SAL_CALL AccessibleBrowseBoxTableBase::getAccessibleRow( sal_Int32 nChildIndex ) 146 { 147 BBSolarGuard aSolarGuard; 148 ::osl::MutexGuard aGuard( getOslMutex() ); 149 ensureIsAlive(); 150 ensureIsValidIndex( nChildIndex ); 151 return implGetRow( nChildIndex ); 152 } 153 154 sal_Int32 SAL_CALL AccessibleBrowseBoxTableBase::getAccessibleColumn( sal_Int32 nChildIndex ) 155 { 156 BBSolarGuard aSolarGuard; 157 ::osl::MutexGuard aGuard( getOslMutex() ); 158 ensureIsAlive(); 159 ensureIsValidIndex( nChildIndex ); 160 return implGetColumn( nChildIndex ); 161 } 162 163 // XInterface ----------------------------------------------------------------- 164 165 Any SAL_CALL AccessibleBrowseBoxTableBase::queryInterface( const uno::Type& rType ) 166 { 167 Any aAny( BrowseBoxAccessibleElement::queryInterface( rType ) ); 168 return aAny.hasValue() ? 169 aAny : AccessibleBrowseBoxTableImplHelper::queryInterface( rType ); 170 } 171 172 void SAL_CALL AccessibleBrowseBoxTableBase::acquire() throw () 173 { 174 BrowseBoxAccessibleElement::acquire(); 175 } 176 177 void SAL_CALL AccessibleBrowseBoxTableBase::release() throw () 178 { 179 BrowseBoxAccessibleElement::release(); 180 } 181 182 // XTypeProvider -------------------------------------------------------------- 183 184 Sequence< uno::Type > SAL_CALL AccessibleBrowseBoxTableBase::getTypes() 185 { 186 return ::comphelper::concatSequences( 187 BrowseBoxAccessibleElement::getTypes(), 188 AccessibleBrowseBoxTableImplHelper::getTypes() ); 189 } 190 191 Sequence< sal_Int8 > SAL_CALL AccessibleBrowseBoxTableBase::getImplementationId() 192 { 193 ::osl::MutexGuard aGuard( getOslGlobalMutex() ); 194 static Sequence< sal_Int8 > aId; 195 implCreateUuid( aId ); 196 return aId; 197 } 198 199 // internal virtual methods --------------------------------------------------- 200 201 sal_Int32 AccessibleBrowseBoxTableBase::implGetRowCount() const 202 { 203 return mpBrowseBox->GetRowCount(); 204 } 205 206 sal_Int32 AccessibleBrowseBoxTableBase::implGetColumnCount() const 207 { 208 sal_uInt16 nColumns = mpBrowseBox->GetColumnCount(); 209 // do not count the "handle column" 210 if( nColumns && implHasHandleColumn() ) 211 --nColumns; 212 return nColumns; 213 } 214 215 // internal helper methods ---------------------------------------------------- 216 217 sal_Bool AccessibleBrowseBoxTableBase::implHasHandleColumn() const 218 { 219 return mpBrowseBox->HasRowHeader(); 220 } 221 222 sal_uInt16 AccessibleBrowseBoxTableBase::implToVCLColumnPos( sal_Int32 nColumn ) const 223 { 224 sal_uInt16 nVCLPos = 0; 225 if( (0 <= nColumn) && (nColumn < implGetColumnCount()) ) 226 { 227 // regard "handle column" 228 if( implHasHandleColumn() ) 229 ++nColumn; 230 nVCLPos = static_cast< sal_uInt16 >( nColumn ); 231 } 232 return nVCLPos; 233 } 234 235 sal_Int32 AccessibleBrowseBoxTableBase::implGetChildCount() const 236 { 237 return implGetRowCount() * implGetColumnCount(); 238 } 239 240 sal_Int32 AccessibleBrowseBoxTableBase::implGetRow( sal_Int32 nChildIndex ) const 241 { 242 sal_Int32 nColumns = implGetColumnCount(); 243 return nColumns ? (nChildIndex / nColumns) : 0; 244 } 245 246 sal_Int32 AccessibleBrowseBoxTableBase::implGetColumn( sal_Int32 nChildIndex ) const 247 { 248 sal_Int32 nColumns = implGetColumnCount(); 249 return nColumns ? (nChildIndex % nColumns) : 0; 250 } 251 252 sal_Int32 AccessibleBrowseBoxTableBase::implGetChildIndex( 253 sal_Int32 nRow, sal_Int32 nColumn ) const 254 { 255 return nRow * implGetColumnCount() + nColumn; 256 } 257 258 sal_Bool AccessibleBrowseBoxTableBase::implIsRowSelected( sal_Int32 nRow ) const 259 { 260 return mpBrowseBox->IsRowSelected( nRow ); 261 } 262 263 sal_Bool AccessibleBrowseBoxTableBase::implIsColumnSelected( sal_Int32 nColumn ) const 264 { 265 if( implHasHandleColumn() ) 266 --nColumn; 267 return mpBrowseBox->IsColumnSelected( nColumn ); 268 } 269 270 void AccessibleBrowseBoxTableBase::implSelectRow( sal_Int32 nRow, sal_Bool bSelect ) 271 { 272 mpBrowseBox->SelectRow( nRow, bSelect, sal_True ); 273 } 274 275 void AccessibleBrowseBoxTableBase::implSelectColumn( sal_Int32 nColumnPos, sal_Bool bSelect ) 276 { 277 mpBrowseBox->SelectColumn( (sal_uInt16)nColumnPos, bSelect ); 278 } 279 280 sal_Int32 AccessibleBrowseBoxTableBase::implGetSelectedRowCount() const 281 { 282 return mpBrowseBox->GetSelectedRowCount(); 283 } 284 285 sal_Int32 AccessibleBrowseBoxTableBase::implGetSelectedColumnCount() const 286 { 287 return mpBrowseBox->GetSelectedColumnCount(); 288 } 289 290 void AccessibleBrowseBoxTableBase::implGetSelectedRows( Sequence< sal_Int32 >& rSeq ) 291 { 292 mpBrowseBox->GetAllSelectedRows( rSeq ); 293 } 294 295 void AccessibleBrowseBoxTableBase::implGetSelectedColumns( Sequence< sal_Int32 >& rSeq ) 296 { 297 mpBrowseBox->GetAllSelectedColumns( rSeq ); 298 } 299 300 void AccessibleBrowseBoxTableBase::ensureIsValidRow( sal_Int32 nRow ) 301 { 302 if( nRow >= implGetRowCount() ) 303 throw lang::IndexOutOfBoundsException( 304 OUString( RTL_CONSTASCII_USTRINGPARAM( "row index is invalid" ) ), *this ); 305 } 306 307 void AccessibleBrowseBoxTableBase::ensureIsValidColumn( sal_Int32 nColumn ) 308 { 309 if( nColumn >= implGetColumnCount() ) 310 throw lang::IndexOutOfBoundsException( 311 OUString( RTL_CONSTASCII_USTRINGPARAM("column index is invalid") ), *this ); 312 } 313 314 void AccessibleBrowseBoxTableBase::ensureIsValidAddress( 315 sal_Int32 nRow, sal_Int32 nColumn ) 316 { 317 ensureIsValidRow( nRow ); 318 ensureIsValidColumn( nColumn ); 319 } 320 321 void AccessibleBrowseBoxTableBase::ensureIsValidIndex( sal_Int32 nChildIndex ) 322 { 323 if( nChildIndex >= implGetChildCount() ) 324 throw lang::IndexOutOfBoundsException( 325 OUString( RTL_CONSTASCII_USTRINGPARAM("child index is invalid") ), *this ); 326 } 327 328 // ============================================================================ 329 } // namespace accessibility 330 // ============================================================================ 331