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;

Reply via email to