sw/qa/extras/ooxmlexport/data/tdf144362.odt |binary
 sw/qa/extras/ooxmlexport/ooxmlexport9.cxx   |   26 ++++++++++++++++++++++++++
 sw/source/filter/ww8/wrtw8sty.cxx           |    8 +++-----
 sw/source/filter/ww8/wrtww8.hxx             |    2 +-
 sw/source/filter/ww8/ww8atr.cxx             |   25 +++++++++++++++++++++++++
 5 files changed, 55 insertions(+), 6 deletions(-)

New commits:
commit 67d4fe32713070be5688eef2da9377a91e2f6b81
Author:     Justin Luth <jl...@mail.com>
AuthorDate: Sat May 13 22:17:07 2023 -0400
Commit:     Justin Luth <jl...@mail.com>
CommitDate: Tue May 16 00:59:52 2023 +0200

    tdf#144362 doc/x export: different columns mean new section
    
    The situation causing this may have become more likely in 7.4.0.
    I think that tdf#149313 might have caused a regression in the
    unit test that I found that exhibited the problem,
    so I am adding another one.
    
    make CppunitTest_sw_ooxmlexport9 
CPPUNIT_TEST_NAME=testTdf97648_relativeWidth
    make CppunitTest_sw_ooxmlexport9 CPPUNIT_TEST_NAME=testTdf144362
    
    Change-Id: I8e668ac7bfb01a8704634a3e16243be7298bd1ee
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/151731
    Tested-by: Jenkins
    Reviewed-by: Justin Luth <jl...@mail.com>

diff --git a/sw/qa/extras/ooxmlexport/data/tdf144362.odt 
b/sw/qa/extras/ooxmlexport/data/tdf144362.odt
new file mode 100644
index 000000000000..9c161dbdeb7f
Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf144362.odt differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport9.cxx 
b/sw/qa/extras/ooxmlexport/ooxmlexport9.cxx
index fc4a1c9f1445..0dbad12503bf 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport9.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport9.cxx
@@ -529,6 +529,32 @@ DECLARE_OOXMLEXPORT_TEST(testTdf97648_relativeWidth, 
"tdf97648_relativeWidth.doc
         CPPUNIT_ASSERT_EQUAL(text::HoriOrientation::RIGHT, 
getProperty<sal_Int16>(getShape(3), "HoriOrient"));
         CPPUNIT_ASSERT_EQUAL(text::HoriOrientation::LEFT, 
getProperty<sal_Int16>(getShape(4), "HoriOrient"));
     }
+
+    uno::Reference<text::XTextSectionsSupplier> 
xTextSectionsSupplier(mxComponent, uno::UNO_QUERY);
+    uno::Reference<container::XIndexAccess> 
xSections(xTextSectionsSupplier->getTextSections(),
+                                                      uno::UNO_QUERY);
+
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xSections->getCount());
+
+    uno::Reference<beans::XPropertySet> xTextSection(xSections->getByIndex(2), 
uno::UNO_QUERY);
+    uno::Reference<text::XTextColumns> xTextColumns
+        = getProperty<uno::Reference<text::XTextColumns>>(xTextSection, 
"TextColumns");
+    CPPUNIT_ASSERT_EQUAL(sal_Int16(2), xTextColumns->getColumnCount());
+}
+
+DECLARE_OOXMLEXPORT_TEST(testTdf144362, "tdf144362.odt")
+{
+    uno::Reference<text::XTextSectionsSupplier> 
xTextSectionsSupplier(mxComponent, uno::UNO_QUERY);
+    uno::Reference<container::XIndexAccess> 
xSections(xTextSectionsSupplier->getTextSections(),
+                                                      uno::UNO_QUERY);
+
+    // This is difference OK: tdf#107837 extra section added on export to 
preserve balanced columns.
+    CPPUNIT_ASSERT_GREATEREQUAL(sal_Int32(2), xSections->getCount());
+
+    uno::Reference<beans::XPropertySet> xTextSection(xSections->getByIndex(1), 
uno::UNO_QUERY);
+    uno::Reference<text::XTextColumns> xTextColumns
+        = getProperty<uno::Reference<text::XTextColumns>>(xTextSection, 
"TextColumns");
+    CPPUNIT_ASSERT_EQUAL(sal_Int16(2), xTextColumns->getColumnCount());
 }
 
 
