Wt examples  4.10.4
Form.C
Go to the documentation of this file.
1 #include "Form.h"
2 
3 #include <Wt/WApplication.h>
4 #include <Wt/WBreak.h>
5 #include <Wt/WDateEdit.h>
6 #include <Wt/WSelectionBox.h>
7 #include <Wt/WContainerWidget.h>
8 #include <Wt/WImage.h>
9 #include <Wt/WIntValidator.h>
10 #include <Wt/WLabel.h>
11 #include <Wt/WLineEdit.h>
12 #include <Wt/WPushButton.h>
13 #include <Wt/WTableCell.h>
14 #include <Wt/WTextArea.h>
15 #include <Wt/WText.h>
16 
17 Form::Form()
18  : WTable()
19 {
20  createUI();
21 }
22 
23 void Form::createUI()
24 {
25  WLabel *label;
26  int row = 0;
27 
28  // Title
29  elementAt(row, 0)->setColumnSpan(3);
30  elementAt(row, 0)->setContentAlignment(AlignmentFlag::Top | AlignmentFlag::Center);
31  elementAt(row, 0)->setPadding(10);
32  WText *title = elementAt(row,0)->addWidget(std::make_unique<WText>(tr("example.form")));
33  title->decorationStyle().font().setSize(FontSize::XLarge);
34 
35  // error messages
36  ++row;
37  elementAt(row, 0)->setColumnSpan(3);
38  feedbackMessages_ = elementAt(row, 0);
40 
42  errorStyle.setForegroundColor(WColor("red"));
43  errorStyle.font().setSize(FontSize::Smaller);
44  errorStyle.font().setWeight(FontWeight::Bold);
45  errorStyle.font().setStyle(FontStyle::Italic);
46 
47  // Name
48  ++row;
49  nameEdit_ = elementAt(row,2)->addWidget(std::make_unique<WLineEdit>());
50  label = elementAt(row,0)->addWidget(std::make_unique<WLabel>(tr("example.name")));
51  label->setBuddy(nameEdit_);
52  nameEdit_->setValidator(std::make_shared<WValidator>(true));
54 
55  // First name
56  ++row;
57  firstNameEdit_ = elementAt(row,2)->addWidget(std::make_unique<WLineEdit>());
58  label = elementAt(row,0)->addWidget(std::make_unique<WLabel>(tr("example.firstname")));
59  label->setBuddy(firstNameEdit_);
60 
61  // Country
62  ++row;
63  countryEdit_ = elementAt(row,2)->addWidget(std::make_unique<WComboBox>());
64  countryEdit_->addItem("");
65  countryEdit_->addItem("Belgium");
66  countryEdit_->addItem("Netherlands");
67  countryEdit_->addItem("United Kingdom");
68  countryEdit_->addItem("United States");
69  label = elementAt(row,0)->addWidget(std::make_unique<WLabel>(tr("example.country")));
70  label->setBuddy(countryEdit_);
71  countryEdit_->setValidator(std::make_shared<WValidator>(true));
73 
74  // City
75  ++row;
76  cityEdit_ = elementAt(row,2)->addWidget(std::make_unique<WComboBox>());
77  cityEdit_->addItem(tr("example.choosecountry"));
78  label = elementAt(row,0)->addWidget(std::make_unique<WLabel>(tr("example.city")));
79  label->setBuddy(cityEdit_);
80 
81  // Birth date
82  ++row;
83  birthDateEdit_ = elementAt(row, 2)->addWidget(std::make_unique<WDateEdit>());
84  birthDateEdit_->setBottom(WDate(1900, 1, 1));
85  birthDateEdit_->setTop(WDate::currentDate());
86  label = elementAt(row,0)->addWidget(std::make_unique<WLabel>(tr("example.birthdate")));
87  label->setBuddy(birthDateEdit_);
88  birthDateEdit_->setFormat("dd/MM/yyyy");
89  birthDateEdit_->validator()->setMandatory(true);
90 
91  // Child count
92  ++row;
93  childCountEdit_ = elementAt(row,2)->addWidget(std::make_unique<WLineEdit>("0"));
94  label = elementAt(row, 0)->addWidget(std::make_unique<WLabel>(tr("example.childcount")));
95  label->setBuddy(childCountEdit_);
96  childCountEdit_->setValidator(std::make_shared<WIntValidator>(0,30));
97  childCountEdit_->validator()->setMandatory(true);
98 
99  ++row;
100  remarksEdit_ = elementAt(row,2)->addWidget(std::make_unique<WTextArea>());
102  remarksEdit_->setRows(5);
103  label = elementAt(row,0)->addWidget(std::make_unique<WLabel>(tr("example.remarks")));
104  label->setBuddy(remarksEdit_);
105 
106  // Submit
107  ++row;
108  WPushButton *submit = elementAt(row,0)->addWidget(std::make_unique<WPushButton>(tr("submit")));
109  submit->clicked().connect(this, &Form::submit);
110  submit->setMargin(15, Side::Top);
111  elementAt(row, 0)->setColumnSpan(3);
112  elementAt(row, 0)->setContentAlignment(AlignmentFlag::Top | AlignmentFlag::Center);
113 
114  // Set column widths for label and validation icon
115  elementAt(2, 0)->resize(WLength(30, LengthUnit::FontEx), WLength::Auto);
116  elementAt(2, 1)->resize(20, WLength::Auto);
117 }
118 
120 {
121  cityEdit_->clear();
122  cityEdit_->addItem("");
124 
125  switch (countryEdit_->currentIndex()) {
126  case 0:
127  break;
128  case 1:
129  cityEdit_->addItem("Antwerp");
130  cityEdit_->addItem("Brussels");
131  cityEdit_->addItem("Oekene");
132  break;
133  case 2:
134  cityEdit_->addItem("Amsterdam");
135  cityEdit_->addItem("Den Haag");
136  cityEdit_->addItem("Rotterdam");
137  break;
138  case 3:
139  cityEdit_->addItem("London");
140  cityEdit_->addItem("Bristol");
141  cityEdit_->addItem("Oxford");
142  cityEdit_->addItem("Stonehenge");
143  break;
144  case 4:
145  cityEdit_->addItem("Boston");
146  cityEdit_->addItem("Chicago");
147  cityEdit_->addItem("Los Angeles");
148  cityEdit_->addItem("New York");
149  break;
150  }
151 }
152 
153 bool Form::checkValid(WFormWidget *edit, const WString& text)
154 {
155  if (edit->validate() != ValidationState::Valid) {
156  feedbackMessages_->addWidget(std::make_unique<WText>(text));
157  feedbackMessages_->addWidget(std::make_unique<WBreak>());
158  edit->label()->decorationStyle().setForegroundColor(WColor("red"));
159  edit->setStyleClass("Wt-invalid");
160  return false;
161  } else {
163  edit->setStyleClass("");
164 
165  return true;
166  }
167 }
168 
169 bool Form::validate()
170 {
172  bool valid = true;
173 
174  if (!checkValid(nameEdit_, tr("error.name")))
175  valid = false;
176  if (!checkValid(countryEdit_, tr("error.country")))
177  valid = false;
178  if (!checkValid(birthDateEdit_, tr("error.birthdate")))
179  valid = false;
180  if (!checkValid(childCountEdit_, tr("error.childcount")))
181  valid = false;
182 
183  return valid;
184 }
185 
186 void Form::submit()
187 {
188  if (validate()) {
189  // do something useful with the data...
190  WString name = WString("{1} {2}")
191  .arg(firstNameEdit_->text())
192  .arg(nameEdit_->text());
193 
194  WString remarks
195  = remarksEdit_->text();
196 
197  clear();
198 
199  elementAt(0,0)->addWidget(std::make_unique<WText>(
200  WString("<p>Thank you, {1}, "
201  "for all this precious data.</p>").arg(name)));
202 
203  if (!remarks.empty())
204  elementAt(0,0)->addWidget(std::make_unique<WText>(
205  WString("<p>You had some remarks. Splendid !</p>")));
206 
207  wApp->quit();
208  }
209 }
WLineEdit * firstNameEdit_
Definition: Form.h:56
WComboBox * cityEdit_
Definition: Form.h:59
bool checkValid(WFormWidget *edit, const WString &text)
Validate a single form field.
WComboBox * countryEdit_
Definition: Form.h:58
WDateEdit * birthDateEdit_
Definition: Form.h:61
void countryChanged()
The user selected a new country: adjust the cities combo box.
Form()
Instantiate a new form.
void createUI()
WContainerWidget * feedbackMessages_
Definition: Form.h:53
void submit()
Submit the form.
WLineEdit * childCountEdit_
Definition: Form.h:62
WLineEdit * nameEdit_
Definition: Form.h:55
WTextArea * remarksEdit_
Definition: Form.h:65
bool validate()
Validate the form, and return whether succesfull.
Wt::Signals::connection connect(F function)
int currentIndex() const
void setCurrentIndex(int index)
void addItem(const WString &text)
virtual void clear()
void setContentAlignment(WFlags< AlignmentFlag > contentAlignment)
void setPadding(const WLength &padding, WFlags< Side > sides=AllSides)
virtual void addWidget(std::unique_ptr< WWidget > widget)
void setForegroundColor(WColor color)
void setBottom(const WDate &bottom)
void setFormat(const WString &format)
void setTop(const WDate &top)
void setWeight(FontWeight weight, int value=400)
void setStyle(FontStyle style)
void setSize(FontSize size)
virtual std::shared_ptr< WValidator > validator() const
virtual ValidationState validate()
EventSignal & changed()
WLabel * label() const
void setValidator(const std::shared_ptr< WValidator > &validator)
EventSignal & enterPressed()
void setBuddy(WFormWidget *buddy)
const WString & text() const
WString & arg(const std::wstring &value)
bool empty() const
void setColumnSpan(int colSpan)
virtual void clear()
WTableCell * elementAt(int row, int column)
void setRows(int rows)
const WString & text() const
void setColumns(int cols)
virtual void resize(const WLength &width, const WLength &height) override
virtual void setStyleClass(const WString &styleClass) override
virtual WCssDecorationStyle & decorationStyle() override
static WString tr(const char *key)