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/AccessibleGridControlTableBase.hxx"
29 #include <svtools/accessibletable.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 using namespace ::svt::table;
45 
46 // ============================================================================
47 
48 namespace accessibility {
49 
50 // ============================================================================
51 
52 DBG_NAME( AccessibleGridControlTableBase )
53 
54 AccessibleGridControlTableBase::AccessibleGridControlTableBase(
55         const Reference< XAccessible >& rxParent,
56         IAccessibleTable& rTable,
57         AccessibleTableControlObjType eObjType ) :
58     GridControlAccessibleElement( rxParent, rTable, eObjType )
59 {
60 }
61 
62 AccessibleGridControlTableBase::~AccessibleGridControlTableBase()
63 {
64 }
65 
66 // XAccessibleContext ---------------------------------------------------------
67 
68 sal_Int32 SAL_CALL AccessibleGridControlTableBase::getAccessibleChildCount()
69     throw ( uno::RuntimeException )
70 {
71     TCSolarGuard aSolarGuard;
72     ::osl::MutexGuard aGuard( getOslMutex() );
73     ensureIsAlive();
74     sal_Int32 nChildren = 0;
75     if(m_eObjType == TCTYPE_ROWHEADERBAR)
76 	    nChildren = m_aTable.GetRowCount();
77     else if(m_eObjType == TCTYPE_TABLE)
78 	    nChildren = m_aTable.GetRowCount()*m_aTable.GetColumnCount();
79     else if(m_eObjType == TCTYPE_COLUMNHEADERBAR)
80 	    nChildren = m_aTable.GetColumnCount();
81     return nChildren;
82 }
83 
84 sal_Int16 SAL_CALL AccessibleGridControlTableBase::getAccessibleRole()
85     throw ( uno::RuntimeException )
86 {
87     ensureIsAlive();
88     return AccessibleRole::TABLE;
89 }
90 
91 // XAccessibleTable -----------------------------------------------------------
92 
93 sal_Int32 SAL_CALL AccessibleGridControlTableBase::getAccessibleRowCount()
94     throw ( uno::RuntimeException )
95 {
96     TCSolarGuard aSolarGuard;
97     ::osl::MutexGuard aGuard( getOslMutex() );
98     ensureIsAlive();
99     return  m_aTable.GetRowCount();
100 }
101 
102 sal_Int32 SAL_CALL AccessibleGridControlTableBase::getAccessibleColumnCount()
103     throw ( uno::RuntimeException )
104 {
105     TCSolarGuard aSolarGuard;
106     ::osl::MutexGuard aGuard( getOslMutex() );
107     ensureIsAlive();
108     return m_aTable.GetColumnCount();
109 }
110 
111 sal_Int32 SAL_CALL AccessibleGridControlTableBase::getAccessibleRowExtentAt(
112         sal_Int32 nRow, sal_Int32 nColumn )
113     throw ( lang::IndexOutOfBoundsException, uno::RuntimeException )
114 {
115     TCSolarGuard aSolarGuard;
116     ::osl::MutexGuard aGuard( getOslMutex() );
117     ensureIsAlive();
118     ensureIsValidAddress( nRow, nColumn );
119     return 1;   // merged cells not supported
120 }
121 
122 sal_Int32 SAL_CALL AccessibleGridControlTableBase::getAccessibleColumnExtentAt(
123         sal_Int32 nRow, sal_Int32 nColumn )
124     throw ( lang::IndexOutOfBoundsException, uno::RuntimeException )
125 {
126     TCSolarGuard aSolarGuard;
127     ::osl::MutexGuard aGuard( getOslMutex() );
128     ensureIsAlive();
129     ensureIsValidAddress( nRow, nColumn );
130     return 1;   // merged cells not supported
131 }
132 
133 Reference< XAccessible > SAL_CALL AccessibleGridControlTableBase::getAccessibleCaption()
134     throw ( uno::RuntimeException )
135 {
136     ensureIsAlive();
137     return NULL;    // not supported
138 }
139 
140 Reference< XAccessible > SAL_CALL AccessibleGridControlTableBase::getAccessibleSummary()
141     throw ( uno::RuntimeException )
142 {
143     ensureIsAlive();
144     return NULL;    // not supported
145 }
146 
147 sal_Int32 SAL_CALL AccessibleGridControlTableBase::getAccessibleIndex(
148         sal_Int32 nRow, sal_Int32 nColumn )
149     throw ( lang::IndexOutOfBoundsException, uno::RuntimeException )
150 {
151     TCSolarGuard aSolarGuard;
152     ::osl::MutexGuard aGuard( getOslMutex() );
153     ensureIsAlive();
154     ensureIsValidAddress( nRow, nColumn );
155     return implGetChildIndex( nRow, nColumn );
156 }
157 
158 sal_Int32 SAL_CALL AccessibleGridControlTableBase::getAccessibleRow( sal_Int32 nChildIndex )
159     throw ( lang::IndexOutOfBoundsException, uno::RuntimeException )
160 {
161     TCSolarGuard aSolarGuard;
162     ::osl::MutexGuard aGuard( getOslMutex() );
163     ensureIsAlive();
164     ensureIsValidIndex( nChildIndex );
165     return implGetRow( nChildIndex );
166 }
167 
168 sal_Int32 SAL_CALL AccessibleGridControlTableBase::getAccessibleColumn( sal_Int32 nChildIndex )
169     throw ( lang::IndexOutOfBoundsException, uno::RuntimeException )
170 {
171     TCSolarGuard aSolarGuard;
172     ::osl::MutexGuard aGuard( getOslMutex() );
173     ensureIsAlive();
174     ensureIsValidIndex( nChildIndex );
175     return implGetColumn( nChildIndex );
176 }
177 
178 // XInterface -----------------------------------------------------------------
179 
180 Any SAL_CALL AccessibleGridControlTableBase::queryInterface( const uno::Type& rType )
181     throw ( uno::RuntimeException )
182 {
183     Any aAny( GridControlAccessibleElement::queryInterface( rType ) );
184     return aAny.hasValue() ?
185         aAny : AccessibleGridControlTableImplHelper::queryInterface( rType );
186 }
187 
188 void SAL_CALL AccessibleGridControlTableBase::acquire() throw ()
189 {
190     GridControlAccessibleElement::acquire();
191 }
192 
193 void SAL_CALL AccessibleGridControlTableBase::release() throw ()
194 {
195     GridControlAccessibleElement::release();
196 }
197 
198 // XTypeProvider --------------------------------------------------------------
199 
200 Sequence< uno::Type > SAL_CALL AccessibleGridControlTableBase::getTypes()
201     throw ( uno::RuntimeException )
202 {
203     return ::comphelper::concatSequences(
204         GridControlAccessibleElement::getTypes(),
205         AccessibleGridControlTableImplHelper::getTypes() );
206 }
207 
208 Sequence< sal_Int8 > SAL_CALL AccessibleGridControlTableBase::getImplementationId()
209     throw ( uno::RuntimeException )
210 {
211     ::osl::MutexGuard aGuard( getOslGlobalMutex() );
212     static Sequence< sal_Int8 > aId;
213     implCreateUuid( aId );
214     return aId;
215 }
216 
217 // internal helper methods ----------------------------------------------------
218 
219 sal_Int32 AccessibleGridControlTableBase::implGetChildCount() const
220 {
221     return m_aTable.GetRowCount()*m_aTable.GetColumnCount();
222 }
223 
224 sal_Int32 AccessibleGridControlTableBase::implGetRow( sal_Int32 nChildIndex ) const
225 {
226     sal_Int32 nColumns = m_aTable.GetColumnCount();
227     return nColumns ? (nChildIndex / nColumns) : 0;
228 }
229 
230 sal_Int32 AccessibleGridControlTableBase::implGetColumn( sal_Int32 nChildIndex ) const
231 {
232     sal_Int32 nColumns = m_aTable.GetColumnCount();
233     return nColumns ? (nChildIndex % nColumns) : 0;
234 }
235 
236 sal_Int32 AccessibleGridControlTableBase::implGetChildIndex(
237         sal_Int32 nRow, sal_Int32 nColumn ) const
238 {
239     return nRow * m_aTable.GetColumnCount() + nColumn;
240 }
241 
242 void AccessibleGridControlTableBase::implGetSelectedRows( Sequence< sal_Int32 >& rSeq )
243 {
244     sal_Int32 const selectionCount( m_aTable.GetSelectedRowCount() );
245     rSeq.realloc( selectionCount );
246     for ( sal_Int32 i=0; i<selectionCount; ++i )
247         rSeq[i] = m_aTable.GetSelectedRowIndex(i);
248 }
249 
250 void AccessibleGridControlTableBase::ensureIsValidRow( sal_Int32 nRow )
251     throw ( lang::IndexOutOfBoundsException )
252 {
253     if( nRow >= m_aTable.GetRowCount() )
254         throw lang::IndexOutOfBoundsException(
255             OUString( RTL_CONSTASCII_USTRINGPARAM( "row index is invalid" ) ), *this );
256 }
257 
258 void AccessibleGridControlTableBase::ensureIsValidColumn( sal_Int32 nColumn )
259     throw ( lang::IndexOutOfBoundsException )
260 {
261     if( nColumn >= m_aTable.GetColumnCount() )
262         throw lang::IndexOutOfBoundsException(
263             OUString( RTL_CONSTASCII_USTRINGPARAM("column index is invalid") ), *this );
264 }
265 
266 void AccessibleGridControlTableBase::ensureIsValidAddress(
267         sal_Int32 nRow, sal_Int32 nColumn )
268     throw ( lang::IndexOutOfBoundsException )
269 {
270     ensureIsValidRow( nRow );
271     ensureIsValidColumn( nColumn );
272 }
273 
274 void AccessibleGridControlTableBase::ensureIsValidIndex( sal_Int32 nChildIndex )
275     throw ( lang::IndexOutOfBoundsException )
276 {
277     if( nChildIndex >= implGetChildCount() )
278         throw lang::IndexOutOfBoundsException(
279             OUString( RTL_CONSTASCII_USTRINGPARAM("child index is invalid") ), *this );
280 }
281 
282 // ============================================================================
283 
284 } // namespace accessibility
285 
286 // ============================================================================
287 
288