sw/inc/dbfld.hxx                             |    5 +--
 sw/inc/ddefld.hxx                            |    8 +++-
 sw/inc/docufld.hxx                           |    8 +++-
 sw/inc/expfld.hxx                            |    7 +++-
 sw/inc/fldbas.hxx                            |    1 
 sw/inc/reffld.hxx                            |    1 
 sw/source/core/doc/DocumentFieldsManager.cxx |   44 ++++-----------------------
 sw/source/core/fields/fldbas.cxx             |    5 +++
 8 files changed, 33 insertions(+), 46 deletions(-)

New commits:
commit 86d11097cd4a2ae4a6b4e6b35e28a6075376d67a
Author:     Bjoern Michaelsen <bjoern.michael...@libreoffice.org>
AuthorDate: Mon Oct 25 02:02:09 2021 +0200
Commit:     Bjoern Michaelsen <bjoern.michael...@libreoffice.org>
CommitDate: Fri Oct 29 03:00:47 2021 +0200

    use virtual function call for dynamic dispatch
    
    ... as it is around since the dawn of C++ and should be stable --
    certainly more stable and less errorprone that manual typetagging.
    
    Change-Id: I5dfe2ce40c2334dc8fe60705d358779fa4bf1586
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/124131
    Tested-by: Jenkins
    Reviewed-by: Bjoern Michaelsen <bjoern.michael...@libreoffice.org>

diff --git a/sw/inc/dbfld.hxx b/sw/inc/dbfld.hxx
index 4fabaff6c253..8904575f319b 100644
--- a/sw/inc/dbfld.hxx
+++ b/sw/inc/dbfld.hxx
@@ -47,8 +47,9 @@ public:
     const OUString&     GetColumnName() const {return m_sColumn;}
     const SwDBData& GetDBData() const {return m_aDBData;}
 
-    virtual void        QueryValue( css::uno::Any& rVal, sal_uInt16 nWhich ) 
const override;
-    virtual void        PutValue( const css::uno::Any& rVal, sal_uInt16 nWhich 
) override;
+    virtual void QueryValue( css::uno::Any& rVal, sal_uInt16 nWhich ) const 
override;
+    virtual void PutValue( const css::uno::Any& rVal, sal_uInt16 nWhich ) 
override;
+    virtual void UpdateFields() override {};
 };
 
 // Classes derived from SwFields. They overlay the expand-function.
diff --git a/sw/inc/ddefld.hxx b/sw/inc/ddefld.hxx
index ccb72ff25b24..c96f0bdaa659 100644
--- a/sw/inc/ddefld.hxx
+++ b/sw/inc/ddefld.hxx
@@ -99,6 +99,8 @@ public:
     void DecRefCnt() {  if( !--m_nRefCount && m_pDoc ) RefCntChgd(); }
 
     void SetCRLFDelFlag( bool bFlag )    { m_bCRLFFlag = bFlag; }
+    virtual void UpdateFields() override
+            { UpdateDDE(false); };
     void UpdateDDE(const bool bNotifyShells = true);
 };
 
@@ -115,11 +117,11 @@ public:
 
     /** Get parameter via types.
      Name cannot be changed. */
-    virtual OUString  GetPar1() const override;
+    virtual OUString GetPar1() const override;
 
     // Command
-    virtual OUString  GetPar2() const override;
-    virtual void    SetPar2(const OUString& rStr) override;
+    virtual OUString GetPar2() const override;
+    virtual void SetPar2(const OUString& rStr) override;
 };
 
 #endif // INCLUDED_SW_INC_DDEFLD_HXX
diff --git a/sw/inc/docufld.hxx b/sw/inc/docufld.hxx
index 1b76fe7bf83b..9cad6b71f77c 100644
--- a/sw/inc/docufld.hxx
+++ b/sw/inc/docufld.hxx
@@ -288,9 +288,10 @@ public:
     SwHiddenTextFieldType(bool bSetHidden = true);
 
     virtual std::unique_ptr<SwFieldType> Copy() const override;
