package at.bestsolution.e4.addressbook.ui.jfx;
import javafx.collections.ObservableList;
import javafx.scene.Node;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.Label;
import javafx.scene.control.TextBox;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Priority;
import org.eclipse.core.databinding.Binding;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.core.databinding.conversion.Converter;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.databinding.observable.value.IValueChangeListener;
import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
import org.eclipse.emf.databinding.EMFProperties;
import org.eclipse.emf.databinding.EMFUpdateValueStrategy;
import org.eclipse.emf.databinding.FeaturePath;
import org.eclipse.emf.databinding.IEMFListProperty;
import org.eclipse.emf.databinding.IEMFValueProperty;
import org.eclipse.emf.databinding.edit.EMFEditProperties;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.ufacekit.ui.jfx.databinding.IJFXBeanValueProperty;
import org.eclipse.ufacekit.ui.jfx.databinding.JFXBeanProperties;
import org.eclipse.ufacekit.ui.jfx.databinding.UIFactory;
import org.eclipse.ufacekit.ui.jfx.databinding.Util;
import org.eclipse.ufacekit.ui.jfx.databinding.controls.ChoiceBoxViewer;
import org.eclipse.ufacekit.ui.jfx.databinding.controls.ChoiceBoxViewer.StringWrapper;
import at.bestsolution.e4.addressbook.model.addressbook.Address;
import at.bestsolution.e4.addressbook.model.addressbook.AddressBook;
import at.bestsolution.e4.addressbook.model.addressbook.AddressbookPackage;
import at.bestsolution.e4.addressbook.model.addressbook.Country;
import at.bestsolution.e4.addressbook.model.addressbook.FederalState;
public class AddressForm extends GridPane {
private TextBox w_zip;
private TextBox w_city;
private TextBox w_street;
private ChoiceBoxViewer<Country> w_country;
private Binding stateBinding;
private ChoiceBoxViewer<FederalState> w_federalState;
private DataBindingContext dbc;
private IObservableValue master;
private EditingDomain editingDomain;
public AddressForm() {
{
Label l = new Label("Street");
l.getStyleClass().add("detail-label");
add(l,0,0);
w_street = new TextBox();
GridPane.setHgrow(w_street, Priority.ALWAYS);
GridPane.setColumnSpan(w_street, 2);
add(w_street,1,0);
}
{
Label l = new Label("ZIP/City");
l.getStyleClass().add("detail-label");
add(l,0,1);
w_zip = new TextBox();
add(w_zip,1,1);
w_city = new TextBox();
GridPane.setHgrow(w_city, Priority.ALWAYS);
add(w_city,2,1);
}
{
Label l = new Label("Country");
l.getStyleClass().add("detail-label");
add(l,0,2);
w_country = UIFactory.createChoiceBox("{0}", EMFProperties.values(AddressbookPackage.Literals.COUNTRY__NAME));
ChoiceBox<StringWrapper<Country>> country = w_country.getChoiceBox();
GridPane.setHgrow(country, Priority.ALWAYS);
GridPane.setColumnSpan(country, 2);
add(country,1,2);
}
{
Label l = new Label("Federalstate");
l.getStyleClass().add("detail-label");
add(l,0,3);
w_federalState = UIFactory.createChoiceBox("{0}", EMFProperties.values(AddressbookPackage.Literals.FEDERAL_STATE__NAME));
ChoiceBox<StringWrapper<FederalState>> federalState = w_federalState.getChoiceBox();
GridPane.setHgrow(federalState, Priority.ALWAYS);
GridPane.setColumnSpan(federalState, 2);
add(federalState,1,3);
}
}
public void init(AddressBook book) {
{
IEMFListProperty mProp = EMFProperties
.list(AddressbookPackage.Literals.ADDRESS_BOOK__COUNTRIES);
ObservableList<Country> list = Util.create(mProp.observe(book));
w_country.setItems(list);
}
{
IJFXBeanValueProperty p = JFXBeanProperties.value("selectedItem");
IObservableValue value = p.observe(w_country);
value.addValueChangeListener(new IValueChangeListener() {
@Override
public void handleValueChange(ValueChangeEvent event) {
if (stateBinding != null) {
stateBinding.dispose();
stateBinding = null;
}
}
});
IEMFListProperty mProp = EMFProperties
.list(AddressbookPackage.Literals.COUNTRY__FEDERAL_STATES);
ObservableList<FederalState> list = Util.create(mProp.observeDetail(value));
w_federalState.setItems(list);
value.addValueChangeListener(new IValueChangeListener() {
@Override
public void handleValueChange(ValueChangeEvent event) {
if (stateBinding == null && dbc != null && master != null) {
bindState(dbc, master);
}
}
});
}
}
private static final EMFUpdateValueStrategy createNullToEmptyString() {
return (EMFUpdateValueStrategy) new EMFUpdateValueStrategy().setConverter(new Converter(String.class,String.class) {
@Override
public Object convert(Object fromObject) {
return fromObject == null ? "" : fromObject;
}
});
}
private static final EMFUpdateValueStrategy createEmptyStringToNull() {
return (EMFUpdateValueStrategy) new EMFUpdateValueStrategy().setConverter(new Converter(String.class,String.class) {
@Override
public Object convert(Object fromObject) {
return "".equals(fromObject) ? null : fromObject;
}
});
}
public void bindControls(DataBindingContext dbc, IObservableValue master) {
this.dbc = dbc;
this.master = master;
IJFXBeanValueProperty tProp = JFXBeanProperties.value("text");
IJFXBeanValueProperty sProp = JFXBeanProperties.value("selectedItem");
{
IEMFValueProperty mProp = EMFProperties
.value(AddressbookPackage.Literals.ADDRESS__STREET);
dbc.bindValue(tProp.observe(w_street), mProp.observeDetail(master), createEmptyStringToNull(), createNullToEmptyString());
}
{
IEMFValueProperty mProp = EMFProperties
.value(AddressbookPackage.Literals.ADDRESS__ZIP);
dbc.bindValue(tProp.observe(w_zip), mProp.observeDetail(master), createEmptyStringToNull(), createNullToEmptyString());
}
{
IEMFValueProperty mProp = EMFProperties
.value(AddressbookPackage.Literals.ADDRESS__CITY);
dbc.bindValue(tProp.observe(w_city), mProp.observeDetail(master), createEmptyStringToNull(), createNullToEmptyString());
}
{
IEMFValueProperty mProp = EMFProperties.value(FeaturePath
.fromList(AddressbookPackage.Literals.ADDRESS__COUNTRY));
dbc.bindValue(sProp.observe(w_country), mProp.observeDetail(master));
}
bindState(dbc, master);
IJFXBeanValueProperty eProp = JFXBeanProperties.value("disable");
for (Node c : getChildren()) {
EMFUpdateValueStrategy modelToTarget = new EMFUpdateValueStrategy();
modelToTarget.setConverter(new Converter(Address.class,
boolean.class) {
@Override
public Object convert(Object fromObject) {
return fromObject == null;
}
});
// Work around - No Idea
final Binding b = dbc
.bindValue(eProp.observe(c), master,
new EMFUpdateValueStrategy(
UpdateValueStrategy.POLICY_NEVER),
modelToTarget);
master.addValueChangeListener(new IValueChangeListener() {
@Override
public void handleValueChange(ValueChangeEvent event) {
if (event.diff.getNewValue() == null)
b.updateModelToTarget();
}
});
}
}
public void bindControls(EditingDomain editingDomain,
DataBindingContext dbc, IObservableValue master) {
this.dbc = dbc;
this.master = master;
this.editingDomain = editingDomain;
IJFXBeanValueProperty tProp = JFXBeanProperties.value("text");
IJFXBeanValueProperty sProp = JFXBeanProperties.value("selectedItem");
{
IEMFValueProperty mProp = EMFEditProperties
.value(editingDomain,AddressbookPackage.Literals.ADDRESS__STREET);
dbc.bindValue(tProp.observe(w_street), mProp.observeDetail(master), createEmptyStringToNull(), createNullToEmptyString());
}
{
IEMFValueProperty mProp = EMFEditProperties
.value(editingDomain,AddressbookPackage.Literals.ADDRESS__ZIP);
dbc.bindValue(tProp.observe(w_zip), mProp.observeDetail(master), createEmptyStringToNull(), createNullToEmptyString());
}
{
IEMFValueProperty mProp = EMFEditProperties
.value(editingDomain,AddressbookPackage.Literals.ADDRESS__CITY);
dbc.bindValue(tProp.observe(w_city), mProp.observeDetail(master), createEmptyStringToNull(), createNullToEmptyString());
}
{
IEMFValueProperty mProp = EMFEditProperties.value(editingDomain,FeaturePath
.fromList(AddressbookPackage.Literals.ADDRESS__COUNTRY));
dbc.bindValue(sProp.observe(w_country), mProp.observeDetail(master));
}
bindState(dbc, master);
IJFXBeanValueProperty eProp = JFXBeanProperties.value("disable");
for (Node c : getChildren()) {
EMFUpdateValueStrategy modelToTarget = new EMFUpdateValueStrategy();
modelToTarget.setConverter(new Converter(Address.class,
boolean.class) {
@Override
public Object convert(Object fromObject) {
return fromObject == null;
}
});
// Work around - No Idea
final Binding b = dbc
.bindValue(eProp.observe(c), master,
new EMFUpdateValueStrategy(
UpdateValueStrategy.POLICY_NEVER),
modelToTarget);
master.addValueChangeListener(new IValueChangeListener() {
@Override
public void handleValueChange(ValueChangeEvent event) {
if (event.diff.getNewValue() == null)
b.updateModelToTarget();
}
});
}
}
private void bindState(DataBindingContext dbc, IObservableValue master) {
IJFXBeanValueProperty sProp = JFXBeanProperties.value("selectedItem");
IEMFValueProperty prop;
if (editingDomain == null) {
prop = EMFProperties
.value(AddressbookPackage.Literals.ADDRESS__FEDERAL_STATE);
} else {
prop = EMFEditProperties.value(editingDomain,
AddressbookPackage.Literals.ADDRESS__FEDERAL_STATE);
}
stateBinding = dbc.bindValue(sProp.observe(w_federalState),
prop.observeDetail(master));
}
}