summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sw/qa/extras/ooxmlexport/data/tdf124491.docxbin0 -> 12794 bytes
-rw-r--r--sw/qa/extras/ooxmlexport/ooxmlexport11.cxx10
-rw-r--r--sw/source/core/doc/docredln.cxx21
-rw-r--r--writerfilter/source/dmapper/DomainMapper.cxx1
-rw-r--r--writerfilter/source/dmapper/DomainMapper_Impl.cxx7
-rw-r--r--writerfilter/source/dmapper/DomainMapper_Impl.hxx1
6 files changed, 35 insertions, 5 deletions
diff --git a/sw/qa/extras/ooxmlexport/data/tdf124491.docx b/sw/qa/extras/ooxmlexport/data/tdf124491.docx
new file mode 100644
index 000000000000..dad4d7c54ba4
--- /dev/null
+++ b/sw/qa/extras/ooxmlexport/data/tdf124491.docx
Binary files differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx
index fc933a67df9c..54e2002bd12d 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx
@@ -883,6 +883,16 @@ DECLARE_OOXMLEXPORT_EXPORTONLY_TEST(testTdf126245, "tdf126245.docx")
assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:pPr/w:pPrChange/w:pPr/w:numPr/w:numId", "val", "1");
}
+DECLARE_OOXMLEXPORT_EXPORTONLY_TEST(testTdf124491, "tdf124491.docx")
+{
+ xmlDocPtr pXmlDoc = parseExport("word/document.xml");
+ // import format change of empty lines, FIXME: change w:r with w:pPr in export
+ assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/*/w:rPr/w:rPrChange");
+ // empty line without format change
+ assertXPath(pXmlDoc, "/w:document/w:body/w:p[4]/*/w:rPrChange", 0);
+ assertXPath(pXmlDoc, "/w:document/w:body/w:p[4]/*/*/w:rPrChange", 0);
+}
+
DECLARE_OOXMLEXPORT_EXPORTONLY_TEST(testTdf105485, "tdf105485.docx")
{
xmlDocPtr pXmlDoc = parseExport("word/document.xml");
diff --git a/sw/source/core/doc/docredln.cxx b/sw/source/core/doc/docredln.cxx
index 2585b1208751..8eb527eb519f 100644
--- a/sw/source/core/doc/docredln.cxx
+++ b/sw/source/core/doc/docredln.cxx
@@ -784,12 +784,25 @@ void SwRedlineExtraData_FormatColl::Reject( SwPaM& rPam ) const
SwPaM aPam( *rPam.GetMark(), *rPam.GetPoint() );
- if ( !m_bFormatAll )
+ const SwPosition* pStt = rPam.Start(),
+ * pEnd = pStt == rPam.GetPoint() ? rPam.GetMark()
+ : rPam.GetPoint();
+
+ if ( !m_bFormatAll || pEnd->nContent == 0 )
{
// don't reject the format of the next paragraph (that is handled by the next redline)
- aPam.GetPoint()->nNode--;
- SwContentNode* pNode = aPam.GetPoint()->nNode.GetNode().GetContentNode();
- aPam.GetPoint()->nContent.Assign( pNode, pNode->Len() );
+ if (aPam.GetPoint()->nNode > aPam.GetMark()->nNode)
+ {
+ aPam.GetPoint()->nNode--;
+ SwContentNode* pNode = aPam.GetPoint()->nNode.GetNode().GetContentNode();
+ aPam.GetPoint()->nContent.Assign( pNode, pNode->Len() );
+ }
+ else if (aPam.GetPoint()->nNode < aPam.GetMark()->nNode)
+ {
+ aPam.GetMark()->nNode--;
+ SwContentNode* pNode = aPam.GetMark()->nNode.GetNode().GetContentNode();
+ aPam.GetMark()->nContent.Assign( pNode, pNode->Len() );
+ }
}
if( pColl )
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx
index 871d84735059..f2cd94906405 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -2290,6 +2290,7 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, const PropertyMapPtr& rContext )
m_pImpl->StartParaMarkerChange( );
[[fallthrough]];
case NS_ooxml::LN_CT_PPr_pPrChange:
+ case NS_ooxml::LN_CT_ParaRPr_rPrChange:
case NS_ooxml::LN_trackchange:
case NS_ooxml::LN_EG_RPrContent_rPrChange:
case NS_ooxml::LN_EG_RangeMarkupElements_customXmlDelRangeStart:
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index 79f711668a5c..ad8147a9ba6f 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -1526,6 +1526,10 @@ void DomainMapper_Impl::finishParagraph( const PropertyMapPtr& pPropertyMap, con
else
xCur->gotoEnd( false );
xCur->goLeft( 1 , true );
+ // Extend the redline ranges for empty paragraphs
+ if ( !m_bParaChanged && m_previousRedline.get() )
+ CreateRedline( xCur, m_previousRedline );
+ m_previousRedline.clear();
CheckParaMarkerRedline( xCur );
}
@@ -2215,6 +2219,7 @@ void DomainMapper_Impl::StartParaMarkerChange( )
void DomainMapper_Impl::EndParaMarkerChange( )
{
m_bIsParaMarkerChange = false;
+ m_previousRedline = m_currentRedline;
m_currentRedline.clear();
}
@@ -5844,7 +5849,7 @@ void DomainMapper_Impl::AddNewRedline( sal_uInt32 sprmId )
GetTopContextOfType( CONTEXT_CHARACTER )->Redlines().push_back( pNew );
else if( sprmId == NS_ooxml::LN_CT_PPr_pPrChange )
GetTopContextOfType( CONTEXT_PARAGRAPH )->Redlines().push_back( pNew );
- else
+ else if( sprmId != NS_ooxml::LN_CT_ParaRPr_rPrChange )
m_aRedlines.top().push_back( pNew );
}
else
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
index ec1a25bf5b17..d4e4420506d0 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
@@ -503,6 +503,7 @@ private:
std::stack< std::vector< RedlineParamsPtr > > m_aRedlines;
// The redline currently read, may be also stored by a context instead of m_aRedlines.
RedlineParamsPtr m_currentRedline;
+ RedlineParamsPtr m_previousRedline;
RedlineParamsPtr m_pParaMarkerRedline;
bool m_bIsParaMarkerChange;
// redline data of the terminating run, if it's a moveFrom deletion