sc/inc/colorscale.hxx | 3 sc/source/core/data/colorscale.cxx | 152 +++++++++++++++++++++++++++++-------- 2 files changed, 124 insertions(+), 31 deletions(-)
New commits: commit e3fea48ac8523bf3cd4c50906ca85819390594f9 Author: Markus Mohrhard <markus.mohrh...@googlemail.com> Date: Fri May 18 17:31:29 2012 +0200 correctly get the min value and the max value for data bars Change-Id: I5e46bf534d1b70536810e9d9ac0a67210b271109 diff --git a/sc/inc/colorscale.hxx b/sc/inc/colorscale.hxx index b63bc66..0f72475 100644 --- a/sc/inc/colorscale.hxx +++ b/sc/inc/colorscale.hxx @@ -198,6 +198,9 @@ public: virtual ScColorFormatType GetType() const; private: + double getMin(double nMin, double nMax) const; + double getMax(double nMin, double nMax) const; + boost::scoped_ptr<ScDataBarFormatData> mpFormatData; }; diff --git a/sc/source/core/data/colorscale.cxx b/sc/source/core/data/colorscale.cxx index f9adede..2a34fd9 100644 --- a/sc/source/core/data/colorscale.cxx +++ b/sc/source/core/data/colorscale.cxx @@ -263,50 +263,61 @@ double getMaxValue(const ScRange& rRange, ScDocument* pDoc) return aMaxValue; } +double getMinValue(const ScRangeList& rList, ScDocument* pDoc) +{ + double aMinValue = std::numeric_limits<double>::max(); + + size_t n = rList.size(); + for(size_t i = 0; i < n; ++i) + { + const ScRange* pRange = rList[i]; + double aVal = getMinValue(*pRange, pDoc); + if( aVal < aMinValue ) + aMinValue = aVal; + } + return aMinValue; +} + +double getMaxValue(const ScRangeList& rList, ScDocument* pDoc) +{ + double aMaxVal = std::numeric_limits<double>::min(); + + size_t n = rList.size(); + for(size_t i = 0; i < n; ++i) + { + const ScRange* pRange = rList[i]; + double aVal = getMaxValue(*pRange, pDoc); + if( aVal > aMaxVal ) + aMaxVal = aVal; + } + + return aMaxVal; +} + } double ScColorScaleFormat::GetMinValue() const { const_iterator itr = maColorScales.begin(); - double aMinValue = std::numeric_limits<double>::max(); if(!itr->GetMin()) return itr->GetValue(); else { - size_t n = maRanges.size(); - for(size_t i = 0; i < n; ++i) - { - const ScRange* pRange = maRanges[i]; - double aVal = getMinValue(*pRange, mpDoc); - if( aVal < aMinValue ) - aMinValue = aVal; - } + return getMinValue(maRanges, mpDoc); } - - return aMinValue; } double ScColorScaleFormat::GetMaxValue() const { ColorScaleEntries::const_reverse_iterator itr = maColorScales.rbegin(); - double aMaxVal = std::numeric_limits<double>::min(); if(!itr->GetMax()) return itr->GetValue(); else { - size_t n = maRanges.size(); - for(size_t i = 0; i < n; ++i) - { - const ScRange* pRange = maRanges[i]; - double aVal = getMaxValue(*pRange, mpDoc); - if( aVal > aMaxVal ) - aMaxVal = aVal; - } + return getMaxValue(maRanges, mpDoc); } - - return aMaxVal;; } void ScColorScaleFormat::calcMinMax(double& rMin, double& rMax) const @@ -623,6 +634,32 @@ void ScDataBarFormat::UpdateMoveTab(SCTAB nOldTab, SCTAB nNewTab) mpFormatData->mpLowerLimit->UpdateMoveTab(nOldTab, nNewTab, nThisTab); } +double ScDataBarFormat::getMin(double nMin, double nMax) const +{ + if(mpFormatData->mpLowerLimit->GetMin()) + return nMin; + + if(mpFormatData->mpLowerLimit->GetPercent()) + { + return nMin + (nMax-nMin)/100*mpFormatData->mpLowerLimit->GetValue(); + } + + return mpFormatData->mpLowerLimit->GetValue(); +} + +double ScDataBarFormat::getMax(double nMin, double nMax) const +{ + if(mpFormatData->mpUpperLimit->GetMax()) + return nMax; + + if(mpFormatData->mpUpperLimit->GetPercent()) + { + return nMin + (nMax-nMin)/100*mpFormatData->mpLowerLimit->GetValue(); + } + + return mpFormatData->mpLowerLimit->GetValue(); +} + ScDataBarInfo* ScDataBarFormat::GetDataBarInfo(const ScAddress& rAddr) const { CellType eCellType = mpDoc->GetCellType(rAddr); @@ -637,8 +674,10 @@ ScDataBarInfo* ScDataBarFormat::GetDataBarInfo(const ScAddress& rAddr) const // now we have for sure a value // - double nMin = -2; - double nMax = 10; + double nValMin = getMinValue(maRanges, mpDoc); + double nValMax = getMaxValue(maRanges, mpDoc); + double nMin = getMin(nValMin, nValMax); + double nMax = getMax(nValMin, nValMax); double nValue = mpDoc->GetValue(rAddr); commit 726051277d90d0dfe384111d03b97835517bb69c Author: Markus Mohrhard <markus.mohrh...@googlemail.com> Date: Fri May 18 17:09:26 2012 +0200 update data bars correctly Change-Id: Icddd688dbf5da8154dd470539b03b6a2d02ca755 diff --git a/sc/source/core/data/colorscale.cxx b/sc/source/core/data/colorscale.cxx index 975e6e9..f9adede 100644 --- a/sc/source/core/data/colorscale.cxx +++ b/sc/source/core/data/colorscale.cxx @@ -416,15 +416,17 @@ Color* ScColorScaleFormat::GetColor( const ScAddress& rAddr ) const return new Color(aColor); } -void ScColorScaleFormat::UpdateMoveTab(SCTAB nOldTab, SCTAB nNewTab) +namespace { + +SCTAB UpdateMoveTabRangeList( ScRangeList& rList, SCTAB nOldTab, SCTAB nNewTab ) { - size_t n = maRanges.size(); + size_t n = rList.size(); SCTAB nMinTab = std::min<SCTAB>(nOldTab, nNewTab); SCTAB nMaxTab = std::max<SCTAB>(nOldTab, nNewTab); SCTAB nThisTab = -1; for(size_t i = 0; i < n; ++i) { - ScRange* pRange = maRanges[i]; + ScRange* pRange = rList[i]; SCTAB nTab = pRange->aStart.Tab(); if(nTab < nMinTab || nTab > nMaxTab) { @@ -456,6 +458,15 @@ void ScColorScaleFormat::UpdateMoveTab(SCTAB nOldTab, SCTAB nNewTab) if(nThisTab == -1) nThisTab = 0; + + return nThisTab; +} + +} + +void ScColorScaleFormat::UpdateMoveTab(SCTAB nOldTab, SCTAB nNewTab) +{ + SCTAB nThisTab = UpdateMoveTabRangeList(maRanges, nOldTab, nNewTab); for(iterator itr = begin(); itr != end(); ++itr) { itr->UpdateMoveTab(nOldTab, nNewTab, nThisTab); @@ -558,18 +569,58 @@ ScColorFormatType ScDataBarFormat::GetType() const return DATABAR; } -void ScDataBarFormat::UpdateReference( UpdateRefMode , - const ScRange& , SCsCOL , SCsROW , SCsTAB ) +void ScDataBarFormat::UpdateReference( UpdateRefMode eRefMode, + const ScRange& rRange, SCsCOL nDx, SCsROW nDy, SCsTAB nDz ) +{ + maRanges.UpdateReference( eRefMode, mpDoc, rRange, nDx, nDy, nDz ); + + mpFormatData->mpUpperLimit->UpdateReference( eRefMode, rRange, nDx, nDy, nDz ); + mpFormatData->mpLowerLimit->UpdateReference( eRefMode, rRange, nDx, nDy, nDz ); +} + +namespace { + +bool NeedUpdate(ScColorScaleEntry* pEntry) { + if(pEntry->GetMin()) + return true; + + if(pEntry->GetMax()) + return true; + + if(pEntry->GetFormula()) + return true; + + return false; +} + } -void ScDataBarFormat::DataChanged(const ScRange& ) +void ScDataBarFormat::DataChanged(const ScRange& rRange) { + bool bNeedUpdate = false; + + bNeedUpdate = NeedUpdate(mpFormatData->mpUpperLimit.get()); + bNeedUpdate &= NeedUpdate(mpFormatData->mpLowerLimit.get()); + bNeedUpdate &= maRanges.Intersects(rRange); + + if(bNeedUpdate) + { + size_t n = maRanges.size(); + for(size_t i = 0; i < n; ++i) + { + ScRange* pRange = maRanges[i]; + mpDoc->RepaintRange(*pRange); + } + } } -void ScDataBarFormat::UpdateMoveTab(SCTAB , SCTAB ) +void ScDataBarFormat::UpdateMoveTab(SCTAB nOldTab, SCTAB nNewTab) { + SCTAB nThisTab = UpdateMoveTabRangeList(maRanges, nOldTab, nNewTab); + mpFormatData->mpUpperLimit->UpdateMoveTab(nOldTab, nNewTab, nThisTab); + mpFormatData->mpLowerLimit->UpdateMoveTab(nOldTab, nNewTab, nThisTab); } ScDataBarInfo* ScDataBarFormat::GetDataBarInfo(const ScAddress& rAddr) const _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits