Avoid unnecessary broadcasting when deleting cells prior to pasting.
Change-Id: Id224fd6fdb804350e7e00634db802e80090ae6d7
diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx
index 9dfdbb2..adcd17a 100644
--- a/sc/inc/column.hxx
+++ b/sc/inc/column.hxx
@@ -247,7 +247,9 @@ public:
bool InitBlockPosition( sc::ColumnBlockPosition& rBlockPos );
bool InitBlockPosition( sc::ColumnBlockConstPosition& rBlockPos ) const;
void DeleteBeforeCopyFromClip( sc::CopyFromClipContext& rCxt, const ScColumn& rClipCol );
void DeleteBeforeCopyFromClip(
sc::CopyFromClipContext& rCxt, const ScColumn& rClipCol, sc::ColumnSpanSet& rBroadcastSpans );
void CopyOneCellFromClip( sc::CopyFromClipContext& rCxt, SCROW nRow1, SCROW nRow2, size_t nColOffset );
void CopyFromClip(
diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index a094bc2..d904473 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -1243,7 +1243,8 @@ public:
bool InitColumnBlockPosition( sc::ColumnBlockPosition& rBlokPos, SCTAB nTab, SCCOL nCol );
void DeleteBeforeCopyFromClip( sc::CopyFromClipContext& rCxt, const ScMarkData& rMark );
void DeleteBeforeCopyFromClip(
sc::CopyFromClipContext& rCxt, const ScMarkData& rMark, sc::ColumnSpanSet& rBroadcastSpans );
bool CopyOneCellFromClip(
sc::CopyFromClipContext& rCxt, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 );
diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx
index daacd60..ea1e2a3 100644
--- a/sc/inc/table.hxx
+++ b/sc/inc/table.hxx
@@ -426,7 +426,8 @@ public:
bool InitColumnBlockPosition( sc::ColumnBlockPosition& rBlockPos, SCCOL nCol );
void DeleteBeforeCopyFromClip( sc::CopyFromClipContext& rCxt, const ScTable& rClipTab );
void DeleteBeforeCopyFromClip(
sc::CopyFromClipContext& rCxt, const ScTable& rClipTab, sc::ColumnSpanSet& rBroadcastSpans );
void CopyOneCellFromClip(
sc::CopyFromClipContext& rCxt, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 );
diff --git a/sc/source/core/data/column4.cxx b/sc/source/core/data/column4.cxx
index 2d6609d..f0d28eb 100644
--- a/sc/source/core/data/column4.cxx
+++ b/sc/source/core/data/column4.cxx
@@ -41,7 +41,8 @@ bool ScColumn::IsMerged( SCROW nRow ) const
return pAttrArray->IsMerged(nRow);
}
void ScColumn::DeleteBeforeCopyFromClip( sc::CopyFromClipContext& rCxt, const ScColumn& rClipCol )
void ScColumn::DeleteBeforeCopyFromClip(
sc::CopyFromClipContext& rCxt, const ScColumn& rClipCol, sc::ColumnSpanSet& rBroadcastSpans )
{
sc::CopyFromClipContext::Range aRange = rCxt.getDestRange();
if (!ValidRow(aRange.mnRow1) || !ValidRow(aRange.mnRow2))
@@ -107,7 +108,7 @@ void ScColumn::DeleteBeforeCopyFromClip( sc::CopyFromClipContext& rCxt, const Sc
SCROW nRow2 = it->mnRow2;
if (nDelFlag & IDF_CONTENTS)
DeleteCells(aBlockPos, nRow1, nRow2, nDelFlag, aDeletedRows);
DeleteCells(aBlockPos, nRow1, nRow2, nDelFlag, aDeletedRows, &rBroadcastSpans);
if (nDelFlag & IDF_NOTE)
DeleteCellNotes(aBlockPos, nRow1, nRow2);
@@ -134,8 +135,6 @@ void ScColumn::DeleteBeforeCopyFromClip( sc::CopyFromClipContext& rCxt, const Sc
else if ((nDelFlag & IDF_HARDATTR) == IDF_HARDATTR)
pAttrArray->DeleteHardAttr(nRow1, nRow2);
}
BroadcastCells(aDeletedRows, SC_HINT_DATACHANGED);
}
void ScColumn::CopyOneCellFromClip( sc::CopyFromClipContext& rCxt, SCROW nRow1, SCROW nRow2, size_t nColOffset )
diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx
index bca55c0..8440e2b 100644
--- a/sc/source/core/data/document.cxx
+++ b/sc/source/core/data/document.cxx
@@ -2712,7 +2712,7 @@ void ScDocument::CopyFromClip( const ScRange& rDestRange, const ScMarkData& rMar
{
// Delete cells in the destination only if their corresponding clip cells are not empty.
aCxt.setDestRange(nCol1, nRow1, nCol2, nRow2);
DeleteBeforeCopyFromClip(aCxt, rMark);
DeleteBeforeCopyFromClip(aCxt, rMark, aBroadcastSpans);
}
else
DeleteArea(nCol1, nRow1, nCol2, nRow2, rMark, nDelFlag, false, &aBroadcastSpans);
diff --git a/sc/source/core/data/document10.cxx b/sc/source/core/data/document10.cxx
index 49c0a9f7..1f14d5d 100644
--- a/sc/source/core/data/document10.cxx
+++ b/sc/source/core/data/document10.cxx
@@ -37,7 +37,8 @@ bool ScDocument::IsMerged( const ScAddress& rPos ) const
return pTab->IsMerged(rPos.Col(), rPos.Row());
}
void ScDocument::DeleteBeforeCopyFromClip( sc::CopyFromClipContext& rCxt, const ScMarkData& rMark )
void ScDocument::DeleteBeforeCopyFromClip(
sc::CopyFromClipContext& rCxt, const ScMarkData& rMark, sc::ColumnSpanSet& rBroadcastSpans )
{
SCTAB nClipTab = 0;
const TableContainer& rClipTabs = rCxt.getClipDoc()->maTabs;
@@ -55,7 +56,7 @@ void ScDocument::DeleteBeforeCopyFromClip( sc::CopyFromClipContext& rCxt, const
while (!rClipTabs[nClipTab])
nClipTab = (nClipTab+1) % nClipTabCount;
pTab->DeleteBeforeCopyFromClip(rCxt, *rClipTabs[nClipTab]);
pTab->DeleteBeforeCopyFromClip(rCxt, *rClipTabs[nClipTab], rBroadcastSpans);
nClipTab = (nClipTab+1) % nClipTabCount;
}
diff --git a/sc/source/core/data/table7.cxx b/sc/source/core/data/table7.cxx
index 5686921..79a645c 100644
--- a/sc/source/core/data/table7.cxx
+++ b/sc/source/core/data/table7.cxx
@@ -24,7 +24,8 @@ bool ScTable::IsMerged( SCCOL nCol, SCROW nRow ) const
return aCol[nCol].IsMerged(nRow);
}
void ScTable::DeleteBeforeCopyFromClip( sc::CopyFromClipContext& rCxt, const ScTable& rClipTab )
void ScTable::DeleteBeforeCopyFromClip(
sc::CopyFromClipContext& rCxt, const ScTable& rClipTab, sc::ColumnSpanSet& rBroadcastSpans )
{
sc::CopyFromClipContext::Range aRange = rCxt.getDestRange();
if (!ValidCol(aRange.mnCol1) || !ValidCol(aRange.mnCol2))
@@ -37,15 +38,13 @@ void ScTable::DeleteBeforeCopyFromClip( sc::CopyFromClipContext& rCxt, const ScT
ScRange aClipRange = rCxt.getClipDoc()->GetClipParam().getWholeRange();
SCCOL nClipCol = aClipRange.aStart.Col();
{
ScBulkBroadcast aBulkBroadcast(pDocument->GetBASM());
for (SCCOL nCol = aRange.mnCol1; nCol <= aRange.mnCol2; ++nCol, ++nClipCol)
{
if (nClipCol > aClipRange.aEnd.Col())
nClipCol = aClipRange.aStart.Col(); // loop through columns.
const ScColumn& rClipCol = rClipTab.aCol[nClipCol];
aCol[nCol].DeleteBeforeCopyFromClip(rCxt, rClipCol);
aCol[nCol].DeleteBeforeCopyFromClip(rCxt, rClipCol, rBroadcastSpans);
}
}