summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sw/source/core/access/acctable.cxx41
-rw-r--r--sw/source/core/access/acctable.hxx9
2 files changed, 30 insertions, 20 deletions
diff --git a/sw/source/core/access/acctable.cxx b/sw/source/core/access/acctable.cxx
index e798c52c1d12..2bb9fd625a3b 100644
--- a/sw/source/core/access/acctable.cxx
+++ b/sw/source/core/access/acctable.cxx
@@ -1730,26 +1730,33 @@ void SwAccessibleTable::FireSelectionEvent( )
aEvent.EventId = AccessibleEventId::SELECTION_CHANGED_REMOVE;
-// int nRemove = m_vecCellRemove.size();
-// int nAdd = m_vecCellAdd.size();
-
- VEC_CELL::iterator vi = m_vecCellRemove.begin();
- for (; vi != m_vecCellRemove.end() ; ++vi)
+ for (Cells_t::iterator vi = m_vecCellRemove.begin();
+ vi != m_vecCellRemove.end(); ++vi)
{
- SwAccessibleContext *pAccCell = const_cast<SwAccessibleContext *>(*vi);
- OSL_ASSERT(pAccCell != NULL );
- pAccCell->FireAccessibleEvent(aEvent);
+ // fdo#57197: check if the object is still alive
+ uno::Reference<XAccessible> const xAcc(vi->second);
+ if (xAcc.is())
+ {
+ SwAccessibleContext *const pAccCell(vi->first);
+ assert(pAccCell);
+ pAccCell->FireAccessibleEvent(aEvent);
+ }
}
if (m_vecCellAdd.size() <= SELECTION_WITH_NUM)
{
aEvent.EventId = AccessibleEventId::SELECTION_CHANGED_ADD;
- vi = m_vecCellAdd.begin();
- for (; vi != m_vecCellAdd.end() ; ++vi)
+ for (Cells_t::iterator vi = m_vecCellAdd.begin();
+ vi != m_vecCellAdd.end(); ++vi)
{
- SwAccessibleContext *pAccCell = const_cast<SwAccessibleContext *>(*vi);
- OSL_ASSERT(pAccCell != NULL );
- pAccCell->FireAccessibleEvent(aEvent);
+ // fdo#57197: check if the object is still alive
+ uno::Reference<XAccessible> const xAcc(vi->second);
+ if (xAcc.is())
+ {
+ SwAccessibleContext *const pAccCell(vi->first);
+ assert(pAccCell);
+ pAccCell->FireAccessibleEvent(aEvent);
+ }
}
return ;
}
@@ -1760,15 +1767,17 @@ void SwAccessibleTable::FireSelectionEvent( )
}
}
-void SwAccessibleTable::AddSelectionCell(const SwAccessibleContext* pAccCell, bool bAddOrRemove)
+void SwAccessibleTable::AddSelectionCell(
+ SwAccessibleContext *const pAccCell, bool const bAddOrRemove)
{
+ uno::Reference<XAccessible> const xTmp(pAccCell);
if (bAddOrRemove)
{
- m_vecCellAdd.push_back(pAccCell);
+ m_vecCellAdd.push_back(std::make_pair(pAccCell, xTmp));
}
else
{
- m_vecCellRemove.push_back(pAccCell);
+ m_vecCellRemove.push_back(std::make_pair(pAccCell, xTmp));
}
}
diff --git a/sw/source/core/access/acctable.hxx b/sw/source/core/access/acctable.hxx
index 88f5916e1b86..2bbd14ffe7d6 100644
--- a/sw/source/core/access/acctable.hxx
+++ b/sw/source/core/access/acctable.hxx
@@ -266,11 +266,12 @@ public:
// XAccessibleComponent
sal_Int32 SAL_CALL getBackground()
throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
- typedef std::vector<const SwAccessibleContext*> VEC_CELL;
- VEC_CELL m_vecCellAdd;
- VEC_CELL m_vecCellRemove;
+ typedef std::vector< ::std::pair<SwAccessibleContext*,
+ css::uno::WeakReference<css::accessibility::XAccessible> > > Cells_t;
+ Cells_t m_vecCellAdd;
+ Cells_t m_vecCellRemove;
void FireSelectionEvent( );
- void AddSelectionCell(const SwAccessibleContext* , bool bAddOrRemove);
+ void AddSelectionCell(SwAccessibleContext*, bool bAddOrRemove);
};
inline SwAccessibleTableData_Impl& SwAccessibleTable::GetTableData()