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>
27 #include <Wt/Chart/WCartesianChart>
30 using namespace Wt::Chart;
33 void addHeader(
WTable *t,
const char *value) {
42 bool getDouble(
WLineEdit *edit,
double& value) {
44 value = boost::lexical_cast<
double>(edit->
text().
toUTF8());
52 for (
unsigned i = 0; i < chart->
series().size(); ++i)
83 addEntry(orientation,
"Vertical");
84 addEntry(orientation,
"Horizontal");
87 addEntry(legendLocation,
"Outside");
88 addEntry(legendLocation,
"Inside");
91 addEntry(legendSide,
"Top");
92 addEntry(legendSide,
"Right");
93 addEntry(legendSide,
"Bottom");
94 addEntry(legendSide,
"Left");
97 addEntry(legendAlignment,
"AlignLeft");
98 addEntry(legendAlignment,
"AlignCenter");
99 addEntry(legendAlignment,
"AlignRight");
100 addEntry(legendAlignment,
"AlignTop");
101 addEntry(legendAlignment,
"AlignMiddle");
102 addEntry(legendAlignment,
"AlignBottom");
157 for (
int i = 0; i < chartConfig->
rowCount(); ++i) {
164 p->
resize(750, WLength::Auto);
173 addEntry(types,
"Points");
174 addEntry(types,
"Line");
175 addEntry(types,
"Curve");
176 addEntry(types,
"Bar");
177 addEntry(types,
"Line Area");
178 addEntry(types,
"Curve Area");
179 addEntry(types,
"Stacked Bar");
180 addEntry(types,
"Stacked Line Area");
181 addEntry(types,
"Stacked Curve Area");
184 addEntry(markers,
"None");
185 addEntry(markers,
"Square");
186 addEntry(markers,
"Circle");
187 addEntry(markers,
"Cross");
188 addEntry(markers,
"X cross");
189 addEntry(markers,
"Triangle");
192 addEntry(axes,
"1st Y axis");
193 addEntry(axes,
"2nd Y axis");
196 addEntry(labels,
"None");
197 addEntry(labels,
"X");
198 addEntry(labels,
"Y");
199 addEntry(labels,
"X: Y");
204 ::addHeader(seriesConfig,
"Name");
205 ::addHeader(seriesConfig,
"Enabled");
206 ::addHeader(seriesConfig,
"Type");
207 ::addHeader(seriesConfig,
"Marker");
208 ::addHeader(seriesConfig,
"Y axis");
209 ::addHeader(seriesConfig,
"Legend");
210 ::addHeader(seriesConfig,
"Shadow");
211 ::addHeader(seriesConfig,
"Value labels");
246 int si = seriesIndexOf(chart, j);
274 p = list->
addWidget(
"Series properties", seriesConfig);
277 p->
resize(750, WLength::Auto);
283 addEntry(yScales,
"Linear scale");
284 addEntry(yScales,
"Log scale");
287 addEntry(xScales,
"Categories");
288 addEntry(xScales,
"Linear scale");
289 addEntry(xScales,
"Log scale");
290 addEntry(xScales,
"Date scale");
295 ::addHeader(axisConfig,
"Axis");
296 ::addHeader(axisConfig,
"Visible");
297 ::addHeader(axisConfig,
"Scale");
298 ::addHeader(axisConfig,
"Automatic");
299 ::addHeader(axisConfig,
"Minimum");
300 ::addHeader(axisConfig,
"Maximum");
301 ::addHeader(axisConfig,
"Gridlines");
302 ::addHeader(axisConfig,
"Label angle");
306 for (
int i = 0; i < 3; ++i) {
307 const char *axisName[] = {
"X axis",
"1st Y axis",
"2nd Y axis" };
368 p = list->
addWidget(
"Axis properties", axisConfig);
370 p->
resize(750, WLength::Auto);
377 if (!WApplication::instance()->environment().javaScript()) {
393 bool haveLegend =
false;
394 std::vector<WDataSeries> series;
484 for (
int i = 0; i < 3; ++i) {
566 case 0: side =
Top;
break;
567 case 1: side =
Right;
break;
568 case 2: side =
Bottom;
break;
569 case 3: side =
Left;
break;
584 case 3: alignment =
AlignTop;
break;
595 for (
unsigned i = 0; i < 4; ++i) {
606 padding = legendRoom ? 80 : 40;
608 padding = legendRoom ? 200 : 80;
616 bool valid = w->
validate() == WValidator::Valid;
618 if (!WApplication::instance()->environment().javaScript()) {
629 if (dynamic_cast<WLineEdit *>(w))