11 #include <boost/lexical_cast.hpp>
13 #include <Wt/WAbstractItemModel>
14 #include <Wt/WApplication>
15 #include <Wt/WCheckBox>
16 #include <Wt/WComboBox>
17 #include <Wt/WDoubleValidator>
18 #include <Wt/WEnvironment>
19 #include <Wt/WIntValidator>
20 #include <Wt/WLineEdit>
22 #include <Wt/WPushButton>
23 #include <Wt/WStandardItemModel>
26 #include <Wt/WPainterPath>
28 #include <Wt/Chart/WCartesianChart>
31 using namespace Wt::Chart;
34 void addHeader(
WTable *t,
const char *value) {
43 bool getDouble(
WLineEdit *edit,
double& value) {
45 value = boost::lexical_cast<
double>(edit->
text().
toUTF8());
53 for (
unsigned i = 0; i < chart->
series().size(); ++i)
84 addEntry(orientation,
"Vertical");
85 addEntry(orientation,
"Horizontal");
88 addEntry(legendLocation,
"Outside");
89 addEntry(legendLocation,
"Inside");
92 addEntry(legendSide,
"Top");
93 addEntry(legendSide,
"Right");
94 addEntry(legendSide,
"Bottom");
95 addEntry(legendSide,
"Left");
98 addEntry(legendAlignment,
"AlignLeft");
99 addEntry(legendAlignment,
"AlignCenter");
100 addEntry(legendAlignment,
"AlignRight");
101 addEntry(legendAlignment,
"AlignTop");
102 addEntry(legendAlignment,
"AlignMiddle");
103 addEntry(legendAlignment,
"AlignBottom");
158 for (
int i = 0; i < chartConfig->
rowCount(); ++i) {
165 p->
resize(750, WLength::Auto);
174 addEntry(types,
"Points");
175 addEntry(types,
"Line");
176 addEntry(types,
"Curve");
177 addEntry(types,
"Bar");
178 addEntry(types,
"Line Area");
179 addEntry(types,
"Curve Area");
180 addEntry(types,
"Stacked Bar");
181 addEntry(types,
"Stacked Line Area");
182 addEntry(types,
"Stacked Curve Area");
185 addEntry(markers,
"None");
186 addEntry(markers,
"Square");
187 addEntry(markers,
"Circle");
188 addEntry(markers,
"Cross");
189 addEntry(markers,
"X cross");
190 addEntry(markers,
"Triangle");
191 addEntry(markers,
"Diamond");
194 addEntry(axes,
"1st Y axis");
195 addEntry(axes,
"2nd Y axis");
198 addEntry(labels,
"None");
199 addEntry(labels,
"X");
200 addEntry(labels,
"Y");
201 addEntry(labels,
"X: Y");
206 ::addHeader(seriesConfig,
"Name");
207 ::addHeader(seriesConfig,
"Enabled");
208 ::addHeader(seriesConfig,
"Type");
209 ::addHeader(seriesConfig,
"Marker");
210 ::addHeader(seriesConfig,
"Y axis");
211 ::addHeader(seriesConfig,
"Legend");
212 ::addHeader(seriesConfig,
"Shadow");
213 ::addHeader(seriesConfig,
"Value labels");
248 int si = seriesIndexOf(chart, j);
276 p = list->
addWidget(
"Series properties", seriesConfig);
279 p->
resize(750, WLength::Auto);
285 addEntry(yScales,
"Linear scale");
286 addEntry(yScales,
"Log scale");
289 addEntry(xScales,
"Categories");
290 addEntry(xScales,
"Linear scale");
291 addEntry(xScales,
"Log scale");
292 addEntry(xScales,
"Date scale");
297 ::addHeader(axisConfig,
"Axis");
298 ::addHeader(axisConfig,
"Visible");
299 ::addHeader(axisConfig,
"Scale");
300 ::addHeader(axisConfig,
"Automatic");
301 ::addHeader(axisConfig,
"Minimum");
302 ::addHeader(axisConfig,
"Maximum");
303 ::addHeader(axisConfig,
"Gridlines");
304 ::addHeader(axisConfig,
"Label angle");
308 for (
int i = 0; i < 3; ++i) {
309 const char *axisName[] = {
"X axis",
"1st Y axis",
"2nd Y axis" };
370 p = list->
addWidget(
"Axis properties", axisConfig);
372 p->
resize(750, WLength::Auto);
379 if (!WApplication::instance()->environment().javaScript()) {
395 bool haveLegend =
false;
396 std::vector<WDataSeries> series;
497 for (
int i = 0; i < 3; ++i) {
579 case 0: side =
Top;
break;
580 case 1: side =
Right;
break;
581 case 2: side =
Bottom;
break;
582 case 3: side =
Left;
break;
597 case 3: alignment =
AlignTop;
break;
608 for (
unsigned i = 0; i < 4; ++i) {
619 padding = legendRoom ? 80 : 40;
621 padding = legendRoom ? 200 : 80;
629 bool valid = w->
validate() == WValidator::Valid;
631 if (!WApplication::instance()->environment().javaScript()) {
642 if (dynamic_cast<WLineEdit *>(w))