summaryrefslogtreecommitdiff
path: root/svx
diff options
context:
space:
mode:
authorMark Hung <marklh9@gmail.com>2020-02-15 01:11:47 +0800
committerXisco Faulí <xiscofauli@libreoffice.org>2020-02-26 11:22:20 +0100
commit183294472d4d40b5ca810ffc5eeb6a3c3dc86331 (patch)
tree9cc7c579e1fa292e8f97e2d0d813afe624c5ac4f /svx
parent911ebc8425082ec699ef03fbab2d77ee67e0fe31 (diff)
tdf#130483 prevent pasting cell exceeds the border.
When pasting a table onto another selected table, cells are cloned from source to target including their column span and row span. In the test case the target table can accomodate the first cell of the merged cells, while the rest go over the table boundary, hence causing some exception later. Change-Id: Iae78a9e1689571d4ea2f1ac4853f68c1f7dccb9c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/88737 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk> (cherry picked from commit 5f90c8bc0270f692a38073b1e4aa9e3b6ba106ed) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/89442 Reviewed-by: Xisco Faulí <xiscofauli@libreoffice.org>
Diffstat (limited to 'svx')
-rw-r--r--svx/source/table/tablecontroller.cxx20
1 files changed, 15 insertions, 5 deletions
diff --git a/svx/source/table/tablecontroller.cxx b/svx/source/table/tablecontroller.cxx
index ffd6ca9f1e90..a153c2b6db62 100644
--- a/svx/source/table/tablecontroller.cxx
+++ b/svx/source/table/tablecontroller.cxx
@@ -2789,14 +2789,24 @@ bool SvxTableController::PasteObject( SdrTableObj const * pPasteTableObj )
// copy cell contents
for( sal_Int32 nRow = 0; nRow < nPasteRows; ++nRow )
{
- for( sal_Int32 nCol = 0; nCol < nPasteColumns; ++nCol )
+ for( sal_Int32 nCol = 0, nTargetCol = aStart.mnCol; nCol < nPasteColumns; ++nCol )
{
- CellRef xTargetCell( dynamic_cast< Cell* >( mxTable->getCellByPosition( aStart.mnCol + nCol, aStart.mnRow + nRow ).get() ) );
+ CellRef xTargetCell( dynamic_cast< Cell* >( mxTable->getCellByPosition( nTargetCol, aStart.mnRow + nRow ).get() ) );
if( xTargetCell.is() && !xTargetCell->isMerged() )
{
- xTargetCell->AddUndo();
- xTargetCell->cloneFrom( dynamic_cast< Cell* >( xPasteTable->getCellByPosition( nCol, nRow ).get() ) );
- nCol += xTargetCell->getColumnSpan() - 1;
+ CellRef xSourceCell(dynamic_cast<Cell*>(xPasteTable->getCellByPosition(nCol, nRow).get()));
+ if (xSourceCell.is())
+ {
+ xTargetCell->AddUndo();
+ // Prevent cell span exceeding the pasting range.
+ if (nColumns < nTargetCol + xSourceCell->getColumnSpan())
+ xTargetCell->replaceContentAndFormating(xSourceCell);
+ else
+ xTargetCell->cloneFrom(xSourceCell);
+
+ nCol += xSourceCell->getColumnSpan() - 1;
+ nTargetCol += xTargetCell->getColumnSpan();
+ }
}
}
}