sw/qa/extras/layout/data/section-nested-with-pagebreaks.fodt |  148 +++++++++
 sw/qa/extras/layout/layout3.cxx                              |  172 +++++++++++
 sw/source/core/docnode/section.cxx                           |    4 
 sw/source/core/layout/sectfrm.cxx                            |   15 
 4 files changed, 334 insertions(+), 5 deletions(-)

New commits:
commit 52e70497cee284fc0d933a7c6df9565cff1def0e
Author:     Michael Stahl <[email protected]>
AuthorDate: Wed Nov 20 19:30:54 2024 +0100
Commit:     Michael Stahl <[email protected]>
CommitDate: Thu Nov 21 17:41:31 2024 +0100

    sw: fix hiding/unhiding section via condition
    
    The problem was that when un-hiding a section, table rows that contained
    only empty paragraphs were not reformatted and remained at height 0.
    
    It turns out that the table row that became visible did so because the
    cells had a VertOrientation different from NONE and so
    SwContentNotify::ImplDestroy() invalidated the cells' printarea.
    
    However, the real problem isn't in the layout code at all, as it then
    turns out that the reason why anything is reformatted at all is that
    there are docinfo fields on the same page as the section and also in the
    paragraphs at the start of the section, and these get invalidated
    somehow after unhiding the section.
    
    Unhiding the section didn't actually invalidate anything in the layout
    because in ImplSetHiddenFlag() no change is detected, and that is
    because the section was first hidden by removing its (false) condition,
    which calls SwSection::SetSectionData() and that didn't call
    ImplSetHiddenFlag(), again relying on docinfo field update to trigger
    the relayouting.
    
    Change-Id: Ie5d9e4d5a0467c17c662f20f8d54aa6b22b382da
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/176914
    Tested-by: Jenkins
    Reviewed-by: Michael Stahl <[email protected]>
    (cherry picked from commit fbfbd2f51ebc5ab239d06ded7931214b1c84a5fd)

