diff options
-rw-r--r-- | sw/inc/IDocumentMarkAccess.hxx | 2 | ||||
-rw-r--r-- | sw/inc/ndtxt.hxx | 2 | ||||
-rw-r--r-- | sw/source/core/bastyp/index.cxx | 12 | ||||
-rw-r--r-- | sw/source/core/crsr/bookmrk.cxx | 62 | ||||
-rw-r--r-- | sw/source/core/crsr/crossrefbookmark.cxx | 2 | ||||
-rw-r--r-- | sw/source/core/doc/docbm.cxx | 68 | ||||
-rw-r--r-- | sw/source/core/inc/MarkManager.hxx | 2 | ||||
-rw-r--r-- | sw/source/core/inc/bookmrk.hxx | 11 | ||||
-rw-r--r-- | sw/source/core/inc/crossrefbookmark.hxx | 6 | ||||
-rw-r--r-- | sw/source/core/txtnode/ndtxt.cxx | 6 |
10 files changed, 124 insertions, 49 deletions
diff --git a/sw/inc/IDocumentMarkAccess.hxx b/sw/inc/IDocumentMarkAccess.hxx index 7cde48a2a28d..005799982626 100644 --- a/sw/inc/IDocumentMarkAccess.hxx +++ b/sw/inc/IDocumentMarkAccess.hxx @@ -193,6 +193,8 @@ class IDocumentMarkAccess */ virtual void clearAllMarks() =0; + virtual void assureSortedMarkContainers() const = 0; + /** returns a STL-like random access iterator to the begin of the sequence of marks. */ virtual const_iterator_t getAllMarksBegin() const =0; diff --git a/sw/inc/ndtxt.hxx b/sw/inc/ndtxt.hxx index 4a60daa577d4..7cfcc56f7b3a 100644 --- a/sw/inc/ndtxt.hxx +++ b/sw/inc/ndtxt.hxx @@ -794,9 +794,7 @@ public: bool IsNotifiable() const; void SetListRestart( bool bRestart ); - // --> OD 2005-11-02 #i51089 - TUNING# bool IsListRestart() const; - // <-- void SetAttrListRestartValue( SwNumberTree::tSwNumTreeNumber nNum ); bool HasAttrListRestartValue() const; diff --git a/sw/source/core/bastyp/index.cxx b/sw/source/core/bastyp/index.cxx index 63cc8be6b43a..7e658b951840 100644 --- a/sw/source/core/bastyp/index.cxx +++ b/sw/source/core/bastyp/index.cxx @@ -357,15 +357,17 @@ SwIndexReg::~SwIndexReg() } - -void SwIndexReg::Update( SwIndex const & rIdx, const xub_StrLen nDiff, - const bool bNeg, const bool /* argument is only used in derived class*/ ) +void SwIndexReg::Update( + SwIndex const & rIdx, + const xub_StrLen nDiff, + const bool bNeg, + const bool /* argument is only used in derived class*/ ) { SwIndex* pStt = const_cast<SwIndex*>(&rIdx); - xub_StrLen nNewVal = rIdx.nIndex; + const xub_StrLen nNewVal = rIdx.nIndex; if( bNeg ) { - xub_StrLen nLast = rIdx.GetIndex() + nDiff; + const xub_StrLen nLast = rIdx.GetIndex() + nDiff; while( pStt && pStt->nIndex == nNewVal ) { pStt->nIndex = nNewVal; diff --git a/sw/source/core/crsr/bookmrk.cxx b/sw/source/core/crsr/bookmrk.cxx index 55a483cc945b..42669ca41ac0 100644 --- a/sw/source/core/crsr/bookmrk.cxx +++ b/sw/source/core/crsr/bookmrk.cxx @@ -74,25 +74,29 @@ namespace const sal_Unicode aStartMark, const sal_Unicode aEndMark) { - SwPosition& rStart = pField->GetMarkStart(); - SwPosition& rEnd = pField->GetMarkEnd(); - SwTxtNode const*const pStartTxtNode = - rStart.nNode.GetNode().GetTxtNode(); - SwTxtNode const*const pEndTxtNode = rEnd.nNode.GetNode().GetTxtNode(); - const sal_Unicode ch_start=pStartTxtNode->GetTxt().GetChar(rStart.nContent.GetIndex()); - const sal_Unicode ch_end=pEndTxtNode->GetTxt().GetChar(rEnd.nContent.GetIndex()-1); - SwPaM aStartPaM(rStart); - SwPaM aEndPaM(rEnd); io_pDoc->GetIDocumentUndoRedo().StartUndo(UNDO_UI_REPLACE, NULL); + + SwPosition rStart = pField->GetMarkStart(); + SwTxtNode const*const pStartTxtNode = rStart.nNode.GetNode().GetTxtNode(); + const sal_Unicode ch_start=pStartTxtNode->GetTxt().GetChar(rStart.nContent.GetIndex()); if(ch_start != aStartMark) { + SwPaM aStartPaM(rStart); io_pDoc->InsertString(aStartPaM, aStartMark); rStart.nContent--; + pField->SetMarkStartPos( rStart ); } + + const SwPosition& rEnd = pField->GetMarkEnd(); + SwTxtNode const*const pEndTxtNode = rEnd.nNode.GetNode().GetTxtNode(); + const sal_Unicode ch_end=pEndTxtNode->GetTxt().GetChar(rEnd.nContent.GetIndex()-1); if ( aEndMark && ( ch_end != aEndMark ) && ( rStart != rEnd ) ) { + SwPaM aEndPaM(rEnd); io_pDoc->InsertString(aEndPaM, aEndMark); } + + io_pDoc->GetIDocumentUndoRedo().EndUndo(UNDO_UI_REPLACE, NULL); }; @@ -101,29 +105,31 @@ namespace const sal_Unicode aStartMark, const sal_Unicode aEndMark) { - SwPosition& rStart = pField->GetMarkStart(); - SwPosition& rEnd = pField->GetMarkEnd(); + io_pDoc->GetIDocumentUndoRedo().StartUndo(UNDO_UI_REPLACE, NULL); + + const SwPosition& rStart = pField->GetMarkStart(); SwTxtNode const*const pStartTxtNode = rStart.nNode.GetNode().GetTxtNode(); - SwTxtNode const*const pEndTxtNode = rEnd.nNode.GetNode().GetTxtNode(); const sal_Unicode ch_start=pStartTxtNode->GetTxt().GetChar(rStart.nContent.GetIndex()); - xub_StrLen nEndPos = ( rEnd == rStart || rEnd.nContent.GetIndex() == 0 ) ? - rEnd.nContent.GetIndex() : rEnd.nContent.GetIndex() - 1; - const sal_Unicode ch_end=pEndTxtNode->GetTxt().GetChar( nEndPos ); - SwPaM aStartPaM(rStart); - SwPaM aEndPaM(rEnd); - io_pDoc->GetIDocumentUndoRedo().StartUndo(UNDO_UI_REPLACE, NULL); if( ch_start == aStartMark ) { SwPaM aStart(rStart, rStart); aStart.End()->nContent++; io_pDoc->DeleteRange(aStart); } + + const SwPosition& rEnd = pField->GetMarkEnd(); + SwTxtNode const*const pEndTxtNode = rEnd.nNode.GetNode().GetTxtNode(); + const xub_StrLen nEndPos = ( rEnd == rStart || rEnd.nContent.GetIndex() == 0 ) + ? rEnd.nContent.GetIndex() + : rEnd.nContent.GetIndex() - 1; + const sal_Unicode ch_end=pEndTxtNode->GetTxt().GetChar( nEndPos ); if ( ch_end == aEndMark ) { SwPaM aEnd(rEnd, rEnd); aEnd.Start()->nContent--; io_pDoc->DeleteRange(aEnd); } + io_pDoc->GetIDocumentUndoRedo().EndUndo(UNDO_UI_REPLACE, NULL); }; } @@ -315,6 +321,22 @@ namespace sw { namespace mark 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 ); + } + rtl::OUString Fieldmark::ToString( ) const { rtl::OUStringBuffer buf; @@ -363,7 +385,9 @@ namespace sw { namespace mark // For some reason the end mark is moved from 1 by the Insert: we don't // want this for checkboxes - this->GetMarkEnd( ).nContent--; + SwPosition aNewEndPos = this->GetMarkEnd(); + aNewEndPos.nContent--; + SetMarkEndPos( aNewEndPos ); } void CheckboxFieldmark::SetChecked(bool checked) { diff --git a/sw/source/core/crsr/crossrefbookmark.cxx b/sw/source/core/crsr/crossrefbookmark.cxx index f0be0825f8b5..0951f9b1409b 100644 --- a/sw/source/core/crsr/crossrefbookmark.cxx +++ b/sw/source/core/crsr/crossrefbookmark.cxx @@ -58,7 +58,7 @@ namespace sw { namespace mark MarkBase::SetMarkPos(rNewPos); } - SwPosition& CrossRefBookmark::GetOtherMarkPos() const + const SwPosition& CrossRefBookmark::GetOtherMarkPos() const { OSL_PRECOND(false, "<SwCrossRefBookmark::GetOtherMarkPos(..)>" diff --git a/sw/source/core/doc/docbm.cxx b/sw/source/core/doc/docbm.cxx index 820108855132..792e2c540a6b 100644 --- a/sw/source/core/doc/docbm.cxx +++ b/sw/source/core/doc/docbm.cxx @@ -820,28 +820,41 @@ namespace sw { namespace mark case IDocumentMarkAccess::BOOKMARK: case IDocumentMarkAccess::CROSSREF_HEADING_BOOKMARK: case IDocumentMarkAccess::CROSSREF_NUMITEM_BOOKMARK: - // if(dynamic_cast<IBookmark*>) { IDocumentMarkAccess::iterator_t ppBookmark = lcl_FindMark(m_vBookmarks, *ppMark); - OSL_ENSURE(ppBookmark != m_vBookmarks.end(), - "<MarkManager::deleteMark(..)>" - " - Bookmark not found."); - m_vBookmarks.erase(ppBookmark); + if ( ppBookmark != m_vBookmarks.end() ) + { + m_vBookmarks.erase(ppBookmark); + } + else + { + OSL_ENSURE( false, "<MarkManager::deleteMark(..)> - Bookmark not found in Bookmark container."); + } ppBookmark = lcl_FindMark(m_vCommonMarks, *ppMark); - m_vCommonMarks.erase(ppBookmark); + if ( ppBookmark != m_vCommonMarks.end() ) + { + m_vCommonMarks.erase(ppBookmark); + } + else + { + OSL_ENSURE( false, "<MarkManager::deleteMark(..)> - Bookmark not found in common mark container."); + } } break; case IDocumentMarkAccess::TEXT_FIELDMARK: case IDocumentMarkAccess::CHECKBOX_FIELDMARK: - // if(dynamic_cast<IFieldmark*> { IDocumentMarkAccess::iterator_t ppFieldmark = lcl_FindMark(m_vFieldmarks, *ppMark); - OSL_ENSURE(ppFieldmark != m_vFieldmarks.end(), - "<MarkManager::deleteMark(..)>" - " - Bookmark not found."); - m_vFieldmarks.erase(ppFieldmark); + if ( ppFieldmark != m_vFieldmarks.end() ) + { + m_vFieldmarks.erase(ppFieldmark); + } + else + { + OSL_ENSURE( false, "<MarkManager::deleteMark(..)> - Fieldmark not found in Fieldmark container."); + } sw::mark::TextFieldmark* pTextFieldmark = dynamic_cast<sw::mark::TextFieldmark*>(ppMark->get()); if ( pTextFieldmark ) @@ -850,15 +863,28 @@ namespace sw { namespace mark } ppFieldmark = lcl_FindMark(m_vCommonMarks, *ppMark); - m_vCommonMarks.erase(ppFieldmark); + if ( ppFieldmark != m_vCommonMarks.end() ) + { + m_vCommonMarks.erase(ppFieldmark); + } + else + { + OSL_ENSURE( false, "<MarkManager::deleteMark(..)> - Fieldmark not found in common mark container."); + } } break; case IDocumentMarkAccess::ANNOTATIONMARK: { IDocumentMarkAccess::iterator_t ppAnnotationMark = lcl_FindMark(m_vAnnotationMarks, *ppMark); - OSL_ENSURE( ppAnnotationMark != m_vAnnotationMarks.end(), "<MarkManager::deleteMark(..)> - Annotation Mark not found." ); - m_vAnnotationMarks.erase(ppAnnotationMark); + if ( ppAnnotationMark != m_vAnnotationMarks.end() ) + { + m_vAnnotationMarks.erase(ppAnnotationMark); + } + else + { + OSL_ENSURE( false, "<MarkManager::deleteMark(..)> - Annotation Mark not found in Annotation Mark container."); + } } break; @@ -867,7 +893,14 @@ namespace sw { namespace mark case IDocumentMarkAccess::UNO_BOOKMARK: { IDocumentMarkAccess::iterator_t ppOtherMark = lcl_FindMark(m_vCommonMarks, *ppMark); - m_vCommonMarks.erase(ppOtherMark); + if ( ppOtherMark != m_vCommonMarks.end() ) + { + m_vCommonMarks.erase(ppOtherMark); + } + else + { + OSL_ENSURE( false, "<MarkManager::deleteMark(..)> - Navigator Reminder, DDE Mark or Uno Makr not found in common mark container."); + } } break; } @@ -1032,6 +1065,11 @@ namespace sw { namespace mark return sTmp; } + void MarkManager::assureSortedMarkContainers() const + { + const_cast< MarkManager* >(this)->sortMarks(); + } + void MarkManager::sortSubsetMarks() { sort(m_vCommonMarks.begin(), m_vCommonMarks.end(), &lcl_MarkOrderingByStart); diff --git a/sw/source/core/inc/MarkManager.hxx b/sw/source/core/inc/MarkManager.hxx index 9004df1b0fac..086ab323e698 100644 --- a/sw/source/core/inc/MarkManager.hxx +++ b/sw/source/core/inc/MarkManager.hxx @@ -95,6 +95,8 @@ namespace sw { namespace mark virtual sal_Int32 getAnnotationMarksCount() const; virtual const_iterator_t findAnnotationMark( const ::rtl::OUString& rName ) const; + virtual void assureSortedMarkContainers() const; + private: // make names ::rtl::OUString getUniqueMarkName(const ::rtl::OUString& rName) const; diff --git a/sw/source/core/inc/bookmrk.hxx b/sw/source/core/inc/bookmrk.hxx index 7c529098eb41..86c3c6098e97 100644 --- a/sw/source/core/inc/bookmrk.hxx +++ b/sw/source/core/inc/bookmrk.hxx @@ -49,17 +49,17 @@ namespace sw { namespace mark { public: //getters - virtual SwPosition& GetMarkPos() const + virtual const SwPosition& GetMarkPos() const { return *m_pPos1; } virtual const ::rtl::OUString& GetName() const { return m_aName; } virtual bool IsCoveringPosition(const SwPosition& rPos) const; - virtual SwPosition& GetOtherMarkPos() const + virtual const SwPosition& GetOtherMarkPos() const { OSL_PRECOND(IsExpanded(), "<SwPosition::GetOtherMarkPos(..)> - I have no other Pos set." ); return *m_pPos2; } - virtual SwPosition& GetMarkStart() const + virtual const SwPosition& GetMarkStart() const { if( !IsExpanded() ) return GetMarkPos( ); if ( GetMarkPos( ) < GetOtherMarkPos( ) ) @@ -67,7 +67,7 @@ namespace sw { namespace mark else return GetOtherMarkPos( ); } - virtual SwPosition& GetMarkEnd() const + virtual const SwPosition& GetMarkEnd() const { if( !IsExpanded() ) return GetMarkPos(); if ( GetMarkPos( ) > GetOtherMarkPos( ) ) @@ -228,6 +228,9 @@ namespace sw { namespace mark virtual void SetFieldHelptext(const ::rtl::OUString& aFieldHelptext) { m_aFieldHelptext = aFieldHelptext; } + void SetMarkStartPos( const SwPosition& rNewStartPos ); + void SetMarkEndPos( const SwPosition& rNewEndPos ); + virtual void Invalidate(); virtual rtl::OUString ToString() const; private: diff --git a/sw/source/core/inc/crossrefbookmark.hxx b/sw/source/core/inc/crossrefbookmark.hxx index d2b996620484..b1c80ccc869c 100644 --- a/sw/source/core/inc/crossrefbookmark.hxx +++ b/sw/source/core/inc/crossrefbookmark.hxx @@ -41,10 +41,10 @@ namespace sw { namespace mark const ::rtl::OUString& rPrefix); // getters - virtual SwPosition& GetOtherMarkPos() const; - virtual SwPosition& GetMarkStart() const + virtual const SwPosition& GetOtherMarkPos() const; + virtual const SwPosition& GetMarkStart() const { return *m_pPos1; } - virtual SwPosition& GetMarkEnd() const + virtual const SwPosition& GetMarkEnd() const { return *m_pPos1; } virtual bool IsExpanded() const { return false; } diff --git a/sw/source/core/txtnode/ndtxt.cxx b/sw/source/core/txtnode/ndtxt.cxx index 518117da0a8b..13f32139eeec 100644 --- a/sw/source/core/txtnode/ndtxt.cxx +++ b/sw/source/core/txtnode/ndtxt.cxx @@ -1028,6 +1028,7 @@ void SwTxtNode::Update( } } + bool bSortMarks = false; SwIndexReg aTmpIdxReg; if ( !bNegative && !bDelete ) { @@ -1086,6 +1087,7 @@ void SwTxtNode::Update( rPos.GetIndex() == rIdx.GetIndex() ) { rIdx.Assign( &aTmpIdxReg, rIdx.GetIndex() ); + bSortMarks = true; } } } @@ -1104,6 +1106,10 @@ void SwTxtNode::Update( } aTmpIdxReg.MoveTo( *this ); + if ( bSortMarks ) + { + getIDocumentMarkAccess()->assureSortedMarkContainers(); + } } void SwTxtNode::_ChgTxtCollUpdateNum( const SwTxtFmtColl *pOldColl, |