1616
1717package de .doubleslash .keeptime .view ;
1818
19+ import java .time .LocalDateTime ;
20+ import java .time .LocalTime ;
21+ import java .time .format .DateTimeParseException ;
22+ import java .time .format .FormatStyle ;
23+
1924import org .slf4j .Logger ;
2025import org .slf4j .LoggerFactory ;
2126
2227import de .doubleslash .keeptime .model .Model ;
2328import de .doubleslash .keeptime .model .Project ;
2429import de .doubleslash .keeptime .model .Work ;
30+ import javafx .beans .property .StringProperty ;
2531import javafx .fxml .FXML ;
2632import javafx .scene .control .ComboBox ;
2733import javafx .scene .control .DatePicker ;
2834import javafx .scene .control .ListCell ;
2935import javafx .scene .control .ListView ;
36+ import javafx .scene .control .Spinner ;
37+ import javafx .scene .control .SpinnerValueFactory ;
3038import javafx .scene .control .TextField ;
3139import javafx .scene .layout .GridPane ;
3240import javafx .util .Callback ;
3341import javafx .util .StringConverter ;
34- import tornadofx . control . DateTimePicker ;
42+ import javafx . util . converter . LocalTimeStringConverter ;
3543
3644public class ManageWorkController {
3745
@@ -43,10 +51,16 @@ public class ManageWorkController {
4351 private GridPane grid ;
4452
4553 @ FXML
46- private DateTimePicker startTimePicker ;
54+ private DatePicker startDatePicker ;
55+
56+ @ FXML
57+ private Spinner <LocalTime > startTimeSpinner ;
4758
4859 @ FXML
49- private DateTimePicker endTimePicker ;
60+ private Spinner <LocalTime > endTimeSpinner ;
61+
62+ @ FXML
63+ private DatePicker endDatePicker ;
5064
5165 @ FXML
5266 private DatePicker creationDatePicker ;
@@ -63,10 +77,85 @@ public void setModel(final Model model) {
6377
6478 public void initializeWith (final Work work ) {
6579 LOG .info ("Setting values." );
66- startTimePicker .setDateTimeValue (work .getStartTime ());
67- startTimePicker .setFormat ("yyyy-MM-dd HH:mm:ss" );
68- endTimePicker .setDateTimeValue (work .getEndTime ());
69- endTimePicker .setFormat ("yyyy-MM-dd HH:mm:ss" );
80+ startDatePicker .setValue (work .getStartTime ().toLocalDate ());
81+ endDatePicker .setValue (work .getEndTime ().toLocalDate ());
82+
83+
84+ startTimeSpinner .getEditor ().textProperty ().addListener ((observable , oldValue , newValue ) -> {
85+ LOG .debug ("textChanged" );
86+ final LocalTimeStringConverter stringConverter = new LocalTimeStringConverter (FormatStyle .MEDIUM );
87+ final StringProperty text = (StringProperty ) observable ;
88+ try {
89+ stringConverter .fromString (newValue );
90+ text .setValue (newValue );
91+ startTimeSpinner .increment (0 ); // TODO find better Solution
92+ } catch (final DateTimeParseException e ) {
93+ text .setValue (oldValue );
94+ }
95+ });
96+
97+ startTimeSpinner .setValueFactory (new SpinnerValueFactory <LocalTime >() {
98+
99+ {
100+ setConverter (new LocalTimeStringConverter (FormatStyle .MEDIUM ));
101+ }
102+
103+ @ Override
104+ public void decrement (final int steps ) {
105+ if (getValue () == null ) {
106+ setValue (LocalTime .now ());
107+ } else {
108+ final LocalTime time = getValue ();
109+ setValue (time .minusMinutes (steps ));
110+ }
111+
112+ }
113+
114+ @ Override
115+ public void increment (final int steps ) {
116+ if (getValue () == null ) {
117+ setValue (LocalTime .now ());
118+ } else {
119+ final LocalTime time = getValue ();
120+ setValue (time .plusMinutes (steps ));
121+ }
122+
123+ }
124+
125+ });
126+ endTimeSpinner .setValueFactory (new SpinnerValueFactory <LocalTime >() {
127+
128+ {
129+ setConverter (new LocalTimeStringConverter (FormatStyle .MEDIUM ));
130+ }
131+
132+ @ Override
133+ public void decrement (final int steps ) {
134+ if (getValue () == null ) {
135+ setValue (LocalTime .now ());
136+ } else {
137+ final LocalTime time = getValue ();
138+ setValue (time .minusMinutes (steps ));
139+ }
140+
141+ }
142+
143+ @ Override
144+ public void increment (final int steps ) {
145+ if (getValue () == null ) {
146+ setValue (LocalTime .now ());
147+ } else {
148+ final LocalTime time = getValue ();
149+ setValue (time .plusMinutes (steps ));
150+ }
151+
152+ }
153+
154+ });
155+
156+ startTimeSpinner .getValueFactory ().setValue (work .getStartTime ().toLocalTime ());
157+ endTimeSpinner .getValueFactory ().setValue (work .getEndTime ().toLocalTime ());
158+
70159 creationDatePicker .setValue (work .getCreationDate ());
71160 noteTextBox .setText (work .getNotes ());
72161 projectComboBox .getItems ().addAll (model .getAvailableProjects ());
@@ -113,9 +202,10 @@ public Project fromString(final String string) {
113202
114203 public Work getWorkFromUserInput () {
115204
116- return new Work (creationDatePicker .getValue (), startTimePicker .getDateTimeValue (),
117- endTimePicker .getDateTimeValue (), projectComboBox .getSelectionModel ().getSelectedItem (),
118- noteTextBox .getText ());
205+ return new Work (creationDatePicker .getValue (),
206+ LocalDateTime .of (startDatePicker .getValue (), startTimeSpinner .getValue ()),
207+ LocalDateTime .of (endDatePicker .getValue (), endTimeSpinner .getValue ()),
208+ projectComboBox .getSelectionModel ().getSelectedItem (), noteTextBox .getText ());
119209 }
120210
121211}
0 commit comments