sc/inc/colorscale.hxx | 7 +++ sc/source/core/data/colorscale.cxx | 80 ++++++++++++++++++++++++++++++++++++- sc/source/core/data/documen2.cxx | 2 sc/source/core/data/documen7.cxx | 12 +++++ 4 files changed, 99 insertions(+), 2 deletions(-)
New commits: commit 2d74e6c122c4d07d86873e3a8d69d0fdc2361e31 Author: Markus Mohrhard <markus.mohrh...@googlemail.com> Date: Fri May 11 01:17:56 2012 +0200 update the color scales when moving tabs Change-Id: Iabeeae6d2c31f983ea04652dce81e448a7623472 diff --git a/sc/inc/colorscale.hxx b/sc/inc/colorscale.hxx index 4f61f57..a34c50c 100644 --- a/sc/inc/colorscale.hxx +++ b/sc/inc/colorscale.hxx @@ -79,6 +79,7 @@ public: void SetRange(const ScRangeList& rList); void DataChanged(const ScRange& rRange); + void UpdateMoveTab(SCTAB nOldTab, SCTAB nNewTab); typedef ColorScaleEntries::iterator iterator; typedef ColorScaleEntries::const_iterator const_iterator; @@ -103,6 +104,7 @@ public: void AddFormat( ScColorScaleFormat* pFormat ); void DataChanged(const ScRange& rRange); + void UpdateMoveTab(SCTAB nOldTab, SCTAB nNewTab); iterator begin(); const_iterator begin() const; diff --git a/sc/source/core/data/colorscale.cxx b/sc/source/core/data/colorscale.cxx index 4e5d963..c14251d 100644 --- a/sc/source/core/data/colorscale.cxx +++ b/sc/source/core/data/colorscale.cxx @@ -311,6 +311,38 @@ Color* ScColorScaleFormat::GetColor( const ScAddress& rAddr ) const return new Color(aColor); } +void ScColorScaleFormat::UpdateMoveTab(SCTAB nOldTab, SCTAB nNewTab) +{ + size_t n = maRanges.size(); + SCTAB nMinTab = std::min<SCTAB>(nOldTab, nNewTab); + SCTAB nMaxTab = std::max<SCTAB>(nOldTab, nNewTab); + for(size_t i = 0; i < n; ++i) + { + ScRange* pRange = maRanges[i]; + SCTAB nTab = pRange->aStart.Tab(); + if(nTab < nMinTab || nTab > nMaxTab) + continue; + + if(nTab == nOldTab) + { + pRange->aStart.SetTab(nNewTab); + pRange->aEnd.SetTab(nNewTab); + continue; + } + + if(nNewTab < nOldTab) + { + pRange->aStart.IncTab(); + pRange->aEnd.IncTab(); + } + else + { + pRange->aStart.IncTab(-1); + pRange->aEnd.IncTab(-1); + } + } +} + bool ScColorScaleFormat::CheckEntriesForRel(const ScRange& rRange) const { bool bNeedUpdate = false; @@ -407,4 +439,12 @@ void ScColorScaleFormatList::DataChanged(const ScRange& rRange) } } +void ScColorScaleFormatList::UpdateMoveTab(SCTAB nOldTab, SCTAB nNewTab) +{ + for(iterator itr = begin(); itr != end(); ++itr) + { + itr->UpdateMoveTab(nOldTab, nNewTab); + } +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/core/data/documen2.cxx b/sc/source/core/data/documen2.cxx index a64162e..605f9cd 100644 --- a/sc/source/core/data/documen2.cxx +++ b/sc/source/core/data/documen2.cxx @@ -753,6 +753,8 @@ bool ScDocument::MoveTab( SCTAB nOldPos, SCTAB nNewPos, ScProgress* pProgress ) UpdateRefAreaLinks( URM_REORDER, aSourceRange, 0,0,nDz ); if ( pCondFormList ) pCondFormList->UpdateMoveTab( nOldPos, nNewPos ); + if ( mpColorScaleList ) + mpColorScaleList->UpdateMoveTab( nOldPos, nNewPos ); if ( pValidationList ) pValidationList->UpdateMoveTab( nOldPos, nNewPos ); if ( pUnoBroadcaster ) commit 3b992e247eba57ed3ebc08861e0cd85b52144e94 Author: Markus Mohrhard <markus.mohrh...@googlemail.com> Date: Fri May 11 00:15:32 2012 +0200 repaint color scale range if min/max changed Change-Id: Id9a8479d286e50756c41fbd948d738a0c8d8c883 diff --git a/sc/inc/colorscale.hxx b/sc/inc/colorscale.hxx index b71c38b..4f61f57 100644 --- a/sc/inc/colorscale.hxx +++ b/sc/inc/colorscale.hxx @@ -70,6 +70,7 @@ private: double GetMaxValue() const; void calcMinMax(double& nMin, double& nMax) const; + bool CheckEntriesForRel(const ScRange& rRange) const; public: ScColorScaleFormat(ScDocument* pDoc); @@ -77,6 +78,8 @@ public: void AddEntry(ScColorScaleEntry* pEntry); void SetRange(const ScRangeList& rList); + void DataChanged(const ScRange& rRange); + typedef ColorScaleEntries::iterator iterator; typedef ColorScaleEntries::const_iterator const_iterator; iterator begin(); @@ -99,6 +102,8 @@ public: ScColorScaleFormat* GetFormat(sal_uInt32 nFormat); void AddFormat( ScColorScaleFormat* pFormat ); + void DataChanged(const ScRange& rRange); + iterator begin(); const_iterator begin() const; iterator end(); diff --git a/sc/source/core/data/colorscale.cxx b/sc/source/core/data/colorscale.cxx index 42b7f3c..4e5d963 100644 --- a/sc/source/core/data/colorscale.cxx +++ b/sc/source/core/data/colorscale.cxx @@ -311,6 +311,35 @@ Color* ScColorScaleFormat::GetColor( const ScAddress& rAddr ) const return new Color(aColor); } +bool ScColorScaleFormat::CheckEntriesForRel(const ScRange& rRange) const +{ + bool bNeedUpdate = false; + for(const_iterator itr = begin(); itr != end(); ++itr) + { + if(itr->GetMin() || itr->GetMax()) + bNeedUpdate = true; + } + + // TODO: check also if the changed value is the new min/max + // or has been the old min/max value + bNeedUpdate = bNeedUpdate && maRanges.Intersects(rRange); + return bNeedUpdate; +} + +void ScColorScaleFormat::DataChanged(const ScRange& rRange) +{ + bool bNeedUpdate = CheckEntriesForRel(rRange); + if(bNeedUpdate) + { + size_t n = maRanges.size(); + for(size_t i = 0; i < n; ++i) + { + ScRange* pRange = maRanges[i]; + mpDoc->RepaintRange(*pRange); + } + } +} + ScColorScaleFormat::iterator ScColorScaleFormat::begin() { return maColorScales.begin(); @@ -370,4 +399,12 @@ size_t ScColorScaleFormatList::size() const return maColorScaleFormats.size(); } +void ScColorScaleFormatList::DataChanged(const ScRange& rRange) +{ + for(iterator itr = begin(); itr != end(); ++itr) + { + itr->DataChanged(rRange); + } +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/core/data/documen7.cxx b/sc/source/core/data/documen7.cxx index 0826ea6..3d28152 100644 --- a/sc/source/core/data/documen7.cxx +++ b/sc/source/core/data/documen7.cxx @@ -44,6 +44,7 @@ #include "scmod.hxx" // SC_MOD #include "inputopt.hxx" // GetExpandRefs #include "conditio.hxx" +#include "colorscale.hxx" #include "sheetevents.hxx" #include <tools/shl.hxx> @@ -111,6 +112,9 @@ void ScDocument::Broadcast( const ScHint& rHint ) if ( pCondFormList && rHint.GetAddress() != BCA_BRDCST_ALWAYS ) pCondFormList->SourceChanged( rHint.GetAddress() ); + if( mpColorScaleList && rHint.GetAddress() != BCA_BRDCST_ALWAYS ) + mpColorScaleList->DataChanged( rHint.GetAddress() ); + if ( rHint.GetAddress() != BCA_BRDCST_ALWAYS ) { SCTAB nTab = rHint.GetAddress().Tab(); @@ -134,6 +138,9 @@ void ScDocument::AreaBroadcast( const ScHint& rHint ) // Repaint fuer bedingte Formate mit relativen Referenzen: if ( pCondFormList && rHint.GetAddress() != BCA_BRDCST_ALWAYS ) pCondFormList->SourceChanged( rHint.GetAddress() ); + + if( mpColorScaleList && rHint.GetAddress() != BCA_BRDCST_ALWAYS ) + mpColorScaleList->DataChanged( rHint.GetAddress() ); } @@ -177,6 +184,11 @@ void ScDocument::AreaBroadcastInRange( const ScRange& rRange, const ScHint& rHin } } } + + if(mpColorScaleList) + { + mpColorScaleList->DataChanged(rRange); + } } commit a1b1c1ebbfab5883c707b31dbfbbbbe338ed4833 Author: Markus Mohrhard <markus.mohrh...@googlemail.com> Date: Thu May 10 21:29:48 2012 +0200 calculate color for color scales with more than 2 entries correctly Change-Id: I5b62644df8742939551c1aaeaae1ebeda9b97f63 diff --git a/sc/source/core/data/colorscale.cxx b/sc/source/core/data/colorscale.cxx index 3cc0e5a..42b7f3c 100644 --- a/sc/source/core/data/colorscale.cxx +++ b/sc/source/core/data/colorscale.cxx @@ -297,13 +297,12 @@ Color* ScColorScaleFormat::GetColor( const ScAddress& rAddr ) const Color rColMax = itr->GetColor(); ++itr; - while(itr != end() && nVal > nValMin) + while(itr != end() && nVal > nValMax) { rColMin = rColMax; nValMin = nValMax; rColMax = itr->GetColor(); nValMax = CalcValue(nMin, nMax, itr); - nValMax = itr->GetValue(); ++itr; } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits