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

Eike Rathke erack at redhat.com
Fri Jun 26 18:21:54 PDT 2015


 sc/source/core/tool/grouparealistener.cxx |   33 +++++++++++++++++++++++++++++-
 1 file changed, 32 insertions(+), 1 deletion(-)

New commits:
commit d8541c2a62121894bf87c91f1f89aea1ea30d680
Author: Eike Rathke <erack at redhat.com>
Date:   Sat Jun 27 03:14:05 2015 +0200

    tdf#90717 prevent crash, not really fixed
    
    Try to resync shared group top and length.
    
    Change-Id: I31bd0db7c1dceb880a22274edc4c3f20ce253095

diff --git a/sc/source/core/tool/grouparealistener.cxx b/sc/source/core/tool/grouparealistener.cxx
index 46155f9..ac9ea7f 100644
--- a/sc/source/core/tool/grouparealistener.cxx
+++ b/sc/source/core/tool/grouparealistener.cxx
@@ -194,10 +194,41 @@ void FormulaGroupAreaListener::collectFormulaCells(
     ScFormulaCell* const * pp = mpColumn->GetFormulaCellBlockAddress( mnTopCellRow, nBlockSize);
     if (!pp)
     {
-        SAL_WARN("sc", "GetFormulaCellBlockAddress not found");
+        SAL_WARN("sc.core", "GetFormulaCellBlockAddress not found");
         return;
     }
 
+    /* FIXME: this is tdf#90717, when deleting a row fixed size area listeners
+     * such as BCA_ALWAYS or entire row listeners are (rightly) not destroyed,
+     * but mnTopCellRow and mnGroupLen also not updated, which needs fixing.
+     * Until then pull things as straight as possible here in such situation
+     * and prevent crash. */
+    if (!(*pp)->IsSharedTop())
+    {
+        SCROW nRow = (*pp)->GetSharedTopRow();
+        if (nRow < 0)
+            SAL_WARN("sc.core", "FormulaGroupAreaListener::collectFormulaCells() no shared top");
+        else
+        {
+            SAL_WARN("sc.core","FormulaGroupAreaListener::collectFormulaCells() syncing mnTopCellRow from " <<
+                    mnTopCellRow << " to " << nRow);
+            const_cast<FormulaGroupAreaListener*>(this)->mnTopCellRow = nRow;
+            pp = mpColumn->GetFormulaCellBlockAddress( mnTopCellRow, nBlockSize);
+            if (!pp)
+            {
+                SAL_WARN("sc.core", "GetFormulaCellBlockAddress not found");
+                return;
+            }
+        }
+    }
+    SCROW nLen = (*pp)->GetSharedLength();
+    if (nLen != mnGroupLen)
+    {
+        SAL_WARN("sc.core", "FormulaGroupAreaListener::collectFormulaCells() syncing mnGroupLen from " <<
+                mnGroupLen << " to " << nLen);
+        const_cast<FormulaGroupAreaListener*>(this)->mnGroupLen = nLen;
+    }
+
     /* FIXME: with tdf#89957 it happened that the actual block size in column
      * AP (shifted from AO) of sheet 'w' was smaller than the remembered group
      * length and correct. This is just a very ugly workaround, the real cause


More information about the Libreoffice-commits mailing list