sc/inc/clipcontext.hxx | 2 + sc/inc/column.hxx | 30 +++++++-------- sc/inc/mtvelements.hxx | 3 + sc/source/core/data/clipcontext.cxx | 10 ++++- sc/source/core/data/column.cxx | 48 ++++++++++++++++++++---- sc/source/core/data/column3.cxx | 70 ++++++++++++++++++++++++++++++++++++ sc/source/core/data/table2.cxx | 45 ++++++++++------------- 7 files changed, 159 insertions(+), 49 deletions(-)
New commits: commit 01b9b4e09fdd9b306d617cdb37d82f48df6d60fe Author: Laurent Godard <lgodard.li...@laposte.net> Date: Tue Sep 17 12:40:47 2013 +0200 notes & clipboard still not working at this stage, at least it builds Change-Id: Ic2deabe2e35ff9e09146a75396f1dda76929864b diff --git a/sc/inc/clipcontext.hxx b/sc/inc/clipcontext.hxx index 8a847bd..dd63ba6 100644 --- a/sc/inc/clipcontext.hxx +++ b/sc/inc/clipcontext.hxx @@ -46,6 +46,7 @@ class CopyFromClipContext : public ClipContextBase sal_uInt16 mnInsertFlag; bool mbAsLink:1; bool mbSkipAttrForEmptyCells:1; + bool mbCloneNotes; CopyFromClipContext(); // disabled @@ -66,6 +67,7 @@ public: sal_uInt16 getInsertFlag() const; bool isAsLink() const; bool isSkipAttrForEmptyCells() const; + bool isCloneNotes() const; }; class CopyToClipContext : public ClipContextBase diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx index 75270d6..6c01bb2 100644 --- a/sc/inc/column.hxx +++ b/sc/inc/column.hxx @@ -208,22 +208,20 @@ public: bool IsAllAttrEqual( const ScColumn& rCol, SCROW nStartRow, SCROW nEndRow ) const; bool TestInsertCol( SCROW nStartRow, SCROW nEndRow) const; - bool TestInsertRow( SCROW nStartRow, SCSIZE nSize ) const; - void InsertRow( SCROW nStartRow, SCSIZE nSize ); - void DeleteRow( SCROW nStartRow, SCSIZE nSize ); - void DeleteArea(SCROW nStartRow, SCROW nEndRow, sal_uInt16 nDelFlag ); - void CopyToClip( - sc::CopyToClipContext& rCxt, SCROW nRow1, SCROW nRow2, ScColumn& rColumn ) const; - void CopyStaticToDocument(SCROW nRow1, SCROW nRow2, ScColumn& rDestCol); - void CopyCellToDocument( SCROW nSrcRow, SCROW nDestRow, ScColumn& rDestCol ); - bool InitBlockPosition( sc::ColumnBlockPosition& rBlockPos ); - bool InitBlockPosition( sc::ColumnBlockConstPosition& rBlockPos ) const; - void CopyFromClip( - sc::CopyFromClipContext& rCxt, SCROW nRow1, SCROW nRow2, long nDy, ScColumn& rColumn ); - - void StartListeningInArea( sc::StartListeningContext& rCxt, SCROW nRow1, SCROW nRow2 ); - - void RemoveEditAttribs( SCROW nStartRow, SCROW nEndRow ); + bool TestInsertRow( SCROW nStartRow, SCSIZE nSize ) const; + void InsertRow( SCROW nStartRow, SCSIZE nSize ); + void DeleteRow( SCROW nStartRow, SCSIZE nSize ); + void DeleteArea(SCROW nStartRow, SCROW nEndRow, sal_uInt16 nDelFlag ); + void CopyToClip( sc::CopyToClipContext& rCxt, SCROW nRow1, SCROW nRow2, ScColumn& rColumn ) const; + void CopyStaticToDocument(SCROW nRow1, SCROW nRow2, ScColumn& rDestCol); + void CopyCellToDocument( SCROW nSrcRow, SCROW nDestRow, ScColumn& rDestCol ); + bool InitBlockPosition( sc::ColumnBlockPosition& rBlockPos ); + bool InitBlockPosition( sc::ColumnBlockConstPosition& rBlockPos ) const; + void CopyFromClip( sc::CopyFromClipContext& rCxt, SCROW nRow1, SCROW nRow2, long nDy, ScColumn& rColumn ); + + void StartListeningInArea( sc::StartListeningContext& rCxt, SCROW nRow1, SCROW nRow2 ); + + void RemoveEditAttribs( SCROW nStartRow, SCROW nEndRow ); // Selection (?) of this document void MixMarked( diff --git a/sc/inc/mtvelements.hxx b/sc/inc/mtvelements.hxx index f7dd3cb..818be1b 100644 --- a/sc/inc/mtvelements.hxx +++ b/sc/inc/mtvelements.hxx @@ -118,6 +118,7 @@ struct ColumnBlockPosition CellStoreType::iterator miCellPos; ColumnBlockPosition(): miCellPos() {} + }; struct ColumnBlockConstPosition @@ -128,6 +129,7 @@ struct ColumnBlockConstPosition CellStoreType::const_iterator miCellPos; ColumnBlockConstPosition(): miCellPos() {} + }; class ColumnBlockPositionSet @@ -142,6 +144,7 @@ public: ColumnBlockPositionSet(ScDocument& rDoc); ColumnBlockPosition* getBlockPosition(SCTAB nTab, SCCOL nCol); + }; } diff --git a/sc/source/core/data/clipcontext.cxx b/sc/source/core/data/clipcontext.cxx index 782c0f9..8013684 100644 --- a/sc/source/core/data/clipcontext.cxx +++ b/sc/source/core/data/clipcontext.cxx @@ -29,7 +29,10 @@ CopyFromClipContext::CopyFromClipContext(ScDocument& rDoc, ClipContextBase(rDoc), mnTabStart(-1), mnTabEnd(-1), mpRefUndoDoc(pRefUndoDoc), mpClipDoc(pClipDoc), mnInsertFlag(nInsertFlag), - mbAsLink(bAsLink), mbSkipAttrForEmptyCells(bSkipAttrForEmptyCells) {} + mbAsLink(bAsLink), mbSkipAttrForEmptyCells(bSkipAttrForEmptyCells), + mbCloneNotes (mnInsertFlag & (IDF_NOTE|IDF_ADDNOTES) ) +{ +} CopyFromClipContext::~CopyFromClipContext() { @@ -76,6 +79,11 @@ bool CopyFromClipContext::isSkipAttrForEmptyCells() const return mbSkipAttrForEmptyCells; } +bool CopyFromClipContext::isCloneNotes() const +{ + return mbCloneNotes; +} + CopyToClipContext::CopyToClipContext( ScDocument& rDoc, bool bKeepScenarioFlags, bool bCloneNotes) : ClipContextBase(rDoc), mbKeepScenarioFlags(bKeepScenarioFlags), mbCloneNotes(bCloneNotes) {} diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx index 3018747..1ade76b 100644 --- a/sc/source/core/data/column.cxx +++ b/sc/source/core/data/column.cxx @@ -1263,6 +1263,7 @@ class CopyToClipHandler ScColumn& mrDestCol; sc::ColumnBlockPosition maDestPos; sc::ColumnBlockPosition* mpDestPos; + bool mbCopyNotes; void setDefaultAttrsToDest(size_t nRow, size_t nSize) { @@ -1302,8 +1303,8 @@ class CopyToClipHandler } public: - CopyToClipHandler(const ScColumn& rSrcCol, ScColumn& rDestCol, sc::ColumnBlockPosition* pDestPos) : - mrSrcCol(rSrcCol), mrDestCol(rDestCol), mpDestPos(pDestPos) + CopyToClipHandler(const ScColumn& rSrcCol, ScColumn& rDestCol, sc::ColumnBlockPosition* pDestPos, bool bCopyNotes) : + mrSrcCol(rSrcCol), mrDestCol(rDestCol), mpDestPos(pDestPos), mbCopyNotes(bCopyNotes) { if (mpDestPos) maDestPos = *mpDestPos; @@ -1321,6 +1322,8 @@ public: { size_t nTopRow = aNode.position + nOffset; + bool isSupportedNodeType = false; + switch (aNode.type) { case sc::element_type_numeric: @@ -1330,7 +1333,9 @@ public: sc::numeric_block::const_iterator itEnd = it; std::advance(itEnd, nDataSize); maDestPos.miCellPos = mrDestCol.GetCellStore().set(maDestPos.miCellPos, nTopRow, it, itEnd); - setDefaultAttrsToDest(nTopRow, nDataSize); + + isSupportedNodeType = true; + } break; case sc::element_type_string: @@ -1340,7 +1345,9 @@ public: sc::string_block::const_iterator itEnd = it; std::advance(itEnd, nDataSize); maDestPos.miCellPos = mrDestCol.GetCellStore().set(maDestPos.miCellPos, nTopRow, it, itEnd); - setDefaultAttrsToDest(nTopRow, nDataSize); + + isSupportedNodeType = true; + } break; case sc::element_type_edittext: @@ -1358,7 +1365,8 @@ public: maDestPos.miCellPos = mrDestCol.GetCellStore().set( maDestPos.miCellPos, nTopRow, aCloned.begin(), aCloned.end()); - setDefaultAttrsToDest(nTopRow, nDataSize); + isSupportedNodeType = true; + } break; case sc::element_type_formula: @@ -1400,12 +1408,34 @@ public: sc::SharedFormulaUtil::joinFormulaCellAbove(aPos); } - setDefaultAttrsToDest(nTopRow, nDataSize); + isSupportedNodeType = true; + } break; default: ; } + + if (isSupportedNodeType) + { + setDefaultAttrsToDest(nTopRow, nDataSize); + + if (mbCopyNotes) + { + //maDestPos.miCellNotePos = mrDestCol.GetCellNoteStore().set(maDestPos.miCellNotePos, nTopRow, it, itEnd); + sc::CellNoteStoreType maSrcCellNotes = mrSrcCol.GetCellNoteStore(); + sc::CellNoteStoreType::position_type aPosNotes = maSrcCellNotes.position(nTopRow); + sc::CellNoteStoreType::iterator itNotes = aPosNotes.first; + if (itNotes->type == sc::element_type_cellnote) + { + ScPostIt* pSrcNote = maSrcCellNotes.get<ScPostIt*>(nTopRow); + if (pSrcNote) + pSrcNote->Clone( ScAddress(mrSrcCol.GetCol(), nTopRow, mrSrcCol.GetTab() ), + mrDestCol.GetDoc(), + ScAddress(mrDestCol.GetCol(), nTopRow, mrDestCol.GetTab()), true ); + } + } + } } }; @@ -1417,8 +1447,9 @@ void ScColumn::CopyToClip( pAttrArray->CopyArea( nRow1, nRow2, 0, *rColumn.pAttrArray, rCxt.isKeepScenarioFlags() ? (SC_MF_ALL & ~SC_MF_SCENARIO) : SC_MF_ALL ); - CopyToClipHandler aFunc(*this, rColumn, rCxt.getBlockPosition(rColumn.nTab, rColumn.nCol)); + CopyToClipHandler aFunc(*this, rColumn, rCxt.getBlockPosition(rColumn.nTab, rColumn.nCol), rCxt.isCloneNotes()); sc::ParseBlock(maCells.begin(), maCells, aFunc, nRow1, nRow2); + rColumn.CellStorageModified(); } @@ -2021,7 +2052,8 @@ void ScColumn::CopyUpdated( const ScColumn& rPosCol, ScColumn& rDestCol ) const sc::SingleColumnSpanSet::SpansType aRanges; aRangeSet.getSpans(aRanges); - CopyToClipHandler aFunc(*this, rDestCol, NULL); + bool bCopyNotes = true; + CopyToClipHandler aFunc(*this, rDestCol, NULL, bCopyNotes); sc::CellStoreType::const_iterator itPos = maCells.begin(); sc::SingleColumnSpanSet::SpansType::const_iterator it = aRanges.begin(), itEnd = aRanges.end(); for (; it != itEnd; ++it) diff --git a/sc/source/core/data/column3.cxx b/sc/source/core/data/column3.cxx index 78f2dc9..d7a6014 100644 --- a/sc/source/core/data/column3.cxx +++ b/sc/source/core/data/column3.cxx @@ -668,6 +668,8 @@ class CopyCellsFromClipHandler ScColumn& mrDestCol; SCTAB mnTab; SCCOL mnCol; + SCTAB mnSrcTab; + SCCOL mnSrcCol; long mnRowOffset; sc::ColumnBlockPosition maDestBlockPos; sc::ColumnBlockPosition* mpDestBlockPos; // to save it for next iteration. @@ -702,6 +704,8 @@ public: mrDestCol(rDestCol), mnTab(nDestTab), mnCol(nDestCol), + mnSrcTab(rSrcCol.GetTab()), + mnSrcCol(rSrcCol.GetCol()), mnRowOffset(nRowOffset), mpDestBlockPos(mrCxt.getBlockPosition(nDestTab, nDestCol)) { @@ -734,6 +738,8 @@ public: bool bAsLink = mrCxt.isAsLink(); + bool bCopyCellNotes = mrCxt.isCloneNotes(); + switch (node.type) { case sc::element_type_numeric: @@ -753,6 +759,22 @@ public: insertRefCell(nSrcRow, nSrcRow + mnRowOffset); else mrDestCol.SetValue(maDestBlockPos, nSrcRow + mnRowOffset, *it); + + if (bCopyCellNotes) + { + sc::CellNoteStoreType& maCellNotesSrc = mrSrcCol.GetCellNoteStore(); + sc::CellNoteStoreType::position_type aPos = maCellNotesSrc.position(nSrcRow); + sc::CellNoteStoreType::iterator itNotes = aPos.first; + if (itNotes->type == sc::element_type_cellnote) + { + ScPostIt* pSrcNote = maCellNotesSrc.get<ScPostIt*>(nSrcRow); + if (pSrcNote) + pSrcNote->Clone( ScAddress(mnSrcCol, nSrcRow, mnSrcTab ), + mrDestCol.GetDoc(), + ScAddress(mnCol , nSrcRow, mnTab), + true ); + } + } } } break; @@ -771,6 +793,22 @@ public: insertRefCell(nSrcRow, nSrcRow + mnRowOffset); else mrDestCol.SetRawString(maDestBlockPos, nSrcRow + mnRowOffset, *it); + + if (bCopyCellNotes) + { + sc::CellNoteStoreType& maCellNotesSrc = mrSrcCol.GetCellNoteStore(); + sc::CellNoteStoreType::position_type aPos = maCellNotesSrc.position(nSrcRow); + sc::CellNoteStoreType::iterator itNotes = aPos.first; + if (itNotes->type == sc::element_type_cellnote) + { + ScPostIt* pSrcNote = maCellNotesSrc.get<ScPostIt*>(nSrcRow); + if (pSrcNote) + pSrcNote->Clone( ScAddress(mnSrcCol, nSrcRow, mnSrcTab ), + mrDestCol.GetDoc(), + ScAddress(mnCol , nSrcRow, mnTab), + true ); + } + } } } break; @@ -790,6 +828,22 @@ public: insertRefCell(nSrcRow, nSrcRow + mnRowOffset); else mrDestCol.SetEditText(maDestBlockPos, nSrcRow + mnRowOffset, **it); + + if (bCopyCellNotes) + { + sc::CellNoteStoreType& maCellNotesSrc = mrSrcCol.GetCellNoteStore(); + sc::CellNoteStoreType::position_type aPos = maCellNotesSrc.position(nSrcRow); + sc::CellNoteStoreType::iterator itNotes = aPos.first; + if (itNotes->type == sc::element_type_cellnote) + { + ScPostIt* pSrcNote = maCellNotesSrc.get<ScPostIt*>(nSrcRow); + if (pSrcNote) + pSrcNote->Clone( ScAddress(mnSrcCol, nSrcRow, mnSrcTab ), + mrDestCol.GetDoc(), + ScAddress(mnCol , nSrcRow, mnTab), + true ); + } + } } } break; @@ -881,6 +935,22 @@ public: mrDestCol.SetRawString(maDestBlockPos, nSrcRow + mnRowOffset, aStr); } } + + if (bCopyCellNotes) + { + sc::CellNoteStoreType& maCellNotesSrc = mrSrcCol.GetCellNoteStore(); + sc::CellNoteStoreType::position_type aPos = maCellNotesSrc.position(nSrcRow); + sc::CellNoteStoreType::iterator itNotes = aPos.first; + if (itNotes->type == sc::element_type_cellnote) + { + ScPostIt* pSrcNote = maCellNotesSrc.get<ScPostIt*>(nSrcRow); + if (pSrcNote) + pSrcNote->Clone( ScAddress(mnSrcCol, nSrcRow, mnSrcTab ), + mrDestCol.GetDoc(), + ScAddress(mnCol , nSrcRow, mnTab), + true ); + } + } } } break; diff --git a/sc/source/core/data/table2.cxx b/sc/source/core/data/table2.cxx index e5b128c..1ac668b 100644 --- a/sc/source/core/data/table2.cxx +++ b/sc/source/core/data/table2.cxx @@ -446,11 +446,6 @@ void ScTable::DeleteArea(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, sal mpCondFormatList->DeleteArea( nCol1, nRow1, nCol2, nRow2 ); } -/* moved at column level - if (nDelFlag & IDF_NOTE) - maNotes.erase( nCol1, nRow1, nCol2, nRow2 ); -*/ - if (IsStreamValid()) // TODO: In the future we may want to check if the table has been // really modified before setting the stream invalid. @@ -472,12 +467,6 @@ void ScTable::DeleteSelection( sal_uInt16 nDelFlag, const ScMarkData& rMark ) for (size_t i = 0; i < aRangeList.size(); ++i) { ScRange* pRange = aRangeList[i]; - /* moved at column level - if (nDelFlag & IDF_NOTE && pRange) - { - maNotes.erase(pRange->aStart.Col(), pRange->aStart.Row(), pRange->aEnd.Col(), pRange->aEnd.Row(), nDelFlag & IDF_NOCAPTIONS); - } - */ if((nDelFlag & IDF_ATTRIB) && pRange && pRange->aStart.Tab() == nTab) mpCondFormatList->DeleteArea( pRange->aStart.Col(), pRange->aStart.Row(), pRange->aEnd.Col(), pRange->aEnd.Row() ); @@ -958,9 +947,29 @@ void ScTable::TransposeClip( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, } } } + + // Cell Notes - fdo#68381 paste cell notes on Transpose + bool bCloneCaption = true; + if ( pDestDoc->HasColNotes(nCol, nTab) ) + { + sc::CellNoteStoreType& maCellNotes = pDestDoc->GetColNotes(nCol, nTab); + for (nRow=nRow1; nRow <= nRow2; nRow++) // TODO : notes suboptimal ? + { + sc::CellNoteStoreType::position_type aPos = maCellNotes.position(nRow); + sc::CellNoteStoreType::iterator it = aPos.first; + ScPostIt* pNote = maCellNotes.get<ScPostIt*>(nRow); + + ScAddress aDestPos( static_cast<SCCOL>(nRow-nRow1), static_cast<SCROW>(nCol-nCol1), pTransClip->nTab ); + ScPostIt* pClonedNote = pNote->Clone( ScAddress(nCol, nRow, nTab), *pTransClip->pDocument, aDestPos, bCloneCaption ); + + pTransClip->pDocument->ReleaseNote(aDestPos); + pTransClip->pDocument->SetNote(aDestPos, pClonedNote); + } + } } -/* TODO : notes clipboard +/* +// TODO : notes clipboard // fdo#68381 paste cell notes on Transpose bool bCloneCaption = true; for (ScNotes::const_iterator itr = maNotes.begin(); itr != maNotes.end(); ++itr) @@ -1204,18 +1213,6 @@ void ScTable::CopyUpdated( const ScTable* pPosTab, ScTable* pDestTab ) const { for (SCCOL i=0; i<=MAXCOL; i++) aCol[i].CopyUpdated( pPosTab->aCol[i], pDestTab->aCol[i] ); - -/* TODO : notes clipboard - // insert notes with captions - for(ScNotes::iterator itr = pDestTab->maNotes.begin(); itr != pDestTab->maNotes.end(); ++itr) - { - SCCOL nCol = itr->first.first; - SCROW nRow = itr->first.second; - ScPostIt* pPostIt = itr->second; - - pDestTab->maNotes.insert(nCol, nRow, pPostIt->Clone( ScAddress(nCol, nRow, nTab),*pDestTab->pDocument, ScAddress(nCol, nRow, pDestTab->nTab), true )); - } -*/ } void ScTable::InvalidateTableArea() _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits