diff options
author | Bjoern Michaelsen <bjoern.michaelsen@libreoffice.org> | 2021-10-25 02:02:09 +0200 |
---|---|---|
committer | Bjoern Michaelsen <bjoern.michaelsen@libreoffice.org> | 2021-10-29 03:00:47 +0200 |
commit | 86d11097cd4a2ae4a6b4e6b35e28a6075376d67a (patch) | |
tree | 104762ecf24daf8e4c617cc372310d642bc46929 /sw | |
parent | cae107bab822acc198569750ae5b9a272f7ae996 (diff) |
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.michaelsen@libreoffice.org>
Diffstat (limited to 'sw')
-rw-r--r-- | sw/inc/dbfld.hxx | 5 | ||||
-rw-r--r-- | sw/inc/ddefld.hxx | 8 | ||||
-rw-r--r-- | sw/inc/docufld.hxx | 8 | ||||
-rw-r--r-- | sw/inc/expfld.hxx | 7 | ||||
-rw-r--r-- | sw/inc/fldbas.hxx | 1 | ||||
-rw-r--r-- | sw/inc/reffld.hxx | 1 | ||||
-rw-r--r-- | sw/source/core/doc/DocumentFieldsManager.cxx | 44 | ||||
-rw-r--r-- | sw/source/core/fields/fldbas.cxx | 5 |
8 files changed, 33 insertions, 46 deletions
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")); |