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 
DBG_NAME(AccessibleBrowseBoxTableBase)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 
~AccessibleBrowseBoxTableBase()64 AccessibleBrowseBoxTableBase::~AccessibleBrowseBoxTableBase()
65 {
66     DBG_DTOR( AccessibleBrowseBoxTableBase, NULL );
67 }
68 
69 // XAccessibleContext ---------------------------------------------------------
70 
getAccessibleChildCount()71 sal_Int32 SAL_CALL AccessibleBrowseBoxTableBase::getAccessibleChildCount()
72     throw ( uno::RuntimeException )
73 {
74     BBSolarGuard aSolarGuard;
75     ::osl::MutexGuard aGuard( getOslMutex() );
76     ensureIsAlive();
77     return implGetChildCount();
78 }
79 
getAccessibleRole()80 sal_Int16 SAL_CALL AccessibleBrowseBoxTableBase::getAccessibleRole()
81     throw ( uno::RuntimeException )
82 {
83     ensureIsAlive();
84     return AccessibleRole::TABLE;
85 }
86 
87 // XAccessibleTable -----------------------------------------------------------
88 
getAccessibleRowCount()89 sal_Int32 SAL_CALL AccessibleBrowseBoxTableBase::getAccessibleRowCount()
90     throw ( uno::RuntimeException )
91 {
92     BBSolarGuard aSolarGuard;
93     ::osl::MutexGuard aGuard( getOslMutex() );
94     ensureIsAlive();
95     return implGetRowCount();
96 }
97 
getAccessibleColumnCount()98 sal_Int32 SAL_CALL AccessibleBrowseBoxTableBase::getAccessibleColumnCount()
99     throw ( uno::RuntimeException )
100 {
101     BBSolarGuard aSolarGuard;
102     ::osl::MutexGuard aGuard( getOslMutex() );
103     ensureIsAlive();
104     return implGetColumnCount();
105 }
106 
getAccessibleRowExtentAt(sal_Int32 nRow,sal_Int32 nColumn)107 sal_Int32 SAL_CALL AccessibleBrowseBoxTableBase::getAccessibleRowExtentAt(
108         sal_Int32 nRow, sal_Int32 nColumn )
109     throw ( lang::IndexOutOfBoundsException, uno::RuntimeException )
110 {
111     BBSolarGuard aSolarGuard;
112     ::osl::MutexGuard aGuard( getOslMutex() );
113     ensureIsAlive();
114     ensureIsValidAddress( nRow, nColumn );
115     return 1;   // merged cells not supported
116 }
117 
getAccessibleColumnExtentAt(sal_Int32 nRow,sal_Int32 nColumn)118 sal_Int32 SAL_CALL AccessibleBrowseBoxTableBase::getAccessibleColumnExtentAt(
119         sal_Int32 nRow, sal_Int32 nColumn )
120     throw ( lang::IndexOutOfBoundsException, uno::RuntimeException )
121 {
122     BBSolarGuard aSolarGuard;
123     ::osl::MutexGuard aGuard( getOslMutex() );
124     ensureIsAlive();
125     ensureIsValidAddress( nRow, nColumn );
126     return 1;   // merged cells not supported
127 }
128 
getAccessibleCaption()129 Reference< XAccessible > SAL_CALL AccessibleBrowseBoxTableBase::getAccessibleCaption()
130     throw ( uno::RuntimeException )
131 {
132     ensureIsAlive();
133     return NULL;    // not supported
134 }
135 
getAccessibleSummary()136 Reference< XAccessible > SAL_CALL AccessibleBrowseBoxTableBase::getAccessibleSummary()
137     throw ( uno::RuntimeException )
138 {
139     ensureIsAlive();
140     return NULL;    // not supported
141 }
142 
getAccessibleIndex(sal_Int32 nRow,sal_Int32 nColumn)143 sal_Int32 SAL_CALL AccessibleBrowseBoxTableBase::getAccessibleIndex(
144         sal_Int32 nRow, sal_Int32 nColumn )
145     throw ( lang::IndexOutOfBoundsException, uno::RuntimeException )
146 {
147     BBSolarGuard aSolarGuard;
148     ::osl::MutexGuard aGuard( getOslMutex() );
149     ensureIsAlive();
150     ensureIsValidAddress( nRow, nColumn );
151     return implGetChildIndex( nRow, nColumn );
152 }
153 
getAccessibleRow(sal_Int32 nChildIndex)154 sal_Int32 SAL_CALL AccessibleBrowseBoxTableBase::getAccessibleRow( sal_Int32 nChildIndex )
155     throw ( lang::IndexOutOfBoundsException, uno::RuntimeException )
156 {
157     BBSolarGuard aSolarGuard;
158     ::osl::MutexGuard aGuard( getOslMutex() );
159     ensureIsAlive();
160     ensureIsValidIndex( nChildIndex );
161     return implGetRow( nChildIndex );
162 }
163 
getAccessibleColumn(sal_Int32 nChildIndex)164 sal_Int32 SAL_CALL AccessibleBrowseBoxTableBase::getAccessibleColumn( sal_Int32 nChildIndex )
165     throw ( lang::IndexOutOfBoundsException, uno::RuntimeException )
166 {
167     BBSolarGuard aSolarGuard;
168     ::osl::MutexGuard aGuard( getOslMutex() );
169     ensureIsAlive();
170     ensureIsValidIndex( nChildIndex );
171     return implGetColumn( nChildIndex );
172 }
173 
174 // XInterface -----------------------------------------------------------------
175 
queryInterface(const uno::Type & rType)176 Any SAL_CALL AccessibleBrowseBoxTableBase::queryInterface( const uno::Type& rType )
177     throw ( uno::RuntimeException )
178 {
179     Any aAny( BrowseBoxAccessibleElement::queryInterface( rType ) );
180     return aAny.hasValue() ?
181         aAny : AccessibleBrowseBoxTableImplHelper::queryInterface( rType );
182 }
183 
acquire()184 void SAL_CALL AccessibleBrowseBoxTableBase::acquire() throw ()
185 {
186     BrowseBoxAccessibleElement::acquire();
187 }
188 
release()189 void SAL_CALL AccessibleBrowseBoxTableBase::release() throw ()
190 {
191     BrowseBoxAccessibleElement::release();
192 }
193 
194 // XTypeProvider --------------------------------------------------------------
195 
getTypes()196 Sequence< uno::Type > SAL_CALL AccessibleBrowseBoxTableBase::getTypes()
197     throw ( uno::RuntimeException )
198 {
199     return ::comphelper::concatSequences(
200         BrowseBoxAccessibleElement::getTypes(),
201         AccessibleBrowseBoxTableImplHelper::getTypes() );
202 }
203 
getImplementationId()204 Sequence< sal_Int8 > SAL_CALL AccessibleBrowseBoxTableBase::getImplementationId()
205     throw ( uno::RuntimeException )
206 {
207     ::osl::MutexGuard aGuard( getOslGlobalMutex() );
208     static Sequence< sal_Int8 > aId;
209     implCreateUuid( aId );
210 	return aId;
211 }
212 
213 // internal virtual methods ---------------------------------------------------
214 
implGetRowCount() const215 sal_Int32 AccessibleBrowseBoxTableBase::implGetRowCount() const
216 {
217     return mpBrowseBox->GetRowCount();
218 }
219 
implGetColumnCount() const220 sal_Int32 AccessibleBrowseBoxTableBase::implGetColumnCount() const
221 {
222     sal_uInt16 nColumns = mpBrowseBox->GetColumnCount();
223     // do not count the "handle column"
224     if( nColumns && implHasHandleColumn() )
225         --nColumns;
226     return nColumns;
227 }
228 
229 // internal helper methods ----------------------------------------------------
230 
implHasHandleColumn() const231 sal_Bool AccessibleBrowseBoxTableBase::implHasHandleColumn() const
232 {
233     return mpBrowseBox->HasRowHeader();
234 }
235 
implToVCLColumnPos(sal_Int32 nColumn) const236 sal_uInt16 AccessibleBrowseBoxTableBase::implToVCLColumnPos( sal_Int32 nColumn ) const
237 {
238     sal_uInt16 nVCLPos = 0;
239     if( (0 <= nColumn) && (nColumn < implGetColumnCount()) )
240     {
241         // regard "handle column"
242         if( implHasHandleColumn() )
243             ++nColumn;
244         nVCLPos = static_cast< sal_uInt16 >( nColumn );
245     }
246     return nVCLPos;
247 }
248 
implGetChildCount() const249 sal_Int32 AccessibleBrowseBoxTableBase::implGetChildCount() const
250 {
251     return implGetRowCount() * implGetColumnCount();
252 }
253 
implGetRow(sal_Int32 nChildIndex) const254 sal_Int32 AccessibleBrowseBoxTableBase::implGetRow( sal_Int32 nChildIndex ) const
255 {
256     sal_Int32 nColumns = implGetColumnCount();
257     return nColumns ? (nChildIndex / nColumns) : 0;
258 }
259 
implGetColumn(sal_Int32 nChildIndex) const260 sal_Int32 AccessibleBrowseBoxTableBase::implGetColumn( sal_Int32 nChildIndex ) const
261 {
262     sal_Int32 nColumns = implGetColumnCount();
263     return nColumns ? (nChildIndex % nColumns) : 0;
264 }
265 
implGetChildIndex(sal_Int32 nRow,sal_Int32 nColumn) const266 sal_Int32 AccessibleBrowseBoxTableBase::implGetChildIndex(
267         sal_Int32 nRow, sal_Int32 nColumn ) const
268 {
269     return nRow * implGetColumnCount() + nColumn;
270 }
271 
implIsRowSelected(sal_Int32 nRow) const272 sal_Bool AccessibleBrowseBoxTableBase::implIsRowSelected( sal_Int32 nRow ) const
273 {
274     return mpBrowseBox->IsRowSelected( nRow );
275 }
276 
implIsColumnSelected(sal_Int32 nColumn) const277 sal_Bool AccessibleBrowseBoxTableBase::implIsColumnSelected( sal_Int32 nColumn ) const
278 {
279     if( implHasHandleColumn() )
280         --nColumn;
281     return mpBrowseBox->IsColumnSelected( nColumn );
282 }
283 
implSelectRow(sal_Int32 nRow,sal_Bool bSelect)284 void AccessibleBrowseBoxTableBase::implSelectRow( sal_Int32 nRow, sal_Bool bSelect )
285 {
286     mpBrowseBox->SelectRow( nRow, bSelect, sal_True );
287 }
288 
implSelectColumn(sal_Int32 nColumnPos,sal_Bool bSelect)289 void AccessibleBrowseBoxTableBase::implSelectColumn( sal_Int32 nColumnPos, sal_Bool bSelect )
290 {
291     mpBrowseBox->SelectColumn( (sal_uInt16)nColumnPos, bSelect );
292 }
293 
implGetSelectedRowCount() const294 sal_Int32 AccessibleBrowseBoxTableBase::implGetSelectedRowCount() const
295 {
296     return mpBrowseBox->GetSelectedRowCount();
297 }
298 
implGetSelectedColumnCount() const299 sal_Int32 AccessibleBrowseBoxTableBase::implGetSelectedColumnCount() const
300 {
301     return mpBrowseBox->GetSelectedColumnCount();
302 }
303 
implGetSelectedRows(Sequence<sal_Int32> & rSeq)304 void AccessibleBrowseBoxTableBase::implGetSelectedRows( Sequence< sal_Int32 >& rSeq )
305 {
306     mpBrowseBox->GetAllSelectedRows( rSeq );
307 }
308 
implGetSelectedColumns(Sequence<sal_Int32> & rSeq)309 void AccessibleBrowseBoxTableBase::implGetSelectedColumns( Sequence< sal_Int32 >& rSeq )
310 {
311 	mpBrowseBox->GetAllSelectedColumns( rSeq );
312 }
313 
ensureIsValidRow(sal_Int32 nRow)314 void AccessibleBrowseBoxTableBase::ensureIsValidRow( sal_Int32 nRow )
315     throw ( lang::IndexOutOfBoundsException )
316 {
317     if( nRow >= implGetRowCount() )
318         throw lang::IndexOutOfBoundsException(
319             OUString( RTL_CONSTASCII_USTRINGPARAM( "row index is invalid" ) ), *this );
320 }
321 
ensureIsValidColumn(sal_Int32 nColumn)322 void AccessibleBrowseBoxTableBase::ensureIsValidColumn( sal_Int32 nColumn )
323     throw ( lang::IndexOutOfBoundsException )
324 {
325     if( nColumn >= implGetColumnCount() )
326         throw lang::IndexOutOfBoundsException(
327             OUString( RTL_CONSTASCII_USTRINGPARAM("column index is invalid") ), *this );
328 }
329 
ensureIsValidAddress(sal_Int32 nRow,sal_Int32 nColumn)330 void AccessibleBrowseBoxTableBase::ensureIsValidAddress(
331         sal_Int32 nRow, sal_Int32 nColumn )
332     throw ( lang::IndexOutOfBoundsException )
333 {
334     ensureIsValidRow( nRow );
335     ensureIsValidColumn( nColumn );
336 }
337 
ensureIsValidIndex(sal_Int32 nChildIndex)338 void AccessibleBrowseBoxTableBase::ensureIsValidIndex( sal_Int32 nChildIndex )
339     throw ( lang::IndexOutOfBoundsException )
340 {
341     if( nChildIndex >= implGetChildCount() )
342         throw lang::IndexOutOfBoundsException(
343             OUString( RTL_CONSTASCII_USTRINGPARAM("child index is invalid") ), *this );
344 }
345 
346 // ============================================================================
347 
348 } // namespace accessibility
349 
350 // ============================================================================
351 
352