Resolves: #i123480# assure sorting of subset mark containers...

before the intrinsic deletion of marks

(cherry picked from commit 93ab293354bb322a7d57b7eaf21bcd2479453e87)

Conflicts:
	sw/source/core/doc/docbm.cxx

Change-Id: I24e3b935df402f42dde135c7feda3b6e664370de
This commit is contained in:
Oliver-Rainer Wittmann
2014-01-17 07:28:17 +00:00
committed by Caolán McNamara
parent 6d320ce0d3
commit 59fd33c1f0
2 changed files with 56 additions and 21 deletions

View File

@@ -97,7 +97,9 @@ namespace
}
SAL_WNODEPRECATED_DECLARATIONS_PUSH
static inline ::std::auto_ptr<SwPosition> lcl_PositionFromCntntNode(SwCntntNode * const pCntntNode, const bool bAtEnd=false)
static inline ::std::auto_ptr<SwPosition> lcl_PositionFromCntntNode(
SwCntntNode * const pCntntNode,
const bool bAtEnd=false)
{
::std::auto_ptr<SwPosition> pResult(new SwPosition(*pCntntNode));
pResult->nContent.Assign(pCntntNode, bAtEnd ? pCntntNode->Len() : 0);
@@ -110,20 +112,30 @@ namespace
// else set it to the end of the node before rStt
// else set it to the CntntNode of the Pos outside the Range
SAL_WNODEPRECATED_DECLARATIONS_PUSH
static inline ::std::auto_ptr<SwPosition> lcl_FindExpelPosition(const SwNodeIndex& rStt,
static inline ::std::auto_ptr<SwPosition> lcl_FindExpelPosition(
const SwNodeIndex& rStt,
const SwNodeIndex& rEnd,
const SwPosition& rOtherPosition)
{
SwCntntNode * pNode = rEnd.GetNode().GetCntntNode();
SwNodeIndex aStt = SwNodeIndex(rStt);
SwNodeIndex aEnd = SwNodeIndex(rEnd);
bool bAtEnd = false;
if(!pNode)
pNode = rEnd.GetNodes().GoNext(&aEnd), bAtEnd = false;
if(!pNode)
pNode = rStt.GetNodes().GoPrevious(&aStt), bAtEnd = true;
if(pNode)
return lcl_PositionFromCntntNode(pNode, bAtEnd);
bool bPosAtEndOfNode = false;
if ( pNode == NULL)
{
SwNodeIndex aEnd = SwNodeIndex(rEnd);
pNode = rEnd.GetNodes().GoNext( &aEnd );
bPosAtEndOfNode = false;
}
if ( pNode == NULL )
{
SwNodeIndex aStt = SwNodeIndex(rStt);
pNode = rStt.GetNodes().GoPrevious(&aStt);
bPosAtEndOfNode = true;
}
if ( pNode != NULL )
{
return lcl_PositionFromCntntNode( pNode, bPosAtEndOfNode );
}
return ::std::auto_ptr<SwPosition>(new SwPosition(rOtherPosition));
}
SAL_WNODEPRECATED_DECLARATIONS_POP
@@ -635,6 +647,9 @@ namespace sw { namespace mark
::std::vector<const_iterator_t> vMarksToDelete;
bool bIsSortingNeeded = false;
// boolean indicating, if at least one mark has been moved while colleting marks for deletion
bool bMarksMoved = false;
// copy all bookmarks in the move area to a vector storing all position data as offset
// reassignment is performed after the move
for(iterator_t ppMark = m_vAllMarks.begin();
@@ -718,7 +733,8 @@ namespace sw { namespace mark
}
else
{
pNewPos = lcl_FindExpelPosition( rStt, rEnd, bIsPosInRange ? pMark->GetOtherMarkPos() : pMark->GetMarkPos() );
pNewPos =
lcl_FindExpelPosition( rStt, rEnd, bIsPosInRange ? pMark->GetOtherMarkPos() : pMark->GetMarkPos() );
}
}
@@ -747,6 +763,7 @@ namespace sw { namespace mark
pMark->SetMarkPos(*pNewPos);
else
pMark->SetOtherMarkPos(*pNewPos);
bMarksMoved = true;
// illegal selection? collapse the mark and restore sorting later
bIsSortingNeeded |= lcl_FixCorrectedMark( bIsPosInRange, bIsOtherPosInRange, pMark );
@@ -760,20 +777,32 @@ namespace sw { namespace mark
// which would invalidate the iterators in vMarksToDelete
std::vector< ::boost::shared_ptr<ILazyDeleter> > vDelay;
vDelay.reserve(vMarksToDelete.size());
// we just remembered the iterators to delete, so we do not need to
// search for the boost::shared_ptr<> (the entry in m_vAllMarks) again.
// If needed, sort mark containers containing subsets of the marks
// in order to assure sorting. The sorting is critical for the
// deletion of a mark as it is searched in these container for
// deletion.
if ( vMarksToDelete.size() > 0 && bMarksMoved )
{
sortSubsetMarks();
}
// we just remembered the iterators to delete, so we do not need to search
// for the shared_ptr<> (the entry in m_vAllMarks) again
// reverse iteration, since erasing an entry invalidates iterators
// behind it (the iterators in vMarksToDelete are sorted)
for (std::vector<const_iterator_t>::reverse_iterator pppMark
= vMarksToDelete.rbegin();
pppMark != vMarksToDelete.rend();
++pppMark)
for ( ::std::vector< const_iterator_t >::reverse_iterator pppMark = vMarksToDelete.rbegin();
pppMark != vMarksToDelete.rend();
++pppMark )
{
vDelay.push_back(deleteMark(*pppMark));
}
} // scope to kill vDelay
if(bIsSortingNeeded)
if ( bIsSortingNeeded )
{
sortMarks();
}
#if 0
OSL_TRACE("deleteMarks");
lcl_DebugMarks(m_vAllMarks);
@@ -1030,15 +1059,20 @@ namespace sw { namespace mark
return sTmp;
}
void MarkManager::sortMarks()
void MarkManager::sortSubsetMarks()
{
sort(m_vAllMarks.begin(), m_vAllMarks.end(), &lcl_MarkOrderingByStart);
sort(m_vCommonMarks.begin(), m_vCommonMarks.end(), &lcl_MarkOrderingByStart);
sort(m_vBookmarks.begin(), m_vBookmarks.end(), &lcl_MarkOrderingByStart);
sort(m_vFieldmarks.begin(), m_vFieldmarks.end(), &lcl_MarkOrderingByStart);
sort(m_vAnnotationMarks.begin(), m_vAnnotationMarks.end(), &lcl_MarkOrderingByStart);
}
void MarkManager::sortMarks()
{
sort(m_vAllMarks.begin(), m_vAllMarks.end(), &lcl_MarkOrderingByStart);
sortSubsetMarks();
}
#if OSL_DEBUG_LEVEL > 1
void MarkManager::dumpFieldmarks( ) const
{

View File

@@ -100,6 +100,7 @@ namespace sw {
// make names
OUString getUniqueMarkName(const OUString& rName) const;
void sortMarks();
void sortSubsetMarks();
// container for all marks
container_t m_vAllMarks;