sc/source/core/data/column.cxx | 37 +++++++++++++++++++++++++++++++++++++ sc/source/core/data/column3.cxx | 16 ++++++++++++---- 2 files changed, 49 insertions(+), 4 deletions(-)
New commits: commit cf41d1d7c49b30ef2b69d5da31f9f57713c0a062 Author: Kohei Yoshida <kohei.yosh...@gmail.com> Date: Tue Jul 9 00:39:26 2013 -0400 Group formula cells when copying to clip, prevent crash during pasting. Change-Id: I6a33301d74d9845e8c0fa77894fbd89bea40fd1b diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx index 8665873..5ff426e 100644 --- a/sc/source/core/data/column.cxx +++ b/sc/source/core/data/column.cxx @@ -1257,6 +1257,40 @@ class CopyToClipHandler maDestPos.miCellTextAttrPos, nRow, aAttrs.begin(), aAttrs.end()); } + void groupFormulaCells(std::vector<ScFormulaCell*>& rCells) + { + if (rCells.empty()) + return; + + std::vector<ScFormulaCell*>::iterator it = rCells.begin(), itEnd = rCells.end(); + ScFormulaCell* pPrev = *it; + ScFormulaCell* pCur = NULL; + for (++it; it != itEnd; ++it, pPrev = pCur) + { + pCur = *it; + ScFormulaCell::CompareState eState = pPrev->CompareByTokenArray(*pPrev); + if (eState == ScFormulaCell::NotEqual) + continue; + + ScFormulaCellGroupRef xGroup = pPrev->GetCellGroup(); + if (xGroup) + { + // Extend the group. + ++xGroup->mnLength; + pCur->SetCellGroup(xGroup); + continue; + } + + // Create a new group. + xGroup.reset(new ScFormulaCellGroup); + xGroup->mnStart = pPrev->aPos.Row(); + xGroup->mnLength = 2; + xGroup->mbInvariant = (eState == ScFormulaCell::EqualInvariant); + pPrev->SetCellGroup(xGroup); + pCur->SetCellGroup(xGroup); + } + } + public: CopyToClipHandler(const ScColumn& rSrcCol, ScColumn& rDestCol, sc::ColumnBlockPosition* pDestPos) : mrSrcCol(rSrcCol), mrDestCol(rDestCol), mpDestPos(pDestPos) @@ -1336,6 +1370,9 @@ public: aCloned.push_back(new ScFormulaCell(rOld, mrDestCol.GetDoc(), aDestPos)); } + // Group the cloned formula cells. + groupFormulaCells(aCloned); + maDestPos.miCellPos = mrDestCol.GetCellStore().set( maDestPos.miCellPos, nTopRow, aCloned.begin(), aCloned.end()); diff --git a/sc/source/core/data/column3.cxx b/sc/source/core/data/column3.cxx index 3c35b80..d22825c 100644 --- a/sc/source/core/data/column3.cxx +++ b/sc/source/core/data/column3.cxx @@ -899,6 +899,7 @@ class CopyCellsFromClipHandler SCCOL mnCol; long mnRowOffset; sc::ColumnBlockPosition maDestBlockPos; + sc::ColumnBlockPosition* mpDestBlockPos; // to save it for next iteration. bool isDateCell(SCROW nSrcRow) const { @@ -930,15 +931,22 @@ public: mrDestCol(rDestCol), mnTab(nDestTab), mnCol(nDestCol), - mnRowOffset(nRowOffset) + mnRowOffset(nRowOffset), + mpDestBlockPos(mrCxt.getBlockPosition(nDestTab, nDestCol)) { - sc::ColumnBlockPosition* p = mrCxt.getBlockPosition(nDestTab, nDestCol); - if (p) - maDestBlockPos = *p; + if (mpDestBlockPos) + maDestBlockPos = *mpDestBlockPos; else mrDestCol.InitBlockPosition(maDestBlockPos); } + ~CopyCellsFromClipHandler() + { + if (mpDestBlockPos) + // Don't forget to save this to the context! + *mpDestBlockPos = maDestBlockPos; + } + void operator() (const sc::CellStoreType::value_type& node, size_t nOffset, size_t nDataSize) { if (node.type == sc::element_type_empty) _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits