LCOV - code coverage report
Current view: top level - sc/inc - colorscale.hxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 11 21 52.4 %
Date: 2014-11-03 Functions: 10 14 71.4 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  */
       9             : 
      10             : #ifndef INCLUDED_SC_INC_COLORSCALE_HXX
      11             : #define INCLUDED_SC_INC_COLORSCALE_HXX
      12             : 
      13             : #include <boost/ptr_container/ptr_vector.hpp>
      14             : #include <boost/scoped_ptr.hpp>
      15             : #include <formula/grammar.hxx>
      16             : #include <tools/color.hxx>
      17             : #include "rangelst.hxx"
      18             : #include "conditio.hxx"
      19             : 
      20             : #include <svl/listener.hxx>
      21             : #include <svl/broadcast.hxx>
      22             : 
      23             : #include <vector>
      24             : 
      25             : //TODO: merge this with conditio.hxx
      26             : 
      27             : class ScDocument;
      28             : class ScFormulaCell;
      29             : class ScTokenArray;
      30             : struct ScDataBarInfo;
      31             : class BitmapEx;
      32             : class ScFormulaListener;
      33             : 
      34             : // don't change the order
      35             : // they are also used in the dialog to determine the position
      36             : // in the list box
      37             : enum ScColorScaleEntryType
      38             : {
      39             :     COLORSCALE_AUTO,
      40             :     COLORSCALE_MIN,
      41             :     COLORSCALE_MAX,
      42             :     COLORSCALE_PERCENTILE,
      43             :     COLORSCALE_VALUE,
      44             :     COLORSCALE_PERCENT,
      45             :     COLORSCALE_FORMULA,
      46             : };
      47             : 
      48             : class SC_DLLPUBLIC ScColorScaleEntry
      49             : {
      50             : private:
      51             :     double mnVal;
      52             :     Color maColor;
      53             :     boost::scoped_ptr<ScFormulaCell> mpCell;
      54             :     boost::scoped_ptr<ScFormulaListener> mpListener;
      55             :     ScColorScaleEntryType meType;
      56             : 
      57             : public:
      58             :     ScColorScaleEntry(double nVal, const Color& rCol);
      59             :     ScColorScaleEntry();
      60             :     ScColorScaleEntry(const ScColorScaleEntry& rEntry);
      61             :     ScColorScaleEntry(ScDocument* pDoc, const ScColorScaleEntry& rEntry);
      62             :     ~ScColorScaleEntry();
      63             : 
      64          60 :     const Color& GetColor() const { return maColor;}
      65             :     void SetColor(const Color&);
      66             :     double GetValue() const;
      67             :     void SetValue(double nValue);
      68             :     void SetFormula(const OUString& rFormula, ScDocument* pDoc, const ScAddress& rAddr,
      69             :             formula::FormulaGrammar::Grammar eGrammar = formula::FormulaGrammar::GRAM_DEFAULT);
      70             : 
      71             :     void UpdateReference( sc::RefUpdateContext& rCxt );
      72             :     void UpdateInsertTab( sc::RefUpdateInsertTabContext& rCxt );
      73             :     void UpdateDeleteTab( sc::RefUpdateDeleteTabContext& rCxt );
      74             :     void UpdateMoveTab( sc::RefUpdateMoveTabContext& rCxt );
      75             : 
      76             :     const ScTokenArray* GetFormula() const;
      77             :     OUString GetFormula( formula::FormulaGrammar::Grammar eGrammar ) const;
      78             : 
      79         476 :     ScColorScaleEntryType GetType() const { return meType;}
      80             :     void SetType( ScColorScaleEntryType eType );
      81             : 
      82             :     bool NeedsRepaint() const;
      83             : };
      84             : 
      85             : namespace databar
      86             : {
      87             : 
      88             : enum ScAxisPosition
      89             : {
      90             :     NONE,
      91             :     AUTOMATIC,
      92             :     MIDDLE
      93             : };
      94             : 
      95             : }
      96             : 
      97          60 : struct SC_DLLPUBLIC ScDataBarFormatData
      98             : {
      99          60 :     ScDataBarFormatData():
     100             :         maAxisColor(COL_BLACK),
     101             :         mbGradient(true),
     102             :         mbNeg(true),
     103             :         meAxisPosition(databar::AUTOMATIC),
     104          60 :         mbOnlyBar(false){}
     105             : 
     106           0 :     ScDataBarFormatData(const ScDataBarFormatData& r):
     107             :         maPositiveColor(r.maPositiveColor),
     108             :         maAxisColor(r.maAxisColor),
     109             :         mbGradient(r.mbGradient),
     110             :         mbNeg(r.mbNeg),
     111             :         meAxisPosition(r.meAxisPosition),
     112           0 :         mbOnlyBar(r.mbOnlyBar)
     113             :     {
     114           0 :         if(r.mpNegativeColor)
     115           0 :             mpNegativeColor.reset(new Color(*r.mpNegativeColor));
     116             : 
     117           0 :         if(r.mpLowerLimit)
     118           0 :             mpLowerLimit.reset( new ScColorScaleEntry(*r.mpLowerLimit));
     119           0 :         if(r.mpUpperLimit)
     120           0 :             mpUpperLimit.reset( new ScColorScaleEntry(*r.mpUpperLimit));
     121           0 :     }
     122             : 
     123             :     /**
     124             :      * Color for all Positive Values and if mbNeg == false also for negative ones
     125             :      */
     126             :     Color maPositiveColor;
     127             :     /**
     128             :      * Specifies the color for negative values. This is optional and depends on mbNeg.
     129             :      *
     130             :      * Default color is 0xFF0000, this value is not set
     131             :      */
     132             :     boost::scoped_ptr<Color> mpNegativeColor;
     133             :     /**
     134             :      * Color of the axis if used
     135             :      * Default color is black
     136             :      */
     137             :     Color maAxisColor;
     138             :     /**
     139             :      * Paint the bars with gradient. If this is used the default is to draw with
     140             :      * borders.
     141             :      *
     142             :      * Default is true
     143             :      */
     144             :     bool mbGradient;
     145             :     /**
     146             :      * Use different color for negative values. Color is specified in
     147             :      * mpNegativeColor and defaults to 0xFF0000
     148             :      *
     149             :      * Default is true
     150             :      */
     151             :     bool mbNeg; //differentiate between negative values
     152             :     /**
     153             :      * Paint negative values into the same direction as positive values
     154             :      * If false we will set the mid point according to the upper and lower limit and negative
     155             :      * values are painted to the left and positive to the right
     156             :      *
     157             :      * Default is false
     158             :      */
     159             :     databar::ScAxisPosition meAxisPosition;
     160             : 
     161             :     /**
     162             :      * If TRUE we only show the bar and not the value
     163             :      */
     164             :     bool mbOnlyBar;
     165             : 
     166             :     boost::scoped_ptr<ScColorScaleEntry> mpUpperLimit;
     167             :     boost::scoped_ptr<ScColorScaleEntry> mpLowerLimit;
     168             : };
     169             : 
     170             : enum ScIconSetType
     171             : {
     172             :     IconSet_3Arrows,
     173             :     IconSet_3ArrowsGray,
     174             :     IconSet_3Flags,
     175             :     IconSet_3TrafficLights1,
     176             :     IconSet_3TrafficLights2,
     177             :     IconSet_3Signs,
     178             :     IconSet_3Symbols,
     179             :     IconSet_3Symbols2,
     180             :     IconSet_3Smilies,
     181             :     IconSet_3ColorSmilies,
     182             :     IconSet_4Arrows,
     183             :     IconSet_4ArrowsGray,
     184             :     IconSet_4RedToBlack,
     185             :     IconSet_4Rating,
     186             :     IconSet_4TrafficLights,
     187             :     IconSet_5Arrows,
     188             :     IconSet_5ArrowsGray,
     189             :     IconSet_5Ratings,
     190             :     IconSet_5Quarters
     191             : };
     192             : 
     193             : struct ScIconSetMap {
     194             :     const char* pName;
     195             :     ScIconSetType eType;
     196             :     sal_Int32 nElements;
     197             : };
     198             : 
     199             : class SC_DLLPUBLIC ScColorFormat : public ScFormatEntry
     200             : {
     201             : public:
     202             :     ScColorFormat(ScDocument* pDoc);
     203             :     virtual ~ScColorFormat();
     204             : 
     205             :     void SetRange(const ScRangeList& rList);
     206             :     const ScRangeList& GetRange() const;
     207             : 
     208             :     virtual void DataChanged(const ScRange& rRange) = 0;
     209             :     virtual void SetParent(ScConditionalFormat* pParent) SAL_OVERRIDE;
     210             : 
     211             :     virtual void startRendering() SAL_OVERRIDE;
     212             :     virtual void endRendering() SAL_OVERRIDE;
     213             : 
     214             :     virtual bool NeedsRepaint() const = 0;
     215             : 
     216             : protected:
     217             :     std::vector<double>& getValues() const;
     218             : 
     219             :     double getMinValue() const;
     220             :     double getMaxValue() const;
     221             : 
     222             :     ScConditionalFormat* mpParent;
     223             : 
     224             : private:
     225             : 
     226           0 :     struct ScColorFormatCache
     227             :     {
     228             :         std::vector<double> maValues;
     229             :     };
     230             :     mutable boost::scoped_ptr<ScColorFormatCache> mpCache;
     231             : };
     232             : 
     233             : class SC_DLLPUBLIC ScColorScaleFormat : public ScColorFormat
     234             : {
     235             : private:
     236             :     typedef boost::ptr_vector<ScColorScaleEntry> ColorScaleEntries;
     237             :     ColorScaleEntries maColorScales;
     238             : 
     239             :     double GetMinValue() const;
     240             :     double GetMaxValue() const;
     241             : 
     242             :     void calcMinMax(double& nMin, double& nMax) const;
     243             :     bool CheckEntriesForRel(const ScRange& rRange) const;
     244             :     double CalcValue(double nMin, double nMax, ColorScaleEntries::const_iterator& rItr) const;
     245             : public:
     246             :     ScColorScaleFormat(ScDocument* pDoc);
     247             :     ScColorScaleFormat(ScDocument* pDoc, const ScColorScaleFormat& rFormat);
     248             :     virtual ~ScColorScaleFormat();
     249             :     virtual ScColorFormat* Clone(ScDocument* pDoc = NULL) const SAL_OVERRIDE;
     250             : 
     251             :     Color* GetColor(const ScAddress& rAddr) const;
     252             :     void AddEntry(ScColorScaleEntry* pEntry);
     253             : 
     254             :     virtual void DataChanged(const ScRange& rRange) SAL_OVERRIDE;
     255             :     virtual void UpdateReference( sc::RefUpdateContext& rCxt ) SAL_OVERRIDE;
     256             :     virtual void UpdateInsertTab( sc::RefUpdateInsertTabContext& rCxt ) SAL_OVERRIDE;
     257             :     virtual void UpdateDeleteTab( sc::RefUpdateDeleteTabContext& rCxt ) SAL_OVERRIDE;
     258             :     virtual void UpdateMoveTab( sc::RefUpdateMoveTabContext& rCxt ) SAL_OVERRIDE;
     259             : 
     260             :     virtual bool NeedsRepaint() const SAL_OVERRIDE;
     261             : 
     262             :     virtual condformat::ScFormatEntryType GetType() const SAL_OVERRIDE;
     263             :     typedef ColorScaleEntries::iterator iterator;
     264             :     typedef ColorScaleEntries::const_iterator const_iterator;
     265             :     iterator begin();
     266             :     const_iterator begin() const;
     267             :     iterator end();
     268             :     const_iterator end() const;
     269             : 
     270             :     size_t size() const;
     271             : };
     272             : 
     273         120 : class SC_DLLPUBLIC ScDataBarFormat : public ScColorFormat
     274             : {
     275             : public:
     276             :     ScDataBarFormat(ScDocument* pDoc);
     277             :     ScDataBarFormat(ScDocument* pDoc, const ScDataBarFormat& rFormat);
     278             :     virtual ScColorFormat* Clone(ScDocument* pDoc = NULL) const SAL_OVERRIDE;
     279             : 
     280             :     ScDataBarInfo* GetDataBarInfo(const ScAddress& rAddr) const;
     281             : 
     282             :     void SetDataBarData( ScDataBarFormatData* pData );
     283             :     const ScDataBarFormatData* GetDataBarData() const;
     284             : 
     285             :     virtual void DataChanged(const ScRange& rRange) SAL_OVERRIDE;
     286             :     virtual void UpdateReference( sc::RefUpdateContext& rCxt ) SAL_OVERRIDE;
     287             :     virtual void UpdateInsertTab( sc::RefUpdateInsertTabContext& rCxt ) SAL_OVERRIDE;
     288             :     virtual void UpdateDeleteTab( sc::RefUpdateDeleteTabContext& rCxt ) SAL_OVERRIDE;
     289             :     virtual void UpdateMoveTab( sc::RefUpdateMoveTabContext& rCxt ) SAL_OVERRIDE;
     290             : 
     291             :     virtual bool NeedsRepaint() const SAL_OVERRIDE;
     292             : 
     293             :     virtual condformat::ScFormatEntryType GetType() const SAL_OVERRIDE;
     294             : 
     295             : private:
     296             :     double getMin(double nMin, double nMax) const;
     297             :     double getMax(double nMin, double nMax) const;
     298             : 
     299             :     boost::scoped_ptr<ScDataBarFormatData> mpFormatData;
     300             : };
     301             : 
     302           4 : struct ScIconSetFormatData
     303             : {
     304             :     ScIconSetType eIconSetType;
     305             :     bool mbShowValue;
     306             :     /**
     307             :      * Specifies whether the icons should be shown in reverse order
     308             :      */
     309             :     bool mbReverse;
     310             :     boost::ptr_vector<ScColorScaleEntry> maEntries;
     311             : 
     312           4 :     ScIconSetFormatData():
     313             :         eIconSetType(IconSet_3Arrows),
     314             :         mbShowValue(true),
     315           4 :         mbReverse(false)
     316           4 :         {}
     317             : };
     318             : 
     319           4 : class SC_DLLPUBLIC ScIconSetFormat : public ScColorFormat
     320             : {
     321             : public:
     322             :     ScIconSetFormat(ScDocument* pDoc);
     323             :     ScIconSetFormat(ScDocument* pDoc, const ScIconSetFormat& rFormat);
     324             : 
     325             :     virtual ScColorFormat* Clone(ScDocument* pDoc = NULL) const SAL_OVERRIDE;
     326             : 
     327             :     ScIconSetInfo* GetIconSetInfo(const ScAddress& rAddr) const;
     328             : 
     329             :     void SetIconSetData( ScIconSetFormatData* pData );
     330             :     const ScIconSetFormatData* GetIconSetData() const;
     331             : 
     332             :     virtual void DataChanged(const ScRange& rRange) SAL_OVERRIDE;
     333             :     virtual void UpdateReference( sc::RefUpdateContext& rCxt ) SAL_OVERRIDE;
     334             :     virtual void UpdateInsertTab( sc::RefUpdateInsertTabContext& rCxt ) SAL_OVERRIDE;
     335             :     virtual void UpdateDeleteTab( sc::RefUpdateDeleteTabContext& rCxt ) SAL_OVERRIDE;
     336             :     virtual void UpdateMoveTab( sc::RefUpdateMoveTabContext& rCxt ) SAL_OVERRIDE;
     337             : 
     338             :     virtual bool NeedsRepaint() const SAL_OVERRIDE;
     339             : 
     340             :     virtual condformat::ScFormatEntryType GetType() const SAL_OVERRIDE;
     341             : 
     342             :     static ScIconSetMap* getIconSetMap();
     343             :     static BitmapEx& getBitmap( ScIconSetType eType, sal_Int32 nIndex );
     344             : 
     345             :     typedef boost::ptr_vector<ScColorScaleEntry>::iterator iterator;
     346             :     typedef boost::ptr_vector<ScColorScaleEntry>::const_iterator const_iterator;
     347             : 
     348             :     iterator begin();
     349             :     const_iterator begin() const;
     350             :     iterator end();
     351             :     const_iterator end() const;
     352             : 
     353             : private:
     354             : 
     355             :     double GetMinValue() const;
     356             :     double GetMaxValue() const;
     357             :     double CalcValue(double nMin, double nMax, ScIconSetFormat::const_iterator& itr) const;
     358             : 
     359             :     boost::scoped_ptr<ScIconSetFormatData> mpFormatData;
     360             : };
     361             : 
     362             : #endif
     363             : 
     364             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10