Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include "scitems.hxx"
21 : #include "AccessiblePreviewTable.hxx"
22 : #include "AccessiblePreviewCell.hxx"
23 : #include "AccessiblePreviewHeaderCell.hxx"
24 : #include "AccessibilityHints.hxx"
25 : #include "prevwsh.hxx"
26 : #include "miscuno.hxx"
27 : #include "prevloc.hxx"
28 : #include "attrib.hxx"
29 : #include "document.hxx"
30 : #include "scresid.hxx"
31 : #include "sc.hrc"
32 :
33 : #include <com/sun/star/accessibility/AccessibleRole.hpp>
34 : #include <com/sun/star/accessibility/AccessibleStateType.hpp>
35 : #include <com/sun/star/accessibility/AccessibleEventId.hpp>
36 :
37 : #include <vcl/window.hxx>
38 : #include <vcl/svapp.hxx>
39 : #include <svl/smplhint.hxx>
40 : #include <unotools/accessiblestatesethelper.hxx>
41 : #include <comphelper/sequence.hxx>
42 : #include <comphelper/servicehelper.hxx>
43 :
44 : using namespace ::com::sun::star;
45 : using namespace ::com::sun::star::accessibility;
46 :
47 : //===== internal ============================================================
48 :
49 30 : ScAccessiblePreviewTable::ScAccessiblePreviewTable( const ::com::sun::star::uno::Reference<
50 : ::com::sun::star::accessibility::XAccessible>& rxParent,
51 : ScPreviewShell* pViewShell, sal_Int32 nIndex ) :
52 : ScAccessibleContextBase( rxParent, AccessibleRole::TABLE ),
53 : mpViewShell( pViewShell ),
54 : mnIndex( nIndex ),
55 30 : mpTableInfo( NULL )
56 : {
57 30 : if (mpViewShell)
58 30 : mpViewShell->AddAccessibilityObject(*this);
59 30 : }
60 :
61 90 : ScAccessiblePreviewTable::~ScAccessiblePreviewTable()
62 : {
63 30 : if (!ScAccessibleContextBase::IsDefunc() && !rBHelper.bInDispose)
64 : {
65 : // increment refcount to prevent double call off dtor
66 0 : osl_atomic_increment( &m_refCount );
67 0 : dispose();
68 : }
69 60 : }
70 :
71 30 : void SAL_CALL ScAccessiblePreviewTable::disposing()
72 : {
73 30 : SolarMutexGuard aGuard;
74 30 : if (mpViewShell)
75 : {
76 30 : mpViewShell->RemoveAccessibilityObject(*this);
77 30 : mpViewShell = NULL;
78 : }
79 :
80 30 : if (mpTableInfo)
81 14 : DELETEZ (mpTableInfo);
82 :
83 30 : ScAccessibleContextBase::disposing();
84 30 : }
85 :
86 : //===== SfxListener =====================================================
87 :
88 42 : void ScAccessiblePreviewTable::Notify( SfxBroadcaster& rBC, const SfxHint& rHint )
89 : {
90 42 : const SfxSimpleHint* pSimpleHint = dynamic_cast<const SfxSimpleHint*>(&rHint);
91 42 : if (pSimpleHint)
92 : {
93 26 : sal_uLong nId = pSimpleHint->GetId();
94 26 : if ( nId == SFX_HINT_DATACHANGED )
95 : {
96 : // column / row layout may change with any document change,
97 : // so it must be invalidated
98 16 : DELETEZ( mpTableInfo );
99 : }
100 10 : else if (pSimpleHint->GetId() == SC_HINT_ACC_VISAREACHANGED)
101 : {
102 10 : AccessibleEventObject aEvent;
103 10 : aEvent.EventId = AccessibleEventId::VISIBLE_DATA_CHANGED;
104 10 : aEvent.Source = uno::Reference< XAccessibleContext >(this);
105 10 : CommitChange(aEvent);
106 : }
107 : }
108 :
109 42 : ScAccessibleContextBase::Notify(rBC, rHint);
110 42 : }
111 :
112 : //===== XInterface =====================================================
113 :
114 482 : uno::Any SAL_CALL ScAccessiblePreviewTable::queryInterface( uno::Type const & rType )
115 : throw (uno::RuntimeException, std::exception)
116 : {
117 482 : uno::Any aAny (ScAccessiblePreviewTableImpl::queryInterface(rType));
118 482 : return aAny.hasValue() ? aAny : ScAccessibleContextBase::queryInterface(rType);
119 : }
120 :
121 2492 : void SAL_CALL ScAccessiblePreviewTable::acquire()
122 : throw ()
123 : {
124 2492 : ScAccessibleContextBase::acquire();
125 2492 : }
126 :
127 2492 : void SAL_CALL ScAccessiblePreviewTable::release()
128 : throw ()
129 : {
130 2492 : ScAccessibleContextBase::release();
131 2492 : }
132 :
133 : //===== XAccessibleTable ================================================
134 :
135 2 : sal_Int32 SAL_CALL ScAccessiblePreviewTable::getAccessibleRowCount()
136 : throw (uno::RuntimeException, std::exception)
137 : {
138 2 : SolarMutexGuard aGuard;
139 2 : IsObjectValid();
140 :
141 2 : FillTableInfo();
142 :
143 2 : sal_Int32 nRet = 0;
144 2 : if ( mpTableInfo )
145 2 : nRet = mpTableInfo->GetRows();
146 2 : return nRet;
147 : }
148 :
149 2 : sal_Int32 SAL_CALL ScAccessiblePreviewTable::getAccessibleColumnCount()
150 : throw (uno::RuntimeException, std::exception)
151 : {
152 2 : SolarMutexGuard aGuard;
153 2 : IsObjectValid();
154 :
155 2 : FillTableInfo();
156 :
157 2 : sal_Int32 nRet = 0;
158 2 : if ( mpTableInfo )
159 2 : nRet = mpTableInfo->GetCols();
160 2 : return nRet;
161 : }
162 :
163 6 : OUString SAL_CALL ScAccessiblePreviewTable::getAccessibleRowDescription( sal_Int32 nRow )
164 : throw (lang::IndexOutOfBoundsException, uno::RuntimeException, std::exception)
165 : {
166 6 : SolarMutexGuard aGuard;
167 6 : FillTableInfo();
168 6 : if ( nRow < 0 || (mpTableInfo && nRow >= mpTableInfo->GetRows()) )
169 4 : throw lang::IndexOutOfBoundsException();
170 :
171 6 : return OUString();
172 : }
173 :
174 6 : OUString SAL_CALL ScAccessiblePreviewTable::getAccessibleColumnDescription( sal_Int32 nColumn )
175 : throw (lang::IndexOutOfBoundsException, uno::RuntimeException, std::exception)
176 : {
177 6 : SolarMutexGuard aGuard;
178 6 : FillTableInfo();
179 6 : if ( nColumn < 0 || (mpTableInfo && nColumn >= mpTableInfo->GetCols()) )
180 4 : throw lang::IndexOutOfBoundsException();
181 :
182 6 : return OUString();
183 : }
184 :
185 10 : sal_Int32 SAL_CALL ScAccessiblePreviewTable::getAccessibleRowExtentAt( sal_Int32 nRow, sal_Int32 nColumn )
186 : throw (lang::IndexOutOfBoundsException, uno::RuntimeException, std::exception)
187 : {
188 10 : SolarMutexGuard aGuard;
189 10 : IsObjectValid();
190 :
191 10 : FillTableInfo();
192 :
193 10 : sal_Int32 nRows = 1;
194 26 : if ( mpViewShell && mpTableInfo && nColumn >= 0 && nRow >= 0 &&
195 20 : nColumn < mpTableInfo->GetCols() && nRow < mpTableInfo->GetRows() )
196 : {
197 2 : const ScPreviewColRowInfo& rColInfo = mpTableInfo->GetColInfo()[nColumn];
198 2 : const ScPreviewColRowInfo& rRowInfo = mpTableInfo->GetRowInfo()[nRow];
199 :
200 2 : if ( rColInfo.bIsHeader || rRowInfo.bIsHeader )
201 : {
202 : // header cells only span a single cell
203 : }
204 : else
205 : {
206 2 : ScDocument& rDoc = mpViewShell->GetDocument();
207 : const ScMergeAttr* pItem = static_cast<const ScMergeAttr*>(rDoc.GetAttr(
208 2 : static_cast<SCCOL>(rColInfo.nDocIndex), static_cast<SCROW>(rRowInfo.nDocIndex), mpTableInfo->GetTab(), ATTR_MERGE ));
209 2 : if ( pItem && pItem->GetRowMerge() > 0 )
210 0 : nRows = pItem->GetRowMerge();
211 : }
212 : }
213 : else
214 8 : throw lang::IndexOutOfBoundsException();
215 :
216 10 : return nRows;
217 : }
218 :
219 10 : sal_Int32 SAL_CALL ScAccessiblePreviewTable::getAccessibleColumnExtentAt( sal_Int32 nRow, sal_Int32 nColumn )
220 : throw (lang::IndexOutOfBoundsException, uno::RuntimeException, std::exception)
221 : {
222 10 : SolarMutexGuard aGuard;
223 10 : IsObjectValid();
224 :
225 10 : FillTableInfo();
226 :
227 10 : sal_Int32 nColumns = 1;
228 26 : if ( mpViewShell && mpTableInfo && nColumn >= 0 && nRow >= 0 &&
229 20 : nColumn < mpTableInfo->GetCols() && nRow < mpTableInfo->GetRows() )
230 : {
231 2 : const ScPreviewColRowInfo& rColInfo = mpTableInfo->GetColInfo()[nColumn];
232 2 : const ScPreviewColRowInfo& rRowInfo = mpTableInfo->GetRowInfo()[nRow];
233 :
234 2 : if ( rColInfo.bIsHeader || rRowInfo.bIsHeader )
235 : {
236 : // header cells only span a single cell
237 : }
238 : else
239 : {
240 2 : ScDocument& rDoc = mpViewShell->GetDocument();
241 : const ScMergeAttr* pItem = static_cast<const ScMergeAttr*>(rDoc.GetAttr(
242 2 : static_cast<SCCOL>(rColInfo.nDocIndex), static_cast<SCROW>(rRowInfo.nDocIndex), mpTableInfo->GetTab(), ATTR_MERGE ));
243 2 : if ( pItem && pItem->GetColMerge() > 0 )
244 0 : nColumns = pItem->GetColMerge();
245 : }
246 : }
247 : else
248 8 : throw lang::IndexOutOfBoundsException();
249 :
250 10 : return nColumns;
251 : }
252 :
253 2 : uno::Reference< XAccessibleTable > SAL_CALL ScAccessiblePreviewTable::getAccessibleRowHeaders() throw (uno::RuntimeException, std::exception)
254 : {
255 : //! missing
256 2 : return NULL;
257 : }
258 :
259 2 : uno::Reference< XAccessibleTable > SAL_CALL ScAccessiblePreviewTable::getAccessibleColumnHeaders() throw (uno::RuntimeException, std::exception)
260 : {
261 : //! missing
262 2 : return NULL;
263 : }
264 :
265 2 : uno::Sequence< sal_Int32 > SAL_CALL ScAccessiblePreviewTable::getSelectedAccessibleRows() throw (uno::RuntimeException, std::exception)
266 : {
267 : // in the page preview, there is no selection
268 2 : return uno::Sequence<sal_Int32>(0);
269 : }
270 :
271 2 : uno::Sequence< sal_Int32 > SAL_CALL ScAccessiblePreviewTable::getSelectedAccessibleColumns() throw (uno::RuntimeException, std::exception)
272 : {
273 : // in the page preview, there is no selection
274 2 : return uno::Sequence<sal_Int32>(0);
275 : }
276 :
277 6 : sal_Bool SAL_CALL ScAccessiblePreviewTable::isAccessibleRowSelected( sal_Int32 nRow )
278 : throw (lang::IndexOutOfBoundsException, uno::RuntimeException, std::exception)
279 : {
280 : // in the page preview, there is no selection
281 :
282 6 : SolarMutexGuard aGuard;
283 6 : FillTableInfo();
284 6 : if ( nRow < 0 || (mpTableInfo && nRow >= mpTableInfo->GetRows()) )
285 4 : throw lang::IndexOutOfBoundsException();
286 :
287 6 : return false;
288 : }
289 :
290 6 : sal_Bool SAL_CALL ScAccessiblePreviewTable::isAccessibleColumnSelected( sal_Int32 nColumn )
291 : throw (lang::IndexOutOfBoundsException, uno::RuntimeException, std::exception)
292 : {
293 : // in the page preview, there is no selection
294 :
295 6 : SolarMutexGuard aGuard;
296 6 : FillTableInfo();
297 6 : if ( nColumn < 0 || (mpTableInfo && nColumn >= mpTableInfo->GetCols()) )
298 4 : throw lang::IndexOutOfBoundsException();
299 :
300 6 : return false;
301 : }
302 :
303 48 : uno::Reference< XAccessible > SAL_CALL ScAccessiblePreviewTable::getAccessibleCellAt( sal_Int32 nRow, sal_Int32 nColumn )
304 : throw (lang::IndexOutOfBoundsException, uno::RuntimeException, std::exception)
305 : {
306 48 : SolarMutexGuard aGuard;
307 48 : IsObjectValid();
308 :
309 48 : FillTableInfo();
310 :
311 48 : uno::Reference<XAccessible> xRet;
312 48 : if ( mpTableInfo && nColumn >= 0 && nRow >= 0 && nColumn < mpTableInfo->GetCols() && nRow < mpTableInfo->GetRows() )
313 : {
314 : // index iterates horizontally
315 40 : long nNewIndex = nRow * mpTableInfo->GetCols() + nColumn;
316 :
317 40 : const ScPreviewColRowInfo& rColInfo = mpTableInfo->GetColInfo()[nColumn];
318 40 : const ScPreviewColRowInfo& rRowInfo = mpTableInfo->GetRowInfo()[nRow];
319 :
320 40 : ScAddress aCellPos( static_cast<SCCOL>(rColInfo.nDocIndex), static_cast<SCROW>(rRowInfo.nDocIndex), mpTableInfo->GetTab() );
321 40 : if ( rColInfo.bIsHeader || rRowInfo.bIsHeader )
322 : {
323 : ScAccessiblePreviewHeaderCell* pHeaderCell = new ScAccessiblePreviewHeaderCell( this, mpViewShell, aCellPos,
324 18 : rRowInfo.bIsHeader, rColInfo.bIsHeader, nNewIndex );
325 18 : xRet = pHeaderCell;
326 18 : pHeaderCell->Init();
327 : }
328 : else
329 : {
330 22 : ScAccessiblePreviewCell* pCell = new ScAccessiblePreviewCell( this, mpViewShell, aCellPos, nNewIndex );
331 22 : xRet = pCell;
332 22 : pCell->Init();
333 : }
334 : }
335 :
336 48 : if ( !xRet.is() )
337 8 : throw lang::IndexOutOfBoundsException();
338 :
339 48 : return xRet;
340 : }
341 :
342 2 : uno::Reference< XAccessible > SAL_CALL ScAccessiblePreviewTable::getAccessibleCaption() throw (uno::RuntimeException, std::exception)
343 : {
344 : //! missing
345 2 : return NULL;
346 : }
347 :
348 2 : uno::Reference< XAccessible > SAL_CALL ScAccessiblePreviewTable::getAccessibleSummary() throw (uno::RuntimeException, std::exception)
349 : {
350 : //! missing
351 2 : return NULL;
352 : }
353 :
354 10 : sal_Bool SAL_CALL ScAccessiblePreviewTable::isAccessibleSelected( sal_Int32 nRow, sal_Int32 nColumn )
355 : throw (lang::IndexOutOfBoundsException, uno::RuntimeException, std::exception)
356 : {
357 : // in the page preview, there is no selection
358 10 : SolarMutexGuard aGuard;
359 10 : IsObjectValid();
360 :
361 10 : FillTableInfo();
362 :
363 10 : if ( mpTableInfo && nColumn >= 0 && nRow >= 0 && nColumn < mpTableInfo->GetCols() && nRow < mpTableInfo->GetRows() )
364 : {
365 : // index iterates horizontally
366 : }
367 : else
368 8 : throw lang::IndexOutOfBoundsException();
369 :
370 10 : return false;
371 : }
372 :
373 10 : sal_Int32 SAL_CALL ScAccessiblePreviewTable::getAccessibleIndex( sal_Int32 nRow, sal_Int32 nColumn )
374 : throw (lang::IndexOutOfBoundsException, uno::RuntimeException, std::exception)
375 : {
376 10 : SolarMutexGuard aGuard;
377 10 : IsObjectValid();
378 :
379 10 : FillTableInfo();
380 :
381 10 : sal_Int32 nRet = 0;
382 10 : if ( mpTableInfo && nColumn >= 0 && nRow >= 0 && nColumn < mpTableInfo->GetCols() && nRow < mpTableInfo->GetRows() )
383 : {
384 : // index iterates horizontally
385 2 : nRet = nRow * mpTableInfo->GetCols() + nColumn;
386 : }
387 : else
388 8 : throw lang::IndexOutOfBoundsException();
389 :
390 10 : return nRet;
391 : }
392 :
393 8 : sal_Int32 SAL_CALL ScAccessiblePreviewTable::getAccessibleRow( sal_Int32 nChildIndex )
394 : throw (lang::IndexOutOfBoundsException, uno::RuntimeException, std::exception)
395 : {
396 8 : SolarMutexGuard aGuard;
397 8 : IsObjectValid();
398 :
399 8 : FillTableInfo();
400 :
401 8 : sal_Int32 nRow = 0;
402 8 : if ( mpTableInfo && nChildIndex >= 0 && nChildIndex < static_cast<sal_Int32>(mpTableInfo->GetRows()) * mpTableInfo->GetCols() )
403 : {
404 4 : nRow = nChildIndex / mpTableInfo->GetCols();
405 : }
406 : else
407 4 : throw lang::IndexOutOfBoundsException();
408 :
409 8 : return nRow;
410 : }
411 :
412 8 : sal_Int32 SAL_CALL ScAccessiblePreviewTable::getAccessibleColumn( sal_Int32 nChildIndex )
413 : throw (lang::IndexOutOfBoundsException, uno::RuntimeException, std::exception)
414 : {
415 8 : SolarMutexGuard aGuard;
416 8 : IsObjectValid();
417 :
418 8 : FillTableInfo();
419 :
420 8 : sal_Int32 nCol = 0;
421 8 : if ( mpTableInfo && nChildIndex >= 0 && nChildIndex < static_cast<sal_Int32>(mpTableInfo->GetRows()) * mpTableInfo->GetCols() )
422 : {
423 4 : nCol = nChildIndex % static_cast<sal_Int32>(mpTableInfo->GetCols());
424 : }
425 : else
426 4 : throw lang::IndexOutOfBoundsException();
427 :
428 8 : return nCol;
429 : }
430 :
431 : //===== XAccessibleComponent ============================================
432 :
433 0 : uno::Reference< XAccessible > SAL_CALL ScAccessiblePreviewTable::getAccessibleAtPoint( const awt::Point& aPoint )
434 : throw (uno::RuntimeException, std::exception)
435 : {
436 0 : uno::Reference<XAccessible> xRet;
437 0 : if (containsPoint(aPoint))
438 : {
439 0 : SolarMutexGuard aGuard;
440 0 : IsObjectValid();
441 :
442 0 : FillTableInfo();
443 :
444 0 : if ( mpTableInfo )
445 : {
446 0 : SCCOL nCols = mpTableInfo->GetCols();
447 0 : SCROW nRows = mpTableInfo->GetRows();
448 0 : const ScPreviewColRowInfo* pColInfo = mpTableInfo->GetColInfo();
449 0 : const ScPreviewColRowInfo* pRowInfo = mpTableInfo->GetRowInfo();
450 :
451 0 : Rectangle aScreenRect(GetBoundingBox());
452 :
453 0 : awt::Point aMovedPoint = aPoint;
454 0 : aMovedPoint.X += aScreenRect.Left();
455 0 : aMovedPoint.Y += aScreenRect.Top();
456 :
457 0 : if ( nCols > 0 && nRows > 0 && aMovedPoint.X >= pColInfo[0].nPixelStart && aMovedPoint.Y >= pRowInfo[0].nPixelStart )
458 : {
459 0 : SCCOL nColIndex = 0;
460 0 : while ( nColIndex < nCols && aMovedPoint.X > pColInfo[nColIndex].nPixelEnd )
461 0 : ++nColIndex;
462 0 : SCROW nRowIndex = 0;
463 0 : while ( nRowIndex < nRows && aMovedPoint.Y > pRowInfo[nRowIndex].nPixelEnd )
464 0 : ++nRowIndex;
465 0 : if ( nColIndex < nCols && nRowIndex < nRows )
466 : {
467 : try
468 : {
469 0 : xRet = getAccessibleCellAt( nRowIndex, nColIndex );
470 : }
471 0 : catch (uno::Exception&)
472 : {
473 : }
474 : }
475 : }
476 0 : }
477 : }
478 :
479 0 : return xRet;
480 : }
481 :
482 4 : void SAL_CALL ScAccessiblePreviewTable::grabFocus() throw (uno::RuntimeException, std::exception)
483 : {
484 4 : SolarMutexGuard aGuard;
485 4 : IsObjectValid();
486 4 : if (getAccessibleParent().is())
487 : {
488 4 : uno::Reference<XAccessibleComponent> xAccessibleComponent(getAccessibleParent()->getAccessibleContext(), uno::UNO_QUERY);
489 4 : if (xAccessibleComponent.is())
490 4 : xAccessibleComponent->grabFocus();
491 4 : }
492 4 : }
493 :
494 : //===== XAccessibleContext ==============================================
495 :
496 76 : sal_Int32 SAL_CALL ScAccessiblePreviewTable::getAccessibleChildCount()
497 : throw (uno::RuntimeException, std::exception)
498 : {
499 76 : SolarMutexGuard aGuard;
500 76 : IsObjectValid();
501 :
502 76 : FillTableInfo();
503 :
504 76 : long nRet = 0;
505 76 : if ( mpTableInfo )
506 76 : nRet = static_cast<sal_Int32>(mpTableInfo->GetCols()) * mpTableInfo->GetRows();
507 76 : return nRet;
508 : }
509 :
510 38 : uno::Reference< XAccessible > SAL_CALL ScAccessiblePreviewTable::getAccessibleChild( sal_Int32 nIndex )
511 : throw (lang::IndexOutOfBoundsException, uno::RuntimeException, std::exception)
512 : {
513 38 : SolarMutexGuard aGuard;
514 38 : IsObjectValid();
515 :
516 38 : FillTableInfo();
517 :
518 38 : uno::Reference<XAccessible> xRet;
519 38 : if ( mpTableInfo )
520 : {
521 38 : long nColumns = mpTableInfo->GetCols();
522 38 : if ( nColumns > 0 )
523 : {
524 : // nCol, nRow are within the visible table, not the document
525 38 : long nCol = nIndex % nColumns;
526 38 : long nRow = nIndex / nColumns;
527 :
528 38 : xRet = getAccessibleCellAt( nRow, nCol );
529 : }
530 : }
531 :
532 38 : if ( !xRet.is() )
533 0 : throw lang::IndexOutOfBoundsException();
534 :
535 38 : return xRet;
536 : }
537 :
538 2 : sal_Int32 SAL_CALL ScAccessiblePreviewTable::getAccessibleIndexInParent() throw (uno::RuntimeException, std::exception)
539 : {
540 2 : return mnIndex;
541 : }
542 :
543 80 : uno::Reference< XAccessibleStateSet > SAL_CALL ScAccessiblePreviewTable::getAccessibleStateSet()
544 : throw (uno::RuntimeException, std::exception)
545 : {
546 80 : SolarMutexGuard aGuard;
547 160 : uno::Reference<XAccessibleStateSet> xParentStates;
548 80 : if (getAccessibleParent().is())
549 : {
550 80 : uno::Reference<XAccessibleContext> xParentContext = getAccessibleParent()->getAccessibleContext();
551 80 : xParentStates = xParentContext->getAccessibleStateSet();
552 : }
553 80 : utl::AccessibleStateSetHelper* pStateSet = new utl::AccessibleStateSetHelper();
554 80 : if (IsDefunc(xParentStates))
555 0 : pStateSet->AddState(AccessibleStateType::DEFUNC);
556 : else
557 : {
558 80 : pStateSet->AddState(AccessibleStateType::MANAGES_DESCENDANTS);
559 80 : pStateSet->AddState(AccessibleStateType::ENABLED);
560 80 : pStateSet->AddState(AccessibleStateType::OPAQUE);
561 80 : if (isShowing())
562 80 : pStateSet->AddState(AccessibleStateType::SHOWING);
563 80 : if (isVisible())
564 80 : pStateSet->AddState(AccessibleStateType::VISIBLE);
565 : }
566 160 : return pStateSet;
567 : }
568 :
569 : //===== XServiceInfo ====================================================
570 :
571 2 : OUString SAL_CALL ScAccessiblePreviewTable::getImplementationName() throw(uno::RuntimeException, std::exception)
572 : {
573 2 : return OUString("ScAccessiblePreviewTable");
574 : }
575 :
576 0 : uno::Sequence<OUString> SAL_CALL ScAccessiblePreviewTable::getSupportedServiceNames()
577 : throw(uno::RuntimeException, std::exception)
578 : {
579 0 : uno::Sequence< OUString > aSequence = ScAccessibleContextBase::getSupportedServiceNames();
580 0 : sal_Int32 nOldSize(aSequence.getLength());
581 0 : aSequence.realloc(nOldSize + 1);
582 :
583 0 : aSequence[nOldSize] = "com.sun.star.table.AccessibleTableView";
584 :
585 0 : return aSequence;
586 : }
587 :
588 : //===== XTypeProvider ===================================================
589 :
590 0 : uno::Sequence< uno::Type > SAL_CALL ScAccessiblePreviewTable::getTypes()
591 : throw (uno::RuntimeException, std::exception)
592 : {
593 0 : return comphelper::concatSequences(ScAccessiblePreviewTableImpl::getTypes(), ScAccessibleContextBase::getTypes());
594 : }
595 :
596 0 : uno::Sequence<sal_Int8> SAL_CALL ScAccessiblePreviewTable::getImplementationId()
597 : throw(uno::RuntimeException, std::exception)
598 : {
599 0 : return css::uno::Sequence<sal_Int8>();
600 : }
601 :
602 : //==== internal =========================================================
603 :
604 64 : OUString SAL_CALL ScAccessiblePreviewTable::createAccessibleDescription(void)
605 : throw (uno::RuntimeException)
606 : {
607 64 : OUString sDesc(ScResId(STR_ACC_TABLE_DESCR));
608 64 : return sDesc;
609 : }
610 :
611 30 : OUString SAL_CALL ScAccessiblePreviewTable::createAccessibleName()
612 : throw (uno::RuntimeException, std::exception)
613 : {
614 30 : OUString sName(SC_RESSTR(STR_ACC_TABLE_NAME));
615 :
616 30 : if (mpViewShell)
617 : {
618 30 : FillTableInfo();
619 :
620 30 : if ( mpTableInfo )
621 : {
622 30 : OUString sCoreName;
623 30 : if (mpViewShell->GetDocument().GetName( mpTableInfo->GetTab(), sCoreName ))
624 30 : sName = sName.replaceFirst("%1", sCoreName);
625 : }
626 : }
627 :
628 30 : return sName;
629 : }
630 :
631 4 : Rectangle ScAccessiblePreviewTable::GetBoundingBoxOnScreen() const throw (uno::RuntimeException, std::exception)
632 : {
633 4 : Rectangle aCellRect(GetBoundingBox());
634 4 : if (mpViewShell)
635 : {
636 4 : vcl::Window* pWindow = mpViewShell->GetWindow();
637 4 : if (pWindow)
638 : {
639 4 : Rectangle aRect = pWindow->GetWindowExtentsRelative(NULL);
640 4 : aCellRect.setX(aCellRect.getX() + aRect.getX());
641 4 : aCellRect.setY(aCellRect.getY() + aRect.getY());
642 : }
643 : }
644 4 : return aCellRect;
645 : }
646 :
647 542 : Rectangle ScAccessiblePreviewTable::GetBoundingBox() const
648 : throw (uno::RuntimeException, std::exception)
649 : {
650 542 : FillTableInfo();
651 :
652 542 : Rectangle aRect;
653 542 : if ( mpTableInfo )
654 : {
655 542 : SCCOL nColumns = mpTableInfo->GetCols();
656 542 : SCROW nRows = mpTableInfo->GetRows();
657 542 : if ( nColumns > 0 && nRows > 0 )
658 : {
659 542 : const ScPreviewColRowInfo* pColInfo = mpTableInfo->GetColInfo();
660 542 : const ScPreviewColRowInfo* pRowInfo = mpTableInfo->GetRowInfo();
661 :
662 : aRect = Rectangle( pColInfo[0].nPixelStart,
663 : pRowInfo[0].nPixelStart,
664 542 : pColInfo[nColumns-1].nPixelEnd,
665 1084 : pRowInfo[nRows-1].nPixelEnd );
666 : }
667 : }
668 542 : return aRect;
669 : }
670 :
671 80 : bool ScAccessiblePreviewTable::IsDefunc( const uno::Reference<XAccessibleStateSet>& rxParentStates )
672 : {
673 320 : return ScAccessibleContextBase::IsDefunc() || (mpViewShell == NULL) || !getAccessibleParent().is() ||
674 320 : (rxParentStates.is() && rxParentStates->contains(AccessibleStateType::DEFUNC));
675 : }
676 :
677 818 : void ScAccessiblePreviewTable::FillTableInfo() const
678 : {
679 818 : if ( mpViewShell && !mpTableInfo )
680 : {
681 30 : Size aOutputSize;
682 30 : vcl::Window* pWindow = mpViewShell->GetWindow();
683 30 : if ( pWindow )
684 30 : aOutputSize = pWindow->GetOutputSizePixel();
685 30 : Point aPoint;
686 30 : Rectangle aVisRect( aPoint, aOutputSize );
687 :
688 30 : mpTableInfo = new ScPreviewTableInfo;
689 30 : mpViewShell->GetLocationData().GetTableInfo( aVisRect, *mpTableInfo );
690 : }
691 1046 : }
692 :
693 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|