summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorLuboš Luňák <l.lunak@collabora.com>2022-03-03 12:21:27 +0100
committerLuboš Luňák <l.lunak@collabora.com>2022-03-23 09:09:06 +0100
commit569a0d55d15cc21bcdadb34697efa7e00216d159 (patch)
treed69f3732706d5dd75b7898dd05f084fdaad2cec8 /sc
parent0d4ffe2269f0ec541898a3a9d3e4a8d0018fa101 (diff)
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.lunak@collabora.com>
Diffstat (limited to 'sc')
-rw-r--r--sc/qa/unit/mark_test.cxx32
-rw-r--r--sc/source/core/data/markdata.cxx13
-rw-r--r--sc/source/ui/Accessibility/AccessibleDocument.cxx1
-rw-r--r--sc/source/ui/Accessibility/AccessibleSpreadsheet.cxx1
-rw-r--r--sc/source/ui/unoobj/cellsuno.cxx4
5 files changed, 42 insertions, 9 deletions
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 913a2984421f..2999c7928e8d 100644
--- a/sc/source/ui/Accessibility/AccessibleDocument.cxx
+++ b/sc/source/ui/Accessibility/AccessibleDocument.cxx
@@ -2117,7 +2117,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 03a2700d0ec5..66f7056cbee3 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 542bfd6c5954..532e675ad08b 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;