/*
* @(#)ValidationDemo.java 5/19/2013
*
* Copyright 2002 - 2013 JIDE Software Inc. All rights reserved.
*/
package jidefx.examples.decoration;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Point2D;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.control.*;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.Region;
import javafx.scene.layout.VBox;
import jidefx.examples.demo.AbstractFxDemo;
import jidefx.examples.demo.DemoData;
import jidefx.scene.control.decoration.DecorationPane;
import jidefx.scene.control.decoration.DecorationUtils;
import jidefx.scene.control.decoration.Decorator;
import jidefx.scene.control.validation.*;
import org.apache.commons.validator.routines.*;
import java.util.List;
import java.util.Optional;
import java.util.function.Consumer;
public class ValidationDemo extends AbstractFxDemo {
@Override
public String getName() {
return "Validation Demo";
}
@Override
public String getDescription() {
return "This is a demo for validations. Use Decoration to display validation info " +
"\n" +
"Demoed classes:\n" +
"jidefx.scene.control.validation.*\n";
}
public static void main(String[] args) {
launch(args);
}
public static final String PATTERN_IP4 = "\\b(([01]?\\d?\\d|2[0-4]\\d|25[0-5])\\.){3}([01]?\\d?\\d|2[0-4]\\d|25[0-5])\\b";
@Override
public Region getDemoPanel() {
TabPane tabPane = new TabPane();
tabPane.getStyleClass().add(TabPane.STYLE_CLASS_FLOATING);
Tab signup = new Tab("Signup Validation");
signup.setContent(createSignUpForm());
Tab validator = new Tab("Various Validators");
validator.setContent(createValidatorsForm());
tabPane.getTabs().addAll(signup, validator);
CheckBox checkBox = new CheckBox("Using Validation.css");
checkBox.selectedProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
if (newValue) {
// use a validation css for demo purpose
tabPane.getStylesheets().add(ValidationDemo.class.getResource("Validation.css").toExternalForm());
} else {
tabPane.getStylesheets().remove(ValidationDemo.class.getResource("Validation.css").toExternalForm());
}
}
});
return new VBox(6, checkBox, tabPane);
}
private Region createSignUpForm() {
Region pane = DemoData.createSignUpForm();
return installValidatorsForSignUpForm(pane);
}
private Region installValidatorsForSignUpForm(final Region pane) {
String prefix = DemoData.PREFIX_SIGNUP_FORM;
TextField emailField = (TextField) pane.lookup("#" + prefix + "emailField");
TextField confirmEmailField = (TextField) pane.lookup("#" + prefix + "confirmEmailField");
SimpleValidator emailValidator = new SimpleValidator(EmailValidator.getInstance()) {
@Override
public ValidationEvent call(ValidationObject param) {
ValidationEvent event = super.call(param);
if (!ValidationEvent.VALIDATION_OK.equals(event.getEventType()) || emailField.getText().equals(confirmEmailField.getText())) {
return event;
} else {
return new ValidationEvent(ValidationEvent.VALIDATION_ERROR, 0, "Two emails are not the same!");
}
}
};
ValidationUtils.install(emailField, new SimpleValidator(EmailValidator.getInstance()));
ValidationUtils.install(emailField, new Validator() {
@Override
public ValidationEvent call(ValidationObject param) {
if (emailField.getText().trim().length() == 0) {
return new ValidationEvent(ValidationEvent.VALIDATION_ERROR, 0, "The email cannot be empty!");
} else return new SimpleValidator(EmailValidator.getInstance()).call(param);
}
}, ValidationMode.ON_DEMAND);
ValidationUtils.install(confirmEmailField, emailValidator);
Validator countryValidator = new Validator() {
@Override
public ValidationEvent call(ValidationObject param) {
if ("United States".equals(param.getNewValue())) {
return ValidationEvent.OK;
} else if (param.getNewValue() == null) {
return new ValidationEvent(ValidationEvent.VALIDATION_ERROR, 0, "Please select a country!");
} else {
return new ValidationEvent(ValidationEvent.VALIDATION_WARNING, 0, "We only support signing up in United States at the moment!");
}
}
};
ChoiceBox countryChoiceBox = (ChoiceBox) pane.lookup("#" + prefix + "countryChoiceBox");
ValidationUtils.install(countryChoiceBox, countryValidator, ValidationMode.ON_DEMAND);
ValidationUtils.install(countryChoiceBox, countryValidator, ValidationMode.ON_FLY);
TextField passwordField = (TextField) pane.lookup("#" + prefix + "passwordField");
TextField confirmPasswordField = (TextField) pane.lookup("#" + prefix + "confirmPasswordField");
Validator passwordEmptyValidator = new Validator() {
@Override
public ValidationEvent call(ValidationObject param) {
if (passwordField.getText().trim().length() == 0) {
return new ValidationEvent(ValidationEvent.VALIDATION_ERROR, 0, "The password cannot be empty!");
} else return ValidationEvent.OK;
}
};
ValidationUtils.install(passwordField, passwordEmptyValidator, ValidationMode.ON_DEMAND);
ValidationUtils.install(passwordField, passwordEmptyValidator, ValidationMode.ON_FLY);
ValidationUtils.install(confirmPasswordField, new Validator() {
@Override
public ValidationEvent call(ValidationObject param) {
if (!passwordField.getText().equals(confirmPasswordField.getText())) {
return new ValidationEvent(ValidationEvent.VALIDATION_ERROR, 0, "The two password are different!");
} else return ValidationEvent.OK;
}
}, ValidationMode.ON_FOCUS_LOST);
Button signUpButton = (Button) pane.lookup("#" + prefix + "signUpButton");
signUpButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
ValidationUtils.validateOnDemand(pane);
}
});
ValidationGroup validationGroup = new ValidationGroup(emailField, passwordField);
signUpButton.disableProperty().bind(validationGroup.invalidProperty());
validationGroup.invalidProperty().addListener((observable, oldValue, newValue) -> {
System.out.println(newValue);
});
ValidationUtils.forceValidate(emailField, ValidationMode.ON_FLY);
ValidationUtils.forceValidate(passwordField, ValidationMode.ON_FLY);
// add a large help icon to the sign-up button
Label helpLabel = new Label("", new ImageView(new Image("/jidefx/examples/decoration/help.png")));
DecorationUtils.install(signUpButton, new Decorator<>(helpLabel, Pos.CENTER_RIGHT, new Point2D(100, 0)));
helpLabel.setTooltip(new Tooltip("This is a demo to show you how to do validation involving two fields. Both email and password fields" +
"\ninvolves validation to ensure both value are the same. In addition to that, it also shows you how to use" +
"\nEmailValidator to check for a valid email address. The country choice box will show a validation warning" +
"\nif the selected country is not United States."));
return new DecorationPane(pane);
}
private Region createValidatorsForm() {
Region pane = DemoData.createValidationForm();
return installValidatorsForValidationForm(pane);
}
private Region installValidatorsForValidationForm(Region pane) {
String prefix = DemoData.PREFIX_VALIDATION_FORM;
ValidationUtils.install(pane.lookup("#" + prefix + "emailField"), new SimpleValidator(EmailValidator.getInstance()), ValidationMode.ON_FLY);
TextField urlField = (TextField) pane.lookup("#" + prefix + "urlField");
ValidationUtils.install(urlField, new SimpleValidator(UrlValidator.getInstance()), ValidationMode.ON_FLY);
urlField.addEventHandler(ValidationEvent.ANY, new EventHandler<ValidationEvent>() {
@Override
public void handle(ValidationEvent event) {
pane.lookup("#" + prefix + "urlButton").setDisable(event.getEventType() != ValidationEvent.VALIDATION_OK);
}
});
TextField ISBNField = (TextField) pane.lookup("#" + prefix + "ISBNField");
ValidationUtils.install(ISBNField, new SimpleValidator(ISBNValidator.getInstance()), ValidationMode.ON_FLY);
ISBNField.addEventHandler(ValidationEvent.ANY, new EventHandler<ValidationEvent>() {
@Override
public void handle(ValidationEvent event) {
pane.lookup("#" + prefix + "amazonButton").setDisable(event.getEventType() != ValidationEvent.VALIDATION_OK);
}
});
ValidationUtils.install(pane.lookup("#" + prefix + "IP4Field"), new SimpleValidator(new RegexValidator(PATTERN_IP4)), ValidationMode.ON_FLY);
ValidationUtils.install(pane.lookup("#" + prefix + "intField"), new SimpleValidator(IntegerValidator.getInstance()), ValidationMode.ON_FLY);
ValidationUtils.install(pane.lookup("#" + prefix + "doubleField"), new SimpleValidator(DoubleValidator.getInstance()), ValidationMode.ON_FLY);
ValidationUtils.install(pane.lookup("#" + prefix + "currencyField"), new SimpleValidator(CurrencyValidator.getInstance()), ValidationMode.ON_FLY);
ValidationUtils.install(pane.lookup("#" + prefix + "percentField"), new SimpleValidator(PercentValidator.getInstance()), ValidationMode.ON_FLY);
ValidationUtils.install(pane.lookup("#" + prefix + "dateField"), new SimpleValidator(DateValidator.getInstance()), ValidationMode.ON_FLY);
TextField cardField = (TextField) pane.lookup("#" + prefix + "cardField");
ImageView cardImage = (ImageView) pane.lookup("#" + prefix + "cardImage");
ValidationUtils.install(cardField, new SimpleValidator(new CreditCardValidator(CreditCardValidator.AMEX | CreditCardValidator.VISA | CreditCardValidator.MASTERCARD + CreditCardValidator.DISCOVER | CreditCardValidator.DINERS)), ValidationMode.ON_FLY);
cardField.addEventHandler(ValidationEvent.ANY, new EventHandler<ValidationEvent>() {
@Override
public void handle(ValidationEvent event) {
if (event.getEventType() == ValidationEvent.VALIDATION_OK) {
if (new CreditCardValidator(CreditCardValidator.VISA).isValid(cardField.getText())) {
cardImage.setImage(new Image("/jidefx/examples/decoration/VISA.png"));
} else if (new CreditCardValidator(CreditCardValidator.MASTERCARD).isValid(cardField.getText())) {
cardImage.setImage(new Image("/jidefx/examples/decoration/MasterCard.png"));
} else if (new CreditCardValidator(CreditCardValidator.AMEX).isValid(cardField.getText())) {
cardImage.setImage(new Image("/jidefx/examples/decoration/AMEX.png"));
} else if (new CreditCardValidator(CreditCardValidator.DISCOVER).isValid(cardField.getText())) {
cardImage.setImage(new Image("/jidefx/examples/decoration/Discover.png"));
} else if (new CreditCardValidator(CreditCardValidator.DINERS).isValid(cardField.getText())) {
cardImage.setImage(new Image("/jidefx/examples/decoration/DinersClub.png"));
}
}
}
});
final DatePicker dpDate = (DatePicker) pane.lookup("#" + prefix + "dpDate");
final DatePicker dpDateTwo = (DatePicker) pane.lookup("#" + prefix + "dpDateTwo");
Validator validator = param -> dpDate.getValue() != null && dpDateTwo.getValue() != null &&
dpDate.getValue().isBefore(dpDateTwo.getValue()) &&
dpDateTwo.getValue().isAfter(dpDate.getValue())
?
new ValidationEvent(ValidationEvent.VALIDATION_OK) :
new ValidationEvent(ValidationEvent.VALIDATION_ERROR, 0, "Date is not ok");
ValidationUtils.install(dpDate, validator, ValidationMode.ON_FLY);
ValidationUtils.install(dpDateTwo, dpDate.valueProperty(), validator, ValidationMode.ON_FLY,
ValidationUtils.createDefaultValidationEventHandler(dpDateTwo, ValidationDecorators::fontAwesomeDecoratorCreator));
Consumer<Object> validateDates = o -> {
ValidationUtils.forceValidate(dpDate, ValidationMode.ON_FLY);
ValidationUtils.forceValidate(dpDateTwo, ValidationMode.ON_FLY);
};
ValidationDecorators.installRequiredDecorator(dpDate, ValidationDecorators::graphicRequiredCreator);
dpDate.valueProperty().addListener((observable1, oldValue1, newValue1) -> validateDates.accept(null));
dpDateTwo.valueProperty().addListener((observable1, oldValue1, newValue1) -> validateDates.accept(null));
validateDates.accept(null);
Label validationLabel = null;
Optional<List<Decorator>> ovalidationDecorators = ValidationUtils.getValidationDecorators(dpDate);
if (ovalidationDecorators.isPresent()) {
Optional<Node> nodeOptional = Optional.of(ovalidationDecorators.get().get(0).getNode());
if (nodeOptional.isPresent() && (nodeOptional.get() instanceof Label)) {
validationLabel = (Label) nodeOptional.get();
}
}
final Label finalValidationLabel = validationLabel;
// Show Validation tooltip on date picker focus
dpDate.focusedProperty().addListener((observable, oldValue, newValue) -> {
if (newValue) {
ValidationUtils.showTooltip(finalValidationLabel);
}
});
dpDate.addEventHandler(ValidationEvent.VALIDATION_ERROR, event -> {
ValidationUtils.showTooltip(finalValidationLabel);
});
pane.addEventHandler(ValidationEvent.ANY, event -> {
System.out.println(event);
});
return new DecorationPane(pane);
}
}