summaryrefslogtreecommitdiff
path: root/sw/source
diff options
context:
space:
mode:
authorMike Kaganski <mike.kaganski@collabora.com>2018-08-30 12:23:33 +0300
committerMichael Stahl <Michael.Stahl@cib.de>2018-08-31 13:05:24 +0200
commit64cb57c82d9e7f7069821b2e2ef92574ec73ebe2 (patch)
treea7eb664552a45c2786be2dfb40caa7ef8736c4f2 /sw/source
parenteb199c1b5e8d6039a1969cc6ddb3d627bedf5bd8 (diff)
tdf#118845: make HiddenPara have higher priority deciding visibility
Otherwise, a Database field in a paragraph which is non-empty would force the paragraph to be visible, regardless of HiddenPara field telling it to be hidden. Regression from commit db04be037b611e296ef9f2542322c52ed82d7a2b Change-Id: I21807e22bd339fd1ea0aaa3b382579f688903418 Reviewed-on: https://gerrit.libreoffice.org/59792 Tested-by: Jenkins Reviewed-by: Michael Stahl <Michael.Stahl@cib.de>
Diffstat (limited to 'sw/source')
-rw-r--r--sw/source/core/doc/doc.cxx18
-rw-r--r--sw/source/core/text/txtfrm.cxx17
-rw-r--r--sw/source/core/txtnode/thints.cxx24
3 files changed, 40 insertions, 19 deletions
diff --git a/sw/source/core/doc/doc.cxx b/sw/source/core/doc/doc.cxx
index c98ea37d955a..ed90bf3e2fcb 100644
--- a/sw/source/core/doc/doc.cxx
+++ b/sw/source/core/doc/doc.cxx
@@ -1358,17 +1358,20 @@ bool HandleHidingField(SwFormatField& rFormatField, const SwNodes& rNodes,
}
}
-bool SwDoc::FieldCanHidePara(SwFieldIds eFieldId) const
+// The greater the returned value, the more weight has this field type on deciding the final
+// paragraph state
+int SwDoc::FieldCanHideParaWeight(SwFieldIds eFieldId) const
{
switch (eFieldId)
{
case SwFieldIds::HiddenPara:
- return true;
+ return 20;
case SwFieldIds::Database:
- return GetDocumentSettingManager().get(
- DocumentSettingId::EMPTY_DB_FIELD_HIDES_PARA);
+ return GetDocumentSettingManager().get(DocumentSettingId::EMPTY_DB_FIELD_HIDES_PARA)
+ ? 10
+ : 0;
default:
- return false;
+ return 0;
}
}
@@ -1379,7 +1382,8 @@ bool SwDoc::FieldHidesPara(const SwField& rField) const
case SwFieldIds::HiddenPara:
return static_cast<const SwHiddenParaField&>(rField).IsHidden();
case SwFieldIds::Database:
- return FieldCanHidePara(SwFieldIds::Database) && rField.ExpandField(true).isEmpty();
+ return FieldCanHideParaWeight(SwFieldIds::Database)
+ && rField.ExpandField(true).isEmpty();
default:
return false;
}
@@ -1411,7 +1415,7 @@ bool SwDoc::RemoveInvisibleContent()
std::vector<std::unique_ptr<FieldTypeGuard>> aHidingFieldTypes;
for (SwFieldType* pType : *getIDocumentFieldsAccess().GetFieldTypes())
{
- if (FieldCanHidePara(pType->Which()))
+ if (FieldCanHideParaWeight(pType->Which()))
aHidingFieldTypes.push_back(o3tl::make_unique<FieldTypeGuard>(pType));
}
for (const auto& pTypeGuard : aHidingFieldTypes)
diff --git a/sw/source/core/text/txtfrm.cxx b/sw/source/core/text/txtfrm.cxx
index 402474391a44..6d83d3285c97 100644
--- a/sw/source/core/text/txtfrm.cxx
+++ b/sw/source/core/text/txtfrm.cxx
@@ -1045,18 +1045,25 @@ bool SwTextFrame::IsHiddenNow() const
}
sw::MergedAttrIter iter(*this);
SwTextNode const* pNode(nullptr);
+ int nNewResultWeight = 0;
for (SwTextAttr const* pHint = iter.NextAttr(&pNode); pHint; pHint = iter.NextAttr(&pNode))
{
if (pHint->Which() == RES_TXTATR_FIELD)
{
+ // see also SwpHints::CalcHiddenParaField()
const SwFormatField& rField = pHint->GetFormatField();
- if (pNode->FieldCanHidePara(rField.GetField()->GetTyp()->Which()))
+ int nCurWeight = pNode->FieldCanHideParaWeight(rField.GetField()->GetTyp()->Which());
+ if (nCurWeight > nNewResultWeight)
{
+ nNewResultWeight = nCurWeight;
+ bHiddenParaField = pNode->FieldHidesPara(*rField.GetField());
+ }
+ else if (nCurWeight == nNewResultWeight && bHiddenParaField)
+ {
+ // Currently, for both supported hiding types (HiddenPara, Database), "Don't hide"
+ // takes precedence - i.e., if there's a "Don't hide" field of that weight, we only
+ // care about fields of higher weight.
bHiddenParaField = pNode->FieldHidesPara(*rField.GetField());
- if (!bHiddenParaField)
- {
- break; // not hidden, see CalcHiddenParaField()
- }
}
}
}
diff --git a/sw/source/core/txtnode/thints.cxx b/sw/source/core/txtnode/thints.cxx
index 3e2049cf2337..cf6cade9344e 100644
--- a/sw/source/core/txtnode/thints.cxx
+++ b/sw/source/core/txtnode/thints.cxx
@@ -1156,7 +1156,7 @@ void SwTextNode::DestroyAttr( SwTextAttr* pAttr )
// certain fields must update the SwDoc's calculation flags
// Certain fields (like HiddenParaField) must trigger recalculation of visible flag
- if (FieldCanHidePara(pFieldType->Which()))
+ if (FieldCanHideParaWeight(pFieldType->Which()))
SetCalcHiddenParaField();
switch( pFieldType->Which() )
@@ -1466,7 +1466,8 @@ bool SwTextNode::InsertHint( SwTextAttr * const pAttr, const SetAttrMode nMode )
case RES_TXTATR_FIELD:
{
// trigger notification for relevant fields, like HiddenParaFields
- if (FieldCanHidePara(pAttr->GetFormatField().GetField()->GetTyp()->Which()))
+ if (FieldCanHideParaWeight(
+ pAttr->GetFormatField().GetField()->GetTyp()->Which()))
{
bHiddenPara = true;
}
@@ -2591,6 +2592,7 @@ bool SwpHints::CalcHiddenParaField() const
m_bCalcHiddenParaField = false;
const bool bOldHiddenByParaField = m_bHiddenByParaField;
bool bNewHiddenByParaField = false;
+ int nNewResultWeight = 0;
const size_t nSize = Count();
const SwTextAttr* pTextHt;
@@ -2601,12 +2603,20 @@ bool SwpHints::CalcHiddenParaField() const
if (RES_TXTATR_FIELD == nWhich)
{
+ // see also SwTextFrame::IsHiddenNow()
const SwFormatField& rField = pTextHt->GetFormatField();
- if (m_rParent.FieldCanHidePara(rField.GetField()->GetTyp()->Which())
- && !(bNewHiddenByParaField = m_rParent.FieldHidesPara(*rField.GetField())))
+ int nCurWeight = m_rParent.FieldCanHideParaWeight(rField.GetField()->GetTyp()->Which());
+ if (nCurWeight > nNewResultWeight)
{
- // If there's at least one field telling not to hide, so be it
- break;
+ nNewResultWeight = nCurWeight;
+ bNewHiddenByParaField = m_rParent.FieldHidesPara(*rField.GetField());
+ }
+ else if (nCurWeight == nNewResultWeight && bNewHiddenByParaField)
+ {
+ // Currently, for both supported hiding types (HiddenPara, Database), "Don't hide"
+ // takes precedence - i.e., if there's a "Don't hide" field of that weight, we only
+ // care about fields of higher weight.
+ bNewHiddenByParaField = m_rParent.FieldHidesPara(*rField.GetField());
}
}
}
@@ -3288,7 +3298,7 @@ void SwpHints::DeleteAtPos( const size_t nPos )
pTextField->ChgTextNode(nullptr);
}
else if (m_bHiddenByParaField
- && m_rParent.FieldCanHidePara(pFieldTyp->Which()))
+ && m_rParent.FieldCanHideParaWeight(pFieldTyp->Which()))
{
m_bCalcHiddenParaField = true;
}