sc/inc/colorscale.hxx | 11 ++++++++ sc/source/core/data/colorscale.cxx | 41 ++++++++++++++++++++++++++---- sc/source/filter/inc/condformatbuffer.hxx | 3 +- sc/source/filter/oox/condformatbuffer.cxx | 15 +++++++++- 4 files changed, 62 insertions(+), 8 deletions(-)
New commits: commit cdd36980f1e9517280d579a2467f46f87fec8237 Author: Markus Mohrhard <markus.mohrh...@googlemail.com> Date: Fri May 11 06:47:37 2012 +0200 repaint for every change when using formulas in color scales Change-Id: I1eb42ac75228dee00079c86e7c378efb72f16e28 diff --git a/sc/inc/colorscale.hxx b/sc/inc/colorscale.hxx index a95eec6..8a5b203 100644 --- a/sc/inc/colorscale.hxx +++ b/sc/inc/colorscale.hxx @@ -59,6 +59,7 @@ public: bool GetMin() const; bool GetMax() const; bool GetPercent() const; + bool HasFormula() const; void SetMin(bool bMin); void SetMax(bool bMax); void SetPercent(bool bPercent); diff --git a/sc/source/core/data/colorscale.cxx b/sc/source/core/data/colorscale.cxx index c24fc35..33aff61 100644 --- a/sc/source/core/data/colorscale.cxx +++ b/sc/source/core/data/colorscale.cxx @@ -104,6 +104,11 @@ bool ScColorScaleEntry::GetPercent() const return mbPercent; } +bool ScColorScaleEntry::HasFormula() const +{ + return mpCell; +} + void ScColorScaleEntry::SetMin(bool bMin) { mbMin = bMin; @@ -369,7 +374,13 @@ bool ScColorScaleFormat::CheckEntriesForRel(const ScRange& rRange) const for(const_iterator itr = begin(); itr != end(); ++itr) { if(itr->GetMin() || itr->GetMax()) + { bNeedUpdate = true; + break; + } + + if(itr->HasFormula()) + return true; } // TODO: check also if the changed value is the new min/max commit fc48c494347124dffddccca7d75707a22ca65f75 Author: Markus Mohrhard <markus.mohrh...@googlemail.com> Date: Fri May 11 06:38:57 2012 +0200 import formulas for color scales from xlsx Change-Id: If19c6486c95cab0106bf04a4ec68359f7a4ed220 diff --git a/sc/source/filter/inc/condformatbuffer.hxx b/sc/source/filter/inc/condformatbuffer.hxx index 7eb6342..b8b2d65 100644 --- a/sc/source/filter/inc/condformatbuffer.hxx +++ b/sc/source/filter/inc/condformatbuffer.hxx @@ -84,6 +84,7 @@ struct ColorScaleRuleModelEntry bool mbMin; bool mbMax; bool mbPercent; + rtl::OUString maFormula; ColorScaleRuleModelEntry(): maColor(), @@ -101,7 +102,7 @@ public: void importCfvo( const AttributeList& rAttribs ); void importColor( const AttributeList& rAttribs ); - void AddEntries( ScColorScaleFormat* pFormat ); + void AddEntries( ScColorScaleFormat* pFormat, ScDocument* pDoc, const ScAddress& rAddr ); private: const CondFormat& mrCondFormat; diff --git a/sc/source/filter/oox/condformatbuffer.cxx b/sc/source/filter/oox/condformatbuffer.cxx index bce9ed4..dd6150f 100644 --- a/sc/source/filter/oox/condformatbuffer.cxx +++ b/sc/source/filter/oox/condformatbuffer.cxx @@ -182,6 +182,11 @@ void ColorScaleRule::importCfvo( const AttributeList& rAttribs ) // between percent and percentile should be when calculating colors maColorScaleRuleEntries[mnCfvo].mbPercent = true; } + else if( aType == "formula" ) + { + rtl::OUString aFormula = rAttribs.getString( XML_val, rtl::OUString() ); + maColorScaleRuleEntries[mnCfvo].maFormula = aFormula; + } ++mnCfvo; } @@ -212,7 +217,7 @@ void ColorScaleRule::importColor( const AttributeList& rAttribs ) ++mnCol; } -void ColorScaleRule::AddEntries( ScColorScaleFormat* pFormat ) +void ColorScaleRule::AddEntries( ScColorScaleFormat* pFormat, ScDocument* pDoc, const ScAddress& rAddr ) { //assume that both vectors contain the same entries // TODO: check it @@ -228,6 +233,9 @@ void ColorScaleRule::AddEntries( ScColorScaleFormat* pFormat ) if(rEntry.mbPercent) pEntry->SetPercent(true); + if(!rEntry.maFormula.isEmpty()) + pEntry->SetFormula(rEntry.maFormula, pDoc, rAddr, formula::FormulaGrammar::GRAM_ENGLISH_XL_A1); + pFormat->AddEntry( pEntry ); } } @@ -699,7 +707,6 @@ void CondFormatRule::finalizeImport( const Reference< XSheetConditionalEntries > ScDocument& rDoc = getScDocument(); ScColorScaleFormat* pFormat = new ScColorScaleFormat(&rDoc); - mpColor->AddEntries( pFormat ); sal_Int32 nIndex = rDoc.AddColorScaleFormat(pFormat); ScRangeList aList; @@ -720,6 +727,10 @@ void CondFormatRule::finalizeImport( const Reference< XSheetConditionalEntries > aList.Append(aRange); } pFormat->SetRange(aList); + if(aList.size()) + mpColor->AddEntries( pFormat, &rDoc, aList.front()->aStart ); + else + mpColor->AddEntries( pFormat, &rDoc, ScAddress() ); } } commit caa7f3f564cbf2ee695e806916041b2694710b6b Author: Markus Mohrhard <markus.mohrh...@googlemail.com> Date: Fri May 11 06:01:48 2012 +0200 add formula input to color scales Change-Id: I I7f0a46cf5aea2eb1aa8bc9415d9761cc197b0c23 diff --git a/sc/inc/colorscale.hxx b/sc/inc/colorscale.hxx index a34c50c..a95eec6 100644 --- a/sc/inc/colorscale.hxx +++ b/sc/inc/colorscale.hxx @@ -27,18 +27,22 @@ */ #include <boost/ptr_container/ptr_vector.hpp> +#include <boost/scoped_ptr.hpp> +#include <formula/grammar.hxx> #include <tools/color.hxx> #include <rangelst.hxx> //TODO: merge this with conditio.hxx class ScDocument; +class ScFormulaCell; class SC_DLLPUBLIC ScColorScaleEntry { private: double mnVal; Color maColor; + boost::scoped_ptr<ScFormulaCell> mpCell; bool mbMin; bool mbMax; @@ -46,9 +50,11 @@ private: public: ScColorScaleEntry(double nVal, const Color& rCol); ScColorScaleEntry(const ScColorScaleEntry& rEntry); + ~ScColorScaleEntry(); const Color& GetColor() const; double GetValue() const; + void SetFormula(const rtl::OUString& rFormula, ScDocument* pDoc, const ScAddress& rAddr, formula::FormulaGrammar::Grammar eGrammar = formula::FormulaGrammar::GRAM_DEFAULT); bool GetMin() const; bool GetMax() const; @@ -80,6 +86,8 @@ public: void DataChanged(const ScRange& rRange); void UpdateMoveTab(SCTAB nOldTab, SCTAB nNewTab); + void UpdateReference( UpdateRefMode eUpdateRefMode, + const ScRange& rRange, SCsCOL nDx, SCsROW nDy, SCsTAB nDz ); typedef ColorScaleEntries::iterator iterator; typedef ColorScaleEntries::const_iterator const_iterator; @@ -105,6 +113,8 @@ public: void DataChanged(const ScRange& rRange); void UpdateMoveTab(SCTAB nOldTab, SCTAB nNewTab); + void UpdateReference( UpdateRefMode eUpdateRefMode, + const ScRange& rRange, SCsCOL nDx, SCsROW nDy, SCsTAB nDz ); iterator begin(); const_iterator begin() const; diff --git a/sc/source/core/data/colorscale.cxx b/sc/source/core/data/colorscale.cxx index c14251d..c24fc35 100644 --- a/sc/source/core/data/colorscale.cxx +++ b/sc/source/core/data/colorscale.cxx @@ -33,24 +33,44 @@ ScColorScaleEntry::ScColorScaleEntry(double nVal, const Color& rCol): mnVal(nVal), maColor(rCol), + mpCell(NULL), mbMin(false), mbMax(false), - mbPercent(false){ - + mbPercent(false) +{ } ScColorScaleEntry::ScColorScaleEntry(const ScColorScaleEntry& rEntry): mnVal(rEntry.mnVal), maColor(rEntry.maColor), - mbMin(false), - mbMax(false), - mbPercent(false) + mpCell(NULL), + mbMin(rEntry.mbMin), + mbMax(rEntry.mbMax), + mbPercent(rEntry.mbPercent) { +} +ScColorScaleEntry::~ScColorScaleEntry() +{ +} + +void ScColorScaleEntry::SetFormula( const rtl::OUString& rFormula, ScDocument* pDoc, const ScAddress& rAddr, formula::FormulaGrammar::Grammar eGrammar ) +{ + mpCell.reset(new ScFormulaCell( pDoc, rAddr, rFormula, eGrammar )); + mpCell->StartListeningTo( pDoc ); } double ScColorScaleEntry::GetValue() const { + if(mpCell) + { + mpCell->Interpret(); + if(mpCell->IsValue()) + return mpCell->GetValue(); + + return std::numeric_limits<double>::max(); + } + return mnVal; } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits