writerfilter/qa/cppunittests/dmapper/SettingsTable.cxx                |   22 
++++++++++
 writerfilter/qa/cppunittests/dmapper/data/endnote-at-section-end.docx |binary
 writerfilter/source/dmapper/PropertyMap.cxx                           |    7 
++-
 writerfilter/source/dmapper/SettingsTable.cxx                         |   13 
+++++
 writerfilter/source/dmapper/SettingsTable.hxx                         |    2 
 5 files changed, 43 insertions(+), 1 deletion(-)

New commits:
commit 812d5e98dc2a96e9b7351d19ab33031af7d90221
Author:     Miklos Vajna <vmik...@collabora.com>
AuthorDate: Tue May 28 13:26:05 2024 +0200
Commit:     Caolán McNamara <caolan.mcnam...@collabora.com>
CommitDate: Wed May 29 09:16:13 2024 +0200

    tdf#160984 sw continuous endnotes: DOCX: import <w:endnotePr> pos == sectEnd
    
    Word can have per-section endnotes, but if endnotes are collected at the
    end of the section vs document end is a per-document setting.
    
    The DOC import already handles this in wwSectionManager::InsertSection()
    when it constructs an SwFormatEndAtTextEnd with FTNEND_ATTXTEND.
    
    Fix the problem by doing the same in writerfilter: in case settings.xml
    wants at-section-end endnotes, set EndnoteIsCollectAtTextEnd to true
    when applying section properties.
    
    The export side still needs doing.
    
    (cherry picked from commit 2d2dd56e0b2dc708f1f758d7fc9a1263ff09b83c)
    
    Conflicts:
            writerfilter/source/dmapper/PropertyMap.cxx
    
    Change-Id: Ibad9c2d62a2945ee42877c849482feee60a50178
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/168179
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com>

diff --git a/writerfilter/qa/cppunittests/dmapper/SettingsTable.cxx 
b/writerfilter/qa/cppunittests/dmapper/SettingsTable.cxx
index 52814727f91c..bf7a4e48de49 100644
--- a/writerfilter/qa/cppunittests/dmapper/SettingsTable.cxx
+++ b/writerfilter/qa/cppunittests/dmapper/SettingsTable.cxx
@@ -11,6 +11,7 @@
 
 #include <com/sun/star/beans/XPropertySet.hpp>
 #include <com/sun/star/qa/XDumper.hpp>
+#include <com/sun/star/text/XTextDocument.hpp>
 
 #include <test/xmldocptr.hxx>
 
@@ -87,6 +88,27 @@ CPPUNIT_TEST_FIXTURE(Test, testAddVerticalFrameOffsetsRTF)
     // i.e. table top should be ~2748, but was less, leading to an overlap.
     CPPUNIT_ASSERT_GREATER(nFlyBottom, nTableTop);
 }
+
+CPPUNIT_TEST_FIXTURE(Test, testEndnoteAtSectionEnd)
+{
+    // Given a document with at-section-end endnotes enabled:
+    loadFromFile(u"endnote-at-section-end.docx");
+
+    // Go to the second paragraph, which is inside Word's second section:
+    uno::Reference<text::XTextDocument> xTextDocument(mxComponent, 
uno::UNO_QUERY);
+    uno::Reference<container::XEnumerationAccess> 
xParaEnumAccess(xTextDocument->getText(),
+                                                                  
uno::UNO_QUERY);
+    uno::Reference<container::XEnumeration> xParaEnum = 
xParaEnumAccess->createEnumeration();
+    xParaEnum->nextElement();
+    uno::Reference<beans::XPropertySet> xPara(xParaEnum->nextElement(), 
uno::UNO_QUERY);
+    uno::Reference<beans::XPropertySet> xSection;
+    xPara->getPropertyValue("TextSection") >>= xSection;
+    bool bEndnoteIsCollectAtTextEnd = false;
+    xSection->getPropertyValue("EndnoteIsCollectAtTextEnd") >>= 
bEndnoteIsCollectAtTextEnd;
+    // Without the accompanying fix in place, this test would have failed, 
endnotes were always at
+    // document end.
+    CPPUNIT_ASSERT(bEndnoteIsCollectAtTextEnd);
+}
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git 
a/writerfilter/qa/cppunittests/dmapper/data/endnote-at-section-end.docx 
b/writerfilter/qa/cppunittests/dmapper/data/endnote-at-section-end.docx
new file mode 100644
index 000000000000..cf61262c7d59
Binary files /dev/null and 
b/writerfilter/qa/cppunittests/dmapper/data/endnote-at-section-end.docx differ
diff --git a/writerfilter/source/dmapper/PropertyMap.cxx 
b/writerfilter/source/dmapper/PropertyMap.cxx
index 73d53a7e7c96..14299eaf7a88 100644
--- a/writerfilter/source/dmapper/PropertyMap.cxx
+++ b/writerfilter/source/dmapper/PropertyMap.cxx
@@ -749,7 +749,7 @@ void SectionPropertyMap::DontBalanceTextColumns()
     }
 }
 
