[Libreoffice-commits] core.git: sw/source
Libreoffice Gerrit user
logerrit at kemper.freedesktop.org
Sun Aug 5 14:25:31 UTC 2018
sw/source/core/doc/doc.cxx | 34 ++++++++++++++++++----------------
1 file changed, 18 insertions(+), 16 deletions(-)
New commits:
commit 576fac6f6199a87fb07e4a067abaa18c89b6d7ea
Author: Mike Kaganski <mike.kaganski at collabora.com>
AuthorDate: Sun Aug 5 14:23:44 2018 +0300
Commit: Mike Kaganski <mike.kaganski at collabora.com>
CommitDate: Sun Aug 5 16:25:08 2018 +0200
tdf#118859: Avoid trying to remove already removed nodes
Regression from commit db04be037b611e296ef9f2542322c52ed82d7a2b
Change-Id: I530c00f6357b4822654add6e5f2eecb3252b88ae
Reviewed-on: https://gerrit.libreoffice.org/58612
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski at collabora.com>
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());
}
}
More information about the Libreoffice-commits
mailing list