1 /*
2  * Copyright (C) 2013 Emweb bv, Herent, Belgium.
3  *
4  * See the LICENSE file for terms of use.
5  */
6 
7 #include "Wt/Chart/WChart2DImplementation.h"
8 #include "Wt/Chart/WCartesianChart.h"
9 #include "Wt/Chart/WAbstractChartModel.h"
10 #include "Wt/WPainter.h"
11 
12 #include "WebUtils.h"
13 
14 namespace Wt {
15   namespace Chart {
16 
startSeries(const WDataSeries & series,double groupWidth,int numBarGroups,int currentBarGroup)17 bool ExtremesIterator::startSeries(const WDataSeries& series, double groupWidth,
18 				   int numBarGroups, int currentBarGroup)
19 {
20   if (axis_ == Axis::X) {
21     return series.xAxis() == xAxis_;
22   } else {
23     return series.yAxis() == yAxis_;
24   }
25 }
26 
newValue(const WDataSeries & series,double x,double y,double stackY,int xRow,int xColumn,int yRow,int yColumn)27 void ExtremesIterator::newValue(const WDataSeries& series, double x, double y,
28 				double stackY, int xRow, int xColumn,
29 				int yRow, int yColumn)
30 {
31   double v = axis_ == Axis::X ? x : y;
32 
33   if (!Utils::isNaN(v) && (scale_ != AxisScale::Log || v > 0.0)) {
34     maximum_ = std::max(v, maximum_);
35     minimum_ = std::min(v, minimum_);
36   }
37 }
38 
WChart2DImplementation(WCartesianChart * chart)39 WChart2DImplementation::WChart2DImplementation(WCartesianChart *chart)
40   : chart_(chart)
41 { }
42 
chartType()43 ChartType WChart2DImplementation::chartType() const
44 {
45   return chart_->type();
46 }
47 
update()48 void WChart2DImplementation::update()
49 {
50   chart_->update();
51 }
52 
axisPadding()53 int WChart2DImplementation::axisPadding() const
54 {
55   return chart_->axisPadding();
56 }
57 
numberOfCategories(Axis axis)58 int WChart2DImplementation::numberOfCategories(Axis axis) const
59 {
60   if (chart_->model())
61     return chart_->model()->rowCount();
62   else
63     return 0;
64 }
65 
orientation()66 Orientation WChart2DImplementation::orientation() const
67 {
68   return chart_->orientation();
69 }
70 
categoryLabel(int u,Axis axis)71 WString WChart2DImplementation::categoryLabel(int u, Axis axis) const
72 {
73   if (chart_->XSeriesColumn() != -1) {
74     if (u < chart_->model()->rowCount())
75       return chart_->model()->displayData(u, chart_->XSeriesColumn());
76     else
77       return WString();
78   } else {
79     return WString();
80   }
81 }
82 
computeRenderRange(Axis axis,int xAxis,int yAxis,AxisScale scale)83 WChart2DImplementation::RenderRange WChart2DImplementation::computeRenderRange(Axis axis, int xAxis, int yAxis, AxisScale scale) const
84 {
85   ExtremesIterator iterator(axis, xAxis, yAxis, scale);
86 
87   chart_->iterateSeries(&iterator, nullptr, false, axis == Axis::X);
88 
89   RenderRange range;
90   range.minimum = iterator.minimum();
91   range.maximum = iterator.maximum();
92 
93   return range;
94 }
95 
onDemandLoadingEnabled()96 bool WChart2DImplementation::onDemandLoadingEnabled() const
97 {
98   return chart_->onDemandLoadingEnabled();
99 }
100 
101   }
102 }
103