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