package com.mattc.autotyper.gui.fx;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import com.mattc.autotyper.util.JPredicates;
import java.util.stream.Collectors;
/**
* Needs Documentation
*
* @author Matthew Crocco
* Created on 4/25/15
*/
public final class AutoCompleteUtils {
private AutoCompleteUtils() {
throw new AssertionError();
}
public static ObservableList<String> selectCompletionCandidates(final ObservableList<String> data, String base, boolean sort) {
if (base.isEmpty())
return FXCollections.observableArrayList(data);
ObservableList<StringWrapper> wrappers = FXCollections.observableArrayList();
final ObservableList<String> candidates = FXCollections.observableArrayList();
for (final String s : data) {
wrappers.add(new StringWrapper(s));
}
wrappers = selectCompletionCandidates(wrappers, new StringWrapper(base), sort);
for (final StringWrapper wrapper : wrappers) {
candidates.add(wrapper.toString());
}
return candidates;
}
public static <T extends AutoCompleteObject<T>> ObservableList<T> selectCompletionCandidates(final ObservableList<T> data, final T base, final boolean sort) {
final ObservableList<T> candidates = data.stream()
.filter(JPredicates.and(JPredicates.isNotNull(), base::isValidCandidate))
.collect(Collectors.toCollection(FXCollections::observableArrayList));
if (sort)
FXCollections.sort(candidates, AutoCompleteObject::compareTo);
return candidates;
}
private static class StringWrapper implements AutoCompleteObject<StringWrapper> {
private final String str;
private final String compStr;
private StringWrapper(String str) {
this.str = str;
this.compStr = str.toLowerCase();
}
@Override
public boolean isValidCandidate(StringWrapper base) {
return base.compStr.contains(this.compStr);
}
@Override
public int compareTo(StringWrapper other) {
return this.str.compareTo(other.str);
}
@Override
public String toString() {
return this.str;
}
}
}