package de.uniluebeck.mi.projmi6.controller; import de.uniluebeck.mi.projmi6.db.DBHandler; import de.uniluebeck.mi.projmi6.model.*; import javafx.beans.binding.Bindings; import javafx.beans.property.ReadOnlyObjectProperty; import javafx.beans.property.SimpleObjectProperty; import javafx.beans.value.ChangeListener; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.concurrent.Task; import javafx.fxml.FXML; import javafx.scene.control.*; import javafx.scene.paint.Color; import javafx.scene.text.Text; import javafx.util.Callback; import javax.swing.*; import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.concurrent.ThreadFactory; public class MainController { private FallController fallController; private DiagnoseController diagnoseController; private PatientTablesController patientTablesController; private SettingsController settingsController; private StationsHistorieController stationsHistorieController; private UntersuchungenController untersuchungenController; private LogController logController; private int parallelTaskCount = 0; @FXML private ChoiceBox cmbUserChoose; @FXML private ProgressIndicator progressIndicator; @FXML private Button btnFallCreate; @FXML private SplitPane fallOverview; @FXML private ListView lvFall; @FXML private TabPane tabPaneFall; @FXML private Tab tabFallOverview, tabFallUntersuchungen, tabFallDiagnose, tabFallStationsHistorie; private Stammdaten stammdaten = new Stammdaten(); private Callback, Object> controllerFactory = clazz -> { if (clazz.equals(MainController.class)) { return this; } else if (clazz.equals(FallController.class)) { return fallController; } else if (clazz.equals(DiagnoseController.class)) { return diagnoseController; } else if (clazz.equals(PatientTablesController.class)) { return patientTablesController; } else if (clazz.equals(SettingsController.class)) { return settingsController; } else if (clazz.equals(UntersuchungenController.class)) { return untersuchungenController; } else if (clazz.equals(StationsHistorieController.class)) { return stationsHistorieController; } else if (clazz.equals(LogController.class)){ return logController; } else { System.err.println("Keine Controller-Klasse des Typs " + clazz + " gefunden!!!"); return null; } }; public MainController() { fallController = new FallController(this); diagnoseController = new DiagnoseController(this); patientTablesController = new PatientTablesController(this); settingsController = new SettingsController(this); untersuchungenController = new UntersuchungenController(this); stationsHistorieController = new StationsHistorieController(this); logController = new LogController(this); } public Stammdaten getStammdaten() { return stammdaten; } public Callback, Object> getControllerFactory() { return controllerFactory; } public FallController getFallController() { return fallController; } public DiagnoseController getDiagnoseController() { return diagnoseController; } public PatientTablesController getPatientTablesController() { return patientTablesController; } public SettingsController getSettingsController() { return settingsController; } public UntersuchungenController getUntersuchungenController() { return untersuchungenController; } public void increaseParallelTaskCount() { parallelTaskCount++; if (parallelTaskCount > 0 && progressIndicator != null) { progressIndicator.setVisible(true); } } public void decreaseParallelTaskCount() { parallelTaskCount--; if (parallelTaskCount <= 0 && progressIndicator != null) { parallelTaskCount = 0; progressIndicator.setVisible(false); } } @FXML private Label lvFallPlaceholder; private Task> loadFallTask = null; public void refreshCasesFromDb(Patient patient) { lvFall.setItems(null); //clear list if (patient == null) { // If no patient is selected lvFallPlaceholder.setText("Kein Patient ausgew\u00e4hlt!"); return; } if (loadFallTask != null && loadFallTask.isRunning()) { loadFallTask.cancel(); } loadFallTask = new Task>() { @Override protected List call() throws Exception { return DBHandler.getFaelleByPatID(patient.getPatID()); } @Override protected void succeeded() { super.succeeded(); if (isCancelled()) { return; } lvFallPlaceholder.setText("Keine F\u00e4lle vorhanden!"); lvFall.setItems(FXCollections.observableArrayList(getValue())); decreaseParallelTaskCount(); } @Override protected void cancelled() { super.cancelled(); decreaseParallelTaskCount(); } @Override protected void failed() { super.failed(); lvFallPlaceholder.setText("Laden fehlgeschlagen!"); lvFall.setItems(null); decreaseParallelTaskCount(); } }; lvFallPlaceholder.setText("Liste wird geladen..."); increaseParallelTaskCount(); Thread thread = new Thread(loadFallTask); thread.setDaemon(true); thread.start(); } @FXML private void initialize() { //Init user data. cmbUserChoose.itemsProperty().bind(this.getStammdaten().mitarbeiterProperty()); cmbUserChoose.getSelectionModel().select(0); // TODO: Bessere Loesung finden. //Disable the right side if no case is selected. fallOverview.disableProperty().bind(patientTablesController.selectedPatientProperty().isNull() .and(fallController.stateProperty().isNotEqualTo(FallController.State.CREATE))); //Load the cases async if patient changes patientTablesController.selectedPatientProperty().addListener((observableValue, oldValue, newValue) -> { refreshCasesFromDb(newValue); }); lvFall.getSelectionModel().setSelectionMode(SelectionMode.SINGLE); fallController.fallPropertyProperty().bind(lvFall.getSelectionModel().selectedItemProperty()); lvFall.getSelectionModel().selectedItemProperty().addListener((observableValue, oldValue, newValue) -> { refreshCaseData(newValue); }); lvFall.setCellFactory(lv -> { return new ListCell() { @Override protected void updateItem(Fall item, boolean empty) { super.updateItem(item, empty); if (item == null || empty) { this.setText(null); this.setGraphic(null); return; } setText(item.toString()); if (item.getStorniert()) { Text text = new Text(" "); text.setFill(Color.RED); setGraphic(text); setTextFill(Color.GRAY); //TODO } else { setTextFill(Color.BLACK); setGraphic(null); } } }; }); } private Task loadCaseData = null; private void refreshCaseData(Fall fall){ if (loadCaseData != null && loadCaseData.isRunning()) { loadCaseData.cancel(); } tabPaneFall.setDisable(false); tabFallDiagnose.setDisable(true); tabFallStationsHistorie.setDisable(true); tabFallUntersuchungen.setDisable(true); if (fall == null) { tabPaneFall.setDisable(true); System.out.println("TODO: Clear tables cuz fall = null!"); //fallController.c return; } if (fall == null) { // If no patient is selected //lvFallPlaceholder.setText("Kein Patient ausgew\u00e4hlt!"); return; } loadCaseData = new Task() { List untersuchungList; List diagnoseList; List stationsHistorieList; @Override protected Void call() throws Exception { untersuchungList = DBHandler.getUntersuchungByFall(fall); diagnoseList = DBHandler.getDiagnosenByFall(fall); stationsHistorieList = DBHandler.getStationsHistorieByFall(fall); return null; } @Override protected void succeeded() { super.succeeded(); if (isCancelled()) { System.out.println("Task wurde gecancelt"); return; } ObservableList diagnoses = FXCollections.observableArrayList(diagnoseList); untersuchungenController.setUntersuchungen(FXCollections.observableArrayList(untersuchungList)); diagnoseController.setDiagnosen(diagnoses); stationsHistorieController.setStationsHistorie(FXCollections.observableArrayList(stationsHistorieList)); fallController.setDiagnosen(diagnoses); tabPaneFall.setDisable(false); tabFallDiagnose.setDisable(false); tabFallStationsHistorie.setDisable(false); tabFallUntersuchungen.setDisable(false); decreaseParallelTaskCount(); } @Override protected void cancelled() { super.cancelled(); decreaseParallelTaskCount(); } @Override protected void failed() { super.failed(); //lvFallPlaceholder.setText("Laden fehlgeschlagen!"); getException().printStackTrace(); decreaseParallelTaskCount(); } }; Thread thread = new Thread(loadCaseData); thread.setDaemon(true); thread.start(); increaseParallelTaskCount(); } public void refreshCaseData(){ refreshCaseData(lvFall.getSelectionModel().getSelectedItem()); } @FXML private void clickedCreateFall() { // tabFallDiagnose.setDisable(true); // tabFallUntersuchungen.setDisable(true); // tabFallStationsHistorie.setDisable(true); // tabPaneFall.getSelectionModel().select(tabFallOverview); // patientTablesController.getPatientOverviewTabPane().setDisable(true); // // fallController.createNewFall(); lockForEdit(TabName.OVERVIEW); } public Fall getFall(){ return lvFall.getSelectionModel().getSelectedItem(); } public ReadOnlyObjectProperty fallProperty(){ return lvFall.getSelectionModel().selectedItemProperty(); } public enum TabName { OVERVIEW, DIAGNOSE, UNTERSUCHUNG, STATIONSHISTORIE; } public void lockForEdit(TabName exclude) { tabFallDiagnose.setDisable(true); tabFallUntersuchungen.setDisable(true); tabFallStationsHistorie.setDisable(true); tabFallOverview.setDisable(true); lvFall.setDisable(true); btnFallCreate.setDisable(true); patientTablesController.getPatientOverviewTabPane().setDisable(true); switch (exclude) { case OVERVIEW: tabFallOverview.setDisable(false); break; case DIAGNOSE: tabFallDiagnose.setDisable(false); break; case UNTERSUCHUNG: tabFallUntersuchungen.setDisable(false); break; case STATIONSHISTORIE: tabFallStationsHistorie.setDisable(false); default: break; } } public void unlockFromEdit() { tabFallDiagnose.setDisable(false); tabFallUntersuchungen.setDisable(false); tabFallStationsHistorie.setDisable(false); tabFallOverview.setDisable(false); patientTablesController.getPatientOverviewTabPane().setDisable(false); lvFall.setDisable(false); btnFallCreate.setDisable(false); } public Mitarbeiter getCurrentMitarbeiter() { return cmbUserChoose==null?null:cmbUserChoose.getValue(); } public ReadOnlyObjectProperty currentMitarbeiterProperty() { return cmbUserChoose.valueProperty(); } }