sc/qa/unit/data/ods/updateCircleInMergedCell.ods |binary sc/qa/unit/subsequent_filters-test.cxx | 35 +++++++++++++++++++++++ sc/source/core/tool/detfunc.cxx | 9 +++-- sc/source/ui/docshell/docfunc.cxx | 8 +++++ sc/source/ui/inc/docfunc.hxx | 3 + 5 files changed, 51 insertions(+), 4 deletions(-)
New commits: commit b18c7096af799e49bc27771cd1500c4eff6bb780 Author: László Németh <nem...@numbertext.org> AuthorDate: Mon Nov 30 18:26:43 2020 +0100 Commit: László Németh <nem...@numbertext.org> CommitDate: Tue Dec 1 10:12:34 2020 +0100 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 <nem...@numbertext.org> diff --git a/sc/qa/unit/data/ods/updateCircleInMergedCell.ods b/sc/qa/unit/data/ods/updateCircleInMergedCell.ods new file mode 100644 index 000000000000..93be82487e22 Binary files /dev/null and b/sc/qa/unit/data/ods/updateCircleInMergedCell.ods differ 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 ); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits