summaryrefslogtreecommitdiff
path: root/writerfilter
diff options
context:
space:
mode:
Diffstat (limited to 'writerfilter')
-rw-r--r--writerfilter/source/dmapper/DomainMapperTableManager.cxx37
-rw-r--r--writerfilter/source/dmapper/DomainMapperTableManager.hxx3
-rw-r--r--writerfilter/source/dmapper/TableData.hxx11
-rw-r--r--writerfilter/source/dmapper/TableManager.cxx20
-rw-r--r--writerfilter/source/ooxml/OOXMLFastContextHandler.cxx4
-rw-r--r--writerfilter/source/ooxml/model.xml5
6 files changed, 65 insertions, 15 deletions
diff --git a/writerfilter/source/dmapper/DomainMapperTableManager.cxx b/writerfilter/source/dmapper/DomainMapperTableManager.cxx
index e25f55e68bb7..03486feba082 100644
--- a/writerfilter/source/dmapper/DomainMapperTableManager.cxx
+++ b/writerfilter/source/dmapper/DomainMapperTableManager.cxx
@@ -47,7 +47,7 @@ DomainMapperTableManager::DomainMapperTableManager() :
m_nRow(0),
m_nCell(),
m_nGridSpan(1),
- m_nGridBefore(0),
+ m_aGridBefore(),
m_nGridAfter(0),
m_nHeaderRepeat(0),
m_nTableWidth(0),
@@ -354,7 +354,7 @@ bool DomainMapperTableManager::sprm(Sprm & rSprm)
}
break;
case NS_ooxml::LN_CT_TrPrBase_gridBefore:
- m_nGridBefore = nIntValue;
+ m_aGridBefore.back( ) = nIntValue;
break;
case NS_ooxml::LN_CT_TrPrBase_gridAfter:
m_nGridAfter = nIntValue;
@@ -394,6 +394,11 @@ DomainMapperTableManager::IntVectorPtr const & DomainMapperTableManager::getCurr
return m_aTableGrid.back( );
}
+sal_uInt32 DomainMapperTableManager::getCurrentGridBefore( )
+{
+ return m_aGridBefore.back( );
+}
+
bool DomainMapperTableManager::hasCurrentSpans() const
{
return !m_aGridSpans.empty();
@@ -456,6 +461,7 @@ void DomainMapperTableManager::startLevel( )
m_aTmpPosition.push_back( pTmpPosition );
m_aTmpTableProperties.push_back( pTmpProperties );
m_nCell.push_back( 0 );
+ m_aGridBefore.push_back( 0 );
m_nTableWidth = 0;
m_nLayoutType = 0;
@@ -485,6 +491,7 @@ void DomainMapperTableManager::endLevel( )
m_aCellWidths.back()->push_back(*oCurrentWidth);
m_nCell.pop_back( );
+ m_aGridBefore.pop_back( );
m_nTableWidth = 0;
m_nLayoutType = 0;
@@ -540,6 +547,7 @@ void DomainMapperTableManager::endOfRowAction()
IntVectorPtr pTmpGridSpans = m_aGridSpans.back();
IntVectorPtr pTmpCellWidths = m_aCellWidths.back();
sal_uInt32 nTmpCell = m_nCell.back();
+ sal_uInt32 nTmpGridBefore = m_aGridBefore.back();
// endLevel and startLevel are taking care of the non finished row
// to carry it over to the next table
@@ -552,10 +560,12 @@ void DomainMapperTableManager::endOfRowAction()
m_aGridSpans.pop_back();
m_aCellWidths.pop_back();
m_nCell.pop_back();
+ m_aGridBefore.pop_back();
m_aTableGrid.push_back(pTmpTableGrid);
m_aGridSpans.push_back(pTmpGridSpans);
m_aCellWidths.push_back(pTmpCellWidths);
m_nCell.push_back(nTmpCell);
+ m_aGridBefore.push_back(nTmpGridBefore);
}
// Push the tmp position now that we compared it
@@ -596,10 +606,16 @@ void DomainMapperTableManager::endOfRowAction()
}
IntVectorPtr pCurrentSpans = getCurrentSpans( );
- if( pCurrentSpans->size() < m_nCell.back( ) )
+
+ if( m_aGridBefore.back() > 0 )
+ {
+ //fill missing gridBefore elements with '1'
+ pCurrentSpans->insert( pCurrentSpans->begin( ), m_aGridBefore.back(), 1 );
+ }
+ if( pCurrentSpans->size() < m_aGridBefore.back() + m_nCell.back( ))
{
//fill missing elements with '1'
- pCurrentSpans->insert( pCurrentSpans->end( ), m_nCell.back( ) - pCurrentSpans->size(), 1 );
+ pCurrentSpans->insert( pCurrentSpans->end( ), m_aGridBefore.back() + m_nCell.back( ) - pCurrentSpans->size(), 1 );
}
#ifdef DBG_UTIL
@@ -626,7 +642,7 @@ void DomainMapperTableManager::endOfRowAction()
for (int i : (*pTableGrid))
nFullWidthRelative = o3tl::saturating_add(nFullWidthRelative, i);
- if( pTableGrid->size() == ( m_nGridBefore + nGrids + m_nGridAfter ) && m_nCell.back( ) > 0 )
+ if( pTableGrid->size() == ( nGrids + m_nGridAfter ) && m_nCell.back( ) > 0 )
{
/*
* If table width property set earlier is smaller than the current table width,
@@ -656,12 +672,12 @@ void DomainMapperTableManager::endOfRowAction()
}
}
}
- uno::Sequence< text::TableColumnSeparator > aSeparators( m_nCell.back( ) - 1 );
+ uno::Sequence< text::TableColumnSeparator > aSeparators( m_aGridBefore.back() + m_nCell.back( ) - 1 );
text::TableColumnSeparator* pSeparators = aSeparators.getArray();
double nLastRelPos = 0.0;
- sal_uInt32 nBorderGridIndex = m_nGridBefore;
+ sal_uInt32 nBorderGridIndex = 0;
- size_t nWidthsBound = m_nCell.back( ) - 1;
+ size_t nWidthsBound = m_aGridBefore.back() + m_nCell.back() - 1;
if (nWidthsBound)
{
if (nFullWidthRelative == 0)
@@ -694,7 +710,7 @@ void DomainMapperTableManager::endOfRowAction()
}
else if ( !pCellWidths->empty() &&
( m_nLayoutType == NS_ooxml::LN_Value_doc_ST_TblLayout_fixed
- || pCellWidths->size() == ( m_nGridBefore + nGrids + m_nGridAfter ) )
+ || pCellWidths->size() == ( nGrids + m_nGridAfter ) )
)
{
// If we're here, then the number of cells does not equal to the amount
@@ -748,11 +764,12 @@ void DomainMapperTableManager::endOfRowAction()
++m_nRow;
m_nCell.back( ) = 0;
+ m_aGridBefore.back( ) = 0;
getCurrentGrid()->clear();
pCurrentSpans->clear();
pCellWidths->clear();
- m_nGridBefore = m_nGridAfter = 0;
+ m_nGridAfter = 0;
m_bTableSizeTypeInserted = false;
#ifdef DBG_UTIL
diff --git a/writerfilter/source/dmapper/DomainMapperTableManager.hxx b/writerfilter/source/dmapper/DomainMapperTableManager.hxx
index 243e901169bb..219986870ef3 100644
--- a/writerfilter/source/dmapper/DomainMapperTableManager.hxx
+++ b/writerfilter/source/dmapper/DomainMapperTableManager.hxx
@@ -42,7 +42,7 @@ class DomainMapperTableManager : public TableManager
sal_uInt32 m_nRow;
::std::vector< sal_uInt32 > m_nCell;
sal_uInt32 m_nGridSpan;
- sal_uInt32 m_nGridBefore; ///< number of grid columns in the parent table's table grid which must be skipped before the contents of this table row are added to the parent table
+ ::std::vector< sal_uInt32 > m_aGridBefore; ///< number of grid columns in the parent table's table grid which must be skipped before the contents of this table row are added to the parent table
sal_uInt32 m_nGridAfter; ///< number of grid columns in the parent table's table grid which shall be left after the last cell in the table row
sal_Int32 m_nHeaderRepeat; //counter of repeated headers - if == -1 then the repeating stops
sal_Int32 m_nTableWidth; //might be set directly or has to be calculated from the column positions
@@ -93,6 +93,7 @@ public:
bool hasCurrentSpans() const;
IntVectorPtr const & getCurrentSpans( );
IntVectorPtr const & getCurrentCellWidths( );
+ sal_uInt32 getCurrentGridBefore( );
/// Turn the attributes collected so far in m_aTableLook into a property and clear the container.
void finishTableLook();
diff --git a/writerfilter/source/dmapper/TableData.hxx b/writerfilter/source/dmapper/TableData.hxx
index 8489254f4ab8..6326dbe33704 100644
--- a/writerfilter/source/dmapper/TableData.hxx
+++ b/writerfilter/source/dmapper/TableData.hxx
@@ -131,11 +131,18 @@ public:
@param start the start handle of the cell
@param end the end handle of the cell
@param pProps the properties of the cell
+ @param bAddBefore true: add an empty cell at beginning of the row for gridBefore
*/
- void addCell(const css::uno::Reference<css::text::XTextRange>& start, TablePropertyMapPtr pProps)
+ void addCell(const css::uno::Reference<css::text::XTextRange>& start, TablePropertyMapPtr pProps, bool bAddBefore = false)
{
CellData::Pointer_t pCellData(new CellData(start, pProps));
- mCells.push_back(pCellData);
+ if (bAddBefore)
+ {
+ mCells.insert(mCells.begin(), pCellData);
+ mCells[0]->setEnd(start);
+ }
+ else
+ mCells.push_back(pCellData);
}
void endCell(const css::uno::Reference<css::text::XTextRange>& end)
diff --git a/writerfilter/source/dmapper/TableManager.cxx b/writerfilter/source/dmapper/TableManager.cxx
index 03fab0295353..b9384b9e08df 100644
--- a/writerfilter/source/dmapper/TableManager.cxx
+++ b/writerfilter/source/dmapper/TableManager.cxx
@@ -407,6 +407,26 @@ void TableManager::endRow()
#ifdef DBG_UTIL
TagLogger::getInstance().element("tablemanager.endRow");
#endif
+ TableData::Pointer_t pTableData = mTableDataStack.top();
+
+ // Add borderless w:gridBefore cell(s) to the row
+ if (pTableData)
+ {
+ sal_uInt32 nGridBefore = mpTableDataHandler->getDomainMapperImpl().getTableManager().getCurrentGridBefore();
+ for (unsigned int i = 0; i < nGridBefore; ++i)
+ {
+ css::table::BorderLine2 aBorderLine;
+ aBorderLine.Color = 0;
+ aBorderLine.InnerLineWidth = 0;
+ aBorderLine.OuterLineWidth = 0;
+ TablePropertyMapPtr pCellProperties(new TablePropertyMap);
+ pCellProperties->Insert(PROP_TOP_BORDER, css::uno::makeAny(aBorderLine));
+ pCellProperties->Insert(PROP_LEFT_BORDER, css::uno::makeAny(aBorderLine));
+ pCellProperties->Insert(PROP_BOTTOM_BORDER, css::uno::makeAny(aBorderLine));
+ pCellProperties->Insert(PROP_RIGHT_BORDER, css::uno::makeAny(aBorderLine));
+ pTableData->getCurrentRow()->addCell(pTableData->getCurrentRow()->getCellStart(0), pCellProperties, /*bAddBefore=*/true);
+ }
+ }
setRowEnd(true);
}
diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
index 11731557a44e..6f7839d0512b 100644
--- a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
+++ b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
@@ -1461,6 +1461,10 @@ OOXMLValue::Pointer_t fakeNoBorder()
// not insane enough to find out how to add cells in dmapper.
void OOXMLFastContextHandlerTextTableRow::handleGridBefore( const OOXMLValue::Pointer_t& val )
{
+ // start removing: disable for w:gridBefore
+ if (!mpGridAfter)
+ return;
+
int count = val->getInt();
for( int i = 0;
i < count;
diff --git a/writerfilter/source/ooxml/model.xml b/writerfilter/source/ooxml/model.xml
index 66eedcaa63e4..17c8f5217fec 100644
--- a/writerfilter/source/ooxml/model.xml
+++ b/writerfilter/source/ooxml/model.xml
@@ -14442,7 +14442,7 @@
<ref name="CT_DecimalNumber"/>
</element>
<element name="gridBefore">
- <ref name="CT_TrPrBaseGridBefore"/>
+ <ref name="CT_DecimalNumber"/>
</element>
<element name="gridAfter">
<ref name="CT_TrPrBaseGridAfter"/>
@@ -18404,6 +18404,7 @@
<resource name="CT_TrPrBase" resource="Properties">
<element name="cnfStyle" tokenid="ooxml:CT_TrPrBase_cnfStyle"/>
<element name="divId" tokenid="ooxml:CT_TrPrBase_divId"/>
+ <element name="gridBefore" tokenid="ooxml:CT_TrPrBase_gridBefore"/>
<element name="wBefore" tokenid="ooxml:CT_TrPrBase_wBefore"/>
<element name="wAfter" tokenid="ooxml:CT_TrPrBase_wAfter"/>
<element name="cantSplit" tokenid="ooxml:CT_TrPrBase_cantSplit"/>
@@ -18414,7 +18415,7 @@
<element name="hidden" tokenid="ooxml:CT_TrPrBase_hidden"/>
</resource>
<resource name="CT_TrPrBaseGridBefore" resource="TextTableRow">
- <attribute name="val" tokenid="ooxml:CT_TrPrBase_gridBefore" action="handleGridBefore"/>
+ <attribute name="val" tokenid="ooxml:CT_TrPrBase_gridBefore"/>
</resource>
<resource name="CT_TrPrBaseGridAfter" resource="TextTableRow">
<attribute name="val" tokenid="ooxml:CT_TrPrBase_gridAfter" action="handleGridAfter"/>