diff options
Diffstat (limited to 'sc/source/core/data')
-rw-r--r-- | sc/source/core/data/clipcontext.cxx | 8 | ||||
-rw-r--r-- | sc/source/core/data/column2.cxx | 7 | ||||
-rw-r--r-- | sc/source/core/data/column3.cxx | 25 | ||||
-rw-r--r-- | sc/source/core/data/column4.cxx | 56 | ||||
-rw-r--r-- | sc/source/core/data/document.cxx | 22 |
5 files changed, 84 insertions, 34 deletions
diff --git a/sc/source/core/data/clipcontext.cxx b/sc/source/core/data/clipcontext.cxx index 0d336940fece..02e2bcc86652 100644 --- a/sc/source/core/data/clipcontext.cxx +++ b/sc/source/core/data/clipcontext.cxx @@ -36,7 +36,7 @@ ColumnBlockPosition* ClipContextBase::getBlockPosition(SCTAB nTab, SCCOL nCol) CopyFromClipContext::CopyFromClipContext(ScDocument& rDoc, ScDocument* pRefUndoDoc, ScDocument* pClipDoc, InsertDeleteFlags nInsertFlag, - bool bAsLink, bool bSkipAttrForEmptyCells) : + bool bAsLink, bool bSkipEmptyCells) : ClipContextBase(rDoc), mnDestCol1(-1), mnDestCol2(-1), mnDestRow1(-1), mnDestRow2(-1), @@ -45,7 +45,7 @@ CopyFromClipContext::CopyFromClipContext(ScDocument& rDoc, mpRefUndoDoc(pRefUndoDoc), mpClipDoc(pClipDoc), mnInsertFlag(nInsertFlag), mnDeleteFlag(InsertDeleteFlags::NONE), mpCondFormatList(nullptr), - mbAsLink(bAsLink), mbSkipAttrForEmptyCells(bSkipAttrForEmptyCells), + mbAsLink(bAsLink), mbSkipEmptyCells(bSkipEmptyCells), mbCloneNotes (mnInsertFlag & (InsertDeleteFlags::NOTE|InsertDeleteFlags::ADDNOTES)), mbTableProtected(false) { @@ -325,9 +325,9 @@ bool CopyFromClipContext::isAsLink() const return mbAsLink; } -bool CopyFromClipContext::isSkipAttrForEmptyCells() const +bool CopyFromClipContext::isSkipEmptyCells() const { - return mbSkipAttrForEmptyCells; + return mbSkipEmptyCells; } bool CopyFromClipContext::isCloneNotes() const diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx index 037e34658c5d..92f57bc765a5 100644 --- a/sc/source/core/data/column2.cxx +++ b/sc/source/core/data/column2.cxx @@ -1229,10 +1229,13 @@ public: } -void ScColumn::RemoveEditAttribs( SCROW nStartRow, SCROW nEndRow ) +void ScColumn::RemoveEditAttribs( sc::ColumnBlockPosition& rBlockPos, SCROW nStartRow, SCROW nEndRow ) { RemoveEditAttribsHandler aFunc(maCells, &GetDoc()); - sc::ProcessEditText(maCells.begin(), maCells, nStartRow, nEndRow, aFunc); + + rBlockPos.miCellPos = sc::ProcessEditText( + rBlockPos.miCellPos, maCells, nStartRow, nEndRow, aFunc); + aFunc.commitStrings(); } diff --git a/sc/source/core/data/column3.cxx b/sc/source/core/data/column3.cxx index dfdd4e59e1bc..74b2e1ac7fad 100644 --- a/sc/source/core/data/column3.cxx +++ b/sc/source/core/data/column3.cxx @@ -1023,7 +1023,7 @@ void ScColumn::DeleteArea( if ( nDelFlag & InsertDeleteFlags::EDITATTR ) { OSL_ENSURE( nContFlag == InsertDeleteFlags::NONE, "DeleteArea: Wrong Flags" ); - RemoveEditAttribs( nStartRow, nEndRow ); + RemoveEditAttribs(aBlockPos, nStartRow, nEndRow); } // Delete attributes just now @@ -1123,7 +1123,16 @@ public: mpSharedStringPool(pSharedStringPool) { if (mpDestBlockPos) + { + { + // Re-initialize the broadcaster position hint, which may have + // become invalid by the time it gets here... + sc::ColumnBlockPosition aTempPos; + mrDestCol.InitBlockPosition(aTempPos); + mpDestBlockPos->miBroadcasterPos = aTempPos.miBroadcasterPos; + } maDestBlockPos = *mpDestBlockPos; + } else mrDestCol.InitBlockPosition(maDestBlockPos); } @@ -1144,7 +1153,7 @@ public: if (node.type == sc::element_type_empty) { - if (bCopyCellNotes && !mrCxt.isSkipAttrForEmptyCells()) + if (bCopyCellNotes && !mrCxt.isSkipEmptyCells()) { bool bCloneCaption = (nFlags & InsertDeleteFlags::NOCAPTIONS) == InsertDeleteFlags::NONE; duplicateNotes(nSrcRow1, nDataSize, bCloneCaption ); @@ -1357,7 +1366,7 @@ public: mpDestBlockPos(rCxt.getBlockPosition(nDestTab, nDestCol)) { if (mpDestBlockPos) - maDestBlockPos = *mpDestBlockPos; + maDestBlockPos.miCellTextAttrPos = mpDestBlockPos->miCellTextAttrPos; else rDestCol.InitBlockPosition(maDestBlockPos); } @@ -1366,7 +1375,7 @@ public: { if (mpDestBlockPos) // Don't forget to save this to the context! - *mpDestBlockPos = maDestBlockPos; + mpDestBlockPos->miCellTextAttrPos = maDestBlockPos.miCellTextAttrPos; } void operator() ( const sc::CellTextAttrStoreType::value_type& aNode, size_t nOffset, size_t nDataSize ) @@ -1392,9 +1401,13 @@ public: void ScColumn::CopyFromClip( sc::CopyFromClipContext& rCxt, SCROW nRow1, SCROW nRow2, tools::Long nDy, ScColumn& rColumn ) { + sc::ColumnBlockPosition* pBlockPos = rCxt.getBlockPosition(nTab, nCol); + if (!pBlockPos) + return; + if ((rCxt.getInsertFlag() & InsertDeleteFlags::ATTRIB) != InsertDeleteFlags::NONE) { - if (rCxt.isSkipAttrForEmptyCells()) + if (rCxt.isSkipEmptyCells()) { // copy only attributes for non-empty cells between nRow1-nDy and nRow2-nDy. sc::SingleColumnSpanSet aSpanSet(GetDoc().GetSheetLimits()); @@ -1433,7 +1446,7 @@ void ScColumn::CopyFromClip( ScTokenArray aArr(GetDoc()); aArr.AddSingleReference( aRef ); - SetFormulaCell(nDestRow, new ScFormulaCell(rDocument, aDestPos, aArr)); + SetFormulaCell(*pBlockPos, nDestRow, new ScFormulaCell(rDocument, aDestPos, aArr)); } // Don't forget to copy the cell text attributes. diff --git a/sc/source/core/data/column4.cxx b/sc/source/core/data/column4.cxx index fc4c3a5e38e2..980ceb5ac3a2 100644 --- a/sc/source/core/data/column4.cxx +++ b/sc/source/core/data/column4.cxx @@ -100,6 +100,50 @@ void ScColumn::DeleteBeforeCopyFromClip( if (!rDocument.ValidRow(aRange.mnRow1) || !rDocument.ValidRow(aRange.mnRow2)) return; + sc::ColumnBlockPosition* pBlockPos = rCxt.getBlockPosition(nTab, nCol); + if (!pBlockPos) + return; + + InsertDeleteFlags nDelFlag = rCxt.getDeleteFlag(); + + if (!rCxt.isSkipEmptyCells()) + { + // Delete the whole destination range. + + if (nDelFlag & InsertDeleteFlags::CONTENTS) + { + sc::SingleColumnSpanSet aDeletedRows(GetDoc().GetSheetLimits()); + DeleteCells(*pBlockPos, aRange.mnRow1, aRange.mnRow2, nDelFlag, aDeletedRows); + rBroadcastSpans.set(GetDoc(), nTab, nCol, aDeletedRows, true); + } + + if (nDelFlag & InsertDeleteFlags::NOTE) + DeleteCellNotes(*pBlockPos, aRange.mnRow1, aRange.mnRow2, false); + + if (nDelFlag & InsertDeleteFlags::EDITATTR) + RemoveEditAttribs(*pBlockPos, aRange.mnRow1, aRange.mnRow2); + + if (nDelFlag & InsertDeleteFlags::ATTRIB) + { + pAttrArray->DeleteArea(aRange.mnRow1, aRange.mnRow2); + + if (rCxt.isTableProtected()) + { + ScPatternAttr aPattern(rDocument.GetPool()); + aPattern.GetItemSet().Put(ScProtectionAttr(false)); + ApplyPatternArea(aRange.mnRow1, aRange.mnRow2, aPattern); + } + + ScConditionalFormatList* pCondList = rCxt.getCondFormatList(); + if (pCondList) + pCondList->DeleteArea(nCol, aRange.mnRow1, nCol, aRange.mnRow2); + } + else if ((nDelFlag & InsertDeleteFlags::HARDATTR) == InsertDeleteFlags::HARDATTR) + pAttrArray->DeleteHardAttr(aRange.mnRow1, aRange.mnRow2); + + return; + } + ScRange aClipRange = rCxt.getClipDoc()->GetClipParam().getWholeRange(); SCROW nClipRow1 = aClipRange.aStart.Row(); SCROW nClipRow2 = aClipRange.aEnd.Row(); @@ -149,10 +193,6 @@ void ScColumn::DeleteBeforeCopyFromClip( nDestOffset += nClipRowLen; } - InsertDeleteFlags nDelFlag = rCxt.getDeleteFlag(); - sc::ColumnBlockPosition aBlockPos; - InitBlockPosition(aBlockPos); - for (const auto& rDestSpan : aDestSpans) { SCROW nRow1 = rDestSpan.mnRow1; @@ -161,15 +201,15 @@ void ScColumn::DeleteBeforeCopyFromClip( if (nDelFlag & InsertDeleteFlags::CONTENTS) { sc::SingleColumnSpanSet aDeletedRows(GetDoc().GetSheetLimits()); - DeleteCells(aBlockPos, nRow1, nRow2, nDelFlag, aDeletedRows); + DeleteCells(*pBlockPos, nRow1, nRow2, nDelFlag, aDeletedRows); rBroadcastSpans.set(GetDoc(), nTab, nCol, aDeletedRows, true); } if (nDelFlag & InsertDeleteFlags::NOTE) - DeleteCellNotes(aBlockPos, nRow1, nRow2, false); + DeleteCellNotes(*pBlockPos, nRow1, nRow2, false); if (nDelFlag & InsertDeleteFlags::EDITATTR) - RemoveEditAttribs(nRow1, nRow2); + RemoveEditAttribs(*pBlockPos, nRow1, nRow2); // Delete attributes just now if (nDelFlag & InsertDeleteFlags::ATTRIB) @@ -211,7 +251,7 @@ void ScColumn::CopyOneCellFromClip( sc::CopyFromClipContext& rCxt, SCROW nRow1, if ((nFlags & InsertDeleteFlags::ATTRIB) != InsertDeleteFlags::NONE) { - if (!rCxt.isSkipAttrForEmptyCells() || rSrcCell.meType != CELLTYPE_NONE) + if (!rCxt.isSkipEmptyCells() || rSrcCell.meType != CELLTYPE_NONE) { const ScPatternAttr* pAttr = (bSameDocPool ? rCxt.getSingleCellPattern(nColOffset) : rCxt.getSingleCellPattern(nColOffset)->PutInPool( &rDocument, rCxt.getClipDoc())); diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx index 9d2770522018..3592eb4a3ee1 100644 --- a/sc/source/core/data/document.cxx +++ b/sc/source/core/data/document.cxx @@ -2818,11 +2818,11 @@ public: } -void ScDocument::CopyFromClip( const ScRange& rDestRange, const ScMarkData& rMark, - InsertDeleteFlags nInsFlag, - ScDocument* pRefUndoDoc, ScDocument* pClipDoc, bool bResetCut, - bool bAsLink, bool bIncludeFiltered, bool bSkipAttrForEmpty, - const ScRangeList * pDestRanges ) +void ScDocument::CopyFromClip( + const ScRange& rDestRange, const ScMarkData& rMark, InsertDeleteFlags nInsFlag, + ScDocument* pRefUndoDoc, ScDocument* pClipDoc, bool bResetCut, + bool bAsLink, bool bIncludeFiltered, bool bSkipEmptyCells, + const ScRangeList * pDestRanges ) { if (bIsClip) return; @@ -2887,7 +2887,7 @@ void ScDocument::CopyFromClip( const ScRange& rDestRange, const ScMarkData& rMar if (nInsFlag & InsertDeleteFlags::ATTRIB) nDelFlag |= InsertDeleteFlags::ATTRIB; - sc::CopyFromClipContext aCxt(*this, pRefUndoDoc, pClipDoc, nInsFlag, bAsLink, bSkipAttrForEmpty); + sc::CopyFromClipContext aCxt(*this, pRefUndoDoc, pClipDoc, nInsFlag, bAsLink, bSkipEmptyCells); std::pair<SCTAB,SCTAB> aTabRanges = getMarkedTableRange(maTabs, rMark); aCxt.setTabRange(aTabRanges.first, aTabRanges.second); aCxt.setDeleteFlag(nDelFlag); @@ -2914,14 +2914,8 @@ void ScDocument::CopyFromClip( const ScRange& rDestRange, const ScMarkData& rMar SCCOL nCol2 = rRange.aEnd.Col(); SCROW nRow2 = rRange.aEnd.Row(); - if (bSkipAttrForEmpty) - { - // Delete cells in the destination only if their corresponding clip cells are not empty. - aCxt.setDestRange(nCol1, nRow1, nCol2, nRow2); - DeleteBeforeCopyFromClip(aCxt, rMark, aBroadcastSpans); - } - else - DeleteArea(nCol1, nRow1, nCol2, nRow2, rMark, nDelFlag, false, &aBroadcastSpans); + aCxt.setDestRange(nCol1, nRow1, nCol2, nRow2); + DeleteBeforeCopyFromClip(aCxt, rMark, aBroadcastSpans); if (CopyOneCellFromClip(aCxt, nCol1, nRow1, nCol2, nRow2)) continue; |