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 40 : 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 530 : 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 42 : struct SC_DLLPUBLIC ScDataBarFormatData
98 : {
99 50 : ScDataBarFormatData():
100 : maAxisColor(COL_BLACK),
101 : mbGradient(true),
102 : mbNeg(true),
103 : meAxisPosition(databar::AUTOMATIC),
104 : mnMinLength(0),
105 : mnMaxLength(100),
106 50 : mbOnlyBar(false){}
107 :
108 0 : ScDataBarFormatData(const ScDataBarFormatData& r):
109 : maPositiveColor(r.maPositiveColor),
110 : maAxisColor(r.maAxisColor),
111 : mbGradient(r.mbGradient),
112 : mbNeg(r.mbNeg),
113 : meAxisPosition(r.meAxisPosition),
114 : mnMinLength(r.mnMinLength),
115 : mnMaxLength(r.mnMaxLength),
116 0 : mbOnlyBar(r.mbOnlyBar)
117 : {
118 0 : if(r.mpNegativeColor)
119 0 : mpNegativeColor.reset(new Color(*r.mpNegativeColor));
120 :
121 0 : if(r.mpLowerLimit)
122 0 : mpLowerLimit.reset( new ScColorScaleEntry(*r.mpLowerLimit));
123 0 : if(r.mpUpperLimit)
124 0 : mpUpperLimit.reset( new ScColorScaleEntry(*r.mpUpperLimit));
125 0 : }
126 :
127 : /**
128 : * Color for all Positive Values and if mbNeg == false also for negative ones
129 : */
130 : Color maPositiveColor;
131 : /**
132 : * Specifies the color for negative values. This is optional and depends on mbNeg.
133 : *
134 : * Default color is 0xFF0000, this value is not set
135 : */
136 : boost::scoped_ptr<Color> mpNegativeColor;
137 : /**
138 : * Color of the axis if used
139 : * Default color is black
140 : */
141 : Color maAxisColor;
142 : /**
143 : * Paint the bars with gradient. If this is used the default is to draw with
144 : * borders.
145 : *
146 : * Default is true
147 : */
148 : bool mbGradient;
149 : /**
150 : * Use different color for negative values. Color is specified in
151 : * mpNegativeColor and defaults to 0xFF0000
152 : *
153 : * Default is true
154 : */
155 : bool mbNeg; //differentiate between negative values
156 : /**
157 : * Paint negative values into the same direction as positive values
158 : * If false we will set the mid point according to the upper and lower limit and negative
159 : * values are painted to the left and positive to the right
160 : *
161 : * Default is false
162 : */
163 : databar::ScAxisPosition meAxisPosition;
164 : /**
165 : * Minimal length of a databar in percent of cell length
166 : * Value has to be in the range [0, 100)
167 : */
168 : double mnMinLength;
169 : /**
170 : * Maximal length of a databar in percent of cell length
171 : * Value has to be in the range (0, 100]
172 : */
173 : double mnMaxLength;
174 :
175 : /**
176 : * If TRUE we only show the bar and not the value
177 : */
178 : bool mbOnlyBar;
179 :
180 : boost::scoped_ptr<ScColorScaleEntry> mpUpperLimit;
181 : boost::scoped_ptr<ScColorScaleEntry> mpLowerLimit;
182 : };
183 :
184 : enum ScIconSetType
185 : {
186 : IconSet_3Arrows,
187 : IconSet_3ArrowsGray,
188 : IconSet_3Flags,
189 : IconSet_3TrafficLights1,
190 : IconSet_3TrafficLights2,
191 : IconSet_3Signs,
192 : IconSet_3Symbols,
193 : IconSet_3Symbols2,
194 : IconSet_3Smilies,
195 : IconSet_3Stars,
196 : IconSet_3Triangles,
197 : IconSet_3ColorSmilies,
198 : IconSet_4Arrows,
199 : IconSet_4ArrowsGray,
200 : IconSet_4RedToBlack,
201 : IconSet_4Rating,
202 : IconSet_4TrafficLights,
203 : IconSet_5Arrows,
204 : IconSet_5ArrowsGray,
205 : IconSet_5Ratings,
206 : IconSet_5Quarters,
207 : IconSet_5Boxes
208 : };
209 :
210 : struct ScIconSetMap {
211 : const char* pName;
212 : ScIconSetType eType;
213 : sal_Int32 nElements;
214 : };
215 :
216 : class SC_DLLPUBLIC ScColorFormat : public ScFormatEntry
217 : {
218 : public:
219 : ScColorFormat(ScDocument* pDoc);
220 : virtual ~ScColorFormat();
221 :
222 : void SetRange(const ScRangeList& rList);
223 : const ScRangeList& GetRange() const;
224 :
225 : virtual void DataChanged(const ScRange& rRange) = 0;
226 : virtual void SetParent(ScConditionalFormat* pParent) SAL_OVERRIDE;
227 :
228 : virtual void startRendering() SAL_OVERRIDE;
229 : virtual void endRendering() SAL_OVERRIDE;
230 :
231 : virtual bool NeedsRepaint() const = 0;
232 :
233 : protected:
234 : std::vector<double>& getValues() const;
235 :
236 : double getMinValue() const;
237 : double getMaxValue() const;
238 :
239 : ScConditionalFormat* mpParent;
240 :
241 : private:
242 :
243 14 : struct ScColorFormatCache
244 : {
245 : std::vector<double> maValues;
246 : };
247 : mutable boost::scoped_ptr<ScColorFormatCache> mpCache;
248 : };
249 :
250 : class SC_DLLPUBLIC ScColorScaleFormat : public ScColorFormat
251 : {
252 : private:
253 : typedef boost::ptr_vector<ScColorScaleEntry> ColorScaleEntries;
254 : ColorScaleEntries maColorScales;
255 :
256 : double GetMinValue() const;
257 : double GetMaxValue() const;
258 :
259 : void calcMinMax(double& nMin, double& nMax) const;
260 : bool CheckEntriesForRel(const ScRange& rRange) const;
261 : double CalcValue(double nMin, double nMax, ColorScaleEntries::const_iterator& rItr) const;
262 : public:
263 : ScColorScaleFormat(ScDocument* pDoc);
264 : ScColorScaleFormat(ScDocument* pDoc, const ScColorScaleFormat& rFormat);
265 : virtual ~ScColorScaleFormat();
266 : virtual ScColorFormat* Clone(ScDocument* pDoc = NULL) const SAL_OVERRIDE;
267 :
268 : Color* GetColor(const ScAddress& rAddr) const;
269 : void AddEntry(ScColorScaleEntry* pEntry);
270 :
271 : virtual void DataChanged(const ScRange& rRange) SAL_OVERRIDE;
272 : virtual void UpdateReference( sc::RefUpdateContext& rCxt ) SAL_OVERRIDE;
273 : virtual void UpdateInsertTab( sc::RefUpdateInsertTabContext& rCxt ) SAL_OVERRIDE;
274 : virtual void UpdateDeleteTab( sc::RefUpdateDeleteTabContext& rCxt ) SAL_OVERRIDE;
275 : virtual void UpdateMoveTab( sc::RefUpdateMoveTabContext& rCxt ) SAL_OVERRIDE;
276 :
277 : virtual bool NeedsRepaint() const SAL_OVERRIDE;
278 :
279 : virtual condformat::ScFormatEntryType GetType() const SAL_OVERRIDE;
280 : typedef ColorScaleEntries::iterator iterator;
281 : typedef ColorScaleEntries::const_iterator const_iterator;
282 : iterator begin();
283 : const_iterator begin() const;
284 : iterator end();
285 : const_iterator end() const;
286 :
287 : ScColorScaleEntry* GetEntry(size_t nPos);
288 : const ScColorScaleEntry* GetEntry(size_t nPos) const;
289 :
290 : size_t size() const;
291 :
292 : /**
293 : * Makes sure that the maColorScales contain at least 2 entries.
294 : * Should be called when it is not sure that the format is valid.
295 : */
296 : void EnsureSize();
297 : };
298 :
299 84 : class SC_DLLPUBLIC ScDataBarFormat : public ScColorFormat
300 : {
301 : public:
302 : ScDataBarFormat(ScDocument* pDoc);
303 : ScDataBarFormat(ScDocument* pDoc, const ScDataBarFormat& rFormat);
304 : virtual ScColorFormat* Clone(ScDocument* pDoc = NULL) const SAL_OVERRIDE;
305 :
306 : ScDataBarInfo* GetDataBarInfo(const ScAddress& rAddr) const;
307 :
308 : void SetDataBarData( ScDataBarFormatData* pData );
309 : const ScDataBarFormatData* GetDataBarData() const;
310 : ScDataBarFormatData* GetDataBarData();
311 :
312 : virtual void DataChanged(const ScRange& rRange) SAL_OVERRIDE;
313 : virtual void UpdateReference( sc::RefUpdateContext& rCxt ) SAL_OVERRIDE;
314 : virtual void UpdateInsertTab( sc::RefUpdateInsertTabContext& rCxt ) SAL_OVERRIDE;
315 : virtual void UpdateDeleteTab( sc::RefUpdateDeleteTabContext& rCxt ) SAL_OVERRIDE;
316 : virtual void UpdateMoveTab( sc::RefUpdateMoveTabContext& rCxt ) SAL_OVERRIDE;
317 :
318 : virtual bool NeedsRepaint() const SAL_OVERRIDE;
319 :
320 : virtual condformat::ScFormatEntryType GetType() const SAL_OVERRIDE;
321 :
322 : /**
323 : * Makes sure that the mpFormatData does not contain valid entries.
324 : * Should be called when it is not sure that the format is valid.
325 : */
326 : void EnsureSize();
327 :
328 : private:
329 : double getMin(double nMin, double nMax) const;
330 : double getMax(double nMin, double nMax) const;
331 :
332 : boost::scoped_ptr<ScDataBarFormatData> mpFormatData;
333 : };
334 :
335 20 : struct ScIconSetFormatData
336 : {
337 : ScIconSetType eIconSetType;
338 : bool mbShowValue;
339 : /**
340 : * Specifies whether the icons should be shown in reverse order
341 : */
342 : bool mbReverse;
343 : boost::ptr_vector<ScColorScaleEntry> maEntries;
344 : bool mbCustom;
345 : // the std::pair points to exactly one image
346 : // std..pair::second == -1 means no image
347 : std::vector<std::pair<ScIconSetType, sal_Int32> > maCustomVector;
348 :
349 16 : ScIconSetFormatData():
350 : eIconSetType(IconSet_3Arrows),
351 : mbShowValue(true),
352 : mbReverse(false),
353 16 : mbCustom(false)
354 16 : {}
355 : };
356 :
357 14 : class SC_DLLPUBLIC ScIconSetFormat : public ScColorFormat
358 : {
359 : public:
360 : ScIconSetFormat(ScDocument* pDoc);
361 : ScIconSetFormat(ScDocument* pDoc, const ScIconSetFormat& rFormat);
362 :
363 : virtual ScColorFormat* Clone(ScDocument* pDoc = NULL) const SAL_OVERRIDE;
364 :
365 : ScIconSetInfo* GetIconSetInfo(const ScAddress& rAddr) const;
366 :
367 : void SetIconSetData( ScIconSetFormatData* pData );
368 : const ScIconSetFormatData* GetIconSetData() const;
369 : ScIconSetFormatData* GetIconSetData();
370 :
371 : virtual void DataChanged(const ScRange& rRange) SAL_OVERRIDE;
372 : virtual void UpdateReference( sc::RefUpdateContext& rCxt ) SAL_OVERRIDE;
373 : virtual void UpdateInsertTab( sc::RefUpdateInsertTabContext& rCxt ) SAL_OVERRIDE;
374 : virtual void UpdateDeleteTab( sc::RefUpdateDeleteTabContext& rCxt ) SAL_OVERRIDE;
375 : virtual void UpdateMoveTab( sc::RefUpdateMoveTabContext& rCxt ) SAL_OVERRIDE;
376 :
377 : virtual bool NeedsRepaint() const SAL_OVERRIDE;
378 :
379 : virtual condformat::ScFormatEntryType GetType() const SAL_OVERRIDE;
380 :
381 : static ScIconSetMap* getIconSetMap();
382 : static BitmapEx& getBitmap( ScIconSetType eType, sal_Int32 nIndex );
383 :
384 : typedef boost::ptr_vector<ScColorScaleEntry>::iterator iterator;
385 : typedef boost::ptr_vector<ScColorScaleEntry>::const_iterator const_iterator;
386 :
387 : iterator begin();
388 : const_iterator begin() const;
389 : iterator end();
390 : const_iterator end() const;
391 :
392 : size_t size() const;
393 :
394 : /**
395 : * Makes sure that the mpFormatData does not contain valid entries.
396 : * Should be called when it is not sure that the format is valid.
397 : */
398 : void EnsureSize();
399 :
400 : private:
401 :
402 : double GetMinValue() const;
403 : double GetMaxValue() const;
404 : double CalcValue(double nMin, double nMax, ScIconSetFormat::const_iterator& itr) const;
405 :
406 : boost::scoped_ptr<ScIconSetFormatData> mpFormatData;
407 : };
408 :
409 : #endif
410 :
411 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|