blob: 59425b483aded12e68a62e38445c6a31c05a29c3 [file] [log] [blame]
package org.eclipse.fx.ide.gradient.app.impl;
import javafx.beans.property.Property;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.control.Button;
import javafx.scene.control.ColorPicker;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.util.Callback;
import javafx.util.converter.DoubleStringConverter;
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.WritableValue;
import org.eclipse.emf.databinding.EMFDataBindingContext;
import org.eclipse.emf.databinding.EMFProperties;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.fx.core.databinding.AdapterFactory;
import org.eclipse.fx.core.databinding.ObservableWritableValue;
import org.eclipse.fx.emf.databinding.edit.EMFEditFXProperties;
import org.eclipse.fx.ide.gradient.app.StopEditor;
import org.eclipse.fx.ide.gradient.app.util.GradientConverter;
import org.eclipse.fx.ide.gradient.model.gradient.FxColor;
import org.eclipse.fx.ide.gradient.model.gradient.FxStop;
import org.eclipse.fx.ide.gradient.model.gradient.GradientFactory;
import org.eclipse.fx.ide.gradient.model.gradient.GradientPackage;
import org.eclipse.fx.ide.gradient.model.gradient.RgbFxColor;
public class DefaultStopEditor extends GridPane implements StopEditor {
private final IObservableValue selectedStop = new WritableValue();
private ListView<FxStop> stops;
private Button bAdd;
private Button bUp;
private Button bDown;
private Button bRemove;
private ColorPicker colorPicker;
private TextField offset;
public DefaultStopEditor() {
setHgap(10);
setVgap(10);
setPadding(new Insets(0, 10, 0, 10));
initUI();
}
private void initUI() {
stops = new ListView<>();
add(stops, 0, 0, 1, 5);
stops.setCellFactory(new Callback<ListView<FxStop>, ListCell<FxStop>>() {
@Override
public ListCell<FxStop> call(ListView<FxStop> list) {
return new ColorRectCell();
}
});
bAdd = new Button();
bAdd.setText("Add");
bAdd.setMinWidth(0.3);
add(bAdd, 1, 0);
bUp = new Button();
bUp.setText("Up");
add(bUp, 1, 1);
bDown = new Button();
bDown.setText("Down");
add(bDown, 1, 2);
bRemove = new Button();
bRemove.setText("Remove");
add(bRemove, 1, 3);
colorPicker = new ColorPicker();
add(colorPicker, 2, 0);
offset = new TextField();
add(offset, 2, 1);
}
@Override
public Pane getControl() {
return this;
}
@Override
public void bind(EditingDomain editingDomain, ObservableList<FxStop> data) {
stops.setItems(data);
if (!data.isEmpty()) {
selectedStop.setValue(data.get(0));
// colorVal.setValue(GradientConverter.convertColor(data.get(0).getColor()));
}
stops.getSelectionModel().selectedItemProperty()
.addListener(new ChangeListener<FxStop>() {
@Override
public void changed(
ObservableValue<? extends FxStop> observable,
FxStop oldValue, FxStop newValue) {
if (oldValue!= null)
System.err.println("old " + oldValue.getOffset());
if (newValue!= null)
System.err.println("new " + newValue.getOffset());
selectedStop.setValue(newValue);
}
});
bAdd.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent t) {
FxStop newStop = GradientFactory.eINSTANCE.createFxStop();
newStop.setOffset(1.33);
RgbFxColor c = GradientFactory.eINSTANCE.createRgbFxColor();
c.setBlue(1);
c.setGreen(0);
c.setOpacity(1);
c.setRed(0);
newStop.setColor(c);
data.add(newStop);
stops.getSelectionModel().select(newStop);
}
});
bRemove.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent t) {
FxStop toDel = stops.getSelectionModel().getSelectedItem();
if (toDel != null) {
if (toDel == data.get(0)) {
stops.getSelectionModel().selectNext();
} else {
stops.getSelectionModel().selectPrevious();
}
data.remove(toDel);
}
}
});
bUp.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent t) {
FxStop sel = stops.getSelectionModel().getSelectedItem();
data.toString();
}
});
bDown.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent t) {
FxStop sel = stops.getSelectionModel().getSelectedItem();
data.toString();
}
});
bindOffset(editingDomain);
bindColorPicker();
}
private void bindColorPicker() {
IObservableValue colorVal = new WritableValue();
IObservableValue fxcolorVal = EMFProperties.value(
GradientPackage.Literals.FX_STOP__COLOR).observeDetail(
selectedStop);
UpdateValueStrategy t2m = new UpdateValueStrategy();
t2m.setConverter(new Converter(Color.class, FxColor.class) {
@Override
public Object convert(Object fromObject) {
System.err.println("convert t 2 m "
+ GradientConverter.convertRgbColor((Color) fromObject));
return GradientConverter.convertRgbColor((Color) fromObject);
}
});
UpdateValueStrategy m2t = new UpdateValueStrategy();
m2t.setConverter(new Converter(FxColor.class, Color.class) {
@Override
public Object convert(Object fromObject) {
System.err.println("convert m 2 t "
+ GradientConverter.convertColor((FxColor) fromObject));
return GradientConverter.convertColor((FxColor) fromObject);
}
});
new EMFDataBindingContext().bindValue(colorVal, fxcolorVal, t2m, m2t);
Property<Color> colorProperty = new SimpleObjectProperty<Color>();
ObservableWritableValue<Color> adapted = AdapterFactory.<Color> adapt(colorVal);
colorProperty.bind(adapted);
adapted.addListener(new ChangeListener<Color>() {
@Override
public void changed(ObservableValue<? extends Color> observable,
Color oldValue, Color newValue) {
System.err.println("old color: " + oldValue);
System.err.println("new color: " + newValue);
}
});
colorProperty.addListener(new ChangeListener<Color>() {
@Override
public void changed(ObservableValue<? extends Color> observable,
Color oldValue, Color newValue) {
System.err.println("colorProperty old color: " + oldValue);
System.err.println("colorProperty new color: " + newValue);
}
});
colorPicker.valueProperty().bindBidirectional(colorProperty);
colorPicker.valueProperty().addListener(new ChangeListener<Color>() {
@Override
public void changed(ObservableValue<? extends Color> observable,
Color oldValue, Color newValue) {
System.err.println("colorPicker old color: " + oldValue);
System.err.println("colorPicker new color: " + newValue);
// FIXME binding does not work here
colorProperty.setValue(newValue);
}
});
// colorPicker.setOnAction(new EventHandler<ActionEvent>() {
// @Override
// public void handle(ActionEvent t) {
// stops.getCellFactory().call(stops).updateListView(stops);
// }
// });
}
private void bindOffset(EditingDomain editingDomain) {
Property<Double> offsetProperty = EMFEditFXProperties.value(
editingDomain, (EObject) selectedStop.getValue(),
GradientPackage.Literals.FX_STOP__OFFSET);
offset.textProperty().bindBidirectional(offsetProperty,
new DoubleStringConverter());
}
static class ColorRectCell extends ListCell<FxStop> {
@Override
public void updateItem(FxStop item, boolean empty) {
super.updateItem(item, empty);
Rectangle rect = new Rectangle(20, 20);
if (item != null) {
rect.setFill(GradientConverter.convertColor(item.getColor()));
setGraphic(rect);
setText(item.getOffset() + ""); //$NON-NLS-1$
} else {
setGraphic(null);
setText(null); //$NON-NLS-1$
}
}
}
}