include/svl/hint.hxx                          |    1 
 sw/inc/fmtcol.hxx                             |    1 
 sw/inc/hintids.hxx                            |    4 
 sw/inc/hints.hxx                              |   14 
 sw/inc/ndtxt.hxx                              |    2 
 sw/inc/swevent.hxx                            |   19 -
 sw/inc/txtatr.hxx                             |    1 
 sw/qa/core/uwriter.cxx                        |    4 
 sw/source/core/attr/BorderCacheOwner.cxx      |    1 
 sw/source/core/attr/calbck.cxx                |    6 
 sw/source/core/attr/format.cxx                |   53 +-
 sw/source/core/attr/hints.cxx                 |    6 
 sw/source/core/crsr/crsrsh.cxx                |    6 
 sw/source/core/doc/docfmt.cxx                 |    2 
 sw/source/core/doc/docftn.cxx                 |   11 
 sw/source/core/doc/fmtcol.cxx                 |   58 +--
 sw/source/core/doc/lineinfo.cxx               |    4 
 sw/source/core/doc/notxtfrm.cxx               |  124 +++---
 sw/source/core/doc/number.cxx                 |   25 -
 sw/source/core/docnode/node.cxx               |   24 -
 sw/source/core/docnode/section.cxx            |  127 +++---
 sw/source/core/draw/dcontact.cxx              |   92 +++-
 sw/source/core/fields/ddetbl.cxx              |    4 
 sw/source/core/fields/docufld.cxx             |   12 
 sw/source/core/fields/reffld.cxx              |   13 
 sw/source/core/fields/usrfld.cxx              |    6 
 sw/source/core/inc/flyfrm.hxx                 |    1 
 sw/source/core/layout/atrfrm.cxx              |  106 ++---
 sw/source/core/layout/fly.cxx                 |   33 +
 sw/source/core/layout/flycnt.cxx              |   15 
 sw/source/core/layout/flyincnt.cxx            |   56 +--
 sw/source/core/layout/flylay.cxx              |   22 -
 sw/source/core/layout/pagechg.cxx             |   18 
 sw/source/core/layout/pagedesc.cxx            |    5 
 sw/source/core/layout/sectfrm.cxx             |   18 
 sw/source/core/layout/tabfrm.cxx              |  142 ++++---
 sw/source/core/layout/wsfrm.cxx               |   34 +
 sw/source/core/table/swtable.cxx              |  107 +++--
 sw/source/core/text/txtfrm.cxx                |  482 +++++++++++++-------------
 sw/source/core/txtnode/atrfld.cxx             |   91 ++--
 sw/source/core/txtnode/attrcontentcontrol.cxx |    3 
 sw/source/core/txtnode/attrlinebreak.cxx      |    3 
 sw/source/core/txtnode/fmtatr2.cxx            |   10 
 sw/source/core/txtnode/ndtxt.cxx              |   98 +++--
 sw/source/core/txtnode/txtatr2.cxx            |   76 ++--
 sw/source/core/undo/rolbck.cxx                |   55 +-
 sw/source/core/undo/unattr.cxx                |   31 +
 sw/source/core/undo/undobj1.cxx               |   24 -
 sw/source/core/unocore/unochart.cxx           |    3 
 49 files changed, 1148 insertions(+), 905 deletions(-)

New commits:
commit 404fbec25740406e3b926844f3bd0f324dc38b8c
Author:     Noel Grandin <noelgran...@gmail.com>
AuthorDate: Sat Jan 4 16:20:57 2025 +0200
Commit:     Noel Grandin <noelgran...@gmail.com>
CommitDate: Sun Jan 5 11:25:10 2025 +0100

    convert RES_ATTRSET_CHG to SfxHint
    
    Change-Id: I22c4bd909010e2c5d48fcfa040e9efe2a4c7950a
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/179772
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>
    Tested-by: Jenkins

diff --git a/include/svl/hint.hxx b/include/svl/hint.hxx
index 48fc8b616dd7..0b4c626306b5 100644
--- a/include/svl/hint.hxx
+++ b/include/svl/hint.hxx
@@ -232,6 +232,7 @@ enum class SfxHintId {
     SwRemoveUnoObject,
     SwHiddenParaPrint,
     SwFormatChange,
+    SwAttrSetChange,
 
     ThisIsAnSdrHint,
     ThisIsAnSfxEventHint
diff --git a/sw/inc/fmtcol.hxx b/sw/inc/fmtcol.hxx
index d5cbb8e5842f..a966e84049ea 100644
--- a/sw/inc/fmtcol.hxx
+++ b/sw/inc/fmtcol.hxx
@@ -148,7 +148,6 @@ public:
             switch(nWhich)
             {
                 case RES_OBJECTDYING:
-                case RES_ATTRSET_CHG:
                     m_bInSwFntCache = false;
             }
         }
diff --git a/sw/inc/hintids.hxx b/sw/inc/hintids.hxx
index 3d2ae2730c53..fab0a027a0aa 100644
--- a/sw/inc/hintids.hxx
+++ b/sw/inc/hintids.hxx
@@ -30,7 +30,6 @@
 class SfxStringItem;
 class SwFormatChg;
 class SwUpdateAttr;
-class SwAttrSetChg;
 class SwFormatMeta;
 class SwFormatContentControl;
 class SvXMLAttrContainerItem;
@@ -430,7 +429,8 @@ inline constexpr sal_uInt16 
RES_FORMAT_MSG_BEGIN(RES_FMT_END);
 inline constexpr TypedWhichId<SwPtrMsgPoolItem> 
RES_OBJECTDYING(RES_FORMAT_MSG_BEGIN); // 167
 inline constexpr sal_uInt16 RES_UPDATEATTR_FMT_CHG(
     168); // used by SwUpdateAttr just as an ID to communicate what has changed
-inline constexpr TypedWhichId<SwAttrSetChg> RES_ATTRSET_CHG(169);
+inline constexpr sal_uInt16 RES_UPDATEATTR_ATTRSET_CHG(
+    169); // used by SwUpdateAttr just as an ID to communicate what has changed
 inline constexpr TypedWhichId<SwUpdateAttr> RES_UPDATE_ATTR(170);
 // empty
 inline constexpr sal_uInt16 RES_FORMAT_MSG_END(190);
diff --git a/sw/inc/hints.hxx b/sw/inc/hints.hxx
index a1d4984b3fb0..90eb881012d8 100644
--- a/sw/inc/hints.hxx
+++ b/sw/inc/hints.hxx
@@ -40,6 +40,7 @@ class SwTableBoxFormat;
 class SwTableLine;
 class SwTableLineFormat;
 class SwTableBox;
+class SwAttrSetChg;
 
 // Base class for all Message-Hints:
 // "Overhead" of SfxPoolItem is handled here
@@ -319,7 +320,14 @@ class PrintHiddenParaHint final : public SfxHint
 public:
     PrintHiddenParaHint() : SfxHint(SfxHintId::SwHiddenParaPrint) {}
 };
-}
+class AttrSetChangeHint final : public SfxHint
+{
+public:
+    const SwAttrSetChg* m_pOld;
+    const SwAttrSetChg* m_pNew;
+    AttrSetChangeHint(const SwAttrSetChg* pOld, const SwAttrSetChg* pNew) : 
SfxHint(SfxHintId::SwAttrSetChange), m_pOld(pOld), m_pNew(pNew) {}
+};
+} // namespace sw
 
 class SwUpdateAttr final : public SwMsgPoolItem
 {
@@ -383,7 +391,7 @@ public:
  * SwAttrSetChg is sent when something has changed in the SwAttrSet 
rTheChgdSet.
  * 2 Hints are always sent, the old and the new items in the rTheChgdSet.
  */
-class SwAttrSetChg final : public SwMsgPoolItem
+class SwAttrSetChg final
 {
     bool m_bDelSet;
     SwAttrSet* m_pChgSet;           ///< what has changed
@@ -391,7 +399,7 @@ class SwAttrSetChg final : public SwMsgPoolItem
 public:
     SwAttrSetChg( const SwAttrSet& rTheSet, SwAttrSet& rSet );
     SwAttrSetChg( const SwAttrSetChg& );
-    virtual ~SwAttrSetChg() override;
+    ~SwAttrSetChg();
 
     /// What has changed
     const SwAttrSet* GetChgSet() const     { return m_pChgSet; }
diff --git a/sw/inc/ndtxt.hxx b/sw/inc/ndtxt.hxx
index 30951a7d56bd..6e667e30be2c 100644
--- a/sw/inc/ndtxt.hxx
+++ b/sw/inc/ndtxt.hxx
@@ -73,6 +73,7 @@ class SwFormatChangeHint;
 namespace sw {
     class TextNodeNotificationSuppressor;
     class RemoveUnoObjectHint;
+    class AttrSetChangeHint;
     namespace mark { enum class RestoreMode; }
 }
 
@@ -243,6 +244,7 @@ public:
     void UpdateDocPos(const SwTwips nDocPos, const sal_uInt32 nIndex);
     /// for hanging TextFormatCollections somewhere else (Outline-Numbering!)
     void TriggerNodeUpdate(const sw::LegacyModifyHint&);
+    void TriggerNodeUpdate(const sw::AttrSetChangeHint&);
     void TriggerNodeUpdate(const sw::RemoveUnoObjectHint&);
     void TriggerNodeUpdate(const SwFormatChangeHint&);
 
diff --git a/sw/inc/swevent.hxx b/sw/inc/swevent.hxx
index d6d79d72a9b7..10d110bca664 100644
--- a/sw/inc/swevent.hxx
+++ b/sw/inc/swevent.hxx
@@ -122,24 +122,23 @@ struct SwCallMouseEvent final
             SwClient::SwClientNotify(rMod, rHint);
             if (!GetRegisteredIn() || static_cast<const 
sw::RemoveUnoObjectHint&>(rHint).m_pObject == PTR.pFormat)
                 Clear();
-            return;
         }
-        if(SfxHintId::SwFormatChange == rHint.GetId())
+        else if(SfxHintId::SwFormatChange == rHint.GetId())
         {
             auto pChgHint = static_cast<const SwFormatChangeHint*>(&rHint);
             assert(EVENT_OBJECT_IMAGE == eType || EVENT_OBJECT_URLITEM == 
eType || EVENT_OBJECT_IMAGEMAP == eType);
             SwClient::SwClientNotify(rMod, rHint);
             if (!GetRegisteredIn() || pChgHint->m_pOldFormat == PTR.pFormat)
                 Clear();
-            return;
         }
-        if (rHint.GetId() != SfxHintId::SwLegacyModify)
-            return;
-        assert(EVENT_OBJECT_IMAGE == eType || EVENT_OBJECT_URLITEM == eType || 
EVENT_OBJECT_IMAGEMAP == eType);
-        SwClient::SwClientNotify(rMod, rHint);
-        bool bClear = !GetRegisteredIn();
-        if(bClear)
-            Clear();
+        else if (rHint.GetId() == SfxHintId::SwLegacyModify || 
SfxHintId::SwAttrSetChange == rHint.GetId())
+        {
+            assert(EVENT_OBJECT_IMAGE == eType || EVENT_OBJECT_URLITEM == 
eType || EVENT_OBJECT_IMAGEMAP == eType);
+            SwClient::SwClientNotify(rMod, rHint);
+            bool bClear = !GetRegisteredIn();
+            if(bClear)
+                Clear();
+        }
     }
 };
 
diff --git a/sw/inc/txtatr.hxx b/sw/inc/txtatr.hxx
index e96ea4fbe40d..15ed54683e14 100644
--- a/sw/inc/txtatr.hxx
+++ b/sw/inc/txtatr.hxx
@@ -45,6 +45,7 @@ public:
 
     void TriggerNodeUpdate(const sw::LegacyModifyHint&);
     void TriggerNodeUpdate(const SwFormatChangeHint&);
+    void TriggerNodeUpdate(const sw::AttrSetChangeHint&);
 
     // get and set TextNode pointer
     void ChgTextNode( SwTextNode* pNew ) { m_pTextNode = pNew; }
diff --git a/sw/qa/core/uwriter.cxx b/sw/qa/core/uwriter.cxx
index abfce2412516..4f6be8ff159e 100644
--- a/sw/qa/core/uwriter.cxx
+++ b/sw/qa/core/uwriter.cxx
@@ -1681,6 +1681,8 @@ namespace
                 ++m_nNotifyCount;
             else if(dynamic_cast<const sw::LegacyModifyHint*>(&rHint))
                 ++m_nModifyCount;
+            else if(dynamic_cast<const sw::AttrSetChangeHint*>(&rHint))
+                ++m_nModifyCount;
             else if(auto pModifyChangedHint = dynamic_cast<const 
sw::ModifyChangedHint*>(&rHint))
             {
                 ++m_nModifyChangedCount;
@@ -1696,6 +1698,8 @@ namespace
         {
             if(dynamic_cast<const sw::LegacyModifyHint*>(&rHint))
                 ++m_nModifyCount;
+            else if(dynamic_cast<const sw::AttrSetChangeHint*>(&rHint))
+                ++m_nModifyCount;
         }
     };
     struct TestListener : SvtListener
diff --git a/sw/source/core/attr/BorderCacheOwner.cxx 
b/sw/source/core/attr/BorderCacheOwner.cxx
index 9f9c56144927..8673e57389b4 100644
--- a/sw/source/core/attr/BorderCacheOwner.cxx
+++ b/sw/source/core/attr/BorderCacheOwner.cxx
@@ -26,7 +26,6 @@ void BorderCacheOwner::InvalidateInSwCache(const sal_uInt16 
nWhich)
     switch (nWhich)
     {
         case RES_OBJECTDYING:
-        case RES_ATTRSET_CHG:
         case RES_UL_SPACE:
         case RES_MARGIN_FIRSTLINE:
         case RES_MARGIN_TEXTLEFT:
diff --git a/sw/source/core/attr/calbck.cxx b/sw/source/core/attr/calbck.cxx
index b7b552a885a4..0351ea76b75f 100644
--- a/sw/source/core/attr/calbck.cxx
+++ b/sw/source/core/attr/calbck.cxx
@@ -218,7 +218,9 @@ sw::ClientIteratorBase* 
sw::ClientIteratorBase::s_pClientIters = nullptr;
 
 void SwModify::SwClientNotify(const SwModify&, const SfxHint& rHint)
 {
-    if (rHint.GetId() != SfxHintId::SwLegacyModify && rHint.GetId() != 
SfxHintId::SwRemoveUnoObject && rHint.GetId() != SfxHintId::SwRemoveUnoObject)
+    if (rHint.GetId() != SfxHintId::SwLegacyModify
+        && rHint.GetId() != SfxHintId::SwRemoveUnoObject
+        && rHint.GetId() != SfxHintId::SwAttrSetChange)
         return;
 
     DBG_TESTSOLARMUTEX();
@@ -264,7 +266,7 @@ void sw::ClientNotifyAttrChg(SwModify& rModify, const 
SwAttrSet& aSet, SwAttrSet
 {
     const SwAttrSetChg aChgOld(aSet, aOld);
     const SwAttrSetChg aChgNew(aSet, aNew);
-    const sw::LegacyModifyHint aHint(&aChgOld, &aChgNew);
+    const sw::AttrSetChangeHint aHint(&aChgOld, &aChgNew);
     rModify.SwClientNotify(rModify, aHint);
 }
 
diff --git a/sw/source/core/attr/format.cxx b/sw/source/core/attr/format.cxx
index 5c4683a07897..1ec609f0748d 100644
--- a/sw/source/core/attr/format.cxx
+++ b/sw/source/core/attr/format.cxx
@@ -171,7 +171,7 @@ void SwFormat::CopyAttrs( const SwFormat& rFormat )
 
             SwAttrSetChg aChgOld( m_aSet, aOld );
             SwAttrSetChg aChgNew( m_aSet, aNew );
-            SwClientNotify(*this, sw::LegacyModifyHint(&aChgOld, &aChgNew)); 
// send all modified ones
+            SwClientNotify(*this, sw::AttrSetChangeHint(&aChgOld, &aChgNew)); 
// send all modified ones
         }
     }
 
@@ -234,6 +234,36 @@ void SwFormat::SwClientNotify(const SwModify&, const 
SfxHint& rHint)
         SwModify::SwClientNotify(*this, rHint);
         return;
     }
+    if (rHint.GetId() == SfxHintId::SwAttrSetChange)
+    {
+        auto pChangeHint = static_cast<const sw::AttrSetChangeHint*>(&rHint);
+        std::optional<SwAttrSetChg> oOldClientChg, oNewClientChg;
+        std::optional<sw::AttrSetChangeHint> oDependsHint(std::in_place, 
pChangeHint->m_pOld, pChangeHint->m_pNew);
+        InvalidateInSwCache();
+        // NB: this still notifies depends even if this condition is not met, 
which seems non-obvious
+        auto pOldAttrSetChg = pChangeHint->m_pOld;
+        auto pNewAttrSetChg = pChangeHint->m_pNew;
+        if (pOldAttrSetChg && pNewAttrSetChg && 
pOldAttrSetChg->GetTheChgdSet() != &m_aSet)
+        {
+            // pass only those that are not set...
+            oNewClientChg.emplace(*pNewAttrSetChg);
+            oNewClientChg->GetChgSet()->Differentiate(m_aSet);
+            if(oNewClientChg->Count()) // ... if any
+            {
+                oOldClientChg.emplace(*pOldAttrSetChg);
+                oOldClientChg->GetChgSet()->Differentiate(m_aSet);
+                oDependsHint.emplace(&*oOldClientChg, &*oNewClientChg);
+            }
+            else
+                oDependsHint.reset();
+        }
+        if(oDependsHint)
+        {
+            InvalidateInSwFntCache();
+            SwModify::SwClientNotify(*this, *oDependsHint);
+        }
+        return;
+    }
     if (rHint.GetId() != SfxHintId::SwLegacyModify)
         return;
     auto pLegacy = static_cast<const sw::LegacyModifyHint*>(&rHint);
@@ -273,27 +303,6 @@ void SwFormat::SwClientNotify(const SwModify&, const 
SfxHint& rHint)
             }
             break;
         }
-        case RES_ATTRSET_CHG:
-        {
-            // NB: this still notifies depends even if this condition is not 
met, which seems non-obvious
-            auto pOldAttrSetChg = static_cast<const 
SwAttrSetChg*>(pLegacy->m_pOld);
-            auto pNewAttrSetChg = static_cast<const 
SwAttrSetChg*>(pLegacy->m_pNew);
-            if (pOldAttrSetChg && pNewAttrSetChg && 
pOldAttrSetChg->GetTheChgdSet() != &m_aSet)
-            {
-                // pass only those that are not set...
-                oNewClientChg.emplace(*pNewAttrSetChg);
-                oNewClientChg->GetChgSet()->Differentiate(m_aSet);
-                if(oNewClientChg->Count()) // ... if any
-                {
-                    oOldClientChg.emplace(*pOldAttrSetChg);
-                    oOldClientChg->GetChgSet()->Differentiate(m_aSet);
-                    oDependsHint.emplace(&*oOldClientChg, &*oNewClientChg);
-                }
-                else
-                    oDependsHint.reset();
-            }
-            break;
-        }
         default:
             // attribute is defined in this format
             if(SfxItemState::SET == m_aSet.GetItemState(nWhich, false))
diff --git a/sw/source/core/attr/hints.cxx b/sw/source/core/attr/hints.cxx
index c75930ea76a5..cc41d18a5ea5 100644
--- a/sw/source/core/attr/hints.cxx
+++ b/sw/source/core/attr/hints.cxx
@@ -85,16 +85,14 @@ SwTableFormulaUpdate::SwTableFormulaUpdate(const SwTable* 
pNewTable)
 }
 
 SwAttrSetChg::SwAttrSetChg( const SwAttrSet& rTheSet, SwAttrSet& rSet )
-    : SwMsgPoolItem( RES_ATTRSET_CHG ),
-    m_bDelSet( false ),
+  : m_bDelSet( false ),
     m_pChgSet( &rSet ),
     m_pTheChgdSet( &rTheSet )
 {
 }
 
 SwAttrSetChg::SwAttrSetChg( const SwAttrSetChg& rChgSet )
-    : SwMsgPoolItem( RES_ATTRSET_CHG ),
-    m_bDelSet( true ),
+  : m_bDelSet( true ),
     m_pTheChgdSet( rChgSet.m_pTheChgdSet )
 {
     m_pChgSet = new SwAttrSet( *rChgSet.m_pChgSet );
diff --git a/sw/source/core/crsr/crsrsh.cxx b/sw/source/core/crsr/crsrsh.cxx
index 89000ff283f4..162185339c47 100644
--- a/sw/source/core/crsr/crsrsh.cxx
+++ b/sw/source/core/crsr/crsrsh.cxx
@@ -2907,7 +2907,7 @@ void SwCursorShell::SwClientNotify(const SwModify&, const 
SfxHint& rHint)
             m_aGrfArrivedLnk.Call(*this);
         return;
     }
-    if (rHint.GetId() == SfxHintId::SwFormatChange)
+    if (rHint.GetId() == SfxHintId::SwFormatChange || rHint.GetId() == 
SfxHintId::SwAttrSetChange)
     {
         if( m_bCallChgLnk )
             // messages are not forwarded
@@ -2925,8 +2925,7 @@ void SwCursorShell::SwClientNotify(const SwModify&, const 
SfxHint& rHint)
         nWhich = RES_OBJECTDYING;
     if( m_bCallChgLnk &&
         ( !isFormatMessage(nWhich)
-                || nWhich == RES_UPDATE_ATTR
-                || nWhich == RES_ATTRSET_CHG ))
+                || nWhich == RES_UPDATE_ATTR ))
         // messages are not forwarded
         // #i6681#: RES_UPDATE_ATTR is implicitly unset in
         // SwTextNode::Insert(SwTextHint*, sal_uInt16); we react here and thus 
do
@@ -2936,7 +2935,6 @@ void SwCursorShell::SwClientNotify(const SwModify&, const 
SfxHint& rHint)
     {
         EndListeningAll();
     }
