sw/qa/extras/ooxmlexport/data/tdf142542_cancelledAutospacing.docx |binary
 sw/qa/extras/ooxmlexport/ooxmlexport11.cxx                        |   10 ++
 writerfilter/source/dmapper/DomainMapper_Impl.cxx                 |   36 
++++++----
 3 files changed, 32 insertions(+), 14 deletions(-)

New commits:
commit f4b80f4e060a68aa35a7ec678d18af989e82f055
Author:     Justin Luth <justin_l...@sil.org>
AuthorDate: Wed Aug 4 15:49:07 2021 +0200
Commit:     Justin Luth <justin_l...@sil.org>
CommitDate: Fri Aug 20 17:11:39 2021 +0200

    tdf#142542 writerfilter: allow para to cancel style autoSpacing
    
    Change-Id: I7535e7574c3ec9a108a810ba3209074d01aa96f3
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/120275
    Tested-by: Jenkins
    Reviewed-by: Justin Luth <justin_l...@sil.org>

diff --git a/sw/qa/extras/ooxmlexport/data/tdf142542_cancelledAutospacing.docx 
b/sw/qa/extras/ooxmlexport/data/tdf142542_cancelledAutospacing.docx
new file mode 100644
index 000000000000..615799fd7565
Binary files /dev/null and 
b/sw/qa/extras/ooxmlexport/data/tdf142542_cancelledAutospacing.docx differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx 
b/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx
index 92a841b826f8..de3eea4c0659 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx
@@ -546,12 +546,22 @@ 
DECLARE_OOXMLEXPORT_TEST(testTdf113258_noBeforeAutospacing, "tdf113258_noBeforeA
                          getProperty<sal_Int32>(xShape->getStart(), 
"ParaTopMargin"));
 }
 
+DECLARE_OOXMLEXPORT_TEST(testTdf142542_cancelledAutospacing, 
"tdf142542_cancelledAutospacing.docx")
+{
+    //Direct formatting disabling autoSpacing must override paragraph-style's 
autoSpacing.
+    CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), 
getProperty<sal_Int32>(getParagraph(1), "ParaTopMargin"));
+    CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), 
getProperty<sal_Int32>(getParagraph(1), "ParaBottomMargin"));
+}
+
 DECLARE_OOXMLEXPORT_EXPORTONLY_TEST(testTdf137655, "tdf137655.docx")
 {
     xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml");
     // These were 280.
     assertXPath(pXmlDoc, 
"/w:document/w:body/w:tbl/w:tr[2]/w:tc[1]/w:p[1]/w:pPr/w:spacing", "before", 
"0");
     assertXPath(pXmlDoc, 
"/w:document/w:body/w:tbl/w:tr[2]/w:tc[2]/w:p[1]/w:pPr/w:spacing", "before", 
"0");
+
+    //tdf#142542: ensure that the original beforeAutospacing = 0 is not 
changed.
+    assertXPath(pXmlDoc, 
"/w:document/w:body/w:tbl/w:tr[2]/w:tc[1]/w:p[1]/w:pPr/w:spacing", 
"beforeAutospacing", "0");
 }
 
 DECLARE_OOXMLEXPORT_TEST(testTdf120511_eatenSection, 
"tdf120511_eatenSection.docx")
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx 
b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index 9dedab0ba7da..8fffee9d32e4 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -1685,7 +1685,6 @@ void DomainMapper_Impl::finishParagraph( const 
PropertyMapPtr& pPropertyMap, con
     const bool bAllowAdjustments = 
!GetSettingsTable()->GetDoNotUseHTMLParagraphAutoSpacing();
     sal_Int32 nBeforeAutospacing = -1;
     bool bIsAutoSet = pParaContext && 
pParaContext->isSet(PROP_PARA_TOP_MARGIN_BEFORE_AUTO_SPACING);
-    bool bIsZeroAutospacingWithoutTopmargin = false;
     const bool bNoTopmargin = pParaContext && 
!pParaContext->isSet(PROP_PARA_TOP_MARGIN);
     // apply INHERITED autospacing only if top margin is not set
     if ( bIsAutoSet || bNoTopmargin )
@@ -1695,44 +1694,53 @@ void DomainMapper_Impl::finishParagraph( const 
PropertyMapPtr& pPropertyMap, con
         // (see default_spacing = -1 in processing of 
LN_CT_Spacing_beforeAutospacing)
         if ( bNoTopmargin && nBeforeAutospacing == 
ConversionHelper::convertTwipToMM100(-1) )
         {
-            nBeforeAutospacing = 0;
-            bIsZeroAutospacingWithoutTopmargin = true;
+            sal_Int32 nStyleAuto = -1;
+            
GetPropertyFromParaStyleSheet(PROP_PARA_TOP_MARGIN_BEFORE_AUTO_SPACING) >>= 
nStyleAuto;
+            if (nStyleAuto > 0)
+                nBeforeAutospacing = 0;
         }
     }
     if ( nBeforeAutospacing > -1 && pParaContext )
     {
-        if ( bAllowAdjustments && !bIsZeroAutospacingWithoutTopmargin )
+        if (bAllowAdjustments)
         {
             if ( GetIsFirstParagraphInShape() ||
                  (GetIsFirstParagraphInSection() && GetSectionContext() && 
GetSectionContext()->IsFirstSection()) ||
                  (m_bFirstParagraphInCell && m_nTableDepth > 0 && 
m_nTableDepth == m_nTableCellDepth) )
             {
-                nBeforeAutospacing = 0;
                 // export requires grabbag to match top_margin, so keep them 
in sync
-                if ( bIsAutoSet )
+                if (nBeforeAutospacing && bIsAutoSet)
                     pParaContext->Insert( 
PROP_PARA_TOP_MARGIN_BEFORE_AUTO_SPACING, uno::makeAny( sal_Int32(0) ),true, 
PARA_GRAB_BAG );
+                nBeforeAutospacing = 0;
             }
         }
-        if ( !bIsZeroAutospacingWithoutTopmargin || (m_nTableDepth > 0 && 
m_nTableDepth == m_nTableCellDepth) )
-            pParaContext->Insert(PROP_PARA_TOP_MARGIN, 
uno::makeAny(nBeforeAutospacing));
+        pParaContext->Insert(PROP_PARA_TOP_MARGIN, 
uno::makeAny(nBeforeAutospacing));
     }
 
     sal_Int32 nAfterAutospacing = -1;
     bIsAutoSet = pParaContext && 
