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