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 #include <com/sun/star/accessibility/AccessibleRole.hpp>
25 #include <com/sun/star/drawing/XShape.hpp>
26 #include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
37 #include <unordered_map>
41 #include <com/sun/star/view/XSelectionSupplier.hpp>
65 void init(
const Reference< XAccessible>& xAccessible,
const Reference< XTable >& xTable );
70 Reference< XAccessible > getAccessibleChild(sal_Int32
i);
72 void getColumnAndRow( sal_Int32 nChildIndex, sal_Int32& rnColumn, sal_Int32& rnRow );
75 virtual void SAL_CALL modified(
const EventObject&
aEvent )
override;
78 virtual void SAL_CALL disposing(
const EventObject&
Source )
override;
94 : mrShapeTreeInfo( rShapeTreeInfo )
108 Reference< XModifyListener > xListener(
this );
109 mxTable->addModifyListener( xListener );
111 Reference< css::view::XSelectionSupplier > xSelSupplier(xTable, UNO_QUERY);
112 Reference< css::view::XSelectionChangeListener > xSelListener( xAccessible, UNO_QUERY );
113 if (xSelSupplier.is())
114 xSelSupplier->addSelectionChangeListener(xSelListener);
128 rEntry.second->dispose();
131 Reference< XModifyListener > xListener(
this );
132 mxTable->removeModifyListener( xListener );
142 AccessibleCellMap::iterator iter(
maChildMap.find( xCell ) );
154 Reference< XCell > xCell(
mxTable->getCellByPosition( nColumn, nRow ) );
157 if( !xChild.is() &&
mxTable.is() )
159 sal_Int32 nChildIndex =
mxTable->getColumnCount() * nRow + nColumn;
160 CellRef xCellRef( dynamic_cast< Cell* >( xCell.get() ) );
164 xAccessibleCell->Init();
167 xChild = xAccessibleCell;
175 sal_Int32 nColumn = 0, nRow = 0;
178 Reference< XCell > xCell(
mxTable->getCellByPosition( nColumn, nRow ) );
179 AccessibleCellMap::iterator iter(
maChildMap.find( xCell ) );
183 Reference< XAccessible > xChild( (*iter).second );
188 CellRef xCellRef( dynamic_cast< Cell* >( xCell.get() ) );
192 xAccessibleCell->Init();
195 return xAccessibleCell;
203 rnColumn = nChildIndex;
207 const sal_Int32 nColumnCount =
mxTable->getColumnCount();
208 while( rnColumn >= nColumnCount )
211 rnColumn -= nColumnCount;
214 if( rnRow < mxTable->getRowCount() )
218 throw IndexOutOfBoundsException();
230 AccessibleCellMap aTempChildMap;
235 const sal_Int32 nRowCount =
mxTable->getRowCount();
236 const sal_Int32 nColCount =
mxTable->getColumnCount();
238 bool bRowOrColumnChanged =
false;
241 bRowOrColumnChanged =
true;
245 sal_Int32 nChildIndex = 0;
247 for( sal_Int32 nRow = 0; nRow < nRowCount; ++nRow )
249 for( sal_Int32 nCol = 0; nCol < nColCount; ++nCol )
251 Reference< XCell > xCell(
mxTable->getCellByPosition( nCol, nRow ) );
252 AccessibleCellMap::iterator iter( aTempChildMap.find( xCell ) );
254 if( iter != aTempChildMap.end() )
257 xAccessibleCell->setIndexInParent( nChildIndex );
258 xAccessibleCell->UpdateChildren();
260 if (bRowOrColumnChanged)
265 Reference< XMergeableCell > xMergedCell(
mxTable->getCellByPosition( nCol, nRow ), UNO_QUERY );
266 if (xMergedCell.is() && xMergedCell->isMerged())
268 xAccessibleCell->ResetState(AccessibleStateType::VISIBLE);
269 xAccessibleCell->ResetState(AccessibleStateType::ENABLED);
272 xAccessibleCell->ResetState(AccessibleStateType::SHOWING);
276 xAccessibleCell->SetState(AccessibleStateType::VISIBLE);
277 xAccessibleCell->SetState(AccessibleStateType::ENABLED);
280 xAccessibleCell->SetState(AccessibleStateType::SHOWING);
285 aTempChildMap.erase( iter );
289 CellRef xCellRef( dynamic_cast< Cell* >( xCell.get() ) );
293 xAccessibleCell->Init();
304 for(
auto& rEntry : aTempChildMap )
306 rEntry.second->dispose();
311 pAccTable->CommitChange(AccessibleEventId::INVALIDATE_ALL_CHILDREN,
Any(),
Any());
326 , mnPreviousSelectionCount(0)
342 Reference< XTable > xTable( xSet->getPropertyValue(
"Model"), UNO_QUERY_THROW );
344 mxImpl->init(
this, xTable );
351 AccessibleTableShape_Base::Init();
357 SdrView* pView = maShapeTreeInfo.GetSdrView ();
372 Reference<XAccessibleTableSelection> xThis(
this );
378 return AccessibleTableShape_Base::queryInterface( aType );
384 AccessibleTableShape_Base::acquire();
390 AccessibleTableShape_Base::release();
399 return "com.sun.star.comp.accessibility.AccessibleTableShape";
412 return mxImpl->mxTable.is() ?
mxImpl->mxTable->getRowCount() *
mxImpl->mxTable->getColumnCount() : 0;
421 return mxImpl->getAccessibleChild( i );
427 return AccessibleRole::TABLE;
446 return mxImpl->mxTable.is() ?
mxImpl->mxTable->getRowCount() : 0;
453 return mxImpl->mxTable.is() ?
mxImpl->mxTable->getColumnCount() : 0;
476 if(
mxImpl->mxTable.is() )
478 Reference< XMergeableCell > xCell(
mxImpl->mxTable->getCellByPosition( nColumn, nRow ), UNO_QUERY );
480 return xCell->getRowSpan();
490 if(
mxImpl->mxTable.is() )
492 Reference< XMergeableCell > xCell(
mxImpl->mxTable->getCellByPosition( nColumn, nRow ), UNO_QUERY );
494 return xCell->getColumnSpan();
502 Reference< XAccessibleTable > xRet;
517 Reference< XAccessibleTable > xRet;
533 ::std::vector<bool> aSelected( nRow,
true );
535 for( sal_Int32
i = 0;
i < nRow;
i++ )
543 return Sequence< sal_Int32 >();
549 Sequence < sal_Int32 > aRet( nCount );
550 sal_Int32 *pRet = aRet.getArray();
552 size_t nSize = aSelected.size();
553 for(
size_t i=0;
i < nSize && nPos < nCount;
i++ )
569 ::std::vector<bool> aSelected( nColumn,
true );
570 sal_Int32
nCount = nColumn;
571 for( sal_Int32
i = 0;
i < nColumn;
i++ )
579 return Sequence< sal_Int32 >();
585 Sequence < sal_Int32 > aRet( nCount );
586 sal_Int32 *pRet = aRet.getArray();
588 size_t nSize = aSelected.size();
589 for(
size_t i=0;
i < nSize && nPos < nCount;
i++ )
633 sal_Int32 nChildIndex = 0;
634 if(
mxImpl->mxTable.is() )
635 nChildIndex =
mxImpl->mxTable->getColumnCount() * nRow + nColumn;
643 Reference< XAccessible > xRet;
650 Reference< XAccessible > xRet;
665 if( (aFirstPos.
mnRow <= nRow) && (aFirstPos.
mnCol <= nColumn) && (nRow <= aLastPos.
mnRow) && (nColumn <= aLastPos.
mnCol) )
677 return mxImpl->mxTable.is() ? (nRow *
mxImpl->mxTable->getColumnCount() + nColumn) : 0;
684 sal_Int32 nColumn = 0, nRow = 0;
685 mxImpl->getColumnAndRow( nChildIndex, nColumn, nRow );
693 sal_Int32 nColumn = 0, nRow = 0;
694 mxImpl->getColumnAndRow( nChildIndex, nColumn, nRow );
713 CellPos aFirstPos( aPos ), aLastPos( aPos );
718 aFirstPos.mnRow = std::min( aFirstPos.mnRow, aPos.
mnRow );
719 aFirstPos.mnCol = std::min( aFirstPos.mnCol, aPos.
mnCol );
768 const sal_Int32 nSelectedColumns = std::max( sal_Int32(0), aLastPos.
mnCol - aFirstPos.
mnCol ) + 1;
769 const sal_Int32 nSelectedRows = std::max( sal_Int32(0), aLastPos.
mnRow - aFirstPos.
mnRow ) + 1;
770 return nSelectedRows * nSelectedColumns;
781 if( nSelectedChildIndex < 0 )
782 throw IndexOutOfBoundsException();
786 if( nChildIndex < 0 )
787 throw IndexOutOfBoundsException();
791 throw IndexOutOfBoundsException();
863 sal_Int32 nSelectedChildIndex )
const
867 if( nSelectedChildIndex >= nChildren )
871 while( n < nChildren )
873 if( const_cast<AccessibleTableShape*>(
this)->isAccessibleChildSelected( n ) )
875 if( 0 == nSelectedChildIndex )
878 --nSelectedChildIndex;
883 return n < nChildren ? n : -1;
887 mxImpl->getColumnAndRow(nChildIndex, rnColumn, rnRow);
899 Reference< XCell > xCell(rEvent.Source, UNO_QUERY);
907 sal_Int32
nIndex = xAccCell->getAccessibleIndexInParent(),
912 xAccCell->SetState(AccessibleStateType::SELECTED);
913 xAccCell->CommitChange(AccessibleEventId::SELECTION_CHANGED,
Any(),
Any());
917 xAccCell->SetState(AccessibleStateType::SELECTED);
918 xAccCell->CommitChange(AccessibleEventId::SELECTION_CHANGED_ADD,
Any(),
Any());
922 xAccCell->ResetState(AccessibleStateType::SELECTED);
923 xAccCell->CommitChange(AccessibleEventId::SELECTION_CHANGED_REMOVE,
Any(),
Any());
947 pAccCell = xAccCell.get();
949 catch ( IndexOutOfBoundsException& ) {}
959 if( aState == AccessibleStateType::FOCUSED )
962 if( pActiveAccessibleCell !=
nullptr )
963 return pActiveAccessibleCell->
SetState(aState);
972 if( aState == AccessibleStateType::FOCUSED )
975 if( pActiveAccessibleCell !=
nullptr )
976 return pActiveAccessibleCell->
ResetState(aState);
994 if( (nCol >= 0) && (nRow >= 0) &&
mxImpl->mxTable.is() && (nCol <
mxImpl->mxTable->getColumnCount()) && (nRow < mxImpl->mxTable->getRowCount()) )
997 throw IndexOutOfBoundsException();
1025 return mpTable->getAccessibleChild( i );
1030 Reference< XAccessible > XParent;
1041 return mpTable->getAccessibleRole();
1046 return mpTable->getAccessibleDescription();
1051 return mpTable->getAccessibleName();
1056 return mpTable->getAccessibleStateSet();
1061 return mpTable->getAccessibleRelationSet();
1072 return mpTable->containsPoint( aPoint );
1077 return mpTable->getAccessibleAtPoint( aPoint );
1087 return mpTable->getLocation();
1092 return mpTable->getLocationOnScreen();
1102 return mpTable->getForeground();
1107 return mpTable->getBackground();
1122 return !
mbRow ? 1 :
mpTable->getAccessibleColumnCount();
1127 return mpTable->getAccessibleRowDescription( nRow );
1132 return mpTable->getAccessibleColumnDescription( nColumn );
1137 return mpTable->getAccessibleRowExtentAt( nRow, nColumn );
1142 return mpTable->getAccessibleColumnExtentAt( nRow, nColumn );
1147 Reference< XAccessibleTable > xRet;
1153 Reference< XAccessibleTable > xRet;
1160 ::std::vector<bool> aSelected( nRow,
true );
1162 for( sal_Int32
i = 0;
i < nRow;
i++ )
1170 return Sequence< sal_Int32 >();
1176 Sequence < sal_Int32 > aRet( nCount );
1177 sal_Int32 *pRet = aRet.getArray();
1179 size_t nSize = aSelected.size();
1180 for(
size_t i=0;
i < nSize && nPos < nCount;
i++ )
1195 ::std::vector<bool> aSelected( nColumn,
true );
1196 sal_Int32
nCount = nColumn;
1197 for( sal_Int32
i = 0;
i < nColumn;
i++ )
1205 return Sequence< sal_Int32 >();
1211 Sequence < sal_Int32 > aRet( nCount );
1212 sal_Int32 *pRet = aRet.getArray();
1214 size_t nSize = aSelected.size();
1215 for(
size_t i=0;
i < nSize && nPos < nCount;
i++ )
1229 return mpTable->isAccessibleRowSelected( nRow );
1234 return mpTable->isAccessibleColumnSelected( nColumn );
1239 return mpTable->getAccessibleCellAt( nRow, nColumn );
1244 return mpTable->getAccessibleCaption();
1249 return mpTable->getAccessibleSummary();
1254 return mpTable->isAccessibleSelected( nRow, nColumn );
1259 return mpTable->getAccessibleIndex( nRow, nColumn );
1264 return mpTable->getAccessibleRow( nChildIndex );
1269 return mpTable->getAccessibleColumn( nChildIndex );
1276 return mpTable->selectRow( row );
1279 mpTable->clearAccessibleSelection();
1281 mpTable->selectAccessibleChild( nIndex );
1289 return mpTable->selectColumn( column );
1292 mpTable->clearAccessibleSelection();
1293 sal_Int32
nIndex =
mpTable->getAccessibleIndex( 0, column );
1294 mpTable->selectAccessibleChild( nIndex );
1302 return mpTable->unselectRow( row );
1306 mpTable->deselectAccessibleChild( nIndex );
1314 return mpTable->unselectColumn( column );
1317 sal_Int32
nIndex =
mpTable->getAccessibleIndex( 0, column );
1318 mpTable->deselectAccessibleChild( nIndex );
virtual sal_Bool SAL_CALL unselectColumn(sal_Int32 column) override
virtual void SAL_CALL selectAllAccessibleChildren() override
virtual sal_Int32 SAL_CALL getAccessibleRowCount() override
virtual void SAL_CALL selectAccessibleChild(sal_Int32 nChildIndex) override
virtual bool SetState(sal_Int16 aState) override
virtual void SAL_CALL disposing() override
This method is called from the component helper base class while disposing.
virtual sal_Bool SAL_CALL selectRow(sal_Int32 row) override
virtual css::uno::Any SAL_CALL queryInterface(const css::uno::Type &aType) override
virtual void SAL_CALL clearAccessibleSelection() override
virtual void SAL_CALL acquire() override
virtual ~AccessibleTableShape() override
Reference< XAccessible > mxAccessible
virtual OUString SAL_CALL getAccessibleRowDescription(sal_Int32 nRow) override
AccessibleShapeTreeInfo & mrShapeTreeInfo
bool deselectRow(sal_Int32 row)
virtual void Init() override
virtual void SAL_CALL modified(const EventObject &aEvent) override
void checkCellPosition(sal_Int32 nCol, sal_Int32 nRow)
AccessibleTableShape(const AccessibleShapeInfo &rShapeInfo, const AccessibleShapeTreeInfo &rShapeTreeInfo)
virtual SVX_DLLPRIVATE bool hasSelectedCells() const override
This is a table object, and one or more of its cells are selected.
virtual sal_Int32 SAL_CALL getAccessibleChildCount() override
virtual sal_Bool SAL_CALL isAccessibleRowSelected(sal_Int32 nRow) override
virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getAccessibleSummary() override
virtual sal_Bool SAL_CALL unselectRow(sal_Int32 row) override
bool SetStateDirectly(sal_Int16 aState)
sal_Int32 GetIndexOfSelectedChild(sal_Int32 nSelectedChildIndex) const
virtual sal_Int16 SAL_CALL getAccessibleRole() override
Reference< XTable > mxTable
virtual bool ResetState(sal_Int16 aState) override
bool deselectColumn(sal_Int32 column)
virtual css::uno::Reference< css::accessibility::XAccessibleTable > SAL_CALL getAccessibleColumnHeaders() override
uno::Reference< drawing::XShape > const mxShape
virtual sal_Int32 SAL_CALL getSelectedAccessibleChildCount() override
AccessibleCell * GetActiveAccessibleCell()
sdr::table::SvxTableController * getTableController()
sdr::table::SdrTableObj * GetTableObj()
friend class AccessibleTableHeaderShape
virtual bool SetState(sal_Int16 aState) override
virtual bool ResetState(sal_Int16 aState) override
virtual css::uno::Sequence< sal_Int32 > SAL_CALL getSelectedAccessibleColumns() override
void getActiveCellPos(sdr::table::CellPos &rPos) const
bool selectColumn(sal_Int32 column)
virtual sal_Int32 SAL_CALL getAccessibleColumn(sal_Int32 nChildIndex) override
virtual sal_Int32 SAL_CALL getAccessibleRow(sal_Int32 nChildIndex) override
sal_Int32 mnPreviousSelectionCount
virtual sal_Bool SAL_CALL isAccessibleSelected(sal_Int32 nRow, sal_Int32 nColumn) override
bool ResetStateDirectly(sal_Int16 aState)
#define TOOLS_WARN_EXCEPTION(area, stream)
virtual css::uno::Sequence< sal_Int32 > SAL_CALL getSelectedAccessibleRows() override
bool isRowSelected(sal_Int32 nRow)
void setSelectedCells(const CellPos &rFirstPos, const CellPos &rLastPos)
virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getAccessibleCellAt(sal_Int32 nRow, sal_Int32 nColumn) override
virtual OUString SAL_CALL getImplementationName() override
virtual sal_Bool SAL_CALL isAccessibleColumnSelected(sal_Int32 nColumn) override
Reference< XAccessible > getAccessibleChild(sal_Int32 i)
const rtl::Reference< sdr::SelectionController > & getSelectionController() const
void init(const Reference< XAccessible > &xAccessible, const Reference< XTable > &xTable)
virtual css::uno::Reference< css::accessibility::XAccessibleTable > SAL_CALL getAccessibleRowHeaders() override
void getColumnAndRow(sal_Int32 nChildIndex, sal_Int32 &rnColumn, sal_Int32 &rnRow)
virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getAccessibleCaption() override
virtual sal_Int32 SAL_CALL getAccessibleIndex(sal_Int32 nRow, sal_Int32 nColumn) override
virtual void SAL_CALL deselectAccessibleChild(sal_Int32 nChildIndex) override
bool selectRow(sal_Int32 row)
virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getAccessibleChild(sal_Int32 i) override
virtual sal_Bool SAL_CALL selectColumn(sal_Int32 column) override
virtual void SAL_CALL disposing() override
std::unordered_map< Reference< XCell >, rtl::Reference< AccessibleCell > > AccessibleCellMap
virtual void SAL_CALL selectionChanged(const css::lang::EventObject &rEvent) override
virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getSelectedAccessibleChild(sal_Int32 nSelectedChildIndex) override
virtual OUString CreateAccessibleBaseName() override
AccessibleCellMap maChildMap
rtl::Reference< AccessibleCell > getAccessibleCell(const Reference< XCell > &xCell)
virtual sal_Int32 SAL_CALL getAccessibleRowExtentAt(sal_Int32 nRow, sal_Int32 nColumn) override
FILE * init(int, char **)
virtual bool ResetState(sal_Int16 aState) override
Reset the specified state.
rtl::Reference< AccessibleTableShapeImpl > mxImpl
::cppu::ImplInheritanceHelper< AccessibleShape, css::accessibility::XAccessibleTable, css::view::XSelectionChangeListener > AccessibleTableShape_Base
virtual bool SetState(sal_Int16 aState) override
Set the specified state.
virtual bool SetState(sal_Int16 aState)
void getSelectedCells(CellPos &rFirstPos, CellPos &rLastPos) override
This class is a container for the information specific for a single shape that is passed to the const...
bool isColumnSelected(sal_Int32 nColumn)
virtual bool ResetState(sal_Int16 aState)
virtual sal_Int32 SAL_CALL getAccessibleColumnCount() override
void getColumnAndRow(sal_Int32 nChildIndex, sal_Int32 &rnColumn, sal_Int32 &rnRow)
This class bundles all information that is passed down the tree of accessible shapes so that each sha...
virtual sal_Bool SAL_CALL isAccessibleChildSelected(sal_Int32 nChildIndex) override
const sdr::table::CellRef & getActiveCell() const
The active table has the focus or is currently edited.
virtual OUString SAL_CALL getAccessibleColumnDescription(sal_Int32 nColumn) override
virtual void SAL_CALL disposing(const EventObject &Source) override
virtual sal_Int32 SAL_CALL getAccessibleColumnExtentAt(sal_Int32 nRow, sal_Int32 nColumn) override
virtual void SAL_CALL release() override