pParaContext->isSet(PROP_PARA_BOTTOM_MARGIN_AFTER_AUTO_SPACING);
-    bool bApplyAutospacing = bIsAutoSet || (pParaContext && 
!pParaContext->isSet(PROP_PARA_BOTTOM_MARGIN));
-    if ( bApplyAutospacing )
+    const bool bNoBottomMargin = pParaContext && 
!pParaContext->isSet(PROP_PARA_BOTTOM_MARGIN);
+    bool bAppliedBottomAutospacing = false;
+    if (bIsAutoSet || bNoBottomMargin)
+    {
         GetAnyProperty(PROP_PARA_BOTTOM_MARGIN_AFTER_AUTO_SPACING, 
pPropertyMap) >>= nAfterAutospacing;
+        if (bNoBottomMargin && nAfterAutospacing == 
ConversionHelper::convertTwipToMM100(-1))
+        {
+            sal_Int32 nStyleAuto = -1;
+            
GetPropertyFromParaStyleSheet(PROP_PARA_BOTTOM_MARGIN_AFTER_AUTO_SPACING) >>= 
nStyleAuto;
+            if (nStyleAuto > 0)
+                nAfterAutospacing = 0;
+        }
+    }
     if ( nAfterAutospacing > -1 && pParaContext )
     {
         pParaContext->Insert(PROP_PARA_BOTTOM_MARGIN, 
uno::makeAny(nAfterAutospacing));
-        bApplyAutospacing = bAllowAdjustments;
+        bAppliedBottomAutospacing = bAllowAdjustments;
     }
-    else
-        bApplyAutospacing = false;
 
     // tell TableManager to reset the bottom margin if it determines that this 
is the cell's last paragraph.
     if ( hasTableManager() && getTableManager().isInCell() )
-        getTableManager().setCellLastParaAfterAutospacing( bApplyAutospacing );
+        
getTableManager().setCellLastParaAfterAutospacing(bAppliedBottomAutospacing);
 
     if (xTextAppend.is() && pParaContext && hasTableManager() && 
!getTableManager().isIgnore())
     {

Reply via email to