summaryrefslogtreecommitdiff
path: root/sc/source/core/tool/token.cxx
diff options
context:
space:
mode:
authorKohei Yoshida <kohei.yoshida@gmail.com>2013-08-10 23:31:38 -0400
committerKohei Yoshida <kohei.yoshida@gmail.com>2013-08-12 19:46:29 -0400
commit30503611efc30ac7a3b09744913f048bf28ef70a (patch)
tree6ed4cbb0ae787d6fb807c8d5d559a70d25586fae /sc/source/core/tool/token.cxx
parentbbb2d8c660b515c98624a41a39ffe94d3a7ecc00 (diff)
Collect all boundaries at which to split the formula group.
Change-Id: Ic78d7a06991b983e625b161f11fbbabce02334f3
Diffstat (limited to 'sc/source/core/tool/token.cxx')
-rw-r--r--sc/source/core/tool/token.cxx82
1 files changed, 82 insertions, 0 deletions
diff --git a/sc/source/core/tool/token.cxx b/sc/source/core/tool/token.cxx
index d74182d9a065..1fbf32581dbf 100644
--- a/sc/source/core/tool/token.cxx
+++ b/sc/source/core/tool/token.cxx
@@ -2934,6 +2934,88 @@ sc::RefUpdateResult ScTokenArray::AdjustReferenceOnMovedTab( sc::RefUpdateMoveTa
return aRes;
}
+namespace {
+
+void checkBounds(
+ const sc::RefUpdateContext& rCxt, const ScAddress& rPos, SCROW nGroupLen,
+ const ScSingleRefData& rRef, std::vector<SCROW>& rBounds)
+{
+ if (!rRef.IsRowRel())
+ return;
+
+ ScRange aAbs(rRef.toAbs(rPos));
+ aAbs.aEnd.IncRow(nGroupLen-1);
+ if (!rCxt.maRange.Intersects(aAbs))
+ return;
+
+ // Get the boundary row positions.
+ if (aAbs.aEnd.Row() < rCxt.maRange.aStart.Row())
+ // No intersections.
+ return;
+
+ if (aAbs.aEnd.Row() <= rCxt.maRange.aEnd.Row())
+ {
+ // +-+ <---- top
+ // | |
+ // +--+-+--+ <---- boundary row position
+ // | | | |
+ // | +-+ |
+ // +-------+
+
+ // Add offset from the reference top to the cell position.
+ SCROW nOffset = rCxt.maRange.aStart.Row() - aAbs.aStart.Row();
+ rBounds.push_back(rPos.Row()+nOffset);
+ return;
+ }
+
+ // +-+ <---- top
+ // | |
+ // +--+-+--+ <---- boundary row position
+ // | | | |
+ // | | | |
+ // +--+-+--+ <---- boundary row position
+ // | |
+ // +-+
+
+ // Add offset from the reference top to the cell position.
+ SCROW nOffset = rCxt.maRange.aStart.Row() - aAbs.aStart.Row();
+ rBounds.push_back(rPos.Row()+nOffset);
+ // Ditto.
+ nOffset = rCxt.maRange.aEnd.Row() - aAbs.aStart.Row();
+ rBounds.push_back(rPos.Row()+nOffset);
+}
+
+}
+
+void ScTokenArray::CheckRelativeReferenceBounds(
+ const sc::RefUpdateContext& rCxt, const ScAddress& rPos, SCROW nGroupLen, std::vector<SCROW>& rBounds ) const
+{
+ FormulaToken** p = pCode;
+ FormulaToken** pEnd = p + static_cast<size_t>(nLen);
+ for (; p != pEnd; ++p)
+ {
+ switch ((*p)->GetType())
+ {
+ case svSingleRef:
+ {
+ ScToken* pToken = static_cast<ScToken*>(*p);
+ checkBounds(rCxt, rPos, nGroupLen, pToken->GetSingleRef(), rBounds);
+ }
+ break;
+ case svDoubleRef:
+ {
+ ScToken* pToken = static_cast<ScToken*>(*p);
+ const ScComplexRefData& rRef = pToken->GetDoubleRef();
+ checkBounds(rCxt, rPos, nGroupLen, rRef.Ref1, rBounds);
+ checkBounds(rCxt, rPos, nGroupLen, rRef.Ref2, rBounds);
+ }
+ break;
+ default:
+ ;
+ }
+ }
+}
+
#if DEBUG_FORMULA_COMPILER
void ScTokenArray::Dump() const
{