Wt examples  3.3.0
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::WCartesianChartchart_
 
Wt::Chart::FillRangeType fill_
 
std::vector< SeriesControlseriesControls_
 Controls for series. More...
 
std::vector< AxisControlaxisControls_
 Controls for axes. More...
 
Wt::WLineEdittitleEdit_
 
Wt::WLineEditchartWidthEdit_
 
Wt::WLineEditchartHeightEdit_
 
Wt::WComboBoxchartOrientationEdit_
 
Wt::WComboBoxlegendLocationEdit_
 
Wt::WComboBoxlegendSideEdit_
 
Wt::WComboBoxlegendAlignmentEdit_
 

Additional Inherited Members

- Protected Member Functions inherited from Wt::WWidget
virtual void enableAjax ()=0
 
virtual void propagateSetEnabled (bool enabled)=0
 
virtual void render (WFlags< RenderFlag > flags)
 

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),
67 {
69  WBrush(WColor(0xFF, 0xFA, 0xE5)));
70  chart->initLayout();
71 
72  PanelList *list = new PanelList(this);
73 
74  WIntValidator *sizeValidator = new WIntValidator(200, 2000, this);
75  sizeValidator->setMandatory(true);
76 
77  WDoubleValidator *anyNumberValidator = new WDoubleValidator(this);
78  anyNumberValidator->setMandatory(true);
79 
80  WDoubleValidator *angleValidator = new WDoubleValidator(-90, 90, this);
81  angleValidator->setMandatory(true);
82 
83  // ---- Chart properties ----
84 
85  WStandardItemModel *orientation = new WStandardItemModel(0, 1, this);
86  addEntry(orientation, "Vertical");
87  addEntry(orientation, "Horizontal");
88 
89  WStandardItemModel *legendLocation = new WStandardItemModel(0, 1, this);
90  addEntry(legendLocation, "Outside");
91  addEntry(legendLocation, "Inside");
92 
93  WStandardItemModel *legendSide = new WStandardItemModel(0, 1, this);
94  addEntry(legendSide, "Top");
95  addEntry(legendSide, "Right");
96  addEntry(legendSide, "Bottom");
97  addEntry(legendSide, "Left");
98 
99  WStandardItemModel *legendAlignment = new WStandardItemModel(0, 1, this);
100  addEntry(legendAlignment, "AlignLeft");
101  addEntry(legendAlignment, "AlignCenter");
102  addEntry(legendAlignment, "AlignRight");
103  addEntry(legendAlignment, "AlignTop");
104  addEntry(legendAlignment, "AlignMiddle");
105  addEntry(legendAlignment, "AlignBottom");
106 
107  WTable *chartConfig = new WTable();
108  chartConfig->setMargin(WLength::Auto, Left | Right);
109 
110  int row = 0;
111  chartConfig->elementAt(row, 0)->addWidget(new WText("Title:"));
112  titleEdit_ = new WLineEdit(chartConfig->elementAt(row, 1));
114  ++row;
115 
116  chartConfig->elementAt(row, 0)->addWidget(new WText("Width:"));
117  chartWidthEdit_ = new WLineEdit(chartConfig->elementAt(row, 1));
119  ->setText(WLocale::currentLocale().toString(chart_->width().value()));
120  chartWidthEdit_->setValidator(sizeValidator);
121  chartWidthEdit_->setMaxLength(4);
123  ++row;
124 
125  chartConfig->elementAt(row, 0)->addWidget(new WText("Height:"));
126  chartHeightEdit_ = new WLineEdit(chartConfig->elementAt(row, 1));
128  ->setText(WLocale::currentLocale().toString(chart_->height().value()));
129  chartHeightEdit_->setValidator(sizeValidator);
130  chartHeightEdit_->setMaxLength(4);
132  ++row;
133 
134  chartConfig->elementAt(row, 0)->addWidget(new WText("Orientation:"));
135  chartOrientationEdit_ = new WComboBox(chartConfig->elementAt(row, 1));
136  chartOrientationEdit_->setModel(orientation);
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);
144  ++row;
145 
146  chartConfig->elementAt(row, 0)->addWidget(new WText("Legend side:"));
147  legendSideEdit_ = new WComboBox(chartConfig->elementAt(row, 1));
148  legendSideEdit_->setModel(legendSide);
151  ++row;
152 
153  chartConfig->elementAt(row, 0)->addWidget(new WText("Legend alignment:"));
154  legendAlignmentEdit_ = new WComboBox(chartConfig->elementAt(row, 1));
155  legendAlignmentEdit_->setModel(legendAlignment);
158  ++row;
159 
160  for (int i = 0; i < chartConfig->rowCount(); ++i) {
161  chartConfig->elementAt(i, 0)->setStyleClass("tdhead");
162  chartConfig->elementAt(i, 1)->setStyleClass("tddata");
163  }
164 
165  WPanel *p = list->addWidget("Chart properties", chartConfig);
166  p->setMargin(WLength::Auto, Left | Right);
167  p->resize(880, WLength::Auto);
168  p->setMargin(20, Top | Bottom);
169 
170  if (chart_->isLegendEnabled())
171  chart_->setPlotAreaPadding(200, Right);
172 
173  // ---- Series properties ----
174 
175  WStandardItemModel *types = new WStandardItemModel(0, 1, this);
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");
185 
186  WStandardItemModel *markers = new WStandardItemModel(0, 1, this);
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");
194 
195  WStandardItemModel *axes = new WStandardItemModel(0, 1, this);
196  addEntry(axes, "1st Y axis");
197  addEntry(axes, "2nd Y axis");
198 
199  WStandardItemModel *labels = new WStandardItemModel(0, 1, this);
200  addEntry(labels, "None");
201  addEntry(labels, "X");
202  addEntry(labels, "Y");
203  addEntry(labels, "X: Y");
204 
205  WTable *seriesConfig = new WTable();
206  seriesConfig->setMargin(WLength::Auto, Left | Right);
207 
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");
216 
217  seriesConfig->rowAt(0)->setStyleClass("trhead");
218 
219  for (int j = 1; j < chart->model()->columnCount(); ++j) {
220  SeriesControl sc;
221 
222  new WText(asString(chart->model()->headerData(j)),
223  seriesConfig->elementAt(j, 0));
224 
225  sc.enabledEdit = new WCheckBox(seriesConfig->elementAt(j, 1));
226  connectSignals(sc.enabledEdit);
227 
228  sc.typeEdit = new WComboBox(seriesConfig->elementAt(j, 2));
229  sc.typeEdit->setModel(types);
230  connectSignals(sc.typeEdit);
231 
232  sc.markerEdit = new WComboBox(seriesConfig->elementAt(j, 3));
233  sc.markerEdit->setModel(markers);
234  connectSignals(sc.markerEdit);
235 
236  sc.axisEdit = new WComboBox(seriesConfig->elementAt(j, 4));
237  sc.axisEdit->setModel(axes);
238  connectSignals(sc.axisEdit);
239 
240  sc.legendEdit = new WCheckBox(seriesConfig->elementAt(j, 5));
241  connectSignals(sc.legendEdit);
242 
243  sc.shadowEdit = new WCheckBox(seriesConfig->elementAt(j, 6));
244  connectSignals(sc.shadowEdit);
245 
246  sc.labelsEdit = new WComboBox(seriesConfig->elementAt(j, 7));
247  sc.labelsEdit->setModel(labels);
248  connectSignals(sc.labelsEdit);
249 
250  int si = seriesIndexOf(chart, j);
251 
252  if (si != -1) {
253  sc.enabledEdit->setChecked();
254  const WDataSeries& s = chart_->series(j);
255  switch (s.type()) {
256  case PointSeries:
257  sc.typeEdit->setCurrentIndex(0); break;
258  case LineSeries:
259  sc.typeEdit->setCurrentIndex(s.fillRange() != NoFill ?
260  (s.isStacked() ? 7 : 4) : 1); break;
261  case CurveSeries:
262  sc.typeEdit->setCurrentIndex(s.fillRange() != NoFill ?
263  (s.isStacked() ? 8 : 5) : 2); break;
264  case BarSeries:
265  sc.typeEdit->setCurrentIndex(s.isStacked() ? 6 : 3);
266  }
267 
268  sc.markerEdit->setCurrentIndex((int)s.marker());
269  sc.legendEdit->setChecked(s.isLegendEnabled());
270  sc.shadowEdit->setChecked(s.shadow() != WShadow());
271  }
272 
273  seriesControls_.push_back(sc);
274 
275  seriesConfig->rowAt(j)->setStyleClass("trdata");
276  }
277 
278  p = list->addWidget("Series properties", seriesConfig);
279  p->expand();
280  p->setMargin(WLength::Auto, Left | Right);
281  p->resize(880, WLength::Auto);
282  p->setMargin(20, Top | Bottom);
283 
284  // ---- Axis properties ----
285 
286  WStandardItemModel *yScales = new WStandardItemModel(0, 1, this);
287  addEntry(yScales, "Linear scale");
288  addEntry(yScales, "Log scale");
289 
290  WStandardItemModel *xScales = new WStandardItemModel(0, 1, this);
291  addEntry(xScales, "Categories");
292  addEntry(xScales, "Linear scale");
293  addEntry(xScales, "Log scale");
294  addEntry(xScales, "Date scale");
295 
296  WTable *axisConfig = new WTable();
297  axisConfig->setMargin(WLength::Auto, Left | Right);
298 
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");
307 
308  axisConfig->rowAt(0)->setStyleClass("trhead");
309 
310  for (int i = 0; i < 3; ++i) {
311  const char *axisName[] = { "X axis", "1st Y axis", "2nd Y axis" };
312  int j = i + 1;
313 
314  const WAxis& axis = chart_->axis(static_cast<Axis>(i));
315  AxisControl sc;
316 
317  new WText(WString(axisName[i], UTF8), axisConfig->elementAt(j, 0));
318 
319  sc.visibleEdit = new WCheckBox(axisConfig->elementAt(j, 1));
320  sc.visibleEdit->setChecked(axis.isVisible());
321  connectSignals(sc.visibleEdit);
322 
323  sc.scaleEdit = new WComboBox(axisConfig->elementAt(j, 2));
324  if (axis.scale() == CategoryScale)
325  sc.scaleEdit->addItem("Category scale");
326  else {
327  if (axis.id() == XAxis) {
328  sc.scaleEdit->setModel(xScales);
329  sc.scaleEdit->setCurrentIndex(axis.scale());
330  } else {
331  sc.scaleEdit->setModel(yScales);
332  sc.scaleEdit->setCurrentIndex(axis.scale() - 1);
333  }
334  }
335  connectSignals(sc.scaleEdit);
336 
337  bool autoValues = axis.autoLimits() == (MinimumValue | MaximumValue);
338 
339  sc.minimumEdit = new WLineEdit(axisConfig->elementAt(j, 4));
340  sc.minimumEdit->setText(WLocale::currentLocale()
341  .toString(axis.minimum()));
342  sc.minimumEdit->setValidator(anyNumberValidator);
343  sc.minimumEdit->setEnabled(!autoValues);
344  connectSignals(sc.minimumEdit);
345 
346  sc.maximumEdit = new WLineEdit(axisConfig->elementAt(j, 5));
347  sc.maximumEdit->setText(WLocale::currentLocale()
348  .toString(axis.maximum()));
349  sc.maximumEdit->setValidator(anyNumberValidator);
350  sc.maximumEdit->setEnabled(!autoValues);
351  connectSignals(sc.maximumEdit);
352 
353  sc.autoEdit = new WCheckBox(axisConfig->elementAt(j, 3));
354  sc.autoEdit->setChecked(autoValues);
355  connectSignals(sc.autoEdit);
356  sc.autoEdit->checked().connect(sc.maximumEdit, &WLineEdit::disable);
357  sc.autoEdit->unChecked().connect(sc.maximumEdit, &WLineEdit::enable);
358  sc.autoEdit->checked().connect(sc.minimumEdit, &WLineEdit::disable);
359  sc.autoEdit->unChecked().connect(sc.minimumEdit, &WLineEdit::enable);
360 
361  sc.gridLinesEdit = new WCheckBox(axisConfig->elementAt(j, 6));
362  connectSignals(sc.gridLinesEdit);
363 
364  sc.labelAngleEdit = new WLineEdit(axisConfig->elementAt(j, 7));
365  sc.labelAngleEdit->setText("0");
366  sc.labelAngleEdit->setValidator(angleValidator);
367  connectSignals(sc.labelAngleEdit);
368 
369  axisConfig->rowAt(j)->setStyleClass("trdata");
370 
371  axisControls_.push_back(sc);
372  }
373 
374  p = list->addWidget("Axis properties", axisConfig);
375  p->setMargin(WLength::Auto, Left | Right);
376  p->resize(880, WLength::Auto);
377  p->setMargin(20, Top | Bottom);
378 
379  /*
380  * If we do not have JavaScript, then add a button to reflect changes to
381  * the chart.
382  */
383  if (!WApplication::instance()->environment().javaScript()) {
384  WPushButton *b = new WPushButton(this);
385  b->setText("Update chart");
386  b->setInline(false); // so we can add margin to center horizontally
387  b->setMargin(WLength::Auto, Left | Right);
388  b->clicked().connect(this, &ChartConfig::update);
389  }
390 }

