tdf#156980 SwNavigator: Make headings delete even if they have

folded outline content

Change-Id: If952d8d845c2eeec86231014b924f1632d2f5efe
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/157667
Tested-by: Jenkins
Reviewed-by: Jim Raykowski <raykowj@gmail.com>
diff --git a/sw/source/uibase/utlui/content.cxx b/sw/source/uibase/utlui/content.cxx
index a8b939b..c9a30aa 100644
--- a/sw/source/uibase/utlui/content.cxx
+++ b/sw/source/uibase/utlui/content.cxx
@@ -4871,12 +4871,13 @@ void SwContentTree::ExecuteContextMenuAction(const OUString& rSelectedPopupEntry

void SwContentTree::DeleteOutlineSelections()
{
    const SwOutlineNodes& rOutlineNodes = m_pActiveShell->GetNodes().GetOutLineNds();
    auto nChapters(0);

    m_pActiveShell->StartAction();

    m_pActiveShell->EnterAddMode();
    m_xTreeView->selected_foreach([this, &nChapters](weld::TreeIter& rEntry){
    m_xTreeView->selected_foreach([this, &rOutlineNodes, &nChapters](weld::TreeIter& rEntry){
        ++nChapters;
        if (m_xTreeView->iter_has_child(rEntry) &&
            !m_xTreeView->get_row_expanded(rEntry)) // only count children if not expanded
@@ -4884,6 +4885,27 @@ void SwContentTree::DeleteOutlineSelections()
            nChapters += m_xTreeView->iter_n_children(rEntry);
        }
        SwOutlineNodes::size_type nActPos = weld::fromId<SwOutlineContent*>(m_xTreeView->get_id(rEntry))->GetOutlinePos();
        if (m_pActiveShell->GetViewOptions()->IsShowOutlineContentVisibilityButton())
        {
            // make folded content visible so it can be selected
            if (!m_pActiveShell->IsOutlineContentVisible(nActPos))
                m_pActiveShell->MakeOutlineContentVisible(nActPos);
            if (!m_xTreeView->get_row_expanded(rEntry))
            {
                // include children
                SwNode* pNode = rOutlineNodes[nActPos];
                const int nLevel = pNode->GetTextNode()->GetAttrOutlineLevel() - 1;
                for (auto nPos = nActPos + 1; nPos < rOutlineNodes.size(); ++nPos)
                {
                    pNode = rOutlineNodes[nPos];
                    const int nNextLevel = pNode->GetTextNode()->GetAttrOutlineLevel() - 1;
                    if (nNextLevel <= nLevel)
                        break;
                    if (!m_pActiveShell->IsOutlineContentVisible(nNextLevel))
                        m_pActiveShell->MakeOutlineContentVisible(nNextLevel);
                }
            }
        }
        m_pActiveShell->SttSelect();
        m_pActiveShell->MakeOutlineSel(nActPos, nActPos, !m_xTreeView->get_row_expanded(rEntry), false); // select children if not expanded
        // The outline selection may already be to the start of the following outline paragraph
diff --git a/sw/source/uibase/wrtsh/wrtsh1.cxx b/sw/source/uibase/wrtsh/wrtsh1.cxx
index 921d714..9dc476fb 100644
--- a/sw/source/uibase/wrtsh/wrtsh1.cxx
+++ b/sw/source/uibase/wrtsh/wrtsh1.cxx
@@ -2662,6 +2662,13 @@ bool SwWrtShell::HasFoldedOutlineContentSelected() const
        SwOutlineNodes::size_type nPos;
        for (SwNodeIndex aIdx = aPointIdx; aIdx <= aMarkIdx; ++aIdx)
        {
            // To allow delete when the start of the selection is at the start of a
            // paragraph and the end of the selection is at the start of a paragraph and there
            // are no folded outline content nodes in between.
            if (aIdx == aMarkIdx && aPaM.GetPoint()->GetContentIndex() == 0 &&
                    aPaM.GetMark()->GetContentIndex() == 0)
                return false;

            if (GetDoc()->GetNodes().GetOutLineNds().Seek_Entry(&(aIdx.GetNode()), &nPos) &&
                    !GetAttrOutlineContentVisible(nPos))
                return true;