Wt examples  3.3.6
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::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);
152  ++row;
153 
154  chartConfig->elementAt(row, 0)->addWidget(new WText("Legend alignment:"));
155  legendAlignmentEdit_ = new WComboBox(chartConfig->elementAt(row, 1));
156  legendAlignmentEdit_->setModel(legendAlignment);
157  legendAlignmentEdit_->setCurrentIndex(4);
159  ++row;
160 
161  chartConfig->elementAt(row, 0)->addWidget(new WText("Border:"));
162  borderEdit_ = new WCheckBox(chartConfig->elementAt(row, 1));
163  borderEdit_->setChecked(false);
165  ++row;
166 
167  for (int i = 0; i < chartConfig->rowCount(); ++i) {
168  chartConfig->elementAt(i, 0)->setStyleClass("tdhead");
169  chartConfig->elementAt(i, 1)->setStyleClass("tddata");
170  }
171 
172  WPanel *p = list->addWidget("Chart properties", chartConfig);
173  p->setMargin(WLength::Auto, Left | Right);
174  p->resize(1080, WLength::Auto);
175  p->setMargin(20, Top | Bottom);
176 
177  // ---- Series properties ----
178 
179  WStandardItemModel *types = new WStandardItemModel(0, 1, this);
180  addEntry(types, "Points");
181  addEntry(types, "Line");
182  addEntry(types, "Curve");
183  addEntry(types, "Bar");
184  addEntry(types, "Line Area");
185  addEntry(types, "Curve Area");
186  addEntry(types, "Stacked Bar");
187  addEntry(types, "Stacked Line Area");
188  addEntry(types, "Stacked Curve Area");
189 
190  WStandardItemModel *markers = new WStandardItemModel(0, 1, this);
191  addEntry(markers, "None");
192  addEntry(markers, "Square");
193  addEntry(markers, "Circle");
194  addEntry(markers, "Cross");
195  addEntry(markers, "X cross");
196  addEntry(markers, "Triangle");
197  addEntry(markers, "Pipe");
198  addEntry(markers, "Star");
199  addEntry(markers, "Inverted triangle");
200  addEntry(markers, "Asterisk");
201  addEntry(markers, "Diamond");
202 
203  WStandardItemModel *axes = new WStandardItemModel(0, 1, this);
204  addEntry(axes, "1st Y axis");
205  addEntry(axes, "2nd Y axis");
206 
207  WStandardItemModel *labels = new WStandardItemModel(0, 1, this);
208  addEntry(labels, "None");
209  addEntry(labels, "X");
210  addEntry(labels, "Y");
211  addEntry(labels, "X: Y");
212 
213  WTable *seriesConfig = new WTable();
214  seriesConfig->setMargin(WLength::Auto, Left | Right);
215 
216  ::addHeader(seriesConfig, "Name");
217  ::addHeader(seriesConfig, "Enabled");
218  ::addHeader(seriesConfig, "Type");
219  ::addHeader(seriesConfig, "Marker");
220  ::addHeader(seriesConfig, "Y axis");
221  ::addHeader(seriesConfig, "Legend");
222  ::addHeader(seriesConfig, "Shadow");
223  ::addHeader(seriesConfig, "Value labels");
224 
225  seriesConfig->rowAt(0)->setStyleClass("trhead");
226 
227  for (int j = 1; j < chart->model()->columnCount(); ++j) {
228  SeriesControl sc;
229 
230  new WText(chart->model()->headerData(j),
231  seriesConfig->elementAt(j, 0));
232 
233  sc.enabledEdit = new WCheckBox(seriesConfig->elementAt(j, 1));
234  connectSignals(sc.enabledEdit);
235 
236  sc.typeEdit = new WComboBox(seriesConfig->elementAt(j, 2));
237  sc.typeEdit->setModel(types);
238  sc.typeEdit->setCurrentIndex(0);
239  connectSignals(sc.typeEdit);
240 
241  sc.markerEdit = new WComboBox(seriesConfig->elementAt(j, 3));
242  sc.markerEdit->setModel(markers);
243  sc.markerEdit->setCurrentIndex(0);
244  connectSignals(sc.markerEdit);
245 
246  sc.axisEdit = new WComboBox(seriesConfig->elementAt(j, 4));
247  sc.axisEdit->setModel(axes);
248  sc.axisEdit->setCurrentIndex(0);
249  connectSignals(sc.axisEdit);
250 
251  sc.legendEdit = new WCheckBox(seriesConfig->elementAt(j, 5));
252  connectSignals(sc.legendEdit);
253 
254  sc.shadowEdit = new WCheckBox(seriesConfig->elementAt(j, 6));
255  connectSignals(sc.shadowEdit);
256 
257  sc.labelsEdit = new WComboBox(seriesConfig->elementAt(j, 7));
258  sc.labelsEdit->setModel(labels);
259  sc.labelsEdit->setCurrentIndex(0);
260  connectSignals(sc.labelsEdit);
261 
262  int si = seriesIndexOf(chart, j);
263 
264  if (si != -1) {
265  sc.enabledEdit->setChecked();
266  const WDataSeries& s = chart_->series(j);
267  switch (s.type()) {
268  case PointSeries:
269  sc.typeEdit->setCurrentIndex(0); break;
270  case LineSeries:
271  sc.typeEdit->setCurrentIndex(s.fillRange() != NoFill ?
272  (s.isStacked() ? 7 : 4) : 1); break;
273  case CurveSeries:
274  sc.typeEdit->setCurrentIndex(s.fillRange() != NoFill ?
275  (s.isStacked() ? 8 : 5) : 2); break;
276  case BarSeries:
277  sc.typeEdit->setCurrentIndex(s.isStacked() ? 6 : 3);
278  }
279 
280  sc.markerEdit->setCurrentIndex((int)s.marker());
281  sc.legendEdit->setChecked(s.isLegendEnabled());
282  sc.shadowEdit->setChecked(s.shadow() != WShadow());
283  }
284 
285  seriesControls_.push_back(sc);
286 
287  seriesConfig->rowAt(j)->setStyleClass("trdata");
288  }
289 
290  p = list->addWidget("Series properties", seriesConfig);
291  p->expand();
292  p->setMargin(WLength::Auto, Left | Right);
293  p->resize(1080, WLength::Auto);
294  p->setMargin(20, Top | Bottom);
295 
296  // ---- Axis properties ----
297 
298  WStandardItemModel *yScales = new WStandardItemModel(0, 1, this);
299  addEntry(yScales, "Linear scale");
300  addEntry(yScales, "Log scale");
301 
302  WStandardItemModel *xScales = new WStandardItemModel(0, 1, this);
303  addEntry(xScales, "Categories");
304  addEntry(xScales, "Linear scale");
305  addEntry(xScales, "Log scale");
306  addEntry(xScales, "Date scale");
307 
308  WTable *axisConfig = new WTable();
309  axisConfig->setMargin(WLength::Auto, Left | Right);
310 
311  ::addHeader(axisConfig, "Axis");
312  ::addHeader(axisConfig, "Visible");
313  ::addHeader(axisConfig, "Scale");
314  ::addHeader(axisConfig, "Automatic");
315  ::addHeader(axisConfig, "Minimum");
316  ::addHeader(axisConfig, "Maximum");
317  ::addHeader(axisConfig, "Gridlines");
318  ::addHeader(axisConfig, "Label angle");
319  ::addHeader(axisConfig, "Title");
320  ::addHeader(axisConfig, "Title orientation");
321  ::addHeader(axisConfig, "Tick direction");
322  ::addHeader(axisConfig, "Location");
323 
324  axisConfig->rowAt(0)->setStyleClass("trhead");
325 
326  for (int i = 0; i < 3; ++i) {
327  const char *axisName[] = { "X axis", "1st Y axis", "2nd Y axis" };
328  int j = i + 1;
329 
330  const WAxis& axis = chart_->axis(static_cast<Axis>(i));
331  AxisControl sc;
332 
333  new WText(WString(axisName[i], UTF8), axisConfig->elementAt(j, 0));
334 
335  sc.visibleEdit = new WCheckBox(axisConfig->elementAt(j, 1));
336  sc.visibleEdit->setChecked(axis.isVisible());
337  connectSignals(sc.visibleEdit);
338 
339  sc.scaleEdit = new WComboBox(axisConfig->elementAt(j, 2));
340  if (axis.scale() == CategoryScale)
341  sc.scaleEdit->addItem("Category scale");
342  else {
343  if (axis.id() == XAxis) {
344  sc.scaleEdit->setModel(xScales);
345  sc.scaleEdit->setCurrentIndex(axis.scale());
346  } else {
347  sc.scaleEdit->setModel(yScales);
348  sc.scaleEdit->setCurrentIndex(axis.scale() - 1);
349  }
350  }
351  connectSignals(sc.scaleEdit);
352 
353  bool autoValues = axis.autoLimits() == (MinimumValue | MaximumValue);
354 
355  sc.minimumEdit = new WLineEdit(axisConfig->elementAt(j, 4));
356  sc.minimumEdit->setText(WLocale::currentLocale()
357  .toString(axis.minimum()));
358  sc.minimumEdit->setValidator(anyNumberValidator);
359  sc.minimumEdit->setEnabled(!autoValues);
360  connectSignals(sc.minimumEdit);
361 
362  sc.maximumEdit = new WLineEdit(axisConfig->elementAt(j, 5));
363  sc.maximumEdit->setText(WLocale::currentLocale()
364  .toString(axis.maximum()));
365  sc.maximumEdit->setValidator(anyNumberValidator);
366  sc.maximumEdit->setEnabled(!autoValues);
367  connectSignals(sc.maximumEdit);
368 
369  sc.autoEdit = new WCheckBox(axisConfig->elementAt(j, 3));
370  sc.autoEdit->setChecked(autoValues);
371  connectSignals(sc.autoEdit);
372  sc.autoEdit->checked().connect(sc.maximumEdit, &WLineEdit::disable);
373  sc.autoEdit->unChecked().connect(sc.maximumEdit, &WLineEdit::enable);
374  sc.autoEdit->checked().connect(sc.minimumEdit, &WLineEdit::disable);
375  sc.autoEdit->unChecked().connect(sc.minimumEdit, &WLineEdit::enable);
376 
377  sc.gridLinesEdit = new WCheckBox(axisConfig->elementAt(j, 6));
378  connectSignals(sc.gridLinesEdit);
379 
380  sc.labelAngleEdit = new WLineEdit(axisConfig->elementAt(j, 7));
381  sc.labelAngleEdit->setText("0");
382  sc.labelAngleEdit->setValidator(angleValidator);
383  connectSignals(sc.labelAngleEdit);
384 
385  sc.titleEdit = new WLineEdit(axisConfig->elementAt(j, 8));
386  sc.titleEdit->setText("");
387  connectSignals(sc.titleEdit);
388 
389  sc.titleOrientationEdit = new WComboBox(axisConfig->elementAt(j, 9));
390  sc.titleOrientationEdit->addItem("Horizontal");
391  sc.titleOrientationEdit->addItem("Vertical");
392  sc.titleOrientationEdit->setCurrentIndex(0);
393  connectSignals(sc.titleOrientationEdit);
394 
395  sc.tickDirectionEdit = new WComboBox(axisConfig->elementAt(j, 10));
396  sc.tickDirectionEdit->addItem("Outwards");
397  sc.tickDirectionEdit->addItem("Inwards");
398  sc.tickDirectionEdit->setCurrentIndex(0);
399  connectSignals(sc.tickDirectionEdit);
400 
401  sc.locationEdit = new WComboBox(axisConfig->elementAt(j, 11));
402  sc.locationEdit->addItem("Minimum value");
403  sc.locationEdit->addItem("Maximum value");
404  sc.locationEdit->addItem("Zero value");
405  sc.locationEdit->addItem("Both sides");
406  sc.locationEdit->setCurrentIndex(0);
407  if (axis.location() == ZeroValue) {
408  sc.locationEdit->setCurrentIndex(2);
409  }
410  connectSignals(sc.locationEdit);
411 
412  axisConfig->rowAt(j)->setStyleClass("trdata");
413 
414  axisControls_.push_back(sc);
415  }
416 
417  p = list->addWidget("Axis properties", axisConfig);
418  p->setMargin(WLength::Auto, Left | Right);
419  p->resize(1080, WLength::Auto);
420  p->setMargin(20, Top | Bottom);
421 
422  /*
423  * If we do not have JavaScript, then add a button to reflect changes to
424  * the chart.
425  */
426  if (!WApplication::instance()->environment().javaScript()) {
427  WPushButton *b = new WPushButton(this);
428  b->setText("Update chart");
429  b->setInline(false); // so we can add margin to center horizontally
430  b->setMargin(WLength::Auto, Left | Right);
431  b->clicked().connect(this, &ChartConfig::update);
432  }
433 }
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:709
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:440
Wt::WComboBox * legendAlignmentEdit_
Definition: ChartConfig.h:88
Wt::WLineEdit * chartHeightEdit_
Definition: ChartConfig.h:84

