package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller; import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.showServiceExceptionAlertAndWait; import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.showSuccessAlertAndWait; import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.showValidationErrorAlertAndWait; import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException; import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException; import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle; import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.ConstructionType; import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.Status; import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.VehicleType; import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service.VehicleService; import java.io.IOException; import java.util.EnumSet; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; import javafx.collections.FXCollections; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.control.Button; import javafx.scene.control.CheckBox; import javafx.scene.control.ChoiceBox; import javafx.scene.input.MouseButton; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.FlowPane; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; @Controller public class CreateCarController { @FXML private AnchorPane createCarAP; @FXML private ChoiceBox cmbCtype; @FXML private ChoiceBox cmbTyp; @FXML private Button btnCreate; @FXML private CheckBox cbxNEF; @FXML private FlowPane fpVehicleList; private final CreateOperationController createOperationController; private static final Logger LOG = LoggerFactory.getLogger(CreateCarController.class); private final VehicleService vehicleService; private boolean update = false; private long vid = -1; private Vehicle chooseVehicle; public CreateCarController( CreateOperationController createOperationController, VehicleService vehicleService) { this.createOperationController = createOperationController; this.vehicleService = vehicleService; } @FXML private void initialize() { fpVehicleList.setHgap(5); fpVehicleList.setVgap(5); cmbCtype.setItems( FXCollections.observableArrayList( Stream.of( ConstructionType.NORMAL, ConstructionType.MITTELHOCHDACH, ConstructionType.HOCHDACH) .map(Enum::toString) .collect(Collectors.toList()))); cmbCtype.setValue(ConstructionType.NORMAL.toString()); cmbTyp.setItems( FXCollections.observableArrayList( Stream.of( VehicleType.BKTW, VehicleType.KTW_B, VehicleType.KTW, VehicleType.RTW, VehicleType.NEF, VehicleType.NAH) .map(Enum::toString) .collect(Collectors.toList()))); cmbTyp.setValue(VehicleType.BKTW.toString()); updateVehiclePane(); } @FXML private void createCar(ActionEvent actionEvent) { if (!update) { LOG.debug("Button \"Erstellen\" clicked."); Vehicle vehicle = Vehicle.builder() .constructionType(parseConstructionType()) .type(parseType()) .name("") .status(Status.ABGEMELDET) .hasNef(cbxNEF.isSelected()) .build(); try { vehicleService.add(vehicle); setToStart(); } catch (InvalidVehicleException e) { LOG.debug("Validation of Vehicle failed"); showValidationErrorAlertAndWait(e.getMessage()); setToStart(); return; } catch (ServiceException e) { LOG.error("ServiceException in createCar(). ", e); showServiceExceptionAlertAndWait( "Ein Fehler beim Erstellen des Fahrzeuges ist aufgetreten."); setToStart(); return; } showSuccessAlertAndWait("Auto wurde erfolgreich angelegt."); } else { LOG.debug("Button \"Speichern\" clicked."); try { Vehicle vehicle = Vehicle.builder() .id(vid) .constructionType(parseConstructionType()) .type(parseType()) .name("") .status(Status.ABGEMELDET) .hasNef(cbxNEF.isSelected()) .build(); vehicleService.update(vehicle); setToStart(); chooseVehicle = null; } catch (InvalidVehicleException e) { LOG.debug("Validation of Vehicle failed"); showValidationErrorAlertAndWait(e.getMessage()); setToStart(); return; } catch (ServiceException e) { LOG.error("ServiceException in createCar(). ", e); showServiceExceptionAlertAndWait(e.getMessage()); setToStart(); return; } showSuccessAlertAndWait("Auto wurde erfolgreich bearbeitet."); } updateVehiclePane(); } private ConstructionType parseConstructionType() { if (cmbCtype.getSelectionModel().getSelectedItem() == null) { return ConstructionType.NORMAL; } return ConstructionType.valueOf(cmbCtype.getSelectionModel().getSelectedItem()); } private VehicleType parseType() { if (cmbTyp.getSelectionModel().getSelectedItem() == null) { return VehicleType.BKTW; } return VehicleType.valueOf(cmbTyp.getSelectionModel().getSelectedItem()); } private void setToStart() { btnCreate.setText("Erstellen"); cbxNEF.setSelected(false); cmbTyp.setValue(VehicleType.BKTW.name()); cmbCtype.setValue(ConstructionType.NORMAL.name()); update = false; } private void updateVehicle(Vehicle vehicle) { cmbCtype.setValue(vehicle.constructionType().name()); cmbTyp.setValue(vehicle.type().name()); cbxNEF.setSelected(vehicle.hasNef()); btnCreate.setText("Speichern"); vid = vehicle.id(); update = true; chooseVehicle = vehicle; } public void setVisible(boolean b) { createCarAP.setVisible(b); } @FXML private void backToMain() { LOG.debug("Hyperlink \"zurück\" clicked."); this.setVisible(false); createOperationController.setVisible(true); } void updateVehiclePane() { try { fpVehicleList.getChildren().clear(); Set vehicles; vehicles = vehicleService.list(EnumSet.of(Status.ABGEMELDET)); for (Vehicle vehicle : vehicles) { VehiclePaneController controller = VehiclePaneController.createVehiclePane(); controller.setData(vehicle, false, false); controller .getRootElement() .setOnMouseClicked( event -> { if (event.getButton().equals(MouseButton.PRIMARY)) { if (chooseVehicle == null || vehicle == chooseVehicle) { if (update == false) { chooseVehicle = vehicle; updateVehicle(vehicle); controller.setSelected(true); } else { setToStart(); controller.setSelected(false); chooseVehicle = null; } } } }); fpVehicleList.getChildren().add(controller.getRootElement()); } } catch (ServiceException | IOException e) { LOG.error("Exception in updateVehiclePane(). ", e); showServiceExceptionAlertAndWait(e.getMessage()); } } }