+    virtual void UpdateFields() override {};
 
-    void                    SetHiddenFlag( bool bSetHidden );
-    bool             GetHiddenFlag() const { return m_bHidden; }
+    void SetHiddenFlag( bool bSetHidden );
+    bool GetHiddenFlag() const { return m_bHidden; }
 };
 
 class SW_DLLPUBLIC SwHiddenTextField final : public SwField
@@ -357,6 +358,7 @@ public:
     SwHiddenParaFieldType();
 
     virtual std::unique_ptr<SwFieldType> Copy() const override;
+    virtual void UpdateFields() override {};
 };
 
 class SwHiddenParaField final : public SwField
@@ -577,6 +579,7 @@ public:
     SwRefPageSetFieldType();
 
     virtual std::unique_ptr<SwFieldType> Copy() const override;
+    virtual void UpdateFields() override {};
 
 private:
     /// noop, there is nothing to update!
@@ -652,6 +655,7 @@ class SwJumpEditFieldType final : public SwFieldType
 public:
     SwJumpEditFieldType( SwDoc& rDoc );
     virtual std::unique_ptr<SwFieldType> Copy() const override;
+    virtual void UpdateFields() override {};
 
     SwCharFormat* GetCharFormat();
 };
diff --git a/sw/inc/expfld.hxx b/sw/inc/expfld.hxx
index e82f9b23772f..25d442ee107a 100644
--- a/sw/inc/expfld.hxx
+++ b/sw/inc/expfld.hxx
@@ -72,6 +72,7 @@ class SAL_DLLPUBLIC_RTTI SwGetExpFieldType final : public 
SwValueFieldType
 public:
     SwGetExpFieldType(SwDoc* pDoc);
     virtual std::unique_ptr<SwFieldType> Copy() const override;
+    virtual void UpdateFields() override {};
 
     /** Overlay, because get-field cannot be changed and therefore
      does not need to be updated. Update at changing of set-values! */
@@ -180,8 +181,9 @@ public:
     void SetOutlineLvl( sal_uInt8 n )           { m_nLevel = n; }
     void SetChapter(SwSetExpField& rField, const SwNode& rNd, SwRootFrame 
const* pLayout);
 
-    virtual void        QueryValue( css::uno::Any& rVal, sal_uInt16 nWhich ) 
const override;
-    virtual void        PutValue( const css::uno::Any& rVal, sal_uInt16 nWhich 
) override;
+    virtual void QueryValue( css::uno::Any& rVal, sal_uInt16 nWhich ) const 
override;
+    virtual void PutValue( const css::uno::Any& rVal, sal_uInt16 nWhich ) 
override;
+    virtual void UpdateFields() override {};
 };
 
 inline void SwSetExpFieldType::SetType( sal_uInt16 nTyp )
@@ -368,6 +370,7 @@ class SwTableFieldType final : public SwValueFieldType
 public:
     SwTableFieldType(SwDoc* pDocPtr);
     virtual std::unique_ptr<SwFieldType> Copy() const override;
+    virtual void UpdateFields() override {};
 };
 
 class SwTableField final : public SwValueField, public SwTableFormula
diff --git a/sw/inc/fldbas.hxx b/sw/inc/fldbas.hxx
index 03a410834219..0251ba1f9a23 100644
--- a/sw/inc/fldbas.hxx
+++ b/sw/inc/fldbas.hxx
@@ -284,6 +284,7 @@ public:
     void GatherRefFields(std::vector<SwGetRefField*>& rvRFields, const 
sal_uInt16 nTyp);
     void GatherFields(std::vector<SwFormatField*>& rvFormatFields, bool 
bCollectOnlyInDocNodes=true) const;
     void GatherDdeTables(std::vector<SwDDETable*>& rvTables) const;
