sc/source/core/data/column3.cxx |   34 ++++++++++++++++++++++++++++++++++
 1 file changed, 34 insertions(+)

New commits:
commit 569d451bbe160829947ace201d07ad69442204b0
Author:     Eike Rathke <er...@redhat.com>
AuthorDate: Sat Sep 10 00:12:22 2022 +0200
Commit:     Eike Rathke <er...@redhat.com>
CommitDate: Sat Sep 10 12:39:46 2022 +0200

    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 <er...@redhat.com>
    Tested-by: Jenkins

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);
 }

Reply via email to