oox/source/token/tokens.txt | 1 + sc/inc/colorscale.hxx | 16 ++++++++++++++-- sc/source/core/data/colorscale.cxx | 33 +++++++++++++++++++++++++-------- sc/source/filter/oox/extlstcontext.cxx | 17 +++++++++-------- 4 files changed, 49 insertions(+), 18 deletions(-)
New commits: commit 09938f698b0a45ce1b3977995fc944274f048566 Author: Markus Mohrhard <[email protected]> Date: Mon May 21 00:24:51 2012 +0200 support fixed axis in the middle of the cell Change-Id: I1f6dca8434282d161dac3f86da6b4c75aac29a02 diff --git a/sc/inc/colorscale.hxx b/sc/inc/colorscale.hxx index 0f72475..0dbb876 100644 --- a/sc/inc/colorscale.hxx +++ b/sc/inc/colorscale.hxx @@ -72,12 +72,24 @@ public: void SetPercent(bool bPercent); }; +namespace databar +{ + +enum ScAxisPostion +{ + NONE, + AUTOMATIC, + MIDDLE +}; + +} + struct ScDataBarFormatData { ScDataBarFormatData(): mbGradient(true), mbNeg(true), - mbSameDirection(false) {} + meAxisPosition(databar::AUTOMATIC) {} /** * Color for all Positive Values and if mbNeg == false also for negative ones @@ -110,7 +122,7 @@ struct ScDataBarFormatData * * Default is false */ - bool mbSameDirection; + databar::ScAxisPostion meAxisPosition; boost::scoped_ptr<ScColorScaleEntry> mpUpperLimit; boost::scoped_ptr<ScColorScaleEntry> mpLowerLimit; diff --git a/sc/source/core/data/colorscale.cxx b/sc/source/core/data/colorscale.cxx index 8364cd1..70b4872 100644 --- a/sc/source/core/data/colorscale.cxx +++ b/sc/source/core/data/colorscale.cxx @@ -679,10 +679,11 @@ ScDataBarInfo* ScDataBarFormat::GetDataBarInfo(const ScAddress& rAddr) const double nMin = getMin(nValMin, nValMax); double nMax = getMax(nValMin, nValMax); + double nValue = mpDoc->GetValue(rAddr); ScDataBarInfo* pInfo = new ScDataBarInfo(); - if(mpFormatData->mbSameDirection || nMin > 0) + if(mpFormatData->meAxisPosition == databar::NONE) { if(nValue <= nMin) { @@ -701,16 +702,32 @@ ScDataBarInfo* ScDataBarFormat::GetDataBarInfo(const ScAddress& rAddr) const } else { + double nMinPositive = 0; + double nMaxNegative = 0; //calculate the zero position first - if(nMin < 0) + if(mpFormatData->meAxisPosition == databar::AUTOMATIC) { - if(nMax < 0) - pInfo->mnZero = 100; - else + if(nMin < 0) { - pInfo->mnZero = -100*nMin/(nMax-nMin); + if(nMax < 0) + pInfo->mnZero = 100; + else + { + pInfo->mnZero = -100*nMin/(nMax-nMin); + } } + else + pInfo->mnZero = 0; + + // if max or min is used we may need to adjust it + // for the length calculation + if (mpFormatData->mpLowerLimit->GetMin() && nMin > 0) + nMinPositive = nMin; + if (mpFormatData->mpUpperLimit->GetMax() && nMax < 0) + nMaxNegative = nMax; } + else if( mpFormatData->meAxisPosition == databar::MIDDLE) + pInfo->mnZero = 50; //calculate the length if(nValue < 0) @@ -718,14 +735,14 @@ ScDataBarInfo* ScDataBarFormat::GetDataBarInfo(const ScAddress& rAddr) const if (nValue < nMin) pInfo->mnLength = -100; else - pInfo->mnLength = -100 * nValue/nMin; + pInfo->mnLength = -100 * (nValue-nMaxNegative)/(nMin-nMaxNegative); } else { if ( nValue > nMax ) pInfo->mnLength = 100; else - pInfo->mnLength = nValue/nMax*100; + pInfo->mnLength = (nValue-nMinPositive)/(nMax-nMinPositive)*100; } } diff --git a/sc/source/filter/oox/extlstcontext.cxx b/sc/source/filter/oox/extlstcontext.cxx index 02113ea..d8c2d1f 100644 --- a/sc/source/filter/oox/extlstcontext.cxx +++ b/sc/source/filter/oox/extlstcontext.cxx @@ -69,11 +69,11 @@ void ExtCfRuleContext::importDataBar( const AttributeList& rAttribs ) rtl::OUString aAxisPosition = rAttribs.getString( XML_axisPosition, "automatic" ); if( aAxisPosition == "none" ) - pDataBar->mbSameDirection = true; + pDataBar->meAxisPosition = databar::NONE; else if( aAxisPosition == "middle" ) - pDataBar->mbSameDirection = false; + pDataBar->meAxisPosition = databar::MIDDLE; else - pDataBar->mbSameDirection = false; + pDataBar->meAxisPosition = databar::AUTOMATIC; pDataBar->mbNeg = !rAttribs.getBool( XML_negativeBarColorSameAsPositive, false ); } commit f6442313dc0aea603d3d5adca39614428a4bc854 Author: Markus Mohrhard <[email protected]> Date: Sun May 20 22:25:40 2012 +0200 more on correct import of data bars from Excel2010 http://msdn.microsoft.com/en-us/library/documentformat.openxml.office2010.excel.databar.aspx Change-Id: I6d76cd888b723718e5a2beedfb5223fb6c0d0ba2 diff --git a/oox/source/token/tokens.txt b/oox/source/token/tokens.txt index 4c84cb0..5bbaa62 100644 --- a/oox/source/token/tokens.txt +++ b/oox/source/token/tokens.txt @@ -3423,6 +3423,7 @@ ndxf neCell negativeInteger negativeFillColor +negativeBarColorSameAsPositive neq never new diff --git a/sc/source/filter/oox/extlstcontext.cxx b/sc/source/filter/oox/extlstcontext.cxx index 4b7a79f..02113ea 100644 --- a/sc/source/filter/oox/extlstcontext.cxx +++ b/sc/source/filter/oox/extlstcontext.cxx @@ -67,14 +67,15 @@ void ExtCfRuleContext::importDataBar( const AttributeList& rAttribs ) ScDataBarFormatData* pDataBar = static_cast<ScDataBarFormatData*>(mpTarget); pDataBar->mbGradient = rAttribs.getBool( XML_gradient, true ); - if(rAttribs.hasAttribute(XML_axisPosition)) - { - rtl::OUString aAxisPosition = rAttribs.getString( XML_axisPosition, rtl::OUString() ); - if( aAxisPosition == "none" ) - { - pDataBar->mbSameDirection = true; - } - } + rtl::OUString aAxisPosition = rAttribs.getString( XML_axisPosition, "automatic" ); + if( aAxisPosition == "none" ) + pDataBar->mbSameDirection = true; + else if( aAxisPosition == "middle" ) + pDataBar->mbSameDirection = false; + else + pDataBar->mbSameDirection = false; + + pDataBar->mbNeg = !rAttribs.getBool( XML_negativeBarColorSameAsPositive, false ); } namespace { _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
