sw/inc/doc.hxx | 3 sw/source/core/bastyp/init.cxx | 4 sw/source/core/doc/doc.cxx | 25 ++ sw/source/core/doc/docfld.cxx | 389 +++++++++++++++++++---------------------- sw/source/core/edit/edfld.cxx | 38 +--- sw/source/core/view/vprint.cxx | 34 +-- 6 files changed, 251 insertions(+), 242 deletions(-)
New commits: commit 8849c1d9cc7fbf990b1e1633b59a09c818dabc72 Author: Noel Grandin <noelgran...@gmail.com> AuthorDate: Sun Sep 8 11:03:35 2024 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Mon Sep 9 19:23:57 2024 +0200 dont use GetItemSurrogates for gathering SwFormatField which is very expensive these days Change-Id: I830e7829ee3b919647f44ab060bf170e5cf42189 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/173035 Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> Tested-by: Jenkins diff --git a/sw/inc/doc.hxx b/sw/inc/doc.hxx index 6da96bd2cb82..1a4fff14b4c2 100644 --- a/sw/inc/doc.hxx +++ b/sw/inc/doc.hxx @@ -1437,6 +1437,9 @@ public: /// Iterate over all SvxOverlineItem, if the function returns false, iteration is stopped SW_DLLPUBLIC void ForEachOverlineItem( const std::function<bool(const SvxOverlineItem&)>& ) const; + /// Iterate over all SwFormatField, if the function returns false, iteration is stopped + void ForEachFormatField( TypedWhichId<SwFormatField> nWhich, const std::function<bool(const SwFormatField&)>& ) const; + // Call into intransparent Basic; expect possible Return String. void ExecMacro( const SvxMacro& rMacro, OUString* pRet, SbxArray* pArgs ); diff --git a/sw/source/core/bastyp/init.cxx b/sw/source/core/bastyp/init.cxx index cc964e7aa01a..83f1ca1f6b19 100644 --- a/sw/source/core/bastyp/init.cxx +++ b/sw/source/core/bastyp/init.cxx @@ -345,9 +345,9 @@ ItemInfoPackage& getItemInfoPackageSwAttributes() { RES_TXTATR_CHARFMT, new SwFormatCharFormat( nullptr ), 0, SFX_ITEMINFOFLAG_NONE }, { RES_TXTATR_CJK_RUBY, new SwFormatRuby( OUString() ), SID_ATTR_CHAR_CJK_RUBY, SFX_ITEMINFOFLAG_NONE }, { RES_TXTATR_UNKNOWN_CONTAINER, new SvXMLAttrContainerItem( RES_TXTATR_UNKNOWN_CONTAINER ), 0, SFX_ITEMINFOFLAG_SUPPORT_SURROGATE }, - { RES_TXTATR_INPUTFIELD, createSwFormatFieldForItemInfoPackage( RES_TXTATR_INPUTFIELD ), 0, SFX_ITEMINFOFLAG_SUPPORT_SURROGATE }, + { RES_TXTATR_INPUTFIELD, createSwFormatFieldForItemInfoPackage( RES_TXTATR_INPUTFIELD ), 0, SFX_ITEMINFOFLAG_NONE }, { RES_TXTATR_CONTENTCONTROL, new SwFormatContentControl( RES_TXTATR_CONTENTCONTROL ), 0, SFX_ITEMINFOFLAG_NONE }, - { RES_TXTATR_FIELD, createSwFormatFieldForItemInfoPackage( RES_TXTATR_FIELD ), 0, SFX_ITEMINFOFLAG_SUPPORT_SURROGATE }, + { RES_TXTATR_FIELD, createSwFormatFieldForItemInfoPackage( RES_TXTATR_FIELD ), 0, SFX_ITEMINFOFLAG_NONE }, { RES_TXTATR_FLYCNT, new SwFormatFlyCnt( nullptr ), 0, SFX_ITEMINFOFLAG_NONE }, { RES_TXTATR_FTN, new SwFormatFootnote, 0, SFX_ITEMINFOFLAG_NONE }, { RES_TXTATR_ANNOTATION, createSwFormatFieldForItemInfoPackage( RES_TXTATR_ANNOTATION ), 0, SFX_ITEMINFOFLAG_NONE }, diff --git a/sw/source/core/doc/doc.cxx b/sw/source/core/doc/doc.cxx index ec69fb2057d7..c2620093cb33 100644 --- a/sw/source/core/doc/doc.cxx +++ b/sw/source/core/doc/doc.cxx @@ -1280,6 +1280,31 @@ void SwDoc::ForEachOverlineItem( const std::function<bool(const SvxOverlineItem& } } +/// Iterate over all SwFormatField, if the function returns false, iteration is stopped +void SwDoc::ForEachFormatField( TypedWhichId<SwFormatField> nWhich, const std::function<bool(const SwFormatField&)>& rFunc ) const +{ + SwNodeOffset nCount = GetNodes().Count(); + for (SwNodeOffset i(0); i < nCount; ++i) + { + SwNode* pNode = GetNodes()[i]; + if (!pNode->IsTextNode()) + continue; + SwTextNode* pTextNode = pNode->GetTextNode(); + if (!pTextNode->HasHints()) + continue; + SwpHints& rHints = pTextNode->GetSwpHints(); + for (size_t j = 0; j < rHints.Count(); ++j) + { + const SwTextAttr* pTextAttr = rHints.Get(j); + if (pTextAttr->Which() != nWhich) + continue; + const SwFormatField& rFormatField = pTextAttr->GetFormatField(); + if (!rFunc(rFormatField)) + return; + } + } +} + /** * Re-trigger spelling in the idle handler. * diff --git a/sw/source/core/doc/docfld.cxx b/sw/source/core/doc/docfld.cxx index 613a2e0fd98c..45fda23a806a 100644 --- a/sw/source/core/doc/docfld.cxx +++ b/sw/source/core/doc/docfld.cxx @@ -465,54 +465,49 @@ void SwDoc::GetAllUsedDB( std::vector<OUString>& rDBNameList, } } - for (sal_uInt16 const nWhichHint : { RES_TXTATR_FIELD, RES_TXTATR_INPUTFIELD }) + for (const TypedWhichId<SwFormatField> & nWhichHint : { RES_TXTATR_FIELD, RES_TXTATR_INPUTFIELD }) { - ItemSurrogates aSurrogates; - GetAttrPool().GetItemSurrogates(aSurrogates, nWhichHint); - for (const SfxPoolItem* pItem : aSurrogates) - { - const SwFormatField* pFormatField = static_cast<const SwFormatField*>(pItem); - const SwTextField* pTextField = pFormatField->GetTextField(); - if (!pTextField || !pTextField->GetTextNode().GetNodes().IsDocNodes()) - continue; - - const SwField* pField = pFormatField->GetField(); - switch (pField->GetTyp()->Which()) + ForEachFormatField(nWhichHint, + [this, &rDBNameList, &aUsedDBNames, &pAllDBNames] (const SwFormatField& rFormatField) -> bool { - case SwFieldIds::Database: - AddUsedDBToList( rDBNameList, - lcl_DBDataToString(static_cast<const SwDBField*>(pField)->GetDBData() )); - break; - - case SwFieldIds::DbSetNumber: - case SwFieldIds::DatabaseName: - AddUsedDBToList( rDBNameList, - lcl_DBDataToString(static_cast<const SwDBNameInfField*>(pField)->GetRealDBData() )); - break; + const SwField* pField = rFormatField.GetField(); + switch (pField->GetTyp()->Which()) + { + case SwFieldIds::Database: + AddUsedDBToList( rDBNameList, + lcl_DBDataToString(static_cast<const SwDBField*>(pField)->GetDBData() )); + break; - case SwFieldIds::DbNumSet: - case SwFieldIds::DbNextSet: - AddUsedDBToList( rDBNameList, - lcl_DBDataToString(static_cast<const SwDBNameInfField*>(pField)->GetRealDBData() )); - [[fallthrough]]; // JP: is that right like that? - - case SwFieldIds::HiddenText: - case SwFieldIds::HiddenPara: - AddUsedDBToList(rDBNameList, FindUsedDBs( *pAllDBNames, - pField->GetPar1(), aUsedDBNames )); - aUsedDBNames.clear(); - break; + case SwFieldIds::DbSetNumber: + case SwFieldIds::DatabaseName: + AddUsedDBToList( rDBNameList, + lcl_DBDataToString(static_cast<const SwDBNameInfField*>(pField)->GetRealDBData() )); + break; - case SwFieldIds::SetExp: - case SwFieldIds::GetExp: - case SwFieldIds::Table: - AddUsedDBToList(rDBNameList, FindUsedDBs( *pAllDBNames, - pField->GetFormula(), aUsedDBNames )); - aUsedDBNames.clear(); - break; - default: break; - } - } + case SwFieldIds::DbNumSet: + case SwFieldIds::DbNextSet: + AddUsedDBToList( rDBNameList, + lcl_DBDataToString(static_cast<const SwDBNameInfField*>(pField)->GetRealDBData() )); + [[fallthrough]]; // JP: is that right like that? + + case SwFieldIds::HiddenText: + case SwFieldIds::HiddenPara: + AddUsedDBToList(rDBNameList, FindUsedDBs( *pAllDBNames, + pField->GetPar1(), aUsedDBNames )); + aUsedDBNames.clear(); + break; + + case SwFieldIds::SetExp: + case SwFieldIds::GetExp: + case SwFieldIds::Table: + AddUsedDBToList(rDBNameList, FindUsedDBs( *pAllDBNames, + pField->GetFormula(), aUsedDBNames )); + aUsedDBNames.clear(); + break; + default: break; + } + return true; + }); } #endif } @@ -623,79 +618,76 @@ void SwDoc::ChangeDBFields( const std::vector<OUString>& rOldNames, } } - for (sal_uInt16 const nWhichHint : { RES_TXTATR_FIELD, RES_TXTATR_INPUTFIELD }) + for (const TypedWhichId<SwFormatField> & nWhichHint : { RES_TXTATR_FIELD, RES_TXTATR_INPUTFIELD }) { - ItemSurrogates aSurrogates; - GetAttrPool().GetItemSurrogates(aSurrogates, nWhichHint); - for (const SfxPoolItem* pItem : aSurrogates) - { - const SwFormatField* pFormatField = static_cast<const SwFormatField*>(pItem); - const SwTextField* pTextField = pFormatField->GetTextField(); - if (!pTextField || !pTextField->GetTextNode().GetNodes().IsDocNodes()) - continue; + ForEachFormatField(nWhichHint, + [this, &rOldNames, &aNewDBData, &rNewName] (const SwFormatField& rFormatField) -> bool + { + const SwTextField* pTextField = rFormatField.GetTextField(); - SwField* pField(const_cast<SwFormatField*>(pFormatField)->GetField()); - bool bExpand = false; + SwField* pField(const_cast<SwFormatField&>(rFormatField).GetField()); + bool bExpand = false; - switch( pField->GetTyp()->Which() ) - { - case SwFieldIds::Database: + switch( pField->GetTyp()->Which() ) + { + case SwFieldIds::Database: #if HAVE_FEATURE_DBCONNECTIVITY && !ENABLE_FUZZERS - if (IsNameInArray(rOldNames, lcl_DBDataToString(static_cast<SwDBField*>(pField)->GetDBData()))) - { - SwDBFieldType* pOldTyp = static_cast<SwDBFieldType*>(pField->GetTyp()); + if (IsNameInArray(rOldNames, lcl_DBDataToString(static_cast<SwDBField*>(pField)->GetDBData()))) + { + SwDBFieldType* pOldTyp = static_cast<SwDBFieldType*>(pField->GetTyp()); - SwDBFieldType* pTyp = static_cast<SwDBFieldType*>(getIDocumentFieldsAccess().InsertFieldType( - SwDBFieldType(this, pOldTyp->GetColumnName(), aNewDBData))); + SwDBFieldType* pTyp = static_cast<SwDBFieldType*>(getIDocumentFieldsAccess().InsertFieldType( + SwDBFieldType(this, pOldTyp->GetColumnName(), aNewDBData))); - // SwFormatField is non-shareable, so const_cast is somewhat OK - const_cast<SwFormatField*>(pFormatField)->RegisterToFieldType( *pTyp ); - pField->ChgTyp(pTyp); + // SwFormatField is non-shareable, so const_cast is somewhat OK + const_cast<SwFormatField&>(rFormatField).RegisterToFieldType( *pTyp ); + pField->ChgTyp(pTyp); - static_cast<SwDBField*>(pField)->ClearInitialized(); - static_cast<SwDBField*>(pField)->InitContent(); + static_cast<SwDBField*>(pField)->ClearInitialized(); + static_cast<SwDBField*>(pField)->InitContent(); - bExpand = true; - } + bExpand = true; + } #endif - break; + break; - case SwFieldIds::DbSetNumber: - case SwFieldIds::DatabaseName: - if (IsNameInArray(rOldNames, - lcl_DBDataToString(static_cast<SwDBNameInfField*>(pField)->GetRealDBData()))) - { - static_cast<SwDBNameInfField*>(pField)->SetDBData(aNewDBData); - bExpand = true; - } - break; + case SwFieldIds::DbSetNumber: + case SwFieldIds::DatabaseName: + if (IsNameInArray(rOldNames, + lcl_DBDataToString(static_cast<SwDBNameInfField*>(pField)->GetRealDBData()))) + { + static_cast<SwDBNameInfField*>(pField)->SetDBData(aNewDBData); + bExpand = true; + } + break; - case SwFieldIds::DbNumSet: - case SwFieldIds::DbNextSet: - if (IsNameInArray(rOldNames, - lcl_DBDataToString(static_cast<SwDBNameInfField*>(pField)->GetRealDBData()))) - { - static_cast<SwDBNameInfField*>(pField)->SetDBData(aNewDBData); - } - [[fallthrough]]; - case SwFieldIds::HiddenText: - case SwFieldIds::HiddenPara: - pField->SetPar1( ReplaceUsedDBs(rOldNames, rNewName, pField->GetPar1()) ); - bExpand = true; - break; + case SwFieldIds::DbNumSet: + case SwFieldIds::DbNextSet: + if (IsNameInArray(rOldNames, + lcl_DBDataToString(static_cast<SwDBNameInfField*>(pField)->GetRealDBData()))) + { + static_cast<SwDBNameInfField*>(pField)->SetDBData(aNewDBData); + } + [[fallthrough]]; + case SwFieldIds::HiddenText: + case SwFieldIds::HiddenPara: + pField->SetPar1( ReplaceUsedDBs(rOldNames, rNewName, pField->GetPar1()) ); + bExpand = true; + break; - case SwFieldIds::SetExp: - case SwFieldIds::GetExp: - case SwFieldIds::Table: - pField->SetPar2( ReplaceUsedDBs(rOldNames, rNewName, pField->GetFormula()) ); - bExpand = true; - break; - default: break; - } + case SwFieldIds::SetExp: + case SwFieldIds::GetExp: + case SwFieldIds::Table: + pField->SetPar2( ReplaceUsedDBs(rOldNames, rNewName, pField->GetFormula()) ); + bExpand = true; + break; + default: break; + } - if (bExpand) - pTextField->ExpandTextField( true ); - } + if (bExpand) + pTextField->ExpandTextField( true ); + return true; + }); } getIDocumentState().SetModified(); #endif @@ -943,116 +935,113 @@ void SwDocUpdateField::MakeFieldList_( SwDoc& rDoc, int eGetMode ) bool bIsDBManager = nullptr != rDoc.GetDBManager(); #endif - for (sal_uInt16 const nWhichHint : { RES_TXTATR_FIELD, RES_TXTATR_INPUTFIELD }) + for (const TypedWhichId<SwFormatField> & nWhichHint : { RES_TXTATR_FIELD, RES_TXTATR_INPUTFIELD }) { - ItemSurrogates aSurrogates; - rDoc.GetAttrPool().GetItemSurrogates(aSurrogates, nWhichHint); - for (const SfxPoolItem* pItem : aSurrogates) - { - const SwFormatField* pFormatField = static_cast<const SwFormatField*>(pItem); - const SwTextField* pTextField = pFormatField->GetTextField(); - if (!pTextField || !pTextField->GetTextNode().GetNodes().IsDocNodes()) - continue; - - OUString sFormula; - const SwField* pField = pFormatField->GetField(); - const SwFieldIds nWhich = pField->GetTyp()->Which(); - switch (nWhich) + rDoc.ForEachFormatField(nWhichHint, + [this, eGetMode, &rDoc, bIsDBManager] (const SwFormatField& rFormatField) -> bool { - case SwFieldIds::DbSetNumber: - case SwFieldIds::GetExp: - if (GETFLD_ALL == eGetMode) - sFormula = sTrue; - break; + const SwTextField* pTextField = rFormatField.GetTextField(); - case SwFieldIds::Database: - if (GETFLD_EXPAND & eGetMode) - sFormula = sTrue; - break; + OUString sFormula; + const SwField* pField = rFormatField.GetField(); + const SwFieldIds nWhich = pField->GetTyp()->Which(); + switch (nWhich) + { + case SwFieldIds::DbSetNumber: + case SwFieldIds::GetExp: + if (GETFLD_ALL == eGetMode) + sFormula = sTrue; + break; - case SwFieldIds::SetExp: - if ((eGetMode != GETFLD_EXPAND) || - (nsSwGetSetExpType::GSE_STRING & pField->GetSubType())) - { - sFormula = sTrue; - } - break; + case SwFieldIds::Database: + if (GETFLD_EXPAND & eGetMode) + sFormula = sTrue; + break; - case SwFieldIds::HiddenPara: - if (GETFLD_ALL == eGetMode) - { - sFormula = pField->GetPar1(); - if (sFormula.isEmpty() || sFormula==sFalse) - const_cast<SwHiddenParaField*>(static_cast<const SwHiddenParaField*>(pField))->SetHidden( false ); - else if (sFormula==sTrue) - const_cast<SwHiddenParaField*>(static_cast<const SwHiddenParaField*>(pField))->SetHidden( true ); - else - break; - - sFormula.clear(); - // trigger formatting - const_cast<SwFormatField*>(pFormatField)->ForceUpdateTextNode(); - } - break; + case SwFieldIds::SetExp: + if ((eGetMode != GETFLD_EXPAND) || + (nsSwGetSetExpType::GSE_STRING & pField->GetSubType())) + { + sFormula = sTrue; + } + break; - case SwFieldIds::HiddenText: - if (GETFLD_ALL == eGetMode) - { - sFormula = pField->GetPar1(); - if (sFormula.isEmpty() || sFormula==sFalse) - const_cast<SwHiddenTextField*>(static_cast<const SwHiddenTextField*>(pField))->SetValue( true ); - else if (sFormula==sTrue) - const_cast<SwHiddenTextField*>(static_cast<const SwHiddenTextField*>(pField))->SetValue( false ); - else - break; - - sFormula.clear(); - - // evaluate field - const_cast<SwHiddenTextField*>(static_cast<const SwHiddenTextField*>(pField))->Evaluate(rDoc); - // trigger formatting - const_cast<SwFormatField*>(pFormatField)->ForceUpdateTextNode(); - } - break; + case SwFieldIds::HiddenPara: + if (GETFLD_ALL == eGetMode) + { + sFormula = pField->GetPar1(); + if (sFormula.isEmpty() || sFormula==sFalse) + const_cast<SwHiddenParaField*>(static_cast<const SwHiddenParaField*>(pField))->SetHidden( false ); + else if (sFormula==sTrue) + const_cast<SwHiddenParaField*>(static_cast<const SwHiddenParaField*>(pField))->SetHidden( true ); + else + break; -#if HAVE_FEATURE_DBCONNECTIVITY && !ENABLE_FUZZERS - case SwFieldIds::DbNumSet: - { - SwDBData aDBData(const_cast<SwDBNumSetField*>(static_cast<const SwDBNumSetField*>(pField))->GetDBData(&rDoc)); + sFormula.clear(); + // trigger formatting + const_cast<SwFormatField&>(rFormatField).ForceUpdateTextNode(); + } + break; + + case SwFieldIds::HiddenText: + if (GETFLD_ALL == eGetMode) + { + sFormula = pField->GetPar1(); + if (sFormula.isEmpty() || sFormula==sFalse) + const_cast<SwHiddenTextField*>(static_cast<const SwHiddenTextField*>(pField))->SetValue( true ); + else if (sFormula==sTrue) + const_cast<SwHiddenTextField*>(static_cast<const SwHiddenTextField*>(pField))->SetValue( false ); + else + break; + + sFormula.clear(); + + // evaluate field + const_cast<SwHiddenTextField*>(static_cast<const SwHiddenTextField*>(pField))->Evaluate(rDoc); + // trigger formatting + const_cast<SwFormatField&>(rFormatField).ForceUpdateTextNode(); + } + break; - if ( (bIsDBManager && rDoc.GetDBManager()->OpenDataSource(aDBData.sDataSource, aDBData.sCommand)) - && (GETFLD_ALL == eGetMode - || (GETFLD_CALC & eGetMode - && static_cast<const SwDBNumSetField*>(pField)->IsCondValid())) - ) +#if HAVE_FEATURE_DBCONNECTIVITY && !ENABLE_FUZZERS + case SwFieldIds::DbNumSet: { - sFormula = pField->GetPar1(); - } - } - break; - case SwFieldIds::DbNextSet: - { - SwDBData aDBData(const_cast<SwDBNextSetField*>(static_cast<const SwDBNextSetField*>(pField))->GetDBData(&rDoc)); + SwDBData aDBData(const_cast<SwDBNumSetField*>(static_cast<const SwDBNumSetField*>(pField))->GetDBData(&rDoc)); - if ( (bIsDBManager && rDoc.GetDBManager()->OpenDataSource(aDBData.sDataSource, aDBData.sCommand)) - && (GETFLD_ALL == eGetMode - || (GETFLD_CALC & eGetMode - && static_cast<const SwDBNextSetField*>(pField)->IsCondValid())) - ) + if ( (bIsDBManager && rDoc.GetDBManager()->OpenDataSource(aDBData.sDataSource, aDBData.sCommand)) + && (GETFLD_ALL == eGetMode + || (GETFLD_CALC & eGetMode + && static_cast<const SwDBNumSetField*>(pField)->IsCondValid())) + ) + { + sFormula = pField->GetPar1(); + } + } + break; + case SwFieldIds::DbNextSet: { - sFormula = pField->GetPar1(); + SwDBData aDBData(const_cast<SwDBNextSetField*>(static_cast<const SwDBNextSetField*>(pField))->GetDBData(&rDoc)); + + if ( (bIsDBManager && rDoc.GetDBManager()->OpenDataSource(aDBData.sDataSource, aDBData.sCommand)) + && (GETFLD_ALL == eGetMode + || (GETFLD_CALC & eGetMode + && static_cast<const SwDBNextSetField*>(pField)->IsCondValid())) + ) + { + sFormula = pField->GetPar1(); + } } - } - break; + break; #endif - default: break; - } + default: break; + } - if (!sFormula.isEmpty()) - { - GetBodyNode( *pTextField, nWhich ); - } - } + if (!sFormula.isEmpty()) + { + GetBodyNode( *pTextField, nWhich ); + } + return true; + }); } m_nFieldListGetMode = eGetMode; m_nNodes = rDoc.GetNodes().Count(); diff --git a/sw/source/core/edit/edfld.cxx b/sw/source/core/edit/edfld.cxx index c07ca0e502f1..e9be8f003abd 100644 --- a/sw/source/core/edit/edfld.cxx +++ b/sw/source/core/edit/edfld.cxx @@ -171,32 +171,30 @@ static SwTextField* lcl_FindInputField( SwDoc* pDoc, const SwField& rField ) && (static_cast<SwSetExpFieldType*>(rField.GetTyp())->GetType() & nsSwGetSetExpType::GSE_STRING))) { - ItemSurrogates aSurrogates; - pDoc->GetAttrPool().GetItemSurrogates(aSurrogates, RES_TXTATR_INPUTFIELD); - for (const SfxPoolItem* pItem : aSurrogates) - { - const auto & rFormatField = static_cast<const SwFormatField&>(*pItem); - if( rFormatField.GetField() == &rField ) + pDoc->ForEachFormatField(RES_TXTATR_INPUTFIELD, + [&rField, &pTField] (const SwFormatField& rFormatField) -> bool { - pTField = const_cast<SwFormatField&>(rFormatField).GetTextField(); - break; - } - } + if( rFormatField.GetField() == &rField ) + { + pTField = const_cast<SwFormatField&>(rFormatField).GetTextField(); + return false; + } + return true; + }); } else if( SwFieldIds::SetExp == rField.Which() && static_cast<const SwSetExpField&>(rField).GetInputFlag() ) { - ItemSurrogates aSurrogates; - pDoc->GetAttrPool().GetItemSurrogates(aSurrogates, RES_TXTATR_FIELD); - for (const SfxPoolItem* pItem : aSurrogates) - { - const auto & rFormatField = static_cast<const SwFormatField&>(*pItem); - if( rFormatField.GetField() == &rField ) + pDoc->ForEachFormatField(RES_TXTATR_FIELD, + [&rField, &pTField] (const SwFormatField& rFormatField) -> bool { - pTField = const_cast<SwFormatField&>(rFormatField).GetTextField(); - break; - } - } + if( rFormatField.GetField() == &rField ) + { + pTField = const_cast<SwFormatField&>(rFormatField).GetTextField(); + return false; + } + return true; + }); } return pTField; } diff --git a/sw/source/core/view/vprint.cxx b/sw/source/core/view/vprint.cxx index c9e3c2d8b437..a1c14fb3c65d 100644 --- a/sw/source/core/view/vprint.cxx +++ b/sw/source/core/view/vprint.cxx @@ -599,30 +599,24 @@ void SwViewShell::PrtOle2( SwDoc *pDoc, const SwViewOption *pOpt, const SwPrintD /// Check if the DocNodesArray contains fields. bool SwViewShell::IsAnyFieldInDoc() const { - ItemSurrogates aSurrogates; - mxDoc->GetAttrPool().GetItemSurrogates(aSurrogates, RES_TXTATR_FIELD); - for (const SfxPoolItem* pItem : aSurrogates) - { - const auto & rFormatField = static_cast<const SwFormatField&>(*pItem); - const SwTextField* pTextField = rFormatField.GetTextField(); - if( pTextField && pTextField->GetTextNode().GetNodes().IsDocNodes() ) + bool bFound = false; + mxDoc->ForEachFormatField(RES_TXTATR_FIELD, + [&bFound] (const SwFormatField& /*rFormatField*/) -> bool { - return true; - } - } + bFound = true; + return false; + }); + if (bFound) + return true; - mxDoc->GetAttrPool().GetItemSurrogates(aSurrogates, RES_TXTATR_INPUTFIELD); - for (const SfxPoolItem* pItem : aSurrogates) - { - const SwFormatField& rFormatField = static_cast<const SwFormatField&>(*pItem); - const SwTextField* pTextField = rFormatField.GetTextField(); - if( pTextField && pTextField->GetTextNode().GetNodes().IsDocNodes() ) + mxDoc->ForEachFormatField(RES_TXTATR_INPUTFIELD, + [&bFound] (const SwFormatField& /*rFormatField*/) -> bool { - return true; - } - } + bFound = true; + return false; + }); - return false; + return bFound; } /// Saves some settings at the draw view