-void SectionPropertyMap::ApplySectionProperties( const uno::Reference< 
beans::XPropertySet >& xSection, DomainMapper_Impl& /*rDM_Impl*/ )
+void SectionPropertyMap::ApplySectionProperties( const uno::Reference< 
beans::XPropertySet >& xSection, DomainMapper_Impl& rDM_Impl )
 {
     try
     {
@@ -758,6 +758,11 @@ void SectionPropertyMap::ApplySectionProperties( const 
uno::Reference< beans::XP
             std::optional< PropertyMap::Property > pProp = getProperty( 
PROP_WRITING_MODE );
             if ( pProp )
                 xSection->setPropertyValue( "WritingMode", pProp->second );
+
+            if (rDM_Impl.GetSettingsTable()->GetEndnoteIsCollectAtSectionEnd())
+            {
+                xSection->setPropertyValue("EndnoteIsCollectAtTextEnd", 
uno::Any(true));
+            }
         }
     }
     catch ( uno::Exception& )
diff --git a/writerfilter/source/dmapper/SettingsTable.cxx 
b/writerfilter/source/dmapper/SettingsTable.cxx
index b16846420682..604858a871f2 100644
--- a/writerfilter/source/dmapper/SettingsTable.cxx
+++ b/writerfilter/source/dmapper/SettingsTable.cxx
@@ -115,6 +115,8 @@ struct SettingsTable_Impl
     bool m_bGutterAtTop = false;
     bool m_bDoNotBreakWrappedTables = false;
     bool m_bAllowTextAfterFloatingTableBreak = false;
+    /// Endnotes at section end, not at document end.
+    bool m_bEndnoteIsCollectAtSectionEnd = false;
 
     SettingsTable_Impl() :
       m_nDefaultTabStop( 720 ) //default is 1/2 in
@@ -419,6 +421,12 @@ void SettingsTable::lcl_sprm(Sprm& rSprm)
     case NS_ooxml::LN_CT_Compat_doNotBreakWrappedTables:
         m_pImpl->m_bDoNotBreakWrappedTables = nIntValue != 0;
         break;
+    case NS_ooxml::LN_CT_EdnProps_pos:
+        if (nIntValue == NS_ooxml::LN_Value_ST_EdnPos_sectEnd)
+        {
+            m_pImpl->m_bEndnoteIsCollectAtSectionEnd = true;
+        }
+        break;
     default:
     {
 #ifdef DBG_UTIL
@@ -780,6 +788,11 @@ bool SettingsTable::GetGutterAtTop() const { return 
m_pImpl->m_bGutterAtTop; }
 
 bool SettingsTable::GetRecordChanges() const { return 
m_pImpl->m_bRecordChanges; }
 
+bool SettingsTable::GetEndnoteIsCollectAtSectionEnd() const
+{
+    return m_pImpl->m_bEndnoteIsCollectAtSectionEnd;
+}
+
 }//namespace dmapper
 } //namespace writerfilter
 
diff --git a/writerfilter/source/dmapper/SettingsTable.hxx 
b/writerfilter/source/dmapper/SettingsTable.hxx
index 471d15b7a999..83de3a62bba5 100644
--- a/writerfilter/source/dmapper/SettingsTable.hxx
+++ b/writerfilter/source/dmapper/SettingsTable.hxx
@@ -99,6 +99,8 @@ public:
 
     bool GetRecordChanges() const;
 
+    bool GetEndnoteIsCollectAtSectionEnd() const;
+
 private:
     // Properties
     virtual void lcl_attribute(Id Name, Value& val) override;

Reply via email to