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