Form.C 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. #include "Form.h"
  2. #include <Wt/WApplication>
  3. #include <Wt/WBreak>
  4. #include <Wt/WDateEdit>
  5. #include <Wt/WSelectionBox>
  6. #include <Wt/WContainerWidget>
  7. #include <Wt/WImage>
  8. #include <Wt/WIntValidator>
  9. #include <Wt/WLabel>
  10. #include <Wt/WLineEdit>
  11. #include <Wt/WPushButton>
  12. #include <Wt/WTableCell>
  13. #include <Wt/WTextArea>
  14. #include <Wt/WText>
  15. Form::Form(WContainerWidget *parent)
  16. : WTable(parent)
  17. {
  18. createUI();
  19. }
  20. void Form::createUI()
  21. {
  22. WLabel *label;
  23. int row = 0;
  24. // Title
  25. elementAt(row, 0)->setColumnSpan(3);
  26. elementAt(row, 0)->setContentAlignment(AlignTop | AlignCenter);
  27. elementAt(row, 0)->setPadding(10);
  28. WText *title = new WText(tr("example.form"),
  29. elementAt(row, 0));
  30. title->decorationStyle().font().setSize(WFont::XLarge);
  31. // error messages
  32. ++row;
  33. elementAt(row, 0)->setColumnSpan(3);
  34. feedbackMessages_ = elementAt(row, 0);
  35. feedbackMessages_->setPadding(5);
  36. WCssDecorationStyle& errorStyle = feedbackMessages_->decorationStyle();
  37. errorStyle.setForegroundColor(Wt::red);
  38. errorStyle.font().setSize(WFont::Smaller);
  39. errorStyle.font().setWeight(WFont::Bold);
  40. errorStyle.font().setStyle(WFont::Italic);
  41. // Name
  42. ++row;
  43. nameEdit_ = new WLineEdit(elementAt(row, 2));
  44. label = new WLabel(tr("example.name"), elementAt(row, 0));
  45. label->setBuddy(nameEdit_);
  46. nameEdit_->setValidator(new WValidator(true));
  47. nameEdit_->enterPressed().connect(this, &Form::submit);
  48. // First name
  49. ++row;
  50. firstNameEdit_ = new WLineEdit(elementAt(row, 2));
  51. label = new WLabel(tr("example.firstname"), elementAt(row,0));
  52. label->setBuddy(firstNameEdit_);
  53. // Country
  54. ++row;
  55. countryEdit_ = new WComboBox(elementAt(row, 2));
  56. countryEdit_->addItem("");
  57. countryEdit_->addItem("Belgium");
  58. countryEdit_->addItem("Netherlands");
  59. countryEdit_->addItem("United Kingdom");
  60. countryEdit_->addItem("United States");
  61. label = new WLabel(tr("example.country"), elementAt(row, 0));
  62. label->setBuddy(countryEdit_);
  63. countryEdit_->setValidator(new WValidator(true));
  64. countryEdit_->changed().connect(this, &Form::countryChanged);
  65. // City
  66. ++row;
  67. cityEdit_ = new WComboBox(elementAt(row, 2));
  68. cityEdit_->addItem(tr("example.choosecountry"));
  69. label = new WLabel(tr("example.city"), elementAt(row, 0));
  70. label->setBuddy(cityEdit_);
  71. // Birth date
  72. ++row;
  73. birthDateEdit_ = new WDateEdit(elementAt(row, 2));
  74. birthDateEdit_->setBottom(WDate(1900, 1, 1));
  75. birthDateEdit_->setTop(WDate::currentDate());
  76. label = new WLabel(tr("example.birthdate"), elementAt(row, 0));
  77. label->setBuddy(birthDateEdit_);
  78. birthDateEdit_->setFormat("dd/MM/yyyy");
  79. birthDateEdit_->validator()->setMandatory(true);
  80. // Child count
  81. ++row;
  82. childCountEdit_ = new WLineEdit("0", elementAt(row, 2));
  83. label = new WLabel(tr("example.childcount"),
  84. elementAt(row, 0));
  85. label->setBuddy(childCountEdit_);
  86. childCountEdit_->setValidator(new WIntValidator(0,30));
  87. childCountEdit_->validator()->setMandatory(true);
  88. ++row;
  89. remarksEdit_ = new WTextArea(elementAt(row, 2));
  90. remarksEdit_->setColumns(40);
  91. remarksEdit_->setRows(5);
  92. label = new WLabel(tr("example.remarks"),
  93. elementAt(row, 0));
  94. label->setBuddy(remarksEdit_);
  95. // Submit
  96. ++row;
  97. WPushButton *submit = new WPushButton(tr("submit"),
  98. elementAt(row, 0));
  99. submit->clicked().connect(this, &Form::submit);
  100. submit->setMargin(15, Top);
  101. elementAt(row, 0)->setColumnSpan(3);
  102. elementAt(row, 0)->setContentAlignment(AlignTop | AlignCenter);
  103. // Set column widths for label and validation icon
  104. elementAt(2, 0)->resize(WLength(30, WLength::FontEx), WLength::Auto);
  105. elementAt(2, 1)->resize(20, WLength::Auto);
  106. }
  107. void Form::countryChanged()
  108. {
  109. cityEdit_->clear();
  110. cityEdit_->addItem("");
  111. cityEdit_->setCurrentIndex(-1);
  112. switch (countryEdit_->currentIndex()) {
  113. case 0:
  114. break;
  115. case 1:
  116. cityEdit_->addItem("Antwerp");
  117. cityEdit_->addItem("Brussels");
  118. cityEdit_->addItem("Oekene");
  119. break;
  120. case 2:
  121. cityEdit_->addItem("Amsterdam");
  122. cityEdit_->addItem("Den Haag");
  123. cityEdit_->addItem("Rotterdam");
  124. break;
  125. case 3:
  126. cityEdit_->addItem("London");
  127. cityEdit_->addItem("Bristol");
  128. cityEdit_->addItem("Oxford");
  129. cityEdit_->addItem("Stonehenge");
  130. break;
  131. case 4:
  132. cityEdit_->addItem("Boston");
  133. cityEdit_->addItem("Chicago");
  134. cityEdit_->addItem("Los Angeles");
  135. cityEdit_->addItem("New York");
  136. break;
  137. }
  138. }
  139. bool Form::checkValid(WFormWidget *edit, const WString& text)
  140. {
  141. if (edit->validate() != WValidator::Valid) {
  142. feedbackMessages_->addWidget(new WText(text));
  143. feedbackMessages_->addWidget(new WBreak());
  144. edit->label()->decorationStyle().setForegroundColor(Wt::red);
  145. edit->setStyleClass("Wt-invalid");
  146. return false;
  147. } else {
  148. edit->label()->decorationStyle().setForegroundColor(WColor());
  149. edit->setStyleClass("");
  150. return true;
  151. }
  152. }
  153. bool Form::validate()
  154. {
  155. feedbackMessages_->clear();
  156. bool valid = true;
  157. if (!checkValid(nameEdit_, tr("error.name")))
  158. valid = false;
  159. if (!checkValid(countryEdit_, tr("error.country")))
  160. valid = false;
  161. if (!checkValid(birthDateEdit_, tr("error.birthdate")))
  162. valid = false;
  163. if (!checkValid(childCountEdit_, tr("error.childcount")))
  164. valid = false;
  165. return valid;
  166. }
  167. void Form::submit()
  168. {
  169. if (validate()) {
  170. // do something useful with the data...
  171. std::wstring name
  172. = firstNameEdit_->text() + L" " + nameEdit_->text();
  173. std::wstring remarks
  174. = remarksEdit_->text();
  175. clear();
  176. new WText(WString::fromUTF8("<p>Thank you, {1}, "
  177. "for all this precious data.</p>").arg(name),
  178. elementAt(0, 0));
  179. if (!remarks.empty())
  180. new WText("<p>You had some remarks. Splendid !</p>", elementAt(0, 0));
  181. wApp->quit();
  182. }
  183. }