sw/inc/IDocumentMarkAccess.hxx | 2 +- sw/inc/crsrsh.hxx | 2 +- sw/inc/pam.hxx | 2 +- sw/qa/extras/ooxmlexport/ooxmlexport5.cxx | 4 ++-- sw/source/core/crsr/crsrsh.cxx | 8 ++++---- sw/source/core/crsr/pam.cxx | 4 ++-- sw/source/core/doc/docbm.cxx | 9 ++++++--- sw/source/core/edit/eddel.cxx | 2 +- sw/source/core/edit/edfcol.cxx | 2 +- sw/source/core/inc/MarkManager.hxx | 2 +- 10 files changed, 20 insertions(+), 17 deletions(-)
New commits: commit 27892a5e12dada80226f778ab2bd14b1bdaab58a Author: Michael Stahl <michael.st...@allotropia.de> AuthorDate: Mon Aug 22 15:29:58 2022 +0200 Commit: Michael Stahl <michael.st...@allotropia.de> CommitDate: Tue Aug 23 10:25:09 2022 +0200 sw: enable Replace with Protect Bookmarks The dialog calls Replace on the whole bookmark, and with commit 7974cea6c788e02d7c36573e2d10dcc51884f70e the bookmark is preserved, so the HasReadonlySel() should not prevent this replace from happening. Change-Id: I823b042c8327c6716b2ac1a8a86beffd887e6e4c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/138693 Tested-by: Jenkins Reviewed-by: Michael Stahl <michael.st...@allotropia.de> diff --git a/sw/inc/IDocumentMarkAccess.hxx b/sw/inc/IDocumentMarkAccess.hxx index 98037c7917e3..ca63a45c7ce8 100644 --- a/sw/inc/IDocumentMarkAccess.hxx +++ b/sw/inc/IDocumentMarkAccess.hxx @@ -282,7 +282,7 @@ class IDocumentMarkAccess // interface IBookmarks (BOOKMARK, CROSSREF_NUMITEM_BOOKMARK, CROSSREF_HEADING_BOOKMARK ) /** check if the selection would delete a BOOKMARK */ - virtual bool isBookmarkDeleted(SwPaM const& rPaM) const =0; + virtual bool isBookmarkDeleted(SwPaM const& rPaM, bool isReplace) const =0; /** returns a STL-like random access iterator to the begin of the sequence the IBookmarks. */ diff --git a/sw/inc/crsrsh.hxx b/sw/inc/crsrsh.hxx index 306acf96f3fc..d552cba2b503 100644 --- a/sw/inc/crsrsh.hxx +++ b/sw/inc/crsrsh.hxx @@ -477,7 +477,7 @@ public: // Cursor is placed in something that is protected or selection contains // something that is protected. - bool HasReadonlySel() const; + bool HasReadonlySel(bool isReplace = false) const; // Can the cursor be set to read only ranges? bool IsReadOnlyAvailable() const { return m_bSetCursorInReadOnly; } diff --git a/sw/inc/pam.hxx b/sw/inc/pam.hxx index a56677cfaa5a..7002d07a017d 100644 --- a/sw/inc/pam.hxx +++ b/sw/inc/pam.hxx @@ -304,7 +304,7 @@ public: /** Is in something protected (readonly) or selection contains something protected. */ - bool HasReadonlySel( bool bFormView ) const; + bool HasReadonlySel(bool bFormView, bool isReplace) const; bool ContainsPosition(const SwPosition & rPos) const { diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport5.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport5.cxx index d34e5ce957f0..4e3812960d90 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport5.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport5.cxx @@ -1262,11 +1262,11 @@ CPPUNIT_TEST_FIXTURE(Test, tdf122201_editUnprotectedText) // check protected area SwPaM aPaMProtected(aDocStart); - CPPUNIT_ASSERT(aPaMProtected.HasReadonlySel(false)); + CPPUNIT_ASSERT(aPaMProtected.HasReadonlySel(false, false)); // check unprotected area SwPaM aPaMUnprotected(aDocEnd); - CPPUNIT_ASSERT(!aPaMUnprotected.HasReadonlySel(false)); + CPPUNIT_ASSERT(!aPaMUnprotected.HasReadonlySel(false, false)); } CPPUNIT_TEST_FIXTURE(Test, testSectionHeader) diff --git a/sw/source/core/crsr/crsrsh.cxx b/sw/source/core/crsr/crsrsh.cxx index 17718f8357b6..c37595430761 100644 --- a/sw/source/core/crsr/crsrsh.cxx +++ b/sw/source/core/crsr/crsrsh.cxx @@ -2743,7 +2743,7 @@ bool SwCursorShell::IsOverReadOnlyPos( const Point& rPt ) const SwPaM aPam( *m_pCurrentCursor->GetPoint() ); GetLayout()->GetModelPositionForViewPoint( aPam.GetPoint(), aPt ); // form view - return aPam.HasReadonlySel( GetViewOptions()->IsFormView() ); + return aPam.HasReadonlySel(GetViewOptions()->IsFormView(), false); } /** Get the number of elements in the ring of cursors @@ -3356,7 +3356,7 @@ void SwCursorShell::SetReadOnlyAvailable( bool bFlag ) } } -bool SwCursorShell::HasReadonlySel() const +bool SwCursorShell::HasReadonlySel(bool const isReplace) const { if (GetViewOptions()->IsShowOutlineContentVisibilityButton()) { @@ -3393,13 +3393,13 @@ bool SwCursorShell::HasReadonlySel() const if ( m_pTableCursor != nullptr ) { bRet = m_pTableCursor->HasReadOnlyBoxSel() - || m_pTableCursor->HasReadonlySel( GetViewOptions()->IsFormView() ); + || m_pTableCursor->HasReadonlySel(GetViewOptions()->IsFormView(), isReplace); } else { for(const SwPaM& rCursor : m_pCurrentCursor->GetRingContainer()) { - if( rCursor.HasReadonlySel( GetViewOptions()->IsFormView() ) ) + if (rCursor.HasReadonlySel(GetViewOptions()->IsFormView(), isReplace)) { bRet = true; break; diff --git a/sw/source/core/crsr/pam.cxx b/sw/source/core/crsr/pam.cxx index 4154ed39b176..0fd78618ef44 100644 --- a/sw/source/core/crsr/pam.cxx +++ b/sw/source/core/crsr/pam.cxx @@ -707,7 +707,7 @@ static const SwFrame* lcl_FindEditInReadonlyFrame( const SwFrame& rFrame ) } /// is in protected section or selection surrounds something protected -bool SwPaM::HasReadonlySel( bool bFormView ) const +bool SwPaM::HasReadonlySel(bool bFormView, bool const isReplace) const { bool bRet = false; @@ -886,7 +886,7 @@ bool SwPaM::HasReadonlySel( bool bFormView ) const if (!bRet && rDoc.getIDocumentSettingAccess().get(DocumentSettingId::PROTECT_BOOKMARKS)) { - if (rDoc.getIDocumentMarkAccess()->isBookmarkDeleted(*this)) + if (rDoc.getIDocumentMarkAccess()->isBookmarkDeleted(*this, isReplace)) { return true; } diff --git a/sw/source/core/doc/docbm.cxx b/sw/source/core/doc/docbm.cxx index 52461872b6e0..027cc884ce08 100644 --- a/sw/source/core/doc/docbm.cxx +++ b/sw/source/core/doc/docbm.cxx @@ -973,6 +973,7 @@ namespace sw::mark static bool isDeleteMark( ::sw::mark::MarkBase const*const pMark, + bool const isReplace, SwNode const& rStt, SwNode const& rEnd, std::optional<sal_Int32> oStartContentIdx, @@ -996,6 +997,8 @@ namespace sw::mark && lcl_Lower(pMark->GetOtherMarkPos(), rEnd, oEndContentIdx); // special case: completely in range, touching the end? if ( oEndContentIdx.has_value() + && !(isReplace && IDocumentMarkAccess::GetType(*pMark) + == IDocumentMarkAccess::MarkType::BOOKMARK) && ( ( rbIsOtherPosInRange && pMark->GetMarkPos().GetNode() == rEnd && pMark->GetMarkPos().GetContentIndex() == *oEndContentIdx ) @@ -1041,7 +1044,7 @@ namespace sw::mark return false; } - bool MarkManager::isBookmarkDeleted(SwPaM const& rPaM) const + bool MarkManager::isBookmarkDeleted(SwPaM const& rPaM, bool const isReplace) const { SwPosition const& rStart(*rPaM.Start()); SwPosition const& rEnd(*rPaM.End()); @@ -1051,7 +1054,7 @@ namespace sw::mark { bool bIsPosInRange(false); bool bIsOtherPosInRange(false); - bool const bDeleteMark = isDeleteMark(*ppMark, + bool const bDeleteMark = isDeleteMark(*ppMark, isReplace, rStart.GetNode(), rEnd.GetNode(), rStart.GetContentIndex(), rEnd.GetContentIndex(), bIsPosInRange, bIsOtherPosInRange); if (bDeleteMark @@ -1087,7 +1090,7 @@ namespace sw::mark ::sw::mark::MarkBase *const pMark = *ppMark; bool bIsPosInRange(false); bool bIsOtherPosInRange(false); - bool const bDeleteMark = isDeleteMark(pMark, rStt, rEnd, oStartContentIdx, oEndContentIdx, bIsPosInRange, bIsOtherPosInRange); + bool const bDeleteMark = isDeleteMark(pMark, false, rStt, rEnd, oStartContentIdx, oEndContentIdx, bIsPosInRange, bIsOtherPosInRange); if ( bIsPosInRange && ( bIsOtherPosInRange diff --git a/sw/source/core/edit/eddel.cxx b/sw/source/core/edit/eddel.cxx index c19d93b71b61..d4fce54b3fa3 100644 --- a/sw/source/core/edit/eddel.cxx +++ b/sw/source/core/edit/eddel.cxx @@ -316,7 +316,7 @@ bool SwEditShell::Replace( const OUString& rNewStr, bool bRegExpRplc ) CurrShell aCurr( this ); bool bRet = false; - if( !HasReadonlySel() ) + if (!HasReadonlySel(true)) { StartAllAction(); GetDoc()->GetIDocumentUndoRedo().StartUndo(SwUndoId::EMPTY, nullptr); diff --git a/sw/source/core/edit/edfcol.cxx b/sw/source/core/edit/edfcol.cxx index e0f2e5e506a3..d4f1c84dc76d 100644 --- a/sw/source/core/edit/edfcol.cxx +++ b/sw/source/core/edit/edfcol.cxx @@ -2199,7 +2199,7 @@ void SwEditShell::SetTextFormatColl(SwTextFormatColl *pFormat, GetDoc()->GetIDocumentUndoRedo().StartUndo(SwUndoId::SETFMTCOLL, &aRewriter); for(SwPaM& rPaM : GetCursor()->GetRingContainer()) { - if ( !rPaM.HasReadonlySel( GetViewOptions()->IsFormView() ) ) + if (!rPaM.HasReadonlySel( GetViewOptions()->IsFormView(), true)) { // store previous paragraph style for track changes OUString sParaStyleName; diff --git a/sw/source/core/inc/MarkManager.hxx b/sw/source/core/inc/MarkManager.hxx index 2af05601867c..9aaf7c352e58 100644 --- a/sw/source/core/inc/MarkManager.hxx +++ b/sw/source/core/inc/MarkManager.hxx @@ -82,7 +82,7 @@ namespace sw::mark { virtual const_iterator_t findMark(const OUString& rName) const override; // bookmarks - virtual bool isBookmarkDeleted(SwPaM const& rPaM) const override; + virtual bool isBookmarkDeleted(SwPaM const& rPaM, bool isReplace) const override; virtual const_iterator_t getBookmarksBegin() const override; virtual const_iterator_t getBookmarksEnd() const override; virtual sal_Int32 getBookmarksCount() const override;