sc/inc/table.hxx | 3 + sc/source/core/data/table2.cxx | 92 ++++++++++++++++++++++++++++++++++++----- 2 files changed, 85 insertions(+), 10 deletions(-)
New commits: commit 01cf555fce17302df186ce90584297bcfa074952 Author: Laurent Godard <[email protected]> Date: Fri Oct 4 15:16:39 2013 +0200 refactor transpose clipboard for notes Change-Id: I174ac8b6e1a741513be4736cbca8d3d032f5a77f diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx index e35a656..43d18e7 100644 --- a/sc/inc/table.hxx +++ b/sc/inc/table.hxx @@ -1010,6 +1010,9 @@ private: SCCOL FindNextVisibleCol(SCCOL nCol, bool bRight) const; + // Clipboard transpose for notes + void TransposeColNotes(ScTable* pTransClip, SCCOL nCol1, SCCOL nCol, SCROW nRow1, SCROW nRow2); + /** * Use this to iterate through non-empty visible cells in a single column. */ diff --git a/sc/source/core/data/table2.cxx b/sc/source/core/data/table2.cxx index d34dac6..1ed6ae1 100644 --- a/sc/source/core/data/table2.cxx +++ b/sc/source/core/data/table2.cxx @@ -929,27 +929,99 @@ void ScTable::TransposeClip( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, } // Cell Notes - fdo#68381 paste cell notes on Transpose - bool bCloneCaption = true; if ( pDocument->HasColNotes(nCol, nTab) ) + TransposeColNotes(pTransClip, nCol1, nCol, nRow1, nRow2); + } +} + +void ScTable::TransposeColNotes(ScTable* pTransClip, SCCOL nCol1, SCCOL nCol, SCROW nRow1, SCROW nRow2) +{ + bool bCloneCaption = true; + + sc::CellNoteStoreType::const_iterator itBlk = aCol[nCol].maCellNotes.begin(), itBlkEnd = aCol[nCol].maCellNotes.end(); + + // Locate the top row position. + size_t nOffsetInBlock = 0; + size_t nBlockStart = 0, nBlockEnd = 0, nRowPos = static_cast<size_t>(nRow1); + for (; itBlk != itBlkEnd; ++itBlk, nBlockStart = nBlockEnd) + { + nBlockEnd = nBlockStart + itBlk->size; + if (nBlockStart <= nRowPos && nRowPos < nBlockEnd) { - sc::CellNoteStoreType& maCellNotes = pDocument->GetColNotes(nCol, nTab); - for (nRow=nRow1; nRow <= nRow2; nRow++) // TODO : notes suboptimal ? + // Found. + nOffsetInBlock = nRowPos - nBlockStart; + break; + } + } + + if (itBlk != itBlkEnd) + // Specified range found + { + nRowPos = static_cast<size_t>(nRow2); // End row position. + + // Keep processing until we hit the end row position. + sc::cellnote_block::const_iterator itData, itDataEnd; + for (; itBlk != itBlkEnd; ++itBlk, nBlockStart = nBlockEnd, nOffsetInBlock = 0) + { + nBlockEnd = nBlockStart + itBlk->size; + + if (itBlk->data) { - ScAddress aDestPos( static_cast<SCCOL>(nRow-nRow1), static_cast<SCROW>(nCol-nCol1), pTransClip->nTab ); - pTransClip->pDocument->ReleaseNote(aDestPos); + itData = sc::cellnote_block::begin(*itBlk->data); + std::advance(itData, nOffsetInBlock); - ScPostIt* pNote = maCellNotes.get<ScPostIt*>(nRow); - if (pNote) + if (nBlockStart <= nRowPos && nRowPos < nBlockEnd) + { + // This block contains the end row. Only process partially. + size_t nOffsetEnd = nRowPos - nBlockStart + 1; + itDataEnd = sc::cellnote_block::begin(*itBlk->data); + std::advance(itDataEnd, nOffsetEnd); + size_t curRow = nBlockStart + nOffsetInBlock; + for (; itData != itDataEnd; ++itData, ++curRow) + { + ScAddress aDestPos( static_cast<SCCOL>(curRow-nRow1), static_cast<SCROW>(nCol-nCol1), pTransClip->nTab ); + pTransClip->pDocument->ReleaseNote(aDestPos); + ScPostIt* pNote = *itData; + if (pNote) + { + ScPostIt* pClonedNote = pNote->Clone( ScAddress(nCol, curRow, nTab), *pTransClip->pDocument, aDestPos, bCloneCaption ); + pTransClip->pDocument->SetNote(aDestPos, pClonedNote); + } + } + break; // we reached the last valid block + } + else { - ScPostIt* pClonedNote = pNote->Clone( ScAddress(nCol, nRow, nTab), *pDestDoc, aDestPos, bCloneCaption ); - pTransClip->pDocument->SetNote(aDestPos, pClonedNote); + itDataEnd = sc::cellnote_block::end(*itBlk->data); + size_t curRow = nBlockStart + nOffsetInBlock; + for (; itData != itDataEnd; ++itData, ++curRow) + { + ScAddress aDestPos( static_cast<SCCOL>(curRow-nRow1), static_cast<SCROW>(nCol-nCol1), pTransClip->nTab ); + pTransClip->pDocument->ReleaseNote(aDestPos); + ScPostIt* pNote = *itData; + if (pNote) + { + ScPostIt* pClonedNote = pNote->Clone( ScAddress(nCol, curRow, nTab), *pTransClip->pDocument, aDestPos, bCloneCaption ); + pTransClip->pDocument->SetNote(aDestPos, pClonedNote); + } + } + } + } + else + { + size_t curRow; + for ( curRow = nBlockStart + nOffsetInBlock; curRow <= nBlockEnd && curRow <= nRowPos; ++curRow) + { + ScAddress aDestPos( static_cast<SCCOL>(curRow-nRow1), static_cast<SCROW>(nCol-nCol1), pTransClip->nTab ); + pTransClip->pDocument->ReleaseNote(aDestPos); } + if (curRow == nRowPos) + break; } } } } - void ScTable::StartAllListeners() { for (SCCOL i=0; i<=MAXCOL; i++) _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
