[Libreoffice-commits] core.git: sc/qa sc/source
Tibor Nagy (via logerrit)
logerrit at kemper.freedesktop.org
Fri Nov 20 14:21:59 UTC 2020
sc/qa/unit/data/ods/deleteCirclesInRowAndCol.ods |binary
sc/qa/unit/subsequent_filters-test.cxx | 31 +++++++++++++++++++++++
sc/source/core/data/drwlayer.cxx | 30 +++++++++++++++++-----
3 files changed, 54 insertions(+), 7 deletions(-)
New commits:
commit d6d8b9c59524cff8effc170c57940700282bf625
Author: Tibor Nagy <nagy.tibor2 at nisz.hu>
AuthorDate: Tue Nov 10 14:25:23 2020 +0100
Commit: László Németh <nemeth at numbertext.org>
CommitDate: Fri Nov 20 15:21:16 2020 +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 <nemeth at numbertext.org>
Reviewed-by: László Németh <nemeth at numbertext.org>
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 695163908da8..af64711856a6 100644
--- a/sc/qa/unit/subsequent_filters-test.cxx
+++ b/sc/qa/unit/subsequent_filters-test.cxx
@@ -289,6 +289,7 @@ public:
void testTextLengthDataValidityXLSX();
void testDeleteCircles();
void testDrawCircleInMergeCells();
+ void testDeleteCirclesInRowAndCol();
CPPUNIT_TEST_SUITE(ScFiltersTest);
CPPUNIT_TEST(testBooleanFormatXLSX);
@@ -465,6 +466,7 @@ public:
CPPUNIT_TEST(testTextLengthDataValidityXLSX);
CPPUNIT_TEST(testDeleteCircles);
CPPUNIT_TEST(testDrawCircleInMergeCells);
+ CPPUNIT_TEST(testDeleteCirclesInRowAndCol);
CPPUNIT_TEST_SUITE_END();
@@ -5163,6 +5165,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 5e7f367d6445..3901434df913 100644
--- a/sc/source/core/data/drwlayer.cxx
+++ b/sc/source/core/data/drwlayer.cxx
@@ -1522,6 +1522,11 @@ void ScDrawLayer::DeleteObjectsInArea( SCTAB nTab, SCCOL nCol1,SCROW nRow1,
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);
std::unique_ptr<SdrObject*[]> ppObj(new SdrObject*[nObjCount]);
@@ -1533,17 +1538,28 @@ void ScDrawLayer::DeleteObjectsInArea( SCTAB nTab, SCCOL nCol1,SCROW nRow1,
// TODO: detective objects are still deleted, is this desired?
if (!IsNoteCaption( pObject ))
{
- tools::Rectangle aObjRect = pObject->GetCurrentBoundRect();
- if (aDelRect.IsInside(aObjRect))
+ 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
{
- if (bAnchored)
+ aObjRect = pObject->GetCurrentBoundRect();
+ if (aDelRect.IsInside(aObjRect))
{
- ScAnchorType aAnchorType = ScDrawLayer::GetAnchorType(*pObject);
- if(aAnchorType == SCA_CELL || aAnchorType == SCA_CELL_RESIZE)
+ if (bAnchored)
+ {
+ ScAnchorType aAnchorType = ScDrawLayer::GetAnchorType(*pObject);
+ if (aAnchorType == SCA_CELL || aAnchorType == SCA_CELL_RESIZE)
+ ppObj[nDelCount++] = pObject;
+ }
+ else
ppObj[nDelCount++] = pObject;
}
- else
- ppObj[nDelCount++] = pObject;
}
}
More information about the Libreoffice-commits
mailing list