diff options
author | Mark Hung <marklh9@gmail.com> | 2020-02-15 01:11:47 +0800 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2020-02-15 17:53:02 +0100 |
commit | 5f90c8bc0270f692a38073b1e4aa9e3b6ba106ed (patch) | |
tree | 5be30cdf66b13e84334f1b49deb2eba9c4a6cc19 /svx/source/table | |
parent | d0ca3064b05c477484c100c9d374b52d5e4ec454 (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>
Diffstat (limited to 'svx/source/table')
-rw-r--r-- | svx/source/table/tablecontroller.cxx | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/svx/source/table/tablecontroller.cxx b/svx/source/table/tablecontroller.cxx index fddc5bdf2bbb..8067aec8a759 100644 --- a/svx/source/table/tablecontroller.cxx +++ b/svx/source/table/tablecontroller.cxx @@ -2796,14 +2796,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(); + } } } } |