DECLARE_OOXMLEXPORT_TEST(testTdf104061_tableSectionColumns,"tdf104061_tableSectionColumns.docx")
diff --git a/sw/source/filter/ww8/wrtw8sty.cxx 
b/sw/source/filter/ww8/wrtw8sty.cxx
index 8e0bcdde91a1..cf62d9ded167 100644
--- a/sw/source/filter/ww8/wrtw8sty.cxx
+++ b/sw/source/filter/ww8/wrtw8sty.cxx
@@ -1114,10 +1114,10 @@ sal_uInt16 MSWordSections::CurrentNumberOfColumns( 
const SwDoc &rDoc ) const
     if ( m_aSects.empty() )
         return 1;
 
-    return NumberOfColumns( rDoc, m_aSects.back() );
+    return GetFormatCol(rDoc, m_aSects.back()).GetNumCols();
 }
 
-sal_uInt16 MSWordSections::NumberOfColumns( const SwDoc &rDoc, const 
WW8_SepInfo& rInfo )
+const SwFormatCol& MSWordSections::GetFormatCol(const SwDoc &rDoc, const 
WW8_SepInfo& rInfo)
 {
     const SwPageDesc* pPd = rInfo.pPageDesc;
     if ( !pPd )
@@ -1131,9 +1131,7 @@ sal_uInt16 MSWordSections::NumberOfColumns( const SwDoc 
&rDoc, const WW8_SepInfo
     if ( rInfo.pSectionFormat && 
reinterpret_cast<SwSectionFormat*>(sal_IntPtr(-1)) != rInfo.pSectionFormat )
         aSet.Put( rInfo.pSectionFormat->GetFormatAttr( RES_COL ) );
 
-    const SwFormatCol& rCol = aSet.Get( RES_COL );
-    const SwColumns& rColumns = rCol.GetColumns();
-    return rColumns.size();
+    return aSet.Get(RES_COL);
 }
 
 const WW8_SepInfo* MSWordSections::CurrentSectionInfo()
diff --git a/sw/source/filter/ww8/wrtww8.hxx b/sw/source/filter/ww8/wrtww8.hxx
index 87aa2298f0a8..7266bb8e91d4 100644
--- a/sw/source/filter/ww8/wrtww8.hxx
+++ b/sw/source/filter/ww8/wrtww8.hxx
@@ -223,7 +223,7 @@ public:
     sal_uInt16 CurrentNumberOfColumns( const SwDoc &rDoc ) const;
 
     /// Number of columns of the provided WW8_SepInfo.
-    static sal_uInt16 NumberOfColumns( const SwDoc &rDoc, const WW8_SepInfo& 
rInfo );
+    static const SwFormatCol& GetFormatCol(const SwDoc &rDoc, const 
WW8_SepInfo& rInfo);
 
     bool DocumentIsProtected() const { return mbDocumentIsProtected; }
 
diff --git a/sw/source/filter/ww8/ww8atr.cxx b/sw/source/filter/ww8/ww8atr.cxx
index 4ba85a21bbee..8d7603f2d9a7 100644
--- a/sw/source/filter/ww8/ww8atr.cxx
+++ b/sw/source/filter/ww8/ww8atr.cxx
@@ -602,6 +602,31 @@ void MSWordExportBase::OutputSectionBreaks( const 
SfxItemSet *pSet, const SwNode
                         bNewPageDesc |= SetCurrentPageDescFromNode( rNd );
                     }
                 }
+
+                // If the columns are different in LO's adjacent sections, 
create a new MS section
+                if (!bNewPageDesc && pBreak->GetBreak() == SvxBreak::PageBefore
+                    && Sections().CurrentSectionInfo())
+                {
+                    const SwSectionFormat* pSectionFormat = 
MSWordExportBase::GetSectionFormat(rNd);
+                    if (pSectionFormat)
+                    {
+                        const SwFormatCol& rNewSect = 
pSectionFormat->GetFormatAttr(RES_COL);
+                        const SwFormatCol& rPrevSect
+                            = MSWordSections::GetFormatCol(m_rDoc,
+                                                           
*Sections().CurrentSectionInfo());
+                        if (rNewSect.GetNumCols() != rPrevSect.GetNumCols()
+                            || !rNewSect.IsOrtho() || !rPrevSect.IsOrtho()
+                            || rNewSect.GetLineStyle() != 
rPrevSect.GetLineStyle()
+                            || rNewSect.GetLineWidth() != 
rPrevSect.GetLineWidth()
+                            || rNewSect.GetLineColor() != 
rPrevSect.GetLineColor()
+                            || rNewSect.GetLineHeight() != 
rPrevSect.GetLineHeight()
+                            || rNewSect.GetLineAdj() != rPrevSect.GetLineAdj())
+                        {
+                            bNewPageDesc = true;
+                        }
+                    }
+                }
+
                 if ( !bNewPageDesc )
                     AttrOutput().OutputItem( *pBreak );
             }

Reply via email to