package net.sf.openrocket.gui.dialogs.motor.thrustcurve;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import javax.swing.RowFilter;
import javax.swing.table.TableModel;
import net.sf.openrocket.database.motor.ThrustCurveMotorSet;
import net.sf.openrocket.motor.Manufacturer;
import net.sf.openrocket.motor.ThrustCurveMotor;
import net.sf.openrocket.rocketcomponent.MotorConfiguration;
import net.sf.openrocket.rocketcomponent.MotorMount;
import net.sf.openrocket.util.AbstractChangeSource;
import net.sf.openrocket.util.ChangeSource;
import net.sf.openrocket.util.StateChangeListener;
//////// Row filters
/**
* Abstract adapter class.
*/
public class MotorRowFilter extends RowFilter<TableModel, Integer> implements ChangeSource {
// configuration data used in the filter process
private final ThrustCurveMotorDatabaseModel model;
private List<ThrustCurveMotor> usedMotors = new ArrayList<ThrustCurveMotor>();
private final AbstractChangeSource changeSourceDelegate = new AbstractChangeSource();
private final Object change = new Object();
// things which can be changed to modify filter behavior
// Limit motors based on length
private double minimumLength = 0;
private double maximumLength = Double.MAX_VALUE;
// Limit motors based on diameter
private Double minimumDiameter;
private Double maximumDiameter;
// Collection of strings which match text in the motor
private List<String> searchTerms = Collections.<String> emptyList();
// Boolean which hides motors in the usedMotors list
private boolean hideUsedMotors = false;
// List of manufacturers to exclude.
private List<Manufacturer> excludedManufacturers = new ArrayList<Manufacturer>();
// Impulse class filtering
private ImpulseClass minimumImpulse;
private ImpulseClass maximumImpulse;
public MotorRowFilter(ThrustCurveMotorDatabaseModel model) {
super();
this.model = model;
}
public void setMotorMount( MotorMount mount ) {
if (mount != null) {
for (MotorConfiguration m : mount.getMotorConfiguration()) {
this.usedMotors.add((ThrustCurveMotor) m.getMotor());
}
}
}
public void setSearchTerms(final List<String> searchTerms) {
this.searchTerms = new ArrayList<String>();
for (String s : searchTerms) {
s = s.trim().toLowerCase(Locale.getDefault());
if (s.length() > 0) {
this.searchTerms.add(s);
}
}
}
public double getMinimumLength() {
return minimumLength;
}
public void setMinimumLength(double minimumLength) {
if ( this.minimumLength != minimumLength ) {
this.minimumLength = minimumLength;
fireChangeEvent(change);
}
}
public double getMaximumLength() {
return maximumLength;
}
public void setMaximumLength(double maximumLength) {
if ( this.maximumLength != maximumLength ) {
this.maximumLength = maximumLength;
fireChangeEvent(change);
}
}
Double getMinimumDiameter() {
return minimumDiameter;
}
void setMinimumDiameter(Double minimumDiameter) {
this.minimumDiameter = minimumDiameter;
}
Double getMaximumDiameter() {
return maximumDiameter;
}
void setMaximumDiameter(Double maximumDiameter) {
this.maximumDiameter = maximumDiameter;
}
void setHideUsedMotors(boolean hideUsedMotors) {
this.hideUsedMotors = hideUsedMotors;
}
List<Manufacturer> getExcludedManufacturers() {
return excludedManufacturers;
}
void setExcludedManufacturers(Collection<Manufacturer> excludedManufacturers) {
this.excludedManufacturers.clear();
this.excludedManufacturers.addAll(excludedManufacturers);
}
ImpulseClass getMinimumImpulse() {
return minimumImpulse;
}
void setMinimumImpulse(ImpulseClass minimumImpulse) {
this.minimumImpulse = minimumImpulse;
}
ImpulseClass getMaximumImpulse() {
return maximumImpulse;
}
void setMaximumImpulse(ImpulseClass maximumImpulse) {
this.maximumImpulse = maximumImpulse;
}
@Override
public boolean include(RowFilter.Entry<? extends TableModel, ? extends Integer> entry) {
int index = entry.getIdentifier();
ThrustCurveMotorSet m = model.getMotorSet(index);
return filterManufacturers(m) && filterUsed(m) && filterBySize(m) && filterByString(m) && filterByImpulseClass(m);
}
private boolean filterManufacturers(ThrustCurveMotorSet m) {
if (excludedManufacturers.contains(m.getManufacturer())) {
return false;
} else {
return true;
}
}
private boolean filterUsed(ThrustCurveMotorSet m) {
if (!hideUsedMotors) {
return true;
}
for (ThrustCurveMotor motor : usedMotors) {
if (m.matches(motor)) {
return false;
}
}
return true;
}
private boolean filterBySize(ThrustCurveMotorSet m) {
if ( minimumDiameter != null ) {
if ( m.getDiameter() <= minimumDiameter - 0.0015 ) {
return false;
}
}
if ( maximumDiameter != null ) {
if ( m.getDiameter() >= maximumDiameter + 0.0004 ) {
return false;
}
}
if ( m.getLength() > maximumLength ) {
return false;
}
if ( m.getLength() < minimumLength ) {
return false;
}
return true;
}
private boolean filterByString(ThrustCurveMotorSet m) {
main: for (String s : searchTerms) {
for (ThrustCurveMotorColumns col : ThrustCurveMotorColumns.values()) {
String str = col.getValue(m).toString().toLowerCase(Locale.getDefault());
if (str.indexOf(s) >= 0)
continue main;
}
return false;
}
return true;
}
private boolean filterByImpulseClass(ThrustCurveMotorSet m) {
if ( minimumImpulse != null ) {
if( m.getTotalImpuse() <= minimumImpulse.getLow() ) {
return false;
}
}
if ( maximumImpulse != null ) {
if( m.getTotalImpuse() > maximumImpulse.getHigh() ) {
return false;
}
}
return true;
}
public final void addChangeListener(StateChangeListener listener) {
changeSourceDelegate.addChangeListener(listener);
}
public final void removeChangeListener(StateChangeListener listener) {
changeSourceDelegate.removeChangeListener(listener);
}
public void fireChangeEvent(Object source) {
changeSourceDelegate.fireChangeEvent(source);
}
}