sc/inc/column.hxx | 1 + sc/inc/document.hxx | 10 ++++++++++ sc/inc/table.hxx | 2 ++ sc/source/core/data/column2.cxx | 26 ++++++++++++++++++++++++++ sc/source/core/data/documen8.cxx | 9 +++++++++ sc/source/core/data/table1.cxx | 8 ++++++++ sc/source/core/tool/formulagroup.cxx | 9 ++++++--- 7 files changed, 62 insertions(+), 3 deletions(-)
New commits: commit d8b0903ef194c78a05541d45dc05c2f860dc7cbf Author: Kohei Yoshida <kohei.yosh...@gmail.com> Date: Wed Jun 26 11:45:28 2013 -0400 Implement a way to set an array of formula results to formula cell group. Change-Id: Ifdea531e963339607a5066f81af32ffedfd408aa diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx index 93d292d..974a934 100644 --- a/sc/inc/column.hxx +++ b/sc/inc/column.hxx @@ -447,6 +447,7 @@ public: bool ResolveStaticReference( ScMatrix& rMat, SCCOL nMatCol, SCROW nRow1, SCROW nRow2 ); void FillMatrix( ScMatrix& rMat, size_t nMatCol, SCROW nRow1, SCROW nRow2 ) const; const double* FetchDoubleArray( sc::FormulaGroupContext& rCxt, SCROW nRow1, SCROW nRow2 ) const; + void SetFormulaResults( SCROW nRow, const double* pResults, size_t nLen ); void SetNumberFormat( SCROW nRow, sal_uInt32 nNumberFormat ); diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx index 5069ccc..87975ad 100644 --- a/sc/inc/document.hxx +++ b/sc/inc/document.hxx @@ -1703,6 +1703,16 @@ public: void FillMatrix( ScMatrix& rMat, SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 ) const; + /** + * Set an array of numerical formula results to a group of contiguous + * formula cells. + * + * @param rTopPos position of the top formula cell of a group. + * @param pResults array of numeric results. + * @param nLen length of numeric results. + */ + void SetFormulaResults( const ScAddress& rTopPos, const double* pResults, size_t nLen ); + private: ScDocument(const ScDocument& r); // disabled with no definition diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx index e945477..0d0aa8e 100644 --- a/sc/inc/table.hxx +++ b/sc/inc/table.hxx @@ -849,6 +849,8 @@ public: void InterpretDirtyCells( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 ); + void SetFormulaResults( SCCOL nCol, SCROW nRow, const double* pResults, size_t nLen ); + /** Replace behaves differently to the Search; adjust the rCol and rRow accordingly. 'Replace' replaces at the 'current' position, but in order to achieve diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx index 80491b5..7205672 100644 --- a/sc/source/core/data/column2.cxx +++ b/sc/source/core/data/column2.cxx @@ -2092,6 +2092,32 @@ const double* ScColumn::FetchDoubleArray( sc::FormulaGroupContext& /*rCxt*/, SCR return &sc::numeric_block::at(*aPos.first->data, aPos.second); } +void ScColumn::SetFormulaResults( SCROW nRow, const double* pResults, size_t nLen ) +{ + sc::CellStoreType::position_type aPos = maCells.position(nRow); + sc::CellStoreType::iterator it = aPos.first; + if (it->type != sc::element_type_formula) + // This is not a formula block. + return; + + size_t nBlockLen = it->size - aPos.second; + if (nBlockLen < nLen) + // Result array is longer than the length of formula cells. Not good. + return; + + sc::formula_block::iterator itCell = sc::formula_block::begin(*it->data); + std::advance(itCell, aPos.second); + + const double* pResEnd = pResults + nLen; + for (; pResults != pResEnd; ++pResults, ++itCell) + { + ScFormulaCell& rCell = **itCell; + rCell.SetResultDouble(*pResults); + rCell.ResetDirty(); + rCell.SetChanged(true); + } +} + void ScColumn::SetNumberFormat( SCROW nRow, sal_uInt32 nNumberFormat ) { short eOldType = pDocument->GetFormatTable()->GetType( diff --git a/sc/source/core/data/documen8.cxx b/sc/source/core/data/documen8.cxx index 694b398..71e1878 100644 --- a/sc/source/core/data/documen8.cxx +++ b/sc/source/core/data/documen8.cxx @@ -449,6 +449,15 @@ void ScDocument::FillMatrix( pTab->FillMatrix(rMat, nCol1, nRow1, nCol2, nRow2); } +void ScDocument::SetFormulaResults( const ScAddress& rTopPos, const double* pResults, size_t nLen ) +{ + ScTable* pTab = FetchTable(rTopPos.Tab()); + if (!pTab) + return; + + pTab->SetFormulaResults(rTopPos.Col(), rTopPos.Row(), pResults, nLen); +} + //------------------------------------------------------------------------ diff --git a/sc/source/core/data/table1.cxx b/sc/source/core/data/table1.cxx index 2de23b1..be6f4ae 100644 --- a/sc/source/core/data/table1.cxx +++ b/sc/source/core/data/table1.cxx @@ -2215,6 +2215,14 @@ void ScTable::InterpretDirtyCells( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW aCol[nCol].InterpretDirtyCells(nRow1, nRow2); } +void ScTable::SetFormulaResults( SCCOL nCol, SCROW nRow, const double* pResults, size_t nLen ) +{ + if (!ValidCol(nCol)) + return; + + aCol[nCol].SetFormulaResults(nRow, pResults, nLen); +} + const SvtBroadcaster* ScTable::GetBroadcaster( SCCOL nCol, SCROW nRow ) const { if (!ValidColRow(nCol, nRow)) diff --git a/sc/source/core/tool/formulagroup.cxx b/sc/source/core/tool/formulagroup.cxx index 1ee57b5..c30d895 100644 --- a/sc/source/core/tool/formulagroup.cxx +++ b/sc/source/core/tool/formulagroup.cxx @@ -27,6 +27,8 @@ bool FormulaGroupInterpreter::interpret() // Until we implement group calculation for real, decompose the group into // individual formula token arrays for individual calculation. ScAddress aTmpPos = maTopPos; + std::vector<double> aResults; + aResults.reserve(mxGroup->mnLength); for (sal_Int32 i = 0; i < mxGroup->mnLength; ++i) { aTmpPos.SetRow(mxGroup->mnStart + i); @@ -86,11 +88,12 @@ bool FormulaGroupInterpreter::interpret() ScInterpreter aInterpreter(pDest, &mrDoc, aTmpPos, aCode2); aInterpreter.Interpret(); - pDest->SetResultToken(aInterpreter.GetResultToken().get()); - pDest->ResetDirty(); - pDest->SetChanged(true); + const formula::FormulaToken* pResToken = aInterpreter.GetResultToken().get(); + aResults.push_back(pResToken->GetDouble()); } + mrDoc.SetFormulaResults(maTopPos, &aResults[0], aResults.size()); + return true; } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits