Kaydet (Commit) 14f124a5 authored tarafından Oliver-Rainer Wittmann's avatar Oliver-Rainer Wittmann Kaydeden (comit) Caolán McNamara

Resolves: #i124338# assure sorted mark containers...

when updating <SwIndex> instances due to inserted characters

(cherry picked from commit 770c0e6b)

Conflicts:
	sw/source/core/bastyp/index.cxx
	sw/source/core/crsr/bookmrk.cxx
	sw/source/core/doc/docbm.cxx
	sw/source/core/inc/bookmrk.hxx
	sw/source/core/inc/crossrefbookmark.hxx

Change-Id: Ie4531c3b33aff0a7f3d139ee81a21c3823474f84
üst 41bd5a3b
...@@ -194,6 +194,8 @@ class IDocumentMarkAccess ...@@ -194,6 +194,8 @@ class IDocumentMarkAccess
*/ */
virtual void clearAllMarks() =0; virtual void clearAllMarks() =0;
virtual void assureSortedMarkContainers() const = 0;
/** returns a STL-like random access iterator to the begin of the sequence of marks. /** returns a STL-like random access iterator to the begin of the sequence of marks.
*/ */
virtual const_iterator_t getAllMarksBegin() const =0; virtual const_iterator_t getAllMarksBegin() const =0;
......
...@@ -223,8 +223,11 @@ SwIndexReg::~SwIndexReg() ...@@ -223,8 +223,11 @@ SwIndexReg::~SwIndexReg()
assert(!m_pFirst && !m_pLast); // There are still indices registered assert(!m_pFirst && !m_pLast); // There are still indices registered
} }
void SwIndexReg::Update( SwIndex const & rIdx, const sal_Int32 nDiff, void SwIndexReg::Update(
const bool bNeg, const bool /* argument is only used in derived class*/ ) SwIndex const & rIdx,
const sal_Int32 nDiff,
const bool bNeg,
const bool /* argument is only used in derived class*/ )
{ {
SwIndex* pStt = const_cast<SwIndex*>(&rIdx); SwIndex* pStt = const_cast<SwIndex*>(&rIdx);
const sal_Int32 nNewVal = rIdx.m_nIndex; const sal_Int32 nNewVal = rIdx.m_nIndex;
......
...@@ -64,31 +64,32 @@ namespace ...@@ -64,31 +64,32 @@ namespace
const sal_Unicode aStartMark, const sal_Unicode aStartMark,
const sal_Unicode aEndMark) const sal_Unicode aEndMark)
{ {
SwPosition& rStart = pField->GetMarkStart(); io_pDoc->GetIDocumentUndoRedo().StartUndo(UNDO_UI_REPLACE, NULL);
SwPosition& rEnd = pField->GetMarkEnd();
SwTxtNode const*const pStartTxtNode = SwPosition rStart = pField->GetMarkStart();
rStart.nNode.GetNode().GetTxtNode(); SwTxtNode const*const pStartTxtNode = rStart.nNode.GetNode().GetTxtNode();
SwTxtNode const*const pEndTxtNode = rEnd.nNode.GetNode().GetTxtNode();
const sal_Unicode ch_start = ( rStart.nContent.GetIndex() >= pStartTxtNode->GetTxt().getLength() ) ? 0 : const sal_Unicode ch_start = ( rStart.nContent.GetIndex() >= pStartTxtNode->GetTxt().getLength() ) ? 0 :
pStartTxtNode->GetTxt()[rStart.nContent.GetIndex()]; pStartTxtNode->GetTxt()[rStart.nContent.GetIndex()];
const sal_Int32 nEndPos = ( rEnd == rStart || rEnd.nContent.GetIndex() == 0 ) ?
rEnd.nContent.GetIndex() : rEnd.nContent.GetIndex() - 1;
const sal_Unicode ch_end = nEndPos >= pEndTxtNode->GetTxt().getLength() ? 0 : pEndTxtNode->GetTxt()[nEndPos];
SwPaM aStartPaM(rStart);
SwPaM aEndPaM(rEnd);
io_pDoc->GetIDocumentUndoRedo().StartUndo(UNDO_UI_REPLACE, NULL);
if( ( ch_start != aStartMark ) && ( aEndMark != CH_TXT_ATR_FORMELEMENT ) ) if( ( ch_start != aStartMark ) && ( aEndMark != CH_TXT_ATR_FORMELEMENT ) )
{ {
SwPaM aStartPaM(rStart);
io_pDoc->InsertString(aStartPaM, OUString(aStartMark)); io_pDoc->InsertString(aStartPaM, OUString(aStartMark));
rStart.nContent--; rStart.nContent--;
pField->SetMarkStartPos( rStart );
} }
SwPosition& rEnd = pField->GetMarkEnd();
SwTxtNode const*const pEndTxtNode = rEnd.nNode.GetNode().GetTxtNode();
const sal_Int32 nEndPos = ( rEnd == rStart || rEnd.nContent.GetIndex() == 0 ) ?
rEnd.nContent.GetIndex() : rEnd.nContent.GetIndex() - 1;
const sal_Unicode ch_end = nEndPos >= pEndTxtNode->GetTxt().getLength() ? 0 : pEndTxtNode->GetTxt()[nEndPos];
if ( aEndMark && ( ch_end != aEndMark ) ) if ( aEndMark && ( ch_end != aEndMark ) )
{ {
SwPaM aEndPaM(rEnd);
io_pDoc->InsertString(aEndPaM, OUString(aEndMark)); io_pDoc->InsertString(aEndPaM, OUString(aEndMark));
rEnd.nContent++; rEnd.nContent++;
} }
io_pDoc->GetIDocumentUndoRedo().EndUndo(UNDO_UI_REPLACE, NULL); io_pDoc->GetIDocumentUndoRedo().EndUndo(UNDO_UI_REPLACE, NULL);
}; };
...@@ -97,31 +98,33 @@ namespace ...@@ -97,31 +98,33 @@ namespace
const sal_Unicode aStartMark, const sal_Unicode aStartMark,
const sal_Unicode aEndMark) const sal_Unicode aEndMark)
{ {
SwPosition& rStart = pField->GetMarkStart(); io_pDoc->GetIDocumentUndoRedo().StartUndo(UNDO_UI_REPLACE, NULL);
SwPosition& rEnd = pField->GetMarkEnd();
SwTxtNode const*const pStartTxtNode = const SwPosition& rStart = pField->GetMarkStart();
rStart.nNode.GetNode().GetTxtNode(); SwTxtNode const*const pStartTxtNode = rStart.nNode.GetNode().GetTxtNode();
SwTxtNode const*const pEndTxtNode = rEnd.nNode.GetNode().GetTxtNode();
const sal_Unicode ch_start = const sal_Unicode ch_start =
pStartTxtNode->GetTxt()[rStart.nContent.GetIndex()]; pStartTxtNode->GetTxt()[rStart.nContent.GetIndex()];
const sal_Int32 nEndPos = ( rEnd == rStart || rEnd.nContent.GetIndex() == 0 ) ?
rEnd.nContent.GetIndex() : rEnd.nContent.GetIndex() - 1;
const sal_Unicode ch_end = pEndTxtNode->GetTxt()[nEndPos];
SwPaM aStartPaM(rStart);
SwPaM aEndPaM(rEnd);
io_pDoc->GetIDocumentUndoRedo().StartUndo(UNDO_UI_REPLACE, NULL);
if( ch_start == aStartMark ) if( ch_start == aStartMark )
{ {
SwPaM aStart(rStart, rStart); SwPaM aStart(rStart, rStart);
aStart.End()->nContent++; aStart.End()->nContent++;
io_pDoc->DeleteRange(aStart); io_pDoc->DeleteRange(aStart);
} }
const SwPosition& rEnd = pField->GetMarkEnd();
SwTxtNode const*const pEndTxtNode = rEnd.nNode.GetNode().GetTxtNode();
const sal_Int32 nEndPos = ( rEnd == rStart || rEnd.nContent.GetIndex() == 0 )
? rEnd.nContent.GetIndex()
: rEnd.nContent.GetIndex() - 1;
const sal_Unicode ch_end = pEndTxtNode->GetTxt()[nEndPos];
if ( ch_end == aEndMark ) if ( ch_end == aEndMark )
{ {
SwPaM aEnd(rEnd, rEnd); SwPaM aEnd(rEnd, rEnd);
aEnd.Start()->nContent--; aEnd.Start()->nContent--;
io_pDoc->DeleteRange(aEnd); io_pDoc->DeleteRange(aEnd);
} }
io_pDoc->GetIDocumentUndoRedo().EndUndo(UNDO_UI_REPLACE, NULL); io_pDoc->GetIDocumentUndoRedo().EndUndo(UNDO_UI_REPLACE, NULL);
}; };
} }
...@@ -308,6 +311,22 @@ namespace sw { namespace mark ...@@ -308,6 +311,22 @@ namespace sw { namespace mark
SetOtherMarkPos(GetMarkPos()); SetOtherMarkPos(GetMarkPos());
} }
void Fieldmark::SetMarkStartPos( const SwPosition& rNewStartPos )
{
if ( GetMarkPos( ) <= GetOtherMarkPos( ) )
return SetMarkPos( rNewStartPos );
else
return SetOtherMarkPos( rNewStartPos );
}
void Fieldmark::SetMarkEndPos( const SwPosition& rNewEndPos )
{
if ( GetMarkPos( ) <= GetOtherMarkPos( ) )
return SetOtherMarkPos( rNewEndPos );
else
return SetMarkPos( rNewEndPos );
}
OUString Fieldmark::ToString( ) const OUString Fieldmark::ToString( ) const
{ {
return "Fieldmark: ( Name, Type, [ Nd1, Id1 ], [ Nd2, Id2 ] ): ( " + m_aName + ", " return "Fieldmark: ( Name, Type, [ Nd1, Id1 ], [ Nd2, Id2 ] ): ( " + m_aName + ", "
...@@ -349,7 +368,9 @@ namespace sw { namespace mark ...@@ -349,7 +368,9 @@ namespace sw { namespace mark
// For some reason the end mark is moved from 1 by the Insert: we don't // For some reason the end mark is moved from 1 by the Insert: we don't
// want this for checkboxes // want this for checkboxes
this->GetMarkEnd( ).nContent--; SwPosition aNewEndPos = this->GetMarkEnd();
aNewEndPos.nContent--;
SetMarkEndPos( aNewEndPos );
} }
void CheckboxFieldmark::ReleaseDoc(SwDoc* const pDoc) void CheckboxFieldmark::ReleaseDoc(SwDoc* const pDoc)
......
...@@ -828,40 +828,67 @@ namespace sw { namespace mark ...@@ -828,40 +828,67 @@ namespace sw { namespace mark
case IDocumentMarkAccess::BOOKMARK: case IDocumentMarkAccess::BOOKMARK:
case IDocumentMarkAccess::CROSSREF_HEADING_BOOKMARK: case IDocumentMarkAccess::CROSSREF_HEADING_BOOKMARK:
case IDocumentMarkAccess::CROSSREF_NUMITEM_BOOKMARK: case IDocumentMarkAccess::CROSSREF_NUMITEM_BOOKMARK:
// if(dynamic_cast<IBookmark*>)
{ {
IDocumentMarkAccess::iterator_t ppBookmark = lcl_FindMark(m_vBookmarks, *ppMark); IDocumentMarkAccess::iterator_t ppBookmark = lcl_FindMark(m_vBookmarks, *ppMark);
OSL_ENSURE(ppBookmark != m_vBookmarks.end(), if ( ppBookmark != m_vBookmarks.end() )
"<MarkManager::deleteMark(..)>" {
" - Bookmark not found.");
m_vBookmarks.erase(ppBookmark); m_vBookmarks.erase(ppBookmark);
}
else
{
OSL_ENSURE( false, "<MarkManager::deleteMark(..)> - Bookmark not found in Bookmark container.");
}
ppBookmark = lcl_FindMark(m_vCommonMarks, *ppMark); ppBookmark = lcl_FindMark(m_vCommonMarks, *ppMark);
if ( ppBookmark != m_vCommonMarks.end() )
{
m_vCommonMarks.erase(ppBookmark); m_vCommonMarks.erase(ppBookmark);
} }
else
{
OSL_ENSURE( false, "<MarkManager::deleteMark(..)> - Bookmark not found in common mark container.");
}
}
break; break;
case IDocumentMarkAccess::TEXT_FIELDMARK: case IDocumentMarkAccess::TEXT_FIELDMARK:
case IDocumentMarkAccess::CHECKBOX_FIELDMARK: case IDocumentMarkAccess::CHECKBOX_FIELDMARK:
{ {
IDocumentMarkAccess::iterator_t ppFieldmark = lcl_FindMark(m_vFieldmarks, *ppMark); IDocumentMarkAccess::iterator_t ppFieldmark = lcl_FindMark(m_vFieldmarks, *ppMark);
OSL_ENSURE(ppFieldmark != m_vFieldmarks.end(), if ( ppFieldmark != m_vFieldmarks.end() )
"<MarkManager::deleteMark(..)>" {
" - Bookmark not found.");
m_vFieldmarks.erase(ppFieldmark); m_vFieldmarks.erase(ppFieldmark);
ret.reset(new LazyFieldmarkDeleter(*ppMark, m_pDoc)); ret.reset(new LazyFieldmarkDeleter(*ppMark, m_pDoc));
}
else
{
OSL_ENSURE( false, "<MarkManager::deleteMark(..)> - Fieldmark not found in Fieldmark container.");
}
ppFieldmark = lcl_FindMark(m_vCommonMarks, *ppMark); ppFieldmark = lcl_FindMark(m_vCommonMarks, *ppMark);
if ( ppFieldmark != m_vCommonMarks.end() )
{
m_vCommonMarks.erase(ppFieldmark); m_vCommonMarks.erase(ppFieldmark);
} }
else
{
OSL_ENSURE( false, "<MarkManager::deleteMark(..)> - Fieldmark not found in common mark container.");
}
}
break; break;
case IDocumentMarkAccess::ANNOTATIONMARK: case IDocumentMarkAccess::ANNOTATIONMARK:
{ {
IDocumentMarkAccess::iterator_t ppAnnotationMark = lcl_FindMark(m_vAnnotationMarks, *ppMark); IDocumentMarkAccess::iterator_t ppAnnotationMark = lcl_FindMark(m_vAnnotationMarks, *ppMark);
OSL_ENSURE( ppAnnotationMark != m_vAnnotationMarks.end(), "<MarkManager::deleteMark(..)> - Annotation Mark not found." ); if ( ppAnnotationMark != m_vAnnotationMarks.end() )
{
m_vAnnotationMarks.erase(ppAnnotationMark); m_vAnnotationMarks.erase(ppAnnotationMark);
} }
else
{
OSL_ENSURE( false, "<MarkManager::deleteMark(..)> - Annotation Mark not found in Annotation Mark container.");
}
}
break; break;
case IDocumentMarkAccess::NAVIGATOR_REMINDER: case IDocumentMarkAccess::NAVIGATOR_REMINDER:
...@@ -869,8 +896,15 @@ namespace sw { namespace mark ...@@ -869,8 +896,15 @@ namespace sw { namespace mark
case IDocumentMarkAccess::UNO_BOOKMARK: case IDocumentMarkAccess::UNO_BOOKMARK:
{ {
IDocumentMarkAccess::iterator_t ppOtherMark = lcl_FindMark(m_vCommonMarks, *ppMark); IDocumentMarkAccess::iterator_t ppOtherMark = lcl_FindMark(m_vCommonMarks, *ppMark);
if ( ppOtherMark != m_vCommonMarks.end() )
{
m_vCommonMarks.erase(ppOtherMark); m_vCommonMarks.erase(ppOtherMark);
} }
else
{
OSL_ENSURE( false, "<MarkManager::deleteMark(..)> - Navigator Reminder, DDE Mark or Uno Makr not found in common mark container.");
}
}
break; break;
} }
DdeBookmark* const pDdeBookmark = dynamic_cast<DdeBookmark*>(ppMark->get()); DdeBookmark* const pDdeBookmark = dynamic_cast<DdeBookmark*>(ppMark->get());
...@@ -1052,6 +1086,11 @@ namespace sw { namespace mark ...@@ -1052,6 +1086,11 @@ namespace sw { namespace mark
return sTmp; return sTmp;
} }
void MarkManager::assureSortedMarkContainers() const
{
const_cast< MarkManager* >(this)->sortMarks();
}
void MarkManager::sortSubsetMarks() void MarkManager::sortSubsetMarks()
{ {
sort(m_vCommonMarks.begin(), m_vCommonMarks.end(), &lcl_MarkOrderingByStart); sort(m_vCommonMarks.begin(), m_vCommonMarks.end(), &lcl_MarkOrderingByStart);
......
...@@ -95,6 +95,8 @@ namespace sw { ...@@ -95,6 +95,8 @@ namespace sw {
virtual sal_Int32 getAnnotationMarksCount() const; virtual sal_Int32 getAnnotationMarksCount() const;
virtual const_iterator_t findAnnotationMark( const ::rtl::OUString& rName ) const; virtual const_iterator_t findAnnotationMark( const ::rtl::OUString& rName ) const;
virtual void assureSortedMarkContainers() const;
private: private:
// make names // make names
OUString getUniqueMarkName(const OUString& rName) const; OUString getUniqueMarkName(const OUString& rName) const;
......
...@@ -47,6 +47,7 @@ namespace sw { ...@@ -47,6 +47,7 @@ namespace sw {
: virtual public IMark : virtual public IMark
{ {
public: public:
//getters
virtual SwPosition& GetMarkPos() const virtual SwPosition& GetMarkPos() const
{ return *m_pPos1; } { return *m_pPos1; }
virtual const OUString& GetName() const virtual const OUString& GetName() const
...@@ -215,6 +216,9 @@ namespace sw { ...@@ -215,6 +216,9 @@ namespace sw {
virtual void ReleaseDoc(SwDoc* const) = 0; virtual void ReleaseDoc(SwDoc* const) = 0;
void SetMarkStartPos( const SwPosition& rNewStartPos );
void SetMarkEndPos( const SwPosition& rNewEndPos );
virtual void Invalidate(); virtual void Invalidate();
virtual OUString ToString() const; virtual OUString ToString() const;
......
...@@ -36,6 +36,7 @@ namespace sw { ...@@ -36,6 +36,7 @@ namespace sw {
const OUString& rShortName, const OUString& rShortName,
const OUString& rPrefix); const OUString& rPrefix);
// getters
virtual SwPosition& GetOtherMarkPos() const; virtual SwPosition& GetOtherMarkPos() const;
virtual SwPosition& GetMarkStart() const virtual SwPosition& GetMarkStart() const
{ return *m_pPos1; } { return *m_pPos1; }
......
...@@ -1014,6 +1014,7 @@ void SwTxtNode::Update( ...@@ -1014,6 +1014,7 @@ void SwTxtNode::Update(
} }
} }
bool bSortMarks = false;
SwIndexReg aTmpIdxReg; SwIndexReg aTmpIdxReg;
if ( !bNegative && !bDelete ) if ( !bNegative && !bDelete )
{ {
...@@ -1072,6 +1073,7 @@ void SwTxtNode::Update( ...@@ -1072,6 +1073,7 @@ void SwTxtNode::Update(
rPos.GetIndex() == rIdx.GetIndex() ) rPos.GetIndex() == rIdx.GetIndex() )
{ {
rIdx.Assign( &aTmpIdxReg, rIdx.GetIndex() ); rIdx.Assign( &aTmpIdxReg, rIdx.GetIndex() );
bSortMarks = true;
} }
} }
} }
...@@ -1090,6 +1092,10 @@ void SwTxtNode::Update( ...@@ -1090,6 +1092,10 @@ void SwTxtNode::Update(
} }
aTmpIdxReg.MoveTo( *this ); aTmpIdxReg.MoveTo( *this );
if ( bSortMarks )
{
getIDocumentMarkAccess()->assureSortedMarkContainers();
}
} }
void SwTxtNode::_ChgTxtCollUpdateNum( const SwTxtFmtColl *pOldColl, void SwTxtNode::_ChgTxtCollUpdateNum( const SwTxtFmtColl *pOldColl,
......
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