LCOV - code coverage report
Current view: top level - libreoffice/svx/source/table - accessibletableshape.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 0 282 0.0 %
Date: 2012-12-27 Functions: 0 53 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 <com/sun/star/table/XMergeableCell.hpp>
      22             : #include <com/sun/star/accessibility/AccessibleEventId.hpp>
      23             : #include <com/sun/star/accessibility/AccessibleStateType.hpp>
      24             : 
      25             : #include <comphelper/accessiblewrapper.hxx>
      26             : #include <osl/mutex.hxx>
      27             : #include <vcl/svapp.hxx>
      28             : 
      29             : #include <svx/AccessibleTableShape.hxx>
      30             : #include "tablecontroller.hxx"
      31             : #include "accessiblecell.hxx"
      32             : 
      33             : #include <algorithm>
      34             : 
      35             : #include <cppuhelper/implbase1.hxx>
      36             : 
      37             : using ::rtl::OUString;
      38             : 
      39             : using namespace ::accessibility;
      40             : using namespace ::sdr::table;
      41             : using namespace ::com::sun::star::accessibility;
      42             : using namespace ::com::sun::star::uno;
      43             : using namespace ::com::sun::star::beans;
      44             : using namespace ::com::sun::star::util;
      45             : using namespace ::com::sun::star::lang;
      46             : using namespace ::com::sun::star::drawing;
      47             : using namespace ::com::sun::star::table;
      48             : using namespace ::com::sun::star::container;
      49             : 
      50             : #define C2U(x) OUString(RTL_CONSTASCII_USTRINGPARAM(x))
      51             : 
      52             : namespace accessibility
      53             : {
      54             : 
      55             : struct hash
      56             : {
      57           0 :     std::size_t operator()( const Reference< XCell >& xCell ) const
      58             :     {
      59           0 :         return std::size_t( xCell.get() );
      60             :     }
      61             : };
      62             : 
      63             : typedef boost::unordered_map< Reference< XCell >, rtl::Reference< AccessibleCell >, hash > AccessibleCellMap;
      64             : 
      65             : //-----------------------------------------------------------------------------
      66             : // AccessibleTableShapeImpl
      67             : //-----------------------------------------------------------------------------
      68             : 
      69           0 : class AccessibleTableShapeImpl : public cppu::WeakImplHelper1< XModifyListener >
      70             : {
      71             : public:
      72             :     AccessibleTableShapeImpl( AccessibleShapeTreeInfo& rShapeTreeInfo );
      73             : 
      74             :     void init( const Reference< XAccessible>& xAccessible, const Reference< XTable >& xTable );
      75             :     void dispose();
      76             : 
      77             :     Reference< XAccessible > getAccessibleChild( sal_Int32 i ) throw(IndexOutOfBoundsException);
      78             :     void getColumnAndRow( sal_Int32 nChildIndex, sal_Int32& rnColumn, sal_Int32& rnRow ) throw (IndexOutOfBoundsException );
      79             : 
      80             :     // XModifyListener
      81             :     virtual void SAL_CALL modified( const EventObject& aEvent ) throw (RuntimeException);
      82             : 
      83             :     // XEventListener
      84             :     virtual void SAL_CALL disposing( const EventObject& Source ) throw (RuntimeException);
      85             : 
      86             :     AccessibleShapeTreeInfo& mrShapeTreeInfo;
      87             :     Reference< XTable > mxTable;
      88             :     AccessibleCellMap maChildMap;
      89             :     Reference< XAccessible> mxAccessible;
      90             : };
      91             : 
      92             : //-----------------------------------------------------------------------------
      93             : 
      94           0 : AccessibleTableShapeImpl::AccessibleTableShapeImpl( AccessibleShapeTreeInfo& rShapeTreeInfo )
      95           0 : : mrShapeTreeInfo( rShapeTreeInfo )
      96             : {
      97           0 : }
      98             : 
      99             : //-----------------------------------------------------------------------------
     100             : 
     101           0 : void AccessibleTableShapeImpl::init( const Reference< XAccessible>& xAccessible, const Reference< XTable >& xTable )
     102             : {
     103           0 :     mxAccessible = xAccessible;
     104           0 :     mxTable = xTable;
     105             : 
     106           0 :     if( mxTable.is() )
     107             :     {
     108           0 :         Reference< XModifyListener > xListener( this );
     109           0 :         mxTable->addModifyListener( xListener );
     110             :     }
     111           0 : }
     112             : 
     113             : //-----------------------------------------------------------------------------
     114             : 
     115           0 : void AccessibleTableShapeImpl::dispose()
     116             : {
     117           0 :     if( mxTable.is() )
     118             :     {
     119           0 :         Reference< XModifyListener > xListener( this );
     120           0 :         mxTable->removeModifyListener( xListener );
     121           0 :         mxTable.clear();
     122             :     }
     123           0 :     mxAccessible.clear();
     124           0 : }
     125             : 
     126             : //-----------------------------------------------------------------------------
     127             : 
     128           0 : Reference< XAccessible > AccessibleTableShapeImpl::getAccessibleChild( sal_Int32 nChildIndex ) throw(IndexOutOfBoundsException)
     129             : {
     130           0 :     sal_Int32 nColumn = 0, nRow = 0;
     131           0 :     getColumnAndRow( nChildIndex, nColumn, nRow );
     132             : 
     133           0 :     Reference< XCell > xCell( mxTable->getCellByPosition( nColumn, nRow ) );
     134           0 :     AccessibleCellMap::iterator iter( maChildMap.find( xCell ) );
     135             : 
     136           0 :     if( iter != maChildMap.end() )
     137             :     {
     138           0 :         Reference< XAccessible > xChild( (*iter).second.get() );
     139           0 :         return xChild;
     140             :     }
     141             :     else
     142             :     {
     143           0 :         CellRef xCellRef( dynamic_cast< Cell* >( xCell.get() ) );
     144             : 
     145           0 :         rtl::Reference< AccessibleCell > xAccessibleCell( new AccessibleCell( mxAccessible, xCellRef, nChildIndex, mrShapeTreeInfo ) );
     146             : 
     147           0 :         maChildMap[xCell] = xAccessibleCell;
     148             : 
     149           0 :         xAccessibleCell->Init();
     150             : 
     151           0 :         Reference< XAccessible > xChild( xAccessibleCell.get() );
     152           0 :         return xChild;
     153           0 :     }
     154             : }
     155             : 
     156             : //-----------------------------------------------------------------------------
     157             : 
     158           0 : void AccessibleTableShapeImpl::getColumnAndRow( sal_Int32 nChildIndex, sal_Int32& rnColumn, sal_Int32& rnRow ) throw (IndexOutOfBoundsException )
     159             : {
     160           0 :     rnRow = 0;
     161           0 :     rnColumn = nChildIndex;
     162             : 
     163           0 :     if( mxTable.is() )
     164             :     {
     165           0 :         const sal_Int32 nColumnCount = mxTable->getColumnCount();
     166           0 :         while( rnColumn >= nColumnCount )
     167             :         {
     168           0 :             rnRow++;
     169           0 :             rnColumn -= nColumnCount;
     170             :         }
     171             : 
     172           0 :         if( rnRow < mxTable->getRowCount() )
     173           0 :             return;
     174             :     }
     175             : 
     176           0 :     throw IndexOutOfBoundsException();
     177             : }
     178             : 
     179             : // XModifyListener
     180           0 : void SAL_CALL AccessibleTableShapeImpl::modified( const EventObject& /*aEvent*/ ) throw (RuntimeException)
     181             : {
     182           0 :     if( mxTable.is() ) try
     183             :     {
     184             :         // structural changes may have happened to the table, validate all accessible cell instances
     185           0 :         AccessibleCellMap aTempChildMap;
     186           0 :         aTempChildMap.swap( maChildMap );
     187             : 
     188             :         // first move all still existing cells to maChildMap again and update their index
     189             : 
     190           0 :         const sal_Int32 nRowCount = mxTable->getRowCount();
     191           0 :         const sal_Int32 nColCount = mxTable->getColumnCount();
     192             : 
     193           0 :         sal_Int32 nChildIndex = 0;
     194             : 
     195           0 :         for( sal_Int32 nRow = 0; nRow < nRowCount; ++nRow )
     196             :         {
     197           0 :             for( sal_Int32 nCol = 0; nCol < nColCount; ++nCol )
     198             :             {
     199           0 :                 Reference< XCell > xCell( mxTable->getCellByPosition( nCol, nRow ) );
     200           0 :                 AccessibleCellMap::iterator iter( aTempChildMap.find( xCell ) );
     201             : 
     202           0 :                 if( iter != aTempChildMap.end() )
     203             :                 {
     204           0 :                     rtl::Reference< AccessibleCell > xAccessibleCell( (*iter).second );
     205           0 :                     xAccessibleCell->setIndexInParent( nChildIndex );
     206           0 :                     xAccessibleCell->CommitChange(AccessibleEventId::VISIBLE_DATA_CHANGED, Any(), Any());
     207             : 
     208             :                     // move still existing cell from temporary child map to our child map
     209           0 :                     maChildMap[xCell] = xAccessibleCell;
     210           0 :                     aTempChildMap.erase( iter );
     211             :                 }
     212             : 
     213           0 :                 ++nChildIndex;
     214           0 :             }
     215             :         }
     216             : 
     217             :         // all accessible cell instances still left in aTempChildMap must be disposed
     218             :         // as they are no longer part of the table
     219             : 
     220           0 :         for( AccessibleCellMap::iterator iter( aTempChildMap.begin() ); iter != aTempChildMap.end(); ++iter )
     221             :         {
     222           0 :             (*iter).second->dispose();
     223           0 :         }
     224             :     }
     225           0 :     catch( Exception& )
     226             :     {
     227             :         OSL_FAIL("svx::AccessibleTableShape::modified(), exception caught!");
     228             :     }
     229           0 : }
     230             : 
     231             : // XEventListener
     232           0 : void SAL_CALL AccessibleTableShapeImpl::disposing( const EventObject& /*Source*/ ) throw (RuntimeException)
     233             : {
     234           0 : }
     235             : 
     236             : //-----------------------------------------------------------------------------
     237             : // AccessibleTableShape
     238             : //-----------------------------------------------------------------------------
     239             : 
     240             : //-----------------------------------------------------------------------------
     241             : 
     242           0 : AccessibleTableShape::AccessibleTableShape( const AccessibleShapeInfo& rShapeInfo, const AccessibleShapeTreeInfo& rShapeTreeInfo)
     243             : : AccessibleTableShape_Base(rShapeInfo, rShapeTreeInfo)
     244           0 : , mxImpl( new AccessibleTableShapeImpl( maShapeTreeInfo ) )
     245             : {
     246           0 : }
     247             : 
     248             : //-----------------------------------------------------------------------------
     249             : 
     250           0 : AccessibleTableShape::~AccessibleTableShape (void)
     251             : {
     252           0 : }
     253             : 
     254             : //-----------------------------------------------------------------------------
     255             : 
     256           0 : void AccessibleTableShape::Init()
     257             : {
     258             :     try
     259             :     {
     260             : 
     261           0 :         Reference< XPropertySet > xSet( mxShape, UNO_QUERY_THROW );
     262           0 :         Reference< XTable > xTable( xSet->getPropertyValue(C2U("Model")), UNO_QUERY_THROW );
     263             : 
     264           0 :         mxImpl->init( this, xTable );
     265             :     }
     266           0 :     catch( Exception& )
     267             :     {
     268             :         OSL_FAIL("AccessibleTableShape::init(), exception caught?");
     269             :     }
     270             : 
     271           0 :     AccessibleTableShape_Base::Init();
     272           0 : }
     273             : 
     274             : //-----------------------------------------------------------------------------
     275             : 
     276           0 : SvxTableController* AccessibleTableShape::getTableController()
     277             : {
     278           0 :     SdrView* pView = maShapeTreeInfo.GetSdrView ();
     279           0 :     if( pView )
     280           0 :         return dynamic_cast< SvxTableController* >( pView->getSelectionController().get() );
     281             :     else
     282           0 :         return 0;
     283             : }
     284             : 
     285             : //-----------------------------------------------------------------------------
     286             : // XInterface
     287             : //-----------------------------------------------------------------------------
     288             : 
     289           0 : Any SAL_CALL AccessibleTableShape::queryInterface( const Type& aType ) throw (RuntimeException)
     290             : {
     291           0 :     return AccessibleTableShape_Base::queryInterface( aType );
     292             : }
     293             : 
     294             : //-----------------------------------------------------------------------------
     295             : 
     296           0 : void SAL_CALL AccessibleTableShape::acquire(  ) throw ()
     297             : {
     298           0 :     AccessibleTableShape_Base::acquire();
     299           0 : }
     300             : 
     301             : //-----------------------------------------------------------------------------
     302             : 
     303           0 : void SAL_CALL AccessibleTableShape::release(  ) throw ()
     304             : {
     305           0 :     AccessibleTableShape_Base::release();
     306           0 : }
     307             : 
     308             : //-----------------------------------------------------------------------------
     309             : // XAccessible
     310             : //-----------------------------------------------------------------------------
     311             : 
     312           0 : Reference< XAccessibleContext > SAL_CALL AccessibleTableShape::getAccessibleContext(void) throw (RuntimeException)
     313             : {
     314           0 :     return AccessibleShape::getAccessibleContext ();
     315             : }
     316             : 
     317             : //-----------------------------------------------------------------------------
     318           0 : OUString SAL_CALL AccessibleTableShape::getImplementationName(void) throw (RuntimeException)
     319             : {
     320           0 :     return OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.accessibility.AccessibleTableShape" ) );
     321             : }
     322             : 
     323             : //-----------------------------------------------------------------------------
     324             : 
     325           0 : OUString AccessibleTableShape::CreateAccessibleBaseName(void) throw (RuntimeException)
     326             : {
     327           0 :     return OUString (RTL_CONSTASCII_USTRINGPARAM("TableShape"));
     328             : }
     329             : 
     330             : //--------------------------------------------------------------------
     331             : 
     332           0 : sal_Int32 SAL_CALL AccessibleTableShape::getAccessibleChildCount( ) throw(RuntimeException)
     333             : {
     334           0 :     SolarMutexGuard aSolarGuard;
     335           0 :     return mxImpl->mxTable.is() ? mxImpl->mxTable->getRowCount() * mxImpl->mxTable->getColumnCount() : 0;
     336             : }
     337             : 
     338             : //--------------------------------------------------------------------
     339           0 : Reference< XAccessible > SAL_CALL AccessibleTableShape::getAccessibleChild( sal_Int32 i ) throw(IndexOutOfBoundsException, RuntimeException)
     340             : {
     341           0 :     SolarMutexGuard aSolarGuard;
     342           0 :     ThrowIfDisposed();
     343             : 
     344           0 :     return mxImpl->getAccessibleChild( i );
     345             : }
     346             : 
     347             : //--------------------------------------------------------------------
     348           0 : Reference< XAccessibleRelationSet > SAL_CALL AccessibleTableShape::getAccessibleRelationSet(  ) throw (RuntimeException)
     349             : {
     350           0 :     return AccessibleShape::getAccessibleRelationSet( );
     351             : }
     352             : 
     353             : //--------------------------------------------------------------------
     354             : 
     355           0 : sal_Int16 SAL_CALL AccessibleTableShape::getAccessibleRole (void) throw (RuntimeException)
     356             : {
     357           0 :     return AccessibleRole::TABLE;
     358             : }
     359             : 
     360             : //--------------------------------------------------------------------
     361             : 
     362           0 : void SAL_CALL AccessibleTableShape::disposing (void)
     363             : {
     364           0 :     mxImpl->dispose();
     365             : 
     366             :     // let the base do it's stuff
     367           0 :     AccessibleShape::disposing();
     368           0 : }
     369             : 
     370             : //--------------------------------------------------------------------
     371             : // XAccessibleTable
     372             : //--------------------------------------------------------------------
     373             : 
     374           0 : sal_Int32 SAL_CALL AccessibleTableShape::getAccessibleRowCount() throw (RuntimeException)
     375             : {
     376           0 :     SolarMutexGuard aSolarGuard;
     377           0 :     return mxImpl->mxTable.is() ? mxImpl->mxTable->getRowCount() : 0;
     378             : }
     379             : 
     380             : //--------------------------------------------------------------------
     381             : 
     382           0 : sal_Int32 SAL_CALL AccessibleTableShape::getAccessibleColumnCount(  ) throw (RuntimeException)
     383             : {
     384           0 :     SolarMutexGuard aSolarGuard;
     385           0 :     return mxImpl->mxTable.is() ? mxImpl->mxTable->getColumnCount() : 0;
     386             : }
     387             : 
     388             : //--------------------------------------------------------------------
     389             : 
     390           0 : OUString SAL_CALL AccessibleTableShape::getAccessibleRowDescription( sal_Int32 nRow ) throw (IndexOutOfBoundsException, RuntimeException)
     391             : {
     392           0 :     checkCellPosition( 0, nRow );
     393           0 :     return OUString();
     394             : }
     395             : 
     396             : //--------------------------------------------------------------------
     397             : 
     398           0 : OUString SAL_CALL AccessibleTableShape::getAccessibleColumnDescription( sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException)
     399             : {
     400           0 :     SolarMutexGuard aSolarGuard;
     401           0 :     checkCellPosition( nColumn, 0 );
     402           0 :     return OUString();
     403             : }
     404             : 
     405             : //--------------------------------------------------------------------
     406             : 
     407           0 : sal_Int32 SAL_CALL AccessibleTableShape::getAccessibleRowExtentAt( sal_Int32 nRow, sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException)
     408             : {
     409           0 :     SolarMutexGuard aSolarGuard;
     410           0 :     checkCellPosition( nColumn, nRow );
     411           0 :     if( mxImpl->mxTable.is() )
     412             :     {
     413           0 :         Reference< XMergeableCell > xCell( mxImpl->mxTable->getCellByPosition( nColumn, nRow ), UNO_QUERY );
     414           0 :         if( xCell.is() )
     415           0 :             return xCell->getRowSpan();
     416             :     }
     417           0 :     return 1;
     418             : }
     419             : 
     420             : //--------------------------------------------------------------------
     421             : 
     422           0 : sal_Int32 SAL_CALL AccessibleTableShape::getAccessibleColumnExtentAt( sal_Int32 nRow, sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException)
     423             : {
     424           0 :     SolarMutexGuard aSolarGuard;
     425           0 :     checkCellPosition( nColumn, nRow );
     426           0 :     if( mxImpl->mxTable.is() )
     427             :     {
     428           0 :         Reference< XMergeableCell > xCell( mxImpl->mxTable->getCellByPosition( nColumn, nRow ), UNO_QUERY );
     429           0 :         if( xCell.is() )
     430           0 :             return xCell->getColumnSpan();
     431             :     }
     432           0 :     return 1;
     433             : }
     434             : 
     435             : //--------------------------------------------------------------------
     436             : 
     437           0 : Reference< XAccessibleTable > SAL_CALL AccessibleTableShape::getAccessibleRowHeaders(  ) throw (RuntimeException)
     438             : {
     439           0 :     Reference< XAccessibleTable > xRet( this ); // todo
     440           0 :     return xRet;
     441             : }
     442             : 
     443             : //--------------------------------------------------------------------
     444             : 
     445           0 : Reference< XAccessibleTable > SAL_CALL AccessibleTableShape::getAccessibleColumnHeaders(  ) throw (RuntimeException)
     446             : {
     447           0 :     Reference< XAccessibleTable > xRet( this ); // todo
     448           0 :     return xRet;
     449             : }
     450             : 
     451             : //--------------------------------------------------------------------
     452             : 
     453           0 : Sequence< sal_Int32 > SAL_CALL AccessibleTableShape::getSelectedAccessibleRows(  ) throw (RuntimeException)
     454             : {
     455           0 :     Sequence< sal_Int32 > aRet;
     456           0 :     return aRet;
     457             : }
     458             : 
     459             : //--------------------------------------------------------------------
     460             : 
     461           0 : Sequence< sal_Int32 > SAL_CALL AccessibleTableShape::getSelectedAccessibleColumns(  ) throw (RuntimeException)
     462             : {
     463           0 :     Sequence< sal_Int32 > aRet;
     464           0 :     return aRet;
     465             : }
     466             : 
     467             : //--------------------------------------------------------------------
     468             : 
     469           0 : sal_Bool SAL_CALL AccessibleTableShape::isAccessibleRowSelected( sal_Int32 nRow ) throw (IndexOutOfBoundsException, RuntimeException)
     470             : {
     471           0 :     SolarMutexGuard aSolarGuard;
     472           0 :     checkCellPosition( 0, nRow );
     473           0 :     return sal_False;
     474             : }
     475             : 
     476             : //--------------------------------------------------------------------
     477             : 
     478           0 : sal_Bool SAL_CALL AccessibleTableShape::isAccessibleColumnSelected( sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException)
     479             : {
     480           0 :     SolarMutexGuard aSolarGuard;
     481           0 :     checkCellPosition( nColumn, 0 );
     482           0 :     return sal_False;
     483             : }
     484             : 
     485             : //--------------------------------------------------------------------
     486             : 
     487           0 : Reference< XAccessible > SAL_CALL AccessibleTableShape::getAccessibleCellAt( sal_Int32 nRow, sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException)
     488             : {
     489           0 :     SolarMutexGuard aSolarGuard;
     490           0 :     checkCellPosition( nColumn, nRow );
     491             : 
     492           0 :     sal_Int32 nChildIndex = 0;
     493           0 :     if( mxImpl->mxTable.is() )
     494           0 :         nChildIndex = mxImpl->mxTable->getColumnCount() * nRow + nColumn;
     495             : 
     496           0 :     return getAccessibleChild( nChildIndex );
     497             : }
     498             : 
     499             : //--------------------------------------------------------------------
     500             : 
     501           0 : Reference< XAccessible > SAL_CALL AccessibleTableShape::getAccessibleCaption(  ) throw (RuntimeException)
     502             : {
     503           0 :     Reference< XAccessible > xRet;
     504           0 :     return xRet;
     505             : }
     506             : 
     507             : //--------------------------------------------------------------------
     508             : 
     509           0 : Reference< XAccessible > SAL_CALL AccessibleTableShape::getAccessibleSummary(  ) throw (RuntimeException)
     510             : {
     511           0 :     Reference< XAccessible > xRet;
     512           0 :     return xRet;
     513             : }
     514             : 
     515             : //--------------------------------------------------------------------
     516             : 
     517           0 : sal_Bool SAL_CALL AccessibleTableShape::isAccessibleSelected( sal_Int32 nRow, sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException)
     518             : {
     519           0 :     SolarMutexGuard aSolarGuard;
     520           0 :     checkCellPosition( nColumn, nRow );
     521             : 
     522           0 :     SvxTableController* pController = getTableController();
     523           0 :     if( pController && pController->hasSelectedCells() )
     524             :     {
     525           0 :         CellPos aFirstPos, aLastPos;
     526           0 :         pController->getSelectedCells( aFirstPos, aLastPos );
     527           0 :         if( (aFirstPos.mnRow <= nRow) && (aFirstPos.mnCol <= nColumn) && (nRow <= aLastPos.mnRow) && (nColumn <= aLastPos.mnCol) )
     528           0 :             return sal_True;
     529             :     }
     530             : 
     531           0 :     return sal_False;
     532             : }
     533             : 
     534             : //--------------------------------------------------------------------
     535             : 
     536           0 : sal_Int32 SAL_CALL AccessibleTableShape::getAccessibleIndex( sal_Int32 nRow, sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException)
     537             : {
     538           0 :     SolarMutexGuard aSolarGuard;
     539           0 :     checkCellPosition( nColumn, nRow );
     540           0 :     return  mxImpl->mxTable.is() ? (nRow * mxImpl->mxTable->getColumnCount() + nColumn) : 0;
     541             : }
     542             : 
     543             : //--------------------------------------------------------------------
     544             : 
     545           0 : sal_Int32 SAL_CALL AccessibleTableShape::getAccessibleRow( sal_Int32 nChildIndex ) throw (IndexOutOfBoundsException, RuntimeException)
     546             : {
     547           0 :     SolarMutexGuard aSolarGuard;
     548           0 :     sal_Int32 nColumn = 0, nRow = 0;
     549           0 :     mxImpl->getColumnAndRow( nChildIndex, nColumn, nRow );
     550           0 :     return nRow;
     551             : }
     552             : 
     553             : //--------------------------------------------------------------------
     554             : 
     555           0 : sal_Int32 SAL_CALL AccessibleTableShape::getAccessibleColumn( sal_Int32 nChildIndex ) throw (IndexOutOfBoundsException, RuntimeException)
     556             : {
     557           0 :     SolarMutexGuard aSolarGuard;
     558           0 :     sal_Int32 nColumn = 0, nRow = 0;
     559           0 :     mxImpl->getColumnAndRow( nChildIndex, nColumn, nRow );
     560           0 :     return nChildIndex;
     561             : }
     562             : 
     563             : //--------------------------------------------------------------------
     564             : // XAccessibleSelection
     565             : //--------------------------------------------------------------------
     566             : 
     567           0 : void SAL_CALL AccessibleTableShape::selectAccessibleChild( sal_Int32 nChildIndex ) throw ( IndexOutOfBoundsException, RuntimeException )
     568             : {
     569           0 :     SolarMutexGuard aSolarGuard;
     570           0 :     CellPos aPos;
     571           0 :     mxImpl->getColumnAndRow( nChildIndex, aPos.mnCol, aPos.mnRow );
     572             : 
     573             :     // todo, select table shape?!?
     574           0 :     SvxTableController* pController = getTableController();
     575           0 :     if( pController )
     576             :     {
     577           0 :         CellPos aFirstPos( aPos ), aLastPos( aPos );
     578           0 :         if( pController->hasSelectedCells() )
     579             :         {
     580           0 :             pController->getSelectedCells( aFirstPos, aLastPos );
     581             : 
     582           0 :             aFirstPos.mnRow = std::min( aFirstPos.mnRow, aPos.mnRow );
     583           0 :             aFirstPos.mnCol = std::min( aFirstPos.mnCol, aPos.mnCol );
     584           0 :             aLastPos.mnRow = std::max( aLastPos.mnRow, aPos.mnRow );
     585           0 :             aLastPos.mnCol = std::max( aLastPos.mnCol, aPos.mnCol );
     586             :         }
     587           0 :         pController->setSelectedCells( aFirstPos, aLastPos );
     588           0 :     }
     589           0 : }
     590             : 
     591             : //--------------------------------------------------------------------
     592             : 
     593           0 : sal_Bool SAL_CALL AccessibleTableShape::isAccessibleChildSelected( sal_Int32 nChildIndex ) throw ( IndexOutOfBoundsException, RuntimeException )
     594             : {
     595           0 :     SolarMutexGuard aSolarGuard;
     596           0 :     CellPos aPos;
     597           0 :     mxImpl->getColumnAndRow( nChildIndex, aPos.mnCol, aPos.mnRow );
     598             : 
     599           0 :     return isAccessibleSelected(aPos.mnCol, aPos.mnRow);
     600             : }
     601             : 
     602             : //--------------------------------------------------------------------
     603             : 
     604           0 : void SAL_CALL AccessibleTableShape::clearAccessibleSelection() throw ( RuntimeException )
     605             : {
     606           0 :    SolarMutexGuard aSolarGuard;
     607             : 
     608           0 :     SvxTableController* pController = getTableController();
     609           0 :     if( pController )
     610           0 :         pController->clearSelection();
     611           0 : }
     612             : //--------------------------------------------------------------------
     613             : 
     614           0 : void SAL_CALL AccessibleTableShape::selectAllAccessibleChildren() throw ( RuntimeException )
     615             : {
     616           0 :    SolarMutexGuard aSolarGuard;
     617             : 
     618             :    // todo: force selection of shape?
     619           0 :     SvxTableController* pController = getTableController();
     620           0 :     if( pController )
     621           0 :         pController->selectAll();
     622           0 : }
     623             : 
     624             : //--------------------------------------------------------------------
     625             : 
     626           0 : sal_Int32 SAL_CALL AccessibleTableShape::getSelectedAccessibleChildCount() throw ( RuntimeException )
     627             : {
     628           0 :     SolarMutexGuard aSolarGuard;
     629             : 
     630           0 :     SvxTableController* pController = getTableController();
     631           0 :     if( pController && pController->hasSelectedCells() )
     632             :     {
     633           0 :         CellPos aFirstPos, aLastPos;
     634           0 :         pController->getSelectedCells( aFirstPos, aLastPos );
     635             : 
     636           0 :         const sal_Int32 nSelectedColumns = std::max( (sal_Int32)0, aLastPos.mnCol - aFirstPos.mnCol ) + 1;
     637           0 :         const sal_Int32 nSelectedRows = std::max( (sal_Int32)0, aLastPos.mnRow - aFirstPos.mnRow ) + 1;
     638           0 :         return nSelectedRows * nSelectedColumns;
     639             :     }
     640             : 
     641           0 :     return 0;
     642             : }
     643             : 
     644             : //--------------------------------------------------------------------
     645             : 
     646           0 : Reference< XAccessible > SAL_CALL AccessibleTableShape::getSelectedAccessibleChild( sal_Int32 nSelectedChildIndex ) throw ( IndexOutOfBoundsException, RuntimeException)
     647             : {
     648           0 :     SolarMutexGuard aSolarGuard;
     649             : 
     650           0 :     SvxTableController* pController = getTableController();
     651           0 :     if( pController && pController->hasSelectedCells() )
     652             :     {
     653           0 :         CellPos aFirstPos, aLastPos;
     654           0 :         pController->getSelectedCells( aFirstPos, aLastPos );
     655             : 
     656           0 :         const sal_Int32 nSelectedColumns = std::max( (sal_Int32)0, aLastPos.mnCol - aFirstPos.mnCol ) + 1;
     657           0 :         const sal_Int32 nSelectedRows = std::max( (sal_Int32)0, aLastPos.mnRow - aFirstPos.mnRow ) + 1;
     658             : 
     659           0 :         if( nSelectedChildIndex < (nSelectedRows * nSelectedColumns) )
     660             :         {
     661           0 :             while( nSelectedChildIndex >= nSelectedColumns )
     662             :             {
     663           0 :                 aFirstPos.mnRow++;
     664           0 :                 nSelectedChildIndex -= nSelectedColumns;
     665             :             }
     666           0 :             return getAccessibleCellAt( nSelectedColumns, aFirstPos.mnRow );
     667             :         }
     668             :     }
     669             : 
     670           0 :     throw IndexOutOfBoundsException();
     671             : }
     672             : 
     673             : //--------------------------------------------------------------------
     674             : 
     675           0 : void SAL_CALL AccessibleTableShape::deselectAccessibleChild( sal_Int32 nChildIndex )  throw ( IndexOutOfBoundsException, RuntimeException )
     676             : {
     677           0 :    SolarMutexGuard aSolarGuard;
     678           0 :     CellPos aPos;
     679           0 :     mxImpl->getColumnAndRow( nChildIndex, aPos.mnCol, aPos.mnRow );
     680             : 
     681             :     // todo, select table shape?!?
     682           0 :     SvxTableController* pController = getTableController();
     683           0 :     if( pController && pController->hasSelectedCells() )
     684             :     {
     685           0 :         CellPos aFirstPos, aLastPos;
     686           0 :         pController->getSelectedCells( aFirstPos, aLastPos );
     687             : 
     688             :         // create a selection where aPos is not part of anymore
     689           0 :         aFirstPos.mnRow = std::min( aFirstPos.mnRow, aPos.mnRow+1 );
     690           0 :         aFirstPos.mnCol = std::min( aFirstPos.mnCol, aPos.mnCol+1 );
     691           0 :         aLastPos.mnRow = std::max( aLastPos.mnRow, aPos.mnRow-1 );
     692           0 :         aLastPos.mnCol = std::max( aLastPos.mnCol, aPos.mnCol-1 );
     693             : 
     694             :         // new selection may be invalid (child to deselect is not at a border of the selection but in between)
     695           0 :         if( (aFirstPos.mnRow > aLastPos.mnRow) || (aFirstPos.mnCol > aLastPos.mnCol) )
     696           0 :             pController->clearSelection(); // if selection is invalid, clear all
     697             :         else
     698           0 :             pController->setSelectedCells( aFirstPos, aLastPos );
     699           0 :     }
     700           0 : }
     701             : 
     702             : //--------------------------------------------------------------------
     703             : 
     704           0 : void AccessibleTableShape::checkCellPosition( sal_Int32 nCol, sal_Int32 nRow ) throw ( IndexOutOfBoundsException )
     705             : {
     706           0 :     if( (nCol >= 0) && (nRow >= 0) && mxImpl->mxTable.is() && (nCol < mxImpl->mxTable->getColumnCount()) && (nRow < mxImpl->mxTable->getRowCount()) )
     707           0 :         return;
     708             : 
     709           0 :     throw IndexOutOfBoundsException();
     710             : }
     711             : 
     712             : }
     713             : 
     714             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10