sc/Library_sc.mk | 1 sc/inc/cellclonehandler.hxx | 68 ----- sc/inc/column.hxx | 5 sc/source/core/data/cellclonehandler.cxx | 116 --------- sc/source/core/data/column.cxx | 360 ++++++++++++++++++------------- sc/source/core/data/column3.cxx | 106 --------- 6 files changed, 219 insertions(+), 437 deletions(-)
New commits: commit 3ef31651e7dd52630d02b85081d35c64a2f4f395 Author: Kohei Yoshida <[email protected]> Date: Wed Jun 26 02:53:40 2013 -0400 Remove these unused files. Change-Id: Ifcff5ee2849f9f390f82197fa60a3cea12dd0b27 diff --git a/sc/Library_sc.mk b/sc/Library_sc.mk index 94c9a52..a2fcfc5 100644 --- a/sc/Library_sc.mk +++ b/sc/Library_sc.mk @@ -100,7 +100,6 @@ $(eval $(call gb_Library_add_exception_objects,sc,\ sc/source/core/data/autonamecache \ sc/source/core/data/bcaslot \ sc/source/core/data/bigrange \ - sc/source/core/data/cellclonehandler \ sc/source/core/data/cellvalue \ sc/source/core/data/clipcontext \ sc/source/core/data/clipparam \ diff --git a/sc/inc/cellclonehandler.hxx b/sc/inc/cellclonehandler.hxx deleted file mode 100644 index 4ae8123..0000000 --- a/sc/inc/cellclonehandler.hxx +++ /dev/null @@ -1,68 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -#ifndef SC_CELLCLONEHANDLER_HXX -#define SC_CELLCLONEHANDLER_HXX - -#include "rtl/ustring.hxx" -#include "address.hxx" -#include "mtvelements.hxx" - -class ScDocument; -class EditTextObject; -class ScFormulaCell; - -namespace sc { - -class CellBlockCloneHandler -{ - ScDocument& mrSrcDoc; - ScDocument& mrDestDoc; - CellStoreType& mrDestCellStore; - CellTextAttrStoreType& mrDestAttrStore; - -protected: - ScDocument& getSrcDoc(); - ScDocument& getDestDoc(); - const ScDocument& getDestDoc() const; - CellStoreType& getDestCellStore(); - CellTextAttrStoreType& getDestAttrStore(); - - void setDefaultAttrToDest(ColumnBlockPosition& rPos, SCROW nRow); - void setDefaultAttrsToDest(ColumnBlockPosition& rPos, SCROW nRow, size_t nSize); - -public: - CellBlockCloneHandler( - ScDocument& rSrcDoc, ScDocument& rDestDoc, - CellStoreType& rDestCellStore, CellTextAttrStoreType& rDestAttrStore); - - virtual ~CellBlockCloneHandler(); - - virtual void cloneDoubleBlock( - ColumnBlockPosition& rPos, const ScAddress& rSrcPos, const ScAddress& rDestPos, - const numeric_block::const_iterator& itBegin, const numeric_block::const_iterator& itEnd); - - virtual void cloneStringBlock( - ColumnBlockPosition& rPos, const ScAddress& rSrcPos, const ScAddress& rDestPos, - const string_block::const_iterator& itBegin, const string_block::const_iterator& itEnd); - - virtual void cloneEditTextBlock( - ColumnBlockPosition& rPos, const ScAddress& rSrcPos, const ScAddress& rDestPos, - const edittext_block::const_iterator& itBegin, const edittext_block::const_iterator& itEnd); - - virtual void cloneFormulaBlock( - ColumnBlockPosition& rPos, const ScAddress& rSrcPos, const ScAddress& rDestPos, - const formula_block::const_iterator& itBegin, const formula_block::const_iterator& itEnd); -}; - -} - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx index 8e4502a..93d292d 100644 --- a/sc/inc/column.hxx +++ b/sc/inc/column.hxx @@ -45,7 +45,6 @@ namespace sc { class CopyToDocContext; class MixDocContext; struct ColumnBlockPosition; - class CellBlockCloneHandler; class SingleColumnSpanSet; } diff --git a/sc/source/core/data/cellclonehandler.cxx b/sc/source/core/data/cellclonehandler.cxx deleted file mode 100644 index 8f5bd17..0000000 --- a/sc/source/core/data/cellclonehandler.cxx +++ /dev/null @@ -1,116 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -#include "cellclonehandler.hxx" -#include "editutil.hxx" -#include "document.hxx" - -namespace sc { - -CellBlockCloneHandler::CellBlockCloneHandler( - ScDocument& rSrcDoc, ScDocument& rDestDoc, - CellStoreType& rDestCellStore, CellTextAttrStoreType& rDestAttrStore) : - mrSrcDoc(rSrcDoc), mrDestDoc(rDestDoc), - mrDestCellStore(rDestCellStore), mrDestAttrStore(rDestAttrStore) {} - -CellBlockCloneHandler::~CellBlockCloneHandler() {} - -ScDocument& CellBlockCloneHandler::getSrcDoc() -{ - return mrSrcDoc; -} - -ScDocument& CellBlockCloneHandler::getDestDoc() -{ - return mrDestDoc; -} - -const ScDocument& CellBlockCloneHandler::getDestDoc() const -{ - return mrDestDoc; -} - -CellStoreType& CellBlockCloneHandler::getDestCellStore() -{ - return mrDestCellStore; -} - -CellTextAttrStoreType& CellBlockCloneHandler::getDestAttrStore() -{ - return mrDestAttrStore; -} - -void CellBlockCloneHandler::setDefaultAttrToDest(ColumnBlockPosition& rPos, SCROW nRow) -{ - rPos.miCellTextAttrPos = mrDestAttrStore.set(rPos.miCellTextAttrPos, nRow, CellTextAttr()); -} - -void CellBlockCloneHandler::setDefaultAttrsToDest(ColumnBlockPosition& rPos, SCROW nRow, size_t nSize) -{ - std::vector<sc::CellTextAttr> aAttrs(nSize); // default values - rPos.miCellTextAttrPos = mrDestAttrStore.set( - rPos.miCellTextAttrPos, nRow, aAttrs.begin(), aAttrs.end()); -} - -void CellBlockCloneHandler::cloneDoubleBlock( - ColumnBlockPosition& rPos, const ScAddress& /*rSrcPos*/, const ScAddress& rDestPos, - const numeric_block::const_iterator& itBegin, const numeric_block::const_iterator& itEnd) -{ - rPos.miCellPos = mrDestCellStore.set(rPos.miCellPos, rDestPos.Row(), itBegin, itEnd); - setDefaultAttrsToDest(rPos, rDestPos.Row(), std::distance(itBegin, itEnd)); -} - -void CellBlockCloneHandler::cloneStringBlock( - ColumnBlockPosition& rPos, const ScAddress& /*rSrcPos*/, const ScAddress& rDestPos, - const string_block::const_iterator& itBegin, const string_block::const_iterator& itEnd) -{ - rPos.miCellPos = mrDestCellStore.set(rPos.miCellPos, rDestPos.Row(), itBegin, itEnd); - setDefaultAttrsToDest(rPos, rDestPos.Row(), std::distance(itBegin, itEnd)); -} - -void CellBlockCloneHandler::cloneEditTextBlock( - ColumnBlockPosition& rPos, const ScAddress& /*rSrcPos*/, const ScAddress& rDestPos, - const edittext_block::const_iterator& itBegin, const edittext_block::const_iterator& itEnd) -{ - std::vector<EditTextObject*> aCloned; - aCloned.reserve(std::distance(itBegin, itEnd)); - for (edittext_block::const_iterator it = itBegin; it != itEnd; ++it) - aCloned.push_back(ScEditUtil::Clone(**it, getDestDoc())); - - rPos.miCellPos = getDestCellStore().set( - rPos.miCellPos, rDestPos.Row(), aCloned.begin(), aCloned.end()); - - setDefaultAttrsToDest(rPos, rDestPos.Row(), std::distance(itBegin, itEnd)); -} - -void CellBlockCloneHandler::cloneFormulaBlock( - ColumnBlockPosition& rPos, const ScAddress& /*rSrcPos*/, const ScAddress& rDestPos, - const formula_block::const_iterator& itBegin, const formula_block::const_iterator& itEnd) -{ - std::vector<ScFormulaCell*> aCloned; - aCloned.reserve(std::distance(itBegin, itEnd)); - ScAddress aDestPos = rDestPos; - for (formula_block::const_iterator it = itBegin; it != itEnd; ++it, aDestPos.IncRow()) - { - const ScFormulaCell& rOld = **it; - if (rOld.GetDirty() && getSrcDoc().GetAutoCalc()) - const_cast<ScFormulaCell&>(rOld).Interpret(); - - aCloned.push_back(new ScFormulaCell(rOld, getDestDoc(), aDestPos)); - } - - rPos.miCellPos = getDestCellStore().set( - rPos.miCellPos, rDestPos.Row(), aCloned.begin(), aCloned.end()); - - setDefaultAttrsToDest(rPos, rDestPos.Row(), std::distance(itBegin, itEnd)); -} - -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx index 3f54d59..f3fb8cf 100644 --- a/sc/source/core/data/column.cxx +++ b/sc/source/core/data/column.cxx @@ -36,7 +36,6 @@ #include "clipcontext.hxx" #include "types.hxx" #include "editutil.hxx" -#include "cellclonehandler.hxx" #include "mtvcellfunc.hxx" #include "columnspanset.hxx" #include "scopetools.hxx" diff --git a/sc/source/core/data/column3.cxx b/sc/source/core/data/column3.cxx index f95d565..227a69b 100644 --- a/sc/source/core/data/column3.cxx +++ b/sc/source/core/data/column3.cxx @@ -44,7 +44,6 @@ #include "columnspanset.hxx" #include "mtvcellfunc.hxx" #include "scopetools.hxx" -#include "cellclonehandler.hxx" #include "editutil.hxx" #include <com/sun/star/i18n/LocaleDataItem.hpp> commit ec8e986a1f6b25660e8ac785ed3aac114b0c485e Author: Kohei Yoshida <[email protected]> Date: Wed Jun 26 02:49:00 2013 -0400 Adopt CopyAsLinkHandler as well. With this, we no longer use CopyCellsInRangeToColumn(). Change-Id: I6506d72d084f724ccf7a6395a0daf88fe7bff40e diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx index c6b3945..8e4502a 100644 --- a/sc/inc/column.hxx +++ b/sc/inc/column.hxx @@ -485,10 +485,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 2310212..3f54d59 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 b8e8e10..f95d565 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); commit 09857339718989260eaeff0451c4ec280717cdbb Author: Kohei Yoshida <[email protected]> Date: Wed Jun 26 02:02:14 2013 -0400 Adopt CopyByCloneHandler to ParseBlock(). Change-Id: Iac82967a9cdd1b7c3e062b1931bb306cf160bba0 diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx index c561035..2310212 100644 --- a/sc/source/core/data/column.cxx +++ b/sc/source/core/data/column.cxx @@ -1302,7 +1302,7 @@ public: void operator() (const sc::CellStoreType::value_type& aNode, size_t nOffset, size_t nDataSize) { - size_t nTopRow = aNode.position; + size_t nTopRow = aNode.position - nOffset; switch (aNode.type) { @@ -1647,14 +1647,31 @@ public: } }; -class CopyByCloneHandler : public sc::CellBlockCloneHandler +class CopyByCloneHandler { + const ScColumn& mrSrcCol; + ScColumn& mrDestCol; + sc::ColumnBlockPosition maDestPos; + sc::ColumnBlockPosition* mpDestPos; sal_uInt16 mnCopyFlags; - void cloneFormulaCell( - sc::ColumnBlockPosition& rPos, const ScAddress& rSrcPos, const ScAddress& rDestPos, - ScFormulaCell& rSrcCell) + 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()); + } + + void cloneFormulaCell(size_t nRow, ScFormulaCell& rSrcCell) + { + ScAddress aDestPos(mrDestCol.GetCol(), nRow, mrDestCol.GetTab()); + bool bCloneValue = (mnCopyFlags & IDF_VALUE) != 0; bool bCloneDateTime = (mnCopyFlags & IDF_DATETIME) != 0; bool bCloneString = (mnCopyFlags & IDF_STRING) != 0; @@ -1679,15 +1696,14 @@ class CopyByCloneHandler : public sc::CellBlockCloneHandler if (bForceFormula || bCloneFormula) { // Clone as formula cell. - ScFormulaCell* pCell = new ScFormulaCell(rSrcCell, getDestDoc(), rDestPos); + ScFormulaCell* pCell = new ScFormulaCell(rSrcCell, mrDestCol.GetDoc(), aDestPos); pCell->SetDirtyVar(); - rPos.miCellPos = getDestCellStore().set(rPos.miCellPos, rDestPos.Row(), pCell); - setDefaultAttrToDest(rPos, rDestPos.Row()); - + maDestPos.miCellPos = mrDestCol.GetCellStore().set(maDestPos.miCellPos, nRow, pCell); + setDefaultAttrToDest(nRow); return; } - if (getDestDoc().IsUndo()) + if (mrDestCol.GetDoc().IsUndo()) return; if (bCloneValue) @@ -1696,11 +1712,11 @@ class CopyByCloneHandler : public sc::CellBlockCloneHandler if (nErr) { // error codes are cloned with values - ScFormulaCell* pErrCell = new ScFormulaCell(&getDestDoc(), rDestPos); + ScFormulaCell* pErrCell = new ScFormulaCell(&mrDestCol.GetDoc(), aDestPos); pErrCell->SetErrCode(nErr); - rPos.miCellPos = getDestCellStore().set( - rPos.miCellPos, rDestPos.Row(), new ScFormulaCell(rSrcCell, getDestDoc(), rDestPos)); - setDefaultAttrToDest(rPos, rDestPos.Row()); + maDestPos.miCellPos = mrDestCol.GetCellStore().set( + maDestPos.miCellPos, nRow, new ScFormulaCell(rSrcCell, mrDestCol.GetDoc(), aDestPos)); + setDefaultAttrToDest(nRow); return; } } @@ -1709,11 +1725,11 @@ class CopyByCloneHandler : public sc::CellBlockCloneHandler { if (rSrcCell.IsValue()) { - if (canCopyValue(getSrcDoc(), rSrcPos, mnCopyFlags)) + if (canCopyValue(mrSrcCol.GetDoc(), ScAddress(mrSrcCol.GetCol(), nRow, mrSrcCol.GetTab()), mnCopyFlags)) { - rPos.miCellPos = getDestCellStore().set( - rPos.miCellPos, rDestPos.Row(), rSrcCell.GetValue()); - setDefaultAttrToDest(rPos, rDestPos.Row()); + maDestPos.miCellPos = mrDestCol.GetCellStore().set( + maDestPos.miCellPos, nRow, rSrcCell.GetValue()); + setDefaultAttrToDest(nRow); } return; @@ -1730,91 +1746,127 @@ class CopyByCloneHandler : public sc::CellBlockCloneHandler if (rSrcCell.IsMultilineResult()) { // Clone as an edit text object. - EditEngine& rEngine = getDestDoc().GetEditEngine(); + EditEngine& rEngine = mrDestCol.GetDoc().GetEditEngine(); rEngine.SetText(aStr); - rPos.miCellPos = - getDestCellStore().set(rPos.miCellPos, rDestPos.Row(), rEngine.CreateTextObject()); + maDestPos.miCellPos = + mrDestCol.GetCellStore().set(maDestPos.miCellPos, nRow, rEngine.CreateTextObject()); } else { - rPos.miCellPos = - getDestCellStore().set(rPos.miCellPos, rDestPos.Row(), aStr); + maDestPos.miCellPos = + mrDestCol.GetCellStore().set(maDestPos.miCellPos, nRow, aStr); } - setDefaultAttrToDest(rPos, rDestPos.Row()); + setDefaultAttrToDest(nRow); } } public: - CopyByCloneHandler(ScDocument& rSrcDoc, ScDocument& rDestDoc, - sc::CellStoreType& rDestCellStore, sc::CellTextAttrStoreType& rDestAttrStore, sal_uInt16 nCopyFlags) : - sc::CellBlockCloneHandler(rSrcDoc, rDestDoc, rDestCellStore, rDestAttrStore), - mnCopyFlags(nCopyFlags) + CopyByCloneHandler(const ScColumn& rSrcCol, ScColumn& rDestCol, sc::ColumnBlockPosition* pDestPos, sal_uInt16 nCopyFlags) : + mrSrcCol(rSrcCol), mrDestCol(rDestCol), mpDestPos(pDestPos), mnCopyFlags(nCopyFlags) { + if (mpDestPos) + maDestPos = *mpDestPos; } - 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) + ~CopyByCloneHandler() { - 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(), *it); - setDefaultAttrToDest(rPos, aDestPos.Row()); - } + if (mpDestPos) + *mpDestPos = maDestPos; } - 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) + 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; - ScAddress aDestPos = rDestPos; - for (sc::string_block::const_iterator it = itBegin; it != itEnd; ++it, aDestPos.IncRow()) + switch (aNode.type) { - const OUString& rStr = *it; - if (rStr.isEmpty()) + case sc::element_type_numeric: { - // String cell with empty value is used to special-case cell value removal. - rPos.miCellPos = getDestCellStore().set_empty(rPos.miCellPos, aDestPos.Row(), aDestPos.Row()); - rPos.miCellTextAttrPos = getDestAttrStore().set_empty(rPos.miCellTextAttrPos, aDestPos.Row(), aDestPos.Row()); + if ((mnCopyFlags & (IDF_DATETIME|IDF_VALUE)) == 0) + 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); + + 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, *it); + setDefaultAttrToDest(nRow); + } } - else + break; + case sc::element_type_string: { - rPos.miCellPos = getDestCellStore().set(rPos.miCellPos, aDestPos.Row(), rStr); - setDefaultAttrToDest(rPos, aDestPos.Row()); + if (!(mnCopyFlags & IDF_STRING)) + return; + + sc::string_block::const_iterator it = sc::string_block::begin(*aNode.data); + std::advance(it, nOffset); + sc::string_block::const_iterator itEnd = it; + std::advance(itEnd, nDataSize); + + for (; it != itEnd; ++it, ++nRow) + { + const OUString& rStr = *it; + if (rStr.isEmpty()) + { + // String cell with empty value is used to special-case cell value removal. + maDestPos.miCellPos = mrDestCol.GetCellStore().set_empty( + maDestPos.miCellPos, nRow, nRow); + maDestPos.miCellTextAttrPos = mrDestCol.GetCellAttrStore().set_empty( + maDestPos.miCellTextAttrPos, nRow, nRow); + } + else + { + maDestPos.miCellPos = + mrDestCol.GetCellStore().set(maDestPos.miCellPos, nRow, rStr); + setDefaultAttrToDest(nRow); + } + } } - } - } + break; + case sc::element_type_edittext: + { + if (!(mnCopyFlags & IDF_STRING)) + return; - 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) - { - if (!(mnCopyFlags & IDF_STRING)) - return; + sc::edittext_block::const_iterator it = sc::edittext_block::begin(*aNode.data); + std::advance(it, nOffset); + sc::edittext_block::const_iterator itEnd = it; + std::advance(itEnd, nDataSize); - sc::CellBlockCloneHandler::cloneEditTextBlock(rPos, rSrcPos, rDestPos, itBegin, itEnd); - } + std::vector<EditTextObject*> aCloned; + aCloned.reserve(nDataSize); + for (; it != itEnd; ++it) + aCloned.push_back(ScEditUtil::Clone(**it, mrDestCol.GetDoc())); - 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) - { - ScAddress aSrcPos = rSrcPos; - ScAddress aDestPos = rDestPos; - for (sc::formula_block::const_iterator it = itBegin; it != itEnd; ++it, aSrcPos.IncRow(), aDestPos.IncRow()) - cloneFormulaCell(rPos, aSrcPos, aDestPos, const_cast<ScFormulaCell&>(**it)); + maDestPos.miCellPos = mrDestCol.GetCellStore().set( + maDestPos.miCellPos, nRow, aCloned.begin(), aCloned.end()); + + setDefaultAttrsToDest(nRow, nDataSize); + } + break; + case sc::element_type_formula: + { + sc::formula_block::const_iterator it = sc::formula_block::begin(*aNode.data); + std::advance(it, nOffset); + sc::formula_block::const_iterator itEnd = it; + std::advance(itEnd, nDataSize); + + for (; it != itEnd; ++it, ++nRow) + cloneFormulaCell(nRow, const_cast<ScFormulaCell&>(**it)); + } + break; + default: + ; + } } }; @@ -1871,11 +1923,18 @@ void ScColumn::CopyToColumn( 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); + } else - pHdl.reset(new CopyByCloneHandler(*pDocument, *rColumn.pDocument, rColumn.maCells, rColumn.maCellTextAttrs, nFlags)); + { + 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(); + } - CopyCellsInRangeToColumn(NULL, rCxt.getBlockPosition(rColumn.nTab, rColumn.nCol), *pHdl, nRow1, nRow2, rColumn); } } _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
