package com.klq.gui; import com.klq.controller.Controller; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.event.EventHandler; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.ProgressBar; import javafx.scene.control.ScrollPane; import javafx.scene.input.MouseEvent; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.scene.paint.Paint; import java.io.File; import java.util.ArrayList; import java.util.List; /** * Created by Timon on 27.02.2015. */ public class Questionnaire extends AnchorPane { private final List<QuestionPage> questionPages; private final Controller controller; private final ScrollPane currentPagePane; private final Button nextButton; private final Button backButton; private int currentPageIndex = 0; private final StringProperty statusProperty; private final Label statusLabel; public Questionnaire(Controller controller) { super(); this.controller = controller; this.questionPages = new ArrayList<>(); this.backButton = createBackButton(); this.nextButton = createNextButton(); this.currentPagePane = new ScrollPane(); this.statusProperty = new SimpleStringProperty(); this.statusLabel = new Label(); init(); } private void init(){ this.currentPagePane.setFitToWidth(true); this.setPadding(new Insets(5)); ProgressBar progressBar = createProgressBar(); HBox hbox = new HBox(); hbox.setAlignment(Pos.BOTTOM_RIGHT); hbox.setSpacing(5); hbox.getChildren().add(statusLabel); hbox.getChildren().add(backButton); hbox.getChildren().add(nextButton); VBox bottom = new VBox(5); bottom.getChildren().add(progressBar); bottom.getChildren().add(hbox); this.getChildren().add(bottom); setLeftAnchor(bottom, 2d); setBottomAnchor(bottom, 2d); setRightAnchor(bottom, 2d); setTopAnchor(currentPagePane, 5d); setLeftAnchor(currentPagePane, 5d); setRightAnchor(currentPagePane, 5d); setBottomAnchor(currentPagePane, 60d); statusLabel.setTextFill(Paint.valueOf("red")); statusLabel.textProperty().bind(statusProperty); } public void addQuestionPage(QuestionPage page){ this.controller.updateQuestionVisibilities(); this.questionPages.add(page); if (this.currentPagePane.getContent() == null) { this.currentPagePane.setContent(page); this.getChildren().add(0, currentPagePane); } else nextButton.setText("Next"); } private ProgressBar createProgressBar(){ ProgressBar progressBar = new ProgressBar(0); progressBar.progressProperty().bind(controller.progressProperty()); progressBar.prefWidthProperty().bind(this.widthProperty()); progressBar.progressProperty().addListener(new ChangeListener<Number>() { @Override public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) { if (newValue.equals(1.0)) progressBar.setStyle("-fx-accent: #06ff40;"); else progressBar.setStyle("-fx-accent: #0b9add;"); } }); return progressBar; } private Button createBackButton(){ Button btn = new Button("Back"); btn.setDisable(true); btn.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent event) { if (currentPageIndex > 0) { showPreviousQuestionPage(); if (currentPageIndex == 0) btn.setDisable(true); } } }); return btn; } private Button createNextButton(){ Button btn = new Button("Finish"); btn.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent event) { if (currentPageIndex < questionPages.size()-1) { showNextQuestionPage(); if (currentPageIndex == questionPages.size()-1) nextButton.setText("Finish"); if (currentPageIndex == 0) backButton.setDisable(false); return; } if (controller.progressProperty().get() < 1) { statusProperty.set("You need to complete all questions!"); return; } exportResults(); } }); return btn; } private void showPreviousQuestionPage(){ this.currentPagePane.setContent(questionPages.get(--currentPageIndex)); } private void showNextQuestionPage(){ this.currentPagePane.setContent(questionPages.get(++currentPageIndex)); } private void exportResults(){ if (controller.exportResults(System.getProperty("user.dir") + File.separator + "out")) System.exit(0); else { statusProperty.set("Could not export file to user.dir!"); } } }