diff options
author | Eike Rathke <erack@redhat.com> | 2015-08-13 18:34:27 +0200 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2015-08-13 18:41:38 +0200 |
commit | ea29d320754fdb21b336cb78f816b8081371def9 (patch) | |
tree | e0e171b74f754bd10bbce168b3c05404b8b8f1a2 | |
parent | 86b47f5138c0c5b882359a48052a796bc91a5afb (diff) |
Resolves: tdf#93098 replace remembered listener when replacing cell
... where SvtListener* is the base of ScFormulaCell* and lead to use
after delete.
Change-Id: I45b8e16f05cf5d4d0d4858dc9cd0c748f8184978
-rw-r--r-- | sc/source/core/data/table3.cxx | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/sc/source/core/data/table3.cxx b/sc/source/core/data/table3.cxx index 372e8da7b91b..0287e66b924a 100644 --- a/sc/source/core/data/table3.cxx +++ b/sc/source/core/data/table3.cxx @@ -710,6 +710,7 @@ public: void fillSortedColumnArray( boost::ptr_vector<SortedColumn>& rSortedCols, SortedRowFlags& rRowFlags, + std::vector<SvtListener*>& rCellListeners, ScSortInfoArray* pArray, SCTAB nTab, SCCOL nCol1, SCCOL nCol2, ScProgress* pProgress ) { SCROW nRow1 = pArray->GetStart(); @@ -767,6 +768,16 @@ void fillSortedColumnArray( pNew->GetCode()->AdjustReferenceOnMovedOriginIfOtherSheet(aOldPos, aCellPos); } + if (!rCellListeners.empty()) + { + // Original source cells will be deleted during + // sc::CellStoreType::transfer(), SvtListener is a base + // class, so we need to replace it. + auto it( ::std::find( rCellListeners.begin(), rCellListeners.end(), rCell.maCell.mpFormula)); + if (it != rCellListeners.end()) + *it = pNew; + } + rCellStore.push_back(pNew); } break; @@ -1082,7 +1093,7 @@ void ScTable::SortReorderByRow( // a copy before updating the document. boost::ptr_vector<SortedColumn> aSortedCols; // storage for copied cells. SortedRowFlags aRowFlags; - fillSortedColumnArray(aSortedCols, aRowFlags, pArray, nTab, nCol1, nCol2, pProgress); + fillSortedColumnArray(aSortedCols, aRowFlags, aCellListeners, pArray, nTab, nCol1, nCol2, pProgress); for (size_t i = 0, n = aSortedCols.size(); i < n; ++i) { @@ -1267,7 +1278,8 @@ void ScTable::SortReorderByRowRefUpdate( // a copy before updating the document. boost::ptr_vector<SortedColumn> aSortedCols; // storage for copied cells. SortedRowFlags aRowFlags; - fillSortedColumnArray(aSortedCols, aRowFlags, pArray, nTab, nCol1, nCol2, pProgress); + std::vector<SvtListener*> aListenersDummy; + fillSortedColumnArray(aSortedCols, aRowFlags, aListenersDummy, pArray, nTab, nCol1, nCol2, pProgress); for (size_t i = 0, n = aSortedCols.size(); i < n; ++i) { |