diff options
author | Eike Rathke <erack@redhat.com> | 2022-09-10 00:12:22 +0200 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2022-09-10 12:39:46 +0200 |
commit | 569d451bbe160829947ace201d07ad69442204b0 (patch) | |
tree | 7f7619159e661f59be3fff07fc1de7039ed86f66 /sc | |
parent | 16987d2aae9e0ed052de8a8f7155070c4b05cf4a (diff) |
Resolves: tdf#150766 Listen to entire shared formula group instead of a slice
Change-Id: I677602bd3401dbd401e35f7db64cd34d164d9d92
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/139744
Reviewed-by: Eike Rathke <erack@redhat.com>
Tested-by: Jenkins
Diffstat (limited to 'sc')
-rw-r--r-- | sc/source/core/data/column3.cxx | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/sc/source/core/data/column3.cxx b/sc/source/core/data/column3.cxx index b93e3afb47fc..e144a0334036 100644 --- a/sc/source/core/data/column3.cxx +++ b/sc/source/core/data/column3.cxx @@ -569,6 +569,40 @@ void ScColumn::AttachFormulaCells( sc::StartListeningContext& rCxt, SCROW nRow1, if (GetDoc().IsClipOrUndo()) return; + // Need to process (start listening) entire shared formula groups, not just + // a slice thereof. + bool bEnlargedDown = false; + aPos = maCells.position(nRow1); + it = aPos.first; + if (it->type == sc::element_type_formula) + { + ScFormulaCell& rCell = *sc::formula_block::at(*it->data, aPos.second); + if (rCell.IsShared()) + { + nRow1 = std::min( nRow1, rCell.GetSharedTopRow()); + if (nRow2 < rCell.GetSharedTopRow() + rCell.GetSharedLength()) + { + nRow2 = rCell.GetSharedTopRow() + rCell.GetSharedLength() - 1; + bEnlargedDown = true; + // Same end row is also enlarged, i.e. doesn't need to be + // checked for another group. + } + } + } + if (!bEnlargedDown) + { + aPos = maCells.position(it, nRow2); + it = aPos.first; + if (it->type == sc::element_type_formula) + { + ScFormulaCell& rCell = *sc::formula_block::at(*it->data, aPos.second); + if (rCell.IsShared()) + { + nRow2 = std::max( nRow2, rCell.GetSharedTopRow() + rCell.GetSharedLength() - 1); + } + } + } + AttachFormulaCellsHandler aFunc(rCxt); sc::ProcessFormula(it, maCells, nRow1, nRow2, aFunc); } |