package ru.khasang.cachoeira.viewcontroller;
import javafx.beans.binding.Bindings;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.event.ActionEvent;
import javafx.scene.control.*;
import javafx.stage.DirectoryChooser;
import ru.khasang.cachoeira.data.DataService;
import ru.khasang.cachoeira.model.IProject;
import ru.khasang.cachoeira.model.Project;
import ru.khasang.cachoeira.view.IView;
import ru.khasang.cachoeira.view.createnewprojectwindow.CreateNewProjectWindowView;
import ru.khasang.cachoeira.view.createnewprojectwindow.panes.ButtonsBox;
import ru.khasang.cachoeira.view.createnewprojectwindow.panes.FieldsPane;
import ru.khasang.cachoeira.view.createnewprojectwindow.panes.IButtonsBox;
import ru.khasang.cachoeira.view.createnewprojectwindow.panes.IFieldsPane;
import java.io.File;
import java.time.LocalDate;
public class CreateNewProjectWindowController {
private static final File DEFAULT_PATH = new File(System.getProperty("user.home") + "/Documents/Cachoeira");
private final IView view;
private final IView parentView;
private IFieldsPane fieldsPane;
private IButtonsBox buttonsBox;
private StringProperty absolutePath = new SimpleStringProperty(this, "absolutePath", DEFAULT_PATH.getAbsolutePath());
public CreateNewProjectWindowController(IView parentView) {
this.parentView = parentView;
fieldsPane = new FieldsPane();
buttonsBox = new ButtonsBox();
view = new CreateNewProjectWindowView(this, fieldsPane, buttonsBox);
}
public void launch() {
view.createView();
this.initFields();
this.attachButtonsEvents();
}
private void initFields() {
buttonsBox.getCreateNewProjectButton().disableProperty().bind(
fieldsPane.getProjectNameField().textProperty().isEmpty()
.or(fieldsPane.getProjectPathField().textProperty().isEmpty())); //рубим нажимательность кнопки, если поле с именем пустует
// Фильтруем все кроме букв, цифр и пробела (в том числе и из буфера обмена)
fieldsPane.getProjectNameField().setTextFormatter(new TextFormatter<>(change -> {
if (change.getText().matches("^[^A-Za-z0-9\\s]+$")) {
return null;
}
return change;
}));
fieldsPane.getProjectNameField().setText("New Project"); //дефолтовое название проекта
fieldsPane.getProjectPathField().textProperty().bind(
Bindings.concat(absolutePath).concat(File.separator).concat(fieldsPane.getProjectNameField().textProperty()).concat(".cach"));
// Отрубаем возможность ввода дат с клавиатуры воизбежание пустого поля
fieldsPane.getStartDatePicker().setEditable(false);
fieldsPane.getFinishDatePicker().setEditable(false);
fieldsPane.getStartDatePicker().setValue(LocalDate.now()); //по дефолту сегодняшняя дата
fieldsPane.getFinishDatePicker().setValue(fieldsPane.getStartDatePicker().getValue().plusDays(28));
// Конечная дата всегда после начальной
fieldsPane.getStartDatePicker().valueProperty().addListener(((observable, oldValue, newValue) -> {
if (newValue.isEqual(fieldsPane.getFinishDatePicker().getValue()) || newValue.isAfter(fieldsPane.getFinishDatePicker().getValue())) {
fieldsPane.getFinishDatePicker().setValue(newValue.plusDays(1));
}
}));
fieldsPane.getFinishDatePicker().setDayCellFactory(this::makeFinishDatePickerCellsDisabledBeforeStartDate);
}
private DateCell makeFinishDatePickerCellsDisabledBeforeStartDate(DatePicker datePicker) {
return new DateCell() {
@Override
public void updateItem(LocalDate finishDate, boolean empty) {
super.updateItem(finishDate, empty);
if (finishDate.isBefore(fieldsPane.getStartDatePicker().getValue().plusDays(1))) {
setDisable(true);
}
}
};
}
private void attachButtonsEvents() {
fieldsPane.getPathChooserButton().setOnAction(this::pathChooserHandler);
buttonsBox.getCreateNewProjectButton().setOnAction(this::createProjectHandler);
buttonsBox.getCancelButton().setOnAction(this::cancelHandler);
}
private void pathChooserHandler(ActionEvent event) {
DirectoryChooser directoryChooser = new DirectoryChooser();
directoryChooser.setInitialDirectory(DEFAULT_PATH);
File file = directoryChooser.showDialog(view.getStage());
if (file != null) {
absolutePath.setValue(file.getAbsolutePath());
}
}
private void createProjectHandler(ActionEvent event) {
File file = new File(fieldsPane.getProjectPathField().getText());
if (!file.exists()) {
createProjectAndLaunchMainWindow(file);
} else {
ButtonType yesButton = new ButtonType("yes");
ButtonType noButton = new ButtonType("no", ButtonBar.ButtonData.CANCEL_CLOSE);
Alert alert = new Alert(Alert.AlertType.CONFIRMATION, "Заменить его?", yesButton, noButton);
alert.setTitle("Cachoeira");
alert.setHeaderText("Проект с таким именем уже существует!");
alert.showAndWait()
.filter(response -> response == yesButton)
.ifPresent(response -> createProjectAndLaunchMainWindow(file));
}
}
private void cancelHandler(ActionEvent event) {
view.getStage().close();
}
private void createProjectAndLaunchMainWindow(File file) {
// Создаем проект
IProject project = new Project(
fieldsPane.getProjectNameField().getText(),
fieldsPane.getStartDatePicker().getValue(),
fieldsPane.getFinishDatePicker().getValue(),
fieldsPane.getDescriptionTextArea().getText());
// // TODO: 07.05.2016 doesn't work
//// if (view.getStage().isShowing()) {
//// view.getStage().close(); //закрываем стартовое окно
//// }
// Закрываем это окошко
view.getStage().close();
DataService.getInstance().createProject(project, file);
}
public IView getParentView() {
return parentView;
}
}