sc/inc/column.hxx | 4 ++- sc/source/core/data/column.cxx | 45 ++++++++++++++++------------------------ sc/source/core/data/column2.cxx | 11 +++++++++ sc/source/core/data/table3.cxx | 33 ++++++++++++++++++++++++----- 4 files changed, 59 insertions(+), 34 deletions(-)
New commits: commit ec57e7ef4c91aaf467ecd7a4096323242fd4d78e Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Mon Apr 21 16:34:00 2014 -0400 Move cell notes too when sorting. Change-Id: Ibb330aa6f515d756c5578296fd9c83aa235a59fd diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx index 62bb4c6..94795d3 100644 --- a/sc/inc/column.hxx +++ b/sc/inc/column.hxx @@ -526,6 +526,7 @@ public: // cell notes ScPostIt* GetCellNote( SCROW nRow ); const ScPostIt* GetCellNote( SCROW nRow ) const; + const ScPostIt* GetCellNote( sc::ColumnBlockConstPosition& rBlockPos, SCROW nRow ) const; void DeleteCellNotes( sc::ColumnBlockPosition& rBlockPos, SCROW nRow1, SCROW nRow2 ); bool HasCellNotes() const; void SetCellNote( SCROW nRow, ScPostIt* pNote); @@ -548,7 +549,8 @@ public: void DuplicateNotes(SCROW nStartRow, size_t nDataSize, ScColumn& rDestCol, sc::ColumnBlockPosition& maDestBlockPos, bool bCloneCaption = true, SCROW nRowOffsetDest=0 ) const; - void UpdateNoteCaptions(); + + void UpdateNoteCaptions( SCROW nRow1, SCROW nRow2 ); void InterpretDirtyCells( SCROW nRow1, SCROW nRow2 ); diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx index 192aa5b..de9f65e 100644 --- a/sc/source/core/data/column.cxx +++ b/sc/source/core/data/column.cxx @@ -2234,34 +2234,25 @@ void resetColumnPosition(sc::CellStoreType& rCells, SCCOL nCol) } } -} - -void ScColumn::UpdateNoteCaptions() +class NoteCaptionUpdater { - sc::CellNoteStoreType::const_iterator itBlk = maCellNotes.begin(), itBlkEnd = maCellNotes.end(); - sc::cellnote_block::const_iterator itData, itDataEnd; + SCCOL mnCol; + SCTAB mnTab; +public: + NoteCaptionUpdater( SCCOL nCol, SCTAB nTab ) : mnCol(nCol), mnTab(nTab) {} - SCROW curRow = 0; - for (;itBlk!=itBlkEnd;++itBlk) + void operator() ( size_t nRow, ScPostIt* p ) { - if (itBlk->data) - { - // non empty block - itData = sc::cellnote_block::begin(*itBlk->data); - itDataEnd = sc::cellnote_block::end(*itBlk->data); - for(;itData!=itDataEnd; ++itData) - { - ScPostIt* pNote = *itData; - pNote->UpdateCaptionPos(ScAddress(nCol, curRow, nTab)); - curRow +=1; - } - } - else - { - // empty block - curRow += itBlk->size; - } + p->UpdateCaptionPos(ScAddress(mnCol,nRow,mnTab)); } +}; + +} + +void ScColumn::UpdateNoteCaptions( SCROW nRow1, SCROW nRow2 ) +{ + NoteCaptionUpdater aFunc(nCol, nTab); + sc::ProcessNote(maCellNotes.begin(), maCellNotes, nRow1, nRow2, aFunc); } void ScColumn::SwapCol(ScColumn& rCol) @@ -2272,8 +2263,8 @@ void ScColumn::SwapCol(ScColumn& rCol) maCellNotes.swap(rCol.maCellNotes); // notes update caption - UpdateNoteCaptions(); - rCol.UpdateNoteCaptions(); + UpdateNoteCaptions(0, MAXROW); + rCol.UpdateNoteCaptions(0, MAXROW); ScAttrArray* pTempAttr = rCol.pAttrArray; rCol.pAttrArray = pAttrArray; @@ -2322,7 +2313,7 @@ void ScColumn::MoveTo(SCROW nStartRow, SCROW nEndRow, ScColumn& rCol) // move the notes to the destination column maCellNotes.transfer(nStartRow, nEndRow, rCol.maCellNotes, nStartRow); - UpdateNoteCaptions(); + UpdateNoteCaptions(0, MAXROW); // Re-group transferred formula cells. aPos = rCol.maCells.position(nStartRow); diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx index ecdb50d..1238c78 100644 --- a/sc/source/core/data/column2.cxx +++ b/sc/source/core/data/column2.cxx @@ -1848,6 +1848,17 @@ const ScPostIt* ScColumn::GetCellNote(SCROW nRow) const return maCellNotes.get<ScPostIt*>(nRow); } +const ScPostIt* ScColumn::GetCellNote( sc::ColumnBlockConstPosition& rBlockPos, SCROW nRow ) const +{ + sc::CellNoteStoreType::const_position_type aPos = maCellNotes.position(rBlockPos.miCellNotePos, nRow); + rBlockPos.miCellNotePos = aPos.first; + + if (aPos.first->type != sc::element_type_cellnote) + return NULL; + + return sc::cellnote_block::at(*aPos.first->data, aPos.second); +} + void ScColumn::SetCellNote(SCROW nRow, ScPostIt* pNote) { //pNote->UpdateCaptionPos(ScAddress(nCol, nRow, nTab)); // TODO notes usefull ? slow import with many notes diff --git a/sc/source/core/data/table3.cxx b/sc/source/core/data/table3.cxx index dfca524..9caae2b 100644 --- a/sc/source/core/data/table3.cxx +++ b/sc/source/core/data/table3.cxx @@ -228,8 +228,9 @@ public: ScRefCellValue maCell; const sc::CellTextAttr* mpAttr; const SvtBroadcaster* mpBroadcaster; + const ScPostIt* mpNote; - Cell() : mpAttr(NULL), mpBroadcaster(NULL) {} + Cell() : mpAttr(NULL), mpBroadcaster(NULL), mpNote(NULL) {} }; typedef std::vector<Cell> RowType; @@ -356,6 +357,7 @@ ScSortInfoArray* ScTable::CreateSortInfoArray( SCCOLROW nInd1, SCCOLROW nInd2 ) rCell.maCell = rCol.GetCellValue(aBlockPos, nRow); rCell.mpAttr = rCol.GetCellTextAttr(aBlockPos, nRow); rCell.mpBroadcaster = rCol.GetBroadcaster(aBlockPos, nRow); + rCell.mpNote = rCol.GetCellNote(aBlockPos, nRow); } } } @@ -383,11 +385,13 @@ struct SortedColumn : boost::noncopyable sc::CellStoreType maCells; sc::CellTextAttrStoreType maCellTextAttrs; sc::BroadcasterStoreType maBroadcasters; + sc::CellNoteStoreType maCellNotes; SortedColumn( size_t nTopEmptyRows ) : maCells(nTopEmptyRows), maCellTextAttrs(nTopEmptyRows), - maBroadcasters(nTopEmptyRows) {} + maBroadcasters(nTopEmptyRows), + maCellNotes(nTopEmptyRows) {} }; } @@ -512,6 +516,13 @@ void ScTable::SortReorder( ScSortInfoArray* pArray, ScProgress* pProgress ) rBCStore.push_back(const_cast<SvtBroadcaster*>(rCell.mpBroadcaster)); else rBCStore.push_back_empty(); + + // The same with cell note instances ... + sc::CellNoteStoreType& rNoteStore = aSortedCols.at(j).maCellNotes; + if (rCell.mpNote) + rNoteStore.push_back(const_cast<ScPostIt*>(rCell.mpNote)); + else + rNoteStore.push_back_empty(); } if (pProgress) @@ -535,14 +546,24 @@ void ScTable::SortReorder( ScSortInfoArray* pArray, ScProgress* pProgress ) } { - sc::BroadcasterStoreType& rBCDest = aCol[nThisCol].maBroadcasters; + sc::BroadcasterStoreType& rSrc = aSortedCols[i].maBroadcasters; + sc::BroadcasterStoreType& rDest = aCol[nThisCol].maBroadcasters; // Release current broadcasters first, to prevent them from getting deleted. - rBCDest.release_range(nRow1, aSortParam.nRow2); + rDest.release_range(nRow1, aSortParam.nRow2); // Transfer sorted broadcaster segment to the document. - sc::BroadcasterStoreType& rBCSrc = aSortedCols[i].maBroadcasters; - rBCSrc.transfer(nRow1, aSortParam.nRow2, rBCDest, nRow1); + rSrc.transfer(nRow1, aSortParam.nRow2, rDest, nRow1); + } + + { + sc::CellNoteStoreType& rSrc = aSortedCols[i].maCellNotes; + sc::CellNoteStoreType& rDest = aCol[nThisCol].maCellNotes; + + // Do the same as broadcaster storage transfer (to prevent double deletion). + rDest.release_range(nRow1, aSortParam.nRow2); + rSrc.transfer(nRow1, aSortParam.nRow2, rDest, nRow1); + aCol[nThisCol].UpdateNoteCaptions(nRow1, aSortParam.nRow2); } aCol[nThisCol].CellStorageModified(); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits