00001 #include "Form.h"
00002
00003 #include <Wt/WApplication>
00004 #include <Wt/WBreak>
00005 #include <Wt/WDatePicker>
00006 #include <Wt/WSelectionBox>
00007 #include <Wt/WContainerWidget>
00008 #include <Wt/WImage>
00009 #include <Wt/WIntValidator>
00010 #include <Wt/WLabel>
00011 #include <Wt/WLineEdit>
00012 #include <Wt/WPushButton>
00013 #include <Wt/WTableCell>
00014 #include <Wt/WTextArea>
00015 #include <Wt/WText>
00016
00017 Form::Form(WContainerWidget *parent)
00018 : WTable(parent)
00019 {
00020 createUI();
00021 }
00022
00023 void Form::createUI()
00024 {
00025 WLabel *label;
00026 int row = 0;
00027
00028
00029 elementAt(row, 0)->setColumnSpan(3);
00030 elementAt(row, 0)->setContentAlignment(AlignTop | AlignCenter);
00031 elementAt(row, 0)->setPadding(10);
00032 WText *title = new WText(tr("example.form"),
00033 elementAt(row, 0));
00034 title->decorationStyle().font().setSize(WFont::XLarge);
00035
00036
00037 ++row;
00038 elementAt(row, 0)->setColumnSpan(3);
00039 feedbackMessages_ = elementAt(row, 0);
00040 feedbackMessages_->setPadding(5);
00041
00042 WCssDecorationStyle& errorStyle = feedbackMessages_->decorationStyle();
00043 errorStyle.setForegroundColor(Wt::red);
00044 errorStyle.font().setSize(WFont::Smaller);
00045 errorStyle.font().setWeight(WFont::Bold);
00046 errorStyle.font().setStyle(WFont::Italic);
00047
00048
00049 ++row;
00050 nameEdit_ = new WLineEdit(elementAt(row, 2));
00051 label = new WLabel(tr("example.name"), elementAt(row, 0));
00052 label->setBuddy(nameEdit_);
00053 nameEdit_->setValidator(new WValidator(true));
00054 nameEdit_->enterPressed().connect(SLOT(this, Form::submit));
00055
00056
00057 ++row;
00058 firstNameEdit_ = new WLineEdit(elementAt(row, 2));
00059 label = new WLabel(tr("example.firstname"), elementAt(row,0));
00060 label->setBuddy(firstNameEdit_);
00061
00062
00063 ++row;
00064 countryEdit_ = new WComboBox(elementAt(row, 2));
00065 countryEdit_->addItem("");
00066 countryEdit_->addItem("Belgium");
00067 countryEdit_->addItem("Netherlands");
00068 countryEdit_->addItem("United Kingdom");
00069 countryEdit_->addItem("United States");
00070 label = new WLabel(tr("example.country"), elementAt(row, 0));
00071 label->setBuddy(countryEdit_);
00072 countryEdit_->setValidator(new WValidator(true));
00073 countryEdit_->changed().connect(SLOT(this, Form::countryChanged));
00074
00075
00076 ++row;
00077 cityEdit_ = new WComboBox(elementAt(row, 2));
00078 cityEdit_->addItem(tr("example.choosecountry"));
00079 label = new WLabel(tr("example.city"), elementAt(row, 0));
00080 label->setBuddy(cityEdit_);
00081
00082
00083 ++row;
00084
00085 birthDateEdit_ = new WDatePicker(elementAt(row, 2));
00086 birthDateEdit_->setBottom(WDate(1900, 1, 1));
00087 birthDateEdit_->setTop(WDate::currentDate());
00088 label = new WLabel(tr("example.birthdate"), elementAt(row, 0));
00089 label->setBuddy(birthDateEdit_->lineEdit());
00090 birthDateEdit_->setFormat("dd/MM/yyyy");
00091 birthDateEdit_->lineEdit()->validator()->setMandatory(true);
00092
00093
00094 ++row;
00095 childCountEdit_ = new WLineEdit("0", elementAt(row, 2));
00096 label = new WLabel(tr("example.childcount"),
00097 elementAt(row, 0));
00098 label->setBuddy(childCountEdit_);
00099 childCountEdit_->setValidator(new WIntValidator(0,30));
00100 childCountEdit_->validator()->setMandatory(true);
00101
00102 ++row;
00103 remarksEdit_ = new WTextArea(elementAt(row, 2));
00104 remarksEdit_->setColumns(40);
00105 remarksEdit_->setRows(5);
00106 label = new WLabel(tr("example.remarks"),
00107 elementAt(row, 0));
00108 label->setBuddy(remarksEdit_);
00109
00110
00111 ++row;
00112 WPushButton *submit = new WPushButton(tr("submit"),
00113 elementAt(row, 0));
00114 submit->clicked().connect(SLOT(this, Form::submit));
00115 submit->setMargin(15, Top);
00116 elementAt(row, 0)->setColumnSpan(3);
00117 elementAt(row, 0)->setContentAlignment(AlignTop | AlignCenter);
00118
00119
00120 elementAt(2, 0)->resize(WLength(30, WLength::FontEx), WLength::Auto);
00121 elementAt(2, 1)->resize(20, WLength::Auto);
00122 }
00123
00124 void Form::countryChanged()
00125 {
00126 cityEdit_->clear();
00127 cityEdit_->addItem("");
00128 cityEdit_->setCurrentIndex(-1);
00129
00130 switch (countryEdit_->currentIndex()) {
00131 case 0:
00132 break;
00133 case 1:
00134 cityEdit_->addItem("Antwerp");
00135 cityEdit_->addItem("Brussels");
00136 cityEdit_->addItem("Oekene");
00137 break;
00138 case 2:
00139 cityEdit_->addItem("Amsterdam");
00140 cityEdit_->addItem("Den Haag");
00141 cityEdit_->addItem("Rotterdam");
00142 break;
00143 case 3:
00144 cityEdit_->addItem("London");
00145 cityEdit_->addItem("Bristol");
00146 cityEdit_->addItem("Oxford");
00147 cityEdit_->addItem("Stonehenge");
00148 break;
00149 case 4:
00150 cityEdit_->addItem("Boston");
00151 cityEdit_->addItem("Chicago");
00152 cityEdit_->addItem("Los Angelos");
00153 cityEdit_->addItem("New York");
00154 break;
00155 }
00156 }
00157
00158 bool Form::checkValid(WFormWidget *edit, const WString& text)
00159 {
00160 if (edit->validate() != WValidator::Valid) {
00161 feedbackMessages_->addWidget(new WText(text));
00162 feedbackMessages_->addWidget(new WBreak());
00163 edit->label()->decorationStyle().setForegroundColor(Wt::red);
00164 edit->setStyleClass("Wt-invalid");
00165
00166 return false;
00167 } else {
00168 edit->label()->decorationStyle().setForegroundColor(WColor());
00169 edit->setStyleClass("");
00170
00171 return true;
00172 }
00173 }
00174
00175 bool Form::validate()
00176 {
00177 feedbackMessages_->clear();
00178 bool valid = true;
00179
00180 if (!checkValid(nameEdit_, tr("error.name")))
00181 valid = false;
00182 if (!checkValid(countryEdit_, tr("error.country")))
00183 valid = false;
00184 if (!checkValid(birthDateEdit_->lineEdit(), tr("error.birthdate")))
00185 valid = false;
00186 if (!checkValid(childCountEdit_, tr("error.childcount")))
00187 valid = false;
00188
00189 return valid;
00190 }
00191
00192 void Form::submit()
00193 {
00194 if (validate()) {
00195
00196 std::wstring name
00197 = firstNameEdit_->text() + L" " + nameEdit_->text();
00198
00199 std::wstring remarks
00200 = remarksEdit_->text();
00201
00202 clear();
00203
00204 new WText(WString::fromUTF8("<p>Thank you, {1}, "
00205 "for all this precious data.</p>").arg(name),
00206 elementAt(0, 0));
00207
00208 if (!remarks.empty())
00209 new WText("<p>You had some remarks. Splendid !</p>", elementAt(0, 0));
00210
00211 wApp->quit();
00212 }
00213 }