sw/qa/extras/ooxmlexport/data/tdf153964_firstIndentAfterBreak14.docx |binary
 sw/qa/extras/ooxmlexport/data/tdf153964_numberingAfterBreak14.docx   |binary
 sw/qa/extras/ooxmlexport/ooxmlexport18.cxx                           |   42 
+++++++++-
 writerfilter/source/dmapper/DomainMapper.cxx                         |    3 
 writerfilter/source/dmapper/DomainMapper_Impl.cxx                    |   15 +++
 5 files changed, 56 insertions(+), 4 deletions(-)

New commits:
commit 80e8763036f36afd482a06fbf0f3ffe1ebbe2b46
Author:     Justin Luth <justin.l...@collabora.com>
AuthorDate: Tue Mar 7 20:26:22 2023 -0500
Commit:     Justin Luth <jl...@mail.com>
CommitDate: Thu Mar 9 00:33:26 2023 +0000

    tdf#153964 writerfilter: column break split should inherit most properties
    
    When a column break or page break split occurs,
    the split off paragraph should keep (most of) the properties
    of the original paragraph. This already happened for page breaks.
    
    Exceptions are first line indents, and numbering
    if there was a run to apply them to already.
    
    This commit:
    -tells lcl_startParagraph when column breaks are m_bIsParaSplit,
     resulting in the paragraph properties being copied over
    -clears the para properties that shouldn't apply twice.
    
    [Top Margin was more complicated and handled separately.]
    
    make CppunitTest_sw_ooxmlexport18 \
    CPPUNIT_TEST_NAME=testTdf153964_firstIndentAfterBreak14
    
    make CppunitTest_sw_ooxmlexport18 \
    CPPUNIT_TEST_NAME=testTdf153964_numberingAfterBreak14
    
    Change-Id: I5ecd25da831894536044c6dbffbb0a262f8b6828
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/148452
    Tested-by: Jenkins
    Reviewed-by: Justin Luth <jl...@mail.com>

diff --git 
a/sw/qa/extras/ooxmlexport/data/tdf153964_firstIndentAfterBreak14.docx 
b/sw/qa/extras/ooxmlexport/data/tdf153964_firstIndentAfterBreak14.docx
new file mode 100644
index 000000000000..696c4b4278c9
Binary files /dev/null and 
b/sw/qa/extras/ooxmlexport/data/tdf153964_firstIndentAfterBreak14.docx differ
diff --git a/sw/qa/extras/ooxmlexport/data/tdf153964_numberingAfterBreak14.docx 
b/sw/qa/extras/ooxmlexport/data/tdf153964_numberingAfterBreak14.docx
new file mode 100644
index 000000000000..a94a3c9736d7
Binary files /dev/null and 
b/sw/qa/extras/ooxmlexport/data/tdf153964_numberingAfterBreak14.docx differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport18.cxx 
b/sw/qa/extras/ooxmlexport/ooxmlexport18.cxx
index 1e87210d90f8..770ea9a89dec 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport18.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport18.cxx
@@ -216,7 +216,7 @@ 
DECLARE_OOXMLEXPORT_TEST(testTdf153964_topMarginAfterBreak14, "tdf153964_topMarg
     // The top margin was applied to paragraph 3, so it shouldn't apply here
     xPara.set(getParagraph(4, u"column break1"), uno::UNO_QUERY);
     CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(xPara, 
"ParaTopMargin"));
-    //CPPUNIT_ASSERT_EQUAL(Color(0xfbe4d5), getProperty<Color>(xPara, 
"ParaBackColor"));
+    CPPUNIT_ASSERT_EQUAL(Color(0xfbe4d5), getProperty<Color>(xPara, 
"ParaBackColor"));
 
     xPara.set(getParagraph(5, u"60 pt followed by page break"), 
uno::UNO_QUERY);
     CPPUNIT_ASSERT_EQUAL(sal_Int32(2117), getProperty<sal_Int32>(xPara, 
"ParaTopMargin"));
@@ -240,7 +240,7 @@ 
DECLARE_OOXMLEXPORT_TEST(testTdf153964_topMarginAfterBreak14, "tdf153964_topMarg
     // The top margin was not applied before the column break, so with 
compat14 it should apply here
     xPara.set(getParagraph(10, u""), uno::UNO_QUERY); // after column break
     CPPUNIT_ASSERT_EQUAL(sal_Int32(2117), getProperty<sal_Int32>(xPara, 
"ParaTopMargin"));
-    //CPPUNIT_ASSERT_EQUAL(Color(0xfff2cc), getProperty<Color>(xPara, 
"ParaBackColor"));
+    CPPUNIT_ASSERT_EQUAL(Color(0xfff2cc), getProperty<Color>(xPara, 
"ParaBackColor"));
 
     // In an odd twist, the w:br was actually at the end of the previous w:p, 
so in that case
     // we ignore the top margin definition this time.
@@ -262,7 +262,7 @@ 
DECLARE_OOXMLEXPORT_TEST(testTdf153964_topMarginAfterBreak15, "tdf153964_topMarg
     // The top margin was applied to paragraph 3, so it shouldn't apply here
     xPara.set(getParagraph(4, u"column break1"), uno::UNO_QUERY);
     CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(xPara, 
"ParaTopMargin"));
-    //CPPUNIT_ASSERT_EQUAL(Color(0xfbe4d5), getProperty<Color>(xPara, 
"ParaBackColor"));
+    CPPUNIT_ASSERT_EQUAL(Color(0xfbe4d5), getProperty<Color>(xPara, 
"ParaBackColor"));
 
     xPara.set(getParagraph(5, u"60 pt followed by page break"), 
uno::UNO_QUERY);
     CPPUNIT_ASSERT_EQUAL(sal_Int32(2117), getProperty<sal_Int32>(xPara, 
"ParaTopMargin"));
@@ -285,13 +285,47 @@ 
DECLARE_OOXMLEXPORT_TEST(testTdf153964_topMarginAfterBreak15, "tdf153964_topMarg
     // The top margin was not applied to paragraph 9, and with compat15 it 
shouldn't apply here.
     xPara.set(getParagraph(10, u""), uno::UNO_QUERY); // after column break
     CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(xPara, 
"ParaTopMargin"));
-    //CPPUNIT_ASSERT_EQUAL(Color(0xfff2cc), getProperty<Color>(xPara, 
"ParaBackColor"));
+    CPPUNIT_ASSERT_EQUAL(Color(0xfff2cc), getProperty<Color>(xPara, 
"ParaBackColor"));
 
     // The top margin was not applied to paragraph 11, and with compat15 it 
shouldn't apply here.
     xPara.set(getParagraph(12, u""), uno::UNO_QUERY); // after page break
     CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(xPara, 
"ParaTopMargin"));
 }
 
+DECLARE_OOXMLEXPORT_TEST(testTdf153964_numberingAfterBreak14, 
"tdf153964_numberingAfterBreak14.docx")
+{
+    //Numbering should only apply once in a split paragraph.
+    uno::Reference<beans::XPropertySet> xPara(getParagraph(2, "How numbering 
affected by a column break?"), uno::UNO_QUERY);
+    //CPPUNIT_ASSERT_EQUAL(OUString("1."), getProperty<OUString>(xPara, 
"ListLabelString"));
+    xPara.set(getParagraph(3, "How is numbering affected by a page break?"), 
uno::UNO_QUERY);
+    //CPPUNIT_ASSERT_EQUAL(OUString("2."), getProperty<OUString>(xPara, 
"ListLabelString"));
+    xPara.set(getParagraph(4, "x"), uno::UNO_QUERY);
+    //CPPUNIT_ASSERT_EQUAL(OUString("3."), getProperty<OUString>(xPara, 
"ListLabelString"));
+    xPara.set(getParagraph(5, "column break"), uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty<OUString>(xPara, 
"ListLabelString"));
+    xPara.set(getParagraph(6, "y"), uno::UNO_QUERY);
+    //CPPUNIT_ASSERT_EQUAL(OUString("3."), getProperty<OUString>(xPara, 
"ListLabelString"));
+    xPara.set(getParagraph(7, "page break"), uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty<OUString>(xPara, 
"ListLabelString"));
+}
+
+DECLARE_OOXMLEXPORT_TEST(testTdf153964_firstIndentAfterBreak14, 
"tdf153964_firstIndentAfterBreak14.docx")
+{
+    //First line indents should only apply once in a split paragraph.
+    uno::Reference<beans::XPropertySet> xPara(getParagraph(2, "How is first 
line indent affected by a column break?"), uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), getProperty<sal_Int32>(xPara, 
"ParaFirstLineIndent"));
+    xPara.set(getParagraph(3, "How is first line indent affected by a page 
break?"), uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), getProperty<sal_Int32>(xPara, 
"ParaFirstLineIndent"));
+    xPara.set(getParagraph(4, "x"), uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), getProperty<sal_Int32>(xPara, 
"ParaFirstLineIndent"));
+    xPara.set(getParagraph(5, "column break"), uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(xPara, 
"ParaFirstLineIndent"));
+    xPara.set(getParagraph(6, "y"), uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), getProperty<sal_Int32>(xPara, 
"ParaFirstLineIndent"));
+    xPara.set(getParagraph(7, "page break"), uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(xPara, 
"ParaFirstLineIndent"));
+}
+
 CPPUNIT_TEST_FIXTURE(Test, testTdf149551_mongolianVert)
 {
     // Given a docx document with a shape with vert="mongolianVert".
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx 
b/writerfilter/source/dmapper/DomainMapper.cxx
index e71200714e82..b7e94ff50e84 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -1124,6 +1124,7 @@ void DomainMapper::lcl_attribute(Id nName, Value & val)
                     if (m_pImpl->GetIsFirstParagraphInSection() || 
!m_pImpl->IsFirstRun())
                     {
                         mbIsSplitPara = true;
+                        m_pImpl->m_bIsSplitPara = true;
                         finishParagraph();
                         lcl_startParagraphGroup();
                     }
@@ -4164,6 +4165,7 @@ void DomainMapper::lcl_utext(const sal_uInt8 * data_, 
size_t len)
                     if ( m_pImpl->GetIsFirstParagraphInSection() || 
!m_pImpl->IsFirstRun() )
                     {
                         mbIsSplitPara = true;
+                        m_pImpl->m_bIsSplitPara = true;
                         finishParagraph();
                         lcl_startParagraphGroup();
                     }
@@ -4263,6 +4265,7 @@ void DomainMapper::lcl_utext(const sal_uInt8 * data_, 
size_t len)
                     if (m_pImpl->GetIsFirstParagraphInSection() || 
!m_pImpl->IsFirstRun() || mbWasShapeInPara)
                     {
                         mbIsSplitPara = true;
+                        m_pImpl->m_bIsSplitPara = true;
                         finishParagraph();
                         lcl_startParagraphGroup();
                     }
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx 
b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index 7e8dd6bd57c7..68f2511358b8 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -1096,6 +1096,21 @@ void    DomainMapper_Impl::PushProperties(ContextType 
eId)
     }
     if(eId == CONTEXT_PARAGRAPH && m_bIsSplitPara)
     {
+        // Some paragraph properties only apply at the beginning of the 
paragraph - apply only once.
+        if (!m_bIsFirstRun)
+        {
+            auto pParaContext = 
static_cast<ParagraphPropertyMap*>(GetTopContextOfType(eId).get());
+            pParaContext->props().SetListId(-1);
+            pParaContext->Erase(PROP_NUMBERING_RULES); // only true with 
column, not page break
+            pParaContext->Erase(PROP_NUMBERING_LEVEL);
+            pParaContext->Erase(PROP_NUMBERING_TYPE);
+            pParaContext->Erase(PROP_START_WITH);
+
+            pParaContext->Insert(PROP_PARA_TOP_MARGIN, 
uno::Any(sal_uInt32(0)));
+            pParaContext->Erase(PROP_PARA_TOP_MARGIN_BEFORE_AUTO_SPACING);
+            pParaContext->Insert(PROP_PARA_FIRST_LINE_INDENT, 
uno::Any(sal_uInt32(0)));
+        }
+
         m_aPropertyStacks[eId].push( GetTopContextOfType(eId));
         m_bIsSplitPara = false;
     }

Reply via email to