-
 }
 
 /** Does the current cursor create a selection?
diff --git a/sw/source/core/doc/docfmt.cxx b/sw/source/core/doc/docfmt.cxx
index 4945c9f948e8..2ef3dfd0c104 100644
--- a/sw/source/core/doc/docfmt.cxx
+++ b/sw/source/core/doc/docfmt.cxx
@@ -662,7 +662,7 @@ void SwDoc::SetDefault( const SfxItemSet& rSet )
     {
         SwAttrSetChg aChgOld( aOld, aOld );
         SwAttrSetChg aChgNew( aNew, aNew );
-        aCallMod.CallSwClientNotify(sw::LegacyModifyHint( &aChgOld, &aChgNew 
));      // all changed are sent
+        aCallMod.CallSwClientNotify(sw::AttrSetChangeHint( &aChgOld, &aChgNew 
));      // all changed are sent
     }
 
     // remove the default formats from the object again
diff --git a/sw/source/core/doc/docftn.cxx b/sw/source/core/doc/docftn.cxx
index cbce97a20fbb..b829b051248d 100644
--- a/sw/source/core/doc/docftn.cxx
+++ b/sw/source/core/doc/docftn.cxx
@@ -249,16 +249,9 @@ void SwEndNoteInfo::SwClientNotify( const SwModify& 
rModify, const SfxHint& rHin
     if (rHint.GetId() == SfxHintId::SwLegacyModify)
     {
         auto pLegacyHint = static_cast<const sw::LegacyModifyHint*>(&rHint);
-        switch(pLegacyHint->GetWhich())
-        {
-            case RES_ATTRSET_CHG:
-                UpdateFormatOrAttr();
-                break;
-            default:
-                CheckRegistration( pLegacyHint->m_pOld );
-        }
+        CheckRegistration( pLegacyHint->m_pOld );
     }
-    else if (rHint.GetId() == SfxHintId::SwFormatChange)
+    else if (rHint.GetId() == SfxHintId::SwFormatChange || rHint.GetId() == 
SfxHintId::SwAttrSetChange)
     {
         UpdateFormatOrAttr();
     }
diff --git a/sw/source/core/doc/fmtcol.cxx b/sw/source/core/doc/fmtcol.cxx
index daecd6760bd6..cb3ad58e1277 100644
--- a/sw/source/core/doc/fmtcol.cxx
+++ b/sw/source/core/doc/fmtcol.cxx
@@ -139,7 +139,8 @@ void SwTextFormatColl::SwClientNotify(const SwModify& 
rModify, const SfxHint& rH
         CallSwClientNotify(rHint);
         return;
     }
-    else if (rHint.GetId() != SfxHintId::SwLegacyModify && rHint.GetId() != 
SfxHintId::SwFormatChange)
+    else if (rHint.GetId() != SfxHintId::SwLegacyModify && rHint.GetId() != 
SfxHintId::SwFormatChange
+             && rHint.GetId() != SfxHintId::SwAttrSetChange)
         return;
     if(GetDoc()->IsInDtor())
     {
@@ -160,30 +161,9 @@ void SwTextFormatColl::SwClientNotify(const SwModify& 
rModify, const SfxHint& rH
     {
         auto pLegacy = static_cast<const sw::LegacyModifyHint*>(&rHint);
         const auto pNew = pLegacy->m_pNew;
-        const SwAttrSetChg *pNewChgSet = nullptr;
 
         switch( pLegacy->GetWhich() )
         {
-        case RES_ATTRSET_CHG:
-            // Only recalculate if we're not the sender!
-            pNewChgSet = &pNew->StaticWhichCast(RES_ATTRSET_CHG);
-            pNewFirstLineIndent = 
pNewChgSet->GetChgSet()->GetItemIfSet(RES_MARGIN_FIRSTLINE, false);
-            pNewTextLeftMargin = 
pNewChgSet->GetChgSet()->GetItemIfSet(RES_MARGIN_TEXTLEFT, false);
-            pNewRightMargin = 
pNewChgSet->GetChgSet()->GetItemIfSet(RES_MARGIN_RIGHT, false);
-            pNewULSpace = pNewChgSet->GetChgSet()->GetItemIfSet( RES_UL_SPACE, 
false );
-            aFontSizeArr[0] = pNewChgSet->GetChgSet()->GetItemIfSet( 
RES_CHRATR_FONTSIZE, false );
-            aFontSizeArr[1] = pNewChgSet->GetChgSet()->GetItemIfSet( 
RES_CHRATR_CJK_FONTSIZE, false );
-            aFontSizeArr[2] = pNewChgSet->GetChgSet()->GetItemIfSet( 
RES_CHRATR_CTL_FONTSIZE, false );
-            // #i70223#, #i84745#
-            // check, if attribute set is applied to this paragraph style
-            if ( bAssignedToListLevelOfOutlineStyle &&
-                 pNewChgSet->GetTheChgdSet() == &GetAttrSet() )
-            {
-                pNewNumRuleItem = pNewChgSet->GetChgSet()->GetItemIfSet( 
RES_PARATR_NUMRULE, false );
-            }
-
-            break;
-
         case RES_MARGIN_FIRSTLINE:
             pNewFirstLineIndent = &pNew->StaticWhichCast(RES_MARGIN_FIRSTLINE);
             break;
@@ -216,6 +196,27 @@ void SwTextFormatColl::SwClientNotify(const SwModify& 
rModify, const SfxHint& rH
             break;
         }
     }
+    else if (rHint.GetId() == SfxHintId::SwAttrSetChange)
+    {
+        auto pChangeHint = static_cast<const sw::AttrSetChangeHint*>(&rHint);
+        const SwAttrSetChg *pNewChgSet = pChangeHint->m_pNew;
+
+        // Only recalculate if we're not the sender!
+        pNewFirstLineIndent = 
pNewChgSet->GetChgSet()->GetItemIfSet(RES_MARGIN_FIRSTLINE, false);
+        pNewTextLeftMargin = 
pNewChgSet->GetChgSet()->GetItemIfSet(RES_MARGIN_TEXTLEFT, false);
+        pNewRightMargin = 
pNewChgSet->GetChgSet()->GetItemIfSet(RES_MARGIN_RIGHT, false);
+        pNewULSpace = pNewChgSet->GetChgSet()->GetItemIfSet( RES_UL_SPACE, 
false );
+        aFontSizeArr[0] = pNewChgSet->GetChgSet()->GetItemIfSet( 
RES_CHRATR_FONTSIZE, false );
+        aFontSizeArr[1] = pNewChgSet->GetChgSet()->GetItemIfSet( 
RES_CHRATR_CJK_FONTSIZE, false );
+        aFontSizeArr[2] = pNewChgSet->GetChgSet()->GetItemIfSet( 
RES_CHRATR_CTL_FONTSIZE, false );
+        // #i70223#, #i84745#
+        // check, if attribute set is applied to this paragraph style
+        if ( bAssignedToListLevelOfOutlineStyle &&
+             pNewChgSet->GetTheChgdSet() == &GetAttrSet() )
+        {
+            pNewNumRuleItem = pNewChgSet->GetChgSet()->GetItemIfSet( 
RES_PARATR_NUMRULE, false );
+        }
+    }
     else // rHint.GetId() == SfxHintId::SwFormatChange
     {
         if( GetAttrSet().GetParent() )
@@ -363,12 +364,13 @@ void SwTextFormatColl::SwClientNotify(const SwModify& 
rModify, const SfxHint& rH
     // if the parent changed, we can't know how many properties are involved: 
always notify a change
     if (rHint.GetId() == SfxHintId::SwLegacyModify)
     {
-        auto pLegacy = static_cast<const sw::LegacyModifyHint*>(&rHint);
-        const auto pOld = pLegacy->m_pOld;
-        const SwAttrSetChg *pOldChgSet = nullptr;
-
-        if( pLegacy->GetWhich() == RES_ATTRSET_CHG)
-            pOldChgSet = &pOld->StaticWhichCast(RES_ATTRSET_CHG);
+        if (bNewParent || !nNoNotify)
+            SwFormatColl::SwClientNotify(rModify, rHint);
+    }
+    else if (rHint.GetId() == SfxHintId::SwAttrSetChange)
+    {
+        auto pChangeHint = static_cast<const sw::AttrSetChangeHint*>(&rHint);
+        const SwAttrSetChg *pOldChgSet = pChangeHint->m_pOld;
 
         if (bNewParent || !nNoNotify || (pOldChgSet && 
pOldChgSet->GetChgSet()->Count() > nNoNotify))
             SwFormatColl::SwClientNotify(rModify, rHint);
diff --git a/sw/source/core/doc/lineinfo.cxx b/sw/source/core/doc/lineinfo.cxx
index af2094fd0c75..8cc455b0aa82 100644
--- a/sw/source/core/doc/lineinfo.cxx
+++ b/sw/source/core/doc/lineinfo.cxx
@@ -114,7 +114,9 @@ void SwLineNumberInfo::SetCharFormat( SwCharFormat 
*pChFormat )
 
 void SwLineNumberInfo::SwClientNotify(const SwModify&, const SfxHint& rHint)
 {
-    if (rHint.GetId() != SfxHintId::SwLegacyModify && rHint.GetId() != 
SfxHintId::SwFormatChange)
+    if (rHint.GetId() != SfxHintId::SwLegacyModify
+        && rHint.GetId() != SfxHintId::SwFormatChange
+        && rHint.GetId() != SfxHintId::SwAttrSetChange)
         return;
     if (rHint.GetId() == SfxHintId::SwLegacyModify)
     {
diff --git a/sw/source/core/doc/notxtfrm.cxx b/sw/source/core/doc/notxtfrm.cxx
index a0a992982a4b..affd0d7388ff 100644
--- a/sw/source/core/doc/notxtfrm.cxx
+++ b/sw/source/core/doc/notxtfrm.cxx
@@ -756,95 +756,97 @@ void SwNoTextFrame::SwClientNotify(const SwModify& 
rModify, const SfxHint& rHint
             InvalidatePrt();
             SetCompletePaint();
         }
-        return;
     }
-    if(rHint.GetId() == SfxHintId::SwPreGraphicArrived
+    else if(rHint.GetId() == SfxHintId::SwPreGraphicArrived
             || rHint.GetId() == SfxHintId::SwGraphicPieceArrived
             || rHint.GetId() == SfxHintId::SwLinkedGraphicStreamArrived)
     {
         OnGraphicArrived();
-        return;
     }
     else if (rHint.GetId() == SfxHintId::SwFormatChange)
     {
         ClearCache();
         InvalidatePrt();
         SetCompletePaint();
-        return;
     }
-    else if (rHint.GetId() != SfxHintId::SwLegacyModify)
-        return;
-    auto pLegacy = static_cast<const sw::LegacyModifyHint*>(&rHint);
-    sal_uInt16 nWhich = pLegacy->GetWhich();
-
-    SwContentFrame::SwClientNotify(rModify, rHint);
-
-    switch( nWhich )
+    else if (rHint.GetId() == SfxHintId::SwAttrSetChange)
     {
-    case RES_OBJECTDYING:
-        break;
+        auto pChangeHint = static_cast<const sw::AttrSetChangeHint*>(&rHint);
+        SwContentFrame::SwClientNotify(rModify, rHint);
 
-    case RES_UPDATE_ATTR:
-        if (GetNode()->GetNodeType() != SwNodeType::Grf) {
-            break;
-        }
-        ClearCache();
-        break;
+        sal_uInt16 n;
+        for( n = RES_GRFATR_BEGIN; n < RES_GRFATR_END; ++n )
+            if( SfxItemState::SET == pChangeHint->m_pOld->GetChgSet()->
+                            GetItemState( n, false ))
+            {
+                ClearCache();
 
-    case RES_ATTRSET_CHG:
-        {
-            sal_uInt16 n;
-            for( n = RES_GRFATR_BEGIN; n < RES_GRFATR_END; ++n )
-                if( SfxItemState::SET == static_cast<const 
SwAttrSetChg*>(pLegacy->m_pOld)->GetChgSet()->
-                                GetItemState( n, false ))
+                if(RES_GRFATR_ROTATION == n)
                 {
-                    ClearCache();
-
-                    if(RES_GRFATR_ROTATION == n)
+                    // RotGrfFlyFrame: Update Handles in view, these may be 
rotation-dependent
+                    // (e.g. crop handles) and need a visualisation update
+                    if ( GetNode()->GetNodeType() == SwNodeType::Grf )
                     {
-                        // RotGrfFlyFrame: Update Handles in view, these may 
be rotation-dependent
-                        // (e.g. crop handles) and need a visualisation update
-                        if ( GetNode()->GetNodeType() == SwNodeType::Grf )
-                        {
-                            SwGrfNode* pNd = static_cast<SwGrfNode*>( 
GetNode());
-                            SwViewShell *pVSh = 
pNd->GetDoc().getIDocumentLayoutAccess().GetCurrentViewShell();
-
-                            if(pVSh)
-                            {
-                                SdrView* pDrawView = pVSh->GetDrawView();
+                        SwGrfNode* pNd = static_cast<SwGrfNode*>( GetNode());
+                        SwViewShell *pVSh = 
pNd->GetDoc().getIDocumentLayoutAccess().GetCurrentViewShell();
 
-                                if(pDrawView)
-                                {
-                                    pDrawView->AdjustMarkHdl(nullptr);
-                                }
-                            }
+                        if(pVSh)
+                        {
+                            SdrView* pDrawView = pVSh->GetDrawView();
 
-                            // RotateFlyFrame3 - invalidate needed for 
ContentFrame (inner, this)
-                            // and LayoutFrame (outer, GetUpper). It is 
possible to only invalidate
-                            // the outer frame, but that leads to an 
in-between state that gets
-                            // potentially painted
-                            if(GetUpper())
+                            if(pDrawView)
                             {
-                                GetUpper()->InvalidateAll_();
+                                pDrawView->AdjustMarkHdl(nullptr);
                             }
+                        }
 
-                            InvalidateAll_();
+                        // RotateFlyFrame3 - invalidate needed for 
ContentFrame (inner, this)
+                        // and LayoutFrame (outer, GetUpper). It is possible 
to only invalidate
+                        // the outer frame, but that leads to an in-between 
state that gets
+                        // potentially painted
+                        if(GetUpper())
+                        {
+                            GetUpper()->InvalidateAll_();
                         }
+
+                        InvalidateAll_();
                     }
-                    break;
                 }
-            if( RES_GRFATR_END == n )           // not found
-                return ;
-        }
-        break;
+                break;
+            }
+        if( RES_GRFATR_END == n )           // not found
+            return ;
 
-    default:
-        if ( !pLegacy->m_pNew || !isGRFATR(nWhich) )
-            return;
+        InvalidatePrt();
+        SetCompletePaint();
     }
+    else if (rHint.GetId() == SfxHintId::SwLegacyModify)
+    {
+        auto pLegacy = static_cast<const sw::LegacyModifyHint*>(&rHint);
+        sal_uInt16 nWhich = pLegacy->GetWhich();
+
+        SwContentFrame::SwClientNotify(rModify, rHint);
 
-    InvalidatePrt();
-    SetCompletePaint();
+        switch( nWhich )
+        {
+        case RES_OBJECTDYING:
+            break;
+
+        case RES_UPDATE_ATTR:
+            if (GetNode()->GetNodeType() != SwNodeType::Grf) {
+                break;
+            }
+            ClearCache();
+            break;
+
+        default:
+            if ( !pLegacy->m_pNew || !isGRFATR(nWhich) )
+                return;
+        }
+
+        InvalidatePrt();
+        SetCompletePaint();
+    }
 }
 
 static void lcl_correctlyAlignRect( SwRect& rAlignedGrfArea, const SwRect& 
rInArea, vcl::RenderContext const * pOut )
diff --git a/sw/source/core/doc/number.cxx b/sw/source/core/doc/number.cxx
index f8fc67f0dab7..5708fdbf1cb2 100644
--- a/sw/source/core/doc/number.cxx
+++ b/sw/source/core/doc/number.cxx
@@ -308,23 +308,20 @@ void SwNumFormat::SwClientNotify(const SwModify&, const 
SfxHint& rHint)
             UpdateNumNodes(*const_cast<SwDoc*>(pFormat->GetDoc()));
         return;
     }
+    if (rHint.GetId() == SfxHintId::SwAttrSetChange)
+    {
+        // Look for the NumRules object in the Doc where this NumFormat is set.
+        // The format does not need to exist!
+        const SwCharFormat* pFormat = GetCharFormat();
+
+        if(pFormat && !pFormat->GetDoc()->IsInDtor())
+            UpdateNumNodes(*const_cast<SwDoc*>(pFormat->GetDoc()));
+        return;
+    }
     if (rHint.GetId() != SfxHintId::SwLegacyModify)
         return;
     auto pLegacy = static_cast<const sw::LegacyModifyHint*>(&rHint);
-    // Look for the NumRules object in the Doc where this NumFormat is set.
-    // The format does not need to exist!
-    const SwCharFormat* pFormat = nullptr;
-    switch(pLegacy->GetWhich())
-    {
-        case RES_ATTRSET_CHG:
-            pFormat = GetCharFormat();
-            break;
-    }
-
-    if(pFormat && !pFormat->GetDoc()->IsInDtor())
-        UpdateNumNodes(*const_cast<SwDoc*>(pFormat->GetDoc()));
-    else
-        CheckRegistration(pLegacy->m_pOld);
+    CheckRegistration(pLegacy->m_pOld);
 }
 
 OUString SwNumFormat::GetCharFormatName() const
diff --git a/sw/source/core/docnode/node.cxx b/sw/source/core/docnode/node.cxx
index 054176a7682a..a78d72477b45 100644
--- a/sw/source/core/docnode/node.cxx
+++ b/sw/source/core/docnode/node.cxx
@@ -1103,7 +1103,7 @@ void SwContentNode::UpdateAttr(const SwUpdateAttr& 
rUpdate)
 {
     if (GetNodes().IsDocNodes()
             && IsTextNode()
-            && RES_ATTRSET_CHG == rUpdate.getWhichAttr())
+            && RES_UPDATEATTR_ATTRSET_CHG == rUpdate.getWhichAttr())
         static_cast<SwTextNode*>(this)->SetCalcHiddenCharFlags();
     CallSwClientNotify(sw::LegacyModifyHint(&rUpdate, &rUpdate));
 }
@@ -1130,13 +1130,23 @@ void SwContentNode::SwClientNotify( const SwModify&, 
const SfxHint& rHint)
             AttrSetHandleHelper::SetParent(mpAttrSet, *this, pFormatColl, 
pFormatColl);
         CallSwClientNotify(rHint);
     }
+    else if (rHint.GetId() == SfxHintId::SwAttrSetChange)
+    {
+        auto pChangeHint = static_cast<const sw::AttrSetChangeHint*>(&rHint);
+        InvalidateInSwCache();
+        if (GetNodes().IsDocNodes()
+                && IsTextNode()
+                && pChangeHint->m_pOld
+                && SfxItemState::SET == 
pChangeHint->m_pOld->GetChgSet()->GetItemState(RES_CHRATR_HIDDEN, false))
+            static_cast<SwTextNode*>(this)->SetCalcHiddenCharFlags();
+        CallSwClientNotify(rHint);
+    }
     else if (rHint.GetId() == SfxHintId::SwLegacyModify)
     {
         auto pLegacyHint = static_cast<const sw::LegacyModifyHint*>(&rHint);
         const sal_uInt16 nWhich = pLegacyHint->GetWhich();
         InvalidateInSwCache(nWhich);
 
-        bool bCalcHidden = false;
         switch(nWhich)
         {
             case RES_OBJECTDYING:
@@ -1155,14 +1165,6 @@ void SwContentNode::SwClientNotify( const SwModify&, 
const SfxHint& rHint)
                 }
                 break;
 
-            case RES_ATTRSET_CHG:
-                if (GetNodes().IsDocNodes()
-                        && IsTextNode()
-                        && pLegacyHint->m_pOld
-                        && SfxItemState::SET == 
pLegacyHint->m_pOld->StaticWhichCast(RES_ATTRSET_CHG).GetChgSet()->GetItemState(RES_CHRATR_HIDDEN,
 false))
-                    bCalcHidden = true;
-                break;
-
             case RES_UPDATE_ATTR:
                 // RES_UPDATE_ATTR _should_ always contain a SwUpdateAttr hint 
in old and new.
                 // However, faking one with just a basic SfxPoolItem setting a 
WhichId has been observed.
@@ -1183,8 +1185,6 @@ void SwContentNode::SwClientNotify( const SwModify&, 
const SfxHint& rHint)
                 UpdateAttr(rUpdateAttr);
                 return;
         }
-        if(bCalcHidden)
-            static_cast<SwTextNode*>(this)->SetCalcHiddenCharFlags();
         CallSwClientNotify(rHint);
     }
     else if (rHint.GetId() == SfxHintId::SwAutoFormatUsedHint)
diff --git a/sw/source/core/docnode/section.cxx 
b/sw/source/core/docnode/section.cxx
index fbb00098e1e9..9d82953715a1 100644
--- a/sw/source/core/docnode/section.cxx
+++ b/sw/source/core/docnode/section.cxx
@@ -403,19 +403,63 @@ void SwSection::Notify(SfxHint const& rHint)
         auto rSectionHidden = static_cast<const sw::SectionHidden&>(rHint);
         m_Data.SetHiddenFlag(rSectionHidden.m_isHidden || (m_Data.IsHidden() 
&& m_Data.IsCondHidden()));
         return;
-    } else if (rHint.GetId() != SfxHintId::SwLegacyModify)
+    } else if (rHint.GetId() != SfxHintId::SwLegacyModify && rHint.GetId() != 
SfxHintId::SwAttrSetChange)
         return;
-    auto pLegacy = static_cast<const sw::LegacyModifyHint*>(&rHint);
-    auto pOld = pLegacy->m_pOld;
-    auto pNew = pLegacy->m_pNew;
+
     bool bUpdateFootnote = false;
-    switch(pLegacy->GetWhich())
+    if (rHint.GetId() == SfxHintId::SwLegacyModify)
+    {
+        auto pLegacy = static_cast<const sw::LegacyModifyHint*>(&rHint);
+        auto pOld = pLegacy->m_pOld;
+        auto pNew = pLegacy->m_pNew;
+        switch(pLegacy->GetWhich())
+        {
+        case RES_PROTECT:
+            if( pNew )
+            {
+                bool bNewFlag =
+                    static_cast<const 
SvxProtectItem*>(pNew)->IsContentProtected();
+                // this used to inherit the flag from the parent, but then 
there is
+                // no way to turn it off in an inner section
+                m_Data.SetProtectFlag( bNewFlag );
+            }
+            return;
+        // edit in readonly sections
+        case RES_EDIT_IN_READONLY:
+            if( pNew )
+            {
+                const bool bNewFlag =
+                    static_cast<const 
SwFormatEditInReadonly*>(pNew)->GetValue();
+                m_Data.SetEditInReadonlyFlag( bNewFlag );
+            }
+            return;
+
+        case RES_COL:
+            // Is handled by the Layout, if appropriate
+            break;
+
+        case RES_FTN_AT_TXTEND:
+        case RES_END_AT_TXTEND:
+            if( pNew && pOld )
+            {
+                bUpdateFootnote = true;
+            }
+            break;
+
+        default:
+            CheckRegistration( pOld );
+            break;
+        }
+    }
+    else // rHint.GetId() == SfxHintId::SwAttrSetChange
     {
-    case RES_ATTRSET_CHG:
+        auto pChangeHint = static_cast<const sw::AttrSetChangeHint*>(&rHint);
+        const SwAttrSetChg* pOld = pChangeHint->m_pOld;
+        const SwAttrSetChg* pNew = pChangeHint->m_pNew;
         if (pNew && pOld)
         {
-            SfxItemSet* pNewSet = const_cast<SwAttrSetChg*>(static_cast<const 
SwAttrSetChg*>(pNew))->GetChgSet();
-            SfxItemSet* pOldSet = const_cast<SwAttrSetChg*>(static_cast<const 
SwAttrSetChg*>(pOld))->GetChgSet();
+            SfxItemSet* pNewSet = const_cast<SwAttrSetChg*>(pNew)->GetChgSet();
+            SfxItemSet* pOldSet = const_cast<SwAttrSetChg*>(pOld)->GetChgSet();
 
             if( const SvxProtectItem* pItem = pNewSet->GetItemIfSet(
                         RES_PROTECT, false ) )
@@ -445,43 +489,6 @@ void SwSection::Notify(SfxHint const& rHint)
             if( !pNewSet->Count() )
                 return;
         }
-        break;
-
-    case RES_PROTECT:
-        if( pNew )
-        {
-            bool bNewFlag =
-                static_cast<const SvxProtectItem*>(pNew)->IsContentProtected();
-            // this used to inherit the flag from the parent, but then there is
-            // no way to turn it off in an inner section
-            m_Data.SetProtectFlag( bNewFlag );
-        }
-        return;
-    // edit in readonly sections
-    case RES_EDIT_IN_READONLY:
-        if( pNew )
-        {
-            const bool bNewFlag =
-                static_cast<const SwFormatEditInReadonly*>(pNew)->GetValue();
-            m_Data.SetEditInReadonlyFlag( bNewFlag );
-        }
-        return;
-
-    case RES_COL:
-        // Is handled by the Layout, if appropriate
-        break;
-
-    case RES_FTN_AT_TXTEND:
-    case RES_END_AT_TXTEND:
-        if( pNew && pOld )
-        {
-            bUpdateFootnote = true;
-        }
-        break;
-
-    default:
-        CheckRegistration( pOld );
-        break;
     }
 
     if( bUpdateFootnote )
@@ -727,19 +734,15 @@ void SwSectionFormat::SwClientNotify(const SwModify& 
rMod, const SfxHint& rHint)
         SwFrameFormat::SwClientNotify(rMod, rHint);
         return;
     }
-    else if (rHint.GetId() != SfxHintId::SwLegacyModify)
-        return;
-    auto pLegacy = static_cast<const sw::LegacyModifyHint*>(&rHint);
-    sal_uInt16 nWhich = pLegacy->GetWhich();
-    auto pOld = pLegacy->m_pOld;
-    auto pNew = pLegacy->m_pNew;
-    switch( nWhich )
+    else if (rHint.GetId() == SfxHintId::SwAttrSetChange)
     {
-    case RES_ATTRSET_CHG:
+        auto pChangeHint = static_cast<const sw::AttrSetChangeHint*>(&rHint);
+        const SwAttrSetChg* pOld = pChangeHint->m_pOld;
+        const SwAttrSetChg* pNew = pChangeHint->m_pNew;
         if (HasWriterListeners() && pOld && pNew)
         {
-            SfxItemSet* pNewSet = const_cast<SwAttrSetChg*>(static_cast<const 
SwAttrSetChg*>(pNew))->GetChgSet();
-            SfxItemSet* pOldSet = const_cast<SwAttrSetChg*>(static_cast<const 
SwAttrSetChg*>(pOld))->GetChgSet();
+            SfxItemSet* pNewSet = const_cast<SwAttrSetChg*>(pNew)->GetChgSet();
+            SfxItemSet* pOldSet = const_cast<SwAttrSetChg*>(pOld)->GetChgSet();
             const SfxPoolItem *pItem;
             if( SfxItemState::SET == pNewSet->GetItemState(
                                         RES_PROTECT, false, &pItem ))
@@ -772,11 +775,19 @@ void SwSectionFormat::SwClientNotify(const SwModify& 
rMod, const SfxHint& rHint)
                 pNewSet->ClearItem( RES_END_AT_TXTEND );
                 pOldSet->ClearItem( RES_END_AT_TXTEND );
             }
-            if( !static_cast<const SwAttrSetChg*>(pOld)->GetChgSet()->Count() )
+            if( !pOld->GetChgSet()->Count() )
                 return;
         }
-        break;
-
+        SwFrameFormat::SwClientNotify(rMod, rHint);
+    }
+    else if (rHint.GetId() != SfxHintId::SwLegacyModify)
+        return;
+    auto pLegacy = static_cast<const sw::LegacyModifyHint*>(&rHint);
+    sal_uInt16 nWhich = pLegacy->GetWhich();
+    auto pOld = pLegacy->m_pOld;
+    auto pNew = pLegacy->m_pNew;
+    switch( nWhich )
+    {
     case RES_FTN_AT_TXTEND:
     case RES_END_AT_TXTEND:
     case RES_PROTECT:
diff --git a/sw/source/core/draw/dcontact.cxx b/sw/source/core/draw/dcontact.cxx
index 74edb2d3051a..63dbcae0373c 100644
--- a/sw/source/core/draw/dcontact.cxx
+++ b/sw/source/core/draw/dcontact.cxx
@@ -1398,17 +1398,16 @@ namespace
     {
         sal_uInt16 nWhich = _rItem.Which();
         const SwFormatAnchor* pAnchorFormat = nullptr;
-        if ( RES_ATTRSET_CHG == nWhich )
-        {
-            pAnchorFormat = static_cast<const 
SwAttrSetChg&>(_rItem).GetChgSet()->
-                GetItemIfSet( RES_ANCHOR, false );
-        }
-        else if ( RES_ANCHOR == nWhich )
+        if ( RES_ANCHOR == nWhich )
         {
             pAnchorFormat = &static_cast<const SwFormatAnchor&>(_rItem);
         }
         return pAnchorFormat;
     }
+    const SwFormatAnchor* lcl_getAnchorFormat( const SwAttrSetChg& _rItem )
+    {
+        return _rItem.GetChgSet()->GetItemIfSet( RES_ANCHOR, false );
+    }
 }
 
 void SwDrawContact::SwClientNotify(const SwModify& rMod, const SfxHint& rHint)
@@ -1426,14 +1425,30 @@ void SwDrawContact::SwClientNotify(const SwModify& 
rMod, const SfxHint& rHint)
         // #i51474#
         GetAnchoredObj(nullptr)->ResetLayoutProcessBools();
     }
-    else if (rHint.GetId() == SfxHintId::SwLegacyModify)
+    else if (rHint.GetId() == SfxHintId::SwLegacyModify || rHint.GetId() == 
SfxHintId::SwAttrSetChange)
     {
-        auto pLegacyHint = static_cast<const sw::LegacyModifyHint*>(&rHint);
         SAL_WARN_IF(mbDisconnectInProgress, "sw.core", 
"<SwDrawContact::Modify(..)> called during disconnection.");
 
-        const SfxPoolItem* pNew = pLegacyHint->m_pNew;
-        sal_uInt16 nWhich = pNew ? pNew->Which() : 0;
-        if(const SwFormatAnchor* pNewAnchorFormat = pNew ? 
lcl_getAnchorFormat(*pNew) : nullptr)
+        const SwFormatAnchor* pNewAnchorFormat = nullptr;
+        const SwFormatAnchor* pOldAnchorFormat = nullptr;
+        if (rHint.GetId() == SfxHintId::SwLegacyModify)
+        {
+            auto pLegacyHint = static_cast<const 
sw::LegacyModifyHint*>(&rHint);
+            if (pLegacyHint->m_pNew)
+                pNewAnchorFormat = lcl_getAnchorFormat(*pLegacyHint->m_pNew);
+            if (pLegacyHint->m_pOld)
+                pOldAnchorFormat = lcl_getAnchorFormat(*pLegacyHint->m_pOld);
+        }
+        else // rHint.GetId() == SfxHintId::SwAttrSetChange)
+        {
+            auto pChangeHint = static_cast<const 
sw::AttrSetChangeHint*>(&rHint);
+            if (pChangeHint->m_pNew)
+                pNewAnchorFormat = lcl_getAnchorFormat(*pChangeHint->m_pNew);
+            if (pChangeHint->m_pOld)
+                pOldAnchorFormat = lcl_getAnchorFormat(*pChangeHint->m_pOld);
+        }
+
+        if(pNewAnchorFormat)
         {
             // Do not respond to a Reset Anchor!
             if(GetFormat()->GetAttrSet().GetItemState(RES_ANCHOR, false) == 
SfxItemState::SET)
@@ -1458,7 +1473,6 @@ void SwDrawContact::SwClientNotify(const SwModify& rMod, 
const SfxHint& rHint)
                     lcl_NotifyBackgroundOfObj(*this, *GetMaster(), pOldRect);
                     NotifyBackgroundOfAllVirtObjs(pOldRect);
 
-                    const SwFormatAnchor* pOldAnchorFormat = 
pLegacyHint->m_pOld ? lcl_getAnchorFormat(*pLegacyHint->m_pOld) : nullptr;
                     if(!pOldAnchorFormat || (pOldAnchorFormat->GetAnchorId() 
!= pNewAnchorFormat->GetAnchorId()))
                     {
                         if(maAnchoredDrawObj.DrawObj())
@@ -1480,34 +1494,40 @@ void SwDrawContact::SwClientNotify(const SwModify& 
rMod, const SfxHint& rHint)
                   maAnchoredDrawObj.GetDrawObj()->GetUserCall() )
         {
             bool bUpdateSortedObjsList(false);
-            switch(nWhich)
+            if (rHint.GetId() == SfxHintId::SwLegacyModify)
             {
-                case RES_UL_SPACE:
-                case RES_LR_SPACE:
-                case RES_HORI_ORIENT:
-                case RES_VERT_ORIENT:
-                case RES_FOLLOW_TEXT_FLOW: // #i28701# - add attribute 'Follow 
text flow'
-                    break;
-                case RES_SURROUND:
-                case RES_OPAQUE:
-                case RES_WRAP_INFLUENCE_ON_OBJPOS:
-                    // --> #i28701# - on change of wrapping style, hell|heaven 
layer,
-                    // or wrapping style influence an update of the 
<SwSortedObjs> list,
-                    // the drawing object is registered in, has to be 
performed. This is triggered
-                    // by the 1st parameter of method call 
<InvalidateObjs_(..)>.
-                    bUpdateSortedObjsList = true;
-                    break;
-                case RES_ATTRSET_CHG: // #i35443#
+                auto pLegacyHint = static_cast<const 
sw::LegacyModifyHint*>(&rHint);
+                sal_uInt16 nWhich = pLegacyHint->m_pNew ? 
pLegacyHint->m_pNew->Which() : 0;
+                switch(nWhich)
                 {
-                    auto pChgSet = static_cast<const 
SwAttrSetChg*>(pNew)->GetChgSet();
-                    if(pChgSet->GetItemState(RES_SURROUND, false) == 
SfxItemState::SET ||
-                            pChgSet->GetItemState(RES_OPAQUE, false) == 
SfxItemState::SET ||
-                            
pChgSet->GetItemState(RES_WRAP_INFLUENCE_ON_OBJPOS, false) == SfxItemState::SET)
+                    case RES_UL_SPACE:
+                    case RES_LR_SPACE:
+                    case RES_HORI_ORIENT:
+                    case RES_VERT_ORIENT:
+                    case RES_FOLLOW_TEXT_FLOW: // #i28701# - add attribute 
'Follow text flow'
+                        break;
+                    case RES_SURROUND:
+                    case RES_OPAQUE:
+                    case RES_WRAP_INFLUENCE_ON_OBJPOS:
+                        // --> #i28701# - on change of wrapping style, 
hell|heaven layer,
+                        // or wrapping style influence an update of the 
<SwSortedObjs> list,
+                        // the drawing object is registered in, has to be 
performed. This is triggered
+                        // by the 1st parameter of method call 
<InvalidateObjs_(..)>.
                         bUpdateSortedObjsList = true;
+                        break;
+                    default:
+                        assert(!"<SwDraw Contact::Modify(..)> - unhandled 
attribute?");
                 }
-                break;
-                default:
-                    assert(!"<SwDraw Contact::Modify(..)> - unhandled 
attribute?");
+            }
+            else // rHint.GetId() == SfxHintId::SwAttrSetChange)
+            {
+                // #i35443#
+                auto pChangeHint = static_cast<const 
sw::AttrSetChangeHint*>(&rHint);
+                auto pChgSet = pChangeHint->m_pNew->GetChgSet();
+                if(pChgSet->GetItemState(RES_SURROUND, false) == 
SfxItemState::SET ||
+                        pChgSet->GetItemState(RES_OPAQUE, false) == 
SfxItemState::SET ||
+                        pChgSet->GetItemState(RES_WRAP_INFLUENCE_ON_OBJPOS, 
false) == SfxItemState::SET)
+                    bUpdateSortedObjsList = true;
             }
             lcl_NotifyBackgroundOfObj(*this, *GetMaster(), nullptr);
             NotifyBackgroundOfAllVirtObjs(nullptr);
diff --git a/sw/source/core/fields/ddetbl.cxx b/sw/source/core/fields/ddetbl.cxx
index b990f2d846bc..5987cb3851cd 100644
--- a/sw/source/core/fields/ddetbl.cxx
+++ b/sw/source/core/fields/ddetbl.cxx
@@ -85,7 +85,9 @@ SwDDETable::~SwDDETable()
 
 void SwDDETable::SwClientNotify(const SwModify& rModify, const SfxHint& rHint)
 {
-    if (rHint.GetId() == SfxHintId::SwLegacyModify || rHint.GetId() == 
SfxHintId::SwAutoFormatUsedHint)
+    if (rHint.GetId() == SfxHintId::SwLegacyModify
+        || rHint.GetId() == SfxHintId::SwAutoFormatUsedHint
+        || rHint.GetId() == SfxHintId::SwAttrSetChange)
     {
         SwTable::SwClientNotify(rModify, rHint);
     }
diff --git a/sw/source/core/fields/docufld.cxx 
b/sw/source/core/fields/docufld.cxx
index cced5f680276..c6ce1a746922 100644
--- a/sw/source/core/fields/docufld.cxx
+++ b/sw/source/core/fields/docufld.cxx
@@ -2266,9 +2266,14 @@ void SwRefPageGetFieldType::SwClientNotify(const 
SwModify&, const SfxHint& rHint
         CallSwClientNotify(rHint);
         return;
     }
-    if (rHint.GetId() != SfxHintId::SwLegacyModify)
+    if (rHint.GetId() != SfxHintId::SwLegacyModify && rHint.GetId() != 
SfxHintId::SwAttrSetChange)
         return;
-    auto pLegacy = static_cast<const sw::LegacyModifyHint*>(&rHint);
+    const sw::LegacyModifyHint* pLegacy = nullptr;
+    const sw::AttrSetChangeHint* pChangeHint = nullptr;
+    if (rHint.GetId() == SfxHintId::SwLegacyModify)
+        pLegacy = static_cast<const sw::LegacyModifyHint*>(&rHint);
+    else // rHint.GetId() == SfxHintId::SwAttrSetChange
+        pChangeHint = static_cast<const sw::AttrSetChangeHint*>(&rHint);
     auto const ModifyImpl = [this](SwRootFrame const*const pLayout)
     {
         // first collect all SetPageRefFields
@@ -2283,7 +2288,8 @@ void SwRefPageGetFieldType::SwClientNotify(const 
SwModify&, const SfxHint& rHint
     };
 
     // update all GetReference fields
-    if( !pLegacy->m_pNew && !pLegacy->m_pOld && HasWriterListeners() )
+    if( (pLegacy && !pLegacy->m_pNew && !pLegacy->m_pOld && 
HasWriterListeners())
+        || (!pChangeHint->m_pNew && !pChangeHint->m_pOld && 
HasWriterListeners()))
     {
         SwRootFrame const* pLayout(nullptr);
         SwRootFrame const* pLayoutRLHidden(nullptr);
diff --git a/sw/source/core/fields/reffld.cxx b/sw/source/core/fields/reffld.cxx
index a063586b482f..496aabffedb1 100644
--- a/sw/source/core/fields/reffld.cxx
+++ b/sw/source/core/fields/reffld.cxx
@@ -1165,6 +1165,19 @@ void SwGetRefFieldType::SwClientNotify(const SwModify&, 
const SfxHint& rHint)
         CallSwClientNotify(rHint);
         return;
     }
+    if (rHint.GetId() == SfxHintId::SwAttrSetChange)
+    {
+        auto pChangeHint = static_cast<const sw::AttrSetChangeHint*>(&rHint);
+        if(!pChangeHint->m_pNew && !pChangeHint->m_pOld)
+            // update to all GetReference fields
+            // hopefully, this codepath is soon dead code, and
+            // UpdateGetReferences gets only called directly
+            UpdateGetReferences();
+        else
+            // forward to text fields, they "expand" the text
+            CallSwClientNotify(rHint);
+        return;
+    }
     if (rHint.GetId() != SfxHintId::SwLegacyModify)
         return;
     auto pLegacy = static_cast<const sw::LegacyModifyHint*>(&rHint);
diff --git a/sw/source/core/fields/usrfld.cxx b/sw/source/core/fields/usrfld.cxx
index 9e170b73b261..e9b50826c585 100644
--- a/sw/source/core/fields/usrfld.cxx
+++ b/sw/source/core/fields/usrfld.cxx
@@ -223,6 +223,12 @@ void SwUserFieldType::SwClientNotify(const SwModify&, 
const SfxHint& rHint)
         if (!pLegacy->m_pOld && !pLegacy->m_pNew)
             m_bValidValue = false;
     }
+    else if (rHint.GetId() == SfxHintId::SwAttrSetChange)
+    {
+        auto pChangeHint = static_cast<const sw::AttrSetChangeHint*>(&rHint);
+        if (!pChangeHint->m_pOld && !pChangeHint->m_pNew)
+            m_bValidValue = false;
+    }
 
     CallSwClientNotify(rHint);
     // update input fields that might be connected to the user field
diff --git a/sw/source/core/inc/flyfrm.hxx b/sw/source/core/inc/flyfrm.hxx
index dc1ce0abc3fd..f599fa86b888 100644
--- a/sw/source/core/inc/flyfrm.hxx
+++ b/sw/source/core/inc/flyfrm.hxx
@@ -96,6 +96,7 @@ protected:
     // Predecessor/Successor for chaining with text flow
     SwFlyFrame *m_pPrevLink, *m_pNextLink;
    static const SwFormatAnchor* GetAnchorFromPoolItem(const SfxPoolItem& 
rItem);
+   static const SwFormatAnchor* GetAnchorFromPoolItem(const SwAttrSetChg& 
rItem);
 
 private:
     // It must be possible to block Content-bound flys so that they will be not
diff --git a/sw/source/core/layout/atrfrm.cxx b/sw/source/core/layout/atrfrm.cxx
index 98f41721d89b..d67d2e5a4d43 100644
--- a/sw/source/core/layout/atrfrm.cxx
+++ b/sw/source/core/layout/atrfrm.cxx
@@ -2765,77 +2765,73 @@ void SwFrameFormat::SwClientNotify(const SwModify& 
rMod, const SfxHint& rHint)
         SwFormat::SwClientNotify(rMod, rHint);
         return;
     }
-    else if (rHint.GetId() != SfxHintId::SwLegacyModify)
+    else if (rHint.GetId() != SfxHintId::SwLegacyModify && rHint.GetId() != 
SfxHintId::SwAttrSetChange)
         return;
-    auto pLegacy = static_cast<const sw::LegacyModifyHint*>(&rHint);
-    const sal_uInt16 nNewWhich = pLegacy->m_pNew ? pLegacy->m_pNew->Which() : 
0;
-    const SwAttrSetChg* pNewAttrSetChg = nullptr;
+
     const SwFormatHeader* pH = nullptr;
     const SwFormatFooter* pF = nullptr;
     SwNode* pNewAnchorNode = nullptr;
-    switch(nNewWhich)
+    SwNode* pOldAnchorNode = nullptr;
+    if (rHint.GetId() == SfxHintId::SwLegacyModify)
     {
-        case RES_ATTRSET_CHG:
+        auto pLegacy = static_cast<const sw::LegacyModifyHint*>(&rHint);
+        const sal_uInt16 nNewWhich = pLegacy->m_pNew ? 
pLegacy->m_pNew->Which() : 0;
+        switch(nNewWhich)
         {
-            pNewAttrSetChg = static_cast<const SwAttrSetChg*>(pLegacy->m_pNew);
-            pH = pNewAttrSetChg->GetChgSet()->GetItem(RES_HEADER, false);
-            pF = pNewAttrSetChg->GetChgSet()->GetItem(RES_FOOTER, false);
+            case RES_HEADER:
+                pH = static_cast<const SwFormatHeader*>(pLegacy->m_pNew);
+                break;
+            case RES_FOOTER:
+                pF = static_cast<const SwFormatFooter*>(pLegacy->m_pNew);
+                break;
+            case RES_ANCHOR:
+                pNewAnchorNode = static_cast<const 
SwFormatAnchor*>(pLegacy->m_pNew)->GetAnchorNode();
+                break;
+        }
+        const sal_uInt16 nOldWhich = pLegacy->m_pOld ? 
pLegacy->m_pOld->Which() : 0;
+        switch(nOldWhich)
+        {
+            case RES_ANCHOR:
+                pOldAnchorNode = static_cast<const 
SwFormatAnchor*>(pLegacy->m_pOld)->GetAnchorNode();
+                break;
+        }
+        assert(nOldWhich == nNewWhich || !nOldWhich || !nNewWhich);
+    }
+    else // rHint.GetId() == SfxHintId::SwAttrSetChange
+    {
+        auto pChangeHint = static_cast<const sw::AttrSetChangeHint*>(&rHint);
+        const SwAttrSetChg* pNewAttrSetChg = pChangeHint->m_pNew;
+        pH = pNewAttrSetChg->GetChgSet()->GetItem(RES_HEADER, false);
+        pF = pNewAttrSetChg->GetChgSet()->GetItem(RES_FOOTER, false);
 
-            // reset fill information
-            if(maFillAttributes && supportsFullDrawingLayerFillAttributeSet())
+        // reset fill information
+        if(maFillAttributes && supportsFullDrawingLayerFillAttributeSet())
+        {
+            SfxItemIter aIter(*pNewAttrSetChg->GetChgSet());
+            for(const SfxPoolItem* pItem = aIter.GetCurItem(); pItem; pItem = 
aIter.NextItem())
             {
-                SfxItemIter aIter(*pNewAttrSetChg->GetChgSet());
-                for(const SfxPoolItem* pItem = aIter.GetCurItem(); pItem; 
pItem = aIter.NextItem())
+                if(!IsInvalidItem(pItem) && pItem->Which() >= XATTR_FILL_FIRST 
&& pItem->Which() <= XATTR_FILL_LAST)
                 {
-                    if(!IsInvalidItem(pItem) && pItem->Which() >= 
XATTR_FILL_FIRST && pItem->Which() <= XATTR_FILL_LAST)
-                    {
-                        maFillAttributes.reset();
-                        break;
-                    }
+                    maFillAttributes.reset();
+                    break;
                 }
             }
-            const SwFormatAnchor* pAnchor = 
pNewAttrSetChg->GetChgSet()->GetItem(RES_ANCHOR, false);
-            if(pAnchor)
-            {
-                pNewAnchorNode = pAnchor->GetAnchorNode();
-                assert(pNewAnchorNode == nullptr || // style's set must not 
contain position!
-                        pNewAttrSetChg->GetTheChgdSet() == &m_aSet);
-            }
-            break;
         }
-        case RES_HEADER:
-            pH = static_cast<const SwFormatHeader*>(pLegacy->m_pNew);
-            break;
-        case RES_FOOTER:
-            pF = static_cast<const SwFormatFooter*>(pLegacy->m_pNew);
-            break;
-        case RES_ANCHOR:
-            pNewAnchorNode = static_cast<const 
SwFormatAnchor*>(pLegacy->m_pNew)->GetAnchorNode();
-            break;
-    }
-    const sal_uInt16 nOldWhich = pLegacy->m_pOld ? pLegacy->m_pOld->Which() : 
0;
-    SwNode* pOldAnchorNode = nullptr;
-    switch(nOldWhich)
-    {
-        case RES_ATTRSET_CHG:
+        if (const SwFormatAnchor* pAnchor = 
pNewAttrSetChg->GetChgSet()->GetItem(RES_ANCHOR, false))
         {
-            const SwAttrSetChg* pOldAttrSetChg = nullptr;
-            pOldAttrSetChg = static_cast<const SwAttrSetChg*>(pLegacy->m_pOld);
-            const SwFormatAnchor* pAnchor = 
pOldAttrSetChg->GetChgSet()->GetItem(RES_ANCHOR, false);
-            if(pAnchor)
-            {
-                pOldAnchorNode = pAnchor->GetAnchorNode();
-                assert(pOldAnchorNode == nullptr || // style's set must not 
contain position!
-                        pOldAttrSetChg->GetTheChgdSet() == &m_aSet);
-            }
-            break;
+            pNewAnchorNode = pAnchor->GetAnchorNode();
+            assert(pNewAnchorNode == nullptr || // style's set must not 
contain position!
+                    pNewAttrSetChg->GetTheChgdSet() == &m_aSet);
+        }
+        const SwAttrSetChg* pOldAttrSetChg = pChangeHint->m_pOld;
+        if (const SwFormatAnchor* pAnchor = 
pOldAttrSetChg->GetChgSet()->GetItem(RES_ANCHOR, false))
+        {
+            pOldAnchorNode = pAnchor->GetAnchorNode();
+            assert(pOldAnchorNode == nullptr || // style's set must not 
contain position!
+                    pOldAttrSetChg->GetTheChgdSet() == &m_aSet);
         }
-        case RES_ANCHOR:
-            pOldAnchorNode = static_cast<const 
SwFormatAnchor*>(pLegacy->m_pOld)->GetAnchorNode();
-            break;
     }
 
-    assert(nOldWhich == nNewWhich || !nOldWhich || !nNewWhich);
     if(pH && pH->IsActive() && !pH->GetHeaderFormat())
     {   //If he doesn't have one, I'll add one
         SwFrameFormat* pFormat = 
GetDoc()->getIDocumentLayoutAccess().MakeLayoutFormat(RndStdIds::HEADER, 
nullptr);
diff --git a/sw/source/core/layout/fly.cxx b/sw/source/core/layout/fly.cxx
index 60317b17ec28..86cac25337de 100644
--- a/sw/source/core/layout/fly.cxx
+++ b/sw/source/core/layout/fly.cxx
@@ -801,7 +801,8 @@ bool SwFlyFrame::FrameSizeChg( const SwFormatFrameSize 
&rFrameSize )
 void SwFlyFrame::SwClientNotify(const SwModify& rMod, const SfxHint& rHint)
 {
     if (rHint.GetId() == SfxHintId::SwFormatChange ||
-        rHint.GetId() == SfxHintId::SwLegacyModify)
+        rHint.GetId() == SfxHintId::SwLegacyModify ||
+        rHint.GetId() == SfxHintId::SwAttrSetChange)
     {
         SwFlyFrameInvFlags eInvFlags = SwFlyFrameInvFlags::NONE;
         if (rHint.GetId() == SfxHintId::SwFormatChange)
@@ -809,17 +810,17 @@ void SwFlyFrame::SwClientNotify(const SwModify& rMod, 
const SfxHint& rHint)
             auto pChangeHint = static_cast<const SwFormatChangeHint*>(&rHint);
             UpdateAttrForFormatChange(pChangeHint->m_pOldFormat, 
pChangeHint->m_pNewFormat, eInvFlags);
         }
-        else // rHint.GetId() == SfxHintId::SwLegacyModify
+        else if (rHint.GetId() == SfxHintId::SwAttrSetChange)
         {
-            auto pLegacy = static_cast<const sw::LegacyModifyHint*>(&rHint);
-            if(pLegacy->m_pNew && pLegacy->m_pOld && RES_ATTRSET_CHG == 
pLegacy->m_pNew->Which())
+            auto pChangeHint = static_cast<const 
sw::AttrSetChangeHint*>(&rHint);
+            if(pChangeHint->m_pNew && pChangeHint->m_pOld)
             {
-                SfxItemIter aNIter(*static_cast<const 
SwAttrSetChg*>(pLegacy->m_pNew)->GetChgSet());
-                SfxItemIter aOIter(*static_cast<const 
SwAttrSetChg*>(pLegacy->m_pOld)->GetChgSet());
+                SfxItemIter aNIter(*pChangeHint->m_pNew->GetChgSet());
+                SfxItemIter aOIter(*pChangeHint->m_pOld->GetChgSet());
                 const SfxPoolItem* pNItem = aNIter.GetCurItem();
                 const SfxPoolItem* pOItem = aOIter.GetCurItem();
-                SwAttrSetChg aOldSet(*static_cast<const 
SwAttrSetChg*>(pLegacy->m_pOld));
-                SwAttrSetChg aNewSet(*static_cast<const 
SwAttrSetChg*>(pLegacy->m_pNew));
+                SwAttrSetChg aOldSet(*pChangeHint->m_pOld);
+                SwAttrSetChg aNewSet(*pChangeHint->m_pNew);
                 do
                 {
                     UpdateAttr_(pOItem, pNItem, eInvFlags, &aOldSet, &aNewSet);
@@ -827,10 +828,13 @@ void SwFlyFrame::SwClientNotify(const SwModify& rMod, 
const SfxHint& rHint)
                     pOItem = aOIter.NextItem();
                 } while(pNItem);
                 if(aOldSet.Count() || aNewSet.Count())
-                    SwLayoutFrame::SwClientNotify(rMod, 
sw::LegacyModifyHint(&aOldSet, &aNewSet));
+                    SwLayoutFrame::SwClientNotify(rMod, 
sw::AttrSetChangeHint(&aOldSet, &aNewSet));
             }
-            else
-                UpdateAttr_(pLegacy->m_pOld, pLegacy->m_pNew, eInvFlags);
+        }
+        else // rHint.GetId() == SfxHintId::SwLegacyModify
+        {
+            auto pLegacy = static_cast<const sw::LegacyModifyHint*>(&rHint);
+            UpdateAttr_(pLegacy->m_pOld, pLegacy->m_pNew, eInvFlags);
         }
 
         if(eInvFlags == SwFlyFrameInvFlags::NONE)
@@ -3499,8 +3503,6 @@ const SwFormatAnchor* 
SwFlyFrame::GetAnchorFromPoolItem(const SfxPoolItem& rItem
 {
     switch(rItem.Which())
     {
-        case RES_ATTRSET_CHG:
-            return 
rItem.StaticWhichCast(RES_ATTRSET_CHG).GetChgSet()->GetItem(RES_ANCHOR, false);
         case RES_ANCHOR:
             return static_cast<const SwFormatAnchor*>(&rItem);
         default:
@@ -3508,6 +3510,11 @@ const SwFormatAnchor* 
SwFlyFrame::GetAnchorFromPoolItem(const SfxPoolItem& rItem
     }
 }
 
+const SwFormatAnchor* SwFlyFrame::GetAnchorFromPoolItem(const SwAttrSetChg& 
rItem)
+{
+    return rItem.GetChgSet()->GetItem(RES_ANCHOR, false);
+}
+
 const SwFlyFrame* SwFlyFrame::DynCastFlyFrame() const
 {
     return this;
diff --git a/sw/source/core/layout/flycnt.cxx b/sw/source/core/layout/flycnt.cxx
index 03d95c979f11..eb34e63caacc 100644
--- a/sw/source/core/layout/flycnt.cxx
+++ b/sw/source/core/layout/flycnt.cxx
@@ -100,13 +100,22 @@ SwFlyAtContentFrame::~SwFlyAtContentFrame()
 
 void SwFlyAtContentFrame::SwClientNotify(const SwModify& rMod, const SfxHint& 
rHint)
 {
-    if (rHint.GetId() != SfxHintId::SwLegacyModify)
+    if (rHint.GetId() != SfxHintId::SwLegacyModify && rHint.GetId() != 
SfxHintId::SwAttrSetChange)
     {
         SwFlyFrame::SwClientNotify(rMod, rHint);
         return;
     }
-    auto pLegacy = static_cast<const sw::LegacyModifyHint*>(&rHint);
-    const SwFormatAnchor* pAnch = pLegacy->m_pNew ? 
GetAnchorFromPoolItem(*pLegacy->m_pNew) : nullptr;
+    const SwFormatAnchor* pAnch;
+    if (rHint.GetId() == SfxHintId::SwLegacyModify)
+    {
+        auto pLegacy = static_cast<const sw::LegacyModifyHint*>(&rHint);
+        pAnch = pLegacy->m_pNew ? GetAnchorFromPoolItem(*pLegacy->m_pNew) : 
nullptr;
+    }
+    else // rHint.GetId() == SfxHintId::SwAttrSetChange
+    {
+        auto pChangeHint = static_cast<const sw::AttrSetChangeHint*>(&rHint);
+        pAnch = pChangeHint->m_pNew ? 
GetAnchorFromPoolItem(*pChangeHint->m_pNew) : nullptr;
+    }
     if(!pAnch)
     {
         SwFlyFrame::SwClientNotify(rMod, rHint);
diff --git a/sw/source/core/layout/flyincnt.cxx 
b/sw/source/core/layout/flyincnt.cxx
index ed249c322bd0..712ee61884c0 100644
--- a/sw/source/core/layout/flyincnt.cxx
+++ b/sw/source/core/layout/flyincnt.cxx
@@ -107,36 +107,44 @@ void SwFlyInContentFrame::SwClientNotify(const SwModify& 
rMod, const SfxHint& rH
             AnchorFrame()->Prepare(PrepareHint::FlyFrameAttributesChanged, 
GetFormat());
         return;
     }
+    if (rHint.GetId() == SfxHintId::SwAttrSetChange)
+    {
+        auto pChangeHint = static_cast<const sw::AttrSetChangeHint*>(&rHint);
+        std::pair<std::unique_ptr<SwAttrSetChg>, 
std::unique_ptr<SwAttrSetChg>> aTweakedChgs;
+        std::pair<const SwAttrSetChg*, const SwAttrSetChg*> 
aSuperArgs(nullptr, nullptr);
+        const SwAttrSetChg* pOldAttrSetChg = pChangeHint->m_pOld;
+        const SwAttrSetChg* pNewAttrSetChg = pChangeHint->m_pNew;
+        if(pOldAttrSetChg
+                && pNewAttrSetChg
+                && ((SfxItemState::SET == 
pNewAttrSetChg->GetChgSet()->GetItemState(RES_SURROUND, false))
+                || (SfxItemState::SET == 
pNewAttrSetChg->GetChgSet()->GetItemState(RES_FRMMACRO, false))))
+        {
+            aTweakedChgs.second = 
std::make_unique<SwAttrSetChg>(*pOldAttrSetChg);
+            aTweakedChgs.second->ClearItem(RES_SURROUND);
+            aTweakedChgs.second->ClearItem(RES_FRMMACRO);
+            if(aTweakedChgs.second->Count())
+            {
+                aTweakedChgs.first = 
std::make_unique<SwAttrSetChg>(*pOldAttrSetChg);
+                aTweakedChgs.first->ClearItem(RES_SURROUND);
+                aTweakedChgs.first->ClearItem(RES_FRMMACRO);
+                aSuperArgs = std::pair<const SwAttrSetChg*, const 
SwAttrSetChg*>(aTweakedChgs.first.get(), aTweakedChgs.second.get());
+            }
+        } else if (pNewAttrSetChg && pNewAttrSetChg->GetChgSet()->Count())
+            aSuperArgs = std::pair<const SwAttrSetChg*, const 
SwAttrSetChg*>(pChangeHint->m_pOld, pChangeHint->m_pNew);
+        if(aSuperArgs.second)
+        {
+            SwFlyFrame::SwClientNotify(rMod, 
sw::AttrSetChangeHint(aSuperArgs.first, aSuperArgs.second));
+            if(GetAnchorFrame())
+                AnchorFrame()->Prepare(PrepareHint::FlyFrameAttributesChanged, 
GetFormat());
+        }
+        return;
+    }
     if (rHint.GetId() != SfxHintId::SwLegacyModify)
         return;
     auto pLegacy = static_cast<const sw::LegacyModifyHint*>(&rHint);
-    std::pair<std::unique_ptr<SwAttrSetChg>, std::unique_ptr<SwAttrSetChg>> 
aTweakedChgs;
     std::pair<const SfxPoolItem*, const SfxPoolItem*> aSuperArgs(nullptr, 
nullptr);
     switch(pLegacy->GetWhich())
     {
-        case RES_ATTRSET_CHG:
-        {
-            auto pOldAttrSetChg = static_cast<const 
SwAttrSetChg*>(pLegacy->m_pOld);
-            auto pNewAttrSetChg = static_cast<const 
SwAttrSetChg*>(pLegacy->m_pNew);
-            if(pOldAttrSetChg
-                    && pNewAttrSetChg
-                    && ((SfxItemState::SET == 
pNewAttrSetChg->GetChgSet()->GetItemState(RES_SURROUND, false))
-                    || (SfxItemState::SET == 
pNewAttrSetChg->GetChgSet()->GetItemState(RES_FRMMACRO, false))))
-            {
-                aTweakedChgs.second = 
std::make_unique<SwAttrSetChg>(*pOldAttrSetChg);
-                aTweakedChgs.second->ClearItem(RES_SURROUND);
-                aTweakedChgs.second->ClearItem(RES_FRMMACRO);
-                if(aTweakedChgs.second->Count())
-                {
-                    aTweakedChgs.first = 
std::make_unique<SwAttrSetChg>(*pOldAttrSetChg);
-                    aTweakedChgs.first->ClearItem(RES_SURROUND);
-                    aTweakedChgs.first->ClearItem(RES_FRMMACRO);
-                    aSuperArgs = std::pair<const SfxPoolItem*, const 
SfxPoolItem*>(aTweakedChgs.first.get(), aTweakedChgs.second.get());
-                }
-            } else if (pNewAttrSetChg && pNewAttrSetChg->GetChgSet()->Count())
-                aSuperArgs = std::pair<const SfxPoolItem*, const 
SfxPoolItem*>(pLegacy->m_pOld, pLegacy->m_pNew);
-            break;
-        }
         case RES_SURROUND:
         case RES_FRMMACRO:
             break;
diff --git a/sw/source/core/layout/flylay.cxx b/sw/source/core/layout/flylay.cxx
index f157a80134bf..51e5a2b87387 100644
--- a/sw/source/core/layout/flylay.cxx
+++ b/sw/source/core/layout/flylay.cxx
@@ -751,12 +751,24 @@ void SwFlyLayFrame::SwClientNotify(const SwModify& rMod, 
const SfxHint& rHint)
             SwFlyFrame::SwClientNotify(rMod, rHint);
         return;
     }
-    if (rHint.GetId() != SfxHintId::SwLegacyModify)
+    if (rHint.GetId() != SfxHintId::SwLegacyModify && rHint.GetId() != 
SfxHintId::SwAttrSetChange)
         return;
-    auto pLegacy = static_cast<const sw::LegacyModifyHint*>(&rHint);
-    if(!pLegacy->m_pNew)
-        return;
-    const auto pAnch = GetAnchorFromPoolItem(*pLegacy->m_pNew);
+
+    const SwFormatAnchor* pAnch;
+    if (rHint.GetId() == SfxHintId::SwLegacyModify)
+    {
+        auto pLegacy = static_cast<const sw::LegacyModifyHint*>(&rHint);
+        if(!pLegacy->m_pNew)
+            return;
+        pAnch = GetAnchorFromPoolItem(*pLegacy->m_pNew);
+    }
+    else // rHint.GetId() == SfxHintId::SwAttrSetChange
+    {
+        auto pChangeHint = static_cast<const sw::AttrSetChangeHint*>(&rHint);
+        if(!pChangeHint->m_pNew)
+            return;
+        pAnch = GetAnchorFromPoolItem(*pChangeHint->m_pNew);
+    }
 
     if(!pAnch)
     {
diff --git a/sw/source/core/layout/pagechg.cxx 
b/sw/source/core/layout/pagechg.cxx
index 9f61bb081bc3..cc7fac4b1bba 100644
--- a/sw/source/core/layout/pagechg.cxx
+++ b/sw/source/core/layout/pagechg.cxx
@@ -539,7 +539,8 @@ void SwPageFrame::SwClientNotify(const SwModify& rModify, 
const SfxHint& rHint)
         static_cast<const sw::AutoFormatUsedHint&>(rHint).SetUsed();
         return;
     }
-    else if (rHint.GetId() == SfxHintId::SwLegacyModify || rHint.GetId() == 
SfxHintId::SwFormatChange)
+    else if (rHint.GetId() == SfxHintId::SwLegacyModify || rHint.GetId() == 
SfxHintId::SwFormatChange
+            || rHint.GetId() == SfxHintId::SwAttrSetChange)
     {
         if(auto pSh = getRootFrame()->GetCurrShell())
             pSh->SetFirstVisPageInvalid();
@@ -548,10 +549,15 @@ void SwPageFrame::SwClientNotify(const SwModify& rModify, 
const SfxHint& rHint)
         if (rHint.GetId() == SfxHintId::SwLegacyModify)
         {
             auto pLegacy = static_cast<const sw::LegacyModifyHint*>(&rHint);
-            if(pLegacy->m_pNew && RES_ATTRSET_CHG == pLegacy->m_pNew->Which())
+            UpdateAttr_(pLegacy->m_pOld, pLegacy->m_pNew, eInvFlags);
+        }
+        else if (rHint.GetId() == SfxHintId::SwAttrSetChange)
+        {
+            auto pChangeHint = static_cast<const 
sw::AttrSetChangeHint*>(&rHint);
+            if(pChangeHint->m_pNew)
             {
-                auto& rOldSetChg = *static_cast<const 
SwAttrSetChg*>(pLegacy->m_pOld);
-                auto& rNewSetChg = *static_cast<const 
SwAttrSetChg*>(pLegacy->m_pNew);
+                const SwAttrSetChg& rOldSetChg = *pChangeHint->m_pOld;
+                const SwAttrSetChg& rNewSetChg = *pChangeHint->m_pNew;
                 SfxItemIter aOIter(*rOldSetChg.GetChgSet());
                 SfxItemIter aNIter(*rNewSetChg.GetChgSet());
                 const SfxPoolItem* pOItem = aOIter.GetCurItem();
@@ -565,10 +571,8 @@ void SwPageFrame::SwClientNotify(const SwModify& rModify, 
const SfxHint& rHint)
                     pNItem = aNIter.NextItem();
                 } while(pNItem);
                 if(aOldSet.Count() || aNewSet.Count())
-                    SwLayoutFrame::SwClientNotify(rModify, 
sw::LegacyModifyHint(&aOldSet, &aNewSet));
+                    SwLayoutFrame::SwClientNotify(rModify, 
sw::AttrSetChangeHint(&aOldSet, &aNewSet));
             }
-            else
-                UpdateAttr_(pLegacy->m_pOld, pLegacy->m_pNew, eInvFlags);
         }
         else // rHint.GetId() == SfxHintId::SwFormatChange
         {
diff --git a/sw/source/core/layout/pagedesc.cxx 
b/sw/source/core/layout/pagedesc.cxx
index 8f8762109ac0..24b4e8d40fa7 100644
--- a/sw/source/core/layout/pagedesc.cxx
+++ b/sw/source/core/layout/pagedesc.cxx
@@ -290,7 +290,7 @@ void SwPageDesc::RegisterChange()
 /// special handling if the style of the grid alignment changes
 void SwPageDesc::SwClientNotify(const SwModify& rModify, const SfxHint& rHint)
 {
-    if (rHint.GetId() == SfxHintId::SwFormatChange)
+    if (rHint.GetId() == SfxHintId::SwFormatChange || rHint.GetId() == 
SfxHintId::SwAttrSetChange)
     {
         CallSwClientNotify(rHint);
         RegisterChange();
@@ -304,8 +304,7 @@ void SwPageDesc::SwClientNotify(const SwModify& rModify, 
const SfxHint& rHint)
                 ? pLegacyHint->m_pNew->Which()
                 : 0;
         CallSwClientNotify(rHint);
-        if((RES_ATTRSET_CHG == nWhich)
-                || isCHRATR(nWhich)
+        if(isCHRATR(nWhich)
                 || (RES_PARATR_LINESPACING == nWhich))
             RegisterChange();
     }
diff --git a/sw/source/core/layout/sectfrm.cxx 
b/sw/source/core/layout/sectfrm.cxx
index de707f27da92..4af70165c67d 100644
--- a/sw/source/core/layout/sectfrm.cxx
+++ b/sw/source/core/layout/sectfrm.cxx
@@ -2731,16 +2731,22 @@ void SwSectionFrame::Notify(SfxHint const& rHint)
 
 void SwSectionFrame::SwClientNotify(const SwModify& rMod, const SfxHint& rHint)
 {
-    if (rHint.GetId() == SfxHintId::SwLegacyModify || rHint.GetId() == 
SfxHintId::SwFormatChange)
+    if (rHint.GetId() == SfxHintId::SwLegacyModify || rHint.GetId() == 
SfxHintId::SwFormatChange
+        || rHint.GetId() == SfxHintId::SwAttrSetChange)
     {
         SwSectionFrameInvFlags eInvFlags = SwSectionFrameInvFlags::NONE;
         if (rHint.GetId() == SfxHintId::SwLegacyModify)
         {
             auto pLegacy = static_cast<const sw::LegacyModifyHint*>(&rHint);
-            if(pLegacy->m_pNew && RES_ATTRSET_CHG == pLegacy->m_pNew->Which())
+            UpdateAttr_(pLegacy->m_pOld, pLegacy->m_pNew, eInvFlags);
+        }
+        else if (rHint.GetId() == SfxHintId::SwAttrSetChange)
+        {
+            auto pChangeHint = static_cast<const 
sw::AttrSetChangeHint*>(&rHint);
+            if(pChangeHint->m_pNew)
             {
-                auto& rOldSetChg = *static_cast<const 
SwAttrSetChg*>(pLegacy->m_pOld);
-                auto& rNewSetChg = *static_cast<const 
SwAttrSetChg*>(pLegacy->m_pNew);
+                const SwAttrSetChg& rOldSetChg = *pChangeHint->m_pOld;
+                const SwAttrSetChg& rNewSetChg = *pChangeHint->m_pNew;
                 SfxItemIter aOIter(*rOldSetChg.GetChgSet());
                 SfxItemIter aNIter(*rNewSetChg.GetChgSet());
                 const SfxPoolItem* pOItem = aOIter.GetCurItem();
@@ -2754,10 +2760,8 @@ void SwSectionFrame::SwClientNotify(const SwModify& 
rMod, const SfxHint& rHint)
                     pOItem = aOIter.NextItem();
                 } while (pNItem);
                 if(aOldSet.Count() || aNewSet.Count())
-                    SwLayoutFrame::SwClientNotify(rMod, 
sw::LegacyModifyHint(&aOldSet, &aNewSet));
+                    SwLayoutFrame::SwClientNotify(rMod, 
sw::AttrSetChangeHint(&aOldSet, &aNewSet));
             }
-            else
-                UpdateAttr_(pLegacy->m_pOld, pLegacy->m_pNew, eInvFlags);
         }
         else // rHint.GetId() == SfxHintId::SwFormatChange)
         {
diff --git a/sw/source/core/layout/tabfrm.cxx b/sw/source/core/layout/tabfrm.cxx
index 683eb18dd7c1..24225b332ef0 100644
--- a/sw/source/core/layout/tabfrm.cxx
+++ b/sw/source/core/layout/tabfrm.cxx
@@ -4005,7 +4005,6 @@ void SwTabFrame::SwClientNotify(const SwModify& rMod, 
const SfxHint& rHint)
     if(rHint.GetId() == SfxHintId::SwTableHeadingChange)
     {
         HandleTableHeadlineChange();
-        return;
     }
     else if(rHint.GetId() == SfxHintId::SwVirtPageNumHint)
     {
@@ -4014,36 +4013,39 @@ void SwTabFrame::SwClientNotify(const SwModify& rMod, 
const SfxHint& rHint)
             return;
         if(const SwPageFrame* pPage = FindPageFrame())
             pPage->UpdateVirtPageNumInfo(rVirtPageNumHint, this);
-        return;
     }
-    else if (rHint.GetId() != SfxHintId::SwLegacyModify)
-        return;
-    auto pLegacy = static_cast<const sw::LegacyModifyHint*>(&rHint);
-    SwTabFrameInvFlags eInvFlags = SwTabFrameInvFlags::NONE;
-    bool bAttrSetChg = pLegacy->m_pNew && RES_ATTRSET_CHG == 
pLegacy->m_pNew->Which();
-
-    if(bAttrSetChg)
-    {
-        auto& rOldSetChg = *static_cast<const SwAttrSetChg*>(pLegacy->m_pOld);
-        auto& rNewSetChg = *static_cast<const SwAttrSetChg*>(pLegacy->m_pNew);
-        SfxItemIter aOIter(*rOldSetChg.GetChgSet());
-        SfxItemIter aNIter(*rNewSetChg.GetChgSet());
-        const SfxPoolItem* pOItem = aOIter.GetCurItem();
-        const SfxPoolItem* pNItem = aNIter.GetCurItem();
-        SwAttrSetChg aOldSet(rOldSetChg);
-        SwAttrSetChg aNewSet(rNewSetChg);
-        do
+    else if (rHint.GetId() == SfxHintId::SwAttrSetChange)
+    {
+        auto pChangeHint = static_cast<const sw::AttrSetChangeHint*>(&rHint);
+        SwTabFrameInvFlags eInvFlags = SwTabFrameInvFlags::NONE;
+        if(pChangeHint->m_pNew)
         {
-            UpdateAttr_(pOItem, pNItem, eInvFlags, &aOldSet, &aNewSet);
-            pNItem = aNIter.NextItem();
-            pOItem = aOIter.NextItem();
-        } while(pNItem);
-        if(aOldSet.Count() || aNewSet.Count())
-            SwLayoutFrame::SwClientNotify(rMod, sw::LegacyModifyHint(&aOldSet, 
&aNewSet));
+            const SwAttrSetChg& rOldSetChg = *pChangeHint->m_pOld;
+            const SwAttrSetChg& rNewSetChg = *pChangeHint->m_pNew;
+            SfxItemIter aOIter(*rOldSetChg.GetChgSet());
+            SfxItemIter aNIter(*rNewSetChg.GetChgSet());
+            const SfxPoolItem* pOItem = aOIter.GetCurItem();
+            const SfxPoolItem* pNItem = aNIter.GetCurItem();
+            SwAttrSetChg aOldSet(rOldSetChg);
+            SwAttrSetChg aNewSet(rNewSetChg);
+            do
+            {
+                UpdateAttr_(pOItem, pNItem, eInvFlags, &aOldSet, &aNewSet);
+                pNItem = aNIter.NextItem();
+                pOItem = aOIter.NextItem();
+            } while(pNItem);
+            if(aOldSet.Count() || aNewSet.Count())
+                SwLayoutFrame::SwClientNotify(rMod, 
sw::AttrSetChangeHint(&aOldSet, &aNewSet));
+        }
+        Invalidate(eInvFlags);
     }
-    else
+    else if (rHint.GetId() == SfxHintId::SwLegacyModify)
+    {
+        auto pLegacy = static_cast<const sw::LegacyModifyHint*>(&rHint);
+        SwTabFrameInvFlags eInvFlags = SwTabFrameInvFlags::NONE;
         UpdateAttr_(pLegacy->m_pOld, pLegacy->m_pNew, eInvFlags);
-    Invalidate(eInvFlags);
+        Invalidate(eInvFlags);
+    }
 }
 
 void SwTabFrame::HandleTableHeadlineChange()
@@ -4663,6 +4665,26 @@ void SwRowFrame::SwClientNotify(const SwModify& rModify, 
const SfxHint& rHint)
         ReinitializeFrameSizeAttrFlags();
         return;
     }
+    else if (rHint.GetId() == SfxHintId::SwAttrSetChange)
+    {
+        auto pChangeHint = static_cast<const sw::AttrSetChangeHint*>(&rHint);
+        if(!pChangeHint->m_pNew)
+        {
+            // possibly not needed?
+            SwLayoutFrame::SwClientNotify(rModify, rHint);
+            return;
+        }
+        const SwAttrSet* pChgSet = pChangeHint->m_pNew->GetChgSet();
+        const SfxPoolItem* pItem = nullptr;
+        pChgSet->GetItemState(RES_FRM_SIZE, false, &pItem);
+        if(!pItem)
+            pChgSet->GetItemState(RES_ROW_SPLIT, false, &pItem);
+        if(pItem)
+            OnFrameSize(*pItem);
+        else
+            SwLayoutFrame::SwClientNotify(rModify, rHint); // possibly not 
needed?
+        return;
+    }
     if (rHint.GetId() != SfxHintId::SwLegacyModify)
         return;
     auto pLegacy = static_cast<const sw::LegacyModifyHint*>(&rHint);
@@ -4674,19 +4696,6 @@ void SwRowFrame::SwClientNotify(const SwModify& rModify, 
const SfxHint& rHint)
     }
     switch(pLegacy->m_pNew->Which())
     {
-        case RES_ATTRSET_CHG:
-        {
-            const SwAttrSet* pChgSet = static_cast<const 
SwAttrSetChg*>(pLegacy->m_pNew)->GetChgSet();
-            const SfxPoolItem* pItem = nullptr;
-            pChgSet->GetItemState(RES_FRM_SIZE, false, &pItem);
-            if(!pItem)
-                pChgSet->GetItemState(RES_ROW_SPLIT, false, &pItem);
-            if(pItem)
-                OnFrameSize(*pItem);
-            else
-                SwLayoutFrame::SwClientNotify(rModify, rHint); // possibly not 
needed?
-            return;
-       }
        case RES_FRM_SIZE:
        case RES_ROW_SPLIT:
             OnFrameSize(*static_cast<const 
SwFormatFrameSize*>(pLegacy->m_pNew));
@@ -6268,43 +6277,46 @@ void SwCellFrame::SwClientNotify(const SwModify& rMod, 
const SfxHint& rHint)
     {
         SwLayoutFrame::SwClientNotify(rMod, rHint);
     }
-    else if (rHint.GetId() == SfxHintId::SwLegacyModify)
+    else if (rHint.GetId() == SfxHintId::SwLegacyModify || rHint.GetId() == 
SfxHintId::SwAttrSetChange)
     {
-        auto pLegacy = static_cast<const sw::LegacyModifyHint*>(&rHint);
         const SfxPoolItem* pVertOrientItem = nullptr;
 #if !ENABLE_WASM_STRIP_ACCESSIBILITY
         const SfxPoolItem* pProtectItem = nullptr;
 #endif
         const SfxPoolItem* pFrameDirItem = nullptr;
         const SfxPoolItem* pBoxItem = nullptr;
-        const auto nWhich = pLegacy->m_pNew ? pLegacy->m_pNew->Which() : 0;
-        switch(nWhich)
+        if (rHint.GetId() == SfxHintId::SwLegacyModify)
         {
-            case RES_ATTRSET_CHG:
+            auto pLegacy = static_cast<const sw::LegacyModifyHint*>(&rHint);
+            const auto nWhich = pLegacy->m_pNew ? pLegacy->m_pNew->Which() : 0;
+            switch(nWhich)
             {
-                auto& rChgSet = *static_cast<const 
SwAttrSetChg*>(pLegacy->m_pNew)->GetChgSet();
-                pVertOrientItem = rChgSet.GetItemIfSet(RES_VERT_ORIENT, false);
-#if !ENABLE_WASM_STRIP_ACCESSIBILITY
-                pProtectItem = rChgSet.GetItemIfSet(RES_PROTECT, false);
-#endif
-                pFrameDirItem = rChgSet.GetItemIfSet(RES_FRAMEDIR, false);
-                pBoxItem = rChgSet.GetItemIfSet(RES_BOX, false);
-                break;
+                case RES_VERT_ORIENT:
+                    pVertOrientItem = pLegacy->m_pNew;
+                    break;
+                case RES_PROTECT:
+        #if !ENABLE_WASM_STRIP_ACCESSIBILITY
+                    pProtectItem = pLegacy->m_pNew;
+        #endif
+                    break;
+                case RES_FRAMEDIR:
+                    pFrameDirItem = pLegacy->m_pNew;
+                    break;
+                case RES_BOX:
+                    pBoxItem = pLegacy->m_pNew;
+                    break;
             }
-            case RES_VERT_ORIENT:
-                pVertOrientItem = pLegacy->m_pNew;
-                break;
-            case RES_PROTECT:
+        }
+        else // rHint.GetId() == SfxHintId::SwAttrSetChange
+        {
+            auto pChangeHint = static_cast<const 
sw::AttrSetChangeHint*>(&rHint);
+            auto& rChgSet = *pChangeHint->m_pNew->GetChgSet();
+            pVertOrientItem = rChgSet.GetItemIfSet(RES_VERT_ORIENT, false);
 #if !ENABLE_WASM_STRIP_ACCESSIBILITY
-                pProtectItem = pLegacy->m_pNew;
+            pProtectItem = rChgSet.GetItemIfSet(RES_PROTECT, false);
 #endif
-                break;
-            case RES_FRAMEDIR:
-                pFrameDirItem = pLegacy->m_pNew;
-                break;
-            case RES_BOX:
-                pBoxItem = pLegacy->m_pNew;
-                break;
+            pFrameDirItem = rChgSet.GetItemIfSet(RES_FRAMEDIR, false);
+            pBoxItem = rChgSet.GetItemIfSet(RES_BOX, false);
         }
         if(pVertOrientItem)
         {
diff --git a/sw/source/core/layout/wsfrm.cxx b/sw/source/core/layout/wsfrm.cxx
index 45b87bc4688a..6941a4af2b5c 100644
--- a/sw/source/core/layout/wsfrm.cxx
+++ b/sw/source/core/layout/wsfrm.cxx
@@ -511,17 +511,23 @@ void SwTextFrame::CheckDirection( bool bVert )
 
 void SwFrame::SwClientNotify(const SwModify&, const SfxHint& rHint)
 {
-    if (rHint.GetId() != SfxHintId::SwLegacyModify && rHint.GetId() != 
SfxHintId::SwFormatChange)
+    if (rHint.GetId() != SfxHintId::SwLegacyModify && rHint.GetId() != 
SfxHintId::SwFormatChange
+        && rHint.GetId() != SfxHintId::SwAttrSetChange)
         return;
 
     SwFrameInvFlags eInvFlags = SwFrameInvFlags::NONE;
     if (rHint.GetId() == SfxHintId::SwLegacyModify)
     {
         auto pLegacy = static_cast<const sw::LegacyModifyHint*>(&rHint);
-        if(pLegacy->m_pOld && pLegacy->m_pNew && RES_ATTRSET_CHG == 
pLegacy->m_pNew->Which())
+        UpdateAttrFrame(pLegacy->m_pOld, pLegacy->m_pNew, eInvFlags);
+    }
+    else if (rHint.GetId() == SfxHintId::SwAttrSetChange)
+    {
+        auto pChangeHint = static_cast<const sw::AttrSetChangeHint*>(&rHint);
+        if(pChangeHint->m_pOld && pChangeHint->m_pNew)
         {
-            SfxItemIter aNIter(*static_cast<const 
SwAttrSetChg*>(pLegacy->m_pNew)->GetChgSet());
-            SfxItemIter aOIter(*static_cast<const 
SwAttrSetChg*>(pLegacy->m_pOld)->GetChgSet());
+            SfxItemIter aNIter(*pChangeHint->m_pNew->GetChgSet());
+            SfxItemIter aOIter(*pChangeHint->m_pOld->GetChgSet());
             const SfxPoolItem* pNItem = aNIter.GetCurItem();
             const SfxPoolItem* pOItem = aOIter.GetCurItem();
             do
@@ -531,8 +537,6 @@ void SwFrame::SwClientNotify(const SwModify&, const 
SfxHint& rHint)
                 pOItem = aOIter.NextItem();
             } while (pNItem);
         }
-        else
-            UpdateAttrFrame(pLegacy->m_pOld, pLegacy->m_pNew, eInvFlags);
     }
     else // rHint.GetId() == SfxHintId::SwFormatChange
     {
@@ -2407,17 +2411,23 @@ SwTwips SwContentFrame::ShrinkFrame( SwTwips nDist, 
bool bTst, bool bInfo )
 
 void SwContentFrame::SwClientNotify(const SwModify& rMod, const SfxHint& rHint)
 {
-    if (rHint.GetId() != SfxHintId::SwLegacyModify && rHint.GetId() != 
SfxHintId::SwFormatChange)
+    if (rHint.GetId() != SfxHintId::SwLegacyModify && rHint.GetId() != 
SfxHintId::SwFormatChange
+        && rHint.GetId() != SfxHintId::SwAttrSetChange)
         return;
 
     SwContentFrameInvFlags eInvFlags = SwContentFrameInvFlags::NONE;
     if (rHint.GetId() == SfxHintId::SwLegacyModify)
     {
         auto pLegacy = static_cast<const sw::LegacyModifyHint*>(&rHint);
-        if(pLegacy->m_pNew && RES_ATTRSET_CHG == pLegacy->m_pNew->Which() && 
pLegacy->m_pOld)
+        UpdateAttr_(pLegacy->m_pOld, pLegacy->m_pNew, eInvFlags);
+    }
+    else if (rHint.GetId() == SfxHintId::SwAttrSetChange)
+    {
+        auto pChangeHint = static_cast<const sw::AttrSetChangeHint*>(&rHint);
+        if(pChangeHint->m_pNew && pChangeHint->m_pOld)
         {
-            auto& rOldSetChg = *static_cast<const 
SwAttrSetChg*>(pLegacy->m_pOld);
-            auto& rNewSetChg = *static_cast<const 
SwAttrSetChg*>(pLegacy->m_pNew);
+            const SwAttrSetChg& rOldSetChg = *pChangeHint->m_pOld;
+            const SwAttrSetChg& rNewSetChg = *pChangeHint->m_pNew;
             SfxItemIter aOIter(*rOldSetChg.GetChgSet());
             SfxItemIter aNIter(*rNewSetChg.GetChgSet());
             const SfxPoolItem* pNItem = aNIter.GetCurItem();
@@ -2431,10 +2441,8 @@ void SwContentFrame::SwClientNotify(const SwModify& 
rMod, const SfxHint& rHint)
                 pOItem = aOIter.NextItem();
             } while(pNItem);
             if(aOldSet.Count() || aNewSet.Count())
-                SwFrame::SwClientNotify(rMod, sw::LegacyModifyHint(&aOldSet, 
&aNewSet));
+                SwFrame::SwClientNotify(rMod, sw::AttrSetChangeHint(&aOldSet, 
&aNewSet));
         }
-        else
-            UpdateAttr_(pLegacy->m_pOld, pLegacy->m_pNew, eInvFlags);
     }
     else // rHint.GetId() == SfxHintId::SwFormatChange
     {
diff --git a/sw/source/core/table/swtable.cxx b/sw/source/core/table/swtable.cxx
index 26fced61f58f..6c2484fa4f90 100644
--- a/sw/source/core/table/swtable.cxx
+++ b/sw/source/core/table/swtable.cxx
@@ -322,41 +322,46 @@ static void lcl_ModifyBoxes( SwTableBoxes &rBoxes, const 
tools::Long nOld,
 
 void SwTable::SwClientNotify(const SwModify&, const SfxHint& rHint)
 {
-    if(rHint.GetId() == SfxHintId::SwAutoFormatUsedHint) {
+    if(rHint.GetId() == SfxHintId::SwAutoFormatUsedHint)
+    {
         auto& rAutoFormatUsedHint = static_cast<const 
sw::AutoFormatUsedHint&>(rHint);
         rAutoFormatUsedHint.CheckNode(GetTableNode());
-        return;
     }
-    if (rHint.GetId() != SfxHintId::SwLegacyModify)
-        return;
-    auto pLegacy = static_cast<const sw::LegacyModifyHint*>(&rHint);
-    // catch SSize changes, to adjust the lines/boxes
-    const sal_uInt16 nWhich = pLegacy->GetWhich();
-    const SwFormatFrameSize* pNewSize = nullptr, *pOldSize = nullptr;
-    switch(nWhich)
-    {
-        case RES_ATTRSET_CHG:
-        {
-            if (pLegacy->m_pOld && pLegacy->m_pNew
-                    && (pNewSize = static_cast<const 
SwAttrSetChg*>(pLegacy->m_pNew)->GetChgSet()->GetItemIfSet(
-                            RES_FRM_SIZE,
-                            false)))
-            {
-                pOldSize = &static_cast<const 
SwAttrSetChg*>(pLegacy->m_pOld)->GetChgSet()->GetFrameSize();
-            }
+    else if (rHint.GetId() == SfxHintId::SwAttrSetChange)
+    {
+        auto pChangeHint = static_cast<const sw::AttrSetChangeHint*>(&rHint);
+        // catch SSize changes, to adjust the lines/boxes
+        const SwFormatFrameSize* pNewSize = nullptr, *pOldSize = nullptr;
+        if (pChangeHint->m_pOld && pChangeHint->m_pNew
+                && (pNewSize = pChangeHint->m_pNew->GetChgSet()->GetItemIfSet(
+                        RES_FRM_SIZE,
+                        false)))
+        {
+            pOldSize = &pChangeHint->m_pOld->GetChgSet()->GetFrameSize();
         }
-        break;
-        case RES_FRM_SIZE:
+        if (pOldSize && pNewSize && !m_bModifyLocked)
+            AdjustWidths(pOldSize->GetWidth(), pNewSize->GetWidth());
+    }
+    else if (rHint.GetId() == SfxHintId::SwLegacyModify)
+    {
+        auto pLegacy = static_cast<const sw::LegacyModifyHint*>(&rHint);
+        // catch SSize changes, to adjust the lines/boxes
+        const sal_uInt16 nWhich = pLegacy->GetWhich();
+        const SwFormatFrameSize* pNewSize = nullptr, *pOldSize = nullptr;
+        switch(nWhich)
         {
-            pOldSize = static_cast<const SwFormatFrameSize*>(pLegacy->m_pOld);
-            pNewSize = static_cast<const SwFormatFrameSize*>(pLegacy->m_pNew);
+            case RES_FRM_SIZE:
+            {
+                pOldSize = static_cast<const 
SwFormatFrameSize*>(pLegacy->m_pOld);
+                pNewSize = static_cast<const 
SwFormatFrameSize*>(pLegacy->m_pNew);
+            }
+            break;
+            default:
+                CheckRegistration(pLegacy->m_pOld);
         }
-        break;
-        default:
-            CheckRegistration(pLegacy->m_pOld);
+        if (pOldSize && pNewSize && !m_bModifyLocked)
+            AdjustWidths(pOldSize->GetWidth(), pNewSize->GetWidth());
     }
-    if (pOldSize && pNewSize && !m_bModifyLocked)
-        AdjustWidths(pOldSize->GetWidth(), pNewSize->GetWidth());
 }
 
 void SwTable::AdjustWidths( const tools::Long nOld, const tools::Long nNew )
@@ -2750,41 +2755,45 @@ SwTableBox* 
SwTableBoxFormat::SwTableBoxFormat::GetTableBox()
 // for detection of modifications (mainly TableBoxAttribute)
 void SwTableBoxFormat::SwClientNotify(const SwModify& rMod, const SfxHint& 
rHint)
 {
-    if(rHint.GetId() != SfxHintId::SwLegacyModify && rHint.GetId() != 
SfxHintId::SwFormatChange)
+    if(rHint.GetId() != SfxHintId::SwLegacyModify && rHint.GetId() != 
SfxHintId::SwFormatChange
+        && rHint.GetId() != SfxHintId::SwAttrSetChange)
         return;
     if(IsModifyLocked() || !GetDoc() || GetDoc()->IsInDtor() || rHint.GetId() 
== SfxHintId::SwFormatChange)
     {
         SwFrameFormat::SwClientNotify(rMod, rHint);
         return;
     }
-    auto pLegacy = static_cast<const sw::LegacyModifyHint*>(&rHint);
     const SwTableBoxNumFormat* pNewFormat = nullptr;
     const SwTableBoxFormula* pNewFormula = nullptr;
     const SwTableBoxValue* pNewVal = nullptr;
     sal_uLong nOldFormat = getSwDefaultTextFormat();
 
-    switch(pLegacy->m_pNew ? pLegacy->m_pNew->Which() : 0)
+    if(rHint.GetId() == SfxHintId::SwLegacyModify)
     {
-        case RES_ATTRSET_CHG:
+        auto pLegacy = static_cast<const sw::LegacyModifyHint*>(&rHint);
+        switch(pLegacy->m_pNew ? pLegacy->m_pNew->Which() : 0)
         {
-            const SfxItemSet& rSet = *static_cast<const 
SwAttrSetChg*>(pLegacy->m_pNew)->GetChgSet();
-            pNewFormat = rSet.GetItemIfSet( RES_BOXATR_FORMAT, false);
-            if(pNewFormat)
-                nOldFormat = static_cast<const 
SwAttrSetChg*>(pLegacy->m_pOld)->GetChgSet()->Get(RES_BOXATR_FORMAT).GetValue();
-            pNewFormula = rSet.GetItemIfSet(RES_BOXATR_FORMULA, false);
-            pNewVal = rSet.GetItemIfSet(RES_BOXATR_VALUE, false);
-            break;
+            case RES_BOXATR_FORMAT:
+                pNewFormat = static_cast<const 
SwTableBoxNumFormat*>(pLegacy->m_pNew);
+                nOldFormat = static_cast<const 
SwTableBoxNumFormat*>(pLegacy->m_pOld)->GetValue();
+                break;
+            case RES_BOXATR_FORMULA:
+                pNewFormula = static_cast<const 
SwTableBoxFormula*>(pLegacy->m_pNew);
+                break;
+            case RES_BOXATR_VALUE:
+                pNewVal = static_cast<const SwTableBoxValue*>(pLegacy->m_pNew);
+                break;
         }
-        case RES_BOXATR_FORMAT:
-            pNewFormat = static_cast<const 
SwTableBoxNumFormat*>(pLegacy->m_pNew);
-            nOldFormat = static_cast<const 
SwTableBoxNumFormat*>(pLegacy->m_pOld)->GetValue();
-            break;
-        case RES_BOXATR_FORMULA:
-            pNewFormula = static_cast<const 
SwTableBoxFormula*>(pLegacy->m_pNew);
-            break;
-        case RES_BOXATR_VALUE:
-            pNewVal = static_cast<const SwTableBoxValue*>(pLegacy->m_pNew);
-            break;
+    }
+    else // rHint.GetId() == SfxHintId::SwAttrSetChange
+    {
+        auto pChangeHint = static_cast<const sw::AttrSetChangeHint*>(&rHint);
+        const SfxItemSet& rSet = *pChangeHint->m_pNew->GetChgSet();
+        pNewFormat = rSet.GetItemIfSet( RES_BOXATR_FORMAT, false);
+        if(pNewFormat)
+            nOldFormat = 
pChangeHint->m_pOld->GetChgSet()->Get(RES_BOXATR_FORMAT).GetValue();
+        pNewFormula = rSet.GetItemIfSet(RES_BOXATR_FORMULA, false);
+        pNewVal = rSet.GetItemIfSet(RES_BOXATR_VALUE, false);
     }
 
     // something changed and some BoxAttribute remained in the set!
diff --git a/sw/source/core/text/txtfrm.cxx b/sw/source/core/text/txtfrm.cxx
index 6e76e610f7e5..f351d2047a7e 100644
--- a/sw/source/core/text/txtfrm.cxx
+++ b/sw/source/core/text/txtfrm.cxx
@@ -2187,6 +2187,7 @@ void SwTextFrame::SwClientNotify(SwModify const& rModify, 
SfxHint const& rHint)
     sw::RedlineDelText const* pRedlineDelText(nullptr);
     sw::RedlineUnDelText const* pRedlineUnDelText(nullptr);
     SwFormatChangeHint const * pFormatChangedHint(nullptr);
+    sw::AttrSetChangeHint const* pAttrSetChangeHint(nullptr);
 
     sal_uInt16 nWhich = 0;
     if (rHint.GetId() == SfxHintId::SwLegacyModify)
@@ -2247,6 +2248,10 @@ void SwTextFrame::SwClientNotify(SwModify const& 
rModify, SfxHint const& rHint)
     {
         pFormatChangedHint = static_cast<const SwFormatChangeHint*>(&rHint);
     }
+    else if (rHint.GetId() == SfxHintId::SwAttrSetChange)
+    {
+        pAttrSetChangeHint = static_cast<const sw::AttrSetChangeHint*>(&rHint);
+    }
     else
     {
         assert(!"unexpected hint");
@@ -2273,7 +2278,7 @@ void SwTextFrame::SwClientNotify(SwModify const& rModify, 
SfxHint const& rHint)
                 return;
             }
         }
-        SwContentFrame::SwClientNotify(rModify, sw::LegacyModifyHint(pOld, 
pNew));
+        SwContentFrame::SwClientNotify(rModify, rHint);
         if( pFormatChangedHint && getRootFrame()->GetCurrShell() )
         {
             // collection has changed
@@ -2470,6 +2475,242 @@ void SwTextFrame::SwClientNotify(SwModify const& 
rModify, SfxHint const& rHint)
             lcl_ModifyOfst(*this, nPos, nLen, &o3tl::operator-<sal_Int32, 
Tag_TextFrameIndex>);
         }
     }
+    else if (pAttrSetChangeHint)
+    {
+        InvalidateLineNum();
+
+        const SwAttrSet& rNewSet = *pAttrSetChangeHint->m_pNew->GetChgSet();
+        int nClear = 0;
+        sal_uInt16 nCount = rNewSet.Count();
+
+        if( const SwFormatFootnote* pItem = rNewSet.GetItemIfSet( 
RES_TXTATR_FTN, false ) )
+        {
+            nPos = MapModelToView(&rNode, 
pItem->GetTextFootnote()->GetStart());
+            if (IsIdxInside(nPos, TextFrameIndex(1)))
+                Prepare( PrepareHint::FootnoteInvalidation, 
pAttrSetChangeHint->m_pNew );
+            nClear = 0x01;
+            --nCount;
+        }
+
+        if( const SwFormatField* pItem = rNewSet.GetItemIfSet( 
RES_TXTATR_FIELD, false ) )
+        {
+            nPos = MapModelToView(&rNode, pItem->GetTextField()->GetStart());
+            if (IsIdxInside(nPos, TextFrameIndex(1)))
+            {
+                const SwFormatField* pOldItem = pAttrSetChangeHint->m_pOld ?
+                    
&(pAttrSetChangeHint->m_pOld->GetChgSet()->Get(RES_TXTATR_FIELD)) : nullptr;
+                if (SfxPoolItem::areSame( pItem, pOldItem ))
+                {
+                    InvalidatePage();
+                    SetCompletePaint();
+                }
+                else
+                    InvalidateRange_(SwCharRange(nPos, TextFrameIndex(1)));
+            }
+            nClear |= 0x02;
+            --nCount;
+        }
+        bool bLineSpace = SfxItemState::SET == rNewSet.GetItemState(
+                                        RES_PARATR_LINESPACING, false ),
+                 bRegister  = SfxItemState::SET == rNewSet.GetItemState(
+                                        RES_PARATR_REGISTER, false );
+        if ( bLineSpace || bRegister )
+        {
+            if (!m_pMergedPara || m_pMergedPara->pParaPropsNode == &rModify)
+            {
+                Prepare( bRegister ? PrepareHint::Register : 
PrepareHint::AdjustSizeWithoutFormatting );
+                CalcLineSpace();
+                InvalidateSize();
+                InvalidatePrt_();
+
+                // i#11859
+                //  (1) Also invalidate next frame on next page/column.
+                //  (2) Skip empty sections and hidden paragraphs
+                //  Thus, use method <InvalidateNextPrtArea()>
+                InvalidateNextPrtArea();
+
+                SetCompletePaint();
+            }
+            nClear |= 0x04;
+            if ( bLineSpace )
+            {
+                --nCount;
+                if ((!m_pMergedPara || m_pMergedPara->pParaPropsNode == 
&rModify)
+                    && IsInSct() && !GetPrev())
+                {
+                    SwSectionFrame *pSect = FindSctFrame();
+                    if( pSect->ContainsAny() == this )
+                        pSect->InvalidatePrt();
+                }
+            }
+            if ( bRegister )
+                --nCount;
+        }
+        if ( SfxItemState::SET == rNewSet.GetItemState( RES_PARATR_SPLIT,
+                                                   false ))
+        {
+            if (!m_pMergedPara || m_pMergedPara->pParaPropsNode == &rModify)
+            {
+                if (GetPrev())
+                    CheckKeep();
+                Prepare();
+                InvalidateSize();
+            }
+            nClear |= 0x08;
+            --nCount;
+        }
+
+        if( SfxItemState::SET == rNewSet.GetItemState( RES_BACKGROUND, false)
+            && (!m_pMergedPara || m_pMergedPara->pParaPropsNode == &rModify)
+            && !IsFollow() && GetDrawObjs() )
+        {
+            SwSortedObjs *pObjs = GetDrawObjs();
+            for ( size_t i = 0; GetDrawObjs() && i < pObjs->size(); ++i )
+            {
+                SwAnchoredObject* pAnchoredObj = (*pObjs)[i];
+                if ( auto pFly = pAnchoredObj->DynCastFlyFrame() )
+                {
+                    if( !pFly->IsFlyInContentFrame() )
+                    {
+                        const SvxBrushItem &rBack =
+                            pFly->GetAttrSet()->GetBackground();
+                        //     #GetTransChg#
+                        //     following condition determines, if the fly frame
+                        //     "inherites" the background color of text frame.
+                        //     This is the case, if fly frame background
+                        //     color is "no fill"/"auto fill" and if the fly 
frame
+                        //     has no background graphic.
+                        //     Thus, check complete fly frame background
+                        //     color and *not* only its transparency value
+                        if ( (rBack.GetColor() == COL_TRANSPARENT)  &&
+                            rBack.GetGraphicPos() == GPOS_NONE )
+                        {
+                            pFly->SetCompletePaint();
+                            pFly->InvalidatePage();
+                        }
+                    }
+                }
+            }
+        }
+
-e 
... etc. - the rest is truncated

Reply via email to