package at.bestsolution.efxclipse.runtime.example.photoedit.ui.control;
import javafx.animation.FadeTransition;
import javafx.animation.ParallelTransition;
import javafx.animation.ScaleTransition;
import javafx.beans.property.ReadOnlyObjectProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Orientation;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.control.ContentDisplay;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.control.ToolBar;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.BorderPane;
import javafx.util.Callback;
import javafx.util.Duration;
public class ImageStackPane extends BorderPane {
private ObservableList<ImageStackItem> items = FXCollections.observableArrayList();
private ToolBar headerBar;
private ListView<ImageStackItem> stackItemsBar;
private BorderPane contentArea;
static class StackItemCell extends ListCell<ImageStackItem> {
@Override
protected void updateItem(ImageStackItem item, boolean empty) {
super.updateItem(item, empty);
if( item != null ) {
Image img = item.getDescriptor().getImage();
setContentDisplay(ContentDisplay.TOP);
setAlignment(Pos.CENTER);
setGraphic(new ImageView(img));
}
}
}
public ImageStackPane() {
headerBar = new ToolBar();
Button b = new Button("Show Item Selector");
b.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
if( ! stackItemsBar.isVisible() ) {
FadeTransition t = new FadeTransition(new Duration(500), stackItemsBar);
t.setFromValue(0);
t.setToValue(0.8);
t.play();
stackItemsBar.setVisible(true);
} else {
FadeTransition t = new FadeTransition(new Duration(500), stackItemsBar);
t.setFromValue(0.8);
t.setToValue(0);
t.setOnFinished(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
stackItemsBar.setVisible(false);
}
});
t.play();
}
}
});
headerBar.getItems().add(b);
setTop(headerBar);
AnchorPane contentPane = new AnchorPane();
contentArea = new BorderPane();
AnchorPane.setLeftAnchor(contentArea, 0.0);
AnchorPane.setRightAnchor(contentArea, 0.0);
AnchorPane.setTopAnchor(contentArea, 0.0);
AnchorPane.setBottomAnchor(contentArea, 0.0);
contentPane.getChildren().add(contentArea);
stackItemsBar = new ListView<ImageStackItem>();
stackItemsBar.setCellFactory(new Callback<ListView<ImageStackItem>, ListCell<ImageStackItem>>() {
@Override
public ListCell<ImageStackItem> call(ListView<ImageStackItem> param) {
return new StackItemCell();
}
});
stackItemsBar.setOrientation(Orientation.HORIZONTAL);
stackItemsBar.setPrefHeight(50);
stackItemsBar.setItems(items);
AnchorPane.setLeftAnchor(stackItemsBar, 0.0);
AnchorPane.setRightAnchor(stackItemsBar, 0.0);
AnchorPane.setTopAnchor(stackItemsBar, 0.0);
stackItemsBar.setVisible(false);
contentPane.getChildren().add(stackItemsBar);
setCenter(contentPane);
selectedItemProperty().addListener(new ChangeListener<ImageStackItem>() {
@Override
public void changed(ObservableValue<? extends ImageStackItem> observable, ImageStackItem oldValue, ImageStackItem newValue) {
changeContentControl(newValue != null ? newValue.getLayoutContent() : null);
}
});
}
private void changeContentControl(final Node node) {
if( node != null ) {
node.setScaleX(0);
node.setScaleY(0);
final ScaleTransition showTransition = new ScaleTransition(new Duration(1000), node);
showTransition.setFromX(0.0);
showTransition.setFromY(0.0);
showTransition.setToX(1.0);
showTransition.setToY(1.0);
if( contentArea.getCenter() != null ) {
ScaleTransition scale = new ScaleTransition(new Duration(1000));
scale.setFromX(1.0);
scale.setFromY(1.0);
scale.setToX(10.0);
scale.setToY(10.0);
FadeTransition fade = new FadeTransition(new Duration(1000));
fade.setFromValue(1.0);
fade.setToValue(0.0);
ParallelTransition transition = new ParallelTransition(contentArea.getCenter(),scale,fade);
transition.setOnFinished(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
node.setOpacity(1.0);
showTransition.play();
contentArea.setCenter(node);
}
});
transition.play();
} else {
contentArea.setCenter(node);
showTransition.play();
}
} else {
contentArea.setCenter(null);
}
}
public ObservableList<ImageStackItem> getItems() {
return items;
}
public void setSelection(ImageStackItem item) {
stackItemsBar.getSelectionModel().select(item);
}
public ReadOnlyObjectProperty<ImageStackItem> selectedItemProperty() {
return stackItemsBar.getSelectionModel().selectedItemProperty();
}
}