summaryrefslogtreecommitdiff
path: root/sc/source/core/tool
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2014-11-24 23:29:32 +0100
committerKohei Yoshida <libreoffice@kohei.us>2014-11-25 15:10:38 +0000
commit094b19c2759c8ecc88b38d37047e9ac2de9b68ee (patch)
treee5eab6b2dc433364bf56ecc7b912c7526f646230 /sc/source/core/tool
parente44d09160038c7cf661e23885a0997d54ca01752 (diff)
fix fdo#79441 again and keep references to other sheets during sort
... also if other references are not updated. References to other sheets are never to be treated as relative during sort, they are always absolute, even if they have relative row/column part references. Broken again during the big sort mess. Even if there was a unit test, which didn't help as it got disabled / adapted to the change.. (cherry picked from commit f0e7364603c9566bc158303c515c3274ccba62ca) Backported. Change-Id: Ic0e61c5e1cb0728e20725c29e450ab0eb55c3305 Reviewed-on: https://gerrit.libreoffice.org/13118 Reviewed-by: Kohei Yoshida <libreoffice@kohei.us> Tested-by: Kohei Yoshida <libreoffice@kohei.us>
Diffstat (limited to 'sc/source/core/tool')
-rw-r--r--sc/source/core/tool/token.cxx43
1 files changed, 43 insertions, 0 deletions
diff --git a/sc/source/core/tool/token.cxx b/sc/source/core/tool/token.cxx
index 03ecc495a5f3..f56161430b04 100644
--- a/sc/source/core/tool/token.cxx
+++ b/sc/source/core/tool/token.cxx
@@ -3548,6 +3548,49 @@ void ScTokenArray::AdjustReferenceOnMovedOrigin( const ScAddress& rOldPos, const
}
}
+void ScTokenArray::AdjustReferenceOnMovedOriginIfOtherSheet( const ScAddress& rOldPos, const ScAddress& rNewPos )
+{
+ FormulaToken** p = pCode;
+ FormulaToken** pEnd = p + static_cast<size_t>(nLen);
+ for (; p != pEnd; ++p)
+ {
+ bool bAdjust = false;
+ switch ((*p)->GetType())
+ {
+ case svExternalSingleRef:
+ bAdjust = true; // always
+ // fallthru
+ case svSingleRef:
+ {
+ ScToken* pToken = static_cast<ScToken*>(*p);
+ ScSingleRefData& rRef = pToken->GetSingleRef();
+ ScAddress aAbs = rRef.toAbs(rOldPos);
+ if (!bAdjust)
+ bAdjust = (aAbs.Tab() != rOldPos.Tab());
+ if (bAdjust)
+ rRef.SetAddress(aAbs, rNewPos);
+ }
+ break;
+ case svExternalDoubleRef:
+ bAdjust = true; // always
+ // fallthru
+ case svDoubleRef:
+ {
+ ScToken* pToken = static_cast<ScToken*>(*p);
+ ScComplexRefData& rRef = pToken->GetDoubleRef();
+ ScRange aAbs = rRef.toAbs(rOldPos);
+ if (!bAdjust)
+ bAdjust = (rOldPos.Tab() < aAbs.aStart.Tab() || aAbs.aEnd.Tab() < rOldPos.Tab());
+ if (bAdjust)
+ rRef.SetRange(aAbs, rNewPos);
+ }
+ break;
+ default:
+ ;
+ }
+ }
+}
+
namespace {
void clearTabDeletedFlag( ScSingleRefData& rRef, const ScAddress& rPos, SCTAB nStartTab, SCTAB nEndTab )