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