Im Rahmen der Veranstaltung "CS3330 - Projektpraktikum MedizinischeInformatik" an der Universität zu Lübeck entstandenes Krankenhausinformationssystem (KIS).
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

419 lines
13 KiB

  1. package de.uniluebeck.mi.projmi6.controller;
  2. import de.uniluebeck.mi.projmi6.db.DBHandler;
  3. import de.uniluebeck.mi.projmi6.model.*;
  4. import javafx.beans.binding.Bindings;
  5. import javafx.beans.property.ReadOnlyObjectProperty;
  6. import javafx.beans.property.SimpleObjectProperty;
  7. import javafx.beans.value.ChangeListener;
  8. import javafx.collections.FXCollections;
  9. import javafx.collections.ObservableList;
  10. import javafx.concurrent.Task;
  11. import javafx.fxml.FXML;
  12. import javafx.scene.control.*;
  13. import javafx.scene.paint.Color;
  14. import javafx.scene.text.Text;
  15. import javafx.util.Callback;
  16. import javax.swing.*;
  17. import java.util.ArrayList;
  18. import java.util.List;
  19. import java.util.Set;
  20. import java.util.concurrent.ThreadFactory;
  21. public class MainController {
  22. private FallController fallController;
  23. private DiagnoseController diagnoseController;
  24. private PatientTablesController patientTablesController;
  25. private SettingsController settingsController;
  26. private StationsHistorieController stationsHistorieController;
  27. private UntersuchungenController untersuchungenController;
  28. private LogController logController;
  29. private int parallelTaskCount = 0;
  30. @FXML
  31. private ChoiceBox<Mitarbeiter> cmbUserChoose;
  32. @FXML
  33. private ProgressIndicator progressIndicator;
  34. @FXML
  35. private Button btnFallCreate;
  36. @FXML
  37. private SplitPane fallOverview;
  38. @FXML
  39. private ListView<Fall> lvFall;
  40. @FXML
  41. private TabPane tabPaneFall;
  42. @FXML
  43. private Tab tabFallOverview, tabFallUntersuchungen, tabFallDiagnose, tabFallStationsHistorie;
  44. private Stammdaten stammdaten = new Stammdaten();
  45. private Callback<Class<?>, Object> controllerFactory = clazz -> {
  46. if (clazz.equals(MainController.class)) {
  47. return this;
  48. } else if (clazz.equals(FallController.class)) {
  49. return fallController;
  50. } else if (clazz.equals(DiagnoseController.class)) {
  51. return diagnoseController;
  52. } else if (clazz.equals(PatientTablesController.class)) {
  53. return patientTablesController;
  54. } else if (clazz.equals(SettingsController.class)) {
  55. return settingsController;
  56. } else if (clazz.equals(UntersuchungenController.class)) {
  57. return untersuchungenController;
  58. } else if (clazz.equals(StationsHistorieController.class)) {
  59. return stationsHistorieController;
  60. } else if (clazz.equals(LogController.class)){
  61. return logController;
  62. } else {
  63. System.err.println("Keine Controller-Klasse des Typs " + clazz + " gefunden!!!");
  64. return null;
  65. }
  66. };
  67. public MainController() {
  68. fallController = new FallController(this);
  69. diagnoseController = new DiagnoseController(this);
  70. patientTablesController = new PatientTablesController(this);
  71. settingsController = new SettingsController(this);
  72. untersuchungenController = new UntersuchungenController(this);
  73. stationsHistorieController = new StationsHistorieController(this);
  74. logController = new LogController(this);
  75. }
  76. public Stammdaten getStammdaten() {
  77. return stammdaten;
  78. }
  79. public Callback<Class<?>, Object> getControllerFactory() {
  80. return controllerFactory;
  81. }
  82. public FallController getFallController() {
  83. return fallController;
  84. }
  85. public DiagnoseController getDiagnoseController() {
  86. return diagnoseController;
  87. }
  88. public PatientTablesController getPatientTablesController() {
  89. return patientTablesController;
  90. }
  91. public SettingsController getSettingsController() {
  92. return settingsController;
  93. }
  94. public UntersuchungenController getUntersuchungenController() {
  95. return untersuchungenController;
  96. }
  97. public void increaseParallelTaskCount() {
  98. parallelTaskCount++;
  99. if (parallelTaskCount > 0 && progressIndicator != null) {
  100. progressIndicator.setVisible(true);
  101. }
  102. }
  103. public void decreaseParallelTaskCount() {
  104. parallelTaskCount--;
  105. if (parallelTaskCount <= 0 && progressIndicator != null) {
  106. parallelTaskCount = 0;
  107. progressIndicator.setVisible(false);
  108. }
  109. }
  110. @FXML
  111. private Label lvFallPlaceholder;
  112. private Task<List<Fall>> loadFallTask = null;
  113. public void refreshCasesFromDb(Patient patient) {
  114. lvFall.setItems(null); //clear list
  115. if (patient == null) { // If no patient is selected
  116. lvFallPlaceholder.setText("Kein Patient ausgew\u00e4hlt!");
  117. return;
  118. }
  119. if (loadFallTask != null && loadFallTask.isRunning()) {
  120. loadFallTask.cancel();
  121. }
  122. loadFallTask = new Task<List<Fall>>() {
  123. @Override
  124. protected List<Fall> call() throws Exception {
  125. return DBHandler.getFaelleByPatID(patient.getPatID());
  126. }
  127. @Override
  128. protected void succeeded() {
  129. super.succeeded();
  130. if (isCancelled()) {
  131. return;
  132. }
  133. lvFallPlaceholder.setText("Keine F\u00e4lle vorhanden!");
  134. lvFall.setItems(FXCollections.observableArrayList(getValue()));
  135. decreaseParallelTaskCount();
  136. }
  137. @Override
  138. protected void cancelled() {
  139. super.cancelled();
  140. decreaseParallelTaskCount();
  141. }
  142. @Override
  143. protected void failed() {
  144. super.failed();
  145. lvFallPlaceholder.setText("Laden fehlgeschlagen!");
  146. lvFall.setItems(null);
  147. decreaseParallelTaskCount();
  148. }
  149. };
  150. lvFallPlaceholder.setText("Liste wird geladen...");
  151. increaseParallelTaskCount();
  152. Thread thread = new Thread(loadFallTask);
  153. thread.setDaemon(true);
  154. thread.start();
  155. }
  156. @FXML
  157. private void initialize() {
  158. //Init user data.
  159. cmbUserChoose.itemsProperty().bind(this.getStammdaten().mitarbeiterProperty());
  160. cmbUserChoose.getSelectionModel().select(0); // TODO: Bessere Loesung finden.
  161. //Disable the right side if no case is selected.
  162. fallOverview.disableProperty().bind(patientTablesController.selectedPatientProperty().isNull()
  163. .and(fallController.stateProperty().isNotEqualTo(FallController.State.CREATE)));
  164. //Load the cases async if patient changes
  165. patientTablesController.selectedPatientProperty().addListener((observableValue, oldValue, newValue) -> {
  166. refreshCasesFromDb(newValue);
  167. });
  168. lvFall.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);
  169. fallController.fallPropertyProperty().bind(lvFall.getSelectionModel().selectedItemProperty());
  170. lvFall.getSelectionModel().selectedItemProperty().addListener((observableValue, oldValue, newValue) -> {
  171. refreshCaseData(newValue);
  172. });
  173. lvFall.setCellFactory(lv -> {
  174. return new ListCell<Fall>() {
  175. @Override
  176. protected void updateItem(Fall item, boolean empty) {
  177. super.updateItem(item, empty);
  178. if (item == null || empty) {
  179. this.setText(null);
  180. this.setGraphic(null);
  181. return;
  182. }
  183. setText(item.toString());
  184. if (item.getStorniert()) {
  185. Text text = new Text("<storniert> ");
  186. text.setFill(Color.RED);
  187. setGraphic(text);
  188. setTextFill(Color.GRAY); //TODO
  189. } else {
  190. setTextFill(Color.BLACK);
  191. setGraphic(null);
  192. }
  193. }
  194. };
  195. });
  196. }
  197. private Task<Void> loadCaseData = null;
  198. private void refreshCaseData(Fall fall){
  199. if (loadCaseData != null && loadCaseData.isRunning()) {
  200. loadCaseData.cancel();
  201. }
  202. tabPaneFall.setDisable(false);
  203. tabFallDiagnose.setDisable(true);
  204. tabFallStationsHistorie.setDisable(true);
  205. tabFallUntersuchungen.setDisable(true);
  206. if (fall == null) {
  207. tabPaneFall.setDisable(true);
  208. System.out.println("TODO: Clear tables cuz fall = null!");
  209. //fallController.c
  210. return;
  211. }
  212. if (fall == null) { // If no patient is selected
  213. //lvFallPlaceholder.setText("Kein Patient ausgew\u00e4hlt!");
  214. return;
  215. }
  216. loadCaseData = new Task<Void>() {
  217. List<Untersuchung> untersuchungList;
  218. List<Diagnose> diagnoseList;
  219. List<StationsHistorie> stationsHistorieList;
  220. @Override
  221. protected Void call() throws Exception {
  222. untersuchungList = DBHandler.getUntersuchungByFall(fall);
  223. diagnoseList = DBHandler.getDiagnosenByFall(fall);
  224. stationsHistorieList = DBHandler.getStationsHistorieByFall(fall);
  225. return null;
  226. }
  227. @Override
  228. protected void succeeded() {
  229. super.succeeded();
  230. if (isCancelled()) {
  231. System.out.println("Task wurde gecancelt");
  232. return;
  233. }
  234. ObservableList<Diagnose> diagnoses = FXCollections.observableArrayList(diagnoseList);
  235. untersuchungenController.setUntersuchungen(FXCollections.observableArrayList(untersuchungList));
  236. diagnoseController.setDiagnosen(diagnoses);
  237. stationsHistorieController.setStationsHistorie(FXCollections.observableArrayList(stationsHistorieList));
  238. fallController.setDiagnosen(diagnoses);
  239. tabPaneFall.setDisable(false);
  240. tabFallDiagnose.setDisable(false);
  241. tabFallStationsHistorie.setDisable(false);
  242. tabFallUntersuchungen.setDisable(false);
  243. decreaseParallelTaskCount();
  244. }
  245. @Override
  246. protected void cancelled() {
  247. super.cancelled();
  248. decreaseParallelTaskCount();
  249. }
  250. @Override
  251. protected void failed() {
  252. super.failed();
  253. //lvFallPlaceholder.setText("Laden fehlgeschlagen!");
  254. getException().printStackTrace();
  255. decreaseParallelTaskCount();
  256. }
  257. };
  258. Thread thread = new Thread(loadCaseData);
  259. thread.setDaemon(true);
  260. thread.start();
  261. increaseParallelTaskCount();
  262. }
  263. public void refreshCaseData(){
  264. refreshCaseData(lvFall.getSelectionModel().getSelectedItem());
  265. }
  266. @FXML
  267. private void clickedCreateFall() {
  268. // tabFallDiagnose.setDisable(true);
  269. // tabFallUntersuchungen.setDisable(true);
  270. // tabFallStationsHistorie.setDisable(true);
  271. // tabPaneFall.getSelectionModel().select(tabFallOverview);
  272. // patientTablesController.getPatientOverviewTabPane().setDisable(true);
  273. //
  274. //
  275. fallController.createNewFall();
  276. lockForEdit(TabName.OVERVIEW);
  277. }
  278. public Fall getFall(){
  279. return lvFall.getSelectionModel().getSelectedItem();
  280. }
  281. public ReadOnlyObjectProperty<Fall> fallProperty(){
  282. return lvFall.getSelectionModel().selectedItemProperty();
  283. }
  284. public enum TabName {
  285. OVERVIEW, DIAGNOSE, UNTERSUCHUNG, STATIONSHISTORIE;
  286. }
  287. public void lockForEdit(TabName exclude) {
  288. tabFallDiagnose.setDisable(true);
  289. tabFallUntersuchungen.setDisable(true);
  290. tabFallStationsHistorie.setDisable(true);
  291. tabFallOverview.setDisable(true);
  292. lvFall.setDisable(true);
  293. btnFallCreate.setDisable(true);
  294. patientTablesController.getPatientOverviewTabPane().setDisable(true);
  295. switch (exclude) {
  296. case OVERVIEW:
  297. tabFallOverview.setDisable(false);
  298. break;
  299. case DIAGNOSE:
  300. tabFallDiagnose.setDisable(false);
  301. break;
  302. case UNTERSUCHUNG:
  303. tabFallUntersuchungen.setDisable(false);
  304. break;
  305. case STATIONSHISTORIE:
  306. tabFallStationsHistorie.setDisable(false);
  307. default:
  308. break;
  309. }
  310. }
  311. public void unlockFromEdit() {
  312. tabFallDiagnose.setDisable(false);
  313. tabFallUntersuchungen.setDisable(false);
  314. tabFallStationsHistorie.setDisable(false);
  315. tabFallOverview.setDisable(false);
  316. patientTablesController.getPatientOverviewTabPane().setDisable(false);
  317. lvFall.setDisable(false);
  318. btnFallCreate.setDisable(false);
  319. }
  320. public Mitarbeiter getCurrentMitarbeiter() {
  321. return cmbUserChoose==null?null:cmbUserChoose.getValue();
  322. }
  323. public ReadOnlyObjectProperty<Mitarbeiter> currentMitarbeiterProperty() {
  324. return cmbUserChoose.valueProperty();
  325. }
  326. }