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

Reply via email to