summaryrefslogtreecommitdiff
path: root/sw/source/core/txtnode/thints.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/core/txtnode/thints.cxx')
-rw-r--r--sw/source/core/txtnode/thints.cxx65
1 files changed, 32 insertions, 33 deletions
diff --git a/sw/source/core/txtnode/thints.cxx b/sw/source/core/txtnode/thints.cxx
index 2db0657c3fe1..32bb7841f9cd 100644
--- a/sw/source/core/txtnode/thints.cxx
+++ b/sw/source/core/txtnode/thints.cxx
@@ -19,6 +19,7 @@
#include <sal/config.h>
+#include <DocumentSettingManager.hxx>
#include <hintids.hxx>
#include <editeng/xmlcnitm.hxx>
#include <editeng/rsiditem.hxx>
@@ -89,11 +90,12 @@
using namespace ::com::sun::star::i18n;
-SwpHints::SwpHints()
- : m_pHistory(nullptr)
+SwpHints::SwpHints(const SwTextNode& rParent)
+ : m_rParent(rParent)
+ , m_pHistory(nullptr)
, m_bInSplitNode(false)
, m_bCalcHiddenParaField(false)
- , m_bHasHiddenParaField(false)
+ , m_bHiddenByParaField(false)
, m_bFootnote(false)
, m_bDDEFields(false)
{
@@ -1144,19 +1146,21 @@ void SwTextNode::DestroyAttr( SwTextAttr* pAttr )
if( !pDoc->IsInDtor() )
{
SwTextField *const pTextField(static_txtattr_cast<SwTextField*>(pAttr));
- const SwField* pField = pAttr->GetFormatField().GetField();
+ SwFieldType* pFieldType = pAttr->GetFormatField().GetField()->GetTyp();
//JP 06-08-95: DDE-fields are an exception
- assert(SwFieldIds::Dde == pField->GetTyp()->Which() ||
+ assert(SwFieldIds::Dde == pFieldType->Which() ||
this == pTextField->GetpTextNode());
// certain fields must update the SwDoc's calculation flags
- switch( pField->GetTyp()->Which() )
+
+ // Certain fields (like HiddenParaField) must trigger recalculation of visible flag
+ if (FieldCanHidePara(pFieldType->Which()))
+ SetCalcHiddenParaField();
+
+ switch( pFieldType->Which() )
{
case SwFieldIds::HiddenPara:
- // HiddenParaField must trigger recalculation of visible flag
- SetCalcHiddenParaField();
- SAL_FALLTHROUGH;
case SwFieldIds::DbSetNumber:
case SwFieldIds::GetExp:
case SwFieldIds::Database:
@@ -1169,7 +1173,7 @@ void SwTextNode::DestroyAttr( SwTextAttr* pAttr )
break;
case SwFieldIds::Dde:
if (GetNodes().IsDocNodes() && pTextField->GetpTextNode())
- static_cast<SwDDEFieldType*>(pField->GetTyp())->DecRefCnt();
+ static_cast<SwDDEFieldType*>(pFieldType)->DecRefCnt();
break;
case SwFieldIds::Postit:
{
@@ -1460,8 +1464,8 @@ bool SwTextNode::InsertHint( SwTextAttr * const pAttr, const SetAttrMode nMode )
case RES_TXTATR_FIELD:
{
- // trigger notification for HiddenParaFields
- if( SwFieldIds::HiddenPara == pAttr->GetFormatField().GetField()->GetTyp()->Which() )
+ // trigger notification for relevant fields, like HiddenParaFields
+ if (FieldCanHidePara(pAttr->GetFormatField().GetField()->GetTyp()->Which()))
{
bHiddenPara = true;
}
@@ -2581,38 +2585,32 @@ void SwpHints::CalcFlags()
}
}
-bool SwpHints::CalcHiddenParaField()
+bool SwpHints::CalcHiddenParaField() const
{
m_bCalcHiddenParaField = false;
- bool bOldHasHiddenParaField = m_bHasHiddenParaField;
- bool bNewHasHiddenParaField = false;
+ const bool bOldHiddenByParaField = m_bHiddenByParaField;
+ bool bNewHiddenByParaField = false;
const size_t nSize = Count();
- const SwTextAttr *pTextHt;
+ const SwTextAttr* pTextHt;
- for( size_t nPos = 0; nPos < nSize; ++nPos )
+ for (size_t nPos = 0; nPos < nSize; ++nPos)
{
pTextHt = Get(nPos);
const sal_uInt16 nWhich = pTextHt->Which();
- if( RES_TXTATR_FIELD == nWhich )
+ if (RES_TXTATR_FIELD == nWhich)
{
const SwFormatField& rField = pTextHt->GetFormatField();
- if( SwFieldIds::HiddenPara == rField.GetField()->GetTyp()->Which() )
+ if (m_rParent.FieldCanHidePara(rField.GetField()->GetTyp()->Which())
+ && !(bNewHiddenByParaField = m_rParent.FieldHidesPara(*rField.GetField())))
{
- if( !static_cast<const SwHiddenParaField*>(rField.GetField())->IsHidden() )
- {
- SetHiddenParaField(false);
- return bOldHasHiddenParaField != bNewHasHiddenParaField;
- }
- else
- {
- bNewHasHiddenParaField = true;
- }
+ // If there's at least one field telling not to hide, so be it
+ break;
}
}
}
- SetHiddenParaField( bNewHasHiddenParaField );
- return bOldHasHiddenParaField != bNewHasHiddenParaField;
+ SetHiddenByParaField(bNewHiddenByParaField);
+ return bOldHiddenByParaField != bNewHiddenByParaField;
}
void SwpHints::NoteInHistory( SwTextAttr *pAttr, const bool bNew )
@@ -3280,7 +3278,8 @@ void SwpHints::DeleteAtPos( const size_t nPos )
if( pHint->Which() == RES_TXTATR_FIELD )
{
SwTextField *const pTextField(static_txtattr_cast<SwTextField*>(pHint));
- const SwFieldType* pFieldTyp = pTextField->GetFormatField().GetField()->GetTyp();
+ const SwField* pField = pTextField->GetFormatField().GetField();
+ const SwFieldType* pFieldTyp = pField->GetTyp();
if( SwFieldIds::Dde == pFieldTyp->Which() )
{
const SwTextNode* pNd = pTextField->GetpTextNode();
@@ -3288,8 +3287,8 @@ void SwpHints::DeleteAtPos( const size_t nPos )
const_cast<SwDDEFieldType*>(static_cast<const SwDDEFieldType*>(pFieldTyp))->DecRefCnt();
pTextField->ChgTextNode(nullptr);
}
- else if ( m_bHasHiddenParaField &&
- SwFieldIds::HiddenPara == pFieldTyp->Which() )
+ else if (m_bHiddenByParaField
+ && m_rParent.FieldCanHidePara(pField->GetTyp()->Which()))
{
m_bCalcHiddenParaField = true;
}