sw/inc/IDocumentMarkAccess.hxx | 7 ++++++- sw/source/core/doc/docbm.cxx | 24 ++++++++++++++++++++++-- sw/source/core/doc/docredln.cxx | 8 ++++---- sw/source/core/fields/postithelper.cxx | 17 ++++++++++++++++- sw/source/core/inc/MarkManager.hxx | 6 ++++++ 5 files changed, 54 insertions(+), 8 deletions(-)
New commits: commit 31442054520cf0a263cc17e157cfa102cff8ef6a Author: László Németh <nem...@numbertext.org> AuthorDate: Thu Mar 18 13:41:46 2021 +0100 Commit: László Németh <nem...@numbertext.org> CommitDate: Thu Mar 18 16:32:46 2021 +0100 tdf#140980 sw: fix bad strikethrough of annotations Not deleted annotation windows got a bad strikethrough in ChangesInMargin mode, if they annotate tracked deletions. Also clean-up commit a001a66ba27e2fe9a485388869d53f001f2b09af (tdf#140982 sw ChangesInMargin: fix annotation ranges). Change-Id: I06cb88113bf038c09702b6ef33e46c94c963730d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/112672 Tested-by: Jenkins Reviewed-by: László Németh <nem...@numbertext.org> diff --git a/sw/inc/IDocumentMarkAccess.hxx b/sw/inc/IDocumentMarkAccess.hxx index 49ce72ad28b4..e678f52605ff 100644 --- a/sw/inc/IDocumentMarkAccess.hxx +++ b/sw/inc/IDocumentMarkAccess.hxx @@ -341,8 +341,13 @@ class IDocumentMarkAccess virtual sal_Int32 getAnnotationMarksCount() const = 0; virtual const_iterator_t findAnnotationMark( const OUString& rName ) const = 0; virtual sw::mark::IMark* getAnnotationMarkFor(const SwPosition& rPosition) const = 0; - // restore text ranges of annotations of tracked deletions + // handle and restore text ranges of annotations of tracked deletions // based on the helper bookmarks (which can survive I/O and hiding redlines) + virtual ::sw::mark::IMark* makeAnnotationBookmark(const SwPaM& rPaM, + const OUString& rProposedName, + MarkType eMark, ::sw::mark::InsertMode eMode, + SwPosition const* pSepPos = nullptr) = 0; + virtual const_iterator_t findAnnotationBookmark( const OUString& rName ) const = 0; virtual void restoreAnnotationMarks(bool bDelete = true) = 0; /** Finds the first mark that is starting after. diff --git a/sw/source/core/doc/docbm.cxx b/sw/source/core/doc/docbm.cxx index 82579d079445..438c294c5ecd 100644 --- a/sw/source/core/doc/docbm.cxx +++ b/sw/source/core/doc/docbm.cxx @@ -49,6 +49,8 @@ #include <libxml/xmlwriter.h> #include <comphelper/lok.hxx> +#define S_ANNOTATION_BOOKMARK u"____" + using namespace ::sw::mark; std::vector<::sw::mark::MarkBase*>::const_iterator const& @@ -1641,7 +1643,25 @@ namespace sw::mark CompareIMarkStartsAfter()); } - // restore text ranges of annotations of tracked deletions + // create helper bookmark for annotations on tracked deletions + ::sw::mark::IMark* MarkManager::makeAnnotationBookmark(const SwPaM& rPaM, + const OUString& rName, + const IDocumentMarkAccess::MarkType eType, + sw::mark::InsertMode const eMode, + SwPosition const*const pSepPos) + { + OUString sAnnotationBookmarkName(rName + S_ANNOTATION_BOOKMARK); + return makeMark( rPaM, sAnnotationBookmarkName, eType, eMode, pSepPos); + } + + // find helper bookmark of annotations on tracked deletions + IDocumentMarkAccess::const_iterator_t MarkManager::findAnnotationBookmark(const OUString& rName) const + { + OUString sAnnotationBookmarkName(rName + S_ANNOTATION_BOOKMARK); + return findBookmark(sAnnotationBookmarkName); + } + + // restore text ranges of annotations on tracked deletions // based on the helper bookmarks (which can survive I/O and hiding redlines) void MarkManager::restoreAnnotationMarks(bool bDelete) { @@ -1651,7 +1671,7 @@ namespace sw::mark const OUString & rBookmarkName = (**iter).GetName(); sal_Int32 nPos; if ( rBookmarkName.startsWith("__Annotation__") && - (nPos = rBookmarkName.indexOf("____")) > -1 ) + (nPos = rBookmarkName.indexOf(S_ANNOTATION_BOOKMARK)) > -1 ) { ::sw::UndoGuard const undoGuard(m_rDoc.GetIDocumentUndoRedo()); IDocumentMarkAccess::const_iterator_t pMark = findAnnotationMark(rBookmarkName.copy(0, nPos)); diff --git a/sw/source/core/doc/docredln.cxx b/sw/source/core/doc/docredln.cxx index d4d5cce88483..1eed6d70ce2e 100644 --- a/sw/source/core/doc/docredln.cxx +++ b/sw/source/core/doc/docredln.cxx @@ -1346,8 +1346,8 @@ static void lcl_storeAnnotationMarks(SwDoc& rDoc, const SwPosition* pStt, const SwPosition const& rStartPos((**iter).GetMarkStart()); if ( *pStt <= rStartPos && rStartPos < *pEnd ) { - OUString sBookmarkName((**iter).GetName() + "____"); - IDocumentMarkAccess::const_iterator_t pOldMark = rDMA.findBookmark(sBookmarkName); + IDocumentMarkAccess::const_iterator_t pOldMark = + rDMA.findAnnotationBookmark((**iter).GetName()); if ( pOldMark == rDMA.getBookmarksEnd() ) { // at start of redlines use a 1-character length bookmark range @@ -1355,9 +1355,9 @@ static void lcl_storeAnnotationMarks(SwDoc& rDoc, const SwPosition* pStt, const sal_Int32 nLen = (*pStt == rStartPos) ? 1 : 0; SwPaM aPam( rStartPos.nNode, rStartPos.nContent.GetIndex(), rStartPos.nNode, rStartPos.nContent.GetIndex() + nLen); - ::sw::mark::IMark* pMark = rDMA.makeMark( + ::sw::mark::IMark* pMark = rDMA.makeAnnotationBookmark( aPam, - sBookmarkName, + (**iter).GetName(), IDocumentMarkAccess::MarkType::BOOKMARK, sw::mark::InsertMode::New); ::sw::mark::IBookmark* pBookmark = dynamic_cast< ::sw::mark::IBookmark* >(pMark); if (pBookmark) diff --git a/sw/source/core/fields/postithelper.cxx b/sw/source/core/fields/postithelper.cxx index c61637601ad2..18dd7cc10c71 100644 --- a/sw/source/core/fields/postithelper.cxx +++ b/sw/source/core/fields/postithelper.cxx @@ -29,6 +29,7 @@ #include <txtfrm.hxx> #include <IDocumentRedlineAccess.hxx> #include <IDocumentFieldsAccess.hxx> +#include <IDocumentMarkAccess.hxx> #include <redline.hxx> #include <scriptinfo.hxx> #include <calbck.hxx> @@ -193,7 +194,21 @@ SwPostItHelper::SwLayoutStatus SwPostItHelper::getLayoutInfos( if( RedlineType::Insert == pRedline->GetType() ) aRet = INSERTED; else if( RedlineType::Delete == pRedline->GetType() ) - aRet = DELETED; + { + bool bDeleted = pAnnotationMark == nullptr; + if( !bDeleted ) + { + IDocumentMarkAccess& rDMA(*pTextNode->GetDoc().getIDocumentMarkAccess()); + IDocumentMarkAccess::const_iterator_t pAnnotationBookmark = + rDMA.findAnnotationBookmark(pAnnotationMark->GetName()); + // tdf#140980 only really deleted, if there is no helper bookmark + // in ChangesInMargin mode + if ( pAnnotationBookmark == rDMA.getBookmarksEnd() ) + bDeleted = true; + } + if ( bDeleted ) + aRet = DELETED; + } o_rInfo.mRedlineAuthor = pRedline->GetAuthor(); } } diff --git a/sw/source/core/inc/MarkManager.hxx b/sw/source/core/inc/MarkManager.hxx index 4e1547f00731..97e936771ad1 100644 --- a/sw/source/core/inc/MarkManager.hxx +++ b/sw/source/core/inc/MarkManager.hxx @@ -117,6 +117,12 @@ namespace sw::mark { typedef std::vector<sw::mark::MarkBase*> container_t; + // helper bookmark to store annotation range of redlines + virtual ::sw::mark::IMark* makeAnnotationBookmark(const SwPaM& rPaM, + const OUString& rName, IDocumentMarkAccess::MarkType eMark, + sw::mark::InsertMode eMode, + SwPosition const* pSepPos = nullptr) override; + virtual const_iterator_t findAnnotationBookmark( const OUString& rName ) const override; virtual void restoreAnnotationMarks(bool bDelete = true) override; private: _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits