fix STL assert in accessibility::AccessibleGridControl::commitTableEvent
While running some JunitTest, crashes on an attempt to delete entries
of an empty vector m_pImpl->m_pTable->m_pCellVector.
The entries are created on-demand by
AccessibleGridControlTable::getAccessibleChild(), so presumably that
hadn't been called yet when the rows were deleted.
Also fix bizarre abuse of all applicable variable naming conventions.
(regression from 2095b2e1d4
)
Change-Id: Id2d70ca4601a166718629c0fe922f805dd72eec1
This commit is contained in:
@@ -337,11 +337,13 @@ void AccessibleGridControl::commitCellEvent(sal_Int16 _nEventId,const Any& _rNew
|
|||||||
com::sun::star::uno::Reference< com::sun::star::accessibility::XAccessibleContext > xAccessibleChild = xAccessible->getAccessibleContext();
|
com::sun::star::uno::Reference< com::sun::star::accessibility::XAccessibleContext > xAccessibleChild = xAccessible->getAccessibleContext();
|
||||||
if(m_pImpl->m_xTable == xAccessible)
|
if(m_pImpl->m_xTable == xAccessible)
|
||||||
{
|
{
|
||||||
std::vector< AccessibleGridControlTableCell* > xCellCont = m_pImpl->m_pTable->getCellVector();
|
std::vector< AccessibleGridControlTableCell* >& rCells =
|
||||||
int nIndex = m_aTable.GetCurrentRow()*m_aTable.GetColumnCount()+m_aTable.GetCurrentColumn();
|
m_pImpl->m_pTable->getCellVector();
|
||||||
if(!xCellCont.empty() && xCellCont[nIndex])
|
size_t nIndex = m_aTable.GetCurrentRow() * m_aTable.GetColumnCount()
|
||||||
|
+ m_aTable.GetCurrentColumn();
|
||||||
|
if (nIndex < rCells.size() && rCells[nIndex])
|
||||||
{
|
{
|
||||||
m_pImpl->m_pCell = xCellCont[nIndex];
|
m_pImpl->m_pCell = rCells[nIndex];
|
||||||
m_pImpl->m_pCell->commitEvent( _nEventId, _rNewValue, _rOldValue );
|
m_pImpl->m_pCell->commitEvent( _nEventId, _rNewValue, _rOldValue );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -370,11 +372,26 @@ void AccessibleGridControl::commitTableEvent(sal_Int16 _nEventId,const Any& _rNe
|
|||||||
{
|
{
|
||||||
if(aChange.Type == AccessibleTableModelChangeType::DELETE)
|
if(aChange.Type == AccessibleTableModelChangeType::DELETE)
|
||||||
{
|
{
|
||||||
std::vector< AccessibleGridControlTableCell* >::iterator m_pCell = m_pImpl->m_pTable->getCellVector().begin();
|
std::vector< AccessibleGridControlTableCell* >& rCells =
|
||||||
std::vector< Reference< XAccessible > >::iterator m_xAccessibleVector = m_pImpl->m_pTable->getAccessibleCellVector().begin();
|
m_pImpl->m_pTable->getCellVector();
|
||||||
|
std::vector< Reference< XAccessible > >& rAccCells =
|
||||||
|
m_pImpl->m_pTable->getAccessibleCellVector();
|
||||||
int nColCount = m_aTable.GetColumnCount();
|
int nColCount = m_aTable.GetColumnCount();
|
||||||
m_pImpl->m_pTable->getCellVector().erase(m_pCell+nColCount*aChange.FirstRow, m_pCell+nColCount*aChange.LastRow );
|
// check valid index - entries are inserted lazily
|
||||||
m_pImpl->m_pTable->getAccessibleCellVector().erase(m_xAccessibleVector+nColCount*aChange.FirstRow, m_xAccessibleVector+nColCount*aChange.LastRow);
|
size_t const nStart = nColCount * aChange.FirstRow;
|
||||||
|
size_t const nEnd = nColCount * aChange.LastRow;
|
||||||
|
if (nStart < rCells.size())
|
||||||
|
{
|
||||||
|
m_pImpl->m_pTable->getCellVector().erase(
|
||||||
|
rCells.begin() + nStart,
|
||||||
|
rCells.begin() + std::min(rCells.size(), nEnd));
|
||||||
|
}
|
||||||
|
if (nStart < rAccCells.size())
|
||||||
|
{
|
||||||
|
m_pImpl->m_pTable->getAccessibleCellVector().erase(
|
||||||
|
rAccCells.begin() + nStart,
|
||||||
|
rAccCells.begin() + std::min(rAccCells.size(), nEnd));
|
||||||
|
}
|
||||||
m_pImpl->m_pTable->commitEvent(_nEventId,_rNewValue,_rOldValue);
|
m_pImpl->m_pTable->commitEvent(_nEventId,_rNewValue,_rOldValue);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
Reference in New Issue
Block a user