diff options
author | Kohei Yoshida <kohei.yoshida@gmail.com> | 2013-07-08 11:09:00 -0400 |
---|---|---|
committer | Kohei Yoshida <kohei.yoshida@gmail.com> | 2013-07-08 22:00:54 -0400 |
commit | 92c35ab58dd5eaa6680f32796b5df2756a312dbe (patch) | |
tree | 12a65e110a9511442297ca952e44b1eab1559141 | |
parent | adf63b4b8ad2459b43d0fd6e04dfdf6474a2f3da (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.cxx | 59 |
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: |