import javafx.animation.Animation;
import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Orientation;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.Separator;
import javafx.scene.control.ToggleButton;
import javafx.scene.control.ToggleGroup;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
import javafx.util.Duration;

public class TimelineTest2 extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        Circle circle = new Circle(5, Color.BLUE);
        var timeline = new Timeline(
            new KeyFrame(Duration.seconds(0),
                new KeyValue(circle.translateXProperty(), 0.0),
                new KeyValue(circle.translateYProperty(), 0.0)),
            new KeyFrame(Duration.seconds(2),
                new KeyValue(circle.translateXProperty(), 30.0),
                new KeyValue(circle.translateYProperty(), 30.0)));

        VBox animPane = setup(timeline, circle);
        animPane.getChildren().add(0, new Label("Timeline"));

        HBox root = new HBox(10, animPane);
        root.setPadding(new Insets(10));
        stage.setScene(new Scene(root));
        stage.show();
    }

    private VBox setup(Animation translate, Node node) {
        Button play = new Button("Play");
        play.setOnAction(e -> translate.play());

        Button pause = new Button("Pause");
        pause.setOnAction(e -> translate.pause());

        Button stop = new Button("Stop");
        stop.setOnAction(e -> translate.stop());

        Button jumpToStart = new Button("Jump to start");
        jumpToStart.setOnAction(e -> translate.jumpTo("start"));

        Button jumpToEnd = new Button("Jump to end");
        jumpToEnd.setOnAction(e -> translate.jumpTo("end"));

        ToggleGroup rateGroup = new ToggleGroup();

        ToggleButton rateP1 = new ToggleButton("rate=1");
        rateP1.setOnAction(e -> translate.setRate(1));
        rateP1.setToggleGroup(rateGroup);
        rateP1.setSelected(true);

        ToggleButton rateM1 = new ToggleButton("rate=-1");
        rateM1.setOnAction(e -> translate.setRate(-1));
        rateM1.setToggleGroup(rateGroup);

        ToggleButton autoReverse = new ToggleButton("AutoReverse");
        autoReverse.setOnAction(e -> translate.setAutoReverse(autoReverse.isSelected()));

        ToggleGroup cycleGroup = new ToggleGroup();

        ToggleButton cycleOne = new ToggleButton("cycle=1");
        cycleOne.setOnAction(e -> translate.setCycleCount(1));
        cycleOne.setToggleGroup(cycleGroup);
        cycleOne.setSelected(true);

        ToggleButton cycleTwo = new ToggleButton("cycle=2");
        cycleTwo.setOnAction(e -> translate.setCycleCount(2));
        cycleTwo.setToggleGroup(cycleGroup);

        ToggleButton cycleIndef = new ToggleButton("cycle=Indefinite");
        cycleIndef.setOnAction(e -> translate.setCycleCount(Timeline.INDEFINITE));
        cycleIndef.setToggleGroup(cycleGroup);

        Pane pane = new Pane(node);
        pane.setPrefSize(400, 300);

        Label curTime = new Label();
        curTime.textProperty().bind(translate.currentTimeProperty().asString());

        Label curRate = new Label();
        curRate.textProperty().bind(translate.rateProperty().asString());

        Label curCycle = new Label();
        curCycle.textProperty().bind(translate.cycleCountProperty().asString());

        Label curAutoReverse = new Label();
        curAutoReverse.textProperty().bind(translate.autoReverseProperty().asString());

        VBox controls = new VBox(5, 
                new HBox(5, play, pause, stop, curTime),
                new HBox(5, jumpToStart, jumpToEnd),
                new HBox(5, rateP1, rateM1, curRate),
                new HBox(5, autoReverse, curAutoReverse),
                new HBox(5, cycleOne, cycleTwo, cycleIndef, curCycle));
        VBox root = new VBox(10, pane, controls);
        return root;
    }

    public static void main(String[] args) {
        launch(args);
    }
}
