summaryrefslogtreecommitdiff
path: root/sw/source/core/txtnode
diff options
context:
space:
mode:
authorBjoern Michaelsen <bjoern.michaelsen@libreoffice.org>2020-02-04 01:50:56 +0100
committerBjörn Michaelsen <bjoern.michaelsen@libreoffice.org>2020-02-07 19:49:13 +0100
commitc73b5e969b2f9abdb2b9191938ca30bec5af725d (patch)
tree5bb49b193f7c143f380d8e5ce580552b588888ec /sw/source/core/txtnode
parent61fbdb13121643c6faf917912bd39c6b9720888a (diff)
SwFormatField::Modify no more (folded into SwClientNotify)
- refactor out field formatting * make direct calls explicit with new UpdateTextNode() call * try to bring at least some sanity to the event handler Change-Id: I40a39ddf70476b7fa0bf5e157fb263e863bb1d20 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/87927 Tested-by: Jenkins Reviewed-by: Björn Michaelsen <bjoern.michaelsen@libreoffice.org>
Diffstat (limited to 'sw/source/core/txtnode')
-rw-r--r--sw/source/core/txtnode/atrfld.cxx111
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