1f6e50924SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3f6e50924SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4f6e50924SAndrew Rist * or more contributor license agreements. See the NOTICE file 5f6e50924SAndrew Rist * distributed with this work for additional information 6f6e50924SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7f6e50924SAndrew Rist * to you under the Apache License, Version 2.0 (the 8f6e50924SAndrew Rist * "License"); you may not use this file except in compliance 9f6e50924SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11f6e50924SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13f6e50924SAndrew Rist * Unless required by applicable law or agreed to in writing, 14f6e50924SAndrew Rist * software distributed under the License is distributed on an 15f6e50924SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16f6e50924SAndrew Rist * KIND, either express or implied. See the License for the 17f6e50924SAndrew Rist * specific language governing permissions and limitations 18f6e50924SAndrew Rist * under the License. 19cdf0e10cSrcweir * 20f6e50924SAndrew Rist *************************************************************/ 21f6e50924SAndrew Rist 22f6e50924SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_svx.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include <com/sun/star/table/XMergeableCell.hpp> 28cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleEventId.hpp> 29cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleStateType.hpp> 30cdf0e10cSrcweir 31cdf0e10cSrcweir #include <comphelper/accessiblewrapper.hxx> 32cdf0e10cSrcweir #include <vos/mutex.hxx> 33cdf0e10cSrcweir #include <tools/debug.hxx> 34cdf0e10cSrcweir #include <vcl/svapp.hxx> 35cdf0e10cSrcweir 36cdf0e10cSrcweir #include <svx/AccessibleTableShape.hxx> 37766ce4d0SZheng Fan #include <svx/sdr/table/tablecontroller.hxx> 38cdf0e10cSrcweir #include "accessiblecell.hxx" 39cdf0e10cSrcweir 40cdf0e10cSrcweir #include <algorithm> 41cdf0e10cSrcweir 42cdf0e10cSrcweir #include <cppuhelper/implbase1.hxx> 439b8096d0SSteve Yin #include <svx/svdotable.hxx> 449b8096d0SSteve Yin #include <com/sun/star/accessibility/AccessibleStateType.hpp> 459b8096d0SSteve Yin #include <com/sun/star/view/XSelectionSupplier.hpp> 46cdf0e10cSrcweir 47cdf0e10cSrcweir using ::rtl::OUString; 48cdf0e10cSrcweir 49cdf0e10cSrcweir using namespace ::accessibility; 50cdf0e10cSrcweir using namespace ::sdr::table; 51cdf0e10cSrcweir using namespace ::com::sun::star::accessibility; 52cdf0e10cSrcweir using namespace ::com::sun::star::uno; 53cdf0e10cSrcweir using namespace ::com::sun::star::beans; 54cdf0e10cSrcweir using namespace ::com::sun::star::util; 55cdf0e10cSrcweir using namespace ::com::sun::star::lang; 56cdf0e10cSrcweir using namespace ::com::sun::star::drawing; 57cdf0e10cSrcweir using namespace ::com::sun::star::table; 58cdf0e10cSrcweir using namespace ::com::sun::star::container; 59cdf0e10cSrcweir 60cdf0e10cSrcweir #define C2U(x) OUString(RTL_CONSTASCII_USTRINGPARAM(x)) 61cdf0e10cSrcweir 62cdf0e10cSrcweir namespace accessibility 63cdf0e10cSrcweir { 64cdf0e10cSrcweir 65cdf0e10cSrcweir struct hash 66cdf0e10cSrcweir { 67cdf0e10cSrcweir std::size_t operator()( const Reference< XCell >& xCell ) const 68cdf0e10cSrcweir { 69cdf0e10cSrcweir return std::size_t( xCell.get() ); 70cdf0e10cSrcweir } 71cdf0e10cSrcweir }; 72cdf0e10cSrcweir 73cdf0e10cSrcweir typedef std::hash_map< Reference< XCell >, rtl::Reference< AccessibleCell >, hash > AccessibleCellMap; 74cdf0e10cSrcweir 75cdf0e10cSrcweir //----------------------------------------------------------------------------- 76cdf0e10cSrcweir // AccessibleTableShapeImpl 77cdf0e10cSrcweir //----------------------------------------------------------------------------- 78cdf0e10cSrcweir 79cdf0e10cSrcweir class AccessibleTableShapeImpl : public cppu::WeakImplHelper1< XModifyListener > 80cdf0e10cSrcweir { 81cdf0e10cSrcweir public: 82cdf0e10cSrcweir AccessibleTableShapeImpl( AccessibleShapeTreeInfo& rShapeTreeInfo ); 83cdf0e10cSrcweir 84cdf0e10cSrcweir void init( const Reference< XAccessible>& xAccessible, const Reference< XTable >& xTable ); 85cdf0e10cSrcweir void dispose(); 86cdf0e10cSrcweir 87cdf0e10cSrcweir Reference< XAccessible > getAccessibleChild( sal_Int32 i ) throw(IndexOutOfBoundsException); 88cdf0e10cSrcweir void getColumnAndRow( sal_Int32 nChildIndex, sal_Int32& rnColumn, sal_Int32& rnRow ) throw (IndexOutOfBoundsException ); 89cdf0e10cSrcweir 90cdf0e10cSrcweir // XModifyListener 91cdf0e10cSrcweir virtual void SAL_CALL modified( const EventObject& aEvent ) throw (RuntimeException); 92cdf0e10cSrcweir 93cdf0e10cSrcweir // XEventListener 94cdf0e10cSrcweir virtual void SAL_CALL disposing( const EventObject& Source ) throw (RuntimeException); 95cdf0e10cSrcweir 96cdf0e10cSrcweir AccessibleShapeTreeInfo& mrShapeTreeInfo; 97cdf0e10cSrcweir Reference< XTable > mxTable; 98cdf0e10cSrcweir AccessibleCellMap maChildMap; 99cdf0e10cSrcweir Reference< XAccessible> mxAccessible; 1009b8096d0SSteve Yin sal_Int32 mRowCount, mColCount; 1019b8096d0SSteve Yin //get the cached AccessibleCell from XCell 1029b8096d0SSteve Yin Reference< AccessibleCell > getAccessibleCell (Reference< XCell > xCell); 103cdf0e10cSrcweir }; 104cdf0e10cSrcweir 105cdf0e10cSrcweir //----------------------------------------------------------------------------- 106cdf0e10cSrcweir 107cdf0e10cSrcweir AccessibleTableShapeImpl::AccessibleTableShapeImpl( AccessibleShapeTreeInfo& rShapeTreeInfo ) 108cdf0e10cSrcweir : mrShapeTreeInfo( rShapeTreeInfo ) 1099b8096d0SSteve Yin , mRowCount(0) 1109b8096d0SSteve Yin , mColCount(0) 111cdf0e10cSrcweir { 112cdf0e10cSrcweir } 113cdf0e10cSrcweir 114cdf0e10cSrcweir //----------------------------------------------------------------------------- 115cdf0e10cSrcweir 116cdf0e10cSrcweir void AccessibleTableShapeImpl::init( const Reference< XAccessible>& xAccessible, const Reference< XTable >& xTable ) 117cdf0e10cSrcweir { 118cdf0e10cSrcweir mxAccessible = xAccessible; 119cdf0e10cSrcweir mxTable = xTable; 120cdf0e10cSrcweir 121cdf0e10cSrcweir if( mxTable.is() ) 122cdf0e10cSrcweir { 123cdf0e10cSrcweir Reference< XModifyListener > xListener( this ); 124cdf0e10cSrcweir mxTable->addModifyListener( xListener ); 1259b8096d0SSteve Yin //register the listener with table model 1269b8096d0SSteve Yin Reference< ::com::sun::star::view::XSelectionSupplier > xSelSupplier(xTable, UNO_QUERY); 1279b8096d0SSteve Yin Reference< ::com::sun::star::view::XSelectionChangeListener > xSelListener( xAccessible, UNO_QUERY ); 1289b8096d0SSteve Yin if (xSelSupplier.is()) 1299b8096d0SSteve Yin xSelSupplier->addSelectionChangeListener(xSelListener); 1309b8096d0SSteve Yin mRowCount = mxTable->getRowCount(); 1319b8096d0SSteve Yin mColCount = mxTable->getColumnCount(); 132cdf0e10cSrcweir } 133cdf0e10cSrcweir } 134cdf0e10cSrcweir 135cdf0e10cSrcweir //----------------------------------------------------------------------------- 136cdf0e10cSrcweir 137cdf0e10cSrcweir void AccessibleTableShapeImpl::dispose() 138cdf0e10cSrcweir { 139cdf0e10cSrcweir if( mxTable.is() ) 140cdf0e10cSrcweir { 1419b8096d0SSteve Yin //IAccessibility2 Implementation 2009-----, remove all the cell's acc object in table's dispose. 1429b8096d0SSteve Yin for( AccessibleCellMap::iterator iter( maChildMap.begin() ); iter != maChildMap.end(); iter++ ) 1439b8096d0SSteve Yin { 1449b8096d0SSteve Yin (*iter).second->dispose(); 1459b8096d0SSteve Yin } 146cdf0e10cSrcweir Reference< XModifyListener > xListener( this ); 147cdf0e10cSrcweir mxTable->removeModifyListener( xListener ); 148cdf0e10cSrcweir mxTable.clear(); 149cdf0e10cSrcweir } 150cdf0e10cSrcweir mxAccessible.clear(); 151cdf0e10cSrcweir } 152cdf0e10cSrcweir 153cdf0e10cSrcweir //----------------------------------------------------------------------------- 1549b8096d0SSteve Yin //IAccessibility2 Implementation 2009-----, get the cached AccessibleCell from XCell 1559b8096d0SSteve Yin Reference< AccessibleCell > AccessibleTableShapeImpl::getAccessibleCell (Reference< XCell > xCell) 1569b8096d0SSteve Yin { 1579b8096d0SSteve Yin AccessibleCellMap::iterator iter( maChildMap.find( xCell ) ); 158cdf0e10cSrcweir 1599b8096d0SSteve Yin if( iter != maChildMap.end() ) 1609b8096d0SSteve Yin { 1619b8096d0SSteve Yin Reference< AccessibleCell > xChild( (*iter).second.get() ); 1629b8096d0SSteve Yin return xChild; 1639b8096d0SSteve Yin } 1649b8096d0SSteve Yin return Reference< AccessibleCell >(); 1659b8096d0SSteve Yin } 1669b8096d0SSteve Yin 1679b8096d0SSteve Yin //----------------------------------------------------------------------------- 168cdf0e10cSrcweir Reference< XAccessible > AccessibleTableShapeImpl::getAccessibleChild( sal_Int32 nChildIndex ) throw(IndexOutOfBoundsException) 169cdf0e10cSrcweir { 170cdf0e10cSrcweir sal_Int32 nColumn = 0, nRow = 0; 171cdf0e10cSrcweir getColumnAndRow( nChildIndex, nColumn, nRow ); 172cdf0e10cSrcweir 173cdf0e10cSrcweir Reference< XCell > xCell( mxTable->getCellByPosition( nColumn, nRow ) ); 174cdf0e10cSrcweir AccessibleCellMap::iterator iter( maChildMap.find( xCell ) ); 175cdf0e10cSrcweir 176cdf0e10cSrcweir if( iter != maChildMap.end() ) 177cdf0e10cSrcweir { 178cdf0e10cSrcweir Reference< XAccessible > xChild( (*iter).second.get() ); 179cdf0e10cSrcweir return xChild; 180cdf0e10cSrcweir } 181cdf0e10cSrcweir else 182cdf0e10cSrcweir { 183cdf0e10cSrcweir CellRef xCellRef( dynamic_cast< Cell* >( xCell.get() ) ); 184cdf0e10cSrcweir 185cdf0e10cSrcweir rtl::Reference< AccessibleCell > xAccessibleCell( new AccessibleCell( mxAccessible, xCellRef, nChildIndex, mrShapeTreeInfo ) ); 186cdf0e10cSrcweir 1879b8096d0SSteve Yin xAccessibleCell->Init(); 188cdf0e10cSrcweir maChildMap[xCell] = xAccessibleCell; 189cdf0e10cSrcweir 190cdf0e10cSrcweir xAccessibleCell->Init(); 191cdf0e10cSrcweir 192cdf0e10cSrcweir Reference< XAccessible > xChild( xAccessibleCell.get() ); 193cdf0e10cSrcweir return xChild; 194cdf0e10cSrcweir } 195cdf0e10cSrcweir } 196cdf0e10cSrcweir 197cdf0e10cSrcweir //----------------------------------------------------------------------------- 198cdf0e10cSrcweir 199cdf0e10cSrcweir void AccessibleTableShapeImpl::getColumnAndRow( sal_Int32 nChildIndex, sal_Int32& rnColumn, sal_Int32& rnRow ) throw (IndexOutOfBoundsException ) 200cdf0e10cSrcweir { 201cdf0e10cSrcweir rnRow = 0; 202cdf0e10cSrcweir rnColumn = nChildIndex; 203cdf0e10cSrcweir 204cdf0e10cSrcweir if( mxTable.is() ) 205cdf0e10cSrcweir { 206cdf0e10cSrcweir const sal_Int32 nColumnCount = mxTable->getColumnCount(); 207cdf0e10cSrcweir while( rnColumn >= nColumnCount ) 208cdf0e10cSrcweir { 209cdf0e10cSrcweir rnRow++; 210cdf0e10cSrcweir rnColumn -= nColumnCount; 211cdf0e10cSrcweir } 212cdf0e10cSrcweir 213cdf0e10cSrcweir if( rnRow < mxTable->getRowCount() ) 214cdf0e10cSrcweir return; 215cdf0e10cSrcweir } 216cdf0e10cSrcweir 217cdf0e10cSrcweir throw IndexOutOfBoundsException(); 218cdf0e10cSrcweir } 219cdf0e10cSrcweir 220cdf0e10cSrcweir // XModifyListener 221cdf0e10cSrcweir void SAL_CALL AccessibleTableShapeImpl::modified( const EventObject& /*aEvent*/ ) throw (RuntimeException) 222cdf0e10cSrcweir { 223cdf0e10cSrcweir if( mxTable.is() ) try 224cdf0e10cSrcweir { 225cdf0e10cSrcweir // structural changes may have happened to the table, validate all accessible cell instances 226cdf0e10cSrcweir AccessibleCellMap aTempChildMap; 227cdf0e10cSrcweir aTempChildMap.swap( maChildMap ); 228cdf0e10cSrcweir 229cdf0e10cSrcweir // first move all still existing cells to maChildMap again and update their index 230cdf0e10cSrcweir 231cdf0e10cSrcweir const sal_Int32 nRowCount = mxTable->getRowCount(); 232cdf0e10cSrcweir const sal_Int32 nColCount = mxTable->getColumnCount(); 233cdf0e10cSrcweir 2349b8096d0SSteve Yin sal_Bool bRowOrColumnChanged = sal_False; 2359b8096d0SSteve Yin if (mRowCount != nRowCount || mColCount != nColCount ) 2369b8096d0SSteve Yin { 2379b8096d0SSteve Yin bRowOrColumnChanged = sal_True; 2389b8096d0SSteve Yin mRowCount = nRowCount; 2399b8096d0SSteve Yin mColCount = nColCount; 2409b8096d0SSteve Yin } 241cdf0e10cSrcweir sal_Int32 nChildIndex = 0; 242cdf0e10cSrcweir 243cdf0e10cSrcweir for( sal_Int32 nRow = 0; nRow < nRowCount; ++nRow ) 244cdf0e10cSrcweir { 245cdf0e10cSrcweir for( sal_Int32 nCol = 0; nCol < nColCount; ++nCol ) 246cdf0e10cSrcweir { 247cdf0e10cSrcweir Reference< XCell > xCell( mxTable->getCellByPosition( nCol, nRow ) ); 248cdf0e10cSrcweir AccessibleCellMap::iterator iter( aTempChildMap.find( xCell ) ); 249cdf0e10cSrcweir 250cdf0e10cSrcweir if( iter != aTempChildMap.end() ) 251cdf0e10cSrcweir { 252cdf0e10cSrcweir rtl::Reference< AccessibleCell > xAccessibleCell( (*iter).second ); 253cdf0e10cSrcweir xAccessibleCell->setIndexInParent( nChildIndex ); 2549b8096d0SSteve Yin //IAccessibility2 Implementation 2009-----, the children may need to updated 2559b8096d0SSteve Yin //xAccessibleCell->CommitChange(AccessibleEventId::VISIBLE_DATA_CHANGED, Any(), Any()); 2569b8096d0SSteve Yin xAccessibleCell->UpdateChildren(); 2579b8096d0SSteve Yin // If row or column count is changed, there is split or merge, so all cell's acc name should be updated 2589b8096d0SSteve Yin if (bRowOrColumnChanged) 2599b8096d0SSteve Yin { 2609b8096d0SSteve Yin xAccessibleCell->SetAccessibleName(xAccessibleCell->getAccessibleName(), AccessibleContextBase::ManuallySet); 2619b8096d0SSteve Yin } 2629b8096d0SSteve Yin // For merged cell, add invisible & disabled state. 2639b8096d0SSteve Yin Reference< XMergeableCell > xMergedCell( mxTable->getCellByPosition( nCol, nRow ), UNO_QUERY ); 2649b8096d0SSteve Yin if (xMergedCell.is() && xMergedCell->isMerged()) 2659b8096d0SSteve Yin { 2669b8096d0SSteve Yin xAccessibleCell->ResetState(AccessibleStateType::VISIBLE); 2679b8096d0SSteve Yin xAccessibleCell->ResetState(AccessibleStateType::ENABLED); 2689b8096d0SSteve Yin // IA2 CWS. MT: OFFSCREEN == !SHOWING, should stay consistent 2699b8096d0SSteve Yin // xAccessibleCell->SetState(AccessibleStateType::OFFSCREEN); 2709b8096d0SSteve Yin xAccessibleCell->ResetState(AccessibleStateType::SHOWING); 2719b8096d0SSteve Yin } 2729b8096d0SSteve Yin else 2739b8096d0SSteve Yin { 2749b8096d0SSteve Yin xAccessibleCell->SetState(AccessibleStateType::VISIBLE); 2759b8096d0SSteve Yin xAccessibleCell->SetState(AccessibleStateType::ENABLED); 2769b8096d0SSteve Yin // IA2 CWS. MT: OFFSCREEN == !SHOWING, should stay consistent 2779b8096d0SSteve Yin // xAccessibleCell->ResetState(AccessibleStateType::OFFSCREEN); 2789b8096d0SSteve Yin xAccessibleCell->SetState(AccessibleStateType::SHOWING); 2799b8096d0SSteve Yin } 280cdf0e10cSrcweir 281cdf0e10cSrcweir // move still existing cell from temporary child map to our child map 282cdf0e10cSrcweir maChildMap[xCell] = xAccessibleCell; 283cdf0e10cSrcweir aTempChildMap.erase( iter ); 284cdf0e10cSrcweir } 2859b8096d0SSteve Yin //IAccessibility2 Implementation 2009-----, need to add the new added cell on demand 2869b8096d0SSteve Yin else 2879b8096d0SSteve Yin { 2889b8096d0SSteve Yin CellRef xCellRef( dynamic_cast< Cell* >( xCell.get() ) ); 2899b8096d0SSteve Yin 2909b8096d0SSteve Yin rtl::Reference< AccessibleCell > xAccessibleCell( new AccessibleCell( mxAccessible, xCellRef, nChildIndex, mrShapeTreeInfo ) ); 2919b8096d0SSteve Yin 2929b8096d0SSteve Yin xAccessibleCell->Init(); 2939b8096d0SSteve Yin maChildMap[xCell] = xAccessibleCell; 2949b8096d0SSteve Yin } 295cdf0e10cSrcweir 296cdf0e10cSrcweir ++nChildIndex; 297cdf0e10cSrcweir } 298cdf0e10cSrcweir } 299cdf0e10cSrcweir 300cdf0e10cSrcweir // all accessible cell instances still left in aTempChildMap must be disposed 301cdf0e10cSrcweir // as they are no longer part of the table 302cdf0e10cSrcweir 303cdf0e10cSrcweir for( AccessibleCellMap::iterator iter( aTempChildMap.begin() ); iter != aTempChildMap.end(); iter++ ) 304cdf0e10cSrcweir { 305cdf0e10cSrcweir (*iter).second->dispose(); 306cdf0e10cSrcweir } 3079b8096d0SSteve Yin //IAccessibility2 Implementation 2009-----, notify bridge to update the acc cache. 3089b8096d0SSteve Yin AccessibleTableShape *pAccTable = dynamic_cast <AccessibleTableShape *> (mxAccessible.get()); 3099b8096d0SSteve Yin pAccTable->CommitChange(AccessibleEventId::INVALIDATE_ALL_CHILDREN, Any(), Any()); 310cdf0e10cSrcweir } 311cdf0e10cSrcweir catch( Exception& ) 312cdf0e10cSrcweir { 313cdf0e10cSrcweir DBG_ERROR("svx::AccessibleTableShape::modified(), exception caught!"); 314cdf0e10cSrcweir } 315cdf0e10cSrcweir } 316cdf0e10cSrcweir 317cdf0e10cSrcweir // XEventListener 318cdf0e10cSrcweir void SAL_CALL AccessibleTableShapeImpl::disposing( const EventObject& /*Source*/ ) throw (RuntimeException) 319cdf0e10cSrcweir { 320cdf0e10cSrcweir } 321cdf0e10cSrcweir 322cdf0e10cSrcweir //----------------------------------------------------------------------------- 323cdf0e10cSrcweir // AccessibleTableShape 324cdf0e10cSrcweir //----------------------------------------------------------------------------- 325cdf0e10cSrcweir 326cdf0e10cSrcweir //----------------------------------------------------------------------------- 327cdf0e10cSrcweir 328cdf0e10cSrcweir AccessibleTableShape::AccessibleTableShape( const AccessibleShapeInfo& rShapeInfo, const AccessibleShapeTreeInfo& rShapeTreeInfo) 329cdf0e10cSrcweir : AccessibleTableShape_Base(rShapeInfo, rShapeTreeInfo) 330cdf0e10cSrcweir , mxImpl( new AccessibleTableShapeImpl( maShapeTreeInfo ) ) 331*ec81bebdSSteve Yin , mnPreviousSelectionCount(0) 332cdf0e10cSrcweir { 333cdf0e10cSrcweir } 334cdf0e10cSrcweir 335cdf0e10cSrcweir //----------------------------------------------------------------------------- 336cdf0e10cSrcweir 337cdf0e10cSrcweir AccessibleTableShape::~AccessibleTableShape (void) 338cdf0e10cSrcweir { 339cdf0e10cSrcweir } 340cdf0e10cSrcweir 341cdf0e10cSrcweir //----------------------------------------------------------------------------- 342cdf0e10cSrcweir 343cdf0e10cSrcweir void AccessibleTableShape::Init() 344cdf0e10cSrcweir { 345cdf0e10cSrcweir try 346cdf0e10cSrcweir { 347cdf0e10cSrcweir Reference< XPropertySet > xSet( mxShape, UNO_QUERY_THROW ); 348cdf0e10cSrcweir Reference< XTable > xTable( xSet->getPropertyValue(C2U("Model")), UNO_QUERY_THROW ); 349cdf0e10cSrcweir 350cdf0e10cSrcweir mxImpl->init( this, xTable ); 351cdf0e10cSrcweir } 352cdf0e10cSrcweir catch( Exception& ) 353cdf0e10cSrcweir { 354cdf0e10cSrcweir DBG_ERROR("AccessibleTableShape::init(), exception caught?"); 355cdf0e10cSrcweir } 356cdf0e10cSrcweir 357cdf0e10cSrcweir AccessibleTableShape_Base::Init(); 358cdf0e10cSrcweir } 359cdf0e10cSrcweir 360cdf0e10cSrcweir //----------------------------------------------------------------------------- 361cdf0e10cSrcweir 362cdf0e10cSrcweir SvxTableController* AccessibleTableShape::getTableController() 363cdf0e10cSrcweir { 364cdf0e10cSrcweir SdrView* pView = maShapeTreeInfo.GetSdrView (); 365cdf0e10cSrcweir if( pView ) 366cdf0e10cSrcweir return dynamic_cast< SvxTableController* >( pView->getSelectionController().get() ); 367cdf0e10cSrcweir else 368cdf0e10cSrcweir return 0; 369cdf0e10cSrcweir } 370cdf0e10cSrcweir 371cdf0e10cSrcweir //----------------------------------------------------------------------------- 372cdf0e10cSrcweir // XInterface 373cdf0e10cSrcweir //----------------------------------------------------------------------------- 374cdf0e10cSrcweir 375cdf0e10cSrcweir Any SAL_CALL AccessibleTableShape::queryInterface( const Type& aType ) throw (RuntimeException) 376cdf0e10cSrcweir { 3779b8096d0SSteve Yin if ( aType == ::getCppuType((Reference<XAccessibleTableSelection> *)0) ) 3789b8096d0SSteve Yin { 3799b8096d0SSteve Yin Reference<XAccessibleTableSelection> xThis( this ); 3809b8096d0SSteve Yin Any aRet; 3819b8096d0SSteve Yin aRet <<= xThis; 3829b8096d0SSteve Yin return aRet; 3839b8096d0SSteve Yin } 3849b8096d0SSteve Yin else 385cdf0e10cSrcweir return AccessibleTableShape_Base::queryInterface( aType ); 386cdf0e10cSrcweir } 387cdf0e10cSrcweir 388cdf0e10cSrcweir //----------------------------------------------------------------------------- 389cdf0e10cSrcweir 390cdf0e10cSrcweir void SAL_CALL AccessibleTableShape::acquire( ) throw () 391cdf0e10cSrcweir { 392cdf0e10cSrcweir AccessibleTableShape_Base::acquire(); 393cdf0e10cSrcweir } 394cdf0e10cSrcweir 395cdf0e10cSrcweir //----------------------------------------------------------------------------- 396cdf0e10cSrcweir 397cdf0e10cSrcweir void SAL_CALL AccessibleTableShape::release( ) throw () 398cdf0e10cSrcweir { 399cdf0e10cSrcweir AccessibleTableShape_Base::release(); 400cdf0e10cSrcweir } 401cdf0e10cSrcweir 402cdf0e10cSrcweir //----------------------------------------------------------------------------- 403cdf0e10cSrcweir // XAccessible 404cdf0e10cSrcweir //----------------------------------------------------------------------------- 405cdf0e10cSrcweir 406cdf0e10cSrcweir Reference< XAccessibleContext > SAL_CALL AccessibleTableShape::getAccessibleContext(void) throw (RuntimeException) 407cdf0e10cSrcweir { 408cdf0e10cSrcweir return AccessibleShape::getAccessibleContext (); 409cdf0e10cSrcweir } 410cdf0e10cSrcweir 411cdf0e10cSrcweir //----------------------------------------------------------------------------- 412cdf0e10cSrcweir OUString SAL_CALL AccessibleTableShape::getImplementationName(void) throw (RuntimeException) 413cdf0e10cSrcweir { 414cdf0e10cSrcweir return OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.accessibility.AccessibleTableShape" ) ); 415cdf0e10cSrcweir } 416cdf0e10cSrcweir 417cdf0e10cSrcweir //----------------------------------------------------------------------------- 418cdf0e10cSrcweir 419cdf0e10cSrcweir OUString AccessibleTableShape::CreateAccessibleBaseName(void) throw (RuntimeException) 420cdf0e10cSrcweir { 4219b8096d0SSteve Yin return OUString (RTL_CONSTASCII_USTRINGPARAM("TableShape")); 422cdf0e10cSrcweir } 423cdf0e10cSrcweir 424cdf0e10cSrcweir //-------------------------------------------------------------------- 425cdf0e10cSrcweir 426cdf0e10cSrcweir sal_Int32 SAL_CALL AccessibleTableShape::getAccessibleChildCount( ) throw(RuntimeException) 427cdf0e10cSrcweir { 428cdf0e10cSrcweir ::vos::OGuard aSolarGuard(::Application::GetSolarMutex()); 429cdf0e10cSrcweir return mxImpl->mxTable.is() ? mxImpl->mxTable->getRowCount() * mxImpl->mxTable->getColumnCount() : 0; 430cdf0e10cSrcweir } 431cdf0e10cSrcweir 432cdf0e10cSrcweir //-------------------------------------------------------------------- 433cdf0e10cSrcweir Reference< XAccessible > SAL_CALL AccessibleTableShape::getAccessibleChild( sal_Int32 i ) throw(IndexOutOfBoundsException, RuntimeException) 434cdf0e10cSrcweir { 435cdf0e10cSrcweir ::vos::OGuard aSolarGuard (::Application::GetSolarMutex()); 436cdf0e10cSrcweir ThrowIfDisposed(); 437cdf0e10cSrcweir 438cdf0e10cSrcweir return mxImpl->getAccessibleChild( i ); 439cdf0e10cSrcweir } 440cdf0e10cSrcweir 441cdf0e10cSrcweir //-------------------------------------------------------------------- 442cdf0e10cSrcweir Reference< XAccessibleRelationSet > SAL_CALL AccessibleTableShape::getAccessibleRelationSet( ) throw (RuntimeException) 443cdf0e10cSrcweir { 444cdf0e10cSrcweir return AccessibleShape::getAccessibleRelationSet( ); 445cdf0e10cSrcweir } 446cdf0e10cSrcweir 447cdf0e10cSrcweir //-------------------------------------------------------------------- 448cdf0e10cSrcweir 449cdf0e10cSrcweir sal_Int16 SAL_CALL AccessibleTableShape::getAccessibleRole (void) throw (RuntimeException) 450cdf0e10cSrcweir { 451cdf0e10cSrcweir return AccessibleRole::TABLE; 452cdf0e10cSrcweir } 453cdf0e10cSrcweir 454cdf0e10cSrcweir //-------------------------------------------------------------------- 455cdf0e10cSrcweir 456cdf0e10cSrcweir void SAL_CALL AccessibleTableShape::disposing (void) 457cdf0e10cSrcweir { 458cdf0e10cSrcweir mxImpl->dispose(); 459cdf0e10cSrcweir 460cdf0e10cSrcweir // let the base do it's stuff 461cdf0e10cSrcweir AccessibleShape::disposing(); 462cdf0e10cSrcweir } 463cdf0e10cSrcweir 464cdf0e10cSrcweir //-------------------------------------------------------------------- 465cdf0e10cSrcweir // XAccessibleTable 466cdf0e10cSrcweir //-------------------------------------------------------------------- 467cdf0e10cSrcweir 468cdf0e10cSrcweir sal_Int32 SAL_CALL AccessibleTableShape::getAccessibleRowCount() throw (RuntimeException) 469cdf0e10cSrcweir { 470cdf0e10cSrcweir ::vos::OGuard aSolarGuard (::Application::GetSolarMutex()); 471cdf0e10cSrcweir return mxImpl->mxTable.is() ? mxImpl->mxTable->getRowCount() : 0; 472cdf0e10cSrcweir } 473cdf0e10cSrcweir 474cdf0e10cSrcweir //-------------------------------------------------------------------- 475cdf0e10cSrcweir 476cdf0e10cSrcweir sal_Int32 SAL_CALL AccessibleTableShape::getAccessibleColumnCount( ) throw (RuntimeException) 477cdf0e10cSrcweir { 478cdf0e10cSrcweir ::vos::OGuard aSolarGuard (::Application::GetSolarMutex()); 479cdf0e10cSrcweir return mxImpl->mxTable.is() ? mxImpl->mxTable->getColumnCount() : 0; 480cdf0e10cSrcweir } 481cdf0e10cSrcweir 482cdf0e10cSrcweir //-------------------------------------------------------------------- 483cdf0e10cSrcweir 484cdf0e10cSrcweir OUString SAL_CALL AccessibleTableShape::getAccessibleRowDescription( sal_Int32 nRow ) throw (IndexOutOfBoundsException, RuntimeException) 485cdf0e10cSrcweir { 486cdf0e10cSrcweir checkCellPosition( 0, nRow ); 487cdf0e10cSrcweir return OUString(); 488cdf0e10cSrcweir } 489cdf0e10cSrcweir 490cdf0e10cSrcweir //-------------------------------------------------------------------- 491cdf0e10cSrcweir 492cdf0e10cSrcweir OUString SAL_CALL AccessibleTableShape::getAccessibleColumnDescription( sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException) 493cdf0e10cSrcweir { 494cdf0e10cSrcweir ::vos::OGuard aSolarGuard (::Application::GetSolarMutex()); 495cdf0e10cSrcweir checkCellPosition( nColumn, 0 ); 496cdf0e10cSrcweir return OUString(); 497cdf0e10cSrcweir } 498cdf0e10cSrcweir 499cdf0e10cSrcweir //-------------------------------------------------------------------- 500cdf0e10cSrcweir 501cdf0e10cSrcweir sal_Int32 SAL_CALL AccessibleTableShape::getAccessibleRowExtentAt( sal_Int32 nRow, sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException) 502cdf0e10cSrcweir { 503cdf0e10cSrcweir ::vos::OGuard aSolarGuard (::Application::GetSolarMutex()); 504cdf0e10cSrcweir checkCellPosition( nColumn, nRow ); 505cdf0e10cSrcweir if( mxImpl->mxTable.is() ) 506cdf0e10cSrcweir { 507cdf0e10cSrcweir Reference< XMergeableCell > xCell( mxImpl->mxTable->getCellByPosition( nColumn, nRow ), UNO_QUERY ); 508cdf0e10cSrcweir if( xCell.is() ) 509cdf0e10cSrcweir return xCell->getRowSpan(); 510cdf0e10cSrcweir } 511cdf0e10cSrcweir return 1; 512cdf0e10cSrcweir } 513cdf0e10cSrcweir 514cdf0e10cSrcweir //-------------------------------------------------------------------- 515cdf0e10cSrcweir 516cdf0e10cSrcweir sal_Int32 SAL_CALL AccessibleTableShape::getAccessibleColumnExtentAt( sal_Int32 nRow, sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException) 517cdf0e10cSrcweir { 518cdf0e10cSrcweir ::vos::OGuard aSolarGuard (::Application::GetSolarMutex()); 519cdf0e10cSrcweir checkCellPosition( nColumn, nRow ); 520cdf0e10cSrcweir if( mxImpl->mxTable.is() ) 521cdf0e10cSrcweir { 522cdf0e10cSrcweir Reference< XMergeableCell > xCell( mxImpl->mxTable->getCellByPosition( nColumn, nRow ), UNO_QUERY ); 523cdf0e10cSrcweir if( xCell.is() ) 524cdf0e10cSrcweir return xCell->getColumnSpan(); 525cdf0e10cSrcweir } 526cdf0e10cSrcweir return 1; 527cdf0e10cSrcweir } 528cdf0e10cSrcweir 529cdf0e10cSrcweir //-------------------------------------------------------------------- 530cdf0e10cSrcweir 531cdf0e10cSrcweir Reference< XAccessibleTable > SAL_CALL AccessibleTableShape::getAccessibleRowHeaders( ) throw (RuntimeException) 532cdf0e10cSrcweir { 5339b8096d0SSteve Yin //Reference< XAccessibleTable > xRet( this ); // todo 5349b8096d0SSteve Yin Reference< XAccessibleTable > xRet; 5359b8096d0SSteve Yin SvxTableController* pController = getTableController(); 5369b8096d0SSteve Yin if( pController ) 5379b8096d0SSteve Yin { 5389b8096d0SSteve Yin if( pController->isRowHeader() ) 5399b8096d0SSteve Yin { 5409b8096d0SSteve Yin AccessibleTableHeaderShape* pTableHeader = new AccessibleTableHeaderShape( this, sal_True ); 5419b8096d0SSteve Yin xRet.set( pTableHeader ); 5429b8096d0SSteve Yin } 5439b8096d0SSteve Yin } 544cdf0e10cSrcweir return xRet; 545cdf0e10cSrcweir } 546cdf0e10cSrcweir 547cdf0e10cSrcweir //-------------------------------------------------------------------- 548cdf0e10cSrcweir 549cdf0e10cSrcweir Reference< XAccessibleTable > SAL_CALL AccessibleTableShape::getAccessibleColumnHeaders( ) throw (RuntimeException) 550cdf0e10cSrcweir { 5519b8096d0SSteve Yin //Reference< XAccessibleTable > xRet( this ); // todo 5529b8096d0SSteve Yin Reference< XAccessibleTable > xRet; 5539b8096d0SSteve Yin SvxTableController* pController = getTableController(); 5549b8096d0SSteve Yin if( pController ) 5559b8096d0SSteve Yin { 5569b8096d0SSteve Yin if( pController->isColumnHeader() ) 5579b8096d0SSteve Yin { 5589b8096d0SSteve Yin AccessibleTableHeaderShape* pTableHeader = new AccessibleTableHeaderShape( this, sal_False ); 5599b8096d0SSteve Yin xRet.set( pTableHeader ); 5609b8096d0SSteve Yin } 5619b8096d0SSteve Yin } 562cdf0e10cSrcweir return xRet; 563cdf0e10cSrcweir } 564cdf0e10cSrcweir 565cdf0e10cSrcweir //-------------------------------------------------------------------- 566cdf0e10cSrcweir 567cdf0e10cSrcweir Sequence< sal_Int32 > SAL_CALL AccessibleTableShape::getSelectedAccessibleRows( ) throw (RuntimeException) 568cdf0e10cSrcweir { 5699b8096d0SSteve Yin /*Sequence< sal_Int32 > aRet;*/ 5709b8096d0SSteve Yin sal_Int32 nRow = getAccessibleRowCount(); 5719b8096d0SSteve Yin ::std::vector< sal_Bool > aSelected( nRow, sal_True ); 5729b8096d0SSteve Yin sal_Int32 nCount = nRow; 5739b8096d0SSteve Yin for( sal_Int32 i = 0; i < nRow; i++ ) 5749b8096d0SSteve Yin { 5759b8096d0SSteve Yin try 5769b8096d0SSteve Yin { 5779b8096d0SSteve Yin aSelected[i] = isAccessibleRowSelected( i ); 5789b8096d0SSteve Yin } 5799b8096d0SSteve Yin catch( ... ) 5809b8096d0SSteve Yin { 5819b8096d0SSteve Yin return Sequence< sal_Int32 >(); 5829b8096d0SSteve Yin } 5839b8096d0SSteve Yin 5849b8096d0SSteve Yin if( !aSelected[i] ) 5859b8096d0SSteve Yin nCount--; 5869b8096d0SSteve Yin } 5879b8096d0SSteve Yin Sequence < sal_Int32 > aRet( nCount ); 5889b8096d0SSteve Yin sal_Int32 *pRet = aRet.getArray(); 5899b8096d0SSteve Yin sal_Int32 nPos = 0; 5909b8096d0SSteve Yin size_t nSize = aSelected.size(); 5919b8096d0SSteve Yin for( size_t i=0; i < nSize && nPos < nCount; i++ ) 5929b8096d0SSteve Yin { 5939b8096d0SSteve Yin if( aSelected[i] ) 5949b8096d0SSteve Yin { 5959b8096d0SSteve Yin *pRet++ = i; 5969b8096d0SSteve Yin nPos++; 5979b8096d0SSteve Yin } 5989b8096d0SSteve Yin } 5999b8096d0SSteve Yin 600cdf0e10cSrcweir return aRet; 601cdf0e10cSrcweir } 602cdf0e10cSrcweir 603cdf0e10cSrcweir //-------------------------------------------------------------------- 604cdf0e10cSrcweir 605cdf0e10cSrcweir Sequence< sal_Int32 > SAL_CALL AccessibleTableShape::getSelectedAccessibleColumns( ) throw (RuntimeException) 606cdf0e10cSrcweir { 6079b8096d0SSteve Yin /*Sequence< sal_Int32 > aRet;*/ 6089b8096d0SSteve Yin sal_Int32 nColumn = getAccessibleColumnCount(); 6099b8096d0SSteve Yin ::std::vector< sal_Bool > aSelected( nColumn, sal_True ); 6109b8096d0SSteve Yin sal_Int32 nCount = nColumn; 6119b8096d0SSteve Yin for( sal_Int32 i = 0; i < nColumn; i++ ) 6129b8096d0SSteve Yin { 6139b8096d0SSteve Yin try 6149b8096d0SSteve Yin { 6159b8096d0SSteve Yin aSelected[i] = isAccessibleColumnSelected( i ); 6169b8096d0SSteve Yin } 6179b8096d0SSteve Yin catch( ... ) 6189b8096d0SSteve Yin { 6199b8096d0SSteve Yin return Sequence< sal_Int32 >(); 6209b8096d0SSteve Yin } 6219b8096d0SSteve Yin 6229b8096d0SSteve Yin if( !aSelected[i] ) 6239b8096d0SSteve Yin nCount--; 6249b8096d0SSteve Yin } 6259b8096d0SSteve Yin Sequence < sal_Int32 > aRet( nCount ); 6269b8096d0SSteve Yin sal_Int32 *pRet = aRet.getArray(); 6279b8096d0SSteve Yin sal_Int32 nPos = 0; 6289b8096d0SSteve Yin size_t nSize = aSelected.size(); 6299b8096d0SSteve Yin for( size_t i=0; i < nSize && nPos < nCount; i++ ) 6309b8096d0SSteve Yin { 6319b8096d0SSteve Yin if( aSelected[i] ) 6329b8096d0SSteve Yin { 6339b8096d0SSteve Yin *pRet++ = i; 6349b8096d0SSteve Yin nPos++; 6359b8096d0SSteve Yin } 6369b8096d0SSteve Yin } 6379b8096d0SSteve Yin 638cdf0e10cSrcweir return aRet; 639cdf0e10cSrcweir } 640cdf0e10cSrcweir 641cdf0e10cSrcweir //-------------------------------------------------------------------- 642cdf0e10cSrcweir 643cdf0e10cSrcweir sal_Bool SAL_CALL AccessibleTableShape::isAccessibleRowSelected( sal_Int32 nRow ) throw (IndexOutOfBoundsException, RuntimeException) 644cdf0e10cSrcweir { 645cdf0e10cSrcweir ::vos::OGuard aSolarGuard (::Application::GetSolarMutex()); 646cdf0e10cSrcweir checkCellPosition( 0, nRow ); 6479b8096d0SSteve Yin SvxTableController* pController = getTableController(); 6489b8096d0SSteve Yin if( pController ) 6499b8096d0SSteve Yin { 6509b8096d0SSteve Yin return pController->isRowSelected( nRow ); 6519b8096d0SSteve Yin } 652cdf0e10cSrcweir return sal_False; 653cdf0e10cSrcweir } 654cdf0e10cSrcweir 655cdf0e10cSrcweir //-------------------------------------------------------------------- 656cdf0e10cSrcweir 657cdf0e10cSrcweir sal_Bool SAL_CALL AccessibleTableShape::isAccessibleColumnSelected( sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException) 658cdf0e10cSrcweir { 659cdf0e10cSrcweir ::vos::OGuard aSolarGuard (::Application::GetSolarMutex()); 660cdf0e10cSrcweir checkCellPosition( nColumn, 0 ); 6619b8096d0SSteve Yin SvxTableController* pController = getTableController(); 6629b8096d0SSteve Yin if( pController ) 6639b8096d0SSteve Yin { 6649b8096d0SSteve Yin return pController->isColumnSelected( nColumn ); 6659b8096d0SSteve Yin } 666cdf0e10cSrcweir return sal_False; 667cdf0e10cSrcweir } 668cdf0e10cSrcweir 669cdf0e10cSrcweir //-------------------------------------------------------------------- 670cdf0e10cSrcweir 671cdf0e10cSrcweir Reference< XAccessible > SAL_CALL AccessibleTableShape::getAccessibleCellAt( sal_Int32 nRow, sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException) 672cdf0e10cSrcweir { 673cdf0e10cSrcweir ::vos::OGuard aSolarGuard (::Application::GetSolarMutex()); 674cdf0e10cSrcweir checkCellPosition( nColumn, nRow ); 675cdf0e10cSrcweir 676cdf0e10cSrcweir sal_Int32 nChildIndex = 0; 677cdf0e10cSrcweir if( mxImpl->mxTable.is() ) 678cdf0e10cSrcweir nChildIndex = mxImpl->mxTable->getColumnCount() * nRow + nColumn; 679cdf0e10cSrcweir 680cdf0e10cSrcweir return getAccessibleChild( nChildIndex ); 681cdf0e10cSrcweir } 682cdf0e10cSrcweir 683cdf0e10cSrcweir //-------------------------------------------------------------------- 684cdf0e10cSrcweir 685cdf0e10cSrcweir Reference< XAccessible > SAL_CALL AccessibleTableShape::getAccessibleCaption( ) throw (RuntimeException) 686cdf0e10cSrcweir { 687cdf0e10cSrcweir Reference< XAccessible > xRet; 688cdf0e10cSrcweir return xRet; 689cdf0e10cSrcweir } 690cdf0e10cSrcweir 691cdf0e10cSrcweir //-------------------------------------------------------------------- 692cdf0e10cSrcweir 693cdf0e10cSrcweir Reference< XAccessible > SAL_CALL AccessibleTableShape::getAccessibleSummary( ) throw (RuntimeException) 694cdf0e10cSrcweir { 695cdf0e10cSrcweir Reference< XAccessible > xRet; 696cdf0e10cSrcweir return xRet; 697cdf0e10cSrcweir } 698cdf0e10cSrcweir 699cdf0e10cSrcweir //-------------------------------------------------------------------- 700cdf0e10cSrcweir 701cdf0e10cSrcweir sal_Bool SAL_CALL AccessibleTableShape::isAccessibleSelected( sal_Int32 nRow, sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException) 702cdf0e10cSrcweir { 703cdf0e10cSrcweir ::vos::OGuard aSolarGuard (::Application::GetSolarMutex()); 704cdf0e10cSrcweir checkCellPosition( nColumn, nRow ); 705cdf0e10cSrcweir 706cdf0e10cSrcweir SvxTableController* pController = getTableController(); 707cdf0e10cSrcweir if( pController && pController->hasSelectedCells() ) 708cdf0e10cSrcweir { 709cdf0e10cSrcweir CellPos aFirstPos, aLastPos; 710cdf0e10cSrcweir pController->getSelectedCells( aFirstPos, aLastPos ); 711cdf0e10cSrcweir if( (aFirstPos.mnRow <= nRow) && (aFirstPos.mnCol <= nColumn) && (nRow <= aLastPos.mnRow) && (nColumn <= aLastPos.mnCol) ) 712cdf0e10cSrcweir return sal_True; 713cdf0e10cSrcweir } 714cdf0e10cSrcweir 715cdf0e10cSrcweir return sal_False; 716cdf0e10cSrcweir } 717cdf0e10cSrcweir 718cdf0e10cSrcweir //-------------------------------------------------------------------- 719cdf0e10cSrcweir 720cdf0e10cSrcweir sal_Int32 SAL_CALL AccessibleTableShape::getAccessibleIndex( sal_Int32 nRow, sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException) 721cdf0e10cSrcweir { 722cdf0e10cSrcweir ::vos::OGuard aSolarGuard (::Application::GetSolarMutex()); 723cdf0e10cSrcweir checkCellPosition( nColumn, nRow ); 724cdf0e10cSrcweir return mxImpl->mxTable.is() ? (nRow * mxImpl->mxTable->getColumnCount() + nColumn) : 0; 725cdf0e10cSrcweir } 726cdf0e10cSrcweir 727cdf0e10cSrcweir //-------------------------------------------------------------------- 728cdf0e10cSrcweir 729cdf0e10cSrcweir sal_Int32 SAL_CALL AccessibleTableShape::getAccessibleRow( sal_Int32 nChildIndex ) throw (IndexOutOfBoundsException, RuntimeException) 730cdf0e10cSrcweir { 731cdf0e10cSrcweir ::vos::OGuard aSolarGuard (::Application::GetSolarMutex()); 732cdf0e10cSrcweir sal_Int32 nColumn = 0, nRow = 0; 733cdf0e10cSrcweir mxImpl->getColumnAndRow( nChildIndex, nColumn, nRow ); 734cdf0e10cSrcweir return nRow; 735cdf0e10cSrcweir } 736cdf0e10cSrcweir 737cdf0e10cSrcweir //-------------------------------------------------------------------- 738cdf0e10cSrcweir 739cdf0e10cSrcweir sal_Int32 SAL_CALL AccessibleTableShape::getAccessibleColumn( sal_Int32 nChildIndex ) throw (IndexOutOfBoundsException, RuntimeException) 740cdf0e10cSrcweir { 741cdf0e10cSrcweir ::vos::OGuard aSolarGuard (::Application::GetSolarMutex()); 742cdf0e10cSrcweir sal_Int32 nColumn = 0, nRow = 0; 743cdf0e10cSrcweir mxImpl->getColumnAndRow( nChildIndex, nColumn, nRow ); 7449b8096d0SSteve Yin //return nChildIndex; 7459b8096d0SSteve Yin return nColumn; 746cdf0e10cSrcweir } 747cdf0e10cSrcweir 748cdf0e10cSrcweir //-------------------------------------------------------------------- 749cdf0e10cSrcweir // XAccessibleSelection 750cdf0e10cSrcweir //-------------------------------------------------------------------- 751cdf0e10cSrcweir 752cdf0e10cSrcweir void SAL_CALL AccessibleTableShape::selectAccessibleChild( sal_Int32 nChildIndex ) throw ( IndexOutOfBoundsException, RuntimeException ) 753cdf0e10cSrcweir { 754cdf0e10cSrcweir ::vos::OGuard aSolarGuard (::Application::GetSolarMutex()); 755cdf0e10cSrcweir CellPos aPos; 756cdf0e10cSrcweir mxImpl->getColumnAndRow( nChildIndex, aPos.mnCol, aPos.mnRow ); 757cdf0e10cSrcweir 758cdf0e10cSrcweir // todo, select table shape?!? 759cdf0e10cSrcweir SvxTableController* pController = getTableController(); 760cdf0e10cSrcweir if( pController ) 761cdf0e10cSrcweir { 762cdf0e10cSrcweir CellPos aFirstPos( aPos ), aLastPos( aPos ); 763cdf0e10cSrcweir if( pController->hasSelectedCells() ) 764cdf0e10cSrcweir { 765cdf0e10cSrcweir pController->getSelectedCells( aFirstPos, aLastPos ); 766cdf0e10cSrcweir 767cdf0e10cSrcweir aFirstPos.mnRow = std::min( aFirstPos.mnRow, aPos.mnRow ); 768cdf0e10cSrcweir aFirstPos.mnCol = std::min( aFirstPos.mnCol, aPos.mnCol ); 769cdf0e10cSrcweir aLastPos.mnRow = std::max( aLastPos.mnRow, aPos.mnRow ); 770cdf0e10cSrcweir aLastPos.mnCol = std::max( aLastPos.mnCol, aPos.mnCol ); 771cdf0e10cSrcweir } 772cdf0e10cSrcweir pController->setSelectedCells( aFirstPos, aLastPos ); 773cdf0e10cSrcweir } 774cdf0e10cSrcweir } 775cdf0e10cSrcweir 776cdf0e10cSrcweir //-------------------------------------------------------------------- 777cdf0e10cSrcweir 778cdf0e10cSrcweir sal_Bool SAL_CALL AccessibleTableShape::isAccessibleChildSelected( sal_Int32 nChildIndex ) throw ( IndexOutOfBoundsException, RuntimeException ) 779cdf0e10cSrcweir { 780cdf0e10cSrcweir ::vos::OGuard aSolarGuard (::Application::GetSolarMutex()); 781cdf0e10cSrcweir CellPos aPos; 782cdf0e10cSrcweir mxImpl->getColumnAndRow( nChildIndex, aPos.mnCol, aPos.mnRow ); 783cdf0e10cSrcweir 7849b8096d0SSteve Yin // Para order is not correct 7859b8096d0SSteve Yin //return isAccessibleSelected(aPos.mnCol, aPos.mnRow); 7869b8096d0SSteve Yin return isAccessibleSelected(aPos.mnRow, aPos.mnCol); 787cdf0e10cSrcweir } 788cdf0e10cSrcweir 789cdf0e10cSrcweir //-------------------------------------------------------------------- 790cdf0e10cSrcweir 791cdf0e10cSrcweir void SAL_CALL AccessibleTableShape::clearAccessibleSelection() throw ( RuntimeException ) 792cdf0e10cSrcweir { 793cdf0e10cSrcweir ::vos::OGuard aSolarGuard (::Application::GetSolarMutex()); 794cdf0e10cSrcweir 795cdf0e10cSrcweir SvxTableController* pController = getTableController(); 796cdf0e10cSrcweir if( pController ) 797cdf0e10cSrcweir pController->clearSelection(); 798cdf0e10cSrcweir } 799cdf0e10cSrcweir //-------------------------------------------------------------------- 800cdf0e10cSrcweir 801cdf0e10cSrcweir void SAL_CALL AccessibleTableShape::selectAllAccessibleChildren() throw ( RuntimeException ) 802cdf0e10cSrcweir { 803cdf0e10cSrcweir ::vos::OGuard aSolarGuard (::Application::GetSolarMutex()); 804cdf0e10cSrcweir 805cdf0e10cSrcweir // todo: force selection of shape? 806cdf0e10cSrcweir SvxTableController* pController = getTableController(); 807cdf0e10cSrcweir if( pController ) 808cdf0e10cSrcweir pController->selectAll(); 809cdf0e10cSrcweir } 810cdf0e10cSrcweir 811cdf0e10cSrcweir //-------------------------------------------------------------------- 812cdf0e10cSrcweir 813cdf0e10cSrcweir sal_Int32 SAL_CALL AccessibleTableShape::getSelectedAccessibleChildCount() throw ( RuntimeException ) 814cdf0e10cSrcweir { 815cdf0e10cSrcweir ::vos::OGuard aSolarGuard (::Application::GetSolarMutex()); 816cdf0e10cSrcweir 817cdf0e10cSrcweir SvxTableController* pController = getTableController(); 818cdf0e10cSrcweir if( pController && pController->hasSelectedCells() ) 819cdf0e10cSrcweir { 820cdf0e10cSrcweir CellPos aFirstPos, aLastPos; 821cdf0e10cSrcweir pController->getSelectedCells( aFirstPos, aLastPos ); 822cdf0e10cSrcweir 823cdf0e10cSrcweir const sal_Int32 nSelectedColumns = std::max( (sal_Int32)0, aLastPos.mnCol - aFirstPos.mnCol ) + 1; 824cdf0e10cSrcweir const sal_Int32 nSelectedRows = std::max( (sal_Int32)0, aLastPos.mnRow - aFirstPos.mnRow ) + 1; 825cdf0e10cSrcweir return nSelectedRows * nSelectedColumns; 826cdf0e10cSrcweir } 827cdf0e10cSrcweir 828cdf0e10cSrcweir return 0; 829cdf0e10cSrcweir } 830cdf0e10cSrcweir 831cdf0e10cSrcweir //-------------------------------------------------------------------- 832cdf0e10cSrcweir 833cdf0e10cSrcweir Reference< XAccessible > SAL_CALL AccessibleTableShape::getSelectedAccessibleChild( sal_Int32 nSelectedChildIndex ) throw ( IndexOutOfBoundsException, RuntimeException) 834cdf0e10cSrcweir { 835cdf0e10cSrcweir ::vos::OGuard aSolarGuard (::Application::GetSolarMutex()); 836cdf0e10cSrcweir 8379b8096d0SSteve Yin /*SvxTableController* pController = getTableController(); 838cdf0e10cSrcweir if( pController && pController->hasSelectedCells() ) 839cdf0e10cSrcweir { 840cdf0e10cSrcweir CellPos aFirstPos, aLastPos; 841cdf0e10cSrcweir pController->getSelectedCells( aFirstPos, aLastPos ); 842cdf0e10cSrcweir 843cdf0e10cSrcweir const sal_Int32 nSelectedColumns = std::max( (sal_Int32)0, aLastPos.mnCol - aFirstPos.mnCol ) + 1; 844cdf0e10cSrcweir const sal_Int32 nSelectedRows = std::max( (sal_Int32)0, aLastPos.mnRow - aFirstPos.mnRow ) + 1; 845cdf0e10cSrcweir 846cdf0e10cSrcweir if( nSelectedChildIndex < (nSelectedRows * nSelectedColumns) ) 847cdf0e10cSrcweir { 848cdf0e10cSrcweir while( nSelectedChildIndex >= nSelectedColumns ) 849cdf0e10cSrcweir { 850cdf0e10cSrcweir aFirstPos.mnRow++; 851cdf0e10cSrcweir nSelectedChildIndex -= nSelectedColumns; 852cdf0e10cSrcweir } 853cdf0e10cSrcweir return getAccessibleCellAt( nSelectedColumns, aFirstPos.mnRow ); 854cdf0e10cSrcweir } 855cdf0e10cSrcweir } 856cdf0e10cSrcweir 857cdf0e10cSrcweir throw IndexOutOfBoundsException(); 8589b8096d0SSteve Yin */ 8599b8096d0SSteve Yin if( nSelectedChildIndex < 0 ) 8609b8096d0SSteve Yin throw IndexOutOfBoundsException(); 8619b8096d0SSteve Yin 8629b8096d0SSteve Yin sal_Int32 nChildIndex = GetIndexOfSelectedChild( nSelectedChildIndex ); 8639b8096d0SSteve Yin 8649b8096d0SSteve Yin if( nChildIndex < 0 ) 8659b8096d0SSteve Yin throw IndexOutOfBoundsException(); 8669b8096d0SSteve Yin 8679b8096d0SSteve Yin if ( nChildIndex >= getAccessibleChildCount() ) 8689b8096d0SSteve Yin { 8699b8096d0SSteve Yin throw IndexOutOfBoundsException(); 8709b8096d0SSteve Yin } 8719b8096d0SSteve Yin 8729b8096d0SSteve Yin return getAccessibleChild( nChildIndex ); 873cdf0e10cSrcweir } 874cdf0e10cSrcweir 875cdf0e10cSrcweir //-------------------------------------------------------------------- 876cdf0e10cSrcweir 877cdf0e10cSrcweir void SAL_CALL AccessibleTableShape::deselectAccessibleChild( sal_Int32 nChildIndex ) throw ( IndexOutOfBoundsException, RuntimeException ) 878cdf0e10cSrcweir { 879cdf0e10cSrcweir ::vos::OGuard aSolarGuard (::Application::GetSolarMutex()); 880cdf0e10cSrcweir CellPos aPos; 881cdf0e10cSrcweir mxImpl->getColumnAndRow( nChildIndex, aPos.mnCol, aPos.mnRow ); 882cdf0e10cSrcweir 883cdf0e10cSrcweir // todo, select table shape?!? 884cdf0e10cSrcweir SvxTableController* pController = getTableController(); 885cdf0e10cSrcweir if( pController && pController->hasSelectedCells() ) 886cdf0e10cSrcweir { 887cdf0e10cSrcweir CellPos aFirstPos, aLastPos; 888cdf0e10cSrcweir pController->getSelectedCells( aFirstPos, aLastPos ); 889cdf0e10cSrcweir 890cdf0e10cSrcweir // create a selection where aPos is not part of anymore 891cdf0e10cSrcweir aFirstPos.mnRow = std::min( aFirstPos.mnRow, aPos.mnRow+1 ); 892cdf0e10cSrcweir aFirstPos.mnCol = std::min( aFirstPos.mnCol, aPos.mnCol+1 ); 893cdf0e10cSrcweir aLastPos.mnRow = std::max( aLastPos.mnRow, aPos.mnRow-1 ); 894cdf0e10cSrcweir aLastPos.mnCol = std::max( aLastPos.mnCol, aPos.mnCol-1 ); 895cdf0e10cSrcweir 896cdf0e10cSrcweir // new selection may be invalid (child to deselect is not at a border of the selection but in between) 897cdf0e10cSrcweir if( (aFirstPos.mnRow > aLastPos.mnRow) || (aFirstPos.mnCol > aLastPos.mnCol) ) 898cdf0e10cSrcweir pController->clearSelection(); // if selection is invalid, clear all 899cdf0e10cSrcweir else 900cdf0e10cSrcweir pController->setSelectedCells( aFirstPos, aLastPos ); 901cdf0e10cSrcweir } 902cdf0e10cSrcweir } 903cdf0e10cSrcweir //-------------------------------------------------------------------- 904cdf0e10cSrcweir 9059b8096d0SSteve Yin //===== XAccessibleTableSelection ============================================ 9069b8096d0SSteve Yin sal_Bool SAL_CALL AccessibleTableShape::selectRow( sal_Int32 row ) 9079b8096d0SSteve Yin throw (IndexOutOfBoundsException, RuntimeException) 9089b8096d0SSteve Yin { 9099b8096d0SSteve Yin ::vos::OGuard aSolarGuard (::Application::GetSolarMutex()); 9109b8096d0SSteve Yin SvxTableController* pController = getTableController(); 9119b8096d0SSteve Yin if( !pController ) 9129b8096d0SSteve Yin return sal_False; 9139b8096d0SSteve Yin return pController->selectRow( row ); 9149b8096d0SSteve Yin } 9159b8096d0SSteve Yin sal_Bool SAL_CALL AccessibleTableShape::selectColumn( sal_Int32 column ) 9169b8096d0SSteve Yin throw (IndexOutOfBoundsException, RuntimeException) 9179b8096d0SSteve Yin { 9189b8096d0SSteve Yin ::vos::OGuard aSolarGuard (::Application::GetSolarMutex()); 9199b8096d0SSteve Yin SvxTableController* pController = getTableController(); 9209b8096d0SSteve Yin if( !pController ) 9219b8096d0SSteve Yin return sal_False; 9229b8096d0SSteve Yin return pController->selectColumn( column ); 9239b8096d0SSteve Yin } 9249b8096d0SSteve Yin sal_Bool SAL_CALL AccessibleTableShape::unselectRow( sal_Int32 row ) 9259b8096d0SSteve Yin throw (IndexOutOfBoundsException, RuntimeException) 9269b8096d0SSteve Yin { 9279b8096d0SSteve Yin ::vos::OGuard aSolarGuard (::Application::GetSolarMutex()); 9289b8096d0SSteve Yin SvxTableController* pController = getTableController(); 9299b8096d0SSteve Yin if( !pController ) 9309b8096d0SSteve Yin return sal_False; 9319b8096d0SSteve Yin return pController->deselectRow( row ); 9329b8096d0SSteve Yin } 9339b8096d0SSteve Yin sal_Bool SAL_CALL AccessibleTableShape::unselectColumn( sal_Int32 column ) 9349b8096d0SSteve Yin throw (IndexOutOfBoundsException, RuntimeException) 9359b8096d0SSteve Yin { 9369b8096d0SSteve Yin ::vos::OGuard aSolarGuard (::Application::GetSolarMutex()); 9379b8096d0SSteve Yin SvxTableController* pController = getTableController(); 9389b8096d0SSteve Yin if( !pController ) 9399b8096d0SSteve Yin return sal_False; 9409b8096d0SSteve Yin return pController->deselectColumn( column ); 9419b8096d0SSteve Yin } 9429b8096d0SSteve Yin sal_Int32 AccessibleTableShape::GetIndexOfSelectedChild( 9439b8096d0SSteve Yin sal_Int32 nSelectedChildIndex ) const 9449b8096d0SSteve Yin { 9459b8096d0SSteve Yin sal_Int32 nChildren = const_cast<AccessibleTableShape*>(this)->getAccessibleChildCount(); 9469b8096d0SSteve Yin 9479b8096d0SSteve Yin if( nSelectedChildIndex >= nChildren ) 9489b8096d0SSteve Yin return -1L; 9499b8096d0SSteve Yin 9509b8096d0SSteve Yin sal_Int32 n = 0; 9519b8096d0SSteve Yin while( n < nChildren ) 9529b8096d0SSteve Yin { 9539b8096d0SSteve Yin if( const_cast<AccessibleTableShape*>(this)->isAccessibleChildSelected( n ) ) 9549b8096d0SSteve Yin { 9559b8096d0SSteve Yin if( 0 == nSelectedChildIndex ) 9569b8096d0SSteve Yin break; 9579b8096d0SSteve Yin else 9589b8096d0SSteve Yin --nSelectedChildIndex; 9599b8096d0SSteve Yin } 9609b8096d0SSteve Yin ++n; 9619b8096d0SSteve Yin } 9629b8096d0SSteve Yin 9639b8096d0SSteve Yin return n < nChildren ? n : -1L; 9649b8096d0SSteve Yin } 9659b8096d0SSteve Yin void AccessibleTableShape::getColumnAndRow( sal_Int32 nChildIndex, sal_Int32& rnColumn, sal_Int32& rnRow ) throw (IndexOutOfBoundsException ) 9669b8096d0SSteve Yin { 9679b8096d0SSteve Yin mxImpl->getColumnAndRow(nChildIndex, rnColumn, rnRow); 9689b8096d0SSteve Yin } 9699b8096d0SSteve Yin //-------------------------------------------------------------------- 9709b8096d0SSteve Yin // XSelectionChangeListener 9719b8096d0SSteve Yin void SAL_CALL 9729b8096d0SSteve Yin AccessibleTableShape::disposing (const EventObject& aEvent) 9739b8096d0SSteve Yin throw (RuntimeException) 9749b8096d0SSteve Yin { 9759b8096d0SSteve Yin AccessibleShape::disposing(aEvent); 9769b8096d0SSteve Yin } 9779b8096d0SSteve Yin void SAL_CALL AccessibleTableShape::selectionChanged (const EventObject& rEvent) 9789b8096d0SSteve Yin throw (RuntimeException) 9799b8096d0SSteve Yin { 9809b8096d0SSteve Yin //::sdr::table::CellRef xCellRef = static_cast< ::sdr::table::CellRef > (rEvent.Source); 9819b8096d0SSteve Yin Reference< XCell > xCell(rEvent.Source, UNO_QUERY); 9829b8096d0SSteve Yin if (xCell.is()) 9839b8096d0SSteve Yin { 9849b8096d0SSteve Yin Reference< AccessibleCell > xAccCell = mxImpl->getAccessibleCell( xCell ); 9859b8096d0SSteve Yin if (xAccCell.is()) 9869b8096d0SSteve Yin { 9879b8096d0SSteve Yin sal_Int32 nIndex = xAccCell->getAccessibleIndexInParent(), 9889b8096d0SSteve Yin nCount = getSelectedAccessibleChildCount(); 9899b8096d0SSteve Yin sal_Bool bSelected = isAccessibleChildSelected(nIndex); 9909b8096d0SSteve Yin if (mnPreviousSelectionCount == 0 && nCount > 0 && bSelected) 9919b8096d0SSteve Yin { 9929b8096d0SSteve Yin xAccCell->SetState(AccessibleStateType::SELECTED); 9939b8096d0SSteve Yin xAccCell->CommitChange(AccessibleEventId::SELECTION_CHANGED, Any(), Any()); 9949b8096d0SSteve Yin } 9959b8096d0SSteve Yin else if (bSelected) 9969b8096d0SSteve Yin { 9979b8096d0SSteve Yin xAccCell->SetState(AccessibleStateType::SELECTED); 9989b8096d0SSteve Yin xAccCell->CommitChange(AccessibleEventId::SELECTION_CHANGED_ADD, Any(), Any()); 9999b8096d0SSteve Yin } 10009b8096d0SSteve Yin else 10019b8096d0SSteve Yin { 10029b8096d0SSteve Yin xAccCell->ResetState(AccessibleStateType::SELECTED); 10039b8096d0SSteve Yin xAccCell->CommitChange(AccessibleEventId::SELECTION_CHANGED_REMOVE, Any(), Any()); 10049b8096d0SSteve Yin } 10059b8096d0SSteve Yin mnPreviousSelectionCount = nCount; 10069b8096d0SSteve Yin } 10079b8096d0SSteve Yin } 10089b8096d0SSteve Yin } 10099b8096d0SSteve Yin // Get the currently active cell which is text editing 10109b8096d0SSteve Yin AccessibleCell* AccessibleTableShape::GetActiveAccessibleCell() 10119b8096d0SSteve Yin { 10129b8096d0SSteve Yin sal_Bool bCellEditing = sal_False; 10139b8096d0SSteve Yin Reference< AccessibleCell > xAccCell; 10149b8096d0SSteve Yin AccessibleCell* pAccCell = NULL; 10159b8096d0SSteve Yin SvxTableController* pController = getTableController(); 10169b8096d0SSteve Yin if (pController) 10179b8096d0SSteve Yin { 10189b8096d0SSteve Yin ::sdr::table::SdrTableObj* pTableObj = pController->GetTableObj(); 10199b8096d0SSteve Yin if ( pTableObj ) 10209b8096d0SSteve Yin { 10219b8096d0SSteve Yin ::sdr::table::CellRef xCellRef (pTableObj->getActiveCell()); 10229b8096d0SSteve Yin if ( xCellRef.is() ) 10239b8096d0SSteve Yin { 10249b8096d0SSteve Yin bCellEditing = xCellRef->IsTextEditActive(); 10259b8096d0SSteve Yin if (bCellEditing) 10269b8096d0SSteve Yin { 10279b8096d0SSteve Yin //Reference< XCell > xCell(xCellRef.get(), UNO_QUERY); 10289b8096d0SSteve Yin xAccCell = mxImpl->getAccessibleCell(Reference< XCell >( xCellRef.get() )); 10299b8096d0SSteve Yin if (xAccCell.is()) 10309b8096d0SSteve Yin pAccCell = xAccCell.get(); 10319b8096d0SSteve Yin } 10329b8096d0SSteve Yin } 10339b8096d0SSteve Yin } 10349b8096d0SSteve Yin } 10359b8096d0SSteve Yin return pAccCell; 10369b8096d0SSteve Yin } 10379b8096d0SSteve Yin //-------------------------------------------------------------------- 10389b8096d0SSteve Yin //If current active cell is in editing, the focus state should be set to internal text 10399b8096d0SSteve Yin sal_Bool AccessibleTableShape::SetState (sal_Int16 aState) 10409b8096d0SSteve Yin { 10419b8096d0SSteve Yin AccessibleCell* pActiveAccessibleCell = GetActiveAccessibleCell(); 10429b8096d0SSteve Yin sal_Bool bStateHasChanged = sal_False; 10439b8096d0SSteve Yin if (aState == AccessibleStateType::FOCUSED && pActiveAccessibleCell != NULL) 10449b8096d0SSteve Yin { 10459b8096d0SSteve Yin return pActiveAccessibleCell->SetState(aState); 10469b8096d0SSteve Yin } 10479b8096d0SSteve Yin else 10489b8096d0SSteve Yin bStateHasChanged = AccessibleShape::SetState (aState); 10499b8096d0SSteve Yin return bStateHasChanged; 10509b8096d0SSteve Yin } 10519b8096d0SSteve Yin //-------------------------------------------------------------------- 10529b8096d0SSteve Yin //If current active cell is in editing, the focus state should be reset to internal text 10539b8096d0SSteve Yin sal_Bool AccessibleTableShape::ResetState (sal_Int16 aState) 10549b8096d0SSteve Yin { 10559b8096d0SSteve Yin AccessibleCell* pActiveAccessibleCell = GetActiveAccessibleCell(); 10569b8096d0SSteve Yin sal_Bool bStateHasChanged = sal_False; 10579b8096d0SSteve Yin if (aState == AccessibleStateType::FOCUSED && pActiveAccessibleCell != NULL) 10589b8096d0SSteve Yin { 10599b8096d0SSteve Yin return pActiveAccessibleCell->ResetState(aState); 10609b8096d0SSteve Yin } 10619b8096d0SSteve Yin else 10629b8096d0SSteve Yin bStateHasChanged = AccessibleShape::ResetState (aState); 10639b8096d0SSteve Yin return bStateHasChanged; 10649b8096d0SSteve Yin } 10659b8096d0SSteve Yin //-------------------------------------------------------------------- 10669b8096d0SSteve Yin sal_Bool AccessibleTableShape::SetStateDirectly (sal_Int16 aState) 10679b8096d0SSteve Yin { 10689b8096d0SSteve Yin return AccessibleContextBase::SetState (aState); 10699b8096d0SSteve Yin } 10709b8096d0SSteve Yin //-------------------------------------------------------------------- 10719b8096d0SSteve Yin sal_Bool AccessibleTableShape::ResetStateDirectly (sal_Int16 aState) 10729b8096d0SSteve Yin { 10739b8096d0SSteve Yin return AccessibleContextBase::ResetState (aState); 10749b8096d0SSteve Yin } 1075cdf0e10cSrcweir void AccessibleTableShape::checkCellPosition( sal_Int32 nCol, sal_Int32 nRow ) throw ( IndexOutOfBoundsException ) 1076cdf0e10cSrcweir { 1077cdf0e10cSrcweir if( (nCol >= 0) && (nRow >= 0) && mxImpl->mxTable.is() && (nCol < mxImpl->mxTable->getColumnCount()) && (nRow < mxImpl->mxTable->getRowCount()) ) 1078cdf0e10cSrcweir return; 1079cdf0e10cSrcweir 1080cdf0e10cSrcweir throw IndexOutOfBoundsException(); 1081cdf0e10cSrcweir } 1082cdf0e10cSrcweir 10839b8096d0SSteve Yin AccessibleTableHeaderShape::AccessibleTableHeaderShape( AccessibleTableShape* pTable, sal_Bool bRow ) 10849b8096d0SSteve Yin { 10859b8096d0SSteve Yin mpTable = pTable; 10869b8096d0SSteve Yin mbRow = bRow; 10879b8096d0SSteve Yin } 10889b8096d0SSteve Yin 10899b8096d0SSteve Yin AccessibleTableHeaderShape::~AccessibleTableHeaderShape (void) 10909b8096d0SSteve Yin { 10919b8096d0SSteve Yin mpTable = NULL; 10929b8096d0SSteve Yin } 10939b8096d0SSteve Yin 10949b8096d0SSteve Yin // XAccessible 10959b8096d0SSteve Yin Reference< XAccessibleContext > SAL_CALL AccessibleTableHeaderShape::getAccessibleContext(void) throw (RuntimeException) 10969b8096d0SSteve Yin { 10979b8096d0SSteve Yin return this; 10989b8096d0SSteve Yin } 10999b8096d0SSteve Yin 11009b8096d0SSteve Yin // XAccessibleContext 11019b8096d0SSteve Yin sal_Int32 SAL_CALL AccessibleTableHeaderShape::getAccessibleChildCount( ) throw(RuntimeException) 11029b8096d0SSteve Yin { 11039b8096d0SSteve Yin return getAccessibleRowCount() * getAccessibleColumnCount(); 11049b8096d0SSteve Yin } 11059b8096d0SSteve Yin 11069b8096d0SSteve Yin Reference< XAccessible > SAL_CALL AccessibleTableHeaderShape::getAccessibleChild( sal_Int32 i ) throw(IndexOutOfBoundsException, RuntimeException) 11079b8096d0SSteve Yin { 11089b8096d0SSteve Yin return mpTable->getAccessibleChild( i ); 11099b8096d0SSteve Yin } 11109b8096d0SSteve Yin 11119b8096d0SSteve Yin Reference< XAccessible > SAL_CALL AccessibleTableHeaderShape::getAccessibleParent (void) throw (RuntimeException) 11129b8096d0SSteve Yin { 11139b8096d0SSteve Yin Reference< XAccessible > XParent; 11149b8096d0SSteve Yin return XParent; 11159b8096d0SSteve Yin } 11169b8096d0SSteve Yin 11179b8096d0SSteve Yin sal_Int32 SAL_CALL AccessibleTableHeaderShape::getAccessibleIndexInParent (void) throw (RuntimeException) 11189b8096d0SSteve Yin { 11199b8096d0SSteve Yin return -1; 11209b8096d0SSteve Yin } 11219b8096d0SSteve Yin 11229b8096d0SSteve Yin sal_Int16 SAL_CALL AccessibleTableHeaderShape::getAccessibleRole (void) throw (RuntimeException) 11239b8096d0SSteve Yin { 11249b8096d0SSteve Yin return mpTable->getAccessibleRole(); 11259b8096d0SSteve Yin } 11269b8096d0SSteve Yin 11279b8096d0SSteve Yin OUString SAL_CALL AccessibleTableHeaderShape::getAccessibleDescription (void) throw (RuntimeException) 11289b8096d0SSteve Yin { 11299b8096d0SSteve Yin return mpTable->getAccessibleDescription(); 11309b8096d0SSteve Yin } 11319b8096d0SSteve Yin 11329b8096d0SSteve Yin OUString SAL_CALL AccessibleTableHeaderShape::getAccessibleName (void) throw (RuntimeException) 11339b8096d0SSteve Yin { 11349b8096d0SSteve Yin return mpTable->getAccessibleName(); 11359b8096d0SSteve Yin } 11369b8096d0SSteve Yin 11379b8096d0SSteve Yin Reference< XAccessibleStateSet > SAL_CALL AccessibleTableHeaderShape::getAccessibleStateSet (void) throw (RuntimeException) 11389b8096d0SSteve Yin { 11399b8096d0SSteve Yin return mpTable->getAccessibleStateSet(); 11409b8096d0SSteve Yin } 11419b8096d0SSteve Yin 11429b8096d0SSteve Yin Reference< XAccessibleRelationSet > SAL_CALL AccessibleTableHeaderShape::getAccessibleRelationSet (void) throw (RuntimeException) 11439b8096d0SSteve Yin { 11449b8096d0SSteve Yin return mpTable->getAccessibleRelationSet(); 11459b8096d0SSteve Yin } 11469b8096d0SSteve Yin 11479b8096d0SSteve Yin Locale SAL_CALL AccessibleTableHeaderShape::getLocale (void) throw (IllegalAccessibleComponentStateException, RuntimeException) 11489b8096d0SSteve Yin { 11499b8096d0SSteve Yin return mpTable->getLocale(); 11509b8096d0SSteve Yin } 11519b8096d0SSteve Yin 11529b8096d0SSteve Yin //XAccessibleComponent 11539b8096d0SSteve Yin sal_Bool SAL_CALL AccessibleTableHeaderShape::containsPoint ( const ::com::sun::star::awt::Point& aPoint ) throw (RuntimeException) 11549b8096d0SSteve Yin { 11559b8096d0SSteve Yin return mpTable->containsPoint( aPoint ); 11569b8096d0SSteve Yin } 11579b8096d0SSteve Yin 11589b8096d0SSteve Yin Reference< XAccessible > SAL_CALL AccessibleTableHeaderShape::getAccessibleAtPoint ( const ::com::sun::star::awt::Point& aPoint) throw (RuntimeException) 11599b8096d0SSteve Yin { 11609b8096d0SSteve Yin return mpTable->getAccessibleAtPoint( aPoint ); 11619b8096d0SSteve Yin } 11629b8096d0SSteve Yin 11639b8096d0SSteve Yin ::com::sun::star::awt::Rectangle SAL_CALL AccessibleTableHeaderShape::getBounds (void) throw (RuntimeException) 11649b8096d0SSteve Yin { 11659b8096d0SSteve Yin return mpTable->getBounds(); 11669b8096d0SSteve Yin } 11679b8096d0SSteve Yin 11689b8096d0SSteve Yin ::com::sun::star::awt::Point SAL_CALL AccessibleTableHeaderShape::getLocation (void) throw (RuntimeException) 11699b8096d0SSteve Yin { 11709b8096d0SSteve Yin return mpTable->getLocation(); 11719b8096d0SSteve Yin } 11729b8096d0SSteve Yin 11739b8096d0SSteve Yin ::com::sun::star::awt::Point SAL_CALL AccessibleTableHeaderShape::getLocationOnScreen (void) throw (RuntimeException) 11749b8096d0SSteve Yin { 11759b8096d0SSteve Yin return mpTable->getLocationOnScreen(); 11769b8096d0SSteve Yin } 11779b8096d0SSteve Yin 11789b8096d0SSteve Yin ::com::sun::star::awt::Size SAL_CALL AccessibleTableHeaderShape::getSize (void) throw (RuntimeException) 11799b8096d0SSteve Yin { 11809b8096d0SSteve Yin return mpTable->getSize(); 11819b8096d0SSteve Yin } 11829b8096d0SSteve Yin 11839b8096d0SSteve Yin sal_Int32 SAL_CALL AccessibleTableHeaderShape::getForeground (void) throw (RuntimeException) 11849b8096d0SSteve Yin { 11859b8096d0SSteve Yin return mpTable->getForeground(); 11869b8096d0SSteve Yin } 11879b8096d0SSteve Yin 11889b8096d0SSteve Yin sal_Int32 SAL_CALL AccessibleTableHeaderShape::getBackground (void) throw (RuntimeException) 11899b8096d0SSteve Yin { 11909b8096d0SSteve Yin return mpTable->getBackground(); 11919b8096d0SSteve Yin } 11929b8096d0SSteve Yin 11939b8096d0SSteve Yin void SAL_CALL AccessibleTableHeaderShape::grabFocus (void) throw (RuntimeException) 11949b8096d0SSteve Yin { 11959b8096d0SSteve Yin mpTable->grabFocus(); 11969b8096d0SSteve Yin } 11979b8096d0SSteve Yin //===== XAccessibleTable ============================================ 11989b8096d0SSteve Yin 11999b8096d0SSteve Yin sal_Int32 SAL_CALL AccessibleTableHeaderShape::getAccessibleRowCount() throw (RuntimeException) 12009b8096d0SSteve Yin { 12019b8096d0SSteve Yin return mbRow ? 1 : mpTable->getAccessibleRowCount(); 12029b8096d0SSteve Yin } 12039b8096d0SSteve Yin 12049b8096d0SSteve Yin sal_Int32 SAL_CALL AccessibleTableHeaderShape::getAccessibleColumnCount() throw (RuntimeException) 12059b8096d0SSteve Yin { 12069b8096d0SSteve Yin return !mbRow ? 1 : mpTable->getAccessibleColumnCount(); 12079b8096d0SSteve Yin } 12089b8096d0SSteve Yin 12099b8096d0SSteve Yin OUString SAL_CALL AccessibleTableHeaderShape::getAccessibleRowDescription( sal_Int32 nRow ) throw (IndexOutOfBoundsException, RuntimeException) 12109b8096d0SSteve Yin { 12119b8096d0SSteve Yin return mpTable->getAccessibleRowDescription( nRow ); 12129b8096d0SSteve Yin } 12139b8096d0SSteve Yin 12149b8096d0SSteve Yin OUString SAL_CALL AccessibleTableHeaderShape::getAccessibleColumnDescription( sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException) 12159b8096d0SSteve Yin { 12169b8096d0SSteve Yin return mpTable->getAccessibleColumnDescription( nColumn ); 12179b8096d0SSteve Yin } 12189b8096d0SSteve Yin 12199b8096d0SSteve Yin sal_Int32 SAL_CALL AccessibleTableHeaderShape::getAccessibleRowExtentAt( sal_Int32 nRow, sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException) 12209b8096d0SSteve Yin { 12219b8096d0SSteve Yin return mpTable->getAccessibleRowExtentAt( nRow, nColumn ); 12229b8096d0SSteve Yin } 12239b8096d0SSteve Yin 12249b8096d0SSteve Yin sal_Int32 SAL_CALL AccessibleTableHeaderShape::getAccessibleColumnExtentAt( sal_Int32 nRow, sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException) 12259b8096d0SSteve Yin { 12269b8096d0SSteve Yin return mpTable->getAccessibleColumnExtentAt( nRow, nColumn ); 12279b8096d0SSteve Yin } 12289b8096d0SSteve Yin 12299b8096d0SSteve Yin Reference< XAccessibleTable > SAL_CALL AccessibleTableHeaderShape::getAccessibleRowHeaders( ) throw (RuntimeException) 12309b8096d0SSteve Yin { 12319b8096d0SSteve Yin Reference< XAccessibleTable > xRet; 12329b8096d0SSteve Yin return xRet; 12339b8096d0SSteve Yin } 12349b8096d0SSteve Yin 12359b8096d0SSteve Yin Reference< XAccessibleTable > SAL_CALL AccessibleTableHeaderShape::getAccessibleColumnHeaders( ) throw (RuntimeException) 12369b8096d0SSteve Yin { 12379b8096d0SSteve Yin Reference< XAccessibleTable > xRet; 12389b8096d0SSteve Yin return xRet; 12399b8096d0SSteve Yin } 12409b8096d0SSteve Yin 12419b8096d0SSteve Yin Sequence< sal_Int32 > SAL_CALL AccessibleTableHeaderShape::getSelectedAccessibleRows( ) throw (RuntimeException) 12429b8096d0SSteve Yin { 12439b8096d0SSteve Yin sal_Int32 nRow = getAccessibleRowCount(); 12449b8096d0SSteve Yin ::std::vector< sal_Bool > aSelected( nRow, sal_True ); 12459b8096d0SSteve Yin sal_Int32 nCount = nRow; 12469b8096d0SSteve Yin for( sal_Int32 i = 0; i < nRow; i++ ) 12479b8096d0SSteve Yin { 12489b8096d0SSteve Yin try 12499b8096d0SSteve Yin { 12509b8096d0SSteve Yin aSelected[i] = isAccessibleRowSelected( i ); 12519b8096d0SSteve Yin } 12529b8096d0SSteve Yin catch( ... ) 12539b8096d0SSteve Yin { 12549b8096d0SSteve Yin return Sequence< sal_Int32 >(); 12559b8096d0SSteve Yin } 12569b8096d0SSteve Yin 12579b8096d0SSteve Yin if( !aSelected[i] ) 12589b8096d0SSteve Yin nCount--; 12599b8096d0SSteve Yin } 12609b8096d0SSteve Yin Sequence < sal_Int32 > aRet( nCount ); 12619b8096d0SSteve Yin sal_Int32 *pRet = aRet.getArray(); 12629b8096d0SSteve Yin sal_Int32 nPos = 0; 12639b8096d0SSteve Yin size_t nSize = aSelected.size(); 12649b8096d0SSteve Yin for( size_t i=0; i < nSize && nPos < nCount; i++ ) 12659b8096d0SSteve Yin { 12669b8096d0SSteve Yin if( aSelected[i] ) 12679b8096d0SSteve Yin { 12689b8096d0SSteve Yin *pRet++ = i; 12699b8096d0SSteve Yin nPos++; 12709b8096d0SSteve Yin } 12719b8096d0SSteve Yin } 12729b8096d0SSteve Yin 12739b8096d0SSteve Yin return aRet; 12749b8096d0SSteve Yin } 12759b8096d0SSteve Yin 12769b8096d0SSteve Yin Sequence< sal_Int32 > SAL_CALL AccessibleTableHeaderShape::getSelectedAccessibleColumns( ) throw (RuntimeException) 12779b8096d0SSteve Yin { 12789b8096d0SSteve Yin sal_Int32 nColumn = getAccessibleColumnCount(); 12799b8096d0SSteve Yin ::std::vector< sal_Bool > aSelected( nColumn, sal_True ); 12809b8096d0SSteve Yin sal_Int32 nCount = nColumn; 12819b8096d0SSteve Yin for( sal_Int32 i = 0; i < nColumn; i++ ) 12829b8096d0SSteve Yin { 12839b8096d0SSteve Yin try 12849b8096d0SSteve Yin { 12859b8096d0SSteve Yin aSelected[i] = isAccessibleColumnSelected( i ); 12869b8096d0SSteve Yin } 12879b8096d0SSteve Yin catch( ... ) 12889b8096d0SSteve Yin { 12899b8096d0SSteve Yin return Sequence< sal_Int32 >(); 12909b8096d0SSteve Yin } 12919b8096d0SSteve Yin 12929b8096d0SSteve Yin if( !aSelected[i] ) 12939b8096d0SSteve Yin nCount--; 12949b8096d0SSteve Yin } 12959b8096d0SSteve Yin Sequence < sal_Int32 > aRet( nCount ); 12969b8096d0SSteve Yin sal_Int32 *pRet = aRet.getArray(); 12979b8096d0SSteve Yin sal_Int32 nPos = 0; 12989b8096d0SSteve Yin size_t nSize = aSelected.size(); 12999b8096d0SSteve Yin for( size_t i=0; i < nSize && nPos < nCount; i++ ) 13009b8096d0SSteve Yin { 13019b8096d0SSteve Yin if( aSelected[i] ) 13029b8096d0SSteve Yin { 13039b8096d0SSteve Yin *pRet++ = i; 13049b8096d0SSteve Yin nPos++; 13059b8096d0SSteve Yin } 13069b8096d0SSteve Yin } 13079b8096d0SSteve Yin 13089b8096d0SSteve Yin return aRet; 13099b8096d0SSteve Yin } 13109b8096d0SSteve Yin 13119b8096d0SSteve Yin sal_Bool SAL_CALL AccessibleTableHeaderShape::isAccessibleRowSelected( sal_Int32 nRow ) throw (IndexOutOfBoundsException, RuntimeException) 13129b8096d0SSteve Yin { 13139b8096d0SSteve Yin return mpTable->isAccessibleRowSelected( nRow ); 13149b8096d0SSteve Yin } 13159b8096d0SSteve Yin 13169b8096d0SSteve Yin sal_Bool SAL_CALL AccessibleTableHeaderShape::isAccessibleColumnSelected( sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException) 13179b8096d0SSteve Yin { 13189b8096d0SSteve Yin return mpTable->isAccessibleColumnSelected( nColumn ); 13199b8096d0SSteve Yin } 13209b8096d0SSteve Yin 13219b8096d0SSteve Yin Reference< XAccessible > SAL_CALL AccessibleTableHeaderShape::getAccessibleCellAt( sal_Int32 nRow, sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException) 13229b8096d0SSteve Yin { 13239b8096d0SSteve Yin return mpTable->getAccessibleCellAt( nRow, nColumn ); 13249b8096d0SSteve Yin } 13259b8096d0SSteve Yin 13269b8096d0SSteve Yin Reference< XAccessible > SAL_CALL AccessibleTableHeaderShape::getAccessibleCaption( ) throw (RuntimeException) 13279b8096d0SSteve Yin { 13289b8096d0SSteve Yin return mpTable->getAccessibleCaption(); 13299b8096d0SSteve Yin } 13309b8096d0SSteve Yin 13319b8096d0SSteve Yin Reference< XAccessible > SAL_CALL AccessibleTableHeaderShape::getAccessibleSummary( ) throw (RuntimeException) 13329b8096d0SSteve Yin { 13339b8096d0SSteve Yin return mpTable->getAccessibleSummary(); 13349b8096d0SSteve Yin } 13359b8096d0SSteve Yin 13369b8096d0SSteve Yin sal_Bool SAL_CALL AccessibleTableHeaderShape::isAccessibleSelected( sal_Int32 nRow, sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException) 13379b8096d0SSteve Yin { 13389b8096d0SSteve Yin return mpTable->isAccessibleSelected( nRow, nColumn ); 13399b8096d0SSteve Yin } 13409b8096d0SSteve Yin 13419b8096d0SSteve Yin sal_Int32 SAL_CALL AccessibleTableHeaderShape::getAccessibleIndex( sal_Int32 nRow, sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException) 13429b8096d0SSteve Yin { 13439b8096d0SSteve Yin return mpTable->getAccessibleIndex( nRow, nColumn ); 13449b8096d0SSteve Yin } 13459b8096d0SSteve Yin 13469b8096d0SSteve Yin sal_Int32 SAL_CALL AccessibleTableHeaderShape::getAccessibleRow( sal_Int32 nChildIndex ) throw (IndexOutOfBoundsException, RuntimeException) 13479b8096d0SSteve Yin { 13489b8096d0SSteve Yin return mpTable->getAccessibleRow( nChildIndex ); 13499b8096d0SSteve Yin } 13509b8096d0SSteve Yin 13519b8096d0SSteve Yin sal_Int32 SAL_CALL AccessibleTableHeaderShape::getAccessibleColumn( sal_Int32 nChildIndex ) throw (IndexOutOfBoundsException, RuntimeException) 13529b8096d0SSteve Yin { 13539b8096d0SSteve Yin return mpTable->getAccessibleColumn( nChildIndex ); 13549b8096d0SSteve Yin } 13559b8096d0SSteve Yin 13569b8096d0SSteve Yin //===== XAccessibleTableSelection ============================================ 13579b8096d0SSteve Yin sal_Bool SAL_CALL AccessibleTableHeaderShape::selectRow( sal_Int32 row ) 13589b8096d0SSteve Yin throw (IndexOutOfBoundsException, RuntimeException) 13599b8096d0SSteve Yin { 13609b8096d0SSteve Yin if( mbRow ) 13619b8096d0SSteve Yin return mpTable->selectRow( row ); 13629b8096d0SSteve Yin else 13639b8096d0SSteve Yin { 13649b8096d0SSteve Yin mpTable->clearAccessibleSelection(); 13659b8096d0SSteve Yin sal_Int32 nIndex = mpTable->getAccessibleIndex( row, 0 ); 13669b8096d0SSteve Yin mpTable->selectAccessibleChild( nIndex ); 13679b8096d0SSteve Yin return sal_True; 13689b8096d0SSteve Yin } 13699b8096d0SSteve Yin } 13709b8096d0SSteve Yin 13719b8096d0SSteve Yin sal_Bool SAL_CALL AccessibleTableHeaderShape::selectColumn( sal_Int32 column ) 13729b8096d0SSteve Yin throw (IndexOutOfBoundsException, RuntimeException) 13739b8096d0SSteve Yin { 13749b8096d0SSteve Yin if( !mbRow ) 13759b8096d0SSteve Yin return mpTable->selectColumn( column ); 13769b8096d0SSteve Yin else 13779b8096d0SSteve Yin { 13789b8096d0SSteve Yin mpTable->clearAccessibleSelection(); 13799b8096d0SSteve Yin sal_Int32 nIndex = mpTable->getAccessibleIndex( 0, column ); 13809b8096d0SSteve Yin mpTable->selectAccessibleChild( nIndex ); 13819b8096d0SSteve Yin return sal_True; 13829b8096d0SSteve Yin } 13839b8096d0SSteve Yin } 13849b8096d0SSteve Yin 13859b8096d0SSteve Yin sal_Bool SAL_CALL AccessibleTableHeaderShape::unselectRow( sal_Int32 row ) 13869b8096d0SSteve Yin throw (IndexOutOfBoundsException, RuntimeException) 13879b8096d0SSteve Yin { 13889b8096d0SSteve Yin if( mbRow ) 13899b8096d0SSteve Yin return mpTable->unselectRow( row ); 13909b8096d0SSteve Yin else 13919b8096d0SSteve Yin { 13929b8096d0SSteve Yin sal_Int32 nIndex = mpTable->getAccessibleIndex( row, 0 ); 13939b8096d0SSteve Yin mpTable->deselectAccessibleChild( nIndex ); 13949b8096d0SSteve Yin return sal_True; 13959b8096d0SSteve Yin } 13969b8096d0SSteve Yin } 13979b8096d0SSteve Yin 13989b8096d0SSteve Yin sal_Bool SAL_CALL AccessibleTableHeaderShape::unselectColumn( sal_Int32 column ) 13999b8096d0SSteve Yin throw (IndexOutOfBoundsException, RuntimeException) 14009b8096d0SSteve Yin { 14019b8096d0SSteve Yin if( !mbRow ) 14029b8096d0SSteve Yin return mpTable->unselectColumn( column ); 14039b8096d0SSteve Yin else 14049b8096d0SSteve Yin { 14059b8096d0SSteve Yin sal_Int32 nIndex = mpTable->getAccessibleIndex( 0, column ); 14069b8096d0SSteve Yin mpTable->deselectAccessibleChild( nIndex ); 14079b8096d0SSteve Yin return sal_True; 14089b8096d0SSteve Yin } 14099b8096d0SSteve Yin } 1410cdf0e10cSrcweir } 1411