diff options
author | Tibor Nagy <nagy.tibor2@nisz.hu> | 2023-07-13 14:54:55 +0200 |
---|---|---|
committer | László Németh <nemeth@numbertext.org> | 2023-07-25 14:12:34 +0200 |
commit | e384be0f6ea6453e57cd4a7c4402d26b49debc41 (patch) | |
tree | 00f31092a8b8ba79045d51bd84eb40410f10288c | |
parent | tdf#156354 - Fix UI Basic dialog contents not visible in preview mode (diff) | |
download | core-e384be0f6ea6453e57cd4a7c4402d26b49debc41.tar.gz core-e384be0f6ea6453e57cd4a7c4402d26b49debc41.zip |
tdf#99808 sc: fix background of conditional formatting in merged cell
The background color of conditional formatting is applied only to the
first cell in the merged block, at least under Windows.
Note: Undo/Redo is still not perfect, at least under Linux.
Change-Id: Ic87983fa6e3279a64841babc565fbe97710ff730
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/154390
Tested-by: László Németh <nemeth@numbertext.org>
Reviewed-by: László Németh <nemeth@numbertext.org>
-rw-r--r-- | sc/qa/unit/ucalc_condformat.cxx | 54 | ||||
-rw-r--r-- | sc/source/ui/docshell/docfunc.cxx | 2 |
2 files changed, 55 insertions, 1 deletions
diff --git a/sc/qa/unit/ucalc_condformat.cxx b/sc/qa/unit/ucalc_condformat.cxx index 634373b58ccc..6b79a4318501 100644 --- a/sc/qa/unit/ucalc_condformat.cxx +++ b/sc/qa/unit/ucalc_condformat.cxx @@ -12,6 +12,7 @@ #include <conditio.hxx> #include <colorscale.hxx> +#include <hints.hxx> #include <globstr.hrc> #include <scresid.hxx> #include <docfunc.hxx> @@ -25,6 +26,23 @@ namespace { +struct PaintListener : public SfxListener +{ + bool mbPaintAllMergedCell = false; + virtual void Notify(SfxBroadcaster& /*rBC*/, const SfxHint& rHint) override + { + const ScPaintHint* pPaintHint = dynamic_cast<const ScPaintHint*>(&rHint); + if (pPaintHint) + { + if (pPaintHint->GetStartCol() == 0 && pPaintHint->GetEndCol() == 0 + && pPaintHint->GetStartRow() == 0 && pPaintHint->GetEndRow() == 1) + { + mbPaintAllMergedCell = true; + } + } + } +}; + struct ScDataBarLengthData { double nVal; @@ -1361,6 +1379,42 @@ CPPUNIT_TEST_FIXTURE(TestCondformat, testCondFormatVolatileFunctionRecalc) m_pDoc->DeleteTab(0); } +CPPUNIT_TEST_FIXTURE(TestCondformat, testConditionStyleInMergedCell) +{ + m_pDoc->InsertTab(0, "Test"); + + PaintListener aListener; + aListener.StartListening(*m_xDocShell); + + m_pDoc->DoMerge(0, 0, 0, 1, 0); // A1:A2 + CPPUNIT_ASSERT(m_pDoc->IsMerged(ScAddress(0, 0, 0))); + + m_pDoc->SetValue(ScAddress(0, 0, 0), 1.0); + + // Add a conditional format. + auto pFormat = std::make_unique<ScConditionalFormat>(1, m_pDoc); + pFormat->SetRange(ScRange(0, 0, 0, 0, 0, 0)); + auto pFormatTmp = pFormat.get(); + sal_uLong nKey = m_pDoc->AddCondFormat(std::move(pFormat), 0); + + // Add condition in which if the value equals 1, set the "Good" style. + ScCondFormatEntry* pEntry = new ScCondFormatEntry( + ScConditionMode::Equal, "=1", "", *m_pDoc, ScAddress(0, 0, 0), ScResId(STR_STYLENAME_GOOD)); + pFormatTmp->AddEntry(pEntry); + + // Apply the format to the range. + m_pDoc->AddCondFormatData(pFormatTmp->GetRange(), 0, nKey); + + ScDocFunc& rFunc = m_xDocShell->GetDocFunc(); + sal_uInt32 nOldFormat = pFormatTmp->GetKey(); + const ScRangeList& rRangeList = pFormatTmp->GetRange(); + rFunc.ReplaceConditionalFormat(nOldFormat, pFormatTmp->Clone(), 0, rRangeList); + + CPPUNIT_ASSERT_EQUAL(true, aListener.mbPaintAllMergedCell); + + m_pDoc->DeleteTab(0); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/docshell/docfunc.cxx b/sc/source/ui/docshell/docfunc.cxx index 4d99824fe0a0..4d3288558c40 100644 --- a/sc/source/ui/docshell/docfunc.cxx +++ b/sc/source/ui/docshell/docfunc.cxx @@ -5670,7 +5670,7 @@ void ScDocFunc::ReplaceConditionalFormat( sal_uLong nOldFormat, std::unique_ptr< } if(pRepaintRange) - rDocShell.PostPaint(*pRepaintRange, PaintPartFlags::Grid); + rDocShell.PostPaint(*pRepaintRange, PaintPartFlags::Grid, SC_PF_TESTMERGE); aModificator.SetDocumentModified(); SfxGetpApp()->Broadcast(SfxHint(SfxHintId::ScAreasChanged)); |