sw/qa/extras/ooxmlexport/data/tdf104348_contextMargin.docx |binary
 sw/qa/extras/ooxmlexport/ooxmlexport11.cxx                 |   12 +++
 writerfilter/source/dmapper/DomainMapper_Impl.cxx          |   52 ++++++++-----
 3 files changed, 45 insertions(+), 19 deletions(-)

New commits:
commit 07266e2314fd19dcbf777dadd52d7b826b23c207
Author:     Justin Luth <justin_l...@sil.org>
AuthorDate: Tue Jul 24 14:49:00 2018 +0300
Commit:     László Németh <nem...@numbertext.org>
CommitDate: Wed Aug 1 11:33:02 2018 +0200

    tdf#118521 writerfilter: ContextMargin grouped with Top/Bottom
    
    fixes tdf#104348, but tagging with the bug# of the initial fixes.
    
    Internally, EditEng holds Top/Bottom/Context settings in one
    object, so if only one piece is set, the cloned object
    starts with docDefaults, so the un-initialized parts also need to
    be specified with the values they inherit from their style.
    
    So this patch makes two corrections. The first is grouping
    ContextMargin with top/bottom. The second correction
    is to check the entire style-chain instead of only
    the direct style for the inherited property.
    
    Change-Id: Ie1d4c9538aefece4ff8b7287242c7f4d33319b3b
    Reviewed-on: https://gerrit.libreoffice.org/57914
    Tested-by: Jenkins
    Reviewed-by: Justin Luth <justin_l...@sil.org>
    Reviewed-by: László Németh <nem...@numbertext.org>

diff --git a/sw/qa/extras/ooxmlexport/data/tdf104348_contextMargin.docx 
b/sw/qa/extras/ooxmlexport/data/tdf104348_contextMargin.docx
new file mode 100644
index 000000000000..ef3d06533bb7
Binary files /dev/null and 
b/sw/qa/extras/ooxmlexport/data/tdf104348_contextMargin.docx differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx 
b/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx
index bb5d91500cb3..121c2d798ecb 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx
@@ -524,6 +524,18 @@ DECLARE_OOXMLEXPORT_TEST(testMarginsFromStyle, 
"margins_from_style.docx")
     CPPUNIT_ASSERT_EQUAL(sal_Int32(600), 
getProperty<sal_Int32>(getParagraph(3), "ParaBottomMargin"));
 }
 
+DECLARE_OOXMLEXPORT_TEST(testTdf104348_contextMargin, 
"tdf104348_contextMargin.docx")
+{
+    // tdf#104348 shows that ContextMargin belongs with Top/Bottom handling
+
+    uno::Reference<beans::XPropertySet> 
xMyStyle(getStyles("ParagraphStyles")->getByName("MyStyle"), uno::UNO_QUERY);
+    // from paragraph style - this is what direct formatting should equal
+    sal_Int32 nMargin = getProperty<sal_Int32>(xMyStyle, "ParaBottomMargin");
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nMargin);
+    // from direct formatting
+    CPPUNIT_ASSERT_EQUAL(nMargin, getProperty<sal_Int32>(getParagraph(2), 
"ParaBottomMargin"));
+}
+
 DECLARE_OOXMLEXPORT_TEST(testTdf118521_marginsLR, "tdf118521_marginsLR.docx")
 {
     // tdf#118521 paragraphs with direct formatting of only some of left, 
right, or first margins have
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx 
b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index 3a71b395acb7..c6a68079c4ab 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -1472,46 +1472,60 @@ void DomainMapper_Impl::finishParagraph( const 
PropertyMapPtr& pPropertyMap )
 
                 // tdf#118521 set paragraph top or bottom margin based on the 
paragraph style
                 // if we already set the other margin with direct formatting
-                if (pStyleSheetProperties && pParaContext && 
m_xPreviousParagraph.is() &&
-                        pParaContext->isSet(PROP_PARA_TOP_MARGIN) != 
pParaContext->isSet(PROP_PARA_BOTTOM_MARGIN))
+                if ( pParaContext && m_xPreviousParagraph.is() )
                 {
-                    boost::optional<PropertyMap::Property> oProperty;
-                    if (pParaContext->isSet(PROP_PARA_TOP_MARGIN))
+                    const bool bTopSet = 
pParaContext->isSet(PROP_PARA_TOP_MARGIN);
+                    const bool bBottomSet = 
pParaContext->isSet(PROP_PARA_BOTTOM_MARGIN);
+                    const bool bContextSet = 
pParaContext->isSet(PROP_PARA_CONTEXT_MARGIN);
+                    if ( !(bTopSet == bBottomSet && bBottomSet == bContextSet) 
)
                     {
-                        if ( (oProperty = 
pStyleSheetProperties->getProperty(PROP_PARA_BOTTOM_MARGIN)) )
-                            
m_xPreviousParagraph->setPropertyValue("ParaBottomMargin", oProperty->second);
-                    }
-                    else
-                    {
-                        if ( (oProperty = 
pStyleSheetProperties->getProperty(PROP_PARA_TOP_MARGIN)) )
-                            
m_xPreviousParagraph->setPropertyValue("ParaTopMargin", oProperty->second);
+                        if ( !bTopSet )
+                        {
+                            uno::Any aMargin = 
GetPropertyFromStyleSheet(PROP_PARA_TOP_MARGIN);
+                            if ( aMargin != uno::Any() )
+                                
m_xPreviousParagraph->setPropertyValue("ParaTopMargin", aMargin);
+                        }
+                        if ( !bBottomSet )
+                        {
+                            uno::Any aMargin = 
GetPropertyFromStyleSheet(PROP_PARA_BOTTOM_MARGIN);
+                            if ( aMargin != uno::Any() )
+                                
m_xPreviousParagraph->setPropertyValue("ParaBottomMargin", aMargin);
+                        }
+                        if ( !bContextSet )
+                        {
+                            uno::Any aMargin = 
GetPropertyFromStyleSheet(PROP_PARA_CONTEXT_MARGIN);
+                            if ( aMargin != uno::Any() )
+                                
m_xPreviousParagraph->setPropertyValue("ParaContextMargin", aMargin);
+                        }
                     }
                 }
 
                 // Left, Right, and Hanging settings are also grouped. Ensure 
that all or none are set.
                 // m_xPreviousParagraph was set earlier, so really it still is 
the current paragraph...
-                if ( pStyleSheetProperties && pParaContext && 
m_xPreviousParagraph.is() )
+                if ( pParaContext && m_xPreviousParagraph.is() )
                 {
                     const bool bLeftSet  = 
pParaContext->isSet(PROP_PARA_LEFT_MARGIN);
                     const bool bRightSet = 
pParaContext->isSet(PROP_PARA_RIGHT_MARGIN);
                     const bool bFirstSet = 
pParaContext->isSet(PROP_PARA_FIRST_LINE_INDENT);
                     if ( !(bLeftSet == bRightSet && bRightSet == bFirstSet) )
                     {
-                        boost::optional<PropertyMap::Property> oProperty;
                         if ( !bLeftSet )
                         {
-                            if ( (oProperty = 
pStyleSheetProperties->getProperty(PROP_PARA_LEFT_MARGIN)) )
-                                
m_xPreviousParagraph->setPropertyValue("ParaLeftMargin", oProperty->second);
+                            uno::Any aMargin = 
GetPropertyFromStyleSheet(PROP_PARA_LEFT_MARGIN);
+                            if ( aMargin != uno::Any() )
+                                
m_xPreviousParagraph->setPropertyValue("ParaLeftMargin", aMargin);
                         }
                         if ( !bRightSet )
                         {
-                            if ( (oProperty = 
pStyleSheetProperties->getProperty(PROP_PARA_RIGHT_MARGIN)) )
-                                
m_xPreviousParagraph->setPropertyValue("ParaRightMargin", oProperty->second);
+                            uno::Any aMargin = 
GetPropertyFromStyleSheet(PROP_PARA_RIGHT_MARGIN);
+                            if ( aMargin != uno::Any() )
+                                
m_xPreviousParagraph->setPropertyValue("ParaRightMargin", aMargin);
                         }
                         if ( !bFirstSet )
                         {
-                            if ( (oProperty = 
pStyleSheetProperties->getProperty(PROP_PARA_FIRST_LINE_INDENT)) )
-                                
m_xPreviousParagraph->setPropertyValue("ParaFirstLineIndent", 
oProperty->second);
+                            uno::Any aMargin = 
GetPropertyFromStyleSheet(PROP_PARA_FIRST_LINE_INDENT);
+                            if ( aMargin != uno::Any() )
+                                
m_xPreviousParagraph->setPropertyValue("ParaFirstLineIndent", aMargin);
                         }
                     }
                 }
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to