sw/qa/extras/uiwriter/uiwriter2.cxx | 79 ++++++++++++++++++++++++++ sw/source/core/doc/DocumentRedlineManager.cxx | 21 ++++++ 2 files changed, 100 insertions(+)
New commits: commit 6a4409647519e0466896fae4ffe2dc64edd53d9a Author: László Németh <nem...@numbertext.org> AuthorDate: Mon May 31 14:38:31 2021 +0200 Commit: László Németh <nem...@numbertext.org> CommitDate: Tue Jun 1 09:30:23 2021 +0200 tdf#60382 sw: fix tracked row deletion at rejection At rejection of a tracked deletion in a table row, set HasTextChangesOnly property of the row to true. Follow-up to commit 05366b8e6683363688de8708a3d88cf144c7a2bf "tdf#60382 sw offapi: add change tracking of table/row deletion". Change-Id: Iea78f8394890995cbc06209abd4bf5ea4ceb7357 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/116446 Tested-by: László Németh <nem...@numbertext.org> Reviewed-by: László Németh <nem...@numbertext.org> diff --git a/sw/qa/extras/uiwriter/uiwriter2.cxx b/sw/qa/extras/uiwriter/uiwriter2.cxx index 7cce013d5eab..d91c89848495 100644 --- a/sw/qa/extras/uiwriter/uiwriter2.cxx +++ b/sw/qa/extras/uiwriter/uiwriter2.cxx @@ -3857,6 +3857,85 @@ CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testTdf128335) pView->GetViewFrame()->GetDispatcher()->Execute(SID_CUT, SfxCallMode::SYNCHRON); } +CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testRedlineTableRowDeletionWithReject) +{ + // load a 1-row table, and delete the row with enabled change tracking: + // now the row is not deleted silently, but keeps the deleted cell contents, + // and only accepting all of them will result the deletion of the table row. + SwDoc* pDoc = createDoc("tdf118311.fodt"); + + SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument*>(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + + // turn on red-lining and show changes + pDoc->getIDocumentRedlineAccess().SetRedlineFlags(RedlineFlags::On | RedlineFlags::ShowDelete + | RedlineFlags::ShowInsert); + CPPUNIT_ASSERT_MESSAGE("redlining should be on", + pDoc->getIDocumentRedlineAccess().IsRedlineOn()); + CPPUNIT_ASSERT_MESSAGE( + "redlines should be visible", + IDocumentRedlineAccess::IsShowChanges(pDoc->getIDocumentRedlineAccess().GetRedlineFlags())); + + // check table + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "//page[1]//body/tab"); + + // delete table row with enabled change tracking + // (HasTextChangesOnly property of the row will be false) + dispatchCommand(mxComponent, ".uno:DeleteRows", {}); + + // Deleted text content with change tracking, + // but not table deletion + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "//page[1]//body/tab"); + + // Save it and load it back. + reload("writer8", "tdf60382_tracked_table_deletion.odt"); + pTextDoc = dynamic_cast<SwXTextDocument*>(mxComponent.get()); + pDoc = pTextDoc->GetDocShell()->GetWrtShell()->GetDoc(); + + // reject the deletion of the content of the first cell + // HasTextChangesOnly property of the table row will be true + SwEditShell* const pEditShell(pDoc->GetEditShell()); + CPPUNIT_ASSERT_EQUAL(static_cast<SwRedlineTable::size_type>(2), pEditShell->GetRedlineCount()); + pEditShell->RejectRedline(0); + + // Select and delete the content of the first cell + dispatchCommand(mxComponent, ".uno:SelectAll", {}); + dispatchCommand(mxComponent, ".uno:Delete", {}); + + // table row was still not deleted + pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "//page[1]//body/tab"); + + // accept all redlines + while (pEditShell->GetRedlineCount()) + pEditShell->AcceptRedline(0); + + // This was table row deletion instead of remaining the empty row + // (HasTextChangesOnly was false) + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "//page[1]//body/tab"); + + // restore HasTextChangesOnly = false + dispatchCommand(mxComponent, ".uno:Undo", {}); + dispatchCommand(mxComponent, ".uno:Undo", {}); + dispatchCommand(mxComponent, ".uno:Undo", {}); + dispatchCommand(mxComponent, ".uno:Undo", {}); + dispatchCommand(mxComponent, ".uno:Undo", {}); + + // accept all redlines + while (pEditShell->GetRedlineCount()) + pEditShell->AcceptRedline(0); + + // table row (and the 1-row table) was deleted finally + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "//page[1]//body/tab", 0); +} + CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testTdf128603) { // Load the bugdoc, which has 3 textboxes. diff --git a/sw/source/core/doc/DocumentRedlineManager.cxx b/sw/source/core/doc/DocumentRedlineManager.cxx index 6d2332418441..6079ddcc88f2 100644 --- a/sw/source/core/doc/DocumentRedlineManager.cxx +++ b/sw/source/core/doc/DocumentRedlineManager.cxx @@ -461,6 +461,24 @@ namespace } } + // at rejection of a deletion in a table, remove the tracking of the table row + void lcl_RemoveTrackingOfTableRow( const SwPosition* pPos ) + { + if ( const SwTableBox* pBox = pPos->nNode.GetNode().GetTableBox() ) + { + const SwTableLine* pLine = pBox->GetUpper(); + const SvxPrintItem *pHasTextChangesOnlyProp = + pLine->GetFrameFormat()->GetAttrSet().GetItem<SvxPrintItem>(RES_PRINT); + // table row property "HasTextChangesOnly" is set and its value is false + if ( pHasTextChangesOnlyProp && !pHasTextChangesOnlyProp->GetValue() ) + { + SvxPrintItem aUnsetTracking(RES_PRINT, true); + SwCursor aCursor( *pPos, nullptr ); + pPos->GetDoc().SetRowNotTracked( aCursor, aUnsetTracking ); + } + } + } + bool lcl_AcceptRedline( SwRedlineTable& rArr, SwRedlineTable::size_type& rPos, bool bCallDelete, const SwPosition* pSttRng = nullptr, @@ -743,6 +761,9 @@ namespace if( pRedl->GetExtraData() ) pRedl->GetExtraData()->Reject( *pRedl ); + // remove tracking of the table row, if needed + lcl_RemoveTrackingOfTableRow( updatePaM.End() ); + switch( eCmp ) { case SwComparePosition::Inside: _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits