sw/source/core/undo/rolbck.cxx | 21 ++++++++++++++++++++- sw/source/core/undo/undobj.cxx | 18 +++++++++++------- 2 files changed, 31 insertions(+), 8 deletions(-)
New commits: commit 24fd14b387dca458a1b6e9415e936d26562ddb1e Author: Michael Stahl <michael.st...@cib.de> AuthorDate: Fri Nov 15 16:44:23 2019 +0100 Commit: Michael Stahl <michael.st...@cib.de> CommitDate: Mon Nov 18 17:35:38 2019 +0100 tdf#128739 sw: delete fieldmarks if exactly selected ... ... in SwUndoSaveContent::DelContentIndex(). The problem is that the fieldmark survives but its dummy characters are all deleted; this will eventually lead to unhappiness in Undo. Another issue is that SwHistoryBookmark doesn't know about dummy characters, so use the SwHistory*Fieldmark instead. This still doesn't work completely because SwUndoDelete::RedoImpl() is quite borked. (regression from 4dc1615c80e8e66d339dc86fa95bbc76e884d988..d9030ad6298e2f49ee63489d6158ea6ad23c0111) Change-Id: Ia98d143fa46e79348fde200be5462cc461455b58 Reviewed-on: https://gerrit.libreoffice.org/82815 Tested-by: Jenkins Reviewed-by: Michael Stahl <michael.st...@cib.de> diff --git a/sw/source/core/undo/rolbck.cxx b/sw/source/core/undo/rolbck.cxx index 8a2c027b93f5..353ce708fe8a 100644 --- a/sw/source/core/undo/rolbck.cxx +++ b/sw/source/core/undo/rolbck.cxx @@ -1070,7 +1070,26 @@ void SwHistory::Add(const ::sw::mark::IMark& rBkmk, bool bSavePos, bool bSaveOth { OSL_ENSURE( !m_nEndDiff, "History was not deleted after REDO" ); - std::unique_ptr<SwHistoryHint> pHt(new SwHistoryBookmark(rBkmk, bSavePos, bSaveOtherPos)); + std::unique_ptr<SwHistoryHint> pHt; + + switch (IDocumentMarkAccess::GetType(rBkmk)) + { + case IDocumentMarkAccess::MarkType::TEXT_FIELDMARK: + case IDocumentMarkAccess::MarkType::DATE_FIELDMARK: + assert(bSavePos && bSaveOtherPos); // must be deleted completely! + pHt.reset(new SwHistoryTextFieldmark(dynamic_cast<sw::mark::IFieldmark const&>(rBkmk))); + break; + case IDocumentMarkAccess::MarkType::CHECKBOX_FIELDMARK: + case IDocumentMarkAccess::MarkType::DROPDOWN_FIELDMARK: + assert(bSavePos && bSaveOtherPos); // must be deleted completely! + pHt.reset(new SwHistoryNoTextFieldmark(dynamic_cast<sw::mark::IFieldmark const&>(rBkmk))); + break; + default: + pHt.reset(new SwHistoryBookmark(rBkmk, bSavePos, bSaveOtherPos)); + break; + } + + assert(pHt); m_SwpHstry.push_back( std::move(pHt) ); } diff --git a/sw/source/core/undo/undobj.cxx b/sw/source/core/undo/undobj.cxx index 5a3dd9a3e66c..bb5683853a51 100644 --- a/sw/source/core/undo/undobj.cxx +++ b/sw/source/core/undo/undobj.cxx @@ -1063,13 +1063,13 @@ void SwUndoSaveContent::DelContentIndex( const SwPosition& rMark, IDocumentMarkAccess* const pMarkAccess = pDoc->getIDocumentMarkAccess(); if( pMarkAccess->getAllMarksCount() ) { - for( sal_Int32 n = 0; n < pMarkAccess->getAllMarksCount(); ++n ) { // #i81002# bool bSavePos = false; bool bSaveOtherPos = false; - const ::sw::mark::IMark* pBkmk = pMarkAccess->getAllMarksBegin()[n]; + const ::sw::mark::IMark *const pBkmk = pMarkAccess->getAllMarksBegin()[n]; + auto const type(IDocumentMarkAccess::GetType(*pBkmk)); if( DelContentType::CheckNoCntnt & nDelContentType ) { @@ -1090,8 +1090,8 @@ void SwUndoSaveContent::DelContentIndex( const SwPosition& rMark, // #i92125# // keep cross-reference bookmarks, if content inside one paragraph is deleted. if ( rMark.nNode == rPoint.nNode - && ( IDocumentMarkAccess::GetType(*pBkmk) == IDocumentMarkAccess::MarkType::CROSSREF_HEADING_BOOKMARK - || IDocumentMarkAccess::GetType(*pBkmk) == IDocumentMarkAccess::MarkType::CROSSREF_NUMITEM_BOOKMARK ) ) + && ( type == IDocumentMarkAccess::MarkType::CROSSREF_HEADING_BOOKMARK + || type == IDocumentMarkAccess::MarkType::CROSSREF_NUMITEM_BOOKMARK)) { continue; } @@ -1109,7 +1109,11 @@ void SwUndoSaveContent::DelContentIndex( const SwPosition& rMark, *pStt <= pBkmk->GetOtherMarkPos() && pBkmk->GetOtherMarkPos() <= *pEnd ) { if ( bSavePos || bSaveOtherPos - || ( pBkmk->GetOtherMarkPos() < *pEnd && pBkmk->GetOtherMarkPos() > *pStt ) ) + || (*pStt < pBkmk->GetOtherMarkPos() && pBkmk->GetOtherMarkPos() < *pEnd) + || type == IDocumentMarkAccess::MarkType::TEXT_FIELDMARK + || type == IDocumentMarkAccess::MarkType::CHECKBOX_FIELDMARK + || type == IDocumentMarkAccess::MarkType::DROPDOWN_FIELDMARK + || type == IDocumentMarkAccess::MarkType::DATE_FIELDMARK) { if( bMaybe ) bSavePos = true; @@ -1145,7 +1149,7 @@ void SwUndoSaveContent::DelContentIndex( const SwPosition& rMark, } } } - else if ( IDocumentMarkAccess::GetType(*pBkmk) == IDocumentMarkAccess::MarkType::ANNOTATIONMARK ) + else if (type == IDocumentMarkAccess::MarkType::ANNOTATIONMARK) { // delete annotation marks, if its end position is covered by the deletion const SwPosition& rAnnotationEndPos = pBkmk->GetMarkEnd(); @@ -1159,7 +1163,7 @@ void SwUndoSaveContent::DelContentIndex( const SwPosition& rMark, if ( bSavePos || bSaveOtherPos ) { - if( IDocumentMarkAccess::GetType(*pBkmk) != IDocumentMarkAccess::MarkType::UNO_BOOKMARK ) + if (type != IDocumentMarkAccess::MarkType::UNO_BOOKMARK) { if( !m_pHistory ) m_pHistory.reset( new SwHistory ); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits