[Libreoffice-commits] core.git: sc/qa sc/source

László Németh (via logerrit) logerrit at kemper.freedesktop.org
Tue Dec 1 09:13:18 UTC 2020


 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 <nemeth at numbertext.org>
AuthorDate: Mon Nov 30 18:26:43 2020 +0100
Commit:     László Németh <nemeth at 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 <nemeth at 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 );


More information about the Libreoffice-commits mailing list