diff options
author | Eike Rathke <erack@redhat.com> | 2015-08-13 18:34:27 +0200 |
---|---|---|
committer | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2015-08-17 10:49:42 +0000 |
commit | 7cbcde5e8727b84b4d3ca9f80020082644d9638a (patch) | |
tree | 632cac11883bfee1bfbe498fd95812562a1b107c | |
parent | 26b3ca54aff24c34718c572675ad72b9687b3adb (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
(cherry picked from commit ea29d320754fdb21b336cb78f816b8081371def9)
Reviewed-on: https://gerrit.libreoffice.org/17726
Reviewed-by: Markus Mohrhard <markus.mohrhard@googlemail.com>
Tested-by: Markus Mohrhard <markus.mohrhard@googlemail.com>
-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 6b5f634201d2..1c5a551c500d 100644 --- a/sc/source/core/data/table3.cxx +++ b/sc/source/core/data/table3.cxx @@ -713,6 +713,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(); @@ -770,6 +771,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; @@ -1085,7 +1096,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) { @@ -1270,7 +1281,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) { |