Archived
0

set not found on change autocomplete

This commit is contained in:
iMoHax
2015-09-11 15:51:18 +03:00
parent cd59440ae2
commit 27a11554f4
3 changed files with 78 additions and 18 deletions

View File

@@ -7,10 +7,7 @@ import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.TextField;
import ru.trader.model.ItemModel;
import ru.trader.model.MarketModel;
import ru.trader.model.MissionModel;
import ru.trader.model.StationModel;
import ru.trader.model.*;
import ru.trader.view.support.NumberField;
import ru.trader.view.support.autocomplete.AutoCompletion;
import ru.trader.view.support.autocomplete.StationsProvider;
@@ -56,9 +53,9 @@ public class MissionsController {
private void initialize(){
MarketModel world = MainController.getWorld();
StationsProvider provider = new StationsProvider(world);
receiver = new AutoCompletion<>(receiverText, provider, provider.getConverter());
receiver = new AutoCompletion<>(receiverText, provider, ModelFabric.NONE_STATION, provider.getConverter());
provider = new StationsProvider(world);
buyer = new AutoCompletion<>(buyerText, provider, provider.getConverter());
buyer = new AutoCompletion<>(buyerText, provider, ModelFabric.NONE_STATION, provider.getConverter());
item.setItems(world.itemsProperty());
addCourierBtn.disableProperty().bind(Bindings.createBooleanBinding(() -> receiver.getCompletion() == null, receiver.completionProperty())
.or(courierProfit.wrongProperty())

View File

@@ -9,10 +9,7 @@ import javafx.scene.control.ComboBox;
import javafx.scene.control.TextField;
import javafx.util.StringConverter;
import ru.trader.core.Engine;
import ru.trader.model.MarketModel;
import ru.trader.model.ProfileModel;
import ru.trader.model.StationModel;
import ru.trader.model.SystemModel;
import ru.trader.model.*;
import ru.trader.view.support.NumberField;
import ru.trader.view.support.ViewUtils;
import ru.trader.view.support.autocomplete.AutoCompletion;
@@ -52,7 +49,7 @@ public class ProfileController {
profile = MainController.getProfile();
MarketModel world = MainController.getWorld();
SystemsProvider provider = new SystemsProvider(world);
system = new AutoCompletion<>(systemText, provider, provider.getConverter());
system = new AutoCompletion<>(systemText, provider, ModelFabric.NONE_SYSTEM, provider.getConverter());
engine.setItems(FXCollections.observableList(Engine.getEngines()));
engine.setConverter(new EngineStringConverter());
btnAddSystem.setOnAction(e -> Screeners.showSystemsEditor(null));
@@ -71,9 +68,9 @@ public class ProfileController {
});
system.completionProperty().addListener((ov, o , n) -> {
if (!ignoreChanges){
ignoreChanges = true;
profile.setSystem(n);
}
ignoreChanges = true;
station.setItems(n.getStationsList());
ignoreChanges = false;
});
@@ -142,7 +139,10 @@ public class ProfileController {
private final ChangeListener<String> nameListener = (ov, o, n) -> ViewUtils.doFX(() -> name.setText(n));
private final ChangeListener<Number> balanceListener = (ov, o, n) -> ViewUtils.doFX(() -> balance.setValue(n));
private final ChangeListener<SystemModel> systemListener = (ov, o, n) -> ViewUtils.doFX(() -> system.setValue(n));
private final ChangeListener<SystemModel> systemListener = (ov, o, n) -> {
if (!ignoreChanges)
ViewUtils.doFX(() -> system.setValue(n));
};
private final ChangeListener<StationModel> stationListener = (ov, o, n) -> ViewUtils.doFX(() -> station.setValue(n));
private final ChangeListener<Number> massListener = (ov, o, n) -> ViewUtils.doFX(() -> mass.setValue(n));
private final ChangeListener<Number> tankListener = (ov, o, n) -> ViewUtils.doFX(() -> tank.setValue(n));

View File

@@ -2,22 +2,40 @@ package ru.trader.view.support.autocomplete;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.value.ChangeListener;
import javafx.scene.control.TextField;
import javafx.util.Callback;
import javafx.util.StringConverter;
import org.controlsfx.control.textfield.AutoCompletionBinding;
import org.controlsfx.control.textfield.TextFields;
import java.util.Collection;
public class AutoCompletion<T> {
private static <T> StringConverter<T> defaultStringConverter() {
return new StringConverter<T>() {
@Override public String toString(T t) {
return t == null ? null : t.toString();
}
@SuppressWarnings("unchecked")
@Override public T fromString(String string) {
return (T) string;
}
};
}
private final ObjectProperty<T> completion = new SimpleObjectProperty<>();
private final StringConverter<T> converter;
private final AutoCompletionBinding<T> binding;
private final AutoTextFieldBinding binding;
private final T notFoundItem;
public AutoCompletion(final TextField textField, final Callback<AutoCompletionBinding.ISuggestionRequest, Collection<T>> suggestionProvider, final StringConverter<T> converter) {
public AutoCompletion(final TextField textField, final Callback<AutoCompletionBinding.ISuggestionRequest, Collection<T>> suggestionProvider) {
this(textField, suggestionProvider, null, defaultStringConverter());
}
public AutoCompletion(final TextField textField, final Callback<AutoCompletionBinding.ISuggestionRequest, Collection<T>> suggestionProvider, T notFoundItem, final StringConverter<T> converter) {
this.converter = converter;
binding = TextFields.bindAutoCompletion(textField, suggestionProvider, converter);
this.notFoundItem = notFoundItem;
binding = new AutoTextFieldBinding(textField, suggestionProvider);
binding.setOnAutoCompleted(e -> completion.setValue(e.getCompletion()));
}
@@ -29,6 +47,10 @@ public class AutoCompletion<T> {
return completion.get();
}
public TextField getCompletionTarget(){
return binding.getCompletionTarget();
}
public ObjectProperty<T> completionProperty() {
return completion;
}
@@ -39,6 +61,47 @@ public class AutoCompletion<T> {
public void setValue(T value) {
completion.setValue(value);
((TextField)binding.getCompletionTarget()).setText(converter.toString(value));
binding.completeUserInput(value);
}
private class AutoTextFieldBinding extends AutoCompletionBinding<T>{
public AutoTextFieldBinding(final TextField textField,
Callback<ISuggestionRequest, Collection<T>> suggestionProvider) {
super(textField, suggestionProvider, converter);
getCompletionTarget().textProperty().addListener(textChangeListener);
getCompletionTarget().focusedProperty().addListener(focusChangedListener);
}
/** {@inheritDoc} */
@Override public TextField getCompletionTarget(){
return (TextField)super.getCompletionTarget();
}
/** {@inheritDoc} */
@Override public void dispose(){
getCompletionTarget().textProperty().removeListener(textChangeListener);
getCompletionTarget().focusedProperty().removeListener(focusChangedListener);
}
/** {@inheritDoc} */
@Override protected void completeUserInput(T completion){
String newText = converter.toString(completion);
getCompletionTarget().setText(newText);
getCompletionTarget().positionCaret(newText.length());
}
private final ChangeListener<String> textChangeListener = (obs, oldText, newText) -> {
if (getCompletionTarget().isFocused()) {
setUserInput(newText);
completion.setValue(notFoundItem);
}
};
private final ChangeListener<Boolean> focusChangedListener = (obs, oldFocused, newFocused) -> {
if(newFocused == false)
hidePopup();
};
}
}