diff options
author | Kohei Yoshida <kohei.yoshida@gmail.com> | 2013-06-26 02:49:00 -0400 |
---|---|---|
committer | Kohei Yoshida <kohei.yoshida@gmail.com> | 2013-06-27 15:47:56 -0400 |
commit | 99517ea08aa48aa2b8045f4104576d3068483b66 (patch) | |
tree | f86d3958269dea2806a96cd031f3b73695a4ba23 /sc | |
parent | 66b6e32bb4fa31527159a15c4c2739e151c006f0 (diff) |
Adopt CopyAsLinkHandler as well.
With this, we no longer use CopyCellsInRangeToColumn().
Change-Id: I6506d72d084f724ccf7a6395a0daf88fe7bff40e
Diffstat (limited to 'sc')
-rw-r--r-- | sc/inc/column.hxx | 4 | ||||
-rw-r--r-- | sc/source/core/data/column.cxx | 148 | ||||
-rw-r--r-- | sc/source/core/data/column3.cxx | 105 |
3 files changed, 84 insertions, 173 deletions
diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx index 95444f820411..bb3219c941f9 100644 --- a/sc/inc/column.hxx +++ b/sc/inc/column.hxx @@ -492,10 +492,6 @@ public: private: - void CopyCellsInRangeToColumn( - sc::ColumnBlockConstPosition* rSrcColPos, sc::ColumnBlockPosition* pDestColPos, - sc::CellBlockCloneHandler& Hdl, SCROW nRow1, SCROW nRow2, ScColumn& rColumn ) const; - sc::CellStoreType::iterator GetPositionToInsert( SCROW nRow ); sc::CellStoreType::iterator GetPositionToInsert( const sc::CellStoreType::iterator& it, SCROW nRow ); void ActivateNewFormulaCell( ScFormulaCell* pCell ); diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx index 4bbca6e4613b..e6ba2d328669 100644 --- a/sc/source/core/data/column.cxx +++ b/sc/source/core/data/column.cxx @@ -1558,92 +1558,114 @@ bool canCopyValue(const ScDocument& rDoc, const ScAddress& rPos, sal_uInt16 nFla return ((nFlags & IDF_VALUE) != 0); } -class CopyAsLinkHandler : public sc::CellBlockCloneHandler +class CopyAsLinkHandler { + const ScColumn& mrSrcCol; + ScColumn& mrDestCol; + sc::ColumnBlockPosition maDestPos; + sc::ColumnBlockPosition* mpDestPos; sal_uInt16 mnCopyFlags; std::vector<ScFormulaCell*> maCellBuffer; - ScFormulaCell* createRefCell(const ScAddress& rSrcPos, const ScAddress& rDestPos) + void setDefaultAttrToDest(size_t nRow) + { + maDestPos.miCellTextAttrPos = mrDestCol.GetCellAttrStore().set( + maDestPos.miCellTextAttrPos, nRow, sc::CellTextAttr()); + } + + void setDefaultAttrsToDest(size_t nRow, size_t nSize) + { + std::vector<sc::CellTextAttr> aAttrs(nSize); // default values + maDestPos.miCellTextAttrPos = mrDestCol.GetCellAttrStore().set( + maDestPos.miCellTextAttrPos, nRow, aAttrs.begin(), aAttrs.end()); + } + + ScFormulaCell* createRefCell(size_t nRow) { ScSingleRefData aRef; - aRef.InitAddress(rSrcPos); // Absolute reference. + aRef.InitAddress(ScAddress(mrSrcCol.GetCol(), nRow, mrSrcCol.GetTab())); // Absolute reference. aRef.SetFlag3D(true); ScTokenArray aArr; aArr.AddSingleReference(aRef); - return new ScFormulaCell(&getDestDoc(), rDestPos, &aArr); + return new ScFormulaCell(&mrDestCol.GetDoc(), ScAddress(mrDestCol.GetCol(), nRow, mrDestCol.GetTab()), &aArr); } - template<typename _DataBlock> - void createRefBlock( - sc::ColumnBlockPosition& rPos, const ScAddress& rSrcPos, const ScAddress& rDestPos, - const typename _DataBlock::const_iterator& itBegin, const typename _DataBlock::const_iterator& itEnd) + void createRefBlock(const sc::CellStoreType::value_type& aNode, size_t nOffset, size_t nDataSize) { - size_t nSize = std::distance(itBegin, itEnd); + size_t nTopRow = aNode.position + nOffset; + maCellBuffer.clear(); - maCellBuffer.reserve(nSize); - ScAddress aSrcPos = rSrcPos; - ScAddress aDestPos = rDestPos; - for (typename _DataBlock::const_iterator it = itBegin; it != itEnd; ++it, aSrcPos.IncRow(), aDestPos.IncRow()) - maCellBuffer.push_back(createRefCell(aSrcPos, aDestPos)); + maCellBuffer.reserve(nDataSize); + + for (size_t i = 0; i < nDataSize; ++i) + maCellBuffer.push_back(createRefCell(nTopRow + i)); - rPos.miCellPos = getDestCellStore().set(rPos.miCellPos, rDestPos.Row(), maCellBuffer.begin(), maCellBuffer.end()); - setDefaultAttrsToDest(rPos, rDestPos.Row(), nSize); + maDestPos.miCellPos = mrDestCol.GetCellStore().set(maDestPos.miCellPos, nTopRow, maCellBuffer.begin(), maCellBuffer.end()); + setDefaultAttrsToDest(nTopRow, nDataSize); } public: - CopyAsLinkHandler( - ScDocument& rSrcDoc, ScDocument& rDestDoc, sc::CellStoreType& rDestCellStore, sc::CellTextAttrStoreType& rDestAttrStore, sal_uInt16 nCopyFlags) : - sc::CellBlockCloneHandler(rSrcDoc, rDestDoc, rDestCellStore, rDestAttrStore), - mnCopyFlags(nCopyFlags) {} - - virtual void cloneDoubleBlock( - sc::ColumnBlockPosition& rPos, const ScAddress& rSrcPos, const ScAddress& rDestPos, - const sc::numeric_block::const_iterator& itBegin, const sc::numeric_block::const_iterator& itEnd) + CopyAsLinkHandler(const ScColumn& rSrcCol, ScColumn& rDestCol, sc::ColumnBlockPosition* pDestPos, sal_uInt16 nCopyFlags) : + mrSrcCol(rSrcCol), mrDestCol(rDestCol), mpDestPos(pDestPos), mnCopyFlags(nCopyFlags) { - if ((mnCopyFlags & (IDF_DATETIME|IDF_VALUE)) == 0) - return; - - ScAddress aSrcPos = rSrcPos; - ScAddress aDestPos = rDestPos; - for (sc::numeric_block::const_iterator it = itBegin; it != itEnd; ++it, aSrcPos.IncRow(), aDestPos.IncRow()) - { - if (!canCopyValue(getSrcDoc(), aSrcPos, mnCopyFlags)) - continue; - - rPos.miCellPos = getDestCellStore().set(rPos.miCellPos, aDestPos.Row(), createRefCell(aSrcPos, aDestPos)); - setDefaultAttrToDest(rPos, aDestPos.Row()); - } + if (mpDestPos) + maDestPos = *mpDestPos; } - virtual void cloneStringBlock( - sc::ColumnBlockPosition& rPos, const ScAddress& rSrcPos, const ScAddress& rDestPos, - const sc::string_block::const_iterator& itBegin, const sc::string_block::const_iterator& itEnd) + ~CopyAsLinkHandler() { - if (!(mnCopyFlags & IDF_STRING)) - return; - - createRefBlock<sc::string_block>(rPos, rSrcPos, rDestPos, itBegin, itEnd); + if (mpDestPos) + *mpDestPos = maDestPos; } - virtual void cloneEditTextBlock( - sc::ColumnBlockPosition& rPos, const ScAddress& rSrcPos, const ScAddress& rDestPos, - const sc::edittext_block::const_iterator& itBegin, const sc::edittext_block::const_iterator& itEnd) + void operator() (const sc::CellStoreType::value_type& aNode, size_t nOffset, size_t nDataSize) { - if (!(mnCopyFlags & IDF_STRING)) - return; + size_t nRow = aNode.position - nOffset; - createRefBlock<sc::edittext_block>(rPos, rSrcPos, rDestPos, itBegin, itEnd); - } + switch (aNode.type) + { + case sc::element_type_numeric: + { + if ((mnCopyFlags & (IDF_DATETIME|IDF_VALUE)) == 0) + return; - virtual void cloneFormulaBlock( - sc::ColumnBlockPosition& rPos, const ScAddress& rSrcPos, const ScAddress& rDestPos, - const sc::formula_block::const_iterator& itBegin, const sc::formula_block::const_iterator& itEnd) - { - if (!(mnCopyFlags & IDF_FORMULA)) - return; + sc::numeric_block::const_iterator it = sc::numeric_block::begin(*aNode.data); + std::advance(it, nOffset); + sc::numeric_block::const_iterator itEnd = it; + std::advance(itEnd, nDataSize); - createRefBlock<sc::formula_block>(rPos, rSrcPos, rDestPos, itBegin, itEnd); + ScAddress aSrcPos(mrSrcCol.GetCol(), nRow, mrSrcCol.GetTab()); + for (; it != itEnd; ++it, aSrcPos.IncRow(), ++nRow) + { + if (!canCopyValue(mrSrcCol.GetDoc(), aSrcPos, mnCopyFlags)) + continue; + + maDestPos.miCellPos = mrDestCol.GetCellStore().set(maDestPos.miCellPos, nRow, createRefCell(nRow)); + setDefaultAttrToDest(nRow); + } + } + break; + case sc::element_type_string: + case sc::element_type_edittext: + { + if (!(mnCopyFlags & IDF_STRING)) + return; + + createRefBlock(aNode, nOffset, nDataSize); + } + break; + case sc::element_type_formula: + { + if (!(mnCopyFlags & IDF_FORMULA)) + return; + + createRefBlock(aNode, nOffset, nDataSize); + } + break; + default: + ; + } } }; @@ -1920,21 +1942,19 @@ void ScColumn::CopyToColumn( if ((nFlags & IDF_CONTENTS) != 0) { - boost::scoped_ptr<sc::CellBlockCloneHandler> pHdl(NULL); - if (bAsLink) { - pHdl.reset(new CopyAsLinkHandler(*pDocument, *rColumn.pDocument, rColumn.maCells, rColumn.maCellTextAttrs, nFlags)); - CopyCellsInRangeToColumn(NULL, rCxt.getBlockPosition(rColumn.nTab, rColumn.nCol), *pHdl, nRow1, nRow2, rColumn); + CopyAsLinkHandler aFunc(*this, rColumn, rCxt.getBlockPosition(rColumn.nTab, rColumn.nCol), nFlags); + sc::ParseBlock(maCells.begin(), maCells, aFunc, nRow1, nRow2); } else { CopyByCloneHandler aFunc(*this, rColumn, rCxt.getBlockPosition(rColumn.nTab, rColumn.nCol), nFlags); sc::ParseBlock(maCells.begin(), maCells, aFunc, nRow1, nRow2); - rColumn.RegroupFormulaCells(nRow1, nRow2); - rColumn.CellStorageModified(); } + rColumn.RegroupFormulaCells(nRow1, nRow2); + rColumn.CellStorageModified(); } } diff --git a/sc/source/core/data/column3.cxx b/sc/source/core/data/column3.cxx index 9d234149ca68..b89b5a1612dc 100644 --- a/sc/source/core/data/column3.cxx +++ b/sc/source/core/data/column3.cxx @@ -323,111 +323,6 @@ void ScColumn::DeleteRow( SCROW nStartRow, SCSIZE nSize ) std::for_each(aSpans.begin(), aSpans.end(), RangeBroadcaster(*pDocument, nTab, nCol)); } -void ScColumn::CopyCellsInRangeToColumn( - sc::ColumnBlockConstPosition* pSrcColPos, - sc::ColumnBlockPosition* pDestColPos, sc::CellBlockCloneHandler& rHdl, SCROW nRow1, SCROW nRow2, ScColumn& rColumn ) const -{ - sc::ColumnBlockConstPosition aSrcColPos; - sc::ColumnBlockPosition aDestColPos; - - if (pSrcColPos) - aSrcColPos = *pSrcColPos; - else - InitBlockPosition(aSrcColPos); - - if (pDestColPos) - aDestColPos = *pDestColPos; - else - rColumn.InitBlockPosition(aDestColPos); - - std::pair<sc::CellStoreType::const_iterator,size_t> aPos = maCells.position(aSrcColPos.miCellPos, nRow1); - sc::CellStoreType::const_iterator it = aPos.first; - aSrcColPos.miCellPos = aPos.first; - size_t nOffset = aPos.second; - size_t nDataSize = 0; - size_t nCurRow = nRow1; - - for (; it != maCells.end() && nCurRow <= static_cast<size_t>(nRow2); ++it, nOffset = 0, nCurRow += nDataSize) - { - bool bLastBlock = false; - nDataSize = it->size - nOffset; - if (nCurRow + nDataSize - 1 > static_cast<size_t>(nRow2)) - { - // Truncate the block to copy to clipboard. - nDataSize = nRow2 - nCurRow + 1; - bLastBlock = true; - } - - switch (it->type) - { - case sc::element_type_numeric: - { - sc::numeric_block::const_iterator itData = sc::numeric_block::begin(*it->data); - std::advance(itData, nOffset); - sc::numeric_block::const_iterator itDataEnd = itData; - std::advance(itDataEnd, nDataSize); - ScAddress aSrcPos(nCol, nCurRow, nTab); - ScAddress aDestPos(rColumn.nCol, nCurRow, rColumn.nTab); - rHdl.cloneDoubleBlock(aDestColPos, aSrcPos, aDestPos, itData, itDataEnd); - } - break; - case sc::element_type_string: - { - sc::string_block::const_iterator itData = sc::string_block::begin(*it->data); - std::advance(itData, nOffset); - sc::string_block::const_iterator itDataEnd = itData; - std::advance(itDataEnd, nDataSize); - ScAddress aSrcPos(nCol, nCurRow, nTab); - ScAddress aDestPos(rColumn.nCol, nCurRow, rColumn.nTab); - rHdl.cloneStringBlock(aDestColPos, aSrcPos, aDestPos, itData, itDataEnd); - } - break; - case sc::element_type_edittext: - { - sc::edittext_block::const_iterator itData = sc::edittext_block::begin(*it->data); - std::advance(itData, nOffset); - sc::edittext_block::const_iterator itDataEnd = itData; - std::advance(itDataEnd, nDataSize); - ScAddress aSrcPos(nCol, nCurRow, nTab); - ScAddress aDestPos(rColumn.nCol, nCurRow, rColumn.nTab); - rHdl.cloneEditTextBlock(aDestColPos, aSrcPos, aDestPos, itData, itDataEnd); - } - break; - case sc::element_type_formula: - { - sc::formula_block::const_iterator itData = sc::formula_block::begin(*it->data); - std::advance(itData, nOffset); - sc::formula_block::const_iterator itDataEnd = itData; - std::advance(itDataEnd, nDataSize); - ScAddress aSrcPos(nCol, nCurRow, nTab); - ScAddress aDestPos(rColumn.nCol, nCurRow, rColumn.nTab); - rHdl.cloneFormulaBlock(aDestColPos, aSrcPos, aDestPos, itData, itDataEnd); - } - break; - default: - ; - } - - if (bLastBlock) - break; - } - - if (pSrcColPos) - { - // Save the positions for the next iteration. - *pSrcColPos = aSrcColPos; - } - - if (pDestColPos) - { - // Save the positions for the next iteration. - *pDestColPos = aDestColPos; - } - - rColumn.RegroupFormulaCells(nRow1, nRow2); - rColumn.CellStorageModified(); -} - sc::CellStoreType::iterator ScColumn::GetPositionToInsert( SCROW nRow ) { return GetPositionToInsert(maCells.begin(), nRow); |