summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2022-09-10 00:12:22 +0200
committerEike Rathke <erack@redhat.com>2022-09-10 12:39:46 +0200
commit569d451bbe160829947ace201d07ad69442204b0 (patch)
tree7f7619159e661f59be3fff07fc1de7039ed86f66
parent16987d2aae9e0ed052de8a8f7155070c4b05cf4a (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
-rw-r--r--sc/source/core/data/column3.cxx34
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);
}