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