tdf#132514 DOCX import: fix lost table style with footer
Table paragraphs collected for table style processing were mixed when both body text and footer contain tables, i.e. clearing paragraph vector at processing the first table resulted missing paragraph vector and table style processing for the other one. Now tables in footer, also nested tables collect their paragraphs in separated table paragraph vectors. Regression from commit 6c5da2cd7af5c2d90e4d8e9635ba8c9989c87923 (tdf#119054 DOCX: fix not table style based bottom margin). Change-Id: Ib8568d8379cfb7da869120cdc7fe12895252d661 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/93415 Tested-by: Jenkins Reviewed-by: László Németh <nemeth@numbertext.org>
This commit is contained in:
Binary file not shown.
@@ -474,6 +474,14 @@ DECLARE_OOXMLEXPORT_EXPORTONLY_TEST(testTdf131258, "tdf131258.docx")
|
||||
assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[1]/w:tc[1]/w:p/w:pPr/w:spacing", "after", "0");
|
||||
}
|
||||
|
||||
DECLARE_OOXMLEXPORT_EXPORTONLY_TEST(testTdf132514, "tdf132514.docx")
|
||||
{
|
||||
xmlDocPtr pXmlDoc = parseExport();
|
||||
// Keep table style setting, when the footer also contain a table
|
||||
assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[1]/w:tc[2]/w:p[2]/w:pPr/w:spacing", "before", "0");
|
||||
assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[1]/w:tc[2]/w:p[2]/w:pPr/w:spacing", "after", "0");
|
||||
}
|
||||
|
||||
DECLARE_OOXMLEXPORT_EXPORTONLY_TEST(testFdo69636, "fdo69636.docx")
|
||||
{
|
||||
/*
|
||||
|
||||
@@ -1252,6 +1252,7 @@ void DomainMapperTableHandler::endTable(unsigned int nestedTableLevel, bool bTab
|
||||
|
||||
if ( !aAllTableParaProperties.empty() )
|
||||
{
|
||||
TableParagraphVectorPtr pTableParagraphs = m_rDMapper_Impl.getTableManager().getCurrentParagraphs();
|
||||
for (size_t nRow = 0; nRow < m_aTableRanges.size(); ++nRow)
|
||||
{
|
||||
for (size_t nCell = 0; nCell < m_aTableRanges[nRow].size(); ++nCell)
|
||||
@@ -1263,8 +1264,8 @@ void DomainMapperTableHandler::endTable(unsigned int nestedTableLevel, bool bTab
|
||||
uno::Reference<text::XTextRangeCompare> xTextRangeCompare(rStartPara->getText(), uno::UNO_QUERY);
|
||||
bool bApply = false;
|
||||
// search paragraphs of the cell
|
||||
std::vector<TableParagraph>::iterator aIt = m_rDMapper_Impl.m_aParagraphsToEndTable.begin();
|
||||
while ( aIt != m_rDMapper_Impl.m_aParagraphsToEndTable.end() ) try
|
||||
std::vector<TableParagraph>::iterator aIt = pTableParagraphs->begin();
|
||||
while ( aIt != pTableParagraphs->end() ) try
|
||||
{
|
||||
if (!bApply && xTextRangeCompare->compareRegionStarts(rStartPara, aIt->m_rStartParagraph) == 0)
|
||||
bApply = true;
|
||||
@@ -1273,7 +1274,7 @@ void DomainMapperTableHandler::endTable(unsigned int nestedTableLevel, bool bTab
|
||||
bool bEndOfApply = (xTextRangeCompare->compareRegionEnds(rEndPara, aIt->m_rEndParagraph) == 0);
|
||||
ApplyParagraphPropertiesFromTableStyle(*aIt, aAllTableParaProperties, aCellProperties[nRow][nCell]);
|
||||
// erase processed paragraph from list of pending paragraphs
|
||||
aIt = m_rDMapper_Impl.m_aParagraphsToEndTable.erase(aIt);
|
||||
aIt = pTableParagraphs->erase(aIt);
|
||||
if (bEndOfApply)
|
||||
break;
|
||||
}
|
||||
@@ -1435,8 +1436,6 @@ void DomainMapperTableHandler::endTable(unsigned int nestedTableLevel, bool bTab
|
||||
m_aCellProperties.clear();
|
||||
m_aRowProperties.clear();
|
||||
m_bHadFootOrEndnote = false;
|
||||
if (nestedTableLevel <= 1 && m_rDMapper_Impl.m_bConvertedTable)
|
||||
m_rDMapper_Impl.m_aParagraphsToEndTable.clear();
|
||||
|
||||
#ifdef DBG_UTIL
|
||||
TagLogger::getInstance().endElement();
|
||||
|
||||
@@ -55,15 +55,6 @@ struct HorizontallyMergedCell
|
||||
}
|
||||
};
|
||||
|
||||
/// Information about a paragraph to be finished after a table end.
|
||||
struct TableParagraph
|
||||
{
|
||||
css::uno::Reference<css::text::XTextRange> m_rStartParagraph;
|
||||
css::uno::Reference<css::text::XTextRange> m_rEndParagraph;
|
||||
PropertyMapPtr m_pPropertyMap;
|
||||
css::uno::Reference<css::beans::XPropertySet> m_rPropertySet;
|
||||
};
|
||||
|
||||
/// Class to handle events generated by TableManager::resolveCurrentTable().
|
||||
class DomainMapperTableHandler final : public virtual SvRefBase
|
||||
{
|
||||
|
||||
@@ -50,6 +50,7 @@ DomainMapperTableManager::DomainMapperTableManager() :
|
||||
m_bPushCurrentWidth(false),
|
||||
m_bTableSizeTypeInserted(false),
|
||||
m_nLayoutType(0),
|
||||
m_aParagraphsToEndTable(),
|
||||
m_pTablePropsHandler(new TablePropertiesHandler())
|
||||
{
|
||||
m_pTablePropsHandler->SetTableManager( this );
|
||||
@@ -424,6 +425,11 @@ TablePositionHandler* DomainMapperTableManager::getCurrentTableRealPosition()
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
TableParagraphVectorPtr DomainMapperTableManager::getCurrentParagraphs( )
|
||||
{
|
||||
return m_aParagraphsToEndTable.top( );
|
||||
}
|
||||
|
||||
void DomainMapperTableManager::setIsInShape(bool bIsInShape)
|
||||
{
|
||||
m_bIsInShape = bIsInShape;
|
||||
@@ -440,6 +446,12 @@ void DomainMapperTableManager::startLevel( )
|
||||
oCurrentWidth = m_aCellWidths.back()->back();
|
||||
m_aCellWidths.back()->pop_back();
|
||||
}
|
||||
std::optional<TableParagraph> oParagraph;
|
||||
if (getTableDepthDifference() > 0 && !m_aParagraphsToEndTable.empty() && !m_aParagraphsToEndTable.top()->empty())
|
||||
{
|
||||
oParagraph = m_aParagraphsToEndTable.top()->back();
|
||||
m_aParagraphsToEndTable.top()->pop_back();
|
||||
}
|
||||
|
||||
IntVectorPtr pNewGrid = std::make_shared<vector<sal_Int32>>();
|
||||
IntVectorPtr pNewSpans = std::make_shared<vector<sal_Int32>>();
|
||||
@@ -460,10 +472,14 @@ void DomainMapperTableManager::startLevel( )
|
||||
m_aGridBefore.push_back( 0 );
|
||||
m_nTableWidth = 0;
|
||||
m_nLayoutType = 0;
|
||||
TableParagraphVectorPtr pNewParagraphs = std::make_shared<vector<TableParagraph>>();
|
||||
m_aParagraphsToEndTable.push( pNewParagraphs );
|
||||
|
||||
// And push it back to the right level.
|
||||
if (oCurrentWidth)
|
||||
m_aCellWidths.back()->push_back(*oCurrentWidth);
|
||||
if (oParagraph)
|
||||
m_aParagraphsToEndTable.top()->push_back(*oParagraph);
|
||||
}
|
||||
|
||||
void DomainMapperTableManager::endLevel( )
|
||||
@@ -508,6 +524,7 @@ void DomainMapperTableManager::endLevel( )
|
||||
// in the endTable method called in endLevel.
|
||||
m_aTablePositions.pop_back();
|
||||
m_aTableStyleNames.pop_back();
|
||||
m_aParagraphsToEndTable.pop();
|
||||
}
|
||||
|
||||
void DomainMapperTableManager::endOfCellAction()
|
||||
|
||||
@@ -63,6 +63,8 @@ class DomainMapperTableManager : public TableManager
|
||||
bool m_bTableSizeTypeInserted;
|
||||
/// Table layout algorithm, IOW if we should consider fixed column width or not.
|
||||
sal_uInt32 m_nLayoutType;
|
||||
/// Collected table paragraphs for table style handling
|
||||
std::stack< TableParagraphVectorPtr > m_aParagraphsToEndTable;
|
||||
|
||||
std::unique_ptr<TablePropertiesHandler> m_pTablePropsHandler;
|
||||
PropertyMapPtr m_pStyleProps;
|
||||
@@ -93,6 +95,7 @@ public:
|
||||
IntVectorPtr const & getCurrentSpans( );
|
||||
IntVectorPtr const & getCurrentCellWidths( );
|
||||
sal_uInt32 getCurrentGridBefore( );
|
||||
TableParagraphVectorPtr getCurrentParagraphs( );
|
||||
|
||||
/// Turn the attributes collected so far in m_aTableLook into a property and clear the container.
|
||||
void finishTableLook();
|
||||
|
||||
@@ -1786,7 +1786,7 @@ void DomainMapper_Impl::finishParagraph( const PropertyMapPtr& pPropertyMap, con
|
||||
if (m_nTableDepth > 0)
|
||||
{
|
||||
TableParagraph aPending{xParaCursor, xCur, pParaContext, xParaProps};
|
||||
m_aParagraphsToEndTable.push_back(aPending);
|
||||
getTableManager().getCurrentParagraphs()->push_back(aPending);
|
||||
}
|
||||
|
||||
// hidden empty paragraph with a not hidden shape, set as not hidden
|
||||
|
||||
@@ -1058,9 +1058,6 @@ public:
|
||||
bool m_bIsActualParagraphFramed;
|
||||
std::vector<css::uno::Any> aFramedRedlines;
|
||||
|
||||
/// Table paragraph properties may need style update based on table style
|
||||
std::vector<TableParagraph> m_aParagraphsToEndTable;
|
||||
|
||||
private:
|
||||
void PushPageHeaderFooter(bool bHeader, SectionPropertyMap::PageType eType);
|
||||
// Start a new index section; if needed, finish current paragraph
|
||||
|
||||
@@ -592,6 +592,17 @@ public:
|
||||
|
||||
typedef tools::SvRef< TablePropertyMap > TablePropertyMapPtr;
|
||||
|
||||
/// Information about a paragraph to be finished after a table end.
|
||||
struct TableParagraph
|
||||
{
|
||||
css::uno::Reference<css::text::XTextRange> m_rStartParagraph;
|
||||
css::uno::Reference<css::text::XTextRange> m_rEndParagraph;
|
||||
PropertyMapPtr m_pPropertyMap;
|
||||
css::uno::Reference<css::beans::XPropertySet> m_rPropertySet;
|
||||
};
|
||||
|
||||
typedef std::shared_ptr< std::vector<TableParagraph> > TableParagraphVectorPtr;
|
||||
|
||||
} // namespace dmapper
|
||||
} // namespace writerfilter
|
||||
|
||||
|
||||
Reference in New Issue
Block a user