[Libreoffice-commits] core.git: 2 commits - sc/inc sc/qa sc/source
Libreoffice Gerrit user
logerrit at kemper.freedesktop.org
Sat Jul 14 08:28:24 UTC 2018
sc/inc/conditio.hxx | 7 +++++++
sc/qa/unit/ucalc.hxx | 2 ++
sc/qa/unit/ucalc_condformat.cxx | 38 ++++++++++++++++++++++++++++++++++++++
sc/source/core/data/conditio.cxx | 33 +++++++++++++++++++++++++++++++++
sc/source/core/data/table2.cxx | 2 ++
5 files changed, 82 insertions(+)
New commits:
commit be7203eca9745bd39d167777d7ec824954b3e4c0
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
AuthorDate: Sat Jul 14 01:55:45 2018 +0200
Commit: Markus Mohrhard <markus.mohrhard at googlemail.com>
CommitDate: Sat Jul 14 10:28:10 2018 +0200
add test for tdf#91385
Change-Id: Ic755d330f242a78214e8b1610aa496ecce3d61b4
Reviewed-on: https://gerrit.libreoffice.org/57410
Tested-by: Jenkins
Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>
diff --git a/sc/qa/unit/ucalc.hxx b/sc/qa/unit/ucalc.hxx
index 60cee22b07c2..e2c778a01dda 100644
--- a/sc/qa/unit/ucalc.hxx
+++ b/sc/qa/unit/ucalc.hxx
@@ -523,6 +523,7 @@ public:
void testMultipleSingleCellCondFormatCopyPaste();
void testDeduplicateMultipleCondFormats();
void testCondFormatListenToOwnRange();
+ void testCondFormatVolatileFunctionRecalc();
void testImportStream();
void testDeleteContents();
@@ -812,6 +813,7 @@ public:
CPPUNIT_TEST(testCondFormatUndoList);
CPPUNIT_TEST(testMultipleSingleCellCondFormatCopyPaste);
CPPUNIT_TEST(testDeduplicateMultipleCondFormats);
+ CPPUNIT_TEST(testCondFormatVolatileFunctionRecalc);
CPPUNIT_TEST(testIconSet);
CPPUNIT_TEST(testDataBarLengthAutomaticAxis);
CPPUNIT_TEST(testDataBarLengthMiddleAxis);
diff --git a/sc/qa/unit/ucalc_condformat.cxx b/sc/qa/unit/ucalc_condformat.cxx
index 62b0ba9dace0..d2bf5d23c6df 100644
--- a/sc/qa/unit/ucalc_condformat.cxx
+++ b/sc/qa/unit/ucalc_condformat.cxx
@@ -1226,4 +1226,42 @@ void Test::testCondFormatListenToOwnRange()
m_pDoc->DeleteTab(0);
}
+void Test::testCondFormatVolatileFunctionRecalc()
+{
+ m_pDoc->InsertTab(0, "Test");
+
+ m_pDoc->SetValue(0, 0, 0, 0.5);
+
+ ScConditionalFormatList* pList = m_pDoc->GetCondFormList(0);
+
+ ScConditionalFormat* pFormat = new ScConditionalFormat(1, m_pDoc);
+ ScRangeList aRangeList(ScRange(0,0,0,10,0,0));
+ pFormat->SetRange(aRangeList);
+
+ ScCondFormatEntry* pEntry = new ScCondFormatEntry(ScConditionMode::Greater,"RAND()","",m_pDoc,ScAddress(0,0,0),ScResId(STR_STYLENAME_RESULT));
+ pEntry->SetParent(pFormat);
+
+ m_pDoc->AddCondFormatData(pFormat->GetRange(), 0, 1);
+ pFormat->AddEntry(pEntry);
+ pList->InsertNew(pFormat);
+
+ ScRefCellValue aCell(*m_pDoc, ScAddress(0, 0, 0));
+ bool bValid = pEntry->IsCellValid(aCell, ScAddress(0, 0, 0));
+
+ bool bNewValid = bValid;
+ // chance of a random failure is 0.5^100, anyone hitting that will get a beer from me
+ for (size_t i = 0; i < 100; ++i)
+ {
+ pFormat->CalcAll();
+ bNewValid = pEntry->IsCellValid(aCell, ScAddress(0, 0, 0));
+
+ if (bValid != bNewValid)
+ break;
+ }
+
+ CPPUNIT_ASSERT(bValid != bNewValid);
+
+ m_pDoc->DeleteTab(0);
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit 1ce2d70bc29b348f2f819d616a897e1dcb6a1a9f
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
AuthorDate: Sat Jul 14 01:21:59 2018 +0200
Commit: Markus Mohrhard <markus.mohrhard at googlemail.com>
CommitDate: Sat Jul 14 10:28:03 2018 +0200
tdf#91385, recalc cond format formulas during hard recalc
Change-Id: I54b650d228c89a15eb37294eb108ab736163a000
Reviewed-on: https://gerrit.libreoffice.org/57409
Tested-by: Jenkins
Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>
diff --git a/sc/inc/conditio.hxx b/sc/inc/conditio.hxx
index 31ca3531bf20..be9c1362742c 100644
--- a/sc/inc/conditio.hxx
+++ b/sc/inc/conditio.hxx
@@ -401,6 +401,7 @@ public:
virtual void startRendering() override;
bool NeedsRepaint() const;
+ void CalcAll();
protected:
virtual void DataChanged() const;
@@ -589,6 +590,9 @@ public:
void startRendering();
void endRendering();
+
+ // Forced recalculation for formulas
+ void CalcAll();
};
// List of all conditional formats in a sheet
@@ -654,6 +658,9 @@ public:
void endRendering();
sal_uInt32 getMaxKey() const;
+
+ /// Forced recalculation of formulas
+ void CalcAll();
};
#endif
diff --git a/sc/source/core/data/conditio.cxx b/sc/source/core/data/conditio.cxx
index 018d9757c058..a13ccf622e4c 100644
--- a/sc/source/core/data/conditio.cxx
+++ b/sc/source/core/data/conditio.cxx
@@ -1532,6 +1532,18 @@ ScFormatEntry* ScCondFormatEntry::Clone( ScDocument* pDoc ) const
return new ScCondFormatEntry( pDoc, *this );
}
+void ScConditionEntry::CalcAll()
+{
+ if (pFCell1 || pFCell2)
+ {
+ if (pFCell1)
+ pFCell1->SetDirty();
+ if (pFCell2)
+ pFCell2->SetDirty();
+ pCondFormat->DoRepaint();
+ }
+}
+
ScCondDateFormatEntry::ScCondDateFormatEntry( ScDocument* pDoc )
: ScFormatEntry( pDoc )
, meType(condformat::TODAY)
@@ -2028,6 +2040,18 @@ void ScConditionalFormat::endRendering()
}
}
+void ScConditionalFormat::CalcAll()
+{
+ for(auto itr = maEntries.cbegin(); itr != maEntries.cend(); ++itr)
+ {
+ if ((*itr)->GetType() == ScFormatEntry::Type::Condition)
+ {
+ ScCondFormatEntry& rFormat = static_cast<ScCondFormatEntry&>(**itr);
+ rFormat.CalcAll();
+ }
+ }
+}
+
ScConditionalFormatList::ScConditionalFormatList(const ScConditionalFormatList& rList)
{
for(const_iterator itr = rList.begin(); itr != rList.end(); ++itr)
@@ -2281,4 +2305,13 @@ sal_uInt32 ScConditionalFormatList::getMaxKey() const
return nMax;
}
+void ScConditionalFormatList::CalcAll()
+{
+ for (const auto& aEntry : m_ConditionalFormats)
+ {
+ aEntry->CalcAll();
+ }
+
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/core/data/table2.cxx b/sc/source/core/data/table2.cxx
index fe8b69035ad6..d2aa2a0a4d6e 100644
--- a/sc/source/core/data/table2.cxx
+++ b/sc/source/core/data/table2.cxx
@@ -1877,6 +1877,8 @@ void ScTable::CalcAll()
{
for (SCCOL i=0; i < aCol.size(); i++)
aCol[i].CalcAll();
+
+ mpCondFormatList->CalcAll();
}
void ScTable::CompileAll( sc::CompileFormulaContext& rCxt )
More information about the Libreoffice-commits
mailing list