Kaydet (Commit) f2d2093b authored tarafından Michael Stahl's avatar Michael Stahl

tdf#105705 sw: sort bookmarks in ContentIdxStoreImpl::RestoreBkmks()

The problem here is that the SplitNode() calls in SwRTFReader::Read()
destroy the order of the bookmarks, which causes an assert later
from the std::lower_bound() when a new mark is created.

The 2 marks that cause the problem are:
SwPosition (node 5, offset 0)
SwPosition (node 5, offset 0), SwPosition (node 5, offset 0)

During the 2 SplitNode calls, the second one is corrected by
ContentIdxStore and remains on 5, but the first one is not and
becomes:
SwPosition (node 7, offset 0)

ContentIdxStoreImpl::SaveBkmks() does different things when a
mark position is exactly on the parameter position: if it has
only one position, it is ignored, but if it has a second
position, then both its positions are corrected.

It is not possible to change the sort order so that marks with
one position are sorted behind marks with 2 positions, because
while SplitNode() corrects marks "backward", JoinNode() uses
ContentIdxStore to correct marks "forward"; hence manually sort
the marks.

Change-Id: If5b35f18bfd47ffe98c0f67e84d380ca801411a3
üst 64eac4e0
......@@ -22,6 +22,7 @@
#include <doc.hxx>
#include <IDocumentRedlineAccess.hxx>
#include <IDocumentLayoutAccess.hxx>
#include <MarkManager.hxx>
#include <docary.hxx>
#include <editsh.hxx>
#include <fmtanchr.hxx>
......@@ -265,6 +266,11 @@ void ContentIdxStoreImpl::RestoreBkmks(SwDoc* pDoc, updater_t& rUpdater)
SetRightMarkPos(pMark, aEntry.m_bOther, &aNewPos);
}
}
if (!m_aBkmkEntries.empty())
{ // tdf#105705 sort bookmarks because SaveBkmks special handling of
// "bMarkPosEqual" may destroy sort order
dynamic_cast<sw::mark::MarkManager*>(pMarkAccess)->sortMarks();
}
}
void ContentIdxStoreImpl::SaveRedlines(SwDoc* pDoc, sal_uLong nNode, sal_Int32 nContent)
......
......@@ -101,7 +101,9 @@ namespace sw {
// make names
OUString getUniqueMarkName(const OUString& rName) const;
public: // FIXME should be private, needs refactor
void sortMarks();
private:
void sortSubsetMarks();
// container for all marks
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment