[Libreoffice-commits] core.git: Branch 'feature/formula-core-rework' - sc/inc sc/source
Kohei Yoshida
kohei.yoshida at gmail.com
Tue Jun 25 09:27:47 PDT 2013
sc/inc/column.hxx | 2 ++
sc/inc/table.hxx | 2 ++
sc/source/core/data/column3.cxx | 15 +++++++++++++++
sc/source/core/data/document.cxx | 18 ++++++++++--------
sc/source/core/data/table1.cxx | 6 ++++++
5 files changed, 35 insertions(+), 8 deletions(-)
New commits:
commit 5873c22ed9b634b4b97d5932f305ae2f5e080b0d
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date: Tue Jun 25 12:29:46 2013 -0400
Replace ScCellIterator with sc::ProcessFormula.
Change-Id: I0adf57e5e80972175633dd0c69d465544aa7d7a9
diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx
index 79c37fc..3cbd7b8 100644
--- a/sc/inc/column.hxx
+++ b/sc/inc/column.hxx
@@ -455,6 +455,8 @@ public:
void BroadcastCells( const std::vector<SCROW>& rRows );
void EndFormulaListening( sc::ColumnBlockPosition& rBlockPos, SCROW nRow1, SCROW nRow2 );
+ void InterpretDirtyCells( SCROW nRow1, SCROW nRow2 );
+
private:
void CopyCellsInRangeToColumn(
diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx
index fe88f09..e945477 100644
--- a/sc/inc/table.hxx
+++ b/sc/inc/table.hxx
@@ -847,6 +847,8 @@ public:
void FillMatrix( ScMatrix& rMat, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 ) const;
+ void InterpretDirtyCells( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 );
+
/** 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/column3.cxx b/sc/source/core/data/column3.cxx
index c85f914..16a4d0a 100644
--- a/sc/source/core/data/column3.cxx
+++ b/sc/source/core/data/column3.cxx
@@ -115,6 +115,21 @@ void ScColumn::EndFormulaListening( sc::ColumnBlockPosition& rBlockPos, SCROW nR
sc::ProcessFormula(rBlockPos.miCellPos, maCells, nRow1, nRow2, aFunc);
}
+struct DirtyCellInterpreter
+{
+ void operator() (size_t, ScFormulaCell* p)
+ {
+ if (p->GetDirty())
+ p->Interpret();
+ }
+};
+
+void ScColumn::InterpretDirtyCells( SCROW nRow1, SCROW nRow2 )
+{
+ DirtyCellInterpreter aFunc;
+ sc::ProcessFormula(maCells.begin(), maCells, nRow1, nRow2, aFunc);
+}
+
void ScColumn::Delete( SCROW nRow )
{
std::pair<sc::CellStoreType::iterator,size_t> aPos = maCells.position(nRow);
diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx
index f40e416..3ed67c3 100644
--- a/sc/source/core/data/document.cxx
+++ b/sc/source/core/data/document.cxx
@@ -3482,20 +3482,22 @@ void ScDocument::SetTableOpDirty( const ScRange& rRange )
SetAutoCalc( bOldAutoCalc );
}
-
void ScDocument::InterpretDirtyCells( const ScRangeList& rRanges )
{
+ if (!GetAutoCalc())
+ return;
+
for (size_t nPos=0, nRangeCount = rRanges.size(); nPos < nRangeCount; nPos++)
{
- ScCellIterator aIter( this, *rRanges[ nPos ] );
- for (bool bHas = aIter.first(); bHas; bHas = aIter.next())
+ const ScRange& rRange = *rRanges[nPos];
+ for (SCTAB nTab = rRange.aStart.Tab(); nTab <= rRange.aEnd.Tab(); ++nTab)
{
- if (aIter.getType() != CELLTYPE_FORMULA)
- continue;
+ ScTable* pTab = FetchTable(nTab);
+ if (!pTab)
+ return;
- ScFormulaCell* p = aIter.getFormulaCell();
- if (p->GetDirty() && GetAutoCalc())
- p->Interpret();
+ pTab->InterpretDirtyCells(
+ rRange.aStart.Col(), rRange.aStart.Row(), rRange.aEnd.Col(), rRange.aEnd.Row());
}
}
}
diff --git a/sc/source/core/data/table1.cxx b/sc/source/core/data/table1.cxx
index d3d26a8..2de23b1 100644
--- a/sc/source/core/data/table1.cxx
+++ b/sc/source/core/data/table1.cxx
@@ -2209,6 +2209,12 @@ void ScTable::FillMatrix( ScMatrix& rMat, SCCOL nCol1, SCROW nRow1, SCCOL nCol2,
aCol[nCol].FillMatrix(rMat, nMatCol, nRow1, nRow2);
}
+void ScTable::InterpretDirtyCells( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 )
+{
+ for (SCCOL nCol = nCol1; nCol <= nCol2; ++nCol)
+ aCol[nCol].InterpretDirtyCells(nRow1, nRow2);
+}
+
const SvtBroadcaster* ScTable::GetBroadcaster( SCCOL nCol, SCROW nRow ) const
{
if (!ValidColRow(nCol, nRow))
More information about the Libreoffice-commits
mailing list