LCOV - code coverage report
Current view: top level - sc/source/ui/Accessibility - AccessiblePreviewTable.cxx (source / functions) Hit Total Coverage
Test: commit e02a6cb2c3e2b23b203b422e4e0680877f232636 Lines: 0 315 0.0 %
Date: 2014-04-14 Functions: 0 45 0.0 %
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, 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: */

Generated by: LCOV version 1.10