sw/inc/doc.hxx                                      |    3 
 sw/qa/extras/layout/data/hidden-para-separator.docx |binary
 sw/qa/extras/layout/layout2.cxx                     |   37 +++++++++
 sw/source/core/doc/doctxm.cxx                       |    5 -
 sw/source/core/docnode/ndsect.cxx                   |    2 
 sw/source/core/inc/UndoSection.hxx                  |    5 -
 sw/source/core/inc/rootfrm.hxx                      |    9 +-
 sw/source/core/layout/newfrm.cxx                    |    3 
 sw/source/core/layout/wsfrm.cxx                     |   22 ++++-
 sw/source/core/text/redlnitr.cxx                    |   76 ++++++++++++++++++--
 sw/source/core/undo/unsect.cxx                      |   14 ++-
 sw/source/core/view/viewsh.cxx                      |    8 +-
 12 files changed, 156 insertions(+), 28 deletions(-)

New commits:
commit 42e261fe7ce2ba598941febffea51914dd1fe681
Author:     Michael Stahl <michael.st...@allotropia.de>
AuthorDate: Fri Jan 6 19:07:35 2023 +0100
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Thu Jan 19 12:43:29 2023 +0000

    tdf#152872 sw: conditionally hide paragraph breaks
    
    Add a 3rd kind of hiding to SwRootFrame and CheckParaRedlineMerge().
    
    This is quite simple as only consecutive paragraphs are merged.
    
    There is an existing similar feature described in
    http://www.openoffice.org/specs/writer/hidden_text/hidden_text.sxw
    which results in 0-height text frames if all text is hidden
    - but that is unconditional, while Word shows the paragraph when
    control chars are shown, and hides it otherwise *iff* its paragraph
    marker is hidden (and there's no page break on it).
    
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/145162
    Tested-by: Jenkins
    Reviewed-by: Michael Stahl <michael.st...@allotropia.de>
    (cherry picked from commit 2bcfb7231b5ca74f02274cfb74ca8463f78905d6)
    
    tdf#152872 sw: fix crash on ooo27109-1.sxw
    Has a redline that ends on the body end node.
    (regression from commit 2bcfb7231b5ca74f02274cfb74ca8463f78905d6)
    (cherry picked from commit 29507e398d27bdfceb9155d24a20986ee997d70c)
    
    Change-Id: I8290962ea58278e17b8f84bf6b2ca4bb2325aa8f
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/145296
    Tested-by: Jenkins
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>

diff --git a/sw/inc/doc.hxx b/sw/inc/doc.hxx
index 80aa234cc6e3..4a399b839896 100644
--- a/sw/inc/doc.hxx
+++ b/sw/inc/doc.hxx
@@ -142,6 +142,7 @@ namespace sw::mark { class MarkManager; }
 namespace sw {
     enum class RedlineMode;
     enum class FieldmarkMode;
+    enum class ParagraphBreakMode;
     class MetaFieldManager;
     class UndoManager;
     class IShellCursorSupplier;
@@ -1337,7 +1338,7 @@ public:
 
     // insert section (the ODF kind of section, not the nodesarray kind)
     SwSection * InsertSwSection(SwPaM const& rRange, SwSectionData &,
-            std::tuple<SwTOXBase const*, sw::RedlineMode, sw::FieldmarkMode> 
const* pTOXBase,
+            std::tuple<SwTOXBase const*, sw::RedlineMode, sw::FieldmarkMode, 
sw::ParagraphBreakMode> const* pTOXBase,
             SfxItemSet const*const pAttr, bool const bUpdate = true);
     static sal_uInt16 IsInsRegionAvailable( const SwPaM& rRange,
                                 const SwNode** ppSttNd = nullptr );
diff --git a/sw/qa/extras/layout/data/hidden-para-separator.docx 
b/sw/qa/extras/layout/data/hidden-para-separator.docx
new file mode 100644
index 000000000000..1d5d26075f22
Binary files /dev/null and 
b/sw/qa/extras/layout/data/hidden-para-separator.docx differ
diff --git a/sw/qa/extras/layout/layout2.cxx b/sw/qa/extras/layout/layout2.cxx
index 0b528753aa9a..434bf6376ebc 100644
--- a/sw/qa/extras/layout/layout2.cxx
+++ b/sw/qa/extras/layout/layout2.cxx
@@ -636,6 +636,43 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, 
testTdf149711_importDOCXMoveToParagraphMar
     assertXPath(pXmlDoc, "/root/page[1]/body/txt", 5);
 }
 
+CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf152872)
+{
+    createSwDoc("hidden-para-separator.docx");
+    xmlDocUniquePtr pXmlDoc = parseLayoutDump();
+
+    assertXPath(pXmlDoc, "/root/page[1]/body/txt", 2);
+    assertXPath(pXmlDoc, "/root/page/body/txt[1]/SwParaPortion/SwLineLayout", 
"portion", "C DE");
+    assertXPath(pXmlDoc, "/root/page/body/txt[2]/SwParaPortion", 0); // 5 is 
empty
+    assertXPath(pXmlDoc, "/root/page/body/txt[2]/infos/bounds", "height", 
"379");
+
+    dispatchCommand(mxComponent, ".uno:ControlCodes", {});
+
+    discardDumpedLayout();
+    pXmlDoc = parseLayoutDump();
+
+    assertXPath(pXmlDoc, "/root/page[1]/body/txt", 5);
+    assertXPath(pXmlDoc, "/root/page/body/txt[1]/SwParaPortion/SwLineLayout", 
"portion", "C ");
+    assertXPath(pXmlDoc, "/root/page/body/txt[2]/SwParaPortion/SwLineLayout", 
"portion", "D");
+    // 3 is an empty paragraph with RES_CHRATR_HIDDEN which results in 0-height
+    // frame; ideally it should only be hidden when control codes are hidden
+    // and be a full-height frame now, but that needs more work...
+    assertXPath(pXmlDoc, "/root/page/body/txt[3]/infos/bounds", "height", "0");
+    assertXPath(pXmlDoc, "/root/page/body/txt[4]/SwParaPortion/SwLineLayout", 
"portion", "E");
+    assertXPath(pXmlDoc, "/root/page/body/txt[5]/SwParaPortion", 0); // 5 is 
empty
+    assertXPath(pXmlDoc, "/root/page/body/txt[5]/infos/bounds", "height", 
"379");
+
+    dispatchCommand(mxComponent, ".uno:ControlCodes", {});
+
+    discardDumpedLayout();
+    pXmlDoc = parseLayoutDump();
+
+    assertXPath(pXmlDoc, "/root/page[1]/body/txt", 2);
+    assertXPath(pXmlDoc, "/root/page/body/txt[1]/SwParaPortion/SwLineLayout", 
"portion", "C DE");
+    assertXPath(pXmlDoc, "/root/page/body/txt[2]/SwParaPortion", 0); // 5 is 
empty
+    assertXPath(pXmlDoc, "/root/page/body/txt[2]/infos/bounds", "height", 
"379");
+}
+
 CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf151954)
 {
     createSwDoc("tdf151954.docx");
diff --git a/sw/source/core/doc/doctxm.cxx b/sw/source/core/doc/doctxm.cxx
index 5578a503dcfd..5f54e5313f70 100644
--- a/sw/source/core/doc/doctxm.cxx
+++ b/sw/source/core/doc/doctxm.cxx
@@ -363,12 +363,13 @@ SwTOXBaseSection* SwDoc::InsertTableOf( const SwPaM& aPam,
     OUString sSectNm = GetUniqueTOXBaseName( *rTOX.GetTOXType(), 
rTOX.GetTOXName() );
     SwSectionData aSectionData( SectionType::ToxContent, sSectNm );
 
-    std::tuple<SwTOXBase const*, sw::RedlineMode, sw::FieldmarkMode> const tmp(
+    std::tuple<SwTOXBase const*, sw::RedlineMode, sw::FieldmarkMode, 
sw::ParagraphBreakMode> const tmp(
         &rTOX,
         pLayout && pLayout->IsHideRedlines()
             ? sw::RedlineMode::Hidden
             : sw::RedlineMode::Shown,
-        pLayout ? pLayout->GetFieldmarkMode() : sw::FieldmarkMode::ShowBoth);
+        pLayout ? pLayout->GetFieldmarkMode() : sw::FieldmarkMode::ShowBoth,
+        pLayout ? pLayout->GetParagraphBreakMode() : 
sw::ParagraphBreakMode::Shown);
     SwTOXBaseSection *const pNewSection = dynamic_cast<SwTOXBaseSection *>(
         InsertSwSection(aPam, aSectionData, & tmp, pSet, false));
     if (pNewSection)
diff --git a/sw/source/core/docnode/ndsect.cxx 
b/sw/source/core/docnode/ndsect.cxx
index 8a53f83cd6ad..f4fe9b9a3ec4 100644
--- a/sw/source/core/docnode/ndsect.cxx
+++ b/sw/source/core/docnode/ndsect.cxx
@@ -152,7 +152,7 @@ static void lcl_CheckEmptyLayFrame( SwNodes const & rNds, 
SwSectionData& rSectio
 
 SwSection *
 SwDoc::InsertSwSection(SwPaM const& rRange, SwSectionData & rNewData,
-       std::tuple<SwTOXBase const*, sw::RedlineMode, sw::FieldmarkMode> 
const*const pTOXBaseAndMode,
+       std::tuple<SwTOXBase const*, sw::RedlineMode, sw::FieldmarkMode, 
sw::ParagraphBreakMode> const*const pTOXBaseAndMode,
                        SfxItemSet const*const pAttr, bool const bUpdate)
 {
     const SwNode* pPrvNd = nullptr;
diff --git a/sw/source/core/inc/UndoSection.hxx 
b/sw/source/core/inc/UndoSection.hxx
index 85b15a8b7eb0..5be018a2e14d 100644
--- a/sw/source/core/inc/UndoSection.hxx
+++ b/sw/source/core/inc/UndoSection.hxx
@@ -35,13 +35,14 @@ class SwTOXBase;
 namespace sw {
     enum class RedlineMode;
     enum class FieldmarkMode;
+    enum class ParagraphBreakMode;
 };
 
 class SwUndoInsSection final : public SwUndo, private SwUndRng
 {
 private:
     const std::unique_ptr<SwSectionData> m_pSectionData;
-    std::optional<std::tuple<std::unique_ptr<SwTOXBase>, sw::RedlineMode, 
sw::FieldmarkMode>> m_xTOXBase; /// set iff section is TOX
+    std::optional<std::tuple<std::unique_ptr<SwTOXBase>, sw::RedlineMode, 
sw::FieldmarkMode, sw::ParagraphBreakMode>> m_xTOXBase; /// set iff section is 
TOX
     const std::unique_ptr<SfxItemSet> m_pAttrSet;
     std::unique_ptr<SwHistory> m_pHistory;
     std::unique_ptr<SwRedlineData> m_pRedlData;
@@ -56,7 +57,7 @@ private:
 public:
     SwUndoInsSection(SwPaM const&, SwSectionData const&,
         SfxItemSet const* pSet,
-        std::tuple<SwTOXBase const*, sw::RedlineMode, sw::FieldmarkMode> 
const* pTOXBase);
+        std::tuple<SwTOXBase const*, sw::RedlineMode, sw::FieldmarkMode, 
sw::ParagraphBreakMode> const* pTOXBase);
 
     virtual ~SwUndoInsSection() override;
 
diff --git a/sw/source/core/inc/rootfrm.hxx b/sw/source/core/inc/rootfrm.hxx
index 3d00fe1cc226..32344bf0d9c0 100644
--- a/sw/source/core/inc/rootfrm.hxx
+++ b/sw/source/core/inc/rootfrm.hxx
@@ -47,6 +47,7 @@ namespace sw {
     };
 
     enum class FieldmarkMode { ShowCommand = 1, ShowResult = 2, ShowBoth = 3 };
+    enum class ParagraphBreakMode { Shown, Hidden };
 };
 
 enum class SwInvalidateFlags
@@ -121,6 +122,7 @@ class SW_DLLPUBLIC SwRootFrame final : public SwLayoutFrame
     bool    mbLayoutFreezed;
     bool    mbHideRedlines;
     sw::FieldmarkMode m_FieldmarkMode;
+    sw::ParagraphBreakMode m_ParagraphBreakMode;
 
     /**
      * For BrowseMode
@@ -421,10 +423,9 @@ public:
     bool IsHideRedlines() const { return mbHideRedlines; }
     void SetHideRedlines(bool);
     sw::FieldmarkMode GetFieldmarkMode() const { return m_FieldmarkMode; }
-    void SetFieldmarkMode(sw::FieldmarkMode);
-    bool HasMergedParas() const {
-        return IsHideRedlines() || GetFieldmarkMode() != 
sw::FieldmarkMode::ShowBoth;
-    }
+    void SetFieldmarkMode(sw::FieldmarkMode, sw::ParagraphBreakMode);
+    sw::ParagraphBreakMode GetParagraphBreakMode() const { return 
m_ParagraphBreakMode; }
+    bool HasMergedParas() const;
 };
 
 inline tools::Long SwRootFrame::GetBrowseWidth() const
diff --git a/sw/source/core/layout/newfrm.cxx b/sw/source/core/layout/newfrm.cxx
index c09c55779f46..5ca11e34138b 100644
--- a/sw/source/core/layout/newfrm.cxx
+++ b/sw/source/core/layout/newfrm.cxx
@@ -418,6 +418,9 @@ SwRootFrame::SwRootFrame( SwFrameFormat *pFormat, 
SwViewShell * pSh ) :
     m_FieldmarkMode(pSh->GetViewOptions()->IsFieldName()
             ? sw::FieldmarkMode::ShowCommand
             : sw::FieldmarkMode::ShowResult),
+    m_ParagraphBreakMode(pSh->GetViewOptions()->IsParagraph()
+            ? sw::ParagraphBreakMode::Shown
+            : sw::ParagraphBreakMode::Hidden),
     mnBrowseWidth(MIN_BROWSE_WIDTH),
     mpTurbo( nullptr ),
     mpLastPage( nullptr ),
diff --git a/sw/source/core/layout/wsfrm.cxx b/sw/source/core/layout/wsfrm.cxx
index 2d59a1c7ea73..f753a993aceb 100644
--- a/sw/source/core/layout/wsfrm.cxx
+++ b/sw/source/core/layout/wsfrm.cxx
@@ -4706,23 +4706,26 @@ void SwRootFrame::SetHideRedlines(bool const 
bHideRedlines)
     }
     // TODO: remove temporary ShowBoth
     sw::FieldmarkMode const eMode(m_FieldmarkMode);
+    sw::ParagraphBreakMode const ePBMode(m_ParagraphBreakMode);
     if (HasMergedParas())
     {
         m_FieldmarkMode = sw::FieldmarkMode::ShowBoth;
+        m_ParagraphBreakMode = sw::ParagraphBreakMode::Shown;
         mbHideRedlines = false;
         UnHide(*this);
     }
-    if (bHideRedlines || eMode != m_FieldmarkMode)
+    if (bHideRedlines || eMode != m_FieldmarkMode || ePBMode != 
m_ParagraphBreakMode)
     {
         m_FieldmarkMode = eMode;
+        m_ParagraphBreakMode = ePBMode;
         mbHideRedlines = bHideRedlines;
         UnHide(*this);
     }
 }
 
-void SwRootFrame::SetFieldmarkMode(sw::FieldmarkMode const eMode)
+void SwRootFrame::SetFieldmarkMode(sw::FieldmarkMode const eFMMode, 
sw::ParagraphBreakMode const ePBMode)
 {
-    if (eMode == m_FieldmarkMode)
+    if (eFMMode == m_FieldmarkMode && ePBMode == m_ParagraphBreakMode)
     {
         return;
     }
@@ -4732,14 +4735,23 @@ void SwRootFrame::SetFieldmarkMode(sw::FieldmarkMode 
const eMode)
     {
         mbHideRedlines = false;
         m_FieldmarkMode = sw::FieldmarkMode::ShowBoth;
+        m_ParagraphBreakMode = sw::ParagraphBreakMode::Shown;
         UnHide(*this);
     }
-    if (eMode != sw::FieldmarkMode::ShowBoth || isHideRedlines)
+    if (isHideRedlines || eFMMode != sw::FieldmarkMode::ShowBoth || ePBMode == 
sw::ParagraphBreakMode::Hidden)
     {
         mbHideRedlines = isHideRedlines;
-        m_FieldmarkMode = eMode;
+        m_FieldmarkMode = eFMMode;
+        m_ParagraphBreakMode = ePBMode;
         UnHide(*this);
     }
 }
 
+bool SwRootFrame::HasMergedParas() const
+{
+    return IsHideRedlines()
+        || GetFieldmarkMode() != sw::FieldmarkMode::ShowBoth
+        || GetParagraphBreakMode() == sw::ParagraphBreakMode::Hidden;
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/text/redlnitr.cxx b/sw/source/core/text/redlnitr.cxx
index 2b77d86aa350..c44b527536c1 100644
--- a/sw/source/core/text/redlnitr.cxx
+++ b/sw/source/core/text/redlnitr.cxx
@@ -47,8 +47,11 @@
 #include <vcl/svapp.hxx>
 #include "redlnitr.hxx"
 #include <extinput.hxx>
+#include <fmtpdsc.hxx>
+#include <editeng/charhiddenitem.hxx>
 #include <editeng/colritem.hxx>
 #include <editeng/crossedoutitem.hxx>
+#include <editeng/formatbreakitem.hxx>
 #include <editeng/udlnitem.hxx>
 
 using namespace ::com::sun::star;
@@ -62,12 +65,15 @@ private:
     IDocumentMarkAccess const& m_rIDMA;
     bool const m_isHideRedlines;
     sw::FieldmarkMode const m_eFieldmarkMode;
+    bool const m_isHideParagraphBreaks;
     SwPosition const m_Start;
     /// next redline
     SwRedlineTable::size_type m_RedlineIndex;
     /// next fieldmark
     std::pair<sw::mark::IFieldmark const*, std::optional<SwPosition>> 
m_Fieldmark;
     std::optional<SwPosition> m_oNextFieldmarkHide;
+    /// previous paragraph break - because m_pStartPos/EndPos are non-owning
+    std::optional<std::pair<SwPosition, SwPosition>> m_oParagraphBreak;
     /// current start/end pair
     SwPosition const* m_pStartPos;
     SwPosition const* m_pEndPos;
@@ -77,11 +83,13 @@ public:
     SwPosition const* GetEndPos() const { return m_pEndPos; }
 
     HideIterator(SwTextNode & rTextNode,
-            bool const isHideRedlines, sw::FieldmarkMode const eMode)
+            bool const isHideRedlines, sw::FieldmarkMode const eMode,
+            sw::ParagraphBreakMode const ePBMode)
         : m_rIDRA(rTextNode.getIDocumentRedlineAccess())
         , m_rIDMA(*rTextNode.getIDocumentMarkAccess())
         , m_isHideRedlines(isHideRedlines)
         , m_eFieldmarkMode(eMode)
+        , m_isHideParagraphBreaks(ePBMode == sw::ParagraphBreakMode::Hidden)
         , m_Start(rTextNode, 0)
         , m_RedlineIndex(isHideRedlines ? m_rIDRA.GetRedlinePos(rTextNode, 
RedlineType::Any) : SwRedlineTable::npos)
         , m_pStartPos(nullptr)
@@ -188,12 +196,66 @@ public:
             m_pEndPos = &*m_Fieldmark.second;
             return true;
         }
-        else // nothing
+        else
         {
             assert(!pNextRedlineHide && !m_oNextFieldmarkHide);
-            m_pStartPos = nullptr;
-            m_pEndPos = nullptr;
-            return false;
+            auto const hasHiddenItem = [](auto const& rNode) {
+                auto const& 
rpSet(rNode.GetAttr(RES_PARATR_LIST_AUTOFMT).GetStyleHandle());
+                return rpSet ? rpSet->Get(RES_CHRATR_HIDDEN).GetValue() : 
false;
+            };
+            auto const hasBreakBefore = [](SwTextNode const& rNode) {
+                if (rNode.GetAttr(RES_PAGEDESC).GetPageDesc())
+                {
+                    return true;
+                }
+                switch (rNode.GetAttr(RES_BREAK).GetBreak())
+                {
+                    case SvxBreak::ColumnBefore:
+                    case SvxBreak::ColumnBoth:
+                    case SvxBreak::PageBefore:
+                    case SvxBreak::PageBoth:
+                        return true;
+                    default:
+                        break;
+                }
+                return false;
+            };
+            auto const hasBreakAfter = [](SwTextNode const& rNode) {
+                switch (rNode.GetAttr(RES_BREAK).GetBreak())
+                {
+                    case SvxBreak::ColumnAfter:
+                    case SvxBreak::ColumnBoth:
+                    case SvxBreak::PageAfter:
+                    case SvxBreak::PageBoth:
+                        return true;
+                    default:
+                        break;
+                }
+                return false;
+            };
+            if (m_isHideParagraphBreaks
+                && m_pEndPos->GetNode().IsTextNode() // ooo27109-1.sxw
+                // only merge if next node is also text node
+                && 
m_pEndPos->GetNodes()[m_pEndPos->GetNodeIndex()+1]->IsTextNode()
+                && hasHiddenItem(*m_pEndPos->GetNode().GetTextNode())
+                // no merge if there's a page break on any node
+                && 
!hasBreakBefore(*m_pEndPos->GetNodes()[m_pEndPos->GetNodeIndex()+1]->GetTextNode())
+                // first node, see SwTextFrame::GetBreak()
+                && !hasBreakAfter(*m_Start.GetNode().GetTextNode()))
+            {
+                m_oParagraphBreak.emplace(
+                    SwPosition(*m_pEndPos->GetNode().GetTextNode(), 
m_pEndPos->GetNode().GetTextNode()->Len()),
+                    
SwPosition(*m_pEndPos->GetNodes()[m_pEndPos->GetNodeIndex()+1]->GetTextNode(), 
0));
+                m_pStartPos = &m_oParagraphBreak->first;
+                m_pEndPos = &m_oParagraphBreak->second;
+                return true;
+            }
+            else // nothing
+            {
+                m_pStartPos = nullptr;
+                m_pEndPos = nullptr;
+                return false;
+            }
         }
     }
 };
@@ -221,7 +283,9 @@ CheckParaRedlineMerge(SwTextFrame & rFrame, SwTextNode & 
rTextNode,
     sal_Int32 nLastEnd(0);
     for (auto iter = HideIterator(rTextNode,
                 rFrame.getRootFrame()->IsHideRedlines(),
-                rFrame.getRootFrame()->GetFieldmarkMode()); iter.Next(); )
+                rFrame.getRootFrame()->GetFieldmarkMode(),
+                rFrame.getRootFrame()->GetParagraphBreakMode());
+            iter.Next(); )
     {
         SwPosition const*const pStart(iter.GetStartPos());
         SwPosition const*const pEnd(iter.GetEndPos());
diff --git a/sw/source/core/undo/unsect.cxx b/sw/source/core/undo/unsect.cxx
index b812821fb8d3..4e75aa9adb5f 100644
--- a/sw/source/core/undo/unsect.cxx
+++ b/sw/source/core/undo/unsect.cxx
@@ -77,7 +77,7 @@ static std::optional<SfxItemSet> lcl_GetAttrSet( const 
SwSection& rSect )
 SwUndoInsSection::SwUndoInsSection(
         SwPaM const& rPam, SwSectionData const& rNewData,
         SfxItemSet const*const pSet,
-        std::tuple<SwTOXBase const*, sw::RedlineMode, sw::FieldmarkMode> 
const*const pTOXBase)
+        std::tuple<SwTOXBase const*, sw::RedlineMode, sw::FieldmarkMode, 
sw::ParagraphBreakMode> const*const pTOXBase)
     : SwUndo( SwUndoId::INSSECTION, &rPam.GetDoc() ), SwUndRng( rPam )
     , m_pSectionData(new SwSectionData(rNewData))
     , m_pAttrSet( (pSet && pSet->Count()) ? new SfxItemSet( *pSet ) : nullptr )
@@ -90,7 +90,8 @@ SwUndoInsSection::SwUndoInsSection(
         m_xTOXBase.emplace(
             std::make_unique<SwTOXBase>(*std::get<0>(*pTOXBase)),
             std::get<1>(*pTOXBase),
-            std::get<2>(*pTOXBase));
+            std::get<2>(*pTOXBase),
+            std::get<3>(*pTOXBase));
 
     SwDoc& rDoc = rPam.GetDoc();
     if( rDoc.getIDocumentRedlineAccess().IsRedlineOn() )
@@ -187,18 +188,20 @@ void SwUndoInsSection::RedoImpl(::sw::UndoRedoContext & 
rContext)
         SwRootFrame const* pLayout(nullptr);
         SwRootFrame * pLayoutToReset(nullptr);
         sw::FieldmarkMode eFieldmarkMode{};
+        sw::ParagraphBreakMode eParagraphBreakMode{};
         comphelper::ScopeGuard g([&]() {
                 if (pLayoutToReset)
                 {
                     pLayoutToReset->SetHideRedlines(std::get<1>(*m_xTOXBase) 
== sw::RedlineMode::Shown);
-                    pLayoutToReset->SetFieldmarkMode(eFieldmarkMode);
+                    pLayoutToReset->SetFieldmarkMode(eFieldmarkMode, 
eParagraphBreakMode);
                 }
             });
         o3tl::sorted_vector<SwRootFrame *> layouts(rDoc.GetAllLayouts());
         for (SwRootFrame const*const p : layouts)
         {
             if ((std::get<1>(*m_xTOXBase) == sw::RedlineMode::Hidden) == 
p->IsHideRedlines()
-                && std::get<2>(*m_xTOXBase) == p->GetFieldmarkMode())
+                && std::get<2>(*m_xTOXBase) == p->GetFieldmarkMode()
+                && std::get<3>(*m_xTOXBase) == p->GetParagraphBreakMode())
             {
                 pLayout = p;
                 break;
@@ -209,8 +212,9 @@ void SwUndoInsSection::RedoImpl(::sw::UndoRedoContext & 
rContext)
             assert(!layouts.empty()); // must have one layout
             pLayoutToReset = *layouts.begin();
             eFieldmarkMode = pLayoutToReset->GetFieldmarkMode();
+            eParagraphBreakMode = pLayoutToReset->GetParagraphBreakMode();
             pLayoutToReset->SetHideRedlines(std::get<1>(*m_xTOXBase) == 
sw::RedlineMode::Hidden);
-            pLayoutToReset->SetFieldmarkMode(std::get<2>(*m_xTOXBase));
+            pLayoutToReset->SetFieldmarkMode(std::get<2>(*m_xTOXBase), 
std::get<3>(*m_xTOXBase));
             pLayout = pLayoutToReset;
         }
         pUpdateTOX = rDoc.InsertTableOf( *rPam.GetPoint(),
diff --git a/sw/source/core/view/viewsh.cxx b/sw/source/core/view/viewsh.cxx
index 402f4f2e01a4..a1ea83c57867 100644
--- a/sw/source/core/view/viewsh.cxx
+++ b/sw/source/core/view/viewsh.cxx
@@ -2322,11 +2322,15 @@ void SwViewShell::ImplApplyViewOptions( const 
SwViewOption &rOpt )
     // - Of course, the screen is something completely different than the 
printer ...
     bool const isToggleFieldNames(mpOpt->IsFieldName() != rOpt.IsFieldName());
 
-    if (mpOpt->IsFieldName() != rOpt.IsFieldName())
+    if (mpOpt->IsFieldName() != rOpt.IsFieldName()
+        || mpOpt->IsParagraph() != rOpt.IsParagraph())
     {
         GetLayout()->SetFieldmarkMode( rOpt.IsFieldName()
                     ? sw::FieldmarkMode::ShowCommand
-                    : sw::FieldmarkMode::ShowResult );
+                    : sw::FieldmarkMode::ShowResult,
+                rOpt.IsParagraph()
+                    ? sw::ParagraphBreakMode::Shown
+                    : sw::ParagraphBreakMode::Hidden);
         bReformat = true;
     }
 

Reply via email to