Wt examples  3.3.5
Classes | Public Member Functions | Private Member Functions | Static Private Member Functions | Private Attributes | List of all members
ChartConfig Class Reference

A class that allows configuration of a cartesian chart. More...

#include <ChartConfig.h>

Inheritance diagram for ChartConfig:
Inheritance graph
[legend]

Classes

struct  AxisControl
 Struct that holds the controls for one axis. More...
 
struct  SeriesControl
 Struct that holds the controls for one series. More...
 

Public Member Functions

 ChartConfig (Wt::Chart::WCartesianChart *chart, Wt::WContainerWidget *parent)
 Constructor. More...
 
void setValueFill (Wt::Chart::FillRangeType fill)
 

Private Member Functions

void connectSignals (Wt::WFormWidget *w)
 
void update ()
 

Static Private Member Functions

static bool validate (Wt::WFormWidget *w)
 

Private Attributes

Wt::Chart::WCartesianChart * chart_
 
Wt::Chart::FillRangeType fill_
 
std::vector< SeriesControlseriesControls_
 Controls for series. More...
 
std::vector< AxisControlaxisControls_
 Controls for axes. More...
 
Wt::WLineEdit * titleEdit_
 
Wt::WLineEdit * chartWidthEdit_
 
Wt::WLineEdit * chartHeightEdit_
 
Wt::WComboBox * chartOrientationEdit_
 
Wt::WComboBox * legendLocationEdit_
 
Wt::WComboBox * legendSideEdit_
 
Wt::WComboBox * legendAlignmentEdit_
 
Wt::WCheckBox * borderEdit_
 

Detailed Description

A class that allows configuration of a cartesian chart.

This widget provides forms for configuring chart, series, and axis properties and manipulates the chart according to user settings.

This widget is part of the Wt charts example.

Definition at line 37 of file ChartConfig.h.

Constructor & Destructor Documentation

ChartConfig::ChartConfig ( Wt::Chart::WCartesianChart *  chart,
Wt::WContainerWidget *  parent 
)

Constructor.

Definition at line 63 of file ChartConfig.C.

64  : WContainerWidget(parent),
65  chart_(chart),
66  fill_(MinimumValueFill)
67 {
68  chart_->setLegendStyle(chart_->legendFont(), WPen(black),
69  WBrush(WColor(0xFF, 0xFA, 0xE5)));
70 
71  PanelList *list = new PanelList(this);
72 
73  WIntValidator *sizeValidator = new WIntValidator(200, 2000, this);
74  sizeValidator->setMandatory(true);
75 
76  WDoubleValidator *anyNumberValidator = new WDoubleValidator(this);
77  anyNumberValidator->setMandatory(true);
78 
79  WDoubleValidator *angleValidator = new WDoubleValidator(-90, 90, this);
80  angleValidator->setMandatory(true);
81 
82  // ---- Chart properties ----
83 
84  WStandardItemModel *orientation = new WStandardItemModel(0, 1, this);
85  addEntry(orientation, "Vertical");
86  addEntry(orientation, "Horizontal");
87 
88  WStandardItemModel *legendLocation = new WStandardItemModel(0, 1, this);
89  addEntry(legendLocation, "Outside");
90  addEntry(legendLocation, "Inside");
91 
92  WStandardItemModel *legendSide = new WStandardItemModel(0, 1, this);
93  addEntry(legendSide, "Top");
94  addEntry(legendSide, "Right");
95  addEntry(legendSide, "Bottom");
96  addEntry(legendSide, "Left");
97 
98  WStandardItemModel *legendAlignment = new WStandardItemModel(0, 1, this);
99  addEntry(legendAlignment, "AlignLeft");
100  addEntry(legendAlignment, "AlignCenter");
101  addEntry(legendAlignment, "AlignRight");
102  addEntry(legendAlignment, "AlignTop");
103  addEntry(legendAlignment, "AlignMiddle");
104  addEntry(legendAlignment, "AlignBottom");
105 
106  WTable *chartConfig = new WTable();
107  chartConfig->setMargin(WLength::Auto, Left | Right);
108 
109  int row = 0;
110  chartConfig->elementAt(row, 0)->addWidget(new WText("Title:"));
111  titleEdit_ = new WLineEdit(chartConfig->elementAt(row, 1));
113  ++row;
114 
115  chartConfig->elementAt(row, 0)->addWidget(new WText("Width:"));
116  chartWidthEdit_ = new WLineEdit(chartConfig->elementAt(row, 1));
118  ->setText(WLocale::currentLocale().toString(chart_->width().value()));
119  chartWidthEdit_->setValidator(sizeValidator);
120  chartWidthEdit_->setMaxLength(4);
122  ++row;
123 
124  chartConfig->elementAt(row, 0)->addWidget(new WText("Height:"));
125  chartHeightEdit_ = new WLineEdit(chartConfig->elementAt(row, 1));
127  ->setText(WLocale::currentLocale().toString(chart_->height().value()));
128  chartHeightEdit_->setValidator(sizeValidator);
129  chartHeightEdit_->setMaxLength(4);
131  ++row;
132 
133  chartConfig->elementAt(row, 0)->addWidget(new WText("Orientation:"));
134  chartOrientationEdit_ = new WComboBox(chartConfig->elementAt(row, 1));
135  chartOrientationEdit_->setModel(orientation);
136  chartOrientationEdit_->setCurrentIndex(0);
138  ++row;
139 
140  chartConfig->elementAt(row, 0)->addWidget(new WText("Legend location:"));
141  legendLocationEdit_ = new WComboBox(chartConfig->elementAt(row, 1));
142  legendLocationEdit_->setModel(legendLocation);
143  legendLocationEdit_->setCurrentIndex(0);
145  ++row;
146 
147  chartConfig->elementAt(row, 0)->addWidget(new WText("Legend side:"));
148  legendSideEdit_ = new WComboBox(chartConfig->elementAt(row, 1));
149  legendSideEdit_->setModel(legendSide);
150  legendSideEdit_->setCurrentIndex(1);
151  legendSideEdit_->setCurrentIndex(0);
153  ++row;
154 
155  chartConfig->elementAt(row, 0)->addWidget(new WText("Legend alignment:"));
156  legendAlignmentEdit_ = new WComboBox(chartConfig->elementAt(row, 1));
157  legendAlignmentEdit_->setModel(legendAlignment);
158  legendAlignmentEdit_->setCurrentIndex(4);
159  legendAlignmentEdit_->setCurrentIndex(0);
161  ++row;
162 
163  chartConfig->elementAt(row, 0)->addWidget(new WText("Border:"));
164  borderEdit_ = new WCheckBox(chartConfig->elementAt(row, 1));
165  borderEdit_->setChecked(false);
167  ++row;
168 
169  for (int i = 0; i < chartConfig->rowCount(); ++i) {
170  chartConfig->elementAt(i, 0)->setStyleClass("tdhead");
171  chartConfig->elementAt(i, 1)->setStyleClass("tddata");
172  }
173 
174  WPanel *p = list->addWidget("Chart properties", chartConfig);
175  p->setMargin(WLength::Auto, Left | Right);
176  p->resize(1080, WLength::Auto);
177  p->setMargin(20, Top | Bottom);
178 
179  // ---- Series properties ----
180 
181  WStandardItemModel *types = new WStandardItemModel(0, 1, this);
182  addEntry(types, "Points");
183  addEntry(types, "Line");
184  addEntry(types, "Curve");
185  addEntry(types, "Bar");
186  addEntry(types, "Line Area");
187  addEntry(types, "Curve Area");
188  addEntry(types, "Stacked Bar");
189  addEntry(types, "Stacked Line Area");
190  addEntry(types, "Stacked Curve Area");
191 
192  WStandardItemModel *markers = new WStandardItemModel(0, 1, this);
193  addEntry(markers, "None");
194  addEntry(markers, "Square");
195  addEntry(markers, "Circle");
196  addEntry(markers, "Cross");
197  addEntry(markers, "X cross");
198  addEntry(markers, "Triangle");
199  addEntry(markers, "Diamond");
200 
201  WStandardItemModel *axes = new WStandardItemModel(0, 1, this);
202  addEntry(axes, "1st Y axis");
203  addEntry(axes, "2nd Y axis");
204 
205  WStandardItemModel *labels = new WStandardItemModel(0, 1, this);
206  addEntry(labels, "None");
207  addEntry(labels, "X");
208  addEntry(labels, "Y");
209  addEntry(labels, "X: Y");
210 
211  WTable *seriesConfig = new WTable();
212  seriesConfig->setMargin(WLength::Auto, Left | Right);
213 
214  ::addHeader(seriesConfig, "Name");
215  ::addHeader(seriesConfig, "Enabled");
216  ::addHeader(seriesConfig, "Type");
217  ::addHeader(seriesConfig, "Marker");
218  ::addHeader(seriesConfig, "Y axis");
219  ::addHeader(seriesConfig, "Legend");
220  ::addHeader(seriesConfig, "Shadow");
221  ::addHeader(seriesConfig, "Value labels");
222 
223  seriesConfig->rowAt(0)->setStyleClass("trhead");
224 
225  for (int j = 1; j < chart->model()->columnCount(); ++j) {
226  SeriesControl sc;
227 
228  new WText(asString(chart->model()->headerData(j)),
229  seriesConfig->elementAt(j, 0));
230 
231  sc.enabledEdit = new WCheckBox(seriesConfig->elementAt(j, 1));
232  connectSignals(sc.enabledEdit);
233 
234  sc.typeEdit = new WComboBox(seriesConfig->elementAt(j, 2));
235  sc.typeEdit->setModel(types);
236  sc.typeEdit->setCurrentIndex(0);
237  connectSignals(sc.typeEdit);
238 
239  sc.markerEdit = new WComboBox(seriesConfig->elementAt(j, 3));
240  sc.markerEdit->setModel(markers);
241  sc.markerEdit->setCurrentIndex(0);
242  connectSignals(sc.markerEdit);
243 
244  sc.axisEdit = new WComboBox(seriesConfig->elementAt(j, 4));
245  sc.axisEdit->setModel(axes);
246  sc.axisEdit->setCurrentIndex(0);
247  connectSignals(sc.axisEdit);
248 
249  sc.legendEdit = new WCheckBox(seriesConfig->elementAt(j, 5));
250  connectSignals(sc.legendEdit);
251 
252  sc.shadowEdit = new WCheckBox(seriesConfig->elementAt(j, 6));
253  connectSignals(sc.shadowEdit);
254 
255  sc.labelsEdit = new WComboBox(seriesConfig->elementAt(j, 7));
256  sc.labelsEdit->setModel(labels);
257  sc.labelsEdit->setCurrentIndex(0);
258  connectSignals(sc.labelsEdit);
259 
260  int si = seriesIndexOf(chart, j);
261 
262  if (si != -1) {
263  sc.enabledEdit->setChecked();
264  const WDataSeries& s = chart_->series(j);
265  switch (s.type()) {
266  case PointSeries:
267  sc.typeEdit->setCurrentIndex(0); break;
268  case LineSeries:
269  sc.typeEdit->setCurrentIndex(s.fillRange() != NoFill ?
270  (s.isStacked() ? 7 : 4) : 1); break;
271  case CurveSeries:
272  sc.typeEdit->setCurrentIndex(s.fillRange() != NoFill ?
273  (s.isStacked() ? 8 : 5) : 2); break;
274  case BarSeries:
275  sc.typeEdit->setCurrentIndex(s.isStacked() ? 6 : 3);
276  }
277 
278  sc.markerEdit->setCurrentIndex((int)s.marker());
279  sc.legendEdit->setChecked(s.isLegendEnabled());
280  sc.shadowEdit->setChecked(s.shadow() != WShadow());
281  }
282 
283  seriesControls_.push_back(sc);
284 
285  seriesConfig->rowAt(j)->setStyleClass("trdata");
286  }
287 
288  p = list->addWidget("Series properties", seriesConfig);
289  p->expand();
290  p->setMargin(WLength::Auto, Left | Right);
291  p->resize(1080, WLength::Auto);
292  p->setMargin(20, Top | Bottom);
293 
294  // ---- Axis properties ----
295 
296  WStandardItemModel *yScales = new WStandardItemModel(0, 1, this);
297  addEntry(yScales, "Linear scale");
298  addEntry(yScales, "Log scale");
299 
300  WStandardItemModel *xScales = new WStandardItemModel(0, 1, this);
301  addEntry(xScales, "Categories");
302  addEntry(xScales, "Linear scale");
303  addEntry(xScales, "Log scale");
304  addEntry(xScales, "Date scale");
305 
306  WTable *axisConfig = new WTable();
307  axisConfig->setMargin(WLength::Auto, Left | Right);
308 
309  ::addHeader(axisConfig, "Axis");
310  ::addHeader(axisConfig, "Visible");
311  ::addHeader(axisConfig, "Scale");
312  ::addHeader(axisConfig, "Automatic");
313  ::addHeader(axisConfig, "Minimum");
314  ::addHeader(axisConfig, "Maximum");
315  ::addHeader(axisConfig, "Gridlines");
316  ::addHeader(axisConfig, "Label angle");
317  ::addHeader(axisConfig, "Title");
318  ::addHeader(axisConfig, "Title orientation");
319  ::addHeader(axisConfig, "Tick direction");
320  ::addHeader(axisConfig, "Location");
321 
322  axisConfig->rowAt(0)->setStyleClass("trhead");
323 
324  for (int i = 0; i < 3; ++i) {
325  const char *axisName[] = { "X axis", "1st Y axis", "2nd Y axis" };
326  int j = i + 1;
327 
328  const WAxis& axis = chart_->axis(static_cast<Axis>(i));
329  AxisControl sc;
330 
331  new WText(WString(axisName[i], UTF8), axisConfig->elementAt(j, 0));
332 
333  sc.visibleEdit = new WCheckBox(axisConfig->elementAt(j, 1));
334  sc.visibleEdit->setChecked(axis.isVisible());
335  connectSignals(sc.visibleEdit);
336 
337  sc.scaleEdit = new WComboBox(axisConfig->elementAt(j, 2));
338  if (axis.scale() == CategoryScale)
339  sc.scaleEdit->addItem("Category scale");
340  else {
341  if (axis.id() == XAxis) {
342  sc.scaleEdit->setModel(xScales);
343  sc.scaleEdit->setCurrentIndex(axis.scale());
344  } else {
345  sc.scaleEdit->setModel(yScales);
346  sc.scaleEdit->setCurrentIndex(axis.scale() - 1);
347  }
348  }
349  connectSignals(sc.scaleEdit);
350 
351  bool autoValues = axis.autoLimits() == (MinimumValue | MaximumValue);
352 
353  sc.minimumEdit = new WLineEdit(axisConfig->elementAt(j, 4));
354  sc.minimumEdit->setText(WLocale::currentLocale()
355  .toString(axis.minimum()));
356  sc.minimumEdit->setValidator(anyNumberValidator);
357  sc.minimumEdit->setEnabled(!autoValues);
358  connectSignals(sc.minimumEdit);
359 
360  sc.maximumEdit = new WLineEdit(axisConfig->elementAt(j, 5));
361  sc.maximumEdit->setText(WLocale::currentLocale()
362  .toString(axis.maximum()));
363  sc.maximumEdit->setValidator(anyNumberValidator);
364  sc.maximumEdit->setEnabled(!autoValues);
365  connectSignals(sc.maximumEdit);
366 
367  sc.autoEdit = new WCheckBox(axisConfig->elementAt(j, 3));
368  sc.autoEdit->setChecked(autoValues);
369  connectSignals(sc.autoEdit);
370  sc.autoEdit->checked().connect(sc.maximumEdit, &WLineEdit::disable);
371  sc.autoEdit->unChecked().connect(sc.maximumEdit, &WLineEdit::enable);
372  sc.autoEdit->checked().connect(sc.minimumEdit, &WLineEdit::disable);
373  sc.autoEdit->unChecked().connect(sc.minimumEdit, &WLineEdit::enable);
374 
375  sc.gridLinesEdit = new WCheckBox(axisConfig->elementAt(j, 6));
376  connectSignals(sc.gridLinesEdit);
377 
378  sc.labelAngleEdit = new WLineEdit(axisConfig->elementAt(j, 7));
379  sc.labelAngleEdit->setText("0");
380  sc.labelAngleEdit->setValidator(angleValidator);
381  connectSignals(sc.labelAngleEdit);
382 
383  sc.titleEdit = new WLineEdit(axisConfig->elementAt(j, 8));
384  sc.titleEdit->setText("");
385  connectSignals(sc.titleEdit);
386 
387  sc.titleOrientationEdit = new WComboBox(axisConfig->elementAt(j, 9));
388  sc.titleOrientationEdit->addItem("Horizontal");
389  sc.titleOrientationEdit->addItem("Vertical");
390  sc.titleOrientationEdit->setCurrentIndex(0);
391  connectSignals(sc.titleOrientationEdit);
392 
393  sc.tickDirectionEdit = new WComboBox(axisConfig->elementAt(j, 10));
394  sc.tickDirectionEdit->addItem("Outwards");
395  sc.tickDirectionEdit->addItem("Inwards");
396  sc.tickDirectionEdit->setCurrentIndex(0);
397  connectSignals(sc.tickDirectionEdit);
398 
399  sc.locationEdit = new WComboBox(axisConfig->elementAt(j, 11));
400  sc.locationEdit->addItem("Minimum value");
401  sc.locationEdit->addItem("Maximum value");
402  sc.locationEdit->addItem("Zero value");
403  sc.locationEdit->addItem("Both sides");
404  sc.locationEdit->setCurrentIndex(0);
405  if (axis.location() == ZeroValue) {
406  sc.locationEdit->setCurrentIndex(2);
407  }
408  connectSignals(sc.locationEdit);
409 
410  axisConfig->rowAt(j)->setStyleClass("trdata");
411 
412  axisControls_.push_back(sc);
413  }
414 
415  p = list->addWidget("Axis properties", axisConfig);
416  p->setMargin(WLength::Auto, Left | Right);
417  p->resize(1080, WLength::Auto);
418  p->setMargin(20, Top | Bottom);
419 
420  /*
421  * If we do not have JavaScript, then add a button to reflect changes to
422  * the chart.
423  */
424  if (!WApplication::instance()->environment().javaScript()) {
425  WPushButton *b = new WPushButton(this);
426  b->setText("Update chart");
427  b->setInline(false); // so we can add margin to center horizontally
428  b->setMargin(WLength::Auto, Left | Right);
429  b->clicked().connect(this, &ChartConfig::update);
430  }
431 }
Wt::WCheckBox * borderEdit_
Definition: ChartConfig.h:89
Wt::Chart::FillRangeType fill_
Definition: ChartConfig.h:48
Wt::WLineEdit * titleEdit_
Definition: ChartConfig.h:82
Wt::Chart::WCartesianChart * chart_
Definition: ChartConfig.h:47
void connectSignals(Wt::WFormWidget *w)
Definition: ChartConfig.C:718
Wt::WLineEdit * chartWidthEdit_
Definition: ChartConfig.h:83
Wt::WPanel * addWidget(const Wt::WString &text, Wt::WWidget *w)
Definition: PanelList.C:17
Wt::WComboBox * chartOrientationEdit_
Definition: ChartConfig.h:85
Wt::WComboBox * legendLocationEdit_
Definition: ChartConfig.h:86
std::vector< SeriesControl > seriesControls_
Controls for series.
Definition: ChartConfig.h:62
Wt::WComboBox * legendSideEdit_
Definition: ChartConfig.h:87
std::vector< AxisControl > axisControls_
Controls for axes.
Definition: ChartConfig.h:80
void update()
Definition: ChartConfig.C:438
Wt::WComboBox * legendAlignmentEdit_
Definition: ChartConfig.h:88
Wt::WLineEdit * chartHeightEdit_
Definition: ChartConfig.h:84

Member Function Documentation

void ChartConfig::connectSignals ( Wt::WFormWidget *  w)
private

Definition at line 718 of file ChartConfig.C.

719 {
720  w->changed().connect(this, &ChartConfig::update);
721  if (dynamic_cast<WLineEdit *>(w))
722  w->enterPressed().connect(this, &ChartConfig::update);
723 }
void update()
Definition: ChartConfig.C:438
void ChartConfig::setValueFill ( Wt::Chart::FillRangeType  fill)

Definition at line 433 of file ChartConfig.C.

434 {
435  fill_ = fill;
436 }
Wt::Chart::FillRangeType fill_
Definition: ChartConfig.h:48
void ChartConfig::update ( )
private

Definition at line 438 of file ChartConfig.C.

439 {
440  bool haveLegend = false;
441  std::vector<WDataSeries> series;
442 
443  for (int i = 1; i < chart_->model()->columnCount(); ++i) {
444  SeriesControl& sc = seriesControls_[i-1];
445 
446  if (sc.enabledEdit->isChecked()) {
447  WDataSeries s(i);
448 
449  switch (sc.typeEdit->currentIndex()) {
450  case 0:
451  s.setType(PointSeries);
452  if (sc.markerEdit->currentIndex() == 0)
453  sc.markerEdit->setCurrentIndex(1);
454  break;
455  case 1:
456  s.setType(LineSeries);
457  sc.markerEdit->setCurrentIndex(0);
458  break;
459  case 2:
460  s.setType(CurveSeries);
461  sc.markerEdit->setCurrentIndex(0);
462  break;
463  case 3:
464  s.setType(BarSeries);
465  sc.markerEdit->setCurrentIndex(0);
466  break;
467  case 4:
468  s.setType(LineSeries);
469  s.setFillRange(fill_);
470  sc.markerEdit->setCurrentIndex(0);
471  break;
472  case 5:
473  s.setType(CurveSeries);
474  s.setFillRange(fill_);
475  sc.markerEdit->setCurrentIndex(0);
476  break;
477  case 6:
478  s.setType(BarSeries);
479  s.setStacked(true);
480  sc.markerEdit->setCurrentIndex(0);
481  break;
482  case 7:
483  s.setType(LineSeries);
484  s.setFillRange(fill_);
485  s.setStacked(true);
486  sc.markerEdit->setCurrentIndex(0);
487  break;
488  case 8:
489  s.setType(CurveSeries);
490  s.setFillRange(fill_);
491  s.setStacked(true);
492  sc.markerEdit->setCurrentIndex(0);
493  }
494 
495  //set WPainterPath to draw a diamond
496  if(sc.markerEdit->currentIndex() == CustomMarker){
497  WPainterPath pp = WPainterPath();
498  pp.moveTo(-6, 0);
499  pp.lineTo(0, 6);
500  pp.lineTo(6, 0);
501  pp.lineTo(0, -6);
502  pp.lineTo(-6, 0);
503  s.setCustomMarker(pp);
504  }
505 
506  s.setMarker(static_cast<MarkerType>(sc.markerEdit->currentIndex()));
507 
508  if (sc.axisEdit->currentIndex() == 1) {
509  s.bindToAxis(Y2Axis);
510  }
511 
512  if (sc.legendEdit->isChecked()) {
513  s.setLegendEnabled(true);
514  haveLegend = true;
515  } else
516  s.setLegendEnabled(false);
517 
518  if (sc.shadowEdit->isChecked()) {
519  s.setShadow(WShadow(3, 3, WColor(0, 0, 0, 127), 3));
520  } else
521  s.setShadow(WShadow());
522 
523  switch (sc.labelsEdit->currentIndex()) {
524  case 1:
525  s.setLabelsEnabled(XAxis);
526  break;
527  case 2:
528  s.setLabelsEnabled(YAxis);
529  break;
530  case 3:
531  s.setLabelsEnabled(XAxis);
532  s.setLabelsEnabled(YAxis);
533  break;
534  }
535 
536  series.push_back(s);
537  }
538  }
539 
540  chart_->setSeries(series);
541 
542  for (int i = 0; i < 3; ++i) {
543  AxisControl& sc = axisControls_[i];
544  WAxis& axis = chart_->axis(static_cast<Axis>(i));
545 
546  axis.setVisible(sc.visibleEdit->isChecked());
547 
548  if (sc.scaleEdit->count() != 1) {
549  int k = sc.scaleEdit->currentIndex();
550  if (axis.id() != XAxis)
551  k += 1;
552  else {
553  if (k == 0)
554  chart_->setType(CategoryChart);
555  else
556  chart_->setType(ScatterPlot);
557  }
558 
559  switch (k) {
560  case 1:
561  axis.setScale(LinearScale); break;
562  case 2:
563  axis.setScale(LogScale); break;
564  case 3:
565  axis.setScale(DateScale); break;
566  }
567  }
568 
569  if (sc.autoEdit->isChecked())
570  axis.setAutoLimits(MinimumValue | MaximumValue);
571  else {
572  if (axis.autoLimits() & (MinimumValue | MaximumValue)) {
573  sc.minimumEdit->setText(WLocale::currentLocale()
574  .toString(axis.minimum()));
575  sc.maximumEdit->setText(WLocale::currentLocale()
576  .toString(axis.maximum()));
577  }
578  if (validate(sc.minimumEdit) && validate(sc.maximumEdit)) {
579  double min, max;
580  getDouble(sc.minimumEdit, min);
581  getDouble(sc.maximumEdit, max);
582 
583  if (axis.scale() == LogScale)
584  if (min <= 0)
585  min = 0.0001;
586 
587  if (axis.scale() == DateScale){
588  //the number of julian days until year 1986
589  WDate dMin = WDate(1900,1,1);
590  double gregDaysMin = (double)dMin.toJulianDay();
591  //the number of julian days until year 1988
592  WDate dMax = WDate(3000,1,1);
593  double gregDaysMax = (double)dMax.toJulianDay();
594 
595  bool greg_year_validation =
596  (min > gregDaysMin &&
597  min < gregDaysMax &&
598  max > gregDaysMin &&
599  max < gregDaysMax);
600 
601  if(!greg_year_validation){
602  min = gregDaysMin;
603  max = gregDaysMax;
604  }
605  }
606 
607  axis.setRange(min, max);
608  }
609 
610  }
611 
612  if (validate(sc.labelAngleEdit)) {
613  double angle;
614  getDouble(sc.labelAngleEdit, angle);
615  axis.setLabelAngle(angle);
616  }
617 
618  axis.setGridLinesEnabled(sc.gridLinesEdit->isChecked());
619 
620  axis.setTitle(sc.titleEdit->text());
621 
622  axis.setTitleOrientation(sc.titleOrientationEdit->currentIndex() == 0 ? Horizontal : Vertical);
623 
624  axis.setTickDirection(sc.tickDirectionEdit->currentIndex() == 0 ? Outwards : Inwards);
625 
626  switch (sc.locationEdit->currentIndex()) {
627  case 0:
628  axis.setLocation(MinimumValue);
629  break;
630  case 1:
631  axis.setLocation(MaximumValue);
632  break;
633  case 2:
634  axis.setLocation(ZeroValue);
635  break;
636  case 3:
637  axis.setLocation(BothSides);
638  break;
639  }
640  }
641 
642  chart_->setTitle(titleEdit_->text());
643 
645  double width, height;
646  getDouble(chartWidthEdit_, width);
647  getDouble(chartHeightEdit_, height);
648  chart_->resize(width, height);
649  }
650 
651  switch (chartOrientationEdit_->currentIndex()) {
652  case 0:
653  chart_->setOrientation(Vertical); break;
654  case 1:
655  chart_->setOrientation(Horizontal); break;
656  }
657 
658  chart_->setLegendEnabled(haveLegend);
659 
660  if (haveLegend) {
661  LegendLocation location = LegendOutside;
662  Side side = Right;
663  AlignmentFlag alignment = AlignMiddle;
664  switch (legendLocationEdit_->currentIndex()) {
665  case 0: location = LegendOutside; break;
666  case 1: location = LegendInside; break;
667  }
668 
669  switch (legendSideEdit_->currentIndex()) {
670  case 0: side = Top; break;
671  case 1: side = Right; break;
672  case 2: side = Bottom; break;
673  case 3: side = Left; break;
674  }
675 
676  if (side == Left || side == Right) {
677  if (legendAlignmentEdit_->currentIndex() < 3)
678  legendAlignmentEdit_->setCurrentIndex(4);
679  } else {
680  if (legendAlignmentEdit_->currentIndex() >= 3)
681  legendAlignmentEdit_->setCurrentIndex(2);
682  }
683 
684  switch (legendAlignmentEdit_->currentIndex()) {
685  case 0: alignment = AlignLeft; break;
686  case 1: alignment = AlignCenter; break;
687  case 2: alignment = AlignRight; break;
688  case 3: alignment = AlignTop; break;
689  case 4: alignment = AlignMiddle; break;
690  case 5: alignment = AlignBottom; break;
691  }
692 
693  chart_->setLegendLocation(location, side, alignment);
694 
695  chart_->setLegendColumns((side == Top || side == Bottom ) ? 2 : 1,
696  WLength(100));
697  }
698 
699  if (borderEdit_->isChecked()) {
700  chart_->setBorderPen(WPen());
701  } else {
702  chart_->setBorderPen(NoPen);
703  }
704 }
Wt::WCheckBox * borderEdit_
Definition: ChartConfig.h:89
Wt::Chart::FillRangeType fill_
Definition: ChartConfig.h:48
Wt::WLineEdit * titleEdit_
Definition: ChartConfig.h:82
Wt::Chart::WCartesianChart * chart_
Definition: ChartConfig.h:47
Wt::WLineEdit * chartWidthEdit_
Definition: ChartConfig.h:83
Wt::WComboBox * chartOrientationEdit_
Definition: ChartConfig.h:85
Wt::WComboBox * legendLocationEdit_
Definition: ChartConfig.h:86
std::vector< SeriesControl > seriesControls_
Controls for series.
Definition: ChartConfig.h:62
Wt::WComboBox * legendSideEdit_
Definition: ChartConfig.h:87
std::vector< AxisControl > axisControls_
Controls for axes.
Definition: ChartConfig.h:80
Wt::WComboBox * legendAlignmentEdit_
Definition: ChartConfig.h:88
static bool validate(Wt::WFormWidget *w)
Definition: ChartConfig.C:706
Wt::WLineEdit * chartHeightEdit_
Definition: ChartConfig.h:84
bool ChartConfig::validate ( Wt::WFormWidget *  w)
staticprivate

Definition at line 706 of file ChartConfig.C.

707 {
708  bool valid = w->validate() == WValidator::Valid;
709 
710  if (!WApplication::instance()->environment().javaScript()) {
711  w->setStyleClass(valid ? "" : "Wt-invalid");
712  w->setToolTip(valid ? "" : "Invalid value");
713  }
714 
715  return valid;
716 }

Member Data Documentation

std::vector<AxisControl> ChartConfig::axisControls_
private

Controls for axes.

Definition at line 80 of file ChartConfig.h.

Wt::WCheckBox* ChartConfig::borderEdit_
private

Definition at line 89 of file ChartConfig.h.

Wt::Chart::WCartesianChart* ChartConfig::chart_
private

Definition at line 47 of file ChartConfig.h.

Wt::WLineEdit* ChartConfig::chartHeightEdit_
private

Definition at line 84 of file ChartConfig.h.

Wt::WComboBox* ChartConfig::chartOrientationEdit_
private

Definition at line 85 of file ChartConfig.h.

Wt::WLineEdit* ChartConfig::chartWidthEdit_
private

Definition at line 83 of file ChartConfig.h.

Wt::Chart::FillRangeType ChartConfig::fill_
private

Definition at line 48 of file ChartConfig.h.

Wt::WComboBox* ChartConfig::legendAlignmentEdit_
private

Definition at line 88 of file ChartConfig.h.

Wt::WComboBox* ChartConfig::legendLocationEdit_
private

Definition at line 86 of file ChartConfig.h.

Wt::WComboBox* ChartConfig::legendSideEdit_
private

Definition at line 87 of file ChartConfig.h.

std::vector<SeriesControl> ChartConfig::seriesControls_
private

Controls for series.

Definition at line 62 of file ChartConfig.h.

Wt::WLineEdit* ChartConfig::titleEdit_
private

Definition at line 82 of file ChartConfig.h.


The documentation for this class was generated from the following files:

Generated on Sun May 22 2016 for the C++ Web Toolkit (Wt) by doxygen 1.8.11