package ru.khasang.cachoeira.viewcontroller.mainwindowcontrollers;
import javafx.event.ActionEvent;
import javafx.scene.control.Alert;
import javafx.scene.control.ButtonBar;
import javafx.scene.control.ButtonType;
import javafx.stage.FileChooser;
import javafx.stage.WindowEvent;
import ru.khasang.cachoeira.data.DBSchemeManager;
import ru.khasang.cachoeira.data.DataService;
import ru.khasang.cachoeira.data.DataStoreInterface;
import ru.khasang.cachoeira.model.IResource;
import ru.khasang.cachoeira.properties.ISettingsManager;
import ru.khasang.cachoeira.properties.RecentProjectsController;
import ru.khasang.cachoeira.properties.SettingsManager;
import ru.khasang.cachoeira.viewcontroller.AboutWindowController;
import ru.khasang.cachoeira.viewcontroller.CreateNewProjectWindowController;
import ru.khasang.cachoeira.viewcontroller.MainWindowController;
import ru.khasang.cachoeira.view.mainwindow.menubar.AbstractMenuBar;
import java.io.File;
import java.util.List;
public class MenuBarController {
private final AbstractMenuBar menuBar;
private final MainWindowController controller;
public MenuBarController(AbstractMenuBar menuBar, MainWindowController controller) {
this.menuBar = menuBar;
this.controller = controller;
}
public void attachMenuBarEvents() {
menuBar.getCreateProject().setOnAction(this::createProjectMenuItemHandler);
menuBar.getOpenProject().setOnAction(this::openProjectMenuItemHandler);
menuBar.getSaveProject().setOnAction(this::saveProjectMenuItemHandler);
menuBar.getSaveAsProject().setOnAction(this::saveAsProjectMenuItemProject);
menuBar.getExportResources().setOnAction(this::exportResourcesMenuItemHandler);
menuBar.getImportResources().setOnAction(this::importResourcesMenuItemHandler);
menuBar.getExit().setOnAction(this::exitMenuItemHandler);
menuBar.getUndo().setOnAction(this::undoMenuItemHandler);
menuBar.getRedo().setOnAction(this::redoMenuItemHandler);
menuBar.getAbout().setOnAction(this::aboutMenuItemHandler);
}
private void createProjectMenuItemHandler(ActionEvent event) {
CreateNewProjectWindowController createNewProjectWindowController = new CreateNewProjectWindowController(controller.getView());
createNewProjectWindowController.launch();
}
private void openProjectMenuItemHandler(ActionEvent event) {
FileChooser fileChooser = new FileChooser();
fileChooser.setInitialDirectory(new File(System.getProperty("user.home") + "/Documents/Cachoeira"));
fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("CACH", "*.cach"));
File file = fileChooser.showOpenDialog(controller.getView().getStage());
if (file != null) {
DataService.getInstance().loadProject(file);
}
}
private void saveProjectMenuItemHandler(ActionEvent event) {
DataService.getInstance().saveProject(controller.getProjectFile(), controller.getProject());
// После сохранения очищаем списки анду и реду
controller.getCommandExecutor().clearLists();
}
private void saveAsProjectMenuItemProject(ActionEvent event) {
FileChooser fileChooser = new FileChooser();
fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("CACH", "*.cach"));
File file = fileChooser.showSaveDialog(controller.getView().getStage());
if (file != null) {
controller.setProjectFile(file);
DataService.getInstance().saveProjectAs(controller.getProjectFile(), controller.getProject());
// После сохранения очищаем списки анду и реду
controller.getCommandExecutor().clearLists();
}
}
private void exportResourcesMenuItemHandler(ActionEvent event) {
DataStoreInterface storeInterface = new DBSchemeManager();
FileChooser fileChooser = new FileChooser();
fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("CRES", "*.cres"));
File file = fileChooser.showSaveDialog(controller.getView().getStage());
if (file != null) {
storeInterface.createResourceExportFile(file);
storeInterface.saveResourcesToFile(file, controller.getProject());
}
}
private void importResourcesMenuItemHandler(ActionEvent event) {
DataStoreInterface storeInterface = new DBSchemeManager();
FileChooser fileChooser = new FileChooser();
fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("CRES", "*.cres"));
File file = fileChooser.showOpenDialog(controller.getView().getStage());
if (file != null) {
List<IResource> resourceListFromFile = storeInterface.getResourceListFromFile(file);
controller.getProject().getResourceList().addAll(resourceListFromFile);
}
}
private void exitMenuItemHandler(ActionEvent event) {
this.saveProperties();
this.saveProject(null);
}
private void undoMenuItemHandler(ActionEvent event) {
controller.getCommandExecutor().undo();
}
private void redoMenuItemHandler(ActionEvent event) {
controller.getCommandExecutor().redo();
}
private void aboutMenuItemHandler(ActionEvent event) {
AboutWindowController aboutWindowController = new AboutWindowController();
aboutWindowController.launch();
}
private void saveProperties() {
ISettingsManager settingsManager = SettingsManager.getInstance();
settingsManager.writeUIValues(
controller.getSplitPaneDividerValue(),
controller.getZoomMultiplier(),
controller.getView().getStage().getWidth(),
controller.getView().getStage().getHeight(),
controller.getView().getStage().isMaximized());
settingsManager.writeRecentProjects(RecentProjectsController.getInstance().getRecentProjects());
}
private void saveProject(WindowEvent event) {
//минимум JDK 8u40
if (controller.getCommandExecutor().isChanged()) {
Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
alert.setTitle("Cachoeira");
alert.setHeaderText("Вы хотите сохранить изменения в " + controller.getProject().getName() + "?");
ButtonType saveProjectButtonType = new ButtonType("Сохранить");
ButtonType doNotSaveProjectButtonType = new ButtonType("Не сохранять");
ButtonType cancelButtonType = new ButtonType("Отмена", ButtonBar.ButtonData.CANCEL_CLOSE);
alert.getButtonTypes().setAll(saveProjectButtonType, doNotSaveProjectButtonType, cancelButtonType);
alert.showAndWait().ifPresent(response -> {
if (response == saveProjectButtonType) {
DataService.getInstance().saveProject(controller.getProjectFile(), controller.getProject());
controller.getView().getStage().close();
} else if (response == doNotSaveProjectButtonType) {
controller.getView().getStage().close();
} else {
if (event != null) {
event.consume();
}
}
});
} else {
controller.getView().getStage().close();
}
}
}