2424import org .slf4j .Logger ;
2525import org .slf4j .LoggerFactory ;
2626
27+ import com .sun .javafx .scene .control .skin .ComboBoxListViewSkin ;
28+
2729import de .doubleslash .keeptime .common .ColorHelper ;
2830import de .doubleslash .keeptime .common .StyleUtils ;
2931import de .doubleslash .keeptime .model .Model ;
3335import javafx .beans .property .StringProperty ;
3436import javafx .beans .value .ChangeListener ;
3537import javafx .beans .value .ObservableValue ;
38+ import javafx .collections .transformation .FilteredList ;
3639import javafx .fxml .FXML ;
3740import javafx .scene .Node ;
3841import javafx .scene .control .ComboBox ;
3942import javafx .scene .control .DatePicker ;
4043import javafx .scene .control .ListCell ;
44+ import javafx .scene .control .ListView ;
4145import javafx .scene .control .Spinner ;
4246import javafx .scene .control .SpinnerValueFactory ;
4347import javafx .scene .control .TextArea ;
4448import javafx .scene .input .KeyCode ;
49+ import javafx .scene .input .KeyCodeCombination ;
50+ import javafx .scene .input .KeyEvent ;
4551import javafx .scene .layout .GridPane ;
4652import javafx .scene .paint .Color ;
4753import javafx .util .StringConverter ;
@@ -77,9 +83,12 @@ public class ManageWorkController {
7783 private boolean comboChange ;
7884 private Project selectedProject ;
7985
86+ private FilteredList <Project > filteredList ;
87+
8088 public void setModel (final Model model ) {
8189 this .model = model ;
82- projectComboBox .setItems (model .getSortedAvailableProjects ());
90+ filteredList = new FilteredList <>(model .getSortedAvailableProjects ());
91+ projectComboBox .setItems (filteredList );
8392 }
8493
8594 @ FXML
@@ -146,8 +155,11 @@ protected void updateItem(final Project project, final boolean empty) {
146155 if (project == null || empty ) {
147156 setGraphic (null );
148157 } else {
149- setColor (this , project .getColor ());
158+ setColor (this , model .hoverBackgroundColor .get ());
159+
160+ setTextFill (project .getColor ());
150161 setText (project .getName ());
162+
151163 setUnderline (project .isWork ());
152164 }
153165 }
@@ -184,16 +196,17 @@ public Project fromString(final String string) {
184196 comboChange = true ;
185197 // needed to avoid exception on empty textfield https://bugs.openjdk.java.net/browse/JDK-8081700
186198 Platform .runLater (() -> {
187- projectComboBox .getEditor ().selectAll ();
188- setColor (projectComboBox , newValue .getColor ());
199+ setTextColor (projectComboBox .getEditor (), newValue .getColor ());
189200 });
190201 }
191202
192203 );
193204
205+ enableStrgA_combo ();
206+
194207 projectComboBox .getEditor ().textProperty ().addListener (new ChangeListener <String >() {
195208
196- Boolean isValidProject = true ;
209+ boolean isValidProject = true ;
197210
198211 @ Override
199212 public void changed (final ObservableValue <? extends String > observable , final String oldValue ,
@@ -210,14 +223,20 @@ public void changed(final ObservableValue<? extends String> observable, final St
210223 if (isValidProject ) {
211224 isValidProject = false ;
212225 projectComboBox .getSelectionModel ().clearSelection ();
226+ // needed to avoid exception on empty textfield https://bugs.openjdk.java.net/browse/JDK-8081700
227+ Platform .runLater (() -> {
228+ setTextColor (projectComboBox .getEditor (), model .hoverFontColor .get ());
229+ });
213230 }
214231
215232 // needed to avoid exception on empty textfield https://bugs.openjdk.java.net/browse/JDK-8081700
216233 Platform .runLater (() -> {
217234 projectComboBox .hide ();
218- projectComboBox
219- .setItems (model .getSortedAvailableProjects ().filtered (project -> ProjectsListViewController
220- .doesProjectMatchSearchFilter (projectComboBox .getEditor ().getText (), project )));
235+
236+ final String searchText = projectComboBox .getEditor ().getText ();
237+ filteredList .setPredicate (
238+ project -> ProjectsListViewController .doesProjectMatchSearchFilter (searchText , project ));
239+
221240 if (projectComboBox .getEditor ().focusedProperty ().get ()) {
222241 projectComboBox .show ();
223242 }
@@ -266,8 +285,33 @@ public void initializeWith(final Work work) {
266285
267286 projectComboBox .getSelectionModel ().select (work .getProject ());
268287
269- setColor (projectComboBox , work .getProject ().getColor ());
288+ setColor (projectComboBox , model .hoverBackgroundColor .get ());
289+ setColor (projectComboBox .getEditor (), model .hoverBackgroundColor .get ());
270290
291+ setTextColor (projectComboBox .getEditor (), model .hoverFontColor .get ());
292+ }
293+
294+ public Work getWorkFromUserInput () {
295+ return new Work (startDatePicker .getValue (),
296+ LocalDateTime .of (startDatePicker .getValue (), startTimeSpinner .getValue ()),
297+ LocalDateTime .of (endDatePicker .getValue (), endTimeSpinner .getValue ()), selectedProject ,
298+ noteTextArea .getText ());
299+ }
300+
301+ private void enableStrgA_combo () {
302+ // strg+a Behaviour bug hack
303+ // https://stackoverflow.com/questions/51943654/javafx-combobox-make-control-a-select-all-in-text-box-while-dropdown-is-visi
304+ projectComboBox .setOnShown (e -> {
305+ final ComboBoxListViewSkin <?> skin = (ComboBoxListViewSkin <?>) projectComboBox .getSkin ();
306+ final ListView <?> list = (ListView <?>) skin .getPopupContent ();
307+ final KeyCodeCombination ctrlA = new KeyCodeCombination (KeyCode .A , KeyCodeCombination .CONTROL_DOWN );
308+ list .addEventFilter (KeyEvent .KEY_PRESSED , keyEvent -> {
309+ if (ctrlA .match (keyEvent )) {
310+ projectComboBox .getEditor ().selectAll ();
311+ }
312+ });
313+ projectComboBox .setOnShown (null );
314+ });
271315 }
272316
273317 private void setColor (final Node object , final Color color ) {
@@ -276,12 +320,10 @@ private void setColor(final Node object, final Color color) {
276320 object .setStyle (style );
277321 }
278322
279- public Work getWorkFromUserInput () {
280-
281- return new Work (startDatePicker .getValue (),
282- LocalDateTime .of (startDatePicker .getValue (), startTimeSpinner .getValue ()),
283- LocalDateTime .of (endDatePicker .getValue (), endTimeSpinner .getValue ()), selectedProject ,
284- noteTextArea .getText ());
323+ private void setTextColor (final Node object , final Color color ) {
324+ final String style = StyleUtils .changeStyleAttribute (object .getStyle (), "fx-text-fill" ,
325+ "rgba(" + ColorHelper .colorToCssRgba (color ) + ")" );
326+ object .setStyle (style );
285327 }
286328
287329}
0 commit comments