package org.eclipse.ufacekit.ui.jfx.databinding;
import java.text.MessageFormat;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.Label;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.util.Callback;
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.core.databinding.property.value.IValueProperty;
import org.eclipse.ufacekit.ui.jfx.databinding.controls.ChoiceBoxViewer;
import org.eclipse.ufacekit.ui.jfx.databinding.controls.ChoiceBoxViewer.LabelConverter;
public class UIFactory {
public static <T> ChoiceBoxViewer<T> createChoiceBox(final String template, final IValueProperty... properties) {
ChoiceBoxViewer<T> viewer = new ChoiceBoxViewer<T>();
viewer.setLabelConverter(new LabelConverter<T>() {
@Override
public String getLabel(T object) {
Object[] data = new Object[properties.length];
int i = 0;
for( IValueProperty p : properties ) {
data[i] = p.getValue(object);
}
return MessageFormat.format(template, data);
}
});
return viewer;
}
public static <T> ListView<T> createListView(final IValueProperty[] properties, final String template) {
ListView<T> listView = new ListView<T>();
listView.setCellFactory(new Callback<ListView<T>, ListCell<T>>() {
@Override
public ListCell<T> call(ListView<T> arg0) {
ListCell<T> cell = new ListCell<T>();
final Label l = new Label();
cell.setNode(l);
final IObservableValue v = JFXBeanProperties.value("item").observe(cell);
IValueChangeListener listener = new IValueChangeListener() {
@Override
public void handleValueChange(ValueChangeEvent event) {
Object[] values = new Object[properties.length];
for( int i = 0; i < properties.length; i++ ) {
@SuppressWarnings("unchecked")
T o = (T) v.getValue();
if( o == null ) {
l.setText("");
return;
}
values[i] = properties[i].getValue(o);
}
l.setText(MessageFormat.format(template, values));
}
};
for( IValueProperty p : properties ) {
p.observeDetail(v).addValueChangeListener(listener);
}
return cell;
}
});
return listView;
}
}