Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package de.doubleslash.keeptime.common;

import java.util.function.Predicate;

import de.doubleslash.keeptime.model.Project;

public class DoesProjectMatchSearchFilterPredicate implements Predicate<Project> {

private final String searchText;

public DoesProjectMatchSearchFilterPredicate(final String searchText) {
this.searchText = searchText;
}

@Override
public boolean test(final Project project) {
// If filter text is empty, display all data.
if (searchText == null || searchText.isEmpty()) {
return true;
}

final String lowerCaseFilter = searchText.toLowerCase();

if (project.getName().toLowerCase().contains(lowerCaseFilter)
|| project.getDescription().toLowerCase().contains(lowerCaseFilter)) {
return true;
}

return false;
}
}
197 changes: 5 additions & 192 deletions src/main/java/de/doubleslash/keeptime/view/ManageWorkController.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,33 +24,16 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.sun.javafx.scene.control.skin.ComboBoxListViewSkin;

import de.doubleslash.keeptime.common.ColorHelper;
import de.doubleslash.keeptime.common.StyleUtils;
import de.doubleslash.keeptime.model.Model;
import de.doubleslash.keeptime.model.Project;
import de.doubleslash.keeptime.model.Work;
import javafx.application.Platform;
import de.doubleslash.keeptime.view.common.SearchableProjectCombobox;
import javafx.beans.property.StringProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.transformation.FilteredList;
import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.control.ComboBox;
import javafx.scene.control.DatePicker;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.control.Spinner;
import javafx.scene.control.SpinnerValueFactory;
import javafx.scene.control.TextArea;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyCodeCombination;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.GridPane;
import javafx.scene.paint.Color;
import javafx.util.StringConverter;
import javafx.util.converter.LocalTimeStringConverter;

public class ManageWorkController {
Expand Down Expand Up @@ -78,17 +61,11 @@ public class ManageWorkController {
private TextArea noteTextArea;

@FXML
private ComboBox<Project> projectComboBox;

private boolean comboChange;
private Project selectedProject;

private FilteredList<Project> filteredList;
private SearchableProjectCombobox projectComboBox;

public void setModel(final Model model) {
this.model = model;
filteredList = new FilteredList<>(model.getSortedAvailableProjects());
projectComboBox.setItems(filteredList);
projectComboBox.setProjects(model.getSortedAvailableProjects());
}

@FXML
Expand All @@ -98,9 +75,6 @@ private void initialize() {

setUpTimeSpinner(endTimeSpinner);

setProjectUpComboBox();

Platform.runLater(() -> projectComboBox.requestFocus());
}

private void setUpTimeSpinner(final Spinner<LocalTime> spinner) {
Expand Down Expand Up @@ -146,136 +120,9 @@ public void increment(final int steps) {

}

private void setProjectUpComboBox() {
// color Dropdown Options
projectComboBox.setCellFactory(listView -> new ListCell<Project>() {

@Override
protected void updateItem(final Project project, final boolean empty) {
super.updateItem(project, empty);
if (project == null || empty) {
setGraphic(null);
} else {
setColor(this, model.hoverBackgroundColor.get());

setTextFill(project.getColor());
setText(project.getName());

setUnderline(project.isWork());
}
}
});

// set text of selected value
projectComboBox.setConverter(new StringConverter<Project>() {
@Override
public String toString(final Project project) {
if (project == null) {
return null;
} else {
return project.getName();
}
}

@Override
public Project fromString(final String string) {
// ignores String and gets selected Value of ComboBox
return projectComboBox.getValue();
}
});

// needs to set again because editable is ignored from fxml because of custom preselection of current Project
projectComboBox.setEditable(true);

projectComboBox.valueProperty().addListener(
(final ObservableValue<? extends Project> observable, final Project oldValue, final Project newValue) -> {
if (newValue == null) {
return;
}

selectedProject = newValue;
comboChange = true;
// needed to avoid exception on empty textfield https://bugs.openjdk.java.net/browse/JDK-8081700
Platform.runLater(() -> {
setTextColor(projectComboBox.getEditor(), newValue.getColor());
});
}

);

enableStrgA_combo();

projectComboBox.getEditor().textProperty().addListener(new ChangeListener<String>() {

boolean isValidProject = true;

@Override
public void changed(final ObservableValue<? extends String> observable, final String oldValue,
final String newValue) {

// ignore selectionChanges
if (comboChange) {
comboChange = false;
isValidProject = true;
return;
}

// is necessary to not autoselect same Project if Project was selected
if (isValidProject) {
isValidProject = false;
projectComboBox.getSelectionModel().clearSelection();
// needed to avoid exception on empty textfield https://bugs.openjdk.java.net/browse/JDK-8081700
Platform.runLater(() -> {
setTextColor(projectComboBox.getEditor(), model.hoverFontColor.get());
});
}

// needed to avoid exception on empty textfield https://bugs.openjdk.java.net/browse/JDK-8081700
Platform.runLater(() -> {
projectComboBox.hide();

final String searchText = projectComboBox.getEditor().getText();
filteredList.setPredicate(
project -> ProjectsListViewController.doesProjectMatchSearchFilter(searchText, project));

if (projectComboBox.getEditor().focusedProperty().get()) {
projectComboBox.show();
}

});

}
});

// manages Focusbehaviour
projectComboBox.getEditor().focusedProperty().addListener((final ObservableValue<? extends Boolean> observable,
final Boolean oldIsFocused, final Boolean newIsFocused) -> {
if (newIsFocused) {
// needed to avoid exception on empty textfield https://bugs.openjdk.java.net/browse/JDK-8081700
Platform.runLater(() -> projectComboBox.getEditor().selectAll());
} else {
// needed to avoid exception on empty textfield https://bugs.openjdk.java.net/browse/JDK-8081700
Platform.runLater(() -> projectComboBox.hide());
}

});

// on
projectComboBox.setOnKeyReleased(ke -> {
if (ke.getCode() == KeyCode.ENTER && projectComboBox.getSelectionModel().isEmpty()) {
if (!projectComboBox.getItems().isEmpty()) {
projectComboBox.getSelectionModel().selectFirst();
comboChange = true;
}
}

});

}

public void initializeWith(final Work work) {
LOG.info("Setting values.");
selectedProject = work.getProject();
projectComboBox.setProject(work.getProject(), model.hoverBackgroundColor.get(), model.hoverFontColor.get());
startDatePicker.setValue(work.getStartTime().toLocalDate());
endDatePicker.setValue(work.getEndTime().toLocalDate());

Expand All @@ -284,47 +131,13 @@ public void initializeWith(final Work work) {

noteTextArea.setText(work.getNotes());

projectComboBox.getSelectionModel().select(work.getProject());

setColor(projectComboBox, model.hoverBackgroundColor.get());
setColor(projectComboBox.getEditor(), model.hoverBackgroundColor.get());

setTextColor(projectComboBox.getEditor(), model.hoverFontColor.get());
}

public Work getWorkFromUserInput() {
return new Work(startDatePicker.getValue(),
LocalDateTime.of(startDatePicker.getValue(), startTimeSpinner.getValue()),
LocalDateTime.of(endDatePicker.getValue(), endTimeSpinner.getValue()), selectedProject,
LocalDateTime.of(endDatePicker.getValue(), endTimeSpinner.getValue()), projectComboBox.getValue(),
noteTextArea.getText());
}

private void enableStrgA_combo() {
// strg+a Behaviour bug hack
// https://stackoverflow.com/questions/51943654/javafx-combobox-make-control-a-select-all-in-text-box-while-dropdown-is-visi
projectComboBox.setOnShown(e -> {
final ComboBoxListViewSkin<?> skin = (ComboBoxListViewSkin<?>) projectComboBox.getSkin();
final ListView<?> list = (ListView<?>) skin.getPopupContent();
final KeyCodeCombination ctrlA = new KeyCodeCombination(KeyCode.A, KeyCodeCombination.CONTROL_DOWN);
list.addEventFilter(KeyEvent.KEY_PRESSED, keyEvent -> {
if (ctrlA.match(keyEvent)) {
projectComboBox.getEditor().selectAll();
}
});
projectComboBox.setOnShown(null);
});
}

private void setColor(final Node object, final Color color) {
final String style = StyleUtils.changeStyleAttribute(object.getStyle(), "fx-background-color",
"rgba(" + ColorHelper.colorToCssRgba(color) + ")");
object.setStyle(style);
}

private void setTextColor(final Node object, final Color color) {
final String style = StyleUtils.changeStyleAttribute(object.getStyle(), "fx-text-fill",
"rgba(" + ColorHelper.colorToCssRgba(color) + ")");
object.setStyle(style);
}

}
Loading