[Libreoffice-commits] core.git: sc/inc sc/source

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Sat Mar 9 01:15:17 UTC 2019


 sc/inc/sharedformula.hxx              |   10 ++++++++--
 sc/source/core/data/column.cxx        |    4 ++--
 sc/source/core/tool/sharedformula.cxx |   25 ++++++++++++++-----------
 3 files changed, 24 insertions(+), 15 deletions(-)

New commits:
commit 7fdc5df36f5b50e0629405a47ff3d5765fcfeb93
Author:     Eike Rathke <erack at redhat.com>
AuthorDate: Sat Mar 9 01:20:46 2019 +0100
Commit:     Eike Rathke <erack at redhat.com>
CommitDate: Sat Mar 9 02:14:48 2019 +0100

    Resolves: tdf#123714 tdf#123736 all split formula groups; tdf#120013 related
    
    Add all split shared formula groups to regrouping and mark for
    listening, even if the references had not be to adjusted.
    
    This partly also resolves tdf#120013 but there's more to that, a
    remaining partial group is not updated.
    
    Change-Id: If6d1fef7e545017232a1b7e29b4d60dd58775e88
    Reviewed-on: https://gerrit.libreoffice.org/68951
    Reviewed-by: Eike Rathke <erack at redhat.com>
    Tested-by: Jenkins

diff --git a/sc/inc/sharedformula.hxx b/sc/inc/sharedformula.hxx
index f4c8ab018532..97e7fc053a9f 100644
--- a/sc/inc/sharedformula.hxx
+++ b/sc/inc/sharedformula.hxx
@@ -65,8 +65,11 @@ public:
      *
      * @param aPos position of cell to examine.
      * @param pCxt context to be used, if any, may be nullptr.
+     *
+     * @return TRUE if there indeed was a split, else FALSE (e.g. split
+     *         position was top or bottom cell or no formula group).
      */
-    static void splitFormulaCellGroup(const CellStoreType::position_type& aPos, sc::EndListeningContext* pCxt);
+    static bool splitFormulaCellGroup(const CellStoreType::position_type& aPos, sc::EndListeningContext* pCxt);
 
     /**
      * Split existing shared formula ranges at specified row positions.
@@ -75,8 +78,11 @@ public:
      * @param rBounds row positions at which to split existing shared formula
      *                ranges. Note that this method will directly modify this
      *                parameter to sort and remove duplicates.
+     *
+     * @return TRUE if there indeed was a split, else FALSE (e.g. split
+     *         positions were only top or bottom cells or no formula group).
      */
-    static void splitFormulaCellGroups(CellStoreType& rCells, std::vector<SCROW>& rBounds);
+    static bool splitFormulaCellGroups(CellStoreType& rCells, std::vector<SCROW>& rBounds);
 
     /**
      * See if two specified adjacent formula cells can be merged, and if they
diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx
index 1c9174d5d5bd..58f4e8faa29a 100644
--- a/sc/source/core/data/column.cxx
+++ b/sc/source/core/data/column.cxx
@@ -2481,7 +2481,7 @@ bool ScColumn::UpdateReference( sc::RefUpdateContext& rCxt, ScDocument* pUndoDoc
     }
 
     // Do the actual splitting.
-    sc::SharedFormulaUtil::splitFormulaCellGroups(maCells, aBounds);
+    const bool bSplit = sc::SharedFormulaUtil::splitFormulaCellGroups(maCells, aBounds);
 
     // Collect all formula groups.
     std::vector<sc::FormulaGroupEntry> aGroups = GetFormulaGroupEntries();
@@ -2489,7 +2489,7 @@ bool ScColumn::UpdateReference( sc::RefUpdateContext& rCxt, ScDocument* pUndoDoc
     // Process all collected formula groups.
     UpdateRefOnNonCopy aHandler(nCol, nTab, &rCxt, pUndoDoc);
     aHandler = std::for_each(aGroups.begin(), aGroups.end(), aHandler);
-    if (aHandler.isUpdated())
+    if (bSplit || aHandler.isUpdated())
         rCxt.maRegroupCols.set(nTab, nCol);
 
     return aHandler.isUpdated();
diff --git a/sc/source/core/tool/sharedformula.cxx b/sc/source/core/tool/sharedformula.cxx
index 7b1bcd319ce5..5a488aa36258 100644
--- a/sc/source/core/tool/sharedformula.cxx
+++ b/sc/source/core/tool/sharedformula.cxx
@@ -17,28 +17,28 @@
 
 namespace sc {
 
-void SharedFormulaUtil::splitFormulaCellGroup(const CellStoreType::position_type& aPos, sc::EndListeningContext* pCxt)
+bool SharedFormulaUtil::splitFormulaCellGroup(const CellStoreType::position_type& aPos, sc::EndListeningContext* pCxt)
 {
     SCROW nRow = aPos.first->position + aPos.second;
 
     if (aPos.first->type != sc::element_type_formula)
         // Not a formula cell block.
-        return;
+        return false;
 
     if (aPos.second == 0)
         // Split position coincides with the block border. Nothing to do.
-        return;
+        return false;
 
     sc::formula_block::iterator it = sc::formula_block::begin(*aPos.first->data);
     std::advance(it, aPos.second);
     ScFormulaCell& rTop = **it;
     if (!rTop.IsShared())
         // Not a shared formula.
-        return;
+        return false;
 
     if (nRow == rTop.GetSharedTopRow())
         // Already the top cell of a shared group.
-        return;
+        return false;
 
     ScFormulaCellGroupRef xGroup = rTop.GetCellGroup();
 
@@ -97,12 +97,14 @@ void SharedFormulaUtil::splitFormulaCellGroup(const CellStoreType::position_type
         ScFormulaCell& rCell = **it;
         rCell.SetCellGroup(xGroup2);
     }
+
+    return true;
 }
 
-void SharedFormulaUtil::splitFormulaCellGroups(CellStoreType& rCells, std::vector<SCROW>& rBounds)
+bool SharedFormulaUtil::splitFormulaCellGroups(CellStoreType& rCells, std::vector<SCROW>& rBounds)
 {
     if (rBounds.empty())
-        return;
+        return false;
 
     // Sort and remove duplicates.
     std::sort(rBounds.begin(), rBounds.end());
@@ -113,9 +115,9 @@ void SharedFormulaUtil::splitFormulaCellGroups(CellStoreType& rCells, std::vecto
     SCROW nRow = *it;
     CellStoreType::position_type aPos = rCells.position(nRow);
     if (aPos.first == rCells.end())
-        return;
+        return false;
 
-    splitFormulaCellGroup(aPos, nullptr);
+    bool bSplit = splitFormulaCellGroup(aPos, nullptr);
     std::vector<SCROW>::iterator itEnd = rBounds.end();
     for (++it; it != itEnd; ++it)
     {
@@ -124,10 +126,11 @@ void SharedFormulaUtil::splitFormulaCellGroups(CellStoreType& rCells, std::vecto
         {
             aPos = rCells.position(aPos.first, nRow);
             if (aPos.first == rCells.end())
-                return;
-            splitFormulaCellGroup(aPos, nullptr);
+                return bSplit;
+            bSplit |= splitFormulaCellGroup(aPos, nullptr);
         }
     }
+    return bSplit;
 }
 
 bool SharedFormulaUtil::joinFormulaCells(


More information about the Libreoffice-commits mailing list