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