LCOV - code coverage report
Current view: top level - libreoffice/sc/source/ui/Accessibility - AccessiblePreviewTable.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 1 316 0.3 %
Date: 2012-12-27 Functions: 2 45 4.4 %
Legend: Lines: hit not hit

          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: */

Generated by: LCOV version 1.10