3232import de .doubleslash .keeptime .model .Project ;
3333import de .doubleslash .keeptime .model .Work ;
3434import javafx .application .Platform ;
35+ import javafx .beans .binding .Bindings ;
36+ import javafx .beans .binding .BooleanBinding ;
37+ import javafx .beans .property .BooleanProperty ;
38+ import javafx .beans .property .SimpleBooleanProperty ;
3539import javafx .beans .property .StringProperty ;
3640import javafx .beans .value .ChangeListener ;
3741import javafx .beans .value .ObservableValue ;
4044import javafx .scene .Node ;
4145import javafx .scene .control .ComboBox ;
4246import javafx .scene .control .DatePicker ;
47+ import javafx .scene .control .Label ;
4348import javafx .scene .control .ListCell ;
4449import javafx .scene .control .ListView ;
4550import javafx .scene .control .Spinner ;
@@ -80,8 +85,12 @@ public class ManageWorkController {
8085 @ FXML
8186 private ComboBox <Project > projectComboBox ;
8287
88+ @ FXML
89+ private Label errorLabel ;
90+
8391 private boolean comboChange ;
8492 private Project selectedProject ;
93+ private BooleanProperty isValidProperty = new SimpleBooleanProperty ();
8594
8695 private FilteredList <Project > filteredList ;
8796
@@ -98,11 +107,44 @@ private void initialize() {
98107
99108 setUpTimeSpinner (endTimeSpinner );
100109
110+ setUpTimeRestriction ();
111+
101112 setProjectUpComboBox ();
102113
103114 Platform .runLater (() -> projectComboBox .requestFocus ());
104115 }
105116
117+ private void setUpTimeRestriction () {
118+
119+ BooleanBinding isValidBinding = Bindings .createBooleanBinding (() -> {
120+ if (startTimeSpinner .getValue () == null || endTimeSpinner .getValue () == null
121+ || startDatePicker .getValue () == null || endDatePicker .getValue () == null ) {
122+ return false ;
123+ }
124+
125+ LocalDateTime start = LocalDateTime .of (startDatePicker .getValue (), startTimeSpinner .getValue ());
126+ LocalDateTime end = LocalDateTime .of (endDatePicker .getValue (), endTimeSpinner .getValue ());
127+
128+ if (start .isAfter (end )) {
129+ return false ;
130+ } else {
131+ return true ;
132+ }
133+ }, startTimeSpinner .valueProperty (), endTimeSpinner .valueProperty (), endDatePicker .valueProperty (),
134+ startDatePicker .valueProperty ());
135+
136+ this .isValidProperty .bind (isValidBinding );
137+
138+ errorLabel .textProperty ().bind (Bindings .createStringBinding (() -> {
139+ if (Boolean .TRUE .equals (isValidProperty .get ())) {
140+ return "" ;
141+ } else {
142+ return "startDate has to be before endDate" ;
143+ }
144+
145+ }, isValidProperty ));
146+ }
147+
106148 private void setUpTimeSpinner (final Spinner <LocalTime > spinner ) {
107149 spinner .focusedProperty ().addListener ((e ) -> {
108150 final LocalTimeStringConverter stringConverter = new LocalTimeStringConverter (FormatStyle .MEDIUM );
@@ -326,4 +368,8 @@ private void setTextColor(final Node object, final Color color) {
326368 object .setStyle (style );
327369 }
328370
371+ public BooleanProperty validProperty () {
372+ return this .isValidProperty ;
373+ }
374+
329375}
0 commit comments