diff --git a/sw/source/core/docnode/section.cxx 
b/sw/source/core/docnode/section.cxx
index f80b0a624252..5eef834a7728 100644
--- a/sw/source/core/docnode/section.cxx
+++ b/sw/source/core/docnode/section.cxx
@@ -263,12 +263,14 @@ SwSection::~SwSection()
 void SwSection::SetSectionData(SwSectionData const& rData)
 {
     bool const bOldHidden( m_Data.IsHidden() );
+    bool const bOldCondHidden{m_Data.IsCondHidden()};
     m_Data = rData;
     // The next two may actually overwrite the m_Data.m_bProtect or 
EditInReadonly Flag
     // in Modify, which should result in same flag value as the old code!
     SetProtect(m_Data.IsProtectFlag());
     SetEditInReadonly(m_Data.IsEditInReadonlyFlag());
-    if (bOldHidden != m_Data.IsHidden()) // check if changed...
+    if (bOldHidden != m_Data.IsHidden()
+        || bOldCondHidden != m_Data.IsCondHidden()) // check if changed...
     {
         ImplSetHiddenFlag(m_Data.IsHidden(), m_Data.IsCondHidden());
     }
commit ab9c2c59d4f99c18e537c3e752a11a978f0955bd
Author:     Michael Stahl <[email protected]>
AuthorDate: Tue Nov 19 13:54:50 2024 +0100
Commit:     Michael Stahl <[email protected]>
CommitDate: Thu Nov 21 17:05:03 2024 +0100

    sw: layout: fix unhiding section containing multiple page breaks
    
    With multiple page breaks in a hidden section, the following frames were
    only moved on the first break, and with the second break the frames go
    out of order in SwSectionFrame::SwClientNotify().
    
    Also handle multiple columns there.
    
    (regression from commit a97e245ba11598050e1800fde9ace796d20e9df2)
    
    Change-Id: I4120e72bf083f3bed75f9305fbd757efd55f0b3d
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/176773
    Tested-by: Jenkins
    Reviewed-by: Michael Stahl <[email protected]>
    (cherry picked from commit 483a3db5204f36798811da8c36641be03104be63)

diff --git a/sw/qa/extras/layout/data/section-nested-with-pagebreaks.fodt 
b/sw/qa/extras/layout/data/section-nested-with-pagebreaks.fodt
new file mode 100644
index 000000000000..0ff4be45f1ee
--- /dev/null
+++ b/sw/qa/extras/layout/data/section-nested-with-pagebreaks.fodt
@@ -0,0 +1,148 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<office:document xmlns:officeooo="http://openoffice.org/2009/office"; 
xmlns:css3t="http://www.w3.org/TR/css3-text/"; 
xmlns:grddl="http://www.w3.org/2003/g/data-view#"; 
xmlns:xhtml="http://www.w3.org/1999/xhtml"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xmlns:xsd="http://www.w3.org/2001/XMLSchema"; 
xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" 
xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" 
xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" 
xmlns:rpt="http://openoffice.org/2005/report"; 
xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" 
xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" 
xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" 
xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" 
xmlns:xlink="http://www.w3.org/1999/xlink"; 
xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" 
xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" 
xmlns:dc="http://purl.org/dc/eleme
 nts/1.1/" xmlns:ooo="http://openoffice.org/2004/office"; 
xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" 
xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0"
 
xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0"
 xmlns:drawooo="http://openoffice.org/2010/draw"; 
xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" 
xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" 
xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" 
xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" 
xmlns:ooow="http://openoffice.org/2004/writer"; 
xmlns:oooc="http://openoffice.org/2004/calc"; 
xmlns:tableooo="http://openoffice.org/2009/table"; 
xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0"
 xmlns:math="http://www.w3.org/1998/Math/MathML"; 
xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" 
xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0
 " xmlns:dom="http://www.w3.org/2001/xml-events"; 
xmlns:xforms="http://www.w3.org/2002/xforms"; office:version="1.2" 
office:mimetype="application/vnd.oasis.opendocument.text">
+ 
<office:meta><meta:creation-date>2024-11-20T20:04:29.295860296</meta:creation-date><dc:date>2024-11-20T20:57:42.826429164</dc:date><meta:editing-duration>PT7M57S</meta:editing-duration><meta:editing-cycles>6</meta:editing-cycles><meta:generator>CIB_OfficeDev/6.4.0.29$Linux_X86_64
 
LibreOffice_project/5374b230ff33d77a7f81d56046759f218a160036</meta:generator><meta:document-statistic
 meta:table-count="0" meta:image-count="0" meta:object-count="0" 
meta:page-count="4" meta:paragraph-count="11" meta:word-count="20" 
meta:character-count="89" 
meta:non-whitespace-character-count="80"/></office:meta>
+ <office:font-face-decls>
+  <style:font-face style:name="Liberation Serif" svg:font-family="'Liberation 
Serif'" style:font-family-generic="roman" style:font-pitch="variable"/>
+  <style:font-face style:name="Lucida Sans" svg:font-family="'Lucida Sans'" 
style:font-family-generic="system" style:font-pitch="variable"/>
+  <style:font-face style:name="Noto Serif CJK SC" svg:font-family="'Noto Serif 
CJK SC'" style:font-family-generic="system" style:font-pitch="variable"/>
+ </office:font-face-decls>
+ <office:styles>
+  <style:default-style style:family="graphic">
+   <style:graphic-properties svg:stroke-color="#3465a4" 
draw:fill-color="#729fcf" fo:wrap-option="no-wrap" draw:shadow-offset-x="0.3cm" 
draw:shadow-offset-y="0.3cm" draw:start-line-spacing-horizontal="0.283cm" 
draw:start-line-spacing-vertical="0.283cm" 
draw:end-line-spacing-horizontal="0.283cm" 
draw:end-line-spacing-vertical="0.283cm" style:flow-with-text="false"/>
+   <style:paragraph-properties style:text-autospace="ideograph-alpha" 
style:line-break="strict" style:font-independent-line-spacing="false">
+    <style:tab-stops/>
+   </style:paragraph-properties>
+   <style:text-properties style:use-window-font-color="true" 
style:font-name="Liberation Serif" fo:font-size="12pt" fo:language="de" 
fo:country="DE" style:letter-kerning="true" style:font-name-asian="Noto Serif 
CJK SC" style:font-size-asian="10.5pt" style:language-asian="zh" 
style:country-asian="CN" style:font-name-complex="Lucida Sans" 
style:font-size-complex="12pt" style:language-complex="hi" 
style:country-complex="IN"/>
+  </style:default-style>
+  <style:default-style style:family="paragraph">
+   <style:paragraph-properties fo:orphans="2" fo:widows="2" 
fo:hyphenation-ladder-count="no-limit" style:text-autospace="ideograph-alpha" 
style:punctuation-wrap="hanging" style:line-break="strict" 
style:tab-stop-distance="1.251cm" style:writing-mode="page"/>
+   <style:text-properties style:use-window-font-color="true" 
style:font-name="Liberation Serif" fo:font-size="12pt" fo:language="de" 
fo:country="DE" style:letter-kerning="true" style:font-name-asian="Noto Serif 
CJK SC" style:font-size-asian="10.5pt" style:language-asian="zh" 
style:country-asian="CN" style:font-name-complex="Lucida Sans" 
style:font-size-complex="12pt" style:language-complex="hi" 
style:country-complex="IN" fo:hyphenate="false" 
fo:hyphenation-remain-char-count="2" fo:hyphenation-push-char-count="2" 
loext:hyphenation-no-caps="false"/>
+  </style:default-style>
+  <style:default-style style:family="table">
+   <style:table-properties table:border-model="collapsing"/>
+  </style:default-style>
+  <style:default-style style:family="table-row">
+   <style:table-row-properties fo:keep-together="auto"/>
+  </style:default-style>
+  <style:style style:name="Standard" style:family="paragraph" 
style:class="text"/>
+  <text:outline-style style:name="Outline">
+   <text:outline-level-style text:level="1" style:num-format="">
+    <style:list-level-properties 
text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="2" style:num-format="">
+    <style:list-level-properties 
text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="3" style:num-format="">
+    <style:list-level-properties 
text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="4" style:num-format="">
+    <style:list-level-properties 
text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="5" style:num-format="">
+    <style:list-level-properties 
text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="6" style:num-format="">
+    <style:list-level-properties 
text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="7" style:num-format="">
+    <style:list-level-properties 
text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="8" style:num-format="">
+    <style:list-level-properties 
text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="9" style:num-format="">
+    <style:list-level-properties 
text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="10" style:num-format="">
+    <style:list-level-properties 
text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+  </text:outline-style>
+  <text:notes-configuration text:note-class="footnote" style:num-format="1" 
text:start-value="0" text:footnotes-position="page" 
text:start-numbering-at="document"/>
+  <text:notes-configuration text:note-class="endnote" style:num-format="i" 
text:start-value="0"/>
+  <text:linenumbering-configuration text:number-lines="false" 
text:offset="0.499cm" style:num-format="1" text:number-position="left" 
text:increment="5"/>
+ </office:styles>
+ <office:automatic-styles>
+  <style:style style:name="P1" style:family="paragraph" 
style:parent-style-name="Standard">
+   <style:text-properties/>
+  </style:style>
+  <style:style style:name="P6" style:family="paragraph" 
style:parent-style-name="Standard">
+   <style:paragraph-properties fo:break-before="page"/>
+   <style:text-properties/>
+  </style:style>
+  <style:style style:name="P9" style:family="paragraph" 
style:parent-style-name="Standard" style:master-page-name="">
+   <style:paragraph-properties style:page-number="auto" fo:break-before="auto" 
fo:break-after="auto"/>
+   <style:text-properties/>
+  </style:style>
+  <style:style style:name="Sect1" style:family="section">
+   <style:section-properties fo:background-color="#81d41a" 
text:dont-balance-text-columns="false" style:editable="false">
+    <style:columns fo:column-count="1" fo:column-gap="0cm"/>
+    <style:background-image/>
+   </style:section-properties>
+  </style:style>
+  <style:style style:name="Sect2" style:family="section">
+   <style:section-properties fo:background-color="#158466" 
text:dont-balance-text-columns="false" style:editable="false">
+    <style:columns fo:column-count="2" fo:column-gap="0cm">
+     <style:column style:rel-width="32767*" fo:start-indent="0cm" 
fo:end-indent="0cm"/>
+     <style:column style:rel-width="32768*" fo:start-indent="0cm" 
fo:end-indent="0cm"/>
+    </style:columns>
+    <style:background-image/>
+   </style:section-properties>
+  </style:style>
+  <style:page-layout style:name="pm1">
+   <style:page-layout-properties fo:page-width="21.001cm" 
fo:page-height="29.7cm" style:num-format="1" style:print-orientation="portrait" 
fo:margin-top="2cm" fo:margin-bottom="2cm" fo:margin-left="2cm" 
fo:margin-right="2cm" style:writing-mode="lr-tb" 
style:layout-grid-color="#c0c0c0" style:layout-grid-lines="20" 
style:layout-grid-base-height="0.706cm" style:layout-grid-ruby-height="0.353cm" 
style:layout-grid-mode="none" style:layout-grid-ruby-below="false" 
style:layout-grid-print="false" style:layout-grid-display="false" 
style:footnote-max-height="0cm">
+    <style:footnote-sep style:width="0.018cm" 
style:distance-before-sep="0.101cm" style:distance-after-sep="0.101cm" 
style:line-style="solid" style:adjustment="left" style:rel-width="25%" 
style:color="#000000"/>
+   </style:page-layout-properties>
+   <style:header-style/>
+   <style:footer-style/>
+  </style:page-layout>
+ </office:automatic-styles>
+ <office:master-styles>
+  <style:master-page style:name="Standard" style:page-layout-name="pm1"/>
+ </office:master-styles>
+ <office:body>
+  <office:text text:use-soft-page-breaks="true">
+   <text:sequence-decls>
+    <text:sequence-decl text:display-outline-level="0" 
text:name="Illustration"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Table"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Text"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Drawing"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Figure"/>
+   </text:sequence-decls>
+   <text:p text:style-name="P1">Text before outer section</text:p>
+   <text:section text:style-name="Sect1" text:name="Section1">
+    <text:p text:style-name="P1">1</text:p>
+    <text:p text:style-name="P1">2</text:p>
+    <text:p text:style-name="P6">3</text:p>
+    <text:p text:style-name="P6">4</text:p>
+    <text:section text:style-name="Sect2" text:name="Section2">
+     <text:p text:style-name="P9">5</text:p>
+     <text:p text:style-name="P1">6</text:p>
+     <text:p text:style-name="P6">7</text:p>
+     <text:p text:style-name="P1">8</text:p>
+    </text:section>
+    <text:p text:style-name="P1">Text following inner section</text:p>
+   </text:section>
+   <text:p text:style-name="P1">Text following outer section</text:p>
+  </office:text>
+ </office:body>
+</office:document>
diff --git a/sw/qa/extras/layout/layout3.cxx b/sw/qa/extras/layout/layout3.cxx
index a69a29955fab..7a3520fb9d7c 100644
--- a/sw/qa/extras/layout/layout3.cxx
+++ b/sw/qa/extras/layout/layout3.cxx
@@ -153,6 +153,178 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf119875)
     CPPUNIT_ASSERT_LESS(S14Top.toInt32(), S11Top.toInt32());
 }
 
+CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, 
testSectionPageBreaksWithNestedSectionWithColumns)
+{
+    createDoc("section-nested-with-pagebreaks.fodt");
+
+    uno::Reference<css::text::XTextSectionsSupplier> 
xTextSectionsSupplier(mxComponent, uno::UNO_QUERY_THROW);
+    auto xSections = xTextSectionsSupplier->getTextSections();
+    CPPUNIT_ASSERT(xSections);
+    uno::Reference<css::beans::XPropertySet> 
xSection1(xSections->getByName("Section1"), uno::UNO_QUERY_THROW);
+    uno::Reference<css::beans::XPropertySet> 
xSection2(xSections->getByName("Section2"), uno::UNO_QUERY_THROW);
+    CPPUNIT_ASSERT(getProperty<bool>(xSection1, "IsVisible"));
+    CPPUNIT_ASSERT(getProperty<bool>(xSection2, "IsVisible"));
+
+    {
+        xmlDocPtr pXmlDoc = parseLayoutDump();
+        assertXPath(pXmlDoc, "/root/page[1]/body/section", 1);
+        assertXPath(pXmlDoc, "/root/page[1]/body/section[1]/txt", 2);
+        assertXPath(pXmlDoc, "/root/page[2]/body/section", 1);
+        assertXPath(pXmlDoc, "/root/page[2]/body/section[1]/txt", 1);
+        assertXPath(pXmlDoc, "/root/page[2]/body/section[1]/txt/LineBreak",
+                    "Line", "3");
+        assertXPath(pXmlDoc, "/root/page[3]/body/section", 2);
+        assertXPath(pXmlDoc, "/root/page[3]/body/section[1]/txt", 1);
+        assertXPath(pXmlDoc, "/root/page[3]/body/section[1]/txt/LineBreak",
+                    "Line", "4");
+        assertXPath(pXmlDoc, "/root/page[3]/body/section[2]/column", 2);
+        assertXPath(pXmlDoc, "/root/page[3]/body/section[2]/column/body/txt", 
2);
+        assertXPath(pXmlDoc,
+                    
"/root/page[3]/body/section[2]/column/body/txt[2]/LineBreak",
+                    "Line", "6");
+        assertXPath(pXmlDoc, "/root/page[4]/body/section", 2);
+        assertXPath(pXmlDoc, "/root/page[4]/body/section[1]/column/body/txt", 
2);
+        assertXPath(pXmlDoc, "/root/page[4]/body/section[1]/column/body/txt", 
2);
+        assertXPath(
+            pXmlDoc,
+            "/root/page[4]/body/section[1]/column[1]/body/txt[1]/LineBreak",
+            "Line", "7");
+        assertXPath(
+            pXmlDoc,
+            "/root/page[4]/body/section[1]/column[2]/body/txt[1]/LineBreak",
+            "Line", "8");
+        assertXPath(pXmlDoc, "/root/page[4]/body/section[2]/txt", 1);
+        assertXPath(pXmlDoc, "/root/page[4]/body/section[2]/txt/LineBreak",
+                    "Line", "Text following inner section");
+        assertXPath(pXmlDoc, "/root/page[4]/body/txt[1]/LineBreak", "Line",
+                    "Text following outer section");
+        discardDumpedLayout();
+    }
+
+    xSection1->setPropertyValue("IsVisible", css::uno::Any(false));
+    Scheduler::ProcessEventsToIdle();
+
+    {
+        xmlDocPtr pXmlDoc = parseLayoutDump();
+        assertXPath(pXmlDoc, "/root/page[1]/body/txt", 2);
+        assertXPath(pXmlDoc, "/root/page[1]/body/section", 3);
+        assertXPath(pXmlDoc, "/root/page[1]/body/section[1]/txt", 4);
+        assertXPath(pXmlDoc, "/root/page[1]/body/section[2]/column", 2);
+        assertXPath(pXmlDoc, "/root/page[1]/body/section[2]/column/body/txt", 
4);
+        assertXPath(pXmlDoc, "/root/page[1]/body/section[3]/txt", 1);
+        assertXPath(pXmlDoc, "/root/page[1]/body/section[1]/infos/bounds", 
"height", "0");
+        assertXPath(pXmlDoc, "/root/page[1]/body/section[2]/infos/bounds", 
"height", "0");
+        assertXPath(pXmlDoc, "/root/page[1]/body/section[3]/infos/bounds", 
"height", "0");
+        assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/LineBreak", "Line",
+                    "Text following outer section");
+        discardDumpedLayout();
+    }
+
+    xSection1->setPropertyValue("IsVisible", css::uno::Any(true));
+    Scheduler::ProcessEventsToIdle();
+
+    {
+        xmlDocPtr pXmlDoc = parseLayoutDump();
+        assertXPath(pXmlDoc, "/root/page[1]/body/section", 1);
+        assertXPath(pXmlDoc, "/root/page[1]/body/section[1]/txt", 2);
+        assertXPath(pXmlDoc, "/root/page[2]/body/section", 1);
+        assertXPath(pXmlDoc, "/root/page[2]/body/section[1]/txt", 1);
+        assertXPath(pXmlDoc, "/root/page[2]/body/section[1]/txt/LineBreak",
+                    "Line", "3");
+        assertXPath(pXmlDoc, "/root/page[3]/body/section", 2);
+        assertXPath(pXmlDoc, "/root/page[3]/body/section[1]/txt", 1);
+        assertXPath(pXmlDoc, "/root/page[3]/body/section[1]/txt/LineBreak",
+                    "Line", "4");
+        assertXPath(pXmlDoc, "/root/page[3]/body/section[2]/column", 2);
+        assertXPath(pXmlDoc, "/root/page[3]/body/section[2]/column/body/txt", 
2);
+        assertXPath(pXmlDoc,
+                    
"/root/page[3]/body/section[2]/column/body/txt[2]/LineBreak",
+                    "Line", "6");
+        assertXPath(pXmlDoc, "/root/page[4]/body/section", 2);
+        assertXPath(pXmlDoc, "/root/page[4]/body/section[1]/column/body/txt", 
2);
+        assertXPath(pXmlDoc, "/root/page[4]/body/section[1]/column/body/txt", 
2);
+        assertXPath(
+            pXmlDoc,
+            "/root/page[4]/body/section[1]/column[1]/body/txt[1]/LineBreak",
+            "Line", "7");
+        assertXPath(
+            pXmlDoc,
+            "/root/page[4]/body/section[1]/column[2]/body/txt[1]/LineBreak",
+            "Line", "8");
+        assertXPath(pXmlDoc, "/root/page[4]/body/section[2]/txt", 1);
+        assertXPath(pXmlDoc, "/root/page[4]/body/section[2]/txt/LineBreak",
+                    "Line", "Text following inner section");
+        assertXPath(pXmlDoc, "/root/page[4]/body/txt[1]/LineBreak", "Line",
+                    "Text following outer section");
+        discardDumpedLayout();
+    }
+
+    xSection2->setPropertyValue("IsVisible", css::uno::Any(false));
+    Scheduler::ProcessEventsToIdle();
+
+    {
+        xmlDocPtr pXmlDoc = parseLayoutDump();
+        assertXPath(pXmlDoc, "/root/page[1]/body/section", 1);
+        assertXPath(pXmlDoc, "/root/page[1]/body/section[1]/txt", 2);
+        assertXPath(pXmlDoc, "/root/page[2]/body/section", 1);
+        assertXPath(pXmlDoc, "/root/page[2]/body/section[1]/txt", 1);
+        assertXPath(pXmlDoc, "/root/page[2]/body/section[1]/txt/LineBreak",
+                    "Line", "3");
+        assertXPath(pXmlDoc, "/root/page[3]/body/section", 3);
+        assertXPath(pXmlDoc, "/root/page[3]/body/section[1]/txt", 1);
+        assertXPath(pXmlDoc, "/root/page[3]/body/section[1]/txt/LineBreak",
+                    "Line", "4");
+        assertXPath(pXmlDoc, "/root/page[3]/body/section[2]/column", 2);
+        assertXPath(pXmlDoc, "/root/page[3]/body/section[2]/column/body/txt", 
4);
+        assertXPath(pXmlDoc, "/root/page[3]/body/section[2]/infos/bounds", 
"height", "0");
+        assertXPath(pXmlDoc, "/root/page[3]/body/section[3]/txt", 1);
+        assertXPath(pXmlDoc, "/root/page[3]/body/section[3]/txt/LineBreak",
+                    "Line", "Text following inner section");
+        assertXPath(pXmlDoc, "/root/page[3]/body/txt[1]/LineBreak", "Line",
+                    "Text following outer section");
+        discardDumpedLayout();
+    }
+
+    xSection2->setPropertyValue("IsVisible", css::uno::Any(true));
+    Scheduler::ProcessEventsToIdle();
+
+    {
+        xmlDocPtr pXmlDoc = parseLayoutDump();
+        assertXPath(pXmlDoc, "/root/page[1]/body/section", 1);
+        assertXPath(pXmlDoc, "/root/page[1]/body/section[1]/txt", 2);
+        assertXPath(pXmlDoc, "/root/page[2]/body/section", 1);
+        assertXPath(pXmlDoc, "/root/page[2]/body/section[1]/txt", 1);
+        assertXPath(pXmlDoc, "/root/page[2]/body/section[1]/txt/LineBreak",
+                    "Line", "3");
+        assertXPath(pXmlDoc, "/root/page[3]/body/section", 2);
+        assertXPath(pXmlDoc, "/root/page[3]/body/section[1]/txt", 1);
+        assertXPath(pXmlDoc, "/root/page[3]/body/section[1]/txt/LineBreak",
+                    "Line", "4");
+        assertXPath(pXmlDoc, "/root/page[3]/body/section[2]/column", 2);
+        assertXPath(pXmlDoc, "/root/page[3]/body/section[2]/column/body/txt", 
2);
+        assertXPath(pXmlDoc,
+                    
"/root/page[3]/body/section[2]/column/body/txt[2]/LineBreak",
+                    "Line", "6");
+        assertXPath(pXmlDoc, "/root/page[4]/body/section", 2);
+        assertXPath(pXmlDoc, "/root/page[4]/body/section[1]/column/body/txt", 
2);
+        assertXPath(pXmlDoc, "/root/page[4]/body/section[1]/column/body/txt", 
2);
+        assertXPath(
+            pXmlDoc,
+            "/root/page[4]/body/section[1]/column[1]/body/txt[1]/LineBreak",
+            "Line", "7");
+        assertXPath(
+            pXmlDoc,
+            "/root/page[4]/body/section[1]/column[2]/body/txt[1]/LineBreak",
+            "Line", "8");
+        assertXPath(pXmlDoc, "/root/page[4]/body/section[2]/txt", 1);
+        assertXPath(pXmlDoc, "/root/page[4]/body/section[2]/txt/LineBreak",
+                    "Line", "Text following inner section");
+        assertXPath(pXmlDoc, "/root/page[4]/body/txt[1]/LineBreak", "Line",
+                    "Text following outer section");
+        discardDumpedLayout();
+    }
+}
+
 CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf120287)
 {
     createDoc("tdf120287.fodt");
diff --git a/sw/source/core/layout/sectfrm.cxx 
b/sw/source/core/layout/sectfrm.cxx
index c3f761431d49..96fe04aa89b0 100644
--- a/sw/source/core/layout/sectfrm.cxx
+++ b/sw/source/core/layout/sectfrm.cxx
@@ -2759,16 +2759,19 @@ void SwSectionFrame::Modify( const SfxPoolItem* pOld, 
const SfxPoolItem * pNew )
                     }
                     else
                     {
-                        if (GetNext())
+                        if (pFollow->GetNext())
                         {
-                            assert(GetNext()->IsFlowFrame());
-                            
SwFlowFrame::CastFlowFrame(GetNext())->MoveSubTree(pLay, nullptr);
+                            assert(pFollow->GetNext()->IsFlowFrame());
+                            
SwFlowFrame::CastFlowFrame(pFollow->GetNext())->MoveSubTree(pLay, nullptr);
                         }
                         pFollow = new SwSectionFrame(*pFollow, false);
                         SimpleFormat();
                         pFollow->InsertBehind(pLay, nullptr);
                         pFollow->Init();
-                        
SwFlowFrame::CastFlowFrame(pLowerFrame)->MoveSubTree(pFollow, nullptr);
+                        SwLayoutFrame *const pTarget{pColumn
+                            ? 
static_cast<SwLayoutFrame*>(static_cast<SwLayoutFrame*>(pFollow->Lower())->Lower())
+                            : pFollow};
+                        
SwFlowFrame::CastFlowFrame(pLowerFrame)->MoveSubTree(pTarget, nullptr);
                     }
                 }
             }
commit 4335abe5888dbe79f19199a9ffc5c9990ac5a2c5
Author:     Michael Stahl <[email protected]>
AuthorDate: Mon Nov 18 19:51:52 2024 +0100
Commit:     Michael Stahl <[email protected]>
CommitDate: Thu Nov 21 15:46:02 2024 +0100

    sw: layout: fix crash in SwSectionFrame::MakeAll()
    
    sectfrm.cxx:854: Assertion `moveBackPos == &GetPrecede()->GetFrame()' 
failed.
    
    Because the section has columns, and GetPrevSctLeaf() apparently returns
    the body frame in a column.
    
    (regression from commit c60ad7e0fbf3cc86af167f5e98b38c25620ada7e)
    
    Change-Id: I16fcd7a42b24e54873cde0aa0087c7aa56b0a8e5
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/176738
    Tested-by: Jenkins
    Reviewed-by: Michael Stahl <[email protected]>
    (cherry picked from commit e8c59414016a2f28ab9e15002e2c36b5a714924e)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/176913
    Reviewed-by: Mike Kaganski <[email protected]>
    (cherry picked from commit c4a61409da7a21397a8913ccbae3613175a54075)

diff --git a/sw/source/core/layout/sectfrm.cxx 
b/sw/source/core/layout/sectfrm.cxx
index c4b0a8674cb3..c3f761431d49 100644
--- a/sw/source/core/layout/sectfrm.cxx
+++ b/sw/source/core/layout/sectfrm.cxx
@@ -818,6 +818,10 @@ void SwSectionFrame::MakeAll(vcl::RenderContext* 
pRenderContext)
         // appropriately; then drop the temporary, if needed.
         if (SwLayoutFrame* moveBackPos = GetPrevSctLeaf())
         {
+            if (moveBackPos->IsColBodyFrame())
+            {
+                moveBackPos = moveBackPos->GetUpper()->GetUpper();
+            }
             SwLayoutFrame* newUpper = moveBackPos;
             SwFrame* newSibling = nullptr;
             const bool temporaryMasterCreated = IsFollow();

Reply via email to