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
DBG_NAME(AccessibleBrowseBoxTable)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
~AccessibleBrowseBoxTable()61 AccessibleBrowseBoxTable::~AccessibleBrowseBoxTable()
62 {
63 DBG_DTOR( AccessibleBrowseBoxTable, NULL );
64 }
65
66 // XAccessibleContext ---------------------------------------------------------
67
68 Reference< XAccessible > SAL_CALL
getAccessibleChild(sal_Int32 nChildIndex)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
getAccessibleIndexInParent()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
getAccessibleAtPoint(const awt::Point & rPoint)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
grabFocus()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
getAccessibleKeyBinding()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
getAccessibleRowDescription(sal_Int32 nRow)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
getAccessibleColumnDescription(sal_Int32 nColumn)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
getAccessibleRowHeaders()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
getAccessibleColumnHeaders()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
getSelectedAccessibleRows()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
getSelectedAccessibleColumns()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
isAccessibleRowSelected(sal_Int32 nRow)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
isAccessibleColumnSelected(sal_Int32 nColumn)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
getAccessibleCellAt(sal_Int32 nRow,sal_Int32 nColumn)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
isAccessibleSelected(sal_Int32 nRow,sal_Int32 nColumn)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
getImplementationName()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
implGetBoundingBox()236 Rectangle AccessibleBrowseBoxTable::implGetBoundingBox()
237 {
238 return mpBrowseBox->calcTableRect(sal_False);
239 }
240
implGetBoundingBoxOnScreen()241 Rectangle AccessibleBrowseBoxTable::implGetBoundingBoxOnScreen()
242 {
243 return mpBrowseBox->calcTableRect();
244 }
245
246 // internal helper methods ----------------------------------------------------
247
implGetHeaderBar(sal_Int32 nChildIndex)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 } // namespace accessibility
271 // ============================================================================
272