diff options
Diffstat (limited to 'sw/source/core/txtnode')
-rw-r--r-- | sw/source/core/txtnode/atrfld.cxx | 111 |
1 files changed, 67 insertions, 44 deletions
diff --git a/sw/source/core/txtnode/atrfld.cxx b/sw/source/core/txtnode/atrfld.cxx index 3bc232ece517..4f0bbaf9a7cc 100644 --- a/sw/source/core/txtnode/atrfld.cxx +++ b/sw/source/core/txtnode/atrfld.cxx @@ -226,25 +226,27 @@ void SwFormatField::SwClientNotify( const SwModify& rModify, const SfxHint& rHin if( !mpTextField ) return; - const SwFieldHint* pHint = dynamic_cast<const SwFieldHint*>( &rHint ); - if ( pHint ) + if (const SwFieldHint* pFieldHint = dynamic_cast<const SwFieldHint*>( &rHint )) { // replace field content by text - SwPaM* pPaM = pHint->m_pPaM; + SwPaM* pPaM = pFieldHint->m_pPaM; SwDoc* pDoc = pPaM->GetDoc(); const SwTextNode& rTextNode = mpTextField->GetTextNode(); pPaM->GetPoint()->nNode = rTextNode; pPaM->GetPoint()->nContent.Assign( const_cast<SwTextNode*>(&rTextNode), mpTextField->GetStart() ); - OUString const aEntry(mpField->ExpandField(pDoc->IsClipBoard(), pHint->m_pLayout)); + OUString const aEntry(mpField->ExpandField(pDoc->IsClipBoard(), pFieldHint->m_pLayout)); pPaM->SetMark(); pPaM->Move( fnMoveForward ); pDoc->getIDocumentContentOperations().DeleteRange( *pPaM ); pDoc->getIDocumentContentOperations().InsertString( *pPaM, aEntry ); + } else if (const sw::LegacyModifyHint* pLegacyHint = dynamic_cast<const sw::LegacyModifyHint*>( &rHint )) + { + UpdateTextNode(pLegacyHint->m_pOld, pLegacyHint->m_pNew); } } -void SwFormatField::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) +void SwFormatField::UpdateTextNode(const SfxPoolItem* pOld, const SfxPoolItem* pNew) { if (pOld && (RES_REMOVE_UNO_OBJECT == pOld->Which())) { // invalidate cached UNO object @@ -263,59 +265,80 @@ void SwFormatField::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) SwTextNode* pTextNd = &mpTextField->GetTextNode(); OSL_ENSURE( pTextNd, "Where is my Node?" ); - if( pNew ) + + bool bTriggerNode = false; + bool bExpand = false; + const SfxPoolItem* pNodeOld = nullptr; + const SfxPoolItem* pNodeNew = nullptr; + if(pNew) { - switch( pNew->Which() ) + switch(pNew->Which()) { case RES_REFMARKFLD_UPDATE: - // update GetRef fields - if( SwFieldIds::GetRef == mpField->GetTyp()->Which() ) - { - // #i81002# - static_cast<SwGetRefField*>(mpField.get())->UpdateField( mpTextField ); - } - break; + // update GetRef fields + if( SwFieldIds::GetRef == mpField->GetTyp()->Which() ) + { + // #i81002# + static_cast<SwGetRefField*>(mpField.get())->UpdateField( mpTextField ); + } + break; case RES_DOCPOS_UPDATE: - // handled in SwTextFrame::Modify() - pTextNd->ModifyNotification( pNew, this ); - return; - + // handled in SwTextFrame::Modify() + bTriggerNode = true; + pNodeOld = pNew; + pNodeNew = this; + break; case RES_ATTRSET_CHG: case RES_FMT_CHG: - pTextNd->ModifyNotification( pOld, pNew ); - return; + bTriggerNode = true; + pNodeOld = pOld; + pNodeNew = pNew; + break; default: - break; + break; } } - - switch (mpField->GetTyp()->Which()) + if(!bTriggerNode) { - case SwFieldIds::HiddenPara: - if( !pOld || RES_HIDDENPARA_PRINT != pOld->Which() ) + switch (mpField->GetTyp()->Which()) + { + case SwFieldIds::HiddenPara: + if( !pOld || pOld->Which() != RES_HIDDENPARA_PRINT ) { + bExpand =true; + break; + } + [[fallthrough]]; + case SwFieldIds::DbSetNumber: + case SwFieldIds::DbNumSet: + case SwFieldIds::DbNextSet: + case SwFieldIds::DatabaseName: + bTriggerNode = true; + pNodeNew = pNew; break; - [[fallthrough]]; - case SwFieldIds::DbSetNumber: - case SwFieldIds::DbNumSet: - case SwFieldIds::DbNextSet: - case SwFieldIds::DatabaseName: - pTextNd->ModifyNotification( nullptr, pNew); - return; - default: break; + case SwFieldIds::User: + { + SwUserFieldType* pType = static_cast<SwUserFieldType*>(mpField->GetTyp()); + if(!pType->IsValid()) + { + SwCalc aCalc( *pTextNd->GetDoc() ); + pType->GetValue( aCalc ); + } + bExpand = true; + } + break; + default: + bExpand = true; + break; + } } - - if( SwFieldIds::User == mpField->GetTyp()->Which() ) + if(bTriggerNode) { - SwUserFieldType* pType = static_cast<SwUserFieldType*>(mpField->GetTyp()); - if(!pType->IsValid()) - { - SwCalc aCalc( *pTextNd->GetDoc() ); - pType->GetValue( aCalc ); - } + pTextNd->ModifyNotification(pNodeOld, pNodeNew); + } + if(bExpand) + { + mpTextField->ExpandTextField( pOld == nullptr && pNew == nullptr ); } - - const bool bForceNotify = (pOld == nullptr) && (pNew == nullptr); - mpTextField->ExpandTextField( bForceNotify ); } bool SwFormatField::GetInfo( SfxPoolItem& rInfo ) const |