package org.eclipseday.javafx.rcpdemo.view;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import javafx.beans.property.DoubleProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.embed.swt.FXCanvas;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Orientation;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.LabelBuilder;
import javafx.scene.control.Slider;
import javafx.scene.control.SliderBuilder;
import javafx.scene.effect.ColorAdjust;
import javafx.scene.effect.ColorAdjustBuilder;
import javafx.scene.effect.Effect;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.image.ImageViewBuilder;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.FlowPaneBuilder;
import javafx.scene.layout.HBox;
import javafx.scene.layout.HBoxBuilder;
import javafx.scene.paint.Color;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.part.ViewPart;
public class EffectView extends ViewPart {
public static final String ID = "org.eclipseday.javafx.rcpdemo.view.EffectView";
private static final String CUSTOM_CAR = "Custom_Car.jpg";
private FXCanvas canvas;
private BorderPane rootNode;
private static final NumberFormat DECIMAL = new DecimalFormat("0.0");
/**
* This is a callback that will allow us to create the viewer and initialize it.
*/
@Override
public void createPartControl(final Composite parent) {
this.canvas = new FXCanvas(parent, SWT.NONE);
this.rootNode = new BorderPane();
final Scene scene = new Scene(this.rootNode, 800, 600, Color.WHITE);
this.canvas.setScene(scene);
final ColorAdjust fx = ColorAdjustBuilder.create()
.hue(0.5)
.saturation(0.4)
.brightness(0.5)
.contrast(0.5)
.build();
displayImage(CUSTOM_CAR, fx);
displaySliders(
buildSlider("Hue", fx.hueProperty(), -1.0, 1.0),
buildSlider("Saturation", fx.saturationProperty(), -1.0, 1.0),
buildSlider("Brightness", fx.brightnessProperty(), -1.0, 1.0),
buildSlider("Contrast", fx.contrastProperty(), -1.0, 1.0)
);
BorderPane.setAlignment(this.rootNode.getCenter(), Pos.CENTER);
}
/**
* TODO To complete.
*
* @param buildSlider
*/
private void displaySliders(final Node... node) {
this.rootNode.setRight(FlowPaneBuilder.create().orientation(Orientation.VERTICAL).alignment(Pos.CENTER).children(node).build());
BorderPane.setMargin(this.rootNode.getRight(), new Insets(10));
BorderPane.setAlignment(this.rootNode.getRight(), Pos.CENTER);
this.rootNode.getRight().setStyle("-fx-border-color:#000000;-fx-border-width:2px;");
}
/**
* TODO To complete.
*
* @param string
* @param fx
*/
private void displayImage(final String image, final Effect fx) {
final ImageView iv = ImageViewBuilder.create()
.effect(fx)
.image(new Image(this.getClass().getResourceAsStream(image)))
.build();
BorderPane.setMargin(iv, new Insets(10));
this.rootNode.setCenter(iv);
}
/**
* TODO To complete.
*
* @param string
* @param levelProperty
* @param i
* @param d
*/
private HBox buildSlider(final String name, final DoubleProperty property, final double min, final double max) {
final Slider slider = SliderBuilder.create()
.min(min)
.max(max)
.maxWidth(80)
.value(property.doubleValue())
.blockIncrement(0.1)
.build();
slider.addEventFilter(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
@Override
public void handle(final MouseEvent event) {
event.consume();
}
});
final Label valueLabel = LabelBuilder.create().text(name).build();
slider.adjustValue(property.doubleValue());
property.bind(slider.valueProperty());
slider.valueProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(final ObservableValue<? extends Number> observable, final Number oldValue, final Number newValue) {
valueLabel.setText(DECIMAL.format(newValue));
}
});
return HBoxBuilder.create()
.children(
LabelBuilder.create().text(name).build(),
slider,
valueLabel
)
.build();
}
/**
* Passing the focus request to the viewer's control.
*/
@Override
public void setFocus() {
this.canvas.setFocus();
}
}