package com.wilutions.fx.util; import java.util.Collection; import com.wilutions.itol.db.Suggest; import javafx.collections.FXCollections; import javafx.geometry.Bounds; import javafx.scene.Node; import javafx.scene.control.ListView; import javafx.scene.input.KeyCode; import javafx.stage.Popup; public class PopupForSuggestions<T> extends Popup { public final static int NB_OF_SUGGESTIONS = 10; private ListView<T> lvSuggestions = new ListView<T>(); private Suggest<T> suggest; private ItemSelected<T> itemSelected; private Node owner; public interface ItemSelected<T> { public void OnItemSelected(T item); } public PopupForSuggestions(Node owner, Suggest<T> suggest, ItemSelected<T> itemSelected) { this.owner = owner; this.suggest = suggest; this.itemSelected = itemSelected; setAutoHide( true ); setHideOnEscape( true ); setAutoFix( true ); getContent().add(lvSuggestions); lvSuggestions.setOnKeyPressed((keyEvent) -> { KeyCode code = keyEvent.getCode(); switch (code) { case TAB: case ENTER: processSelectedItem(); keyEvent.consume(); break; case ESCAPE: hide(); keyEvent.consume(); break; default: } }); lvSuggestions.setOnMouseClicked((event) -> { if (event.getClickCount() == 2) { processSelectedItem(); } }); } public void processSelectedItem() { T item = lvSuggestions.getSelectionModel().getSelectedItem(); if (item != null) { this.itemSelected.OnItemSelected(item); hide(); } } public void updateSuggestions(String filter) { Collection<T> suggestions = suggest.find(filter, NB_OF_SUGGESTIONS, null); lvSuggestions.setItems(FXCollections.observableArrayList(suggestions)); if (suggestions.isEmpty()) { if (isShowing()) hide(); } else { Bounds bounds = owner.getBoundsInLocal(); Bounds screenBounds = owner.localToScreen(bounds); double anchorX = screenBounds.getMinX(); double anchorY = screenBounds.getMaxY(); double width = bounds.getWidth()-4; lvSuggestions.setMinWidth(width); lvSuggestions.setMaxWidth(width); lvSuggestions.setPrefWidth(width); int n = suggestions.size(); double height = 24 * n - (n-2); //lvSuggestions.setMinHeight(height); //lvSuggestions.setMaxHeight(height); lvSuggestions.setPrefHeight(height); lvSuggestions.requestLayout(); lvSuggestions.getSelectionModel().select(0); if (!isShowing()) { show(owner, anchorX, anchorY); } } } }