Member Function Documentation

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

Definition at line 663 of file ChartConfig.C.

664 {
665  w->changed().connect(this, &ChartConfig::update);
666  if (dynamic_cast<WLineEdit *>(w))
667  w->enterPressed().connect(this, &ChartConfig::update);
668 }
void ChartConfig::setValueFill ( Wt::Chart::FillRangeType  fill)

Definition at line 392 of file ChartConfig.C.

393 {
394  fill_ = fill;
395 }
void ChartConfig::update ( )
private

Definition at line 397 of file ChartConfig.C.

398 {
399  bool haveLegend = false;
400  std::vector<WDataSeries> series;
401 
402  for (int i = 1; i < chart_->model()->columnCount(); ++i) {
403  SeriesControl& sc = seriesControls_[i-1];
404 
405  if (sc.enabledEdit->isChecked()) {
406  WDataSeries s(i);
407 
408  switch (sc.typeEdit->currentIndex()) {
409  case 0:
410  s.setType(PointSeries);
411  if (sc.markerEdit->currentIndex() == 0)
412  sc.markerEdit->setCurrentIndex(1);
413  break;
414  case 1:
415  s.setType(LineSeries);
416  sc.markerEdit->setCurrentIndex(0);
417  break;
418  case 2:
419  s.setType(CurveSeries);
420  sc.markerEdit->setCurrentIndex(0);
421  break;
422  case 3:
423  s.setType(BarSeries);
424  sc.markerEdit->setCurrentIndex(0);
425  break;
426  case 4:
427  s.setType(LineSeries);
428  s.setFillRange(fill_);
429  sc.markerEdit->setCurrentIndex(0);
430  break;
431  case 5:
432  s.setType(CurveSeries);
433  s.setFillRange(fill_);
434  sc.markerEdit->setCurrentIndex(0);
435  break;
436  case 6:
437  s.setType(BarSeries);
438  s.setStacked(true);
439  sc.markerEdit->setCurrentIndex(0);
440  break;
441  case 7:
442  s.setType(LineSeries);
443  s.setFillRange(fill_);
444  s.setStacked(true);
445  sc.markerEdit->setCurrentIndex(0);
446  break;
447  case 8:
448  s.setType(CurveSeries);
449  s.setFillRange(fill_);
450  s.setStacked(true);
451  sc.markerEdit->setCurrentIndex(0);
452  }
453 
454  //set WPainterPath to draw a diamond
455  if(sc.markerEdit->currentIndex() == CustomMarker){
456  WPainterPath pp = WPainterPath();
457  pp.moveTo(-6, 0);
458  pp.lineTo(0, 6);
459  pp.lineTo(6, 0);
460  pp.lineTo(0, -6);
461  pp.lineTo(-6, 0);
462  s.setCustomMarker(pp);
463  }
464 
465  s.setMarker(static_cast<MarkerType>(sc.markerEdit->currentIndex()));
466 
467  if (sc.axisEdit->currentIndex() == 1) {
468  s.bindToAxis(Y2Axis);
469  }
470 
471  if (sc.legendEdit->isChecked()) {
472  s.setLegendEnabled(true);
473  haveLegend = true;
474  } else
475  s.setLegendEnabled(false);
476 
477  if (sc.shadowEdit->isChecked()) {
478  s.setShadow(WShadow(3, 3, WColor(0, 0, 0, 127), 3));
479  } else
480  s.setShadow(WShadow());
481 
482  switch (sc.labelsEdit->currentIndex()) {
483  case 1:
484  s.setLabelsEnabled(XAxis);
485  break;
486  case 2:
487  s.setLabelsEnabled(YAxis);
488  break;
489  case 3:
490  s.setLabelsEnabled(XAxis);
491  s.setLabelsEnabled(YAxis);
492  break;
493  }
494 
495  series.push_back(s);
496  }
497  }
498 
499  chart_->setSeries(series);
500 
501  for (int i = 0; i < 3; ++i) {
502  AxisControl& sc = axisControls_[i];
503  WAxis& axis = chart_->axis(static_cast<Axis>(i));
504 
505  axis.setVisible(sc.visibleEdit->isChecked());
506 
507  if (sc.scaleEdit->count() != 1) {
508  int k = sc.scaleEdit->currentIndex();
509  if (axis.id() != XAxis)
510  k += 1;
511  else {
512  if (k == 0)
514  else
516  }
517 
518  switch (k) {
519  case 1:
520  axis.setScale(LinearScale); break;
521  case 2:
522  axis.setScale(LogScale); break;
523  case 3:
524  axis.setScale(DateScale); break;
525  }
526  }
527 
528  if (sc.autoEdit->isChecked())
530  else {
531  if (validate(sc.minimumEdit) && validate(sc.maximumEdit)) {
532  double min, max;
533  getDouble(sc.minimumEdit, min);
534  getDouble(sc.maximumEdit, max);
535 
536  if (axis.scale() == LogScale)
537  if (min <= 0)
538  min = 0.0001;
539 
540  if (axis.scale() == DateScale){
541  //the number of julian days until year 1986
542  WDate dMin = WDate(1900,1,1);
543  double gregDaysMin = (double)dMin.toJulianDay();
544  //the number of julian days until year 1988
545  WDate dMax = WDate(3000,1,1);
546  double gregDaysMax = (double)dMax.toJulianDay();
547 
548  bool greg_year_validation =
549  (min > gregDaysMin &&
550  min < gregDaysMax &&
551  max > gregDaysMin &&
552  max < gregDaysMax);
553 
554  if(!greg_year_validation){
555  min = gregDaysMin;
556  max = gregDaysMax;
557  }
558  }
559 
560  axis.setRange(min, max);
561  }
562 
563  }
564 
565  if (validate(sc.labelAngleEdit)) {
566  double angle;
567  getDouble(sc.labelAngleEdit, angle);
568  axis.setLabelAngle(angle);
569  }
570 
571  axis.setGridLinesEnabled(sc.gridLinesEdit->isChecked());
572  }
573 
574  chart_->setTitle(titleEdit_->text());
575 
577  double width, height;
578  getDouble(chartWidthEdit_, width);
579  getDouble(chartHeightEdit_, height);
580  chart_->resize(width, height);
581  }
582 
583  switch (chartOrientationEdit_->currentIndex()) {
584  case 0:
585  chart_->setOrientation(Vertical); break;
586  case 1:
587  chart_->setOrientation(Horizontal); break;
588  }
589 
590  chart_->setLegendEnabled(haveLegend);
591 
592  if (haveLegend) {
593  LegendLocation location = LegendOutside;
594  Side side = Right;
595  AlignmentFlag alignment = AlignMiddle;
596 
597  switch (legendLocationEdit_->currentIndex()) {
598  case 0: location = LegendOutside; break;
599  case 1: location = LegendInside; break;
600  }
601 
602  switch (legendSideEdit_->currentIndex()) {
603  case 0: side = Top; break;
604  case 1: side = Right; break;
605  case 2: side = Bottom; break;
606  case 3: side = Left; break;
607  }
608 
609  if (side == Left || side == Right) {
612  } else {
615  }
616 
617  switch (legendAlignmentEdit_->currentIndex()) {
618  case 0: alignment = AlignLeft; break;
619  case 1: alignment = AlignCenter; break;
620  case 2: alignment = AlignRight; break;
621  case 3: alignment = AlignTop; break;
622  case 4: alignment = AlignMiddle; break;
623  case 5: alignment = AlignBottom; break;
624  }
625 
626  chart_->setLegendLocation(location, side, alignment);
627 
628  chart_->setLegendColumns((side == Top || side == Bottom ) ? 2 : 1,
629  WLength(100));
630  }
631 
632  for (unsigned i = 0; i < 4; ++i) {
633  Side sides[] = { Top, Right, Bottom, Left };
634 
635  bool legendRoom =
636  haveLegend
638  && chart_->legendSide() == sides[i];
639 
640  int padding;
641 
642  if (i % 2 == 0)
643  padding = legendRoom ? 80 : 40;
644  else
645  padding = legendRoom ? 200 : 80;
646 
647  chart_->setPlotAreaPadding(padding, sides[i]);
648  }
649 }
bool ChartConfig::validate ( Wt::WFormWidget w)
staticprivate

Definition at line 651 of file ChartConfig.C.

652 {
653  bool valid = w->validate() == WValidator::Valid;
654 
655  if (!WApplication::instance()->environment().javaScript()) {
656  w->setStyleClass(valid ? "" : "Wt-invalid");
657  w->setToolTip(valid ? "" : "Invalid value");
658  }
659 
660  return valid;
661 }

Member Data Documentation

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

Controls for axes.

Definition at line 76 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 80 of file ChartConfig.h.

Wt::WComboBox* ChartConfig::chartOrientationEdit_
private

Definition at line 81 of file ChartConfig.h.

Wt::WLineEdit* ChartConfig::chartWidthEdit_
private

Definition at line 79 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 84 of file ChartConfig.h.

Wt::WComboBox* ChartConfig::legendLocationEdit_
private

Definition at line 82 of file ChartConfig.h.

Wt::WComboBox* ChartConfig::legendSideEdit_
private

Definition at line 83 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 78 of file ChartConfig.h.


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

Generated on Fri May 31 2013 for the C++ Web Toolkit (Wt) by doxygen 1.8.3.1