summaryrefslogtreecommitdiff
path: root/sw
diff options
context:
space:
mode:
authorOliver Specht <oliver.specht@cib.de>2024-10-02 14:48:08 +0200
committerGabor Kelemen <gabor.kelemen.extern@allotropia.de>2024-10-11 19:07:49 +0200
commit038473595ed266d15a788d8f97781cbaf066cfe7 (patch)
treebca5340060a5b233a27adf139a85323f6acb6856 /sw
parent7a0a781da0a56bc38435e556c22f2e7ad4bd1a31 (diff)
tdf#152839 add fill cells to tables imported wrongly from RTF
In Word 'invisible' cells at the end of the row are usually marked with \trwWidthAN. If that information is missing the table needs to get addtional cells to smaller rows. This prevents extension of exisition cell to the full width of the table. Change-Id: I064f3da55665302d8198ed44d9f640a7707c34e8 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/174385 Tested-by: Jenkins Tested-by: Gabor Kelemen <gabor.kelemen.extern@allotropia.de> Reviewed-by: Gabor Kelemen <gabor.kelemen.extern@allotropia.de>
Diffstat (limited to 'sw')
-rw-r--r--sw/qa/extras/rtfimport/data/tdf152839.rtf15
-rw-r--r--sw/qa/extras/rtfimport/rtfimport.cxx9
-rw-r--r--sw/source/writerfilter/dmapper/DomainMapperTableManager.cxx4
-rw-r--r--sw/source/writerfilter/dmapper/TableManager.cxx60
-rw-r--r--sw/source/writerfilter/dmapper/TableManager.hxx5
5 files changed, 92 insertions, 1 deletions
diff --git a/sw/qa/extras/rtfimport/data/tdf152839.rtf b/sw/qa/extras/rtfimport/data/tdf152839.rtf
new file mode 100644
index 000000000000..e95f72af0b78
--- /dev/null
+++ b/sw/qa/extras/rtfimport/data/tdf152839.rtf
@@ -0,0 +1,15 @@
+{\rtf1
+
+\trowd
+\clbrdrb\brdrs\brdrw100
+\cellx3000
+\pard\intbl A\cell\row
+
+\trowd
+
+\cellx3000
+\cellx6000
+\pard\intbl B\cell
+\pard\intbl C\cell
+\row
+}
diff --git a/sw/qa/extras/rtfimport/rtfimport.cxx b/sw/qa/extras/rtfimport/rtfimport.cxx
index 31bc5b6a39b8..4ff36a7f7988 100644
--- a/sw/qa/extras/rtfimport/rtfimport.cxx
+++ b/sw/qa/extras/rtfimport/rtfimport.cxx
@@ -1933,6 +1933,15 @@ CPPUNIT_TEST_FIXTURE(Test, testTdf163003)
getProperty<sal_Int32>(getShape(1), u"VertOrientPosition"_ustr));
}
+CPPUNIT_TEST_FIXTURE(Test, testTdf152839)
+{
+ createSwDoc("tdf152839.rtf");
+ uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY);
+ uno::Reference<container::XIndexAccess> xTables(xTextTablesSupplier->getTextTables(),
+ uno::UNO_QUERY);
+ uno::Reference<text::XTextTable> xTable(xTables->getByIndex(0), uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(4), xTable->getCellNames().getLength());
+}
// tests should only be added to rtfIMPORT *if* they fail round-tripping in rtfEXPORT
} // end of anonymous namespace
CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sw/source/writerfilter/dmapper/DomainMapperTableManager.cxx b/sw/source/writerfilter/dmapper/DomainMapperTableManager.cxx
index f8d3a762871a..312d2abf10b3 100644
--- a/sw/source/writerfilter/dmapper/DomainMapperTableManager.cxx
+++ b/sw/source/writerfilter/dmapper/DomainMapperTableManager.cxx
@@ -147,6 +147,10 @@ bool DomainMapperTableManager::sprm(Sprm & rSprm)
pPropMap->setValue( TablePropertyMap::TABLE_WIDTH_TYPE, text::SizeType::FIX );
pPropMap->setValue( TablePropertyMap::TABLE_WIDTH, m_nTableWidth );
m_bTableSizeTypeInserted = true;
+ // add current row width to add 'hidden' before inserting the table
+ TablePropertyMapPtr pRowPropMap( new TablePropertyMap );
+ pRowPropMap->setValue( TablePropertyMap::TABLE_WIDTH, m_nTableWidth );
+ insertRowProps(pRowPropMap);
}
else if( sal::static_int_cast<Id>(pMeasureHandler->getUnit()) == NS_ooxml::LN_Value_ST_TblWidth_pct )
{
diff --git a/sw/source/writerfilter/dmapper/TableManager.cxx b/sw/source/writerfilter/dmapper/TableManager.cxx
index 473967d26b02..f73d61b145ac 100644
--- a/sw/source/writerfilter/dmapper/TableManager.cxx
+++ b/sw/source/writerfilter/dmapper/TableManager.cxx
@@ -23,7 +23,7 @@
#include "DomainMapperTableHandler.hxx"
#include "DomainMapper_Impl.hxx"
#include "util.hxx"
-
+#include <comphelper/sequence.hxx>
#include <comphelper/diagnose_ex.hxx>
using namespace com::sun::star;
@@ -373,6 +373,62 @@ void TableManager::startParagraphGroup()
mnTableDepthNew = 0;
}
+void TableManager::HandleSmallerRows()
+{
+ TableData::Pointer_t pTableData = mTableDataStack.back();
+ unsigned int nRows = pTableData->getRowCount();
+ sal_Int32 nMaxRowWidth = 0;
+ bool bIsDiffRowWidth = false;
+ for (unsigned int nRow = 0; nRow < nRows; ++nRow)
+ {
+ RowData::Pointer_t pRowData = pTableData->getRow(nRow);
+ sal_Int32 nRowWidth = 0;
+ const TablePropertyMapPtr pRowProps = pRowData->getProperties();
+ if (pRowProps)
+ pRowProps->getValue(TablePropertyMap::TABLE_WIDTH, nRowWidth);
+ if (nRowWidth == 0)
+ return;
+ if (nRowWidth > nMaxRowWidth)
+ {
+ if (nMaxRowWidth > 0)
+ bIsDiffRowWidth = true;
+ nMaxRowWidth = nRowWidth;
+ }
+ }
+ //
+ if (bIsDiffRowWidth)
+ {
+ uno::Reference<text::XTextAppendAndConvert> xTextAppendAndConvert(
+ mpTableDataHandler->getDomainMapperImpl().GetTopTextAppend(), uno::UNO_QUERY);
+
+ for (unsigned int nRow = 0; nRow < nRows; ++nRow)
+ {
+ RowData::Pointer_t pRowData = pTableData->getRow(nRow);
+ sal_Int32 nRowWidth = 0;
+ pRowData->getProperties()->getValue(TablePropertyMap::TABLE_WIDTH, nRowWidth);
+ if (nRowWidth < nMaxRowWidth)
+ {
+ uno::Reference<text::XTextRange> xTextRange
+ = pRowData->getCellEnd(pRowData->getCellCount() - 1);
+ std::vector<beans::PropertyValue> aProperties;
+ //TODO: is there a simpler way to create a new paragraph behind the current cell and get that range back?
+ uno::Reference<text::XTextRange> xNewCellTextRange
+ = xTextAppendAndConvert->finishParagraphInsert(
+ comphelper::containerToSequence(aProperties), xTextRange);
+ uno::Reference<text::XTextCursor> xNewCellTextCursor
+ = xTextAppendAndConvert->createTextCursorByRange(xNewCellTextRange);
+ xNewCellTextCursor->collapseToEnd();
+ xNewCellTextCursor->goRight(1, false);
+
+ TablePropertyMapPtr pCellPropMap(new TablePropertyMap);
+ pRowData->addCell(xNewCellTextCursor, pCellPropMap);
+ pRowData->endCell(xNewCellTextCursor);
+ pRowData->getProperties()->setValue(TablePropertyMap::TABLE_WIDTH, nMaxRowWidth);
+ }
+ }
+ }
+}
+
void TableManager::resolveCurrentTable()
{
#ifdef DBG_UTIL
@@ -383,6 +439,8 @@ void TableManager::resolveCurrentTable()
{
try
{
+ // add cells to the rows that are smaller than the maximum width
+ HandleSmallerRows();
TableData::Pointer_t pTableData = mTableDataStack.back();
unsigned int nRows = pTableData->getRowCount();
diff --git a/sw/source/writerfilter/dmapper/TableManager.hxx b/sw/source/writerfilter/dmapper/TableManager.hxx
index f98c992a3595..18baf49c5333 100644
--- a/sw/source/writerfilter/dmapper/TableManager.hxx
+++ b/sw/source/writerfilter/dmapper/TableManager.hxx
@@ -332,6 +332,11 @@ private:
void endRow();
/**
+ * Handle rows smaller than the table width and add 'hidden' cells
+ */
+ void HandleSmallerRows();
+
+ /**
Resolve the current table to the TableDataHandler.
*/
void resolveCurrentTable();