sw/qa/extras/uiwriter/uiwriter3.cxx | 70 ++++++++++++++++++++++++++++++++++++ sw/source/core/frmedt/fetab.cxx | 23 +++++++++++ 2 files changed, 93 insertions(+)
New commits: commit 24087697d5cf78aac346d4dcea0596373e15a95c Author: László Németh <nem...@numbertext.org> AuthorDate: Wed Aug 24 17:10:56 2022 +0200 Commit: László Németh <nem...@numbertext.org> CommitDate: Wed Aug 24 22:24:45 2022 +0200 tdf#150576 sw: fix cursor pos deleting at rows deleted already Instead of jumping in the start of the document, set cursor after (or deleting the last row, before) the rows deleted already in Hide Changes mode with enabled change tracking. Regression from commit a74c51025fa4519caaf461492e4ed8e68bd34885 "tdf#146962 sw: hide deleted row at deletion in Hide Changes". Follow-up to commit 189aa05c6ea17a8e823b4eab18ea0d1131d9d73e "tdf#148849 sw: fix cursor pos at tracked DeleteRow in Hide Changes". Change-Id: Ifc2a7f41a57f413d27d9b464a0e464643d15f404 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/138772 Tested-by: Jenkins Reviewed-by: László Németh <nem...@numbertext.org> diff --git a/sw/qa/extras/uiwriter/uiwriter3.cxx b/sw/qa/extras/uiwriter/uiwriter3.cxx index 775e3472b812..8b661082e8ba 100644 --- a/sw/qa/extras/uiwriter/uiwriter3.cxx +++ b/sw/qa/extras/uiwriter/uiwriter3.cxx @@ -3661,6 +3661,76 @@ CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf148849) CPPUNIT_ASSERT_EQUAL(OUString("Row 2"), rNode.GetTextNode()->GetText()); } +CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf150576) +{ + // load a document with a table and an empty paragraph before the table + SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf148849.fodt"); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + + // record changes + pDoc->getIDocumentRedlineAccess().SetRedlineFlags(RedlineFlags::On | RedlineFlags::ShowDelete + | RedlineFlags::ShowInsert); + CPPUNIT_ASSERT_MESSAGE("redlining should be on", + pDoc->getIDocumentRedlineAccess().IsRedlineOn()); + // hide changes + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(pWrtShell->GetLayout()->IsHideRedlines()); + + uno::Reference<text::XTextTablesSupplier> xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference<container::XIndexAccess> xTables(xTablesSupplier->getTextTables(), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount()); + + // Check deletion of the first row, if the second row deleted already + + // put cursor in the second table row + pWrtShell->Down(/*bSelect=*/false, /*nCount=*/2); + SwNode& rNode = pWrtShell->GetCursor()->GetPoint()->GetNode(); + CPPUNIT_ASSERT_EQUAL(OUString("Row 2"), rNode.GetTextNode()->GetText()); + + // delete the second table row + pWrtShell->DeleteRow(); + + // check cursor position (row 3) + SwNode& rNode2 = pWrtShell->GetCursor()->GetPoint()->GetNode(); + CPPUNIT_ASSERT_EQUAL(OUString("Row 3"), rNode2.GetTextNode()->GetText()); + + // put cursor in the first row + pWrtShell->Up(/*bSelect=*/false, /*nCount=*/1); + SwNode& rNode3 = pWrtShell->GetCursor()->GetPoint()->GetNode(); + CPPUNIT_ASSERT_EQUAL(OUString("12"), rNode3.GetTextNode()->GetText()); + + // delete the first row + pWrtShell->DeleteRow(); + + // This was empty (cursor jumped in the start of the document instead of + // the next not deleted row) + SwNode& rNode4 = pWrtShell->GetCursor()->GetPoint()->GetNode(); + CPPUNIT_ASSERT_EQUAL(OUString("Row 3"), rNode4.GetTextNode()->GetText()); + + // Check skipping previous lines + + // restore deleted rows + dispatchCommand(mxComponent, ".uno:Undo", {}); + dispatchCommand(mxComponent, ".uno:Undo", {}); + Scheduler::ProcessEventsToIdle(); + SwNode& rNode5 = pWrtShell->GetCursor()->GetPoint()->GetNode(); + CPPUNIT_ASSERT_EQUAL(OUString("Row 2"), rNode5.GetTextNode()->GetText()); + + // delete the second row + pWrtShell->DeleteRow(); + SwNode& rNode7 = pWrtShell->GetCursor()->GetPoint()->GetNode(); + CPPUNIT_ASSERT_EQUAL(OUString("Row 3"), rNode7.GetTextNode()->GetText()); + + // delete the third, i.e. last row + pWrtShell->DeleteRow(); + SwNode& rNode8 = pWrtShell->GetCursor()->GetPoint()->GetNode(); + + // This was empty (cursor jumped in the start of the document instead of + // the previous not deleted row) + CPPUNIT_ASSERT_EQUAL(OUString("12"), rNode8.GetTextNode()->GetText()); +} + CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf132603) { createSwDoc(); diff --git a/sw/source/core/frmedt/fetab.cxx b/sw/source/core/frmedt/fetab.cxx index ef6f558ca8aa..35655febd031 100644 --- a/sw/source/core/frmedt/fetab.cxx +++ b/sw/source/core/frmedt/fetab.cxx @@ -416,6 +416,16 @@ bool SwFEShell::DeleteRow(bool bCompleteTable) } SwTableBox* pNextBox = pDelLine->FindNextBox( pTableNd->GetTable(), pDelBox ); + // skip deleted lines in Hide Changes mode with enabled change tracking + if ( bRecordAndHideChanges ) + { + SwRedlineTable::size_type nRedlinePos = 0; + while( pNextBox && pNextBox->GetUpper()->IsDeleted(nRedlinePos) ) + pNextBox = pNextBox->GetUpper()->FindNextBox( pTableNd->GetTable(), + pNextBox->GetUpper()->GetTabBoxes().back() ); + } + + // skip protected cells while( pNextBox && pNextBox->GetFrameFormat()->GetProtect().IsContentProtected() ) pNextBox = pNextBox->FindNextBox( pTableNd->GetTable(), pNextBox ); @@ -428,6 +438,19 @@ bool SwFEShell::DeleteRow(bool bCompleteTable) pDelBox = pDelBox->GetTabLines()[0]->GetTabBoxes()[0]; pNextBox = pDelLine->FindPreviousBox( pTableNd->GetTable(), pDelBox ); + // skip previous deleted lines in Hide Changes mode with enabled change tracking + if ( bRecordAndHideChanges ) + { + SwRedlineTable::size_type nRedlinePos = 0; + while( pNextBox && pNextBox->GetUpper()->IsDeleted(nRedlinePos) ) + { + pNextBox = pNextBox->GetUpper()->FindPreviousBox( pTableNd->GetTable(), + pNextBox->GetUpper()->GetTabBoxes()[0] ); + nRedlinePos = 0; + } + } + + // skip previous protected cells while( pNextBox && pNextBox->GetFrameFormat()->GetProtect().IsContentProtected() ) pNextBox = pNextBox->FindPreviousBox( pTableNd->GetTable(), pNextBox );