package net.bitpot.railways.models;
import org.jetbrains.annotations.NotNull;
import java.util.Collections;
/**
* Class that contains all parameters of routes filtration.
*/
public class RoutesFilter {
private RouteTableModel model;
private String pathFilter;
private boolean mountedRoutesVisible;
public RoutesFilter(@NotNull RouteTableModel parent) {
model = parent;
reset();
}
public void reset() {
pathFilter = "";
mountedRoutesVisible = true;
}
public String getPathFilter() {
return pathFilter;
}
public void setPathFilter(String pathFilter) {
pathFilter = pathFilter.toLowerCase();
if (!this.pathFilter.equals(pathFilter)) {
this.pathFilter = pathFilter;
filterChanged();
}
}
public boolean isMountedRoutesVisible() {
return mountedRoutesVisible;
}
public void setMountedRoutesVisible(boolean value) {
if (mountedRoutesVisible != value) {
mountedRoutesVisible = value;
filterChanged();
}
}
/**
* Returns true if any filter is set and should be applied.
* Actually checks if filter values are set to defaults or not.
*
* @return True when any filter is active, false otherwise.
*/
public boolean isFilterActive() {
return !pathFilter.equals("") || !mountedRoutesVisible;
}
/**
* Applies current filter and fills target route list with suitable elements.
*
* @param source Source route list
* @param target Target route list.
*/
public void applyFilter(@NotNull RouteList source, @NotNull RouteList target) {
target.clear();
if (!isFilterActive()) {
target.setSize(source.size());
Collections.copy(target, source);
return;
}
// Filter all elements
for (Route route : source)
if (matchesFilter(route))
target.add(route);
}
/**
* Checks whether specified route matches current filter.
*
* @param route Route to be matched against current filter.
* @return True if route matches filter, false otherwise.
*/
private boolean matchesFilter(Route route) {
if (!mountedRoutesVisible && route.getParentEngine() != null)
return false;
return route.getPath().toLowerCase().contains(pathFilter) ||
route.getActionTitle().toLowerCase().contains(pathFilter) ||
route.getRouteName().toLowerCase().contains(pathFilter);
}
private void filterChanged() {
model.filterChanged();
}
}