+    virtual void UpdateFields();
 };
 
 /** Base class of all fields.
diff --git a/sw/inc/reffld.hxx b/sw/inc/reffld.hxx
index c76fe074c854..c8c8965b5cb1 100644
--- a/sw/inc/reffld.hxx
+++ b/sw/inc/reffld.hxx
@@ -71,6 +71,7 @@ class SAL_DLLPUBLIC_RTTI SwGetRefFieldType final : public 
SwFieldType
 public:
     SwGetRefFieldType(SwDoc& rDoc );
     virtual std::unique_ptr<SwFieldType> Copy() const override;
+    virtual void UpdateFields() override {};
 
     SwDoc&                  GetDoc() const { return m_rDoc; }
 
diff --git a/sw/source/core/doc/DocumentFieldsManager.cxx 
b/sw/source/core/doc/DocumentFieldsManager.cxx
index 530f4ea22bec..c7915021be87 100644
--- a/sw/source/core/doc/DocumentFieldsManager.cxx
+++ b/sw/source/core/doc/DocumentFieldsManager.cxx
@@ -386,51 +386,21 @@ void DocumentFieldsManager::RemoveFieldType(size_t nField)
 }
 
 // All have to be re-evaluated.
-void DocumentFieldsManager::UpdateFields( bool bCloseDB )
+void DocumentFieldsManager::UpdateFields(bool bCloseDB)
 {
-    // Call Modify() for every field type,
-    // dependent SwTextField get notified ...
-
-    for( auto const & pFieldType : *mpFieldTypes )
-    {
-        switch( pFieldType->Which() )
-        {
-            // Update table fields second to last
-            // Update references last
-        case SwFieldIds::GetRef:
-        case SwFieldIds::Table:
-        case SwFieldIds::Database:
-        case SwFieldIds::JumpEdit:
-        case SwFieldIds::RefPageSet:     // are never expanded!
-            break;
-
-        case SwFieldIds::Dde:
-        {
-            assert(dynamic_cast<SwDDEFieldType*>(pFieldType.get()));
-            auto pDDEFieldType = 
static_cast<SwDDEFieldType*>(pFieldType.get());
-            pDDEFieldType->UpdateDDE(false);
-            break;
-        }
-        case SwFieldIds::GetExp:
-        case SwFieldIds::SetExp:
-        case SwFieldIds::HiddenText:
-        case SwFieldIds::HiddenPara:
-            // Expression fields are treated separately
-            break;
-        default:
-            pFieldType->CallSwClientNotify(sw::LegacyModifyHint(nullptr, 
nullptr));
-        }
-    }
+    // Tell all types to update their fields
+    for(auto const& pFieldType: *mpFieldTypes)
+        pFieldType->UpdateFields();
 
-    if( !IsExpFieldsLocked() )
-        UpdateExpFields( nullptr, false );      // update expression fields
+    if(!IsExpFieldsLocked())
+        UpdateExpFields(nullptr, false); // update expression fields
 
     // Tables
     UpdateTableFields(nullptr);
 
     // References
     UpdateRefFields();
-    if( bCloseDB )
+    if(bCloseDB)
     {
 #if HAVE_FEATURE_DBCONNECTIVITY && !ENABLE_FUZZERS
         m_rDoc.GetDBManager()->CloseAll();
diff --git a/sw/source/core/fields/fldbas.cxx b/sw/source/core/fields/fldbas.cxx
index 7bcbef589b0a..ae5a8751ff05 100644
--- a/sw/source/core/fields/fldbas.cxx
+++ b/sw/source/core/fields/fldbas.cxx
@@ -215,6 +215,11 @@ void 
SwFieldType::GatherDdeTables(std::vector<SwDDETable*>& rvTables) const
     CallSwClientNotify(sw::GatherDdeTablesHint(rvTables));
 }
 
+void SwFieldType::UpdateFields()
+{
+    CallSwClientNotify(sw::LegacyModifyHint(nullptr, nullptr));
+};
+
 void SwFieldTypes::dumpAsXml(xmlTextWriterPtr pWriter) const
 {
     (void)xmlTextWriterStartElement(pWriter, BAD_CAST("SwFieldTypes"));

Reply via email to