Archived
0

implement autocomplete system name

This commit is contained in:
iMoHax
2015-08-05 16:07:10 +03:00
parent ac7425c492
commit 70ea0182ce
5 changed files with 188 additions and 0 deletions

View File

@@ -87,6 +87,14 @@ public class MarketModel {
return systemsList;
}
public SystemModel get(String name){
Place s = market.get(name);
if (s == null){
return ModelFabric.NONE_SYSTEM;
}
return modeler.get(s);
}
public SystemModel add(String name, double x, double y, double z) {
SystemModel system = modeler.get(market.addPlace(name, x, y, z));
LOG.info("Add system {} to market {}", system, this);

View File

@@ -0,0 +1,44 @@
package ru.trader.view.support.autocomplete;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
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 final ObjectProperty<T> completion = new SimpleObjectProperty<>();
private final StringConverter<T> converter;
private final AutoCompletionBinding<T> binding;
public AutoCompletion(final TextField textField, final Callback<AutoCompletionBinding.ISuggestionRequest, Collection<T>> suggestionProvider, final StringConverter<T> converter) {
this.converter = converter;
binding = TextFields.bindAutoCompletion(textField, suggestionProvider, converter);
binding.setOnAutoCompleted(e -> completion.setValue(e.getCompletion()));
}
public AutoCompletionBinding<T> getBinding() {
return binding;
}
public T getCompletion() {
return completion.get();
}
public ObjectProperty<T> completionProperty() {
return completion;
}
public void dispose(){
binding.dispose();
}
public void setValue(T value) {
completion.setValue(value);
((TextField)binding.getCompletionTarget()).setText(converter.toString(value));
}
}

View File

@@ -0,0 +1,77 @@
package ru.trader.view.support.autocomplete;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;
import javafx.util.Callback;
import org.controlsfx.control.textfield.AutoCompletionBinding;
import java.util.*;
import java.util.concurrent.locks.ReentrantLock;
public abstract class CachedSuggestionProvider<T> implements Callback<AutoCompletionBinding.ISuggestionRequest, Collection<T>> {
private final List<T> cache = new ArrayList<>();
private final ReentrantLock lock = new ReentrantLock();
private final ObservableList<T> possibleSuggestions;
private AutoCompletionBinding.ISuggestionRequest lastRequest;
protected CachedSuggestionProvider(ObservableList<T> possibleSuggestions) {
this.possibleSuggestions = possibleSuggestions;
possibleSuggestions.addListener(listChangeListener);
}
@Override
public final Collection<T> call(final AutoCompletionBinding.ISuggestionRequest request) {
List<T> suggestions = new ArrayList<>();
if(!request.getUserText().isEmpty()){
lock.lock();
try {
boolean cached = lastRequest != null && isContinue(lastRequest, request);
if (!cached){
cache.clear();
for (T possibleSuggestion : possibleSuggestions) {
if (isMatch(possibleSuggestion, request)) {
cache.add(possibleSuggestion);
}
}
Collections.sort(cache, getComparator());
} else {
Iterator<T> iterator = cache.iterator();
while (iterator.hasNext()) {
T possibleSuggestion = iterator.next();
if (!isMatch(possibleSuggestion, request)) {
iterator.remove();
}
}
}
suggestions.addAll(cache);
lastRequest = request;
} finally {
lock.unlock();
}
}
return suggestions;
}
protected boolean isContinue(final AutoCompletionBinding.ISuggestionRequest lastRequest, final AutoCompletionBinding.ISuggestionRequest request){
String last = lastRequest.getUserText();
String current = request.getUserText();
return last != null && current != null && current.toLowerCase().startsWith(last.toLowerCase());
}
protected abstract Comparator<T> getComparator();
protected abstract boolean isMatch(T suggestion, AutoCompletionBinding.ISuggestionRequest request);
public void dispose(){
possibleSuggestions.removeListener(listChangeListener);
}
private final ListChangeListener<T> listChangeListener = c -> {
lock.lock();
try {
lastRequest = null;
} finally {
lock.unlock();
}
};
}

View File

@@ -0,0 +1,36 @@
package ru.trader.view.support.autocomplete;
import javafx.util.StringConverter;
import org.controlsfx.control.textfield.AutoCompletionBinding;
import ru.trader.model.MarketModel;
import ru.trader.model.SystemModel;
import java.util.Comparator;
public class SystemsProvider extends CachedSuggestionProvider<SystemModel> {
private final StringConverter<SystemModel> converter;
private final Comparator<SystemModel> comparator;
public SystemsProvider(MarketModel market) {
super(market.systemsProperty());
converter = new SystemsStringConverter(market);
comparator = (s1, s2) -> converter.toString(s1).toLowerCase().compareTo(converter.toString(s2).toLowerCase());
}
@Override
protected Comparator<SystemModel> getComparator() {
return comparator;
}
@Override
protected boolean isMatch(SystemModel suggestion, AutoCompletionBinding.ISuggestionRequest request) {
String s = converter.toString(suggestion).toLowerCase();
return s.contains(request.getUserText().toLowerCase());
}
public StringConverter<SystemModel> getConverter() {
return converter;
}
}

View File

@@ -0,0 +1,23 @@
package ru.trader.view.support.autocomplete;
import javafx.util.StringConverter;
import ru.trader.model.MarketModel;
import ru.trader.model.SystemModel;
public class SystemsStringConverter extends StringConverter<SystemModel> {
private final MarketModel market;
public SystemsStringConverter(MarketModel market) {
this.market = market;
}
@Override
public String toString(SystemModel system) {
return system.getName();
}
@Override
public SystemModel fromString(String name) {
return market.get(name);
}
}