/*
* 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.selection;
import com.google.common.base.Ascii;
import de.ks.activity.executor.ActivityExecutor;
import de.ks.executor.JavaFXExecutorService;
import de.ks.i18n.Localized;
import de.ks.persistence.PersistentWork;
import de.ks.persistence.entity.NamedPersistentObject;
import de.ks.reflection.PropertyPath;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.input.KeyCode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.persistence.criteria.Predicate;
import java.net.URL;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;
import java.util.concurrent.CompletableFuture;
public class NamedPersistentObjectSelection<T extends NamedPersistentObject<T>> extends BaseNamedPersistentObjectSelection<T> {
private static final Logger log = LoggerFactory.getLogger(NamedPersistentObjectSelection.class);
protected TableView<T> tableView;
protected boolean hideOnSingleClick = false;
@Override
public void initialize(URL location, ResourceBundle resources) {
super.initialize(location, resources);
tableView = new TableView<>();
TableColumn<T, String> column = new TableColumn<>(Localized.get("name"));
column.setCellValueFactory(param -> {
T value = param.getValue();
return new SimpleStringProperty(value.getName());
});
column.prefWidthProperty().bind(tableView.widthProperty());
tableView.getColumns().add(column);
tableView.setItems(FXCollections.observableArrayList());
tableView.setOnMouseClicked((event) -> {
if (hideOnSingleClick || event.getClickCount() > 1) {
hidePopup();
}
});
tableView.setOnKeyTyped((event) -> {
String character = event.getCharacter();
KeyCode code = event.getCode();
String esc = String.valueOf((char) Ascii.ESC);
if (code == KeyCode.ENTER || code == KeyCode.ESCAPE || character.equals("\n") || character.equals("\r") || character.equals(esc)) {
hidePopup();
}
});
tableView.getSelectionModel().selectedItemProperty().addListener((p, o, n) -> {
if (n != null) {
selectedValue.set(n);
}
});
}
@FXML
protected void showBrowser() {
ActivityExecutor executorService = controller.getExecutorService();
JavaFXExecutorService javaFXExecutor = controller.getJavaFXExecutor();
CompletableFuture.supplyAsync(this::readEntities, executorService)//
.thenAcceptAsync(this::setTableItems, javaFXExecutor);
super.showBrowser();
tableView.requestFocus();
}
private void setTableItems(List<T> newItems) {
this.tableView.getItems().clear();
this.tableView.getItems().addAll(newItems);
}
protected List<T> readEntities() {
String nameProperty = PropertyPath.property(NamedPersistentObject.class, (o) -> o.getName());
String name = (input.textProperty().getValueSafe() + "%")//
.replaceAll("\\*", "%")//
.replaceAll("\\?", "_")//
.toLowerCase(Locale.getDefault());
return PersistentWork.from(entityClass, (root, query, builder) -> {
Predicate like = builder.like(builder.lower(root.get(nameProperty)), name);
if (filter != null) {
filter.accept(root, query, builder);
query.where(query.getRestriction(), like);
} else {
query.where(like);
}
}, null);
}
@Override
protected Node getBrowseNode() {
return tableView;
}
public boolean isHideOnSingleClick() {
return hideOnSingleClick;
}
public void setHideOnSingleClick(boolean hideOnSingleClick) {
this.hideOnSingleClick = hideOnSingleClick;
}
}