tdf#101856 evaluate condition to expand / collapse bookmarks

Change-Id: I7c135eab0feeca0ede794f6c88a2b06e339d6a14
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/95795
Tested-by: Jenkins
Reviewed-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/96003
Reviewed-by: Michael Stahl <michael.stahl@cib.de>
diff --git a/sw/source/core/text/porlay.cxx b/sw/source/core/text/porlay.cxx
index d9406a4..2bb9e87b 100644
--- a/sw/source/core/text/porlay.cxx
+++ b/sw/source/core/text/porlay.cxx
@@ -54,9 +54,11 @@
#include <doc.hxx>
#include <swscanner.hxx>
#include <txatbase.hxx>
#include <calc.hxx>
#include <IDocumentRedlineAccess.hxx>
#include <IDocumentSettingAccess.hxx>
#include <IDocumentContentOperations.hxx>
#include <IDocumentFieldsAccess.hxx>
#include <IMark.hxx>

using namespace ::com::sun::star;
@@ -2283,8 +2285,30 @@
    {
        const sw::mark::IMark* pMark = pIndex->GetMark();
        const sw::mark::IBookmark* pBookmark = dynamic_cast<const sw::mark::IBookmark*>(pMark);

        bool bHide = false;
        if (pBookmark && pBookmark->IsHidden())
        {
            // bookmark is marked as hidden
            bHide = true;

            // bookmark is marked as hidden with conditions
            if (!pBookmark->GetHideCondition().isEmpty())
            {
                SwDoc& rDoc = *const_cast<SwDoc*>(rNode.GetDoc());
                SwCalc aCalc(rDoc);
                rDoc.getIDocumentFieldsAccess().FieldsToCalc(aCalc, rNode.GetIndex(), USHRT_MAX);

                SwSbxValue aValue = aCalc.Calculate(pBookmark->GetHideCondition());
                if(!aValue.IsVoidValue())
                {
                    bHide = aValue.GetBool();
                }
            }
        }

        if (bHide)
        {
            // intersect bookmark range with textnode range and add the intersection to rHiddenMulti

            const sal_Int32 nSt =  pBookmark->GetMarkStart().nContent.GetIndex();