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 | 11 4 files changed, 330 insertions(+), 5 deletions(-)
New commits: commit d5c8d611b8c17841b01b6d093e0a33ebdc66b776 Author: Michael Stahl <[email protected]> AuthorDate: Wed Nov 20 19:30:54 2024 +0100 Commit: Thorsten Behrens <[email protected]> CommitDate: Sun Nov 24 01:00:19 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) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/176937 Reviewed-by: Thorsten Behrens <[email protected]> diff --git a/sw/source/core/docnode/section.cxx b/sw/source/core/docnode/section.cxx index 9dcb637d2cea..0e86d201ebea 100644 --- a/sw/source/core/docnode/section.cxx +++ b/sw/source/core/docnode/section.cxx @@ -254,12 +254,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 8b74228dcf872b7cebd33f223d61006ef21eee75 Author: Michael Stahl <[email protected]> AuthorDate: Tue Nov 19 13:54:50 2024 +0100 Commit: Thorsten Behrens <[email protected]> CommitDate: Sun Nov 24 01:00:07 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) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/176936 Reviewed-by: Thorsten Behrens <[email protected]> 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 59d29ff7d574..76193ed031fd 100644 --- a/sw/qa/extras/layout/layout3.cxx +++ b/sw/qa/extras/layout/layout3.cxx @@ -122,6 +122,178 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf119875) CPPUNIT_ASSERT_LESS(S14Top.toInt32(), S11Top.toInt32()); } +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testSectionPageBreaksWithNestedSectionWithColumns) +{ + createSwDoc("section-nested-with-pagebreaks.fodt"); + + auto xTextSectionsSupplier = mxComponent.queryThrow<css::text::XTextSectionsSupplier>(); + auto xSections = xTextSectionsSupplier->getTextSections(); + CPPUNIT_ASSERT(xSections); + auto xSection1 = xSections->getByName(u"Section1"_ustr).queryThrow<css::beans::XPropertySet>(); + auto xSection2 = xSections->getByName(u"Section2"_ustr).queryThrow<css::beans::XPropertySet>(); + CPPUNIT_ASSERT(getProperty<bool>(xSection1, "IsVisible")); + CPPUNIT_ASSERT(getProperty<bool>(xSection2, "IsVisible")); + + { + xmlDocUniquePtr 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/SwParaPortion/SwLineLayout", + "portion", u"3"_ustr); + 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/SwParaPortion/SwLineLayout", + "portion", u"4"_ustr); + 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]/SwParaPortion/SwLineLayout", + "portion", u"6"_ustr); + 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]/SwParaPortion/SwLineLayout", + "portion", u"7"_ustr); + assertXPath( + pXmlDoc, + "/root/page[4]/body/section[1]/column[2]/body/txt[1]/SwParaPortion/SwLineLayout", + "portion", u"8"_ustr); + assertXPath(pXmlDoc, "/root/page[4]/body/section[2]/txt", 1); + assertXPath(pXmlDoc, "/root/page[4]/body/section[2]/txt/SwParaPortion/SwLineLayout", + "portion", u"Text following inner section"_ustr); + assertXPath(pXmlDoc, "/root/page[4]/body/txt[1]/SwParaPortion/SwLineLayout", "portion", + u"Text following outer section"_ustr); + discardDumpedLayout(); + } + + xSection1->setPropertyValue(u"IsVisible"_ustr, css::uno::Any(false)); + Scheduler::ProcessEventsToIdle(); + + { + xmlDocUniquePtr 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", u"0"_ustr); + assertXPath(pXmlDoc, "/root/page[1]/body/section[2]/infos/bounds", "height", u"0"_ustr); + assertXPath(pXmlDoc, "/root/page[1]/body/section[3]/infos/bounds", "height", u"0"_ustr); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout", "portion", + u"Text following outer section"_ustr); + discardDumpedLayout(); + } + + xSection1->setPropertyValue(u"IsVisible"_ustr, css::uno::Any(true)); + Scheduler::ProcessEventsToIdle(); + + { + xmlDocUniquePtr 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/SwParaPortion/SwLineLayout", + "portion", u"3"_ustr); + 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/SwParaPortion/SwLineLayout", + "portion", u"4"_ustr); + 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]/SwParaPortion/SwLineLayout", + "portion", u"6"_ustr); + 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]/SwParaPortion/SwLineLayout", + "portion", u"7"_ustr); + assertXPath( + pXmlDoc, + "/root/page[4]/body/section[1]/column[2]/body/txt[1]/SwParaPortion/SwLineLayout", + "portion", u"8"_ustr); + assertXPath(pXmlDoc, "/root/page[4]/body/section[2]/txt", 1); + assertXPath(pXmlDoc, "/root/page[4]/body/section[2]/txt/SwParaPortion/SwLineLayout", + "portion", u"Text following inner section"_ustr); + assertXPath(pXmlDoc, "/root/page[4]/body/txt[1]/SwParaPortion/SwLineLayout", "portion", + u"Text following outer section"_ustr); + discardDumpedLayout(); + } + + xSection2->setPropertyValue(u"IsVisible"_ustr, css::uno::Any(false)); + Scheduler::ProcessEventsToIdle(); + + { + xmlDocUniquePtr 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/SwParaPortion/SwLineLayout", + "portion", u"3"_ustr); + 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/SwParaPortion/SwLineLayout", + "portion", u"4"_ustr); + 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", u"0"_ustr); + assertXPath(pXmlDoc, "/root/page[3]/body/section[3]/txt", 1); + assertXPath(pXmlDoc, "/root/page[3]/body/section[3]/txt/SwParaPortion/SwLineLayout", + "portion", u"Text following inner section"_ustr); + assertXPath(pXmlDoc, "/root/page[3]/body/txt[1]/SwParaPortion/SwLineLayout", "portion", + u"Text following outer section"_ustr); + discardDumpedLayout(); + } + + xSection2->setPropertyValue(u"IsVisible"_ustr, css::uno::Any(true)); + Scheduler::ProcessEventsToIdle(); + + { + xmlDocUniquePtr 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/SwParaPortion/SwLineLayout", + "portion", u"3"_ustr); + 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/SwParaPortion/SwLineLayout", + "portion", u"4"_ustr); + 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]/SwParaPortion/SwLineLayout", + "portion", u"6"_ustr); + 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]/SwParaPortion/SwLineLayout", + "portion", u"7"_ustr); + assertXPath( + pXmlDoc, + "/root/page[4]/body/section[1]/column[2]/body/txt[1]/SwParaPortion/SwLineLayout", + "portion", u"8"_ustr); + assertXPath(pXmlDoc, "/root/page[4]/body/section[2]/txt", 1); + assertXPath(pXmlDoc, "/root/page[4]/body/section[2]/txt/SwParaPortion/SwLineLayout", + "portion", u"Text following inner section"_ustr); + assertXPath(pXmlDoc, "/root/page[4]/body/txt[1]/SwParaPortion/SwLineLayout", "portion", + u"Text following outer section"_ustr); + discardDumpedLayout(); + } +} + CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf137523) { createSwDoc("tdf137523-1-min.fodt"); diff --git a/sw/source/core/layout/sectfrm.cxx b/sw/source/core/layout/sectfrm.cxx index b1dc6587a6ac..33253dafbe54 100644 --- a/sw/source/core/layout/sectfrm.cxx +++ b/sw/source/core/layout/sectfrm.cxx @@ -2822,16 +2822,19 @@ void SwSectionFrame::SwClientNotify(const SwModify& rMod, const SfxHint& rHint) } 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); } } }
