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.

179 lines
5.5 KiB

  1. package de.uniluebeck.mi.projmi6.view;
  2. import javafx.beans.binding.Bindings;
  3. import javafx.beans.property.BooleanProperty;
  4. import javafx.beans.property.IntegerPropertyBase;
  5. import javafx.collections.FXCollections;
  6. import javafx.geometry.Insets;
  7. import javafx.geometry.Pos;
  8. import javafx.scene.Node;
  9. import javafx.scene.control.*;
  10. import javafx.scene.effect.DropShadow;
  11. import javafx.scene.effect.Effect;
  12. import javafx.scene.layout.*;
  13. import javafx.scene.paint.Color;
  14. import javafx.scene.paint.Paint;
  15. import java.time.LocalDate;
  16. import java.time.LocalTime;
  17. import java.util.Arrays;
  18. import java.util.stream.IntStream;
  19. import java.time.LocalDateTime;
  20. /**
  21. * A picker for date and time, composed from a DatePicker and two ComboBoxes. It also has an optional Button to set
  22. * date and time to the current system time.
  23. *
  24. * @author Johannes Oehm
  25. */
  26. public class DateTimePicker extends HBox {
  27. private DatePicker datePicker = new DatePicker();
  28. private NumberTextField hourText = new NumberTextField();
  29. private NumberTextField minuteText = new NumberTextField();
  30. private Button btnNow = new Button("Jetzt");
  31. private Effect invalidValue = new DropShadow(10, Color.RED);
  32. /**
  33. * Empty constructor for the FXMLLoader.
  34. */
  35. public DateTimePicker(){
  36. this.setAlignment(Pos.CENTER_LEFT);
  37. hourText.setOnKeyReleased(event ->{
  38. if(hourText.getCaretPosition()>=2){
  39. int hour = Integer.parseInt(hourText.getText());
  40. if(hour>=0 && hour <= 24){
  41. minuteText.requestFocus();
  42. }
  43. }
  44. });
  45. hourText.setAlignment(Pos.CENTER_RIGHT);
  46. hourText.setBackground(null);
  47. hourText.setPadding(Insets.EMPTY);
  48. hourText.setPromptText("HH");
  49. HBox.setHgrow(hourText, Priority.ALWAYS);
  50. minuteText.setBackground(null);
  51. minuteText.setPadding(Insets.EMPTY);
  52. minuteText.setPromptText("MM");
  53. HBox.setHgrow(minuteText, Priority.ALWAYS);
  54. hourText.effectProperty().bind(Bindings.<Effect>createObjectBinding(()->{
  55. String text = hourText.getText();
  56. if(text.isEmpty()){
  57. return null;
  58. }
  59. int value = Integer.parseInt(text);
  60. if(value>=0&&value<24){
  61. return null;
  62. }
  63. return invalidValue;
  64. }, hourText.textProperty()));
  65. minuteText.effectProperty().bind(Bindings.<Effect>createObjectBinding(()->{
  66. String text = minuteText.getText();
  67. if(text.isEmpty()){
  68. return null;
  69. }
  70. int value = Integer.parseInt(text);
  71. if(value>=0&&value<59){
  72. return null;
  73. }
  74. return invalidValue;
  75. }, minuteText.textProperty()));
  76. Label colon = new Label(":");
  77. HBox timePicker = new HBox(hourText, colon,minuteText);
  78. timePicker.maxHeightProperty().bind(datePicker.heightProperty());
  79. timePicker.setMinWidth(55);
  80. timePicker.setMaxWidth(70);
  81. timePicker.getStyleClass().add("button");
  82. //Set Now-Button action
  83. btnNow.setOnAction(event -> setToCurrentDateTime());
  84. //Make it large enough to read the text
  85. btnNow.setMinWidth(50);
  86. btnNow.getStyleClass().add("now-button");
  87. //Add the subcomponents to the view.
  88. this.getChildren().addAll(datePicker,timePicker,btnNow);
  89. this.setSpacing(5);
  90. }
  91. /**
  92. * Setter for the DateTime that is set in the view.
  93. * @param localDateTime The date to be set in the view.
  94. */
  95. public void setDateTime(LocalDateTime localDateTime){
  96. if(localDateTime==null){
  97. hourText.setText("");
  98. minuteText.setText("");
  99. datePicker.setValue(null);
  100. }else{
  101. hourText.setText(Integer.toString(localDateTime.getHour()));
  102. minuteText.setText(Integer.toString(localDateTime.getMinute()));
  103. datePicker.setValue(LocalDate.from(localDateTime));
  104. }
  105. }
  106. /**
  107. * Sets the date set in the view to the current systems time.
  108. */
  109. public void setToCurrentDateTime(){
  110. setDateTime(LocalDateTime.now());
  111. }
  112. /**
  113. * Getter for date and time that is currently set in the view.
  114. * @return A LocalDateTime object or null, if one or more fields are not set.
  115. */
  116. public LocalDateTime getDateTime(){
  117. if(datePicker.getValue()==null ){
  118. return null;
  119. }
  120. try{
  121. int hour = Integer.parseInt( hourText.getText());
  122. int minute = Integer.parseInt(minuteText.getText());
  123. if(hour>=24|| hour<0||minute<0||minute>=60){
  124. return null;
  125. }
  126. return LocalDateTime.of(datePicker.getValue(), LocalTime.of(hour, minute));
  127. }catch (Exception e){
  128. return null;
  129. }
  130. }
  131. /**
  132. * A property for hiding the "Set date and time to now"-Button.
  133. * @return A BooleanProperty, true if the button is visible.
  134. */
  135. public BooleanProperty nowButtonVisiblePropety(){
  136. return btnNow.visibleProperty();
  137. }
  138. /**
  139. * Setter for the {@link DateTimePicker#nowButtonVisiblePropety}.
  140. * @param visible When set to true, the button will be shown.
  141. */
  142. public void setNowButtonVisible(boolean visible){
  143. btnNow.setVisible(visible);
  144. }
  145. /**
  146. * Getter for the {@link DateTimePicker#nowButtonVisiblePropety}.
  147. * @return true if the now-Button is visible, false otherwise.
  148. */
  149. public boolean isNowButtonVisible(){
  150. return btnNow.isVisible();
  151. }
  152. }