summaryrefslogtreecommitdiff
path: root/sw
diff options
context:
space:
mode:
authorBjoern Michaelsen <bjoern.michaelsen@libreoffice.org>2021-10-25 02:02:09 +0200
committerBjoern Michaelsen <bjoern.michaelsen@libreoffice.org>2021-10-29 03:00:47 +0200
commit86d11097cd4a2ae4a6b4e6b35e28a6075376d67a (patch)
tree104762ecf24daf8e4c617cc372310d642bc46929 /sw
parentcae107bab822acc198569750ae5b9a272f7ae996 (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.hxx5
-rw-r--r--sw/inc/ddefld.hxx8
-rw-r--r--sw/inc/docufld.hxx8
-rw-r--r--sw/inc/expfld.hxx7
-rw-r--r--sw/inc/fldbas.hxx1
-rw-r--r--sw/inc/reffld.hxx1
-rw-r--r--sw/source/core/doc/DocumentFieldsManager.cxx44
-rw-r--r--sw/source/core/fields/fldbas.cxx5
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"));