tdf#123090 Handle removed column with gridSpan.

Change-Id: If477845972ce4c8e7bf09ea8718c58851a5b9740
Signed-off-by: Gülşah Köse <gulsah.kose@collabora.com>
Reviewed-on: https://gerrit.libreoffice.org/68102
Tested-by: Jenkins
Reviewed-by: Andras Timar <andras.timar@collabora.com>
This commit is contained in:
Gülşah Köse
2019-02-20 19:06:33 +03:00
committed by Andras Timar
parent ffc59a0c4f
commit 48ef20f203
4 changed files with 48 additions and 6 deletions

View File

@@ -282,21 +282,63 @@ void TableProperties::pushToPropSet( const ::oox::core::XmlFilterBase& rFilterBa
std::unique_ptr<TableStyle> xTableStyleToDelete;
const TableStyle& rTableStyle( getUsedTableStyle( rFilterBase, xTableStyleToDelete ) );
sal_Int32 nRow = 0;
for (auto & tableRow : mvTableRows)
{
sal_Int32 nColumn = 0;
for (auto & tableCell : tableRow.getTableCells())
sal_Int32 nColumnSize = tableRow.getTableCells().size();
sal_Int32 nRemovedColumn = 0; //
for (sal_Int32 nColIndex = 0; nColIndex < nColumnSize; nColIndex++)
{
TableCell& rTableCell(tableCell);
TableCell& rTableCell(tableRow.getTableCells().at(nColIndex));
if ( !rTableCell.getvMerge() && !rTableCell.gethMerge() )
{
uno::Reference< XTable > xTable( xColumnRowRange, uno::UNO_QUERY_THROW );
bool bMerged = false;
if ( ( rTableCell.getRowSpan() > 1 ) || ( rTableCell.getGridSpan() > 1 ) )
{
MergeCells( xTable, nColumn, nRow, rTableCell.getGridSpan(), rTableCell.getRowSpan() );
if(rTableCell.getGridSpan() > 1)
{
nRemovedColumn = (rTableCell.getGridSpan() - 1);
// MergeCells removes columns. So our loop don't know that removed column and we are skip the handlingthat removed column(s).
nColIndex += nRemovedColumn;
bMerged = true; // it will adjust new column number after push current column's props with pushToXCell.
}
}
Reference< XCellRange > xCellRange( xTable, UNO_QUERY_THROW );
rTableCell.pushToXCell( rFilterBase, pMasterTextListStyle, xCellRange->getCellByPosition( nColumn, nRow ), *this, rTableStyle,
nColumn, tableRow.getTableCells().size()-1, nRow, mvTableRows.size()-1 );
Reference < XCell > xCell;
if(nRemovedColumn)
{
try
{
xCell = xCellRange->getCellByPosition( nColumn, nRow );
}
catch(Exception&) //Exception can come from TableModel::getCellByPosition when an column removed while merging columns. So adjust again here.
{
xCell = xCellRange->getCellByPosition( nColumn-nRemovedColumn, nRow );
}
}
else
xCell = xCellRange->getCellByPosition( nColumn, nRow );
rTableCell.pushToXCell( rFilterBase,
pMasterTextListStyle,
xCell,
*this,
rTableStyle,
nColumn,
tableRow.getTableCells().size()-1,
nRow,
mvTableRows.size()-1 );
if (bMerged)
nColumn += nRemovedColumn;
}
++nColumn;
}

View File

@@ -2518,7 +2518,7 @@ void SdImportTest::testTdf119015()
uno::Reference<table::XTable> xTable(pTableObj->getTable());
// Test that we actually have three cells: this threw css.lang.IndexOutOfBoundsException
uno::Reference<text::XTextRange> xTextRange(xTable->getCellByPosition(2, 0),
uno::Reference<text::XTextRange> xTextRange(xTable->getCellByPosition(1, 0),
uno::UNO_QUERY_THROW);
CPPUNIT_ASSERT_EQUAL(OUString("A3"), xTextRange->getString());

View File

@@ -251,6 +251,7 @@ void SAL_CALL CellCursor::merge( )
try
{
mxTable->merge( aStart.mnCol, aStart.mnRow, aEnd.mnCol - aStart.mnCol + 1, aEnd.mnRow - aStart.mnRow + 1 );
mxTable->optimize();
mxTable->setModified(true);
}
catch( Exception& )

View File

@@ -1839,7 +1839,6 @@ void SvxTableController::MergeRange( sal_Int32 nFirstCol, sal_Int32 nFirstRow, s
}
xRange->merge();
mxTable->optimize();
mbHasJustMerged = true;
setSelectedCells( maCursorFirstPos, maCursorFirstPos );