diff options
author | Eike Rathke <erack@redhat.com> | 2016-10-07 19:43:32 +0200 |
---|---|---|
committer | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2016-10-10 21:30:41 +0000 |
commit | 84a8aa8b28599db4ef452416e930690949217d2c (patch) | |
tree | 7c0ed583949f397419f7724ef9df38338df5ed50 | |
parent | bd297b8a34056e3d9204a1459688dcb38e93a2e2 (diff) |
Resolves: tdf#101562 ScRefUpdate::Update() needs to flag sticky even unchanged
... so area broadcasters can be "adapted" (though not changed) and
broadcast a change to invalidate listening lookup caches.
This is the delete row part of the bug scenario.
(cherry picked from commit 866eb4a7f93414932b8669d1a6afe0611655dfb4)
tdf#101562 inserting within an entire col/row reference needs to flag change
This is the insert part (e.g. Undo) of the bug scenario.
(cherry picked from commit 180fe3e991432a5ab1ef573686ff9b35c732756b)
87060bd9f0ad6d58a11308e58e7ce56875327c52
Change-Id: Ie6072a6b8e7967faa135a3c4d0a9024b6afcd69c
Reviewed-on: https://gerrit.libreoffice.org/29596
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Markus Mohrhard <markus.mohrhard@googlemail.com>
-rw-r--r-- | sc/source/core/tool/refupdat.cxx | 4 | ||||
-rw-r--r-- | sc/source/core/tool/token.cxx | 21 |
2 files changed, 21 insertions, 4 deletions
diff --git a/sc/source/core/tool/refupdat.cxx b/sc/source/core/tool/refupdat.cxx index 602a636c6118..300dd1dce7b1 100644 --- a/sc/source/core/tool/refupdat.cxx +++ b/sc/source/core/tool/refupdat.cxx @@ -235,6 +235,8 @@ ScRefUpdateRes ScRefUpdate::Update( ScDocument* pDoc, UpdateRefMode eUpdateRefMo { // End was sticky, but start may have been moved. Only on range. theCol2 = oldCol2; + if (eRet == UR_NOTHING) + eRet = UR_STICKY; } // Else, if (bCut2 && theCol2 == MAXCOL) then end becomes sticky, // but currently there's nothing to do. @@ -267,6 +269,8 @@ ScRefUpdateRes ScRefUpdate::Update( ScDocument* pDoc, UpdateRefMode eUpdateRefMo { // End was sticky, but start may have been moved. Only on range. theRow2 = oldRow2; + if (eRet == UR_NOTHING) + eRet = UR_STICKY; } // Else, if (bCut2 && theRow2 == MAXROW) then end becomes sticky, // but currently there's nothing to do. diff --git a/sc/source/core/tool/token.cxx b/sc/source/core/tool/token.cxx index fd390a47d6e6..ffb9a297923b 100644 --- a/sc/source/core/tool/token.cxx +++ b/sc/source/core/tool/token.cxx @@ -2974,10 +2974,23 @@ sc::RefUpdateResult ScTokenArray::AdjustReferenceOnShift( const sc::RefUpdateCon if (rCxt.maRange.In(aAbs)) { - ScRange aErrorRange( ScAddress::UNINITIALIZED ); - if (!aAbs.MoveSticky(rCxt.mnColDelta, rCxt.mnRowDelta, rCxt.mnTabDelta, aErrorRange)) - aAbs = aErrorRange; - aRes.mbReferenceModified = true; + // We shift either by column or by row, not both, + // so moving the reference has only to be done in + // the non-sticky case. + if ((rCxt.mnRowDelta && rRef.IsEntireCol()) || (rCxt.mnColDelta && rRef.IsEntireRow())) + { + // In entire col/row, values are shifted within + // the reference, which affects all positional + // results like in MATCH or matrix positions. + aRes.mbValueChanged = true; + } + else + { + ScRange aErrorRange( ScAddress::UNINITIALIZED ); + if (!aAbs.MoveSticky(rCxt.mnColDelta, rCxt.mnRowDelta, rCxt.mnTabDelta, aErrorRange)) + aAbs = aErrorRange; + aRes.mbReferenceModified = true; + } } else if (rCxt.maRange.Intersects(aAbs)) { |