Project

General

Profile

Support #6916 » Form.C

Form Datei - Karl Estermann, 02/21/2019 01:30 PM

 
#include "Form.h"

#include <Wt/WApplication.h>
#include <Wt/WBreak.h>
#include <Wt/WDateEdit.h>
#include <Wt/WSelectionBox.h>
#include <Wt/WContainerWidget.h>
#include <Wt/WImage.h>
#include <Wt/WIntValidator.h>
#include <Wt/WLabel.h>
#include <Wt/WLineEdit.h>
#include <Wt/WPushButton.h>
#include <Wt/WTableCell.h>
#include <Wt/WTextArea.h>
#include <Wt/WText.h>
#include <string>
#include <iostream>

Form::Form()
: WTable()
{
Wt::WApplication *app = Wt::WApplication::instance();
app->messageResourceBundle().use(Wt::WApplication::appRoot() + "form-example");
createUI();
}

void Form::createUI()
{

WLabel *label;
// Form *fo=this;
int row = 0;

// Title
elementAt(row, 0)->setColumnSpan(3);
elementAt(row, 0)->setContentAlignment(AlignmentFlag::Top | AlignmentFlag::Center);
elementAt(row, 0)->setPadding(10);
WText *title = elementAt(row,0)->addWidget(cpp14::make_unique<WText>(tr("example.form")));
title->decorationStyle().font().setSize(FontSize::XLarge);

// error messages
++row;
elementAt(row, 0)->setColumnSpan(3);
feedbackMessages_ = elementAt(row, 0);
feedbackMessages_->setPadding(5);

WCssDecorationStyle& errorStyle = feedbackMessages_->decorationStyle();
errorStyle.setForegroundColor(WColor("red"));
errorStyle.font().setSize(FontSize::Smaller);
errorStyle.font().setWeight(FontWeight::Bold);
errorStyle.font().setStyle(FontStyle::Italic);

// Name
++row;
nameEdit_ = elementAt(row,2)->addWidget(cpp14::make_unique<WLineEdit>());
label = elementAt(row,0)->addWidget(cpp14::make_unique<WLabel>(tr("example.name")));
label->setBuddy(nameEdit_);
nameEdit_->setValidator(std::make_shared<WValidator>(true));
std::cout << " push submit " << std::endl;
nameEdit_->enterPressed().connect(this, &Form::submit);

// First name
++row;
firstNameEdit_ = elementAt(row,2)->addWidget(cpp14::make_unique<WLineEdit>());
label = elementAt(row,0)->addWidget(cpp14::make_unique<WLabel>(tr("example.firstname")));
label->setBuddy(firstNameEdit_);

// Country
++row;
countryEdit_ = elementAt(row,2)->addWidget(cpp14::make_unique<WComboBox>());
countryEdit_->addItem("");
countryEdit_->addItem("Belgium");
countryEdit_->addItem("Netherlands");
countryEdit_->addItem("United Kingdom");
countryEdit_->addItem("United States");
label = elementAt(row,0)->addWidget(cpp14::make_unique<WLabel>(tr("example.country")));
label->setBuddy(countryEdit_);
countryEdit_->setValidator(std::make_shared<WValidator>(true));
std::cout << " countryChanged" << std::endl;
countryEdit_->changed().connect(this, &Form::countryChanged);


// City
++row;
cityEdit_ = elementAt(row,2)->addWidget(cpp14::make_unique<WComboBox>());
cityEdit_->clear();
cityEdit_->addItem("");
cityEdit_->addItem("Antwerp");
cityEdit_->addItem("Brussels");
cityEdit_->addItem("Oekene");
cityEdit_->addItem(tr("example.choosecountry"));
label = elementAt(row,0)->addWidget(cpp14::make_unique<WLabel>(tr("example.city")));
label->setBuddy(cityEdit_);

// Birth date
++row;
birthDateEdit_ = elementAt(row, 2)->addWidget(cpp14::make_unique<WDateEdit>());
birthDateEdit_->setBottom(WDate(1900, 1, 1));
birthDateEdit_->setTop(WDate::currentDate());
label = elementAt(row,0)->addWidget(cpp14::make_unique<WLabel>(tr("example.birthdate")));
label->setBuddy(birthDateEdit_);
birthDateEdit_->setFormat("dd/MM/yyyy");
birthDateEdit_->validator()->setMandatory(true);

// Child count
++row;
childCountEdit_ = elementAt(row,2)->addWidget(cpp14::make_unique<WLineEdit>("0"));
label = elementAt(row, 0)->addWidget(cpp14::make_unique<WLabel>(tr("example.childcount")));
label->setBuddy(childCountEdit_);
childCountEdit_->setValidator(std::make_shared<WIntValidator>(0,30));
childCountEdit_->validator()->setMandatory(true);

++row;
remarksEdit_ = elementAt(row,2)->addWidget(cpp14::make_unique<WTextArea>());
remarksEdit_->setColumns(40);
remarksEdit_->setRows(5);
label = elementAt(row,0)->addWidget(cpp14::make_unique<WLabel>(tr("example.remarks")));
label->setBuddy(remarksEdit_);

// Submit
++row;
WPushButton *submit = elementAt(row,0)->addWidget(cpp14::make_unique<WPushButton>(tr("submit")));
std::cout << " push second submit " << std::endl;
submit->clicked().connect(this, &Form::submit);
submit->setMargin(15, Side::Top);
elementAt(row, 0)->setColumnSpan(3);
elementAt(row, 0)->setContentAlignment(AlignmentFlag::Top | AlignmentFlag::Center);

// Set column widths for label and validation icon
elementAt(2, 0)->resize(WLength(30, LengthUnit::FontEx), WLength::Auto);
elementAt(2, 1)->resize(20, WLength::Auto);

refresh();
}

