package com.scrivenvar.controls;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.scene.control.TextField;
import javafx.util.StringConverter;
public class EscapeTextField extends TextField {
public EscapeTextField() {
escapedText.bindBidirectional(
textProperty(),
new StringConverter<>() {
@Override
public String toString( String object ) {
return escape( object );
}
@Override
public String fromString( String string ) {
return unescape( string );
}
}
);
escapeCharacters.addListener(
e -> escapedText.set( escape( textProperty().get() ) )
);
}
private final StringProperty escapedText = new SimpleStringProperty();
public StringProperty escapedTextProperty() {
return escapedText;
}
private final StringProperty escapeCharacters = new SimpleStringProperty();
public String getEscapeCharacters() {
return escapeCharacters.get();
}
public void setEscapeCharacters( String escapeCharacters ) {
this.escapeCharacters.set( escapeCharacters );
}
private String escape( final String s ) {
final String escapeChars = getEscapeCharacters();
return isEmpty( escapeChars ) ? s :
s.replaceAll( "([" + escapeChars.replaceAll(
"(.)",
"\\\\$1" ) + "])", "\\\\$1" );
}
private String unescape( final String s ) {
final String escapeChars = getEscapeCharacters();
return isEmpty( escapeChars ) ? s :
s.replaceAll( "\\\\([" + escapeChars
.replaceAll( "(.)", "\\\\$1" ) + "])", "$1" );
}
private static boolean isEmpty( final String s ) {
return s == null || s.isEmpty();
}
}