Im Rahmen der Veranstaltung "CS3330 - Projektpraktikum MedizinischeInformatik" an der Universität zu Lübeck entstandenes Krankenhausinformationssystem (KIS).
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

340 行
10 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.util.Callback;
  14. import javax.swing.*;
  15. import java.util.ArrayList;
  16. import java.util.List;
  17. import java.util.Set;
  18. import java.util.concurrent.ThreadFactory;
  19. public class MainController {
  20. private FallController fallController;
  21. private DiagnoseController diagnoseController;
  22. private PatientTablesController patientTablesController;
  23. private SettingsController settingsController;
  24. private StationsHistorieController stationsHistorieController;
  25. private UntersuchungenController untersuchungenController;
  26. private int parallelTaskCount = 0;
  27. @FXML
  28. private ChoiceBox<Mitarbeiter> cmbUserChoose;
  29. @FXML
  30. private ProgressIndicator progressIndicator;
  31. @FXML
  32. private Button btnFallCreate;
  33. @FXML
  34. private SplitPane fallOverview;
  35. @FXML
  36. private ListView<Fall> lvFall;
  37. @FXML
  38. private TabPane tabPaneFall;
  39. @FXML
  40. private Tab tabFallOverview, tabFallUntersuchungen, tabFallDiagnose, tabFallStationsHistorie ;
  41. private Stammdaten stammdaten = new Stammdaten();
  42. private Callback<Class<?>, Object> controllerFactory = clazz -> {
  43. if(clazz.equals(MainController.class)) {
  44. return this;
  45. }else if(clazz.equals(FallController.class)){
  46. return fallController;
  47. }else if(clazz.equals(DiagnoseController.class)){
  48. return diagnoseController;
  49. }else if(clazz.equals(PatientTablesController.class)){
  50. return patientTablesController;
  51. }else if(clazz.equals(SettingsController.class)){
  52. return settingsController;
  53. } else if(clazz.equals(UntersuchungenController.class)) {
  54. return untersuchungenController;
  55. }else if(clazz.equals(StationsHistorieController.class)){
  56. return stationsHistorieController;
  57. }else {
  58. System.err.println("Keine Controller-Klasse des Typs "+clazz+" gefunden!!!");
  59. return null;
  60. }
  61. };
  62. public MainController(){
  63. fallController = new FallController(this);
  64. diagnoseController = new DiagnoseController(this);
  65. patientTablesController = new PatientTablesController(this);
  66. settingsController = new SettingsController(this);
  67. untersuchungenController = new UntersuchungenController(this);
  68. stationsHistorieController = new StationsHistorieController(this);
  69. }
  70. public Stammdaten getStammdaten(){
  71. return stammdaten;
  72. }
  73. public Callback<Class<?>, Object> getControllerFactory(){
  74. return controllerFactory;
  75. }
  76. public FallController getFallController(){
  77. return fallController;
  78. }
  79. public DiagnoseController getDiagnoseController(){
  80. return diagnoseController;
  81. }
  82. public PatientTablesController getPatientTablesController(){
  83. return patientTablesController;
  84. }
  85. public SettingsController getSettingsController(){
  86. return settingsController;
  87. }
  88. public UntersuchungenController getUntersuchungenController(){
  89. return untersuchungenController;
  90. }
  91. public void increaseParallelTaskCount(){
  92. parallelTaskCount++;
  93. if(parallelTaskCount>0 && progressIndicator!=null){
  94. progressIndicator.setVisible(true);
  95. }
  96. }
  97. public void decreaseParallelTaskCount(){
  98. parallelTaskCount--;
  99. if(parallelTaskCount<=0 && progressIndicator!=null){
  100. parallelTaskCount = 0;
  101. progressIndicator.setVisible(false);
  102. }
  103. }
  104. @FXML
  105. private Label lvFallPlaceholder;
  106. private Task<List<Fall>> loadFallTask = null;
  107. private ChangeListener<Patient> onPatientChanged = (observableValue,oldValue,newValue)-> {
  108. lvFall.setItems(null); //clear list
  109. if(newValue==null){ // If no patient is selected
  110. lvFallPlaceholder.setText("Kein Patient ausgew\u00e4hlt!");
  111. return;
  112. }
  113. if(loadFallTask!=null && loadFallTask.isRunning()){
  114. loadFallTask.cancel();
  115. }
  116. loadFallTask = new Task<List<Fall>>() {
  117. @Override
  118. protected List<Fall> call() throws Exception {
  119. return DBHandler.getFaelleByPatID(newValue.getPatID());
  120. }
  121. @Override
  122. protected void succeeded() {
  123. super.succeeded();
  124. if(isCancelled()){
  125. System.out.println("Task wurde gecancelt");
  126. return;
  127. }
  128. lvFallPlaceholder.setText("Keine F\u00e4lle vorhanden!");
  129. lvFall.setItems(FXCollections.observableArrayList(getValue()));
  130. decreaseParallelTaskCount();
  131. }
  132. @Override
  133. protected void cancelled() {
  134. super.cancelled();
  135. decreaseParallelTaskCount();
  136. }
  137. @Override
  138. protected void failed() {
  139. super.failed();
  140. lvFallPlaceholder.setText("Laden fehlgeschlagen!");
  141. lvFall.setItems(null);
  142. decreaseParallelTaskCount();
  143. }
  144. };
  145. lvFallPlaceholder.setText("Liste wird geladen...");
  146. increaseParallelTaskCount();
  147. Thread thread = new Thread(loadFallTask);
  148. thread.setDaemon(true);
  149. thread.start();
  150. };
  151. @FXML
  152. private void initialize(){
  153. //Init user data.
  154. cmbUserChoose.itemsProperty().bind(this.getStammdaten().mitarbeiterProperty());
  155. cmbUserChoose.getSelectionModel().select(0); // TODO: Bessere Loesung finden.
  156. //Disable the right side if no case is selected.
  157. fallOverview.disableProperty().bind(patientTablesController.selectedPatientProperty().isNull());
  158. //Load the cases async if patient changes
  159. patientTablesController.selectedPatientProperty().addListener(onPatientChanged);
  160. lvFall.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);
  161. fallController.fallPropertyProperty().bind(lvFall.getSelectionModel().selectedItemProperty());
  162. lvFall.getSelectionModel().selectedItemProperty().addListener(onCaseChanged);
  163. }
  164. private Task<Void> loadCaseData = null;
  165. private ChangeListener<Fall> onCaseChanged = (observable, oldValue, newValue) -> {
  166. if(loadCaseData!=null && loadCaseData.isRunning()){
  167. loadCaseData.cancel();
  168. }
  169. tabPaneFall.setDisable(false);
  170. tabFallDiagnose.setDisable(true);
  171. tabFallStationsHistorie.setDisable(true);
  172. tabFallUntersuchungen.setDisable(true);
  173. if(newValue==null) {
  174. tabPaneFall.setDisable(true);
  175. System.out.println("TODO: Clear tables cuz fall = null!");
  176. //fallController.c
  177. return;
  178. }
  179. if(newValue==null){ // If no patient is selected
  180. //lvFallPlaceholder.setText("Kein Patient ausgew\u00e4hlt!");
  181. return;
  182. }
  183. loadCaseData = new Task<Void>() {
  184. List<Untersuchung> untersuchungList;
  185. List<Diagnose> diagnoseList;
  186. List<StationsHistorie> stationsHistorieList;
  187. @Override
  188. protected Void call() throws Exception {
  189. untersuchungList = DBHandler.getUntersuchungByFall(newValue);
  190. diagnoseList = DBHandler.getDiagnosenByFall(newValue);
  191. stationsHistorieList = DBHandler.getStationsHistorieByFall(newValue);
  192. return null;
  193. }
  194. @Override
  195. protected void succeeded() {
  196. super.succeeded();
  197. if(isCancelled()){
  198. System.out.println("Task wurde gecancelt");
  199. return;
  200. }
  201. untersuchungenController.setUntersuchungen(FXCollections.observableArrayList(untersuchungList));
  202. diagnoseController.setDiagnosen(FXCollections.observableArrayList(diagnoseList));
  203. stationsHistorieController.setStationsHistorie(FXCollections.observableArrayList(stationsHistorieList));
  204. tabPaneFall.setDisable(false);
  205. tabFallDiagnose.setDisable(false);
  206. tabFallStationsHistorie.setDisable(false);
  207. tabFallUntersuchungen.setDisable(false);
  208. decreaseParallelTaskCount();
  209. }
  210. @Override
  211. protected void cancelled() {
  212. super.cancelled();
  213. decreaseParallelTaskCount();
  214. }
  215. @Override
  216. protected void failed() {
  217. super.failed();
  218. //lvFallPlaceholder.setText("Laden fehlgeschlagen!");
  219. getException().printStackTrace();
  220. decreaseParallelTaskCount();
  221. }
  222. };
  223. Thread thread = new Thread(loadCaseData);
  224. thread.setDaemon(true);
  225. thread.start();
  226. increaseParallelTaskCount();
  227. };
  228. @FXML
  229. private void clickedCreateFall(){
  230. tabFallDiagnose.setDisable(true);
  231. tabFallUntersuchungen.setDisable(true);
  232. tabFallStationsHistorie.setDisable(true);
  233. tabPaneFall.getSelectionModel().select(tabFallOverview);
  234. patientTablesController.getPatientOverviewTabPane().setDisable(true);
  235. fallController.createNewFall();
  236. }
  237. public void fallCreationComplete(){
  238. tabFallDiagnose.setDisable(false);
  239. tabFallUntersuchungen.setDisable(false);
  240. tabFallStationsHistorie.setDisable(false);
  241. patientTablesController.getPatientOverviewTabPane().setDisable(false);
  242. }
  243. public Mitarbeiter getCurrentMitarbeiter(){
  244. return cmbUserChoose.getValue();
  245. }
  246. public ReadOnlyObjectProperty<Mitarbeiter> currentMitarbeiterProperty(){
  247. return cmbUserChoose.valueProperty();
  248. }
  249. }