void Form::countryChanged()
{
std::cout << " CountryChanged Function" << std::endl;
cityEdit_->clear();
cityEdit_->addItem("");
cityEdit_->setCurrentIndex(-1);

switch (countryEdit_->currentIndex()) {
case 0:
break;
case 1:
cityEdit_->addItem("Antwerp");
cityEdit_->addItem("Brussels");
cityEdit_->addItem("Oekene");
break;
case 2:
cityEdit_->addItem("Amsterdam");
cityEdit_->addItem("Den Haag");
cityEdit_->addItem("Rotterdam");
break;
case 3:
cityEdit_->addItem("London");
cityEdit_->addItem("Bristol");
cityEdit_->addItem("Oxford");
cityEdit_->addItem("Stonehenge");
break;
case 4:
cityEdit_->addItem("Boston");
cityEdit_->addItem("Chicago");
cityEdit_->addItem("Los Angeles");
cityEdit_->addItem("New York");
break;
}
}

bool Form::checkValid(WFormWidget *edit, const WString& text)
{
std::cout << " checkValid" << std::endl;

if (edit->validate() != ValidationState::Valid) {
feedbackMessages_->addWidget(cpp14::make_unique<WText>(text));
feedbackMessages_->addWidget(cpp14::make_unique<WBreak>());
edit->label()->decorationStyle().setForegroundColor(WColor("red"));
edit->setStyleClass("Wt-invalid");
return false;
} else {
edit->label()->decorationStyle().setForegroundColor(WColor());
edit->setStyleClass("");

return true;
}
}

bool Form::validate()
{
std::cout << " validate" << std::endl;
feedbackMessages_->clear();
bool valid = true;

if (!checkValid(nameEdit_, tr("error.name")))
valid = false;
if (!checkValid(countryEdit_, tr("error.country")))
valid = false;
if (!checkValid(birthDateEdit_, tr("error.birthdate")))
valid = false;
if (!checkValid(childCountEdit_, tr("error.childcount")))
valid = false;

return valid;
}

void Form::submit()
{
std::cout << " submit" << std::endl;
if (validate()) {
// do something useful with the data...
WString name = WString("{1} {2}")
.arg(firstNameEdit_->text())
.arg(nameEdit_->text());

WString remarks
= remarksEdit_->text();

clear();

elementAt(0,0)->addWidget(cpp14::make_unique<WText>(
WString("<p>Thank you, {1}, "
"for all this precious data.</p>").arg(name)));

if (!remarks.empty())
elementAt(0,0)->addWidget(cpp14::make_unique<WText>(
WString("<p>You had some remarks. Splendid !</p>")));

wApp->quit();
}
}
(1-1/5)