sc/qa/unit/data/ods/deleteCirclesInRowAndCol.ods |binary sc/qa/unit/subsequent_filters-test.cxx | 31 +++++++++++++ sc/source/core/data/drwlayer.cxx | 51 ++++++++++++++--------- 3 files changed, 64 insertions(+), 18 deletions(-)
New commits: commit 0dca9589e0051e41ec29552b3204a57fb14ccebf Author: Tibor Nagy <nagy.tib...@nisz.hu> AuthorDate: Tue Nov 10 14:25:23 2020 +0100 Commit: Gabor Kelemen <kelemen.gab...@nisz.hu> CommitDate: Mon Mar 1 09:50:17 2021 +0100 tdf#41845 sc: delete row/column with validation circles Red validation circles around the cells were left after deleting their rows or columns, showing invalid data on the next valid or not-validated cells. Co-authored-by: Attila Szűcs (NISZ) Change-Id: I0dcef9225696b76eda78f0ee8831a83c20f53b0e Reviewed-on: https://gerrit.libreoffice.org/c/core/+/105527 Tested-by: László Németh <nem...@numbertext.org> Reviewed-by: László Németh <nem...@numbertext.org> (cherry picked from commit d6d8b9c59524cff8effc170c57940700282bf625) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/111585 Tested-by: Gabor Kelemen <kelemen.gab...@nisz.hu> Reviewed-by: Gabor Kelemen <kelemen.gab...@nisz.hu> diff --git a/sc/qa/unit/data/ods/deleteCirclesInRowAndCol.ods b/sc/qa/unit/data/ods/deleteCirclesInRowAndCol.ods new file mode 100644 index 000000000000..6b99787c4b43 Binary files /dev/null and b/sc/qa/unit/data/ods/deleteCirclesInRowAndCol.ods differ diff --git a/sc/qa/unit/subsequent_filters-test.cxx b/sc/qa/unit/subsequent_filters-test.cxx index 91aff833b4b1..6d400cb7371f 100644 --- a/sc/qa/unit/subsequent_filters-test.cxx +++ b/sc/qa/unit/subsequent_filters-test.cxx @@ -268,6 +268,7 @@ public: void testTextLengthDataValidityXLSX(); void testDeleteCircles(); void testDrawCircleInMergeCells(); + void testDeleteCirclesInRowAndCol(); CPPUNIT_TEST_SUITE(ScFiltersTest); CPPUNIT_TEST(testBooleanFormatXLSX); @@ -423,6 +424,7 @@ public: CPPUNIT_TEST(testTextLengthDataValidityXLSX); CPPUNIT_TEST(testDeleteCircles); CPPUNIT_TEST(testDrawCircleInMergeCells); + CPPUNIT_TEST(testDeleteCirclesInRowAndCol); CPPUNIT_TEST_SUITE_END(); @@ -4735,6 +4737,35 @@ void ScFiltersTest::testDrawCircleInMergeCells() xDocSh->DoClose(); } +void ScFiltersTest::testDeleteCirclesInRowAndCol() +{ + ScDocShellRef xDocSh = loadDoc("deleteCirclesInRowAndCol.", FORMAT_ODS); + CPPUNIT_ASSERT_MESSAGE("Failed to load deleteCirclesInRowAndCol.ods", xDocSh.is()); + + ScDocument& rDoc = xDocSh->GetDocument(); + + ScDrawLayer* pDrawLayer = rDoc.GetDrawLayer(); + SdrPage* pPage = pDrawLayer->GetPage(0); + CPPUNIT_ASSERT_MESSAGE("draw page for sheet 1 should exist.", pPage); + + // There should be 6 circle objects! + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(6), pPage->GetObjCount()); + + // Delete first row (1023 = MAXCOLS) + pDrawLayer->DeleteObjectsInArea(0,0,0,1023,0,true); + + // There should be 3 circle objects! + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), pPage->GetObjCount()); + + // Delete first col (1048575 = MAXROWS) + pDrawLayer->DeleteObjectsInArea(0,0,0,0,1048575,true); + + // There should not be a circle object! + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), pPage->GetObjCount()); + + xDocSh->DoClose(); +} + ScFiltersTest::ScFiltersTest() : ScBootstrapFixture( "sc/qa/unit/data" ) { diff --git a/sc/source/core/data/drwlayer.cxx b/sc/source/core/data/drwlayer.cxx index 76a79a00b060..2da197750608 100644 --- a/sc/source/core/data/drwlayer.cxx +++ b/sc/source/core/data/drwlayer.cxx @@ -1372,37 +1372,53 @@ void ScDrawLayer::DeleteObjectsInArea( SCTAB nTab, SCCOL nCol1,SCROW nRow1, pPage->RecalcObjOrdNums(); const size_t nObjCount = pPage->GetObjCount(); - if (nObjCount) - { - size_t nDelCount = 0; - tools::Rectangle aDelRect = pDoc->GetMMRect( nCol1, nRow1, nCol2, nRow2, nTab ); + if (!nObjCount) + return; - std::unique_ptr<SdrObject*[]> ppObj(new SdrObject*[nObjCount]); + size_t nDelCount = 0; + tools::Rectangle aDelRect = pDoc->GetMMRect( nCol1, nRow1, nCol2, nRow2, nTab ); + tools::Rectangle aDelCircle = pDoc->GetMMRect( nCol1, nRow1, nCol2, nRow2, nTab ); + aDelCircle.AdjustLeft(-250); + aDelCircle.AdjustRight(250); + aDelCircle.AdjustTop(-70); + aDelCircle.AdjustBottom(70); - SdrObjListIter aIter( pPage, SdrIterMode::Flat ); - SdrObject* pObject = aIter.Next(); - while (pObject) + std::unique_ptr<SdrObject*[]> ppObj(new SdrObject*[nObjCount]); + + SdrObjListIter aIter( pPage, SdrIterMode::Flat ); + SdrObject* pObject = aIter.Next(); + while (pObject) + { + // do not delete note caption, they are always handled by the cell note + // TODO: detective objects are still deleted, is this desired? + if (!IsNoteCaption( pObject )) { - // do not delete note caption, they are always handled by the cell note - // TODO: detective objects are still deleted, is this desired? - if (!IsNoteCaption( pObject )) + tools::Rectangle aObjRect; + ScDrawObjData* pObjData = ScDrawLayer::GetObjData(pObject); + if (pObjData && pObjData->meType == ScDrawObjData::ValidationCircle) + { + aObjRect = pObject->GetLogicRect(); + if(aDelCircle.IsInside(aObjRect)) + ppObj[nDelCount++] = pObject; + } + else { - tools::Rectangle aObjRect = pObject->GetCurrentBoundRect(); + aObjRect = pObject->GetCurrentBoundRect(); if (aDelRect.IsInside(aObjRect)) { if (bAnchored) { ScAnchorType aAnchorType = ScDrawLayer::GetAnchorType(*pObject); - if(aAnchorType == SCA_CELL || aAnchorType == SCA_CELL_RESIZE) + if (aAnchorType == SCA_CELL || aAnchorType == SCA_CELL_RESIZE) ppObj[nDelCount++] = pObject; } - else - ppObj[nDelCount++] = pObject; + else + ppObj[nDelCount++] = pObject; } } - - pObject = aIter.Next(); } + pObject = aIter.Next(); + } if (bRecording) for (size_t i=1; i<=nDelCount; ++i) @@ -1410,7 +1426,6 @@ void ScDrawLayer::DeleteObjectsInArea( SCTAB nTab, SCCOL nCol1,SCROW nRow1, for (size_t i=1; i<=nDelCount; ++i) pPage->RemoveObject( ppObj[nDelCount-i]->GetOrdNum() ); - } } void ScDrawLayer::DeleteObjectsInSelection( const ScMarkData& rMark ) _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits