diff options
author | László Németh <nemeth@numbertext.org> | 2020-11-30 18:26:43 +0100 |
---|---|---|
committer | László Németh <nemeth@numbertext.org> | 2020-12-01 10:12:34 +0100 |
commit | b18c7096af799e49bc27771cd1500c4eff6bb780 (patch) | |
tree | 19f17ca146962d1c3f3a613d098d3aaeb7f962d5 /sc | |
parent | bc833c71cda6595897277013b1ee6273c6296219 (diff) |
Revert "Revert "tdf#138483 sc: update red circles after merging cells""
This reverts commit 210ec3ef966b2f9206e9e52781f4cb9d2ed46300.
Reason for revert:
Build error has been solved in
commit b208621f4ac5dc1ae40cb853f8662e8b10434cdc
(Missing include (for ScMergeFlagAttr))
Change-Id: Ifc82872dd6e71c106d7ded69ca17d2ae2ba251db
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/106829
Tested-by: Jenkins
Reviewed-by: László Németh <nemeth@numbertext.org>
Diffstat (limited to 'sc')
-rw-r--r-- | sc/qa/unit/data/ods/updateCircleInMergedCell.ods | bin | 0 -> 8689 bytes | |||
-rw-r--r-- | sc/qa/unit/subsequent_filters-test.cxx | 35 | ||||
-rw-r--r-- | sc/source/core/tool/detfunc.cxx | 9 | ||||
-rw-r--r-- | sc/source/ui/docshell/docfunc.cxx | 8 | ||||
-rw-r--r-- | sc/source/ui/inc/docfunc.hxx | 3 |
5 files changed, 51 insertions, 4 deletions
diff --git a/sc/qa/unit/data/ods/updateCircleInMergedCell.ods b/sc/qa/unit/data/ods/updateCircleInMergedCell.ods Binary files differnew file mode 100644 index 000000000000..93be82487e22 --- /dev/null +++ b/sc/qa/unit/data/ods/updateCircleInMergedCell.ods diff --git a/sc/qa/unit/subsequent_filters-test.cxx b/sc/qa/unit/subsequent_filters-test.cxx index 9c087549ec3e..2ef3cf4fb326 100644 --- a/sc/qa/unit/subsequent_filters-test.cxx +++ b/sc/qa/unit/subsequent_filters-test.cxx @@ -65,6 +65,8 @@ #include <stlpool.hxx> #include <hints.hxx> #include <detfunc.hxx> +#include <cellmergeoption.hxx> +#include <undoblk.hxx> #include <orcusfilters.hxx> #include <filter.hxx> @@ -102,6 +104,7 @@ public: virtual void tearDown() override; //ods, xls, xlsx filter tests + void testUpdateCircleInMergedCellODS(); void testDeleteCircleInMergedCellODS(); void testBooleanFormatXLSX(); void testBasicCellContentODS(); @@ -292,6 +295,7 @@ public: void testDeleteCirclesInRowAndCol(); CPPUNIT_TEST_SUITE(ScFiltersTest); + CPPUNIT_TEST(testUpdateCircleInMergedCellODS); CPPUNIT_TEST(testDeleteCircleInMergedCellODS); CPPUNIT_TEST(testBooleanFormatXLSX); CPPUNIT_TEST(testBasicCellContentODS); @@ -526,6 +530,37 @@ void testRangeNameImpl(const ScDocument& rDoc) } +void ScFiltersTest::testUpdateCircleInMergedCellODS() +{ + ScDocShellRef xDocSh = loadDoc("updateCircleInMergedCell.", FORMAT_ODS); + CPPUNIT_ASSERT_MESSAGE("Failed to load updateCircleInMergedCell.ods", xDocSh.is()); + + ScDocument& rDoc = xDocSh->GetDocument(); + rDoc.EnableChangeReadOnly(true); + + ScDrawLayer* pDrawLayer = rDoc.GetDrawLayer(); + SdrPage* pPage = pDrawLayer->GetPage(0); + CPPUNIT_ASSERT_MESSAGE("draw page for sheet 1 should exist.", pPage); + + // There should be four circle objects! + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(4), pPage->GetObjCount()); + + ScCellMergeOption aCellMergeOption(0,0,1,1); // A1:B2 + aCellMergeOption.maTabs.insert(0); + xDocSh->GetDocFunc().MergeCells(aCellMergeOption, false, true, true, false); + + // There should be a circle object! + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), pPage->GetObjCount()); + + std::unique_ptr<ScUndoRemoveMerge> pUndoRemoveMerge; + xDocSh->GetDocFunc().UnmergeCells(aCellMergeOption, true, pUndoRemoveMerge.get()); + + // There should be four circle objects! + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(4), pPage->GetObjCount()); + + xDocSh->DoClose(); +} + void ScFiltersTest::testDeleteCircleInMergedCellODS() { ScDocShellRef xDocSh = loadDoc("deleteCircleInMergedCell.", FORMAT_ODS); diff --git a/sc/source/core/tool/detfunc.cxx b/sc/source/core/tool/detfunc.cxx index be4d3e01e02c..f2d8f8254d20 100644 --- a/sc/source/core/tool/detfunc.cxx +++ b/sc/source/core/tool/detfunc.cxx @@ -1382,13 +1382,15 @@ bool ScDetectiveFunc::MarkInvalid(bool& rOverflow) if ( bMarkEmpty ) for ( nRow = nNextRow; nRow < nCellRow && nInsCount < SC_DET_MAXCIRCLE; nRow++ ) { - DrawCircle( nCol, nRow, aData ); + if(!pPattern->GetItem(ATTR_MERGE_FLAG).IsOverlapped()) + DrawCircle( nCol, nRow, aData ); ++nInsCount; } ScRefCellValue aCell = aCellIter.getRefCellValue(); if (!pData->IsDataValid(aCell, aCellIter.GetPos())) { - DrawCircle( nCol, nCellRow, aData ); + if(!pPattern->GetItem(ATTR_MERGE_FLAG).IsOverlapped()) + DrawCircle( nCol, nCellRow, aData ); ++nInsCount; } nNextRow = nCellRow + 1; @@ -1396,7 +1398,8 @@ bool ScDetectiveFunc::MarkInvalid(bool& rOverflow) if ( bMarkEmpty ) for ( nRow = nNextRow; nRow <= nRow2 && nInsCount < SC_DET_MAXCIRCLE; nRow++ ) { - DrawCircle( nCol, nRow, aData ); + if(!pPattern->GetItem(ATTR_MERGE_FLAG).IsOverlapped()) + DrawCircle(nCol, nRow, aData); ++nInsCount; } } diff --git a/sc/source/ui/docshell/docfunc.cxx b/sc/source/ui/docshell/docfunc.cxx index 755a563cc43a..e05513039d9e 100644 --- a/sc/source/ui/docshell/docfunc.cxx +++ b/sc/source/ui/docshell/docfunc.cxx @@ -5027,6 +5027,10 @@ bool ScDocFunc::MergeCells( const ScCellMergeOption& rOption, bool bContents, bo rDoc.SetDirty(aRange, true); } + bool bDone = ScDetectiveFunc(rDoc, nTab).DeleteAll( ScDetectiveDelete::Circles ); + if(bDone) + DetectiveMarkInvalid(nTab); + bNeedContentsUndo |= bNeedContents; } @@ -5112,6 +5116,10 @@ bool ScDocFunc::UnmergeCells( const ScCellMergeOption& rOption, bool bRecord, Sc if ( !AdjustRowHeight( aExtended ) ) rDocShell.PostPaint( aExtended, PaintPartFlags::Grid ); + + bool bDone = ScDetectiveFunc(rDoc, nTab).DeleteAll( ScDetectiveDelete::Circles ); + if(bDone) + DetectiveMarkInvalid(nTab); } if (bRecord) diff --git a/sc/source/ui/inc/docfunc.hxx b/sc/source/ui/inc/docfunc.hxx index 1984c0da440a..f7b518ef7f35 100644 --- a/sc/source/ui/inc/docfunc.hxx +++ b/sc/source/ui/inc/docfunc.hxx @@ -195,7 +195,8 @@ public: MergeCells( const ScCellMergeOption& rOption, bool bContents, bool bRecord, bool bApi, bool bEmptyMergedCells = false ); bool UnmergeCells( const ScRange& rRange, bool bRecord, ScUndoRemoveMerge* pUndoRemoveMerge ); - bool UnmergeCells( const ScCellMergeOption& rOption, bool bRecord, ScUndoRemoveMerge* pUndoRemoveMerge ); + SC_DLLPUBLIC bool + UnmergeCells( const ScCellMergeOption& rOption, bool bRecord, ScUndoRemoveMerge* pUndoRemoveMerge ); // takes ownership of pNewRanges, nTab = -1 for local range names void SetNewRangeNames( std::unique_ptr<ScRangeName> pNewRanges, bool bModifyDoc, SCTAB nTab ); |