Member Function Documentation

§ connectSignals()

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

Definition at line 709 of file ChartConfig.C.

710 {
711  w->changed().connect(this, &ChartConfig::update);
712  if (dynamic_cast<WLineEdit *>(w))
713  w->enterPressed().connect(this, &ChartConfig::update);
714 }
void update()
Definition: ChartConfig.C:440

§ setValueFill()

void ChartConfig::setValueFill ( Wt::Chart::FillRangeType  fill)

Definition at line 435 of file ChartConfig.C.

436 {
437  fill_ = fill;
438 }
Wt::Chart::FillRangeType fill_
Definition: ChartConfig.h:48

§ update()

void ChartConfig::update ( )
private

Definition at line 440 of file ChartConfig.C.

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

§ validate()

bool ChartConfig::validate ( Wt::WFormWidget *  w)
staticprivate

Definition at line 697 of file ChartConfig.C.

698 {
699  bool valid = w->validate() == WValidator::Valid;
700 
701  if (!WApplication::instance()->environment().javaScript()) {
702  w->setStyleClass(valid ? "" : "Wt-invalid");
703  w->setToolTip(valid ? "" : "Invalid value");
704  }
705 
706  return valid;
707 }

Member Data Documentation

§ axisControls_

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

Controls for axes.

Definition at line 80 of file ChartConfig.h.

