/home/koen/project/wt/cvs/wt/examples/form/Form.C

Go to the documentation of this file.
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   // Title
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   // error messages
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   // Name
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   // First name
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   // Country
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   // City
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   // Birth date
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   // Child count
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   // Submit
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   // Set column widths for label and validation icon
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     // do something useful with the data...
00214     std::wstring name
00215       = firstNameEdit_->text() + L" " + nameEdit_->text();
00216 
00217     std::wstring remarks
00218       = remarksEdit_->text();
00219 
00220     clear();
00221 
00222     // WMessage with arguments is not yet implemented...
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 }

Generated on Mon Apr 14 15:15:04 2008 for Wt by doxygen 1.5.3