sc/qa/unit/rangelst_test.cxx | 34 ++++++++++++++++++++++++++++++++++ sc/source/core/tool/rangelst.cxx | 12 ++++++++---- 2 files changed, 42 insertions(+), 4 deletions(-)
New commits: commit 596efaad51735a130e7b7bd27dbc34dc07f32f68 Author: Tor Lillqvist <t...@collabora.com> Date: Thu Sep 14 21:11:27 2017 +0300 Handle also the case where a range extends an existing one with overlap Check for a new range being joined Extending an existing one in any of four directions (up, right, down, left), within a tab (sheet), that is. And add unit test for this. Change-Id: I4bd0525c2837f8b4b9d5a8967e0d5d661c6a5e2f Reviewed-on: https://gerrit.libreoffice.org/42304 Reviewed-by: Eike Rathke <er...@redhat.com> Tested-by: Eike Rathke <er...@redhat.com> diff --git a/sc/qa/unit/rangelst_test.cxx b/sc/qa/unit/rangelst_test.cxx index 0f61bcad4971..79c57364e209 100644 --- a/sc/qa/unit/rangelst_test.cxx +++ b/sc/qa/unit/rangelst_test.cxx @@ -45,6 +45,7 @@ public: void testJoin_Case1(); void testJoin_Case2(); void testJoin_Case3(); + void testJoin_Case4(); void testGetIntersectedRange(); void testUpdateReference_DeleteRow(); @@ -74,6 +75,7 @@ public: CPPUNIT_TEST(testJoin_Case1); CPPUNIT_TEST(testJoin_Case2); CPPUNIT_TEST(testJoin_Case3); + CPPUNIT_TEST(testJoin_Case4); CPPUNIT_TEST(testUpdateReference_DeleteRow); CPPUNIT_TEST(testUpdateReference_DeleteLastRow); CPPUNIT_TEST(testUpdateReference_DeleteCol); @@ -447,6 +449,38 @@ void Test::testJoin_Case3() CPPUNIT_ASSERT_EQUAL(ScRange(8,8,0,9,9,0), *aList[1]); } +void Test::testJoin_Case4() +{ + ScRangeList aList; + aList.Join(ScRange(1,1,0,2,6,0)); + // Join a range that overlaps it and extends it vertically + aList.Join(ScRange(1,4,0,2,8,0)); + + // The one range in the list should have been extended + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), aList.size()); + CPPUNIT_ASSERT_EQUAL(ScRange(1,1,0,2,8,0), *aList[0]); + + // Join a range that overlaps it and extends it horizontally + aList.Join(ScRange(2,1,0,4,8,0)); + + // Again, should have just been extended + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), aList.size()); + CPPUNIT_ASSERT_EQUAL(ScRange(1,1,0,4,8,0), *aList[0]); + + // And then the same but on top / to the left of existing range + ScRangeList aList2; + aList2.Join(ScRange(4,4,0,8,8,0)); + aList2.Join(ScRange(4,1,0,8,6,0)); + + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), aList2.size()); + CPPUNIT_ASSERT_EQUAL(ScRange(4,1,0,8,8,0), *aList2[0]); + + aList2.Join(ScRange(1,1,0,6,8,0)); + + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), aList2.size()); + CPPUNIT_ASSERT_EQUAL(ScRange(1,1,0,8,8,0), *aList2[0]); +} + void Test::testUpdateReference_DeleteRow() { ScRangeList aList(ScRange(1,1,0,4,4,0)); diff --git a/sc/source/core/tool/rangelst.cxx b/sc/source/core/tool/rangelst.cxx index b45a12c3cf38..5daf4e547db3 100644 --- a/sc/source/core/tool/rangelst.cxx +++ b/sc/source/core/tool/rangelst.cxx @@ -286,12 +286,14 @@ void ScRangeList::Join( const ScRange& r, bool bIsInList ) { // 2D if ( p->aStart.Col() == nCol1 && p->aEnd.Col() == nCol2 ) { - if ( p->aStart.Row() == nRow2+1 ) + if ( p->aStart.Row() <= nRow2+1 && + p->aStart.Row() >= nRow1 ) { // top p->aStart.SetRow( nRow1 ); bJoined = true; } - else if ( p->aEnd.Row() == nRow1-1 ) + else if ( p->aEnd.Row() >= nRow1-1 && + p->aEnd.Row() <= nRow2 ) { // bottom p->aEnd.SetRow( nRow2 ); bJoined = true; @@ -299,12 +301,14 @@ void ScRangeList::Join( const ScRange& r, bool bIsInList ) } else if ( p->aStart.Row() == nRow1 && p->aEnd.Row() == nRow2 ) { - if ( p->aStart.Col() == nCol2+1 ) + if ( p->aStart.Col() <= nCol2+1 && + p->aStart.Col() >= nCol1 ) { // left p->aStart.SetCol( nCol1 ); bJoined = true; } - else if ( p->aEnd.Col() == nCol1-1 ) + else if ( p->aEnd.Col() >= nCol1-1 && + p->aEnd.Col() <= nCol2 ) { // right p->aEnd.SetCol( nCol2 ); bJoined = true; _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits