package application;
import javafx.animation.Interpolator;
import javafx.animation.RotateTransition;
import javafx.animation.TranslateTransition;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.scene.shape.Line;
import javafx.util.Duration;
import java.util.ArrayList;
/**
* Created by tareq on 7/13/15.
*/
public class ActionBar extends Pane {
private MaterialText materialText;
private RotateTransition rotateTransition;
DrawerLayout drawerLayout;
private int currentPosition = 0;
boolean animationFinished = true;
public boolean isDrawerOpen() {
return drawerOpen;
}
public void setDrawerOpen(boolean drawerOpen) {
this.drawerOpen = drawerOpen;
}
private boolean drawerOpen = false;
private boolean isAnimationFinished = true;
private Pane pane;
private HBox hBox;
private Line line;
ArrayList<Pane> contentArrayList = new ArrayList<>();
Pane firstContent;
public void setAnimationProgress(double val) {
pane.setRotate(val * 90);
}
public ActionBar(String title) {
super();
DoubleProperty heightProperty = new SimpleDoubleProperty();
hBox = new HBox();
line = new Line();
line.setStroke(Color.WHITE);
line.setStrokeWidth(3);
rotateTransition = new RotateTransition();
materialText = new MaterialText("", 17);
sceneProperty().addListener((observable, oldValue, newValue) -> {
if (newValue != null) {
if (!getScene().getStylesheets().contains(getClass().getResource("application.css").toExternalForm())) {
getScene().getStylesheets().add(getClass().getResource("application.css").toExternalForm());
}
newValue.widthProperty().addListener((ob, o, n) -> {
setPrefSize(n.doubleValue(), 100);
hBox.setPrefWidth(n.doubleValue());
});
heightProperty.bind(newValue.heightProperty());
hBox.setLayoutY(50);
}
});
line.setTranslateY(97);
hBox.setFillHeight(true);
hBox.setAlignment(Pos.CENTER);
getStyleClass().add("material-toolbar");
setTitle(title);
getChildren().addAll(hBox, line);
}
private void addContent(Pane content) {
if (contentArrayList.size() != 0) {
content.translateXProperty().bind(contentArrayList.get(contentArrayList.size() - 1).translateXProperty().add(firstContent.widthProperty()));
} else {
firstContent = content;
}
contentArrayList.add(content);
content.setTranslateY(100);
content.prefWidthProperty().bind(prefWidthProperty());
content.setPrefHeight(100);
}
public ArrayList<Pane> getContent() {
return contentArrayList;
}
public void setPagePosition(int position) {
if (animationFinished && (position - currentPosition) != 0) {
animationFinished = false;
TranslateTransition transition = new TranslateTransition();
transition.setByX(((TabTitle) (hBox.getChildren().get(0))).getWidth() * (position - currentPosition));
transition.setDuration(Duration.millis(150 * Math.abs(position - currentPosition)));
transition.setInterpolator(Interpolator.LINEAR);
transition.setNode(line);
transition.setOnFinished(e -> {
currentPosition = position;
animationFinished = true;
});
transition.play();
}
}
public void addTab(TabTitle tabTitle, Pane content) {
addContent(content);
tabTitle.setPrefSize(70, 48);
hBox.getChildren().add(tabTitle);
tabTitle.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
int tabPosition = hBox.getChildren().size() - 1;
@Override
public void handle(MouseEvent event) {
setPagePosition(tabPosition);
}
}
);
for (int i = 0; i < hBox.getChildren().size(); i++) {
TabTitle tab = (TabTitle) hBox.getChildren().get(i);
if (i == 2) {
tab.widthProperty().addListener(e -> {
line.setStartX(5);
line.setEndX(tab.getWidth() - 5);
});
firstContent.translateXProperty().bind(line.translateXProperty().multiply(-contentArrayList.size()));
}
tab.prefWidthProperty().bind(hBox.prefWidthProperty().divide(hBox.getChildren().size()));
}
}
public void setTitle(String title) {
materialText.setText(title);
materialText.setFill(Color.WHITE);
materialText.setLayoutX(50);
materialText.setLayoutY(30);
ImageView imageMenu = new ImageView(new Image(getClass().getResourceAsStream("assets/menu.png")));
ImageView imagePrevious = new ImageView(new Image(getClass().getResourceAsStream("assets/previous.png")));
imagePrevious.setScaleX(0.6);
imagePrevious.setScaleY(0.6);
imageMenu.setScaleX(0.6);
imageMenu.setScaleY(0.6);
imagePrevious.setRotate(+90);
imageMenu.setOpacity(1);
imagePrevious.setOpacity(0);
pane = new Pane(imagePrevious, imageMenu);
TabTitle item = new TabTitle(pane);
getChildren().addAll(materialText, item);
rotateTransition.setCycleCount(1);
rotateTransition.setDuration(Duration.millis(500));
pane.rotateProperty().addListener((observable, oldValue, newValue) -> {
imageMenu.setOpacity(1.0 + newValue.doubleValue() / 90.0);
imagePrevious.setOpacity(-newValue.doubleValue() / 90.0);
});
item.addEventHandler(MouseEvent.MOUSE_CLICKED, e -> {
if (e.getButton() == MouseButton.PRIMARY) {
if (isAnimationFinished) {
if (!drawerOpen) {
rotateTransition.setNode(pane);
rotateTransition.setByAngle(-90);
isAnimationFinished = false;
rotateTransition.setOnFinished(ev -> {
isAnimationFinished = true;
drawerLayout.setDrawerOpen(true);
drawerOpen = true;
});
drawerLayout.startOpenAnimation(false);
} else {
rotateTransition.setByAngle(90);
isAnimationFinished = false;
rotateTransition.setOnFinished(ev -> {
isAnimationFinished = true;
drawerOpen = false;
drawerLayout.setDrawerOpen(false);
});
drawerLayout.startOpenAnimation(true);
}
rotateTransition.play();
}
}
});
}
}