/*
* @(#)TextFieldsDemo.java 5/19/2013
*
* Copyright 2002 - 2013 JIDE Software Inc. All rights reserved.
*/
package jidefx.examples.fields;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.geometry.Orientation;
import javafx.geometry.Point2D;
import javafx.geometry.Pos;
import javafx.scene.Parent;
import javafx.scene.control.*;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Region;
import javafx.scene.layout.VBox;
import jidefx.examples.demo.AbstractFxDemo;
import jidefx.scene.control.decoration.DecorationPane;
import jidefx.scene.control.decoration.DecorationUtils;
import jidefx.scene.control.decoration.Decorator;
import jidefx.scene.control.field.*;
import jidefx.scene.control.field.verifier.IntegerRangePatternVerifier;
import jidefx.scene.control.field.verifier.StringValuesPatternVerifier;
import jidefx.utils.FXUtils;
import net.miginfocom.layout.AC;
import net.miginfocom.layout.CC;
import net.miginfocom.layout.LC;
import org.tbee.javafx.scene.layout.MigPane;
import java.text.DateFormat;
import java.util.Calendar;
import java.util.Date;
public class FormattedTextFieldsDemo extends AbstractFxDemo {
public FormattedTextFieldsDemo() {
}
public String getName() {
return "MaskTextField/FormattedTextField Demo";
}
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";
public static final String PATTERN_IP6 = "^([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4}$";
public static final String PATTERN_MAC_ADDRESS = "^([0-9a-fA-F][0-9a-fA-F]:){5}([0-9a-fA-F][0-9a-fA-F])$";
public static final String PATTERN_SSN = "^\\d{3}-\\d{2}-\\d{4}$";
public static final String PREFIX_MASK_FIELD_FORM = "FieldForm";
public Region getDemoPanel() {
Parent pane1 = createFormattedTextFields();
Parent pane2 = createCustomFormattedTextFields();
return new DecorationPane(new HBox(6, pane1, new Separator(Orientation.VERTICAL), pane2));
}
public static Parent createFormattedTextFields() {
MigPane pane = new MigPane(new LC().minWidth("450px").minHeight("450px").insets("20 10 10 10"), new AC().index(0).align("right").gap("20px").index(1).fill().grow().gap("6px").fill(), new AC().gap("6px"));
Label title = new Label("FormattedTextFields (Step by Step)");
title.setStyle("-fx-font-size: 1.4em;");
pane.add(title, new CC().span(2).alignX("left").wrap());
final CheckBox showSpinnersCheckBox = new CheckBox("Show Spinners");
showSpinnersCheckBox.setSelected(true);
showSpinnersCheckBox.selectedProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
FXUtils.setRecursively(pane, new FXUtils.Handler() {
@Override
public boolean condition(Object c) {
return c instanceof FormattedTextField;
}
@Override
public void action(Object c) {
if (c instanceof PopupField) {
((FormattedTextField) c).setSpinnersVisible(newValue);
((PopupField) c).setPopupButtonVisible(!newValue);
}
else {
((FormattedTextField) c).setSpinnersVisible(newValue);
}
}
});
}
});
final CheckBox editableCheckBox = new CheckBox("Editable");
editableCheckBox.setSelected(true);
editableCheckBox.selectedProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
FXUtils.setRecursively(pane, new FXUtils.Handler() {
@Override
public boolean condition(Object c) {
return c instanceof FormattedTextField;
}
@Override
public void action(Object c) {
((FormattedTextField) c).setEditable(newValue);
}
});
}
});
final CheckBox disableCheckBox = new CheckBox("Disable");
disableCheckBox.setSelected(false);
disableCheckBox.selectedProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
FXUtils.setRecursively(pane, new FXUtils.Handler() {
@Override
public boolean condition(Object c) {
return c instanceof FormattedTextField;
}
@Override
public void action(Object c) {
((FormattedTextField) c).setDisable(newValue);
}
});
}
});
HBox hBox = new HBox(10, showSpinnersCheckBox, editableCheckBox, disableCheckBox);
pane.add(hBox, new CC().spanX(2).alignX("right").gapBottom("10px").wrap());
Label label1 = new Label("new IntegerField(0, 255)");
pane.add(label1);
pane.add(new IntegerField(0, 255, 0), new CC().wrap());
Label label2 = new Label("new IntegerField(0, 255).asSpinner()");
pane.add(label2);
pane.add(new IntegerField(0, 255, 0), new CC().wrap());
Label label3 = new Label("new FormattedTextField<String>()");
Label label = new Label("...");
label.setTooltip(new Tooltip("FormattedTextField<String> twoNumberField = new FormattedTextField<>();\n" +
"twoNumberField.setPattern(\"n.n\");\n" +
"twoNumberField.getPatternVerifiers().put(\"n\", new IntegerRangePatternVerifier(0, 255));\n"));
DecorationUtils.install(label3, new Decorator<>(label, Pos.BASELINE_RIGHT, new Point2D(100, 0)));
pane.add(label3);
FormattedTextField<String> twoNumberField = new FormattedTextField<>();
twoNumberField.setPattern("m-n");
twoNumberField.getPatternVerifiers().put("m", new IntegerRangePatternVerifier(10, 300, true));
twoNumberField.getPatternVerifiers().put("n", new IntegerRangePatternVerifier(500, 2300, true));
twoNumberField.setText("010-2000");
pane.add(twoNumberField, new CC().wrap());
Label amountLabel = new Label("new NumberField(NumberType.Currency)");
pane.add(amountLabel);
NumberField amountField = new NumberField(NumberField.NumberType.Currency);
amountField.setValue(168.00);
pane.add(amountField, new CC().wrap());
Label percentLabel = new Label("new NumberField(NumberType.Percent)");
pane.add(percentLabel);
NumberField percentField = new NumberField(NumberField.NumberType.Percent);
percentField.setValue(0.5);
pane.add(percentField, new CC().wrap());
Label IP4Label = new Label("FormattedTextField.createIPv4Field()");
pane.add(IP4Label);
FormattedTextField<String> IP4Field = FormattedTextField.createIPv4Field();
IP4Field.setText("192.168.1.1");
pane.add(IP4Field, new CC().wrap());
Label dateLabel = new Label("DateField.createDateField()");
pane.add(dateLabel);
FormattedTextField<Date> dateField = DateField.createDateField();
pane.add(dateField, new CC().wrap());
Label dateShortLabel = new Label("DateField.createDateField(DateFormat.SHORT)");
pane.add(dateShortLabel);
FormattedTextField<Date> dateShortField = DateField.createDateField(DateFormat.SHORT);
pane.add(dateShortField, new CC().wrap());
Label timeLabel = new Label("DateField.createTimeField()");
pane.add(timeLabel);
FormattedTextField<Date> timeField = DateField.createTimeField();
pane.add(timeField, new CC().wrap());
Label dateTimeLabel = new Label("DateField.createDateTimeField()");
pane.add(dateTimeLabel);
FormattedTextField<Date> dateTimeField = DateField.createDateTimeField();
pane.add(dateTimeField, new CC().wrap());
Label localDateLabel = new Label("LocalDateField.createLocalDateField()");
pane.add(localDateLabel);
LocalDateField localDateField = LocalDateField.createLocalDateField();
pane.add(localDateField, new CC().wrap());
Label localTimeLabel = new Label("LocalTimeField.createLocalTimeField()");
pane.add(localTimeLabel);
LocalTimeField localTimeField = LocalTimeField.createLocalTimeField();
pane.add(localTimeField, new CC().wrap());
Label localDateTimeLabel = new Label("LocalDateTimeField.createLocalDateTimeField()");
pane.add(localDateTimeLabel);
LocalDateTimeField localDateTimeField = LocalDateTimeField.createLocalDateTimeField();
pane.add(localDateTimeField, new CC().wrap());
Label dateTimeCustomLabel = new Label("DateField.createDateField(\"EEEE yyyy.MMMMM.dd G hh:mm aa\")");
pane.add(dateTimeCustomLabel, new CC().span(2).wrap());
FormattedTextField<Date> dateTimeCustomField = DateField.createDateField("EEEE yyyy.MMMMM.dd G hh:mm aa", Calendar.getInstance().getTime());
pane.add(dateTimeCustomField, new CC().skip().wrap());
return pane;
}
public static Parent createCustomFormattedTextFields() {
MigPane pane = new MigPane(new LC().minWidth("450px").minHeight("450px").insets("20 10 10 10"), new AC().index(0).align("right").gap("20px").index(1).fill().grow().gap("6px").fill(), new AC().gap("6px"));
Label title = new Label("Custom FormattedTextFields (Step by Step)");
title.setStyle("-fx-font-size: 1.4em;");
pane.add(title, new CC().span(2).alignX("left").wrap());
final CheckBox showSpinnersCheckBox = new CheckBox("Show Spinners");
showSpinnersCheckBox.setSelected(true);
showSpinnersCheckBox.selectedProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
FXUtils.setRecursively(pane, new FXUtils.Handler() {
@Override
public boolean condition(Object c) {
return c instanceof FormattedTextField;
}
@Override
public void action(Object c) {
if (c instanceof PopupField) {
((FormattedTextField) c).setSpinnersVisible(newValue);
((PopupField) c).setPopupButtonVisible(!newValue);
}
else {
((FormattedTextField) c).setSpinnersVisible(newValue);
}
}
});
}
});
final CheckBox editableCheckBox = new CheckBox("Editable");
editableCheckBox.setSelected(true);
editableCheckBox.selectedProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
FXUtils.setRecursively(pane, new FXUtils.Handler() {
@Override
public boolean condition(Object c) {
return c instanceof FormattedTextField;
}
@Override
public void action(Object c) {
((FormattedTextField) c).setEditable(newValue);
}
});
}
});
final CheckBox disableCheckBox = new CheckBox("Disable");
disableCheckBox.setSelected(false);
disableCheckBox.selectedProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
FXUtils.setRecursively(pane, new FXUtils.Handler() {
@Override
public boolean condition(Object c) {
return c instanceof FormattedTextField;
}
@Override
public void action(Object c) {
((FormattedTextField) c).setDisable(newValue);
}
});
}
});
HBox hBox = new HBox(10, showSpinnersCheckBox, editableCheckBox, disableCheckBox);
pane.add(hBox, new CC().spanX(2).alignX("right").gapBottom("10px").wrap());
Accordion accordion = new Accordion();
{
FormattedTextField<String> field = new FormattedTextField<>();
field.setPattern("n");
field.getPatternVerifiers().put("n", new IntegerRangePatternVerifier(0, 200, false));
field.setText("125");
TitledPane pane1 = new TitledPane("One number, from 0 to 200", new VBox(6, new Label(
"FormattedTextField<String> field = new FormattedTextField<>();\n" +
"field.setPattern(\"n\");\n" +
"field.getPatternVerifiers().put(\"n\", new IntegerRangePatternVerifier(30, 200, false));\n" +
"field.setText(\"125\");\n"
), field));
accordion.getPanes().add(pane1);
}
{
FormattedTextField<String> field = new FormattedTextField<>();
field.setPattern("m-n");
field.getPatternVerifiers().put("m", new IntegerRangePatternVerifier(10, 300, true));
field.getPatternVerifiers().put("n", new IntegerRangePatternVerifier(500, 2300, true));
field.setText("010-2000");
TitledPane pane1 = new TitledPane("Two numbers, each has its own range, fixed length", new VBox(6, new Label(
"FormattedTextField<String> field = new FormattedTextField<>();\n" +
"field.setPattern(\"m-n\");\n" +
"field.getPatternVerifiers().put(\"m\", new IntegerRangePatternVerifier(10, 300, true));\n" +
"field.getPatternVerifiers().put(\"n\", new IntegerRangePatternVerifier(500, 2300, true));\n" +
"field.setText(\"010-2000\");\n"
), field));
accordion.getPanes().add(pane1);
}
{
FormattedTextField<String> field = new FormattedTextField<>();
field.setPattern("g");
field.getPatternVerifiers().put("g", new StringValuesPatternVerifier<String>(new String[]{"High", "Medium", "Low"}) {
@Override
public String toTargetValue(String fieldValue) {
return fieldValue;
}
@Override
public String fromTargetValue(String previousFieldValue, String targetValue) {
return targetValue;
}
});
field.setText("010-2000");
TitledPane pane1 = new TitledPane("Two numbers, each has its own range, fixed length", new VBox(6, new Label(
"FormattedTextField<String> field = new FormattedTextField<>();\n" +
"field.setPattern(\"m-n\");\n" +
"field.getPatternVerifiers().put(\"m\", new IntegerRangePatternVerifier(10, 300, true));\n" +
"field.getPatternVerifiers().put(\"n\", new IntegerRangePatternVerifier(500, 2300, true));\n" +
"field.setText(\"010-2000\");\n"
), field));
accordion.getPanes().add(pane1);
}
pane.add(accordion, new CC().span(2).wrap());
return pane;
}
@Override
public String getDemoFolder() {
return "src/field";
}
}