11 #include <boost/date_time/gregorian/greg_year.hpp>
13 #include <Wt/WAbstractItemModel>
14 #include <Wt/WApplication>
15 #include <Wt/WCheckBox>
16 #include <Wt/WComboBox>
17 #include <Wt/WDoubleValidator>
19 #include <Wt/WEnvironment>
20 #include <Wt/WIntValidator>
21 #include <Wt/WLineEdit>
24 #include <Wt/WPushButton>
25 #include <Wt/WStandardItemModel>
28 #include <Wt/WPainterPath>
30 #include <Wt/Chart/WCartesianChart>
33 using namespace Wt::Chart;
36 void addHeader(
WTable *t,
const char *value) {
45 bool getDouble(
WLineEdit *edit,
double& value) {
55 for (
unsigned i = 0; i < chart->
series().size(); ++i)
75 sizeValidator->setMandatory(
true);
78 anyNumberValidator->setMandatory(
true);
81 angleValidator->setMandatory(
true);
86 addEntry(orientation,
"Vertical");
87 addEntry(orientation,
"Horizontal");
90 addEntry(legendLocation,
"Outside");
91 addEntry(legendLocation,
"Inside");
94 addEntry(legendSide,
"Top");
95 addEntry(legendSide,
"Right");
96 addEntry(legendSide,
"Bottom");
97 addEntry(legendSide,
"Left");
100 addEntry(legendAlignment,
"AlignLeft");
101 addEntry(legendAlignment,
"AlignCenter");
102 addEntry(legendAlignment,
"AlignRight");
103 addEntry(legendAlignment,
"AlignTop");
104 addEntry(legendAlignment,
"AlignMiddle");
105 addEntry(legendAlignment,
"AlignBottom");
134 chartConfig->
elementAt(row, 0)->addWidget(
new WText(
"Orientation:"));
140 chartConfig->
elementAt(row, 0)->addWidget(
new WText(
"Legend location:"));
146 chartConfig->
elementAt(row, 0)->addWidget(
new WText(
"Legend side:"));
153 chartConfig->
elementAt(row, 0)->addWidget(
new WText(
"Legend alignment:"));
160 for (
int i = 0; i < chartConfig->
rowCount(); ++i) {
167 p->
resize(880, WLength::Auto);
176 addEntry(types,
"Points");
177 addEntry(types,
"Line");
178 addEntry(types,
"Curve");
179 addEntry(types,
"Bar");
180 addEntry(types,
"Line Area");
181 addEntry(types,
"Curve Area");
182 addEntry(types,
"Stacked Bar");
183 addEntry(types,
"Stacked Line Area");
184 addEntry(types,
"Stacked Curve Area");
187 addEntry(markers,
"None");
188 addEntry(markers,
"Square");
189 addEntry(markers,
"Circle");
190 addEntry(markers,
"Cross");
191 addEntry(markers,
"X cross");
192 addEntry(markers,
"Triangle");
193 addEntry(markers,
"Diamond");
196 addEntry(axes,
"1st Y axis");
197 addEntry(axes,
"2nd Y axis");
200 addEntry(labels,
"None");
201 addEntry(labels,
"X");
202 addEntry(labels,
"Y");
203 addEntry(labels,
"X: Y");
208 ::addHeader(seriesConfig,
"Name");
209 ::addHeader(seriesConfig,
"Enabled");
210 ::addHeader(seriesConfig,
"Type");
211 ::addHeader(seriesConfig,
"Marker");
212 ::addHeader(seriesConfig,
"Y axis");
213 ::addHeader(seriesConfig,
"Legend");
214 ::addHeader(seriesConfig,
"Shadow");
215 ::addHeader(seriesConfig,
"Value labels");
250 int si = seriesIndexOf(chart, j);
278 p = list->
addWidget(
"Series properties", seriesConfig);
281 p->
resize(880, WLength::Auto);
287 addEntry(yScales,
"Linear scale");
288 addEntry(yScales,
"Log scale");
291 addEntry(xScales,
"Categories");
292 addEntry(xScales,
"Linear scale");
293 addEntry(xScales,
"Log scale");
294 addEntry(xScales,
"Date scale");
299 ::addHeader(axisConfig,
"Axis");
300 ::addHeader(axisConfig,
"Visible");
301 ::addHeader(axisConfig,
"Scale");
302 ::addHeader(axisConfig,
"Automatic");
303 ::addHeader(axisConfig,
"Minimum");
304 ::addHeader(axisConfig,
"Maximum");
305 ::addHeader(axisConfig,
"Gridlines");
306 ::addHeader(axisConfig,
"Label angle");
310 for (
int i = 0; i < 3; ++i) {
311 const char *axisName[] = {
"X axis",
"1st Y axis",
"2nd Y axis" };
374 p = list->
addWidget(
"Axis properties", axisConfig);
376 p->
resize(880, WLength::Auto);
383 if (!WApplication::instance()->environment().javaScript()) {
399 bool haveLegend =
false;
400 std::vector<WDataSeries> series;
501 for (
int i = 0; i < 3; ++i) {
548 bool greg_year_validation =
549 (min > gregDaysMin &&
554 if(!greg_year_validation){
603 case 0: side =
Top;
break;
604 case 1: side =
Right;
break;
605 case 2: side =
Bottom;
break;
606 case 3: side =
Left;
break;
621 case 3: alignment =
AlignTop;
break;
632 for (
unsigned i = 0; i < 4; ++i) {
643 padding = legendRoom ? 80 : 40;
645 padding = legendRoom ? 200 : 80;
653 bool valid = w->validate() == WValidator::Valid;
655 if (!WApplication::instance()->environment().javaScript()) {
666 if (dynamic_cast<WLineEdit *>(w))
void setVisible(bool visible)
virtual boost::any headerData(int section, Orientation orientation=Horizontal, int role=DisplayRole) const
void setType(SeriesType t)
void lineTo(const WPointF &point)
MarkerType marker() const
ChartConfig(Wt::Chart::WCartesianChart *chart, Wt::WContainerWidget *parent)
Constructor.
WString asString(const boost::any &v, const WString &formatString=WString())
bool isLegendEnabled() const
bool isLegendEnabled() const
Wt::Chart::FillRangeType fill_
Wt::WComboBox * scaleEdit
Wt::WLineEdit * titleEdit_
void setGridLinesEnabled(bool enabled)
Wt::Chart::WCartesianChart * chart_
void addItem(const WString &text)
void connectSignals(Wt::WFormWidget *w)
virtual bool insertRows(int row, int count, const WModelIndex &parent=WModelIndex())
void setShadow(const WShadow &shadow)
void setLegendStyle(const WFont &font, const WPen &border, const WBrush &background)
Wt::WCheckBox * enabledEdit
void setType(ChartType type)
Struct that holds the controls for one series.
void setMarker(MarkerType marker)
void setLegendLocation(LegendLocation location, Side side, AlignmentFlag alignment)
virtual int rowCount(const WModelIndex &parent=WModelIndex()) const =0
void initLayout(const WRectF &rectangle=WRectF())
Wt::Signals::connection connect(const F &function)
void setSeries(const std::vector< WDataSeries > &series)
Wt::WCheckBox * visibleEdit
LegendLocation legendLocation() const
void setLegendEnabled(bool enabled)
Wt::WComboBox * markerEdit
Wt::WLineEdit * chartWidthEdit_
Struct that holds the controls for one axis.
WTableCell * elementAt(int row, int column)
Wt::WPanel * addWidget(const Wt::WString &text, Wt::WWidget *w)
Wt::WComboBox * chartOrientationEdit_
Wt::WComboBox * legendLocationEdit_
std::vector< SeriesControl > seriesControls_
Controls for series.
WAbstractItemModel * model() const
void setCurrentIndex(int index)
void setScale(AxisScale scale)
void setStyleClass(const WString &style)
WDataSeries & series(int modelColumn)
WFlags< AxisValue > autoLimits() const
Wt::WLineEdit * minimumEdit
FillRangeType fillRange() const
void setCustomMarker(const WPainterPath &path)
void setAutoLimits(WFlags< AxisValue > locations)
Wt::WComboBox * legendSideEdit_
std::vector< AxisControl > axisControls_
Controls for axes.
Wt::WCheckBox * shadowEdit
Wt::WComboBox * labelsEdit
void setLabelsEnabled(Axis axis, bool enabled=true)
void setValueFill(Wt::Chart::FillRangeType fill)
Wt::WLineEdit * labelAngleEdit
void setModel(WAbstractItemModel *model)
virtual int columnCount(const WModelIndex &parent=WModelIndex()) const =0
void moveTo(const WPointF &point)
void setStacked(bool stacked)
void setPlotAreaPadding(int padding, WFlags< Side > sides=All)
void setOrientation(Orientation orientation)
Wt::WCheckBox * legendEdit
void setRange(double minimum, double maximum)
Wt::WCheckBox * gridLinesEdit
void setLegendEnabled(bool enabled)
static const WLocale & currentLocale()
void bindToAxis(Axis axis)
Wt::WComboBox * legendAlignmentEdit_
Wt::WLineEdit * maximumEdit
virtual bool setData(const WModelIndex &index, const boost::any &value, int role=EditRole)
void setTitle(const WString &title)
WTableRow * rowAt(int row)
void setLabelAngle(double angle)
void setFillRange(FillRangeType fillRange)
void setLegendColumns(int columns, const WLength &width)
static bool validate(Wt::WFormWidget *w)
Wt::WLineEdit * chartHeightEdit_
double toDouble(const WString &value) const
const WShadow & shadow() const