summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarkus Mohrhard <markus.mohrhard@googlemail.com>2018-07-10 00:16:00 +0200
committerMarkus Mohrhard <markus.mohrhard@googlemail.com>2018-07-14 01:58:06 +0200
commit17722541e906cf64dcdd7169194aad72ec14bb10 (patch)
tree462d86324cb0e2ce2a41021e9cd6da9371fd4cd7
parent771149ac99a57c641caebdfc7dd6fac25c292682 (diff)
tdf#117809, listen to the actual conditional format range if necessary
Change-Id: Ib83cf22e40f5e0338a3c85f631d30f00b80d8655 Reviewed-on: https://gerrit.libreoffice.org/57406 Tested-by: Jenkins Reviewed-by: Markus Mohrhard <markus.mohrhard@googlemail.com>
-rw-r--r--sc/inc/colorscale.hxx2
-rw-r--r--sc/inc/conditio.hxx5
-rw-r--r--sc/source/core/data/colorscale.cxx72
-rw-r--r--sc/source/core/data/conditio.cxx5
-rw-r--r--sc/source/filter/xml/xmlcondformat.cxx6
-rw-r--r--sc/source/filter/xml/xmlcondformat.hxx2
6 files changed, 81 insertions, 11 deletions
diff --git a/sc/inc/colorscale.hxx b/sc/inc/colorscale.hxx
index deab394229ea..13328ccf76b6 100644
--- a/sc/inc/colorscale.hxx
+++ b/sc/inc/colorscale.hxx
@@ -49,6 +49,8 @@ private:
ScColorScaleEntryType meType;
ScConditionalFormat* mpFormat;
+ void setListener();
+
public:
ScColorScaleEntry(double nVal, const Color& rCol);
ScColorScaleEntry();
diff --git a/sc/inc/conditio.hxx b/sc/inc/conditio.hxx
index 21a670053c11..31ca3531bf20 100644
--- a/sc/inc/conditio.hxx
+++ b/sc/inc/conditio.hxx
@@ -187,10 +187,12 @@ private:
std::function<void()> maCallbackFunction;
void startListening(const ScTokenArray* pTokens, const ScRange& rPos);
+ void startListening(const ScRangeList& rPos);
public:
explicit ScFormulaListener(ScFormulaCell* pCell);
explicit ScFormulaListener(ScDocument* pDoc);
+ explicit ScFormulaListener(ScDocument* pDoc, const ScRangeList& rRange);
virtual ~ScFormulaListener() override;
void Notify( const SfxHint& rHint ) override;
@@ -200,6 +202,7 @@ public:
void addTokenArray(const ScTokenArray* pTokens, const ScRange& rRange);
void stopListening();
void setCallback(const std::function<void()>& aCallbackFunction);
+
};
class ScConditionalFormat;
@@ -551,6 +554,8 @@ public:
bool IsEmpty() const;
size_t size() const;
+ ScDocument* GetDocument();
+
void CompileAll();
void CompileXML();
void UpdateReference( sc::RefUpdateContext& rCxt, bool bCopyAsMove = false );
diff --git a/sc/source/core/data/colorscale.cxx b/sc/source/core/data/colorscale.cxx
index 4ea3606e48b8..e35083b639fe 100644
--- a/sc/source/core/data/colorscale.cxx
+++ b/sc/source/core/data/colorscale.cxx
@@ -36,6 +36,13 @@ ScFormulaListener::ScFormulaListener(ScDocument* pDoc):
{
}
+ScFormulaListener::ScFormulaListener(ScDocument* pDoc, const ScRangeList& rRange):
+ mbDirty(false),
+ mpDoc(pDoc)
+{
+ startListening(rRange);
+}
+
void ScFormulaListener::startListening(const ScTokenArray* pArr, const ScRange& rRange)
{
if (!pArr || mpDoc->IsClipOrUndo())
@@ -88,6 +95,19 @@ void ScFormulaListener::startListening(const ScTokenArray* pArr, const ScRange&
}
}
+void ScFormulaListener::startListening(const ScRangeList& rRange)
+{
+ if (mpDoc->IsClipOrUndo())
+ return;
+
+ size_t nLength = rRange.size();
+ for (size_t i = 0; i < nLength; ++i)
+ {
+ const ScRange& aRange = rRange[i];
+ mpDoc->StartListeningArea(aRange, false, this);
+ }
+}
+
void ScFormulaListener::addTokenArray(const ScTokenArray* pArray, const ScRange& rRange)
{
startListening(pArray, rRange);
@@ -150,6 +170,7 @@ ScColorScaleEntry::ScColorScaleEntry(const ScColorScaleEntry& rEntry):
meType(rEntry.meType),
mpFormat(rEntry.mpFormat)
{
+ setListener();
if(rEntry.mpCell)
{
mpCell.reset(new ScFormulaCell(*rEntry.mpCell, *rEntry.mpCell->GetDocument(), rEntry.mpCell->aPos, ScCloneFlags::NoMakeAbsExternal));
@@ -165,6 +186,7 @@ ScColorScaleEntry::ScColorScaleEntry(ScDocument* pDoc, const ScColorScaleEntry&
meType(rEntry.meType),
mpFormat(rEntry.mpFormat)
{
+ setListener();
if(rEntry.mpCell)
{
mpCell.reset(new ScFormulaCell(*rEntry.mpCell, *rEntry.mpCell->GetDocument(), rEntry.mpCell->aPos, ScCloneFlags::NoMakeAbsExternal));
@@ -229,12 +251,16 @@ void ScColorScaleEntry::SetValue(double nValue)
{
mnVal = nValue;
mpCell.reset();
+ setListener();
}
void ScColorScaleEntry::UpdateReference( const sc::RefUpdateContext& rCxt )
{
if (!mpCell)
+ {
+ setListener();
return;
+ }
mpCell->UpdateReference(rCxt);
mpListener.reset(new ScFormulaListener(mpCell.get()));
@@ -244,7 +270,10 @@ void ScColorScaleEntry::UpdateReference( const sc::RefUpdateContext& rCxt )
void ScColorScaleEntry::UpdateInsertTab( const sc::RefUpdateInsertTabContext& rCxt )
{
if (!mpCell)
+ {
+ setListener();
return;
+ }
mpCell->UpdateInsertTab(rCxt);
mpListener.reset(new ScFormulaListener(mpCell.get()));
@@ -254,7 +283,10 @@ void ScColorScaleEntry::UpdateInsertTab( const sc::RefUpdateInsertTabContext& rC
void ScColorScaleEntry::UpdateDeleteTab( const sc::RefUpdateDeleteTabContext& rCxt )
{
if (!mpCell)
+ {
+ setListener();
return;
+ }
mpCell->UpdateDeleteTab(rCxt);
mpListener.reset(new ScFormulaListener(mpCell.get()));
@@ -264,7 +296,10 @@ void ScColorScaleEntry::UpdateDeleteTab( const sc::RefUpdateDeleteTabContext& rC
void ScColorScaleEntry::UpdateMoveTab( const sc::RefUpdateMoveTabContext& rCxt )
{
if (!mpCell)
+ {
+ setListener();
return;
+ }
SCTAB nTabNo = rCxt.getNewTab(mpCell->aPos.Tab());
mpCell->UpdateMoveTab(rCxt, nTabNo);
@@ -280,10 +315,37 @@ void ScColorScaleEntry::SetColor(const Color& rColor)
void ScColorScaleEntry::SetRepaintCallback(ScConditionalFormat* pFormat)
{
mpFormat = pFormat;
+ setListener();
if (mpFormat && mpListener)
mpListener->setCallback([&]() { mpFormat->DoRepaint();});
}
+void ScColorScaleEntry::SetType( ScColorScaleEntryType eType )
+{
+ meType = eType;
+ if(eType != COLORSCALE_FORMULA)
+ {
+ mpCell.reset();
+ mpListener.reset();
+ }
+
+ setListener();
+}
+
+void ScColorScaleEntry::setListener()
+{
+ if (!mpFormat)
+ return;
+
+ if (meType == COLORSCALE_PERCENT || meType == COLORSCALE_PERCENTILE
+ || meType == COLORSCALE_MIN || meType == COLORSCALE_MAX
+ || meType == COLORSCALE_AUTO)
+ {
+ mpListener.reset(new ScFormulaListener(mpFormat->GetDocument(), mpFormat->GetRange()));
+ mpListener->setCallback([&]() { mpFormat->DoRepaint();});
+ }
+}
+
ScColorFormat::ScColorFormat(ScDocument* pDoc)
: ScFormatEntry(pDoc)
, mpParent(nullptr)
@@ -337,16 +399,6 @@ void ScColorScaleFormat::AddEntry( ScColorScaleEntry* pEntry )
maColorScales.back()->SetRepaintCallback(mpParent);
}
-void ScColorScaleEntry::SetType( ScColorScaleEntryType eType )
-{
- meType = eType;
- if(eType != COLORSCALE_FORMULA)
- {
- mpCell.reset();
- mpListener.reset();
- }
-}
-
double ScColorScaleFormat::GetMinValue() const
{
ScColorScaleEntries::const_iterator itr = maColorScales.begin();
diff --git a/sc/source/core/data/conditio.cxx b/sc/source/core/data/conditio.cxx
index 4e93415542cf..018d9757c058 100644
--- a/sc/source/core/data/conditio.cxx
+++ b/sc/source/core/data/conditio.cxx
@@ -1778,6 +1778,11 @@ size_t ScConditionalFormat::size() const
return maEntries.size();
}
+ScDocument* ScConditionalFormat::GetDocument()
+{
+ return pDoc;
+}
+
ScConditionalFormat::~ScConditionalFormat()
{
}
diff --git a/sc/source/filter/xml/xmlcondformat.cxx b/sc/source/filter/xml/xmlcondformat.cxx
index deb34ec4e596..10ff5eda5de7 100644
--- a/sc/source/filter/xml/xmlcondformat.cxx
+++ b/sc/source/filter/xml/xmlcondformat.cxx
@@ -398,6 +398,7 @@ ScXMLDataBarFormatContext::ScXMLDataBarFormatContext( ScXMLImport& rImport,
ScConditionalFormat* pFormat):
ScXMLImportContext( rImport ),
mpFormatData(nullptr),
+ mpParent(pFormat),
mnIndex(0)
{
OUString sPositiveColor;
@@ -521,6 +522,7 @@ css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL ScXMLDataBarF
{
ScColorScaleEntry* pEntry(nullptr);
pContext = new ScXMLFormattingEntryContext( GetScImport(), pAttribList, pEntry );
+ pEntry->SetRepaintCallback(mpParent);
if(mnIndex == 0)
{
mpFormatData->mpLowerLimit.reset(pEntry);
@@ -547,7 +549,8 @@ css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL ScXMLDataBarF
ScXMLIconSetFormatContext::ScXMLIconSetFormatContext(ScXMLImport& rImport,
const rtl::Reference<sax_fastparser::FastAttributeList>& rAttrList,
ScConditionalFormat* pFormat):
- ScXMLImportContext( rImport )
+ ScXMLImportContext( rImport ),
+ mpParent(pFormat)
{
OUString aIconSetType, sShowValue;
if ( rAttrList.is() )
@@ -611,6 +614,7 @@ css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL ScXMLIconSetF
ScColorScaleEntry* pEntry(nullptr);
pContext = new ScXMLFormattingEntryContext( GetScImport(), pAttribList, pEntry );
mpFormatData->m_Entries.push_back(std::unique_ptr<ScColorScaleEntry>(pEntry));
+ pEntry->SetRepaintCallback(mpParent);
}
break;
default:
diff --git a/sc/source/filter/xml/xmlcondformat.hxx b/sc/source/filter/xml/xmlcondformat.hxx
index 35d9c9ef8518..3281ac7ae3f3 100644
--- a/sc/source/filter/xml/xmlcondformat.hxx
+++ b/sc/source/filter/xml/xmlcondformat.hxx
@@ -102,6 +102,7 @@ public:
private:
ScDataBarFormatData* mpFormatData;
+ ScConditionalFormat* mpParent;
sal_Int32 mnIndex;
};
@@ -109,6 +110,7 @@ private:
class ScXMLIconSetFormatContext : public ScXMLImportContext
{
ScIconSetFormatData* mpFormatData;
+ ScConditionalFormat* mpParent;
public:
ScXMLIconSetFormatContext( ScXMLImport& rImport,