sc/source/core/data/column.cxx | 136 +++++++++++++++++++++++++++++++---------- 1 file changed, 104 insertions(+), 32 deletions(-)
New commits: commit dd55f14816f7488d9ba51f85de2f0fe70d485737 Author: Laurent Godard <lgodard.li...@laposte.net> Date: Mon Sep 30 14:19:03 2013 +0200 refactor clipboard handlers loops for notes Change-Id: Id0198b4e957474afe78060bbaf79c8644d099572 diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx index 4bc37b4..d8ce48a 100644 --- a/sc/source/core/data/column.cxx +++ b/sc/source/core/data/column.cxx @@ -1264,10 +1264,6 @@ class CopyToClipHandler sc::ColumnBlockPosition maDestPos; sc::ColumnBlockPosition* mpDestPos; bool mbCopyNotes; - SCCOL nDestCol; - SCTAB nDestTab; - SCCOL nSrcCol; - SCTAB nSrcTab; void setDefaultAttrsToDest(size_t nRow, size_t nSize) { @@ -1308,6 +1304,50 @@ class CopyToClipHandler void duplicateNotes(SCROW nStartRow, size_t nDataSize ) { + SCCOL nDestCol = mrDestCol.GetCol(); + SCTAB nDestTab = mrDestCol.GetTab(); + SCCOL nSrcCol = mrSrcCol.GetCol(); + SCTAB nSrcTab = mrSrcCol.GetTab(); + + SCROW nRowMax = nStartRow + nDataSize; + + std::vector<ScPostIt*> vDestNotes; + vDestNotes.reserve(nDataSize); + + sc::CellNoteStoreType maSrcCellNotes = mrSrcCol.GetCellNoteStore(); + sc::CellNoteStoreType::iterator posSrc = maSrcCellNotes.begin(); + + for (SCROW nRow = nStartRow; nRow < nRowMax; ++nRow) + { + sc::CellNoteStoreType::position_type curPosObj = maSrcCellNotes.position(posSrc, nRow); + posSrc = curPosObj.first; + size_t offset = curPosObj.second; + if (posSrc->type == sc::element_type_cellnote) + { + ScAddress aDestAddress = ScAddress(nDestCol, nRow, nDestTab); + ScAddress aSrcAddress = ScAddress(nSrcCol, nRow, nSrcTab ); + + ScPostIt* pSrcNote = sc::cellnote_block::at(*posSrc->data, offset); + ScPostIt* pClonedNote = pSrcNote->Clone(aSrcAddress, mrDestCol.GetDoc(), aDestAddress, true ); + + vDestNotes.push_back(pClonedNote); + } + } + // set the cloned notes vector in its dest position + sc::CellNoteStoreType maDestCellNotes = mrDestCol.GetCellNoteStore(); + maDestCellNotes.set_empty(nStartRow, nRowMax - 1); + maDestPos.miCellNotePos = mrDestCol.GetCellNoteStore().set( + maDestPos.miCellNotePos, nStartRow, vDestNotes.begin(), vDestNotes.end()); + } + +/* ok + void duplicateNotes(SCROW nStartRow, size_t nDataSize ) + { + SCCOL nDestCol = mrDestCol.GetCol(); + SCTAB nDestTab = mrDestCol.GetTab(); + SCCOL nSrcCol = mrSrcCol.GetCol(); + SCTAB nSrcTab = mrSrcCol.GetTab(); + SCROW nRowMax = nStartRow + nDataSize; std::vector<ScPostIt*> vDestNotes(nDataSize); @@ -1333,10 +1373,11 @@ class CopyToClipHandler } // set the cloned notes vector in its dest position sc::CellNoteStoreType maDestCellNotes = mrDestCol.GetCellNoteStore(); - maDestCellNotes.set_empty(nStartRow, nRowMax); + maDestCellNotes.set_empty(nStartRow, nRowMax - 1); maDestPos.miCellNotePos = mrDestCol.GetCellNoteStore().set( maDestPos.miCellNotePos, nStartRow, vDestNotes.begin(), vDestNotes.end()); } +*/ public: CopyToClipHandler(const ScColumn& rSrcCol, ScColumn& rDestCol, sc::ColumnBlockPosition* pDestPos, bool bCopyNotes) : @@ -1346,11 +1387,6 @@ public: maDestPos = *mpDestPos; else mrDestCol.InitBlockPosition(maDestPos); - - nDestCol = mrDestCol.GetCol(); - nDestTab = mrDestCol.GetTab(); - nSrcCol = mrSrcCol.GetCol(); - nSrcTab = mrSrcCol.GetTab(); } ~CopyToClipHandler() @@ -1689,25 +1725,42 @@ class CopyAsLinkHandler setDefaultAttrsToDest(nTopRow, nDataSize); } - void duplicateNotes(SCROW nStartRow, size_t nDataSize ) // TODO : notes suboptimal + void duplicateNotes(SCROW nStartRow, size_t nDataSize ) { - // the link status is only for cell content as it is not possible to un-link a note --> the note is copied - sc::CellNoteStoreType maSrcCellNotes = mrSrcCol.GetCellNoteStore(); + SCCOL nDestCol = mrDestCol.GetCol(); + SCTAB nDestTab = mrDestCol.GetTab(); + SCCOL nSrcCol = mrSrcCol.GetCol(); + SCTAB nSrcTab = mrSrcCol.GetTab(); + SCROW nRowMax = nStartRow + nDataSize; + std::vector<ScPostIt*> vDestNotes; + vDestNotes.reserve(nDataSize); + + sc::CellNoteStoreType maSrcCellNotes = mrSrcCol.GetCellNoteStore(); + sc::CellNoteStoreType::iterator posSrc = maSrcCellNotes.begin(); + for (SCROW nRow = nStartRow; nRow < nRowMax; ++nRow) { - ScPostIt* pSrcNote = maSrcCellNotes.get<ScPostIt*>(nRow); - if (pSrcNote) + sc::CellNoteStoreType::position_type curPosObj = maSrcCellNotes.position(posSrc, nRow); + posSrc = curPosObj.first; + size_t offset = curPosObj.second; + if (posSrc->type == sc::element_type_cellnote) { - ScAddress aDestPos = ScAddress(mrDestCol.GetCol(), nRow, mrDestCol.GetTab()); - ScPostIt* pClonedNote = pSrcNote->Clone( ScAddress(mrSrcCol.GetCol(), nRow, mrSrcCol.GetTab() ), - mrDestCol.GetDoc(), - aDestPos, true ); - mrDestCol.GetDoc().ReleaseNote(aDestPos); - mrDestCol.GetDoc().SetNote(aDestPos, pClonedNote); + ScAddress aDestAddress = ScAddress(nDestCol, nRow, nDestTab); + ScAddress aSrcAddress = ScAddress(nSrcCol, nRow, nSrcTab ); + + ScPostIt* pSrcNote = sc::cellnote_block::at(*posSrc->data, offset); + ScPostIt* pClonedNote = pSrcNote->Clone(aSrcAddress, mrDestCol.GetDoc(), aDestAddress, true ); + + vDestNotes.push_back(pClonedNote); } } + // set the cloned notes vector in its dest position + sc::CellNoteStoreType maDestCellNotes = mrDestCol.GetCellNoteStore(); + maDestCellNotes.set_empty(nStartRow, nRowMax-1); + maDestPos.miCellNotePos = maDestCellNotes.set( + maDestPos.miCellNotePos, nStartRow, vDestNotes.begin(), vDestNotes.end()); } public: @@ -1890,25 +1943,44 @@ class CopyByCloneHandler } } - void duplicateNotes(SCROW nStartRow, size_t nDataSize ) // TODO : notes suboptimal + void duplicateNotes(SCROW nStartRow, size_t nDataSize ) { - sc::CellNoteStoreType maSrcCellNotes = mrSrcCol.GetCellNoteStore(); + SCCOL nDestCol = mrDestCol.GetCol(); + SCTAB nDestTab = mrDestCol.GetTab(); + SCCOL nSrcCol = mrSrcCol.GetCol(); + SCTAB nSrcTab = mrSrcCol.GetTab(); + SCROW nRowMax = nStartRow + nDataSize; + std::vector<ScPostIt*> vDestNotes; + vDestNotes.reserve(nDataSize); + + sc::CellNoteStoreType maSrcCellNotes = mrSrcCol.GetCellNoteStore(); + sc::CellNoteStoreType::iterator posSrc = maSrcCellNotes.begin(); + for (SCROW nRow = nStartRow; nRow < nRowMax; ++nRow) { - ScPostIt* pSrcNote = maSrcCellNotes.get<ScPostIt*>(nRow); - if (pSrcNote) + sc::CellNoteStoreType::position_type curPosObj = maSrcCellNotes.position(posSrc, nRow); + posSrc = curPosObj.first; + size_t offset = curPosObj.second; + if (posSrc->type == sc::element_type_cellnote) { - ScAddress aDestPos = ScAddress(mrDestCol.GetCol(), nRow, mrDestCol.GetTab()); - ScPostIt* pClonedNote = pSrcNote->Clone( ScAddress(mrSrcCol.GetCol(), nRow, mrSrcCol.GetTab() ), - mrDestCol.GetDoc(), - aDestPos, true ); - mrDestCol.GetDoc().ReleaseNote(aDestPos); - mrDestCol.GetDoc().SetNote(aDestPos, pClonedNote); - pClonedNote->UpdateCaptionPos(aDestPos); + ScAddress aDestAddress = ScAddress(nDestCol, nRow, nDestTab); + ScAddress aSrcAddress = ScAddress(nSrcCol, nRow, nSrcTab ); + + ScPostIt* pSrcNote = sc::cellnote_block::at(*posSrc->data, offset); + if (pSrcNote) // needed ? + { + ScPostIt* pClonedNote = pSrcNote->Clone(aSrcAddress, mrDestCol.GetDoc(), aDestAddress, true ); + vDestNotes.push_back(pClonedNote); + } } } + // set the cloned notes vector in its dest position + sc::CellNoteStoreType maDestCellNotes = mrDestCol.GetCellNoteStore(); + maDestCellNotes.set_empty(nStartRow, nRowMax-1); + maDestPos.miCellNotePos = mrDestCol.GetCellNoteStore().set( + maDestPos.miCellNotePos, nStartRow, vDestNotes.begin(), vDestNotes.end()); } public: _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits