summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKohei Yoshida <kohei.yoshida@gmail.com>2013-07-08 11:09:00 -0400
committerKohei Yoshida <kohei.yoshida@gmail.com>2013-07-08 22:00:54 -0400
commit92c35ab58dd5eaa6680f32796b5df2756a312dbe (patch)
tree12a65e110a9511442297ca952e44b1eab1559141
parentadf63b4b8ad2459b43d0fd6e04dfdf6474a2f3da (diff)
Always use DoubleVectorRefToken when resolving a range reference.
ResolveStaticReference is reserved for calculating invariant formula groups. Change-Id: I58aeabb01f11f98a5c300780734b31079417f4c7
-rw-r--r--sc/source/core/data/formulacell.cxx59
1 files changed, 22 insertions, 37 deletions
diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx
index f8928e575c4e..8d84221a9035 100644
--- a/sc/source/core/data/formulacell.cxx
+++ b/sc/source/core/data/formulacell.cxx
@@ -3021,49 +3021,34 @@ public:
{
ScComplexRefData aRef = pToken->GetDoubleRef();
aRef.CalcAbsIfRel(mrCell.aPos);
- if (aRef.Ref1.IsRowRel() || aRef.Ref2.IsRowRel())
- {
- // Row reference is relative.
- bool bAbsFirst = !aRef.Ref1.IsRowRel();
- bool bAbsLast = !aRef.Ref2.IsRowRel();
- ScAddress aRefPos(aRef.Ref1.nCol, aRef.Ref1.nRow, aRef.Ref1.nTab);
- size_t nCols = aRef.Ref2.nCol - aRef.Ref1.nCol + 1;
- std::vector<const double*> aArrays;
- aArrays.reserve(nCols);
- SCROW nArrayLength = mrCell.GetCellGroup()->mnLength;
- SCROW nRefRowSize = aRef.Ref2.nRow - aRef.Ref1.nRow + 1;
- if (!bAbsLast)
- {
- // range end position is relative. Extend the array length.
- nArrayLength += nRefRowSize - 1;
- }
-
- for (SCCOL i = aRef.Ref1.nCol; i <= aRef.Ref2.nCol; ++i)
- {
- aRefPos.SetCol(i);
- const double* pArray = mrDoc.FetchDoubleArray(mrCxt, aRefPos, nArrayLength);
- if (!pArray)
- return false;
- aArrays.push_back(pArray);
- }
-
- formula::DoubleVectorRefToken aTok(aArrays, nArrayLength, nRefRowSize, bAbsFirst, bAbsLast);
- mrGroupTokens.AddToken(aTok);
- }
- else
+ // Row reference is relative.
+ bool bAbsFirst = !aRef.Ref1.IsRowRel();
+ bool bAbsLast = !aRef.Ref2.IsRowRel();
+ ScAddress aRefPos(aRef.Ref1.nCol, aRef.Ref1.nRow, aRef.Ref1.nTab);
+ size_t nCols = aRef.Ref2.nCol - aRef.Ref1.nCol + 1;
+ std::vector<const double*> aArrays;
+ aArrays.reserve(nCols);
+ SCROW nArrayLength = mrCell.GetCellGroup()->mnLength;
+ SCROW nRefRowSize = aRef.Ref2.nRow - aRef.Ref1.nRow + 1;
+ if (!bAbsLast)
{
- // Absolute row reference.
- ScRange aRefRange(
- aRef.Ref1.nCol, aRef.Ref1.nRow, aRef.Ref1.nTab,
- aRef.Ref2.nCol, aRef.Ref2.nRow, aRef.Ref2.nTab);
+ // range end position is relative. Extend the array length.
+ nArrayLength += nRefRowSize - 1;
+ }
- formula::FormulaTokenRef pNewToken = mrDoc.ResolveStaticReference(aRefRange);
- if (!pNewToken)
+ for (SCCOL i = aRef.Ref1.nCol; i <= aRef.Ref2.nCol; ++i)
+ {
+ aRefPos.SetCol(i);
+ const double* pArray = mrDoc.FetchDoubleArray(mrCxt, aRefPos, nArrayLength);
+ if (!pArray)
return false;
- mrGroupTokens.AddToken(*pNewToken);
+ aArrays.push_back(pArray);
}
+
+ formula::DoubleVectorRefToken aTok(aArrays, nArrayLength, nRefRowSize, bAbsFirst, bAbsLast);
+ mrGroupTokens.AddToken(aTok);
}
break;
case svIndex: