/* * Copyright [2014] [Christian Loehnert, krampenschiesser@gmail.com] * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package de.ks.idnadrev.task.view; import de.ks.BaseController; import de.ks.idnadrev.entity.Task; import de.ks.idnadrev.entity.TaskState; import de.ks.javafx.event.ChainedEventHandler; import de.ks.javafx.event.ClearTextOnEscape; import de.ks.persistence.PersistentWork; import de.ks.reflection.PropertyPath; import de.ks.selection.NamedPersistentObjectSelection; import javafx.fxml.FXML; import javafx.scene.control.CheckBox; import javafx.scene.control.TextField; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; import javax.persistence.criteria.Path; import javax.persistence.criteria.Predicate; import java.net.URL; import java.util.ArrayList; import java.util.ResourceBundle; public class TaskFilterView extends BaseController<Void> { @FXML protected TextField description; @FXML protected NamedPersistentObjectSelection<Task> parentProjectController; @FXML protected CheckBox showAsap; @FXML protected CheckBox showDefault; @FXML protected CheckBox showLater; @FXML protected CheckBox showDelegated; @FXML protected CheckBox showFinished; @Override public void initialize(URL location, ResourceBundle resources) { ChainedEventHandler<KeyEvent> clearOrHide = new ChainedEventHandler<>(new ClearTextOnEscape(), e -> { if (e.getCode() == KeyCode.ESCAPE) { description.getScene().getWindow().hide(); } }); description.setOnKeyReleased(clearOrHide); parentProjectController.getInput().setOnKeyReleased(clearOrHide); String projectKey = PropertyPath.property(Task.class, (t) -> t.isProject()); parentProjectController.from(Task.class, (root, query, builder) -> { query.where(builder.isTrue(root.get(projectKey))); }).enableValidation(); parentProjectController.hideBrowserBtn(); parentProjectController.selectedValueProperty().addListener((p, o, n) -> triggerFilter()); parentProjectController.getInput().textProperty().addListener((p, o, n) -> triggerFilter()); description.textProperty().addListener((p, o, n) -> triggerFilter()); showAsap.selectedProperty().addListener((p, o, n) -> triggerFilter()); showLater.selectedProperty().addListener((p, o, n) -> triggerFilter()); showDelegated.selectedProperty().addListener((p, o, n) -> triggerFilter()); showFinished.selectedProperty().addListener((p, o, n) -> triggerFilter()); showDefault.selectedProperty().addListener((p, o, n) -> triggerFilter()); } public boolean needsToKeepFocus() { return parentProjectController.isSelectingProject(); } private void triggerFilter() { controller.reload(); } public void applyFilterOnDS(ViewTasksDS datasource) { datasource.setFilter((root, query, builder) -> { ArrayList<Predicate> predicates = new ArrayList<>(); String descriptionText = description.textProperty().getValueSafe().trim(); if (!descriptionText.isEmpty()) { Path<String> desc = root.get(PropertyPath.property(Task.class, t -> t.getDescription())); Predicate like = builder.like(builder.lower(desc), "%" + descriptionText + "%"); predicates.add(like); } Path<String> statePath = root.get(PropertyPath.property(Task.class, t -> t.getState())); ArrayList<Predicate> stateOrCombination = new ArrayList<>(); if (showDefault.isSelected()) { stateOrCombination.add(builder.equal(statePath, TaskState.NONE)); } if (showAsap.isSelected()) { stateOrCombination.add(builder.equal(statePath, TaskState.ASAP)); } if (showLater.isSelected()) { stateOrCombination.add(builder.equal(statePath, TaskState.LATER)); } if (showDelegated.isSelected()) { stateOrCombination.add(builder.equal(statePath, TaskState.DELEGATED)); } Predicate or = builder.or(stateOrCombination.toArray(new Predicate[stateOrCombination.size()])); predicates.add(or); String finishTime = PropertyPath.property(Task.class, (t) -> t.getFinishTime()); if (!showFinished.isSelected()) { predicates.add(root.get(finishTime).isNull()); } if (parentProjectController.getSelectedValue() != null) { Predicate parentNotNull = root.get(PropertyPath.property(Task.class, t -> t.getParent())).isNotNull(); Predicate isParent = builder.equal(root.get("id"), parentProjectController.getSelectedValue().getId()); predicates.add(builder.or(parentNotNull, isParent)); } query.where(predicates.toArray(new Predicate[predicates.size()])); }); } public Task getParentTask() { String parentProjectName = parentProjectController.getInput().textProperty().getValueSafe().trim(); if (parentProjectController.getSelectedValue() == null && !parentProjectName.isEmpty()) { return PersistentWork.forName(Task.class, parentProjectName); } return parentProjectController.getSelectedValue(); } }