[Libreoffice-commits] core.git: Branch 'feature/formula-core-rework' - sc/inc sc/source
Kohei Yoshida
kohei.yoshida at gmail.com
Mon Aug 12 12:23:12 PDT 2013
sc/inc/sharedformula.hxx | 10 +++++++++-
sc/source/core/data/column.cxx | 9 ++++-----
sc/source/core/tool/sharedformula.cxx | 28 ++++++++++++++++++++++++++--
sc/source/core/tool/token.cxx | 2 +-
4 files changed, 40 insertions(+), 9 deletions(-)
New commits:
commit 5a29e5b6cebfc4be2856f23807a26f2507995989
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date: Mon Aug 12 15:23:28 2013 -0400
Do the splitting of formula groups.
Change-Id: I5a8661895b558b67abc19cdc39de9eb027bc1c34
diff --git a/sc/inc/sharedformula.hxx b/sc/inc/sharedformula.hxx
index 9423384..0b49751 100644
--- a/sc/inc/sharedformula.hxx
+++ b/sc/inc/sharedformula.hxx
@@ -63,7 +63,15 @@ public:
*/
static void splitFormulaCellGroup(const CellStoreType::position_type& aPos);
- static void splitFormulaCellGroups(CellStoreType& rCells, const std::vector<SCROW>& rBounds);
+ /**
+ * Split existing shared formula ranges at specified row positions.
+ *
+ * @param rCells cell storage container
+ * @param rBounds row positions at which to split existing shared formula
+ * ranges. Note that this method will directly modify this
+ * parameter to sort and remove duplicates.
+ */
+ static void splitFormulaCellGroups(CellStoreType& rCells, std::vector<SCROW>& rBounds);
/**
* See if two specified adjacent formula cells can be merged, and if they
diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx
index a395c78..e4ad8c7 100644
--- a/sc/source/core/data/column.cxx
+++ b/sc/source/core/data/column.cxx
@@ -2364,6 +2364,10 @@ bool ScColumn::UpdateReference( const sc::RefUpdateContext& rCxt, ScDocument* pU
if (rCxt.meMode == URM_COPY)
return UpdateReferenceOnCopy(rCxt, pUndoDoc);
+ if (IsEmptyData())
+ // Cells in this column are all empty.
+ return false;
+
std::vector<SCROW> aBounds;
bool bThisColShifted = (rCxt.maRange.aStart.Tab() <= nTab && nTab <= rCxt.maRange.aEnd.Tab() &&
@@ -2387,11 +2391,6 @@ bool ScColumn::UpdateReference( const sc::RefUpdateContext& rCxt, ScDocument* pU
UpdateRefGroupBoundChecker aBoundChecker(rCxt, aBounds);
std::for_each(maCells.begin(), maCells.end(), aBoundChecker);
- // Sort and remove duplicates.
- std::sort(aBounds.begin(), aBounds.end());
- std::vector<SCROW>::iterator it = std::unique(aBounds.begin(), aBounds.end());
- aBounds.erase(it, aBounds.end());
-
// Do the actual splitting.
sc::SharedFormulaUtil::splitFormulaCellGroups(maCells, aBounds);
diff --git a/sc/source/core/tool/sharedformula.cxx b/sc/source/core/tool/sharedformula.cxx
index d9f3a25..9299e33 100644
--- a/sc/source/core/tool/sharedformula.cxx
+++ b/sc/source/core/tool/sharedformula.cxx
@@ -64,9 +64,33 @@ void SharedFormulaUtil::splitFormulaCellGroup(const CellStoreType::position_type
}
}
-void SharedFormulaUtil::splitFormulaCellGroups(CellStoreType& rCells, const std::vector<SCROW>& rBounds)
+void SharedFormulaUtil::splitFormulaCellGroups(CellStoreType& rCells, std::vector<SCROW>& rBounds)
{
- // TODO: Implement this.
+ if (rBounds.empty())
+ return;
+
+ // Sort and remove duplicates.
+ std::sort(rBounds.begin(), rBounds.end());
+ std::vector<SCROW>::iterator it = std::unique(rBounds.begin(), rBounds.end());
+ rBounds.erase(it, rBounds.end());
+
+ it = rBounds.begin();
+ SCROW nRow = *it;
+ CellStoreType::position_type aPos = rCells.position(nRow);
+ if (aPos.first == rCells.end())
+ return;
+
+ splitFormulaCellGroup(aPos);
+ std::vector<SCROW>::iterator itEnd = rBounds.end();
+ for (++it; it != itEnd; ++it)
+ {
+ nRow = *it;
+ aPos = rCells.position(aPos.first, nRow);
+ if (aPos.first == rCells.end())
+ return;
+
+ splitFormulaCellGroup(aPos);
+ }
}
void SharedFormulaUtil::joinFormulaCells(const CellStoreType::position_type& rPos, ScFormulaCell& rCell1, ScFormulaCell& rCell2)
diff --git a/sc/source/core/tool/token.cxx b/sc/source/core/tool/token.cxx
index 1fbf325..e5627ff 100644
--- a/sc/source/core/tool/token.cxx
+++ b/sc/source/core/tool/token.cxx
@@ -2981,7 +2981,7 @@ void checkBounds(
SCROW nOffset = rCxt.maRange.aStart.Row() - aAbs.aStart.Row();
rBounds.push_back(rPos.Row()+nOffset);
// Ditto.
- nOffset = rCxt.maRange.aEnd.Row() - aAbs.aStart.Row();
+ nOffset = rCxt.maRange.aEnd.Row() + 1 - aAbs.aStart.Row();
rBounds.push_back(rPos.Row()+nOffset);
}
More information about the Libreoffice-commits
mailing list