diff options
-rw-r--r-- | sw/source/core/doc/doc.cxx | 34 |
1 files changed, 18 insertions, 16 deletions
diff --git a/sw/source/core/doc/doc.cxx b/sw/source/core/doc/doc.cxx index 74d3ab033b3a..97ac11dea077 100644 --- a/sw/source/core/doc/doc.cxx +++ b/sw/source/core/doc/doc.cxx @@ -124,6 +124,7 @@ #include <vector> #include <map> +#include <set> #include <osl/diagnose.h> #include <osl/interlck.h> #include <vbahelper/vbaaccesshelper.hxx> @@ -1341,9 +1342,8 @@ void RemoveOrDeleteContents(SwTextNode* pTextNd, IDocumentContentOperations& xOp xOperations.DelFullPara(aPam); } } -// Returns if the data was actually modified -bool HandleHidingField(SwFormatField& rFormatField, const SwNodes& rNodes, - IDocumentContentOperations& xOperations) +// Returns the node pointer which needs to hide, or nullptr if this field does not hide a node +SwTextNode* HandleHidingField(SwFormatField& rFormatField, const SwNodes& rNodes) { SwTextNode* pTextNd; if (rFormatField.GetTextField() @@ -1351,10 +1351,9 @@ bool HandleHidingField(SwFormatField& rFormatField, const SwNodes& rNodes, && pTextNd->GetpSwpHints() && pTextNd->IsHiddenByParaField() && &pTextNd->GetNodes() == &rNodes) { - RemoveOrDeleteContents(pTextNd, xOperations); - return true; + return pTextNd; } - return false; + return nullptr; } } @@ -1386,6 +1385,7 @@ bool SwDoc::FieldHidesPara(const SwField& rField) const } /// Remove the invisible content from the document e.g. hidden areas, hidden paragraphs +// Returns if the data was actually modified bool SwDoc::RemoveInvisibleContent() { bool bRet = false; @@ -1393,21 +1393,23 @@ bool SwDoc::RemoveInvisibleContent() { // Removing some nodes for one SwFieldIds::Database type might remove the type from - // document's field types, invalidating iterators. So, we need to create own list of - // matching types prior to processing them. - std::vector<const SwFieldType*> aHidingFieldTypes; + // document's field types, or try to remove already removed nodes, invalidating iterators. + // So, we need to create own list of nodes prior to removing them. + std::set<SwTextNode*> aHiddenNodes; for (const auto* pType : *getIDocumentFieldsAccess().GetFieldTypes()) { if (FieldCanHidePara(pType->Which())) - aHidingFieldTypes.push_back(pType); + { + SwIterator<SwFormatField, SwFieldType> aIter(*pType); + for (auto* pField = aIter.First(); pField; pField = aIter.Next()) + if (SwTextNode* pHiddenNode = HandleHidingField(*pField, GetNodes())) + aHiddenNodes.insert(pHiddenNode); + } } - for (const auto* pType : aHidingFieldTypes) + for (SwTextNode* pHiddenNode : aHiddenNodes) { - SwIterator<SwFormatField, SwFieldType> aIter(*pType); - for (SwFormatField* pFormatField = aIter.First(); pFormatField; - pFormatField = aIter.Next()) - bRet |= HandleHidingField(*pFormatField, GetNodes(), - getIDocumentContentOperations()); + bRet = true; + RemoveOrDeleteContents(pHiddenNode, getIDocumentContentOperations()); } } |