sc/qa/unit/mark_test.cxx | 32 +++++++++++++++++++ sc/source/core/data/markdata.cxx | 13 +++++-- sc/source/ui/Accessibility/AccessibleDocument.cxx | 1 sc/source/ui/Accessibility/AccessibleSpreadsheet.cxx | 1 sc/source/ui/unoobj/cellsuno.cxx | 4 -- 5 files changed, 42 insertions(+), 9 deletions(-)
New commits: commit 19e3644eaf8f3f09c22c94e4ad8352f844fc4955 Author: Luboš Luňák <l.lu...@collabora.com> AuthorDate: Thu Mar 3 12:21:27 2022 +0100 Commit: Luboš Luňák <l.lu...@collabora.com> CommitDate: Thu Mar 3 22:37:49 2022 +0100 make ScMarkData::IsAllMarked() work also for simple marks Change-Id: I41009c83827619605b4cfc4909f1d9922cde68a9 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/130923 Tested-by: Jenkins Reviewed-by: Luboš Luňák <l.lu...@collabora.com> diff --git a/sc/qa/unit/mark_test.cxx b/sc/qa/unit/mark_test.cxx index 309a62143aff..55a13cb0da57 100644 --- a/sc/qa/unit/mark_test.cxx +++ b/sc/qa/unit/mark_test.cxx @@ -112,6 +112,8 @@ public: void testScMarkArraySearch(); + void testIsAllMarked(); + CPPUNIT_TEST_SUITE(Test); CPPUNIT_TEST(testSimpleMark_Simple); CPPUNIT_TEST(testSimpleMark_Column); @@ -123,6 +125,7 @@ public: CPPUNIT_TEST(testDeleteTabBeforeSelected); CPPUNIT_TEST(testDeleteTabAfterSelected); CPPUNIT_TEST(testScMarkArraySearch); + CPPUNIT_TEST(testIsAllMarked); CPPUNIT_TEST_SUITE_END(); private: @@ -970,6 +973,35 @@ void Test::testScMarkArraySearch() } } +void Test::testIsAllMarked() +{ + ScSheetLimits aSheetLimits(MAXCOL, MAXROW); + ScMarkData mark(aSheetLimits); + ScRange range1( ScAddress( 5, 10, 0 ), ScAddress( 15, 20, 0 )); + ScRange range2( ScAddress( 2, 2, 0 ), ScAddress( 25, 30, 0 )); + CPPUNIT_ASSERT( !mark.IsAllMarked( range1 )); + CPPUNIT_ASSERT( !mark.IsAllMarked( range2 )); + mark.MarkToMulti(); + CPPUNIT_ASSERT( !mark.IsAllMarked( range1 )); + CPPUNIT_ASSERT( !mark.IsAllMarked( range2 )); + + mark.ResetMark(); + mark.SetMarkArea( range1 ); + CPPUNIT_ASSERT( mark.IsAllMarked( range1 )); + CPPUNIT_ASSERT( !mark.IsAllMarked( range2 )); + mark.MarkToMulti(); + CPPUNIT_ASSERT( mark.IsAllMarked( range1 )); + CPPUNIT_ASSERT( !mark.IsAllMarked( range2 )); + + mark.ResetMark(); + mark.SetMarkArea( range2 ); + CPPUNIT_ASSERT( mark.IsAllMarked( range1 )); + CPPUNIT_ASSERT( mark.IsAllMarked( range2 )); + mark.MarkToMulti(); + CPPUNIT_ASSERT( mark.IsAllMarked( range1 )); + CPPUNIT_ASSERT( mark.IsAllMarked( range2 )); +} + CPPUNIT_TEST_SUITE_REGISTRATION(Test); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sc/source/core/data/markdata.cxx b/sc/source/core/data/markdata.cxx index 2b3f948d8803..596937e24346 100644 --- a/sc/source/core/data/markdata.cxx +++ b/sc/source/core/data/markdata.cxx @@ -564,13 +564,20 @@ std::vector<sc::ColRowSpan> ScMarkData::GetMarkedColSpans() const bool ScMarkData::IsAllMarked( const ScRange& rRange ) const { - if ( !bMultiMarked ) - return false; - SCCOL nStartCol = rRange.aStart.Col(); SCROW nStartRow = rRange.aStart.Row(); SCCOL nEndCol = rRange.aEnd.Col(); SCROW nEndRow = rRange.aEnd.Row(); + + if ( !bMultiMarked ) + { + if ( bMarked && !bMarkIsNeg && + aMarkRange.aStart.Col() <= nStartCol && aMarkRange.aEnd.Col() >= nEndCol && + aMarkRange.aStart.Row() <= nStartRow && aMarkRange.aEnd.Row() >= nEndRow ) + return true; + return false; + } + bool bOk = true; if ( nStartCol == 0 && nEndCol == mrSheetLimits.mnMaxCol ) diff --git a/sc/source/ui/Accessibility/AccessibleDocument.cxx b/sc/source/ui/Accessibility/AccessibleDocument.cxx index 21e3d1813a77..251bba490f87 100644 --- a/sc/source/ui/Accessibility/AccessibleDocument.cxx +++ b/sc/source/ui/Accessibility/AccessibleDocument.cxx @@ -2114,7 +2114,6 @@ bool ScAccessibleDocument::IsTableSelected() const SCTAB nTab(getVisibleTable()); //#103800#; use a copy of MarkData ScMarkData aMarkData(mpViewShell->GetViewData().GetMarkData()); - aMarkData.MarkToMulti(); ScDocument* pDoc = GetDocument(); if (aMarkData.IsAllMarked( ScRange( 0, 0, nTab, pDoc->MaxCol(), pDoc->MaxRow(), nTab))) bResult = true; diff --git a/sc/source/ui/Accessibility/AccessibleSpreadsheet.cxx b/sc/source/ui/Accessibility/AccessibleSpreadsheet.cxx index f8399b68918a..8abbe1f7b967 100644 --- a/sc/source/ui/Accessibility/AccessibleSpreadsheet.cxx +++ b/sc/source/ui/Accessibility/AccessibleSpreadsheet.cxx @@ -1357,7 +1357,6 @@ bool ScAccessibleSpreadsheet::IsCompleteSheetSelected() { //#103800#; use a copy of MarkData ScMarkData aMarkData(mpViewShell->GetViewData().GetMarkData()); - aMarkData.MarkToMulti(); if (aMarkData.IsAllMarked(maRange)) bResult = true; } diff --git a/sc/source/ui/unoobj/cellsuno.cxx b/sc/source/ui/unoobj/cellsuno.cxx index 46d4b188053d..b7b5b4dce748 100644 --- a/sc/source/ui/unoobj/cellsuno.cxx +++ b/sc/source/ui/unoobj/cellsuno.cxx @@ -3657,7 +3657,6 @@ uno::Reference<sheet::XSheetCellRanges> SAL_CALL ScCellRangesBase::queryPreceden // aMarkData uses aNewRanges, not aRanges, so GetMarkData can't be used ScMarkData aMarkData(rDoc.GetSheetLimits()); aMarkData.MarkFromRangeList( aNewRanges, false ); - aMarkData.MarkToMulti(); // needed for IsAllMarked for (size_t nR = 0, nCount = aNewRanges.size(); nR<nCount; ++nR) { @@ -3706,7 +3705,6 @@ uno::Reference<sheet::XSheetCellRanges> SAL_CALL ScCellRangesBase::queryDependen // aMarkData uses aNewRanges, not aRanges, so GetMarkData can't be used ScMarkData aMarkData(rDoc.GetSheetLimits()); aMarkData.MarkFromRangeList( aNewRanges, false ); - aMarkData.MarkToMulti(); // needed for IsAllMarked SCTAB nTab = lcl_FirstTab(aNewRanges); //! all tables @@ -4285,7 +4283,6 @@ static bool lcl_FindRangeOrEntry( const std::vector<ScCellRangesObj::ScNamedEntr { ScMarkData aMarkData(pDocSh->GetDocument().GetSheetLimits()); aMarkData.MarkFromRangeList( rRanges, false ); - aMarkData.MarkToMulti(); // needed for IsAllMarked if ( aMarkData.IsAllMarked( aCellRange ) ) { rFound = aCellRange; @@ -4303,7 +4300,6 @@ static bool lcl_FindRangeOrEntry( const std::vector<ScCellRangesObj::ScNamedEntr const ScRange& rComp = rNamedEntry.GetRange(); ScMarkData aMarkData(pDocSh->GetDocument().GetSheetLimits()); aMarkData.MarkFromRangeList( rRanges, false ); - aMarkData.MarkToMulti(); // needed for IsAllMarked if ( aMarkData.IsAllMarked( rComp ) ) { rFound = rComp;