summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2015-06-27 03:14:05 +0200
committerEike Rathke <erack@redhat.com>2015-06-27 03:20:16 +0200
commitd8541c2a62121894bf87c91f1f89aea1ea30d680 (patch)
treea5a933a636322f9efdf543372b5fe691a4a1b171
parentdc34bb9b05cf7b5261122a73fa9c6f5356802c19 (diff)
tdf#90717 prevent crash, not really fixed
Try to resync shared group top and length. Change-Id: I31bd0db7c1dceb880a22274edc4c3f20ce253095
-rw-r--r--sc/source/core/tool/grouparealistener.cxx33
1 files changed, 32 insertions, 1 deletions
diff --git a/sc/source/core/tool/grouparealistener.cxx b/sc/source/core/tool/grouparealistener.cxx
index 46155f90dfec..ac9ea7ffad90 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