sw/qa/extras/uiwriter/uiwriter2.cxx | 5 ++++ sw/source/uibase/wrtsh/delete.cxx | 37 ++++++++++++++++++++++++++++-------- 2 files changed, 34 insertions(+), 8 deletions(-)
New commits: commit 3c2a759b001600529d1fd64c08421b6592f5c905 Author: László Németh <nem...@numbertext.org> AuthorDate: Sun Jul 11 13:04:54 2021 +0200 Commit: Balazs Varga <varga.bala...@nisz.hu> CommitDate: Thu Oct 21 13:24:52 2021 +0200 tdf#142701 track changes: fix layout regression of image deletion Commit d6322bcedc197a654abc7d64bfea8cf570f123bf (tdf#59463 track changes: record deletion of images) converted image anchors to AS_CHAR, which resulted loss of the original layout during rejecting the tracked image deletion. Now keep the original AT_CHAR (also AS_CHAR) anchorings, also convert the AT_PARA and other anchoring types to AT_CHAR using the following workaround: add an invisible text-based anchoring point with ZWJs. Follow-up to commit 8726cf692299ea262a7455adcf6ec25451c7869d (tdf#142700 DOCX: fix lost track changes of images). Change-Id: I29d1e161b5f24c0fed51d40c9a8db82085918d0d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/118747 Tested-by: Jenkins Reviewed-by: László Németh <nem...@numbertext.org> (cherry picked from commit b50d386dfa70f7c1d4eb1a49091ec9dd782b767b) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/123980 Tested-by: Balazs Varga <varga.bala...@nisz.hu> Reviewed-by: Balazs Varga <varga.bala...@nisz.hu> diff --git a/sw/qa/extras/uiwriter/uiwriter2.cxx b/sw/qa/extras/uiwriter/uiwriter2.cxx index 9cccb6f0081f..2cc759b8a121 100644 --- a/sw/qa/extras/uiwriter/uiwriter2.cxx +++ b/sw/qa/extras/uiwriter/uiwriter2.cxx @@ -3174,6 +3174,11 @@ CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testTrackImageDeletion) const SwRedlineTable& rTable = rIDRA.GetRedlineTable(); // this was 0 (missing recording of deletion of images) CPPUNIT_ASSERT_EQUAL(static_cast<SwRedlineTable::size_type>(1), rTable.size()); + + uno::Reference<beans::XPropertySet> xShape(getShape(1), uno::UNO_QUERY); + // tdf#142701 this was AS_CHARACTER (convert AT_PARA to AT_CHAR to keep the layout) + CPPUNIT_ASSERT_EQUAL(text::TextContentAnchorType_AT_CHARACTER, + getProperty<text::TextContentAnchorType>(xShape, "AnchorType")); } CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testTrackImageInsertion) diff --git a/sw/source/uibase/wrtsh/delete.cxx b/sw/source/uibase/wrtsh/delete.cxx index f9a5772a603a..ab7dd3fe63ba 100644 --- a/sw/source/uibase/wrtsh/delete.cxx +++ b/sw/source/uibase/wrtsh/delete.cxx @@ -33,6 +33,7 @@ #include <i18nutil/unicode.hxx> #include <rtl/character.hxx> #include <doc.hxx> +#include <IDocumentRedlineAccess.hxx> inline void SwWrtShell::OpenMark() { @@ -428,18 +429,20 @@ bool SwWrtShell::DelRight() std::unique_ptr<SwPosition> pAnchor; RndStdIds eAnchorId = RndStdIds::FLY_AT_PARA; SwFlyFrame* pFly = GetSelectedFlyFrame(); + SwFrameFormat* pFormat = nullptr; if (pFly) { - SwFrameFormat* pFormat = pFly->GetFormat(); + pFormat = pFly->GetFormat(); if (pFormat) { eAnchorId = pFormat->GetAnchor().GetAnchorId(); - // as-character anchor conversion at track changes - if ( IsRedlineOn() && eAnchorId != RndStdIds::FLY_AS_CHAR ) + // to-character anchor conversion at track changes + if ( IsRedlineOn() && (eAnchorId != RndStdIds::FLY_AS_CHAR && + eAnchorId != RndStdIds::FLY_AT_CHAR) ) { SfxItemSet aSet(GetAttrPool(), svl::Items<RES_ANCHOR, RES_ANCHOR>{}); GetFlyFrameAttr(aSet); - SwFormatAnchor aAnch(RndStdIds::FLY_AS_CHAR); + SwFormatAnchor aAnch(RndStdIds::FLY_AT_CHAR); aSet.Put(aAnch); SetFlyFrameAttr(aSet); eAnchorId = pFormat->GetAnchor().GetAnchorId(); @@ -455,12 +458,30 @@ bool SwWrtShell::DelRight() } } - // track changes: delete the anchor point of the image to record the deletion - if ( IsRedlineOn() && pAnchor && SelectionType::Graphic & nSelection - && eAnchorId == RndStdIds::FLY_AS_CHAR ) + // track changes: create redline at anchor point of the image to record the deletion + if ( IsRedlineOn() && pAnchor && SelectionType::Graphic & nSelection && pFormat && + ( eAnchorId == RndStdIds::FLY_AT_CHAR || eAnchorId == RndStdIds::FLY_AS_CHAR ) ) { + sal_Int32 nRedlineLength = 1; + // create a double ZWJ anchor point of the image to record the deletion, if needed + // (otherwise use the existing anchor point of the image anchored *as* character) + if ( eAnchorId == RndStdIds::FLY_AT_CHAR ) + { + nRedlineLength = 2; + LeaveSelFrameMode(); + UnSelectFrame(); + RedlineFlags eOld = GetRedlineFlags(); + SetRedlineFlags( eOld | RedlineFlags::Ignore ); + Insert( OUString( u"" ) ); + SwFormatAnchor anchor(RndStdIds::FLY_AT_CHAR); + SwCursorShell::Left(1, CRSR_SKIP_CHARS); + anchor.SetAnchor(GetCursor()->GetPoint()); + GetDoc()->SetAttr(anchor, *pFormat); + SetRedlineFlags( eOld ); + SwCursorShell::Left(1, CRSR_SKIP_CHARS); + } OpenMark(); - SwCursorShell::Right(1, CRSR_SKIP_CHARS); + SwCursorShell::Right(nRedlineLength, CRSR_SKIP_CHARS); bRet = Delete(); CloseMark( bRet ); }