§ borderEdit_

Wt::WCheckBox* ChartConfig::borderEdit_
private

Definition at line 89 of file ChartConfig.h.

§ chart_

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

Definition at line 47 of file ChartConfig.h.

§ chartHeightEdit_

Wt::WLineEdit* ChartConfig::chartHeightEdit_
private

Definition at line 84 of file ChartConfig.h.

§ chartOrientationEdit_

Wt::WComboBox* ChartConfig::chartOrientationEdit_
private

Definition at line 85 of file ChartConfig.h.

§ chartWidthEdit_

Wt::WLineEdit* ChartConfig::chartWidthEdit_
private

Definition at line 83 of file ChartConfig.h.

§ fill_

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

Definition at line 48 of file ChartConfig.h.

§ legendAlignmentEdit_

Wt::WComboBox* ChartConfig::legendAlignmentEdit_
private

Definition at line 88 of file ChartConfig.h.

§ legendLocationEdit_

Wt::WComboBox* ChartConfig::legendLocationEdit_
private

Definition at line 86 of file ChartConfig.h.

§ legendSideEdit_

Wt::WComboBox* ChartConfig::legendSideEdit_
private

Definition at line 87 of file ChartConfig.h.

§ seriesControls_

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

Controls for series.

Definition at line 62 of file ChartConfig.h.

§ titleEdit_

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 Thu Jan 12 2017 for the C++ Web Toolkit (Wt) by doxygen 1.8.12