Extract the MotorRowFilter out of the ThrustCurveMotorSelectionPanel to

facilitate adding more filters.
This commit is contained in:
kruland2607 2013-09-10 21:46:38 -05:00
parent 5e27ea578f
commit 84af78ccf4
2 changed files with 94 additions and 81 deletions

View File

@ -0,0 +1,83 @@
package net.sf.openrocket.gui.dialogs.motor.thrustcurve;
import java.util.ArrayList;
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;
//////// Row filters
/**
* Abstract adapter class.
*/
class MotorRowFilter extends RowFilter<TableModel, Integer> {
public enum DiameterFilterControl {
ALL,
EXACT,
SMALLER
};
private final ThrustCurveMotorDatabaseModel model;
private final double diameter;
private List<String> searchTerms = Collections.<String> emptyList();
private DiameterFilterControl diameterControl = DiameterFilterControl.ALL;
public MotorRowFilter(ThrustCurveMotorDatabaseModel model, double diameter) {
super();
this.model = model;
this.diameter = diameter;
}
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);
}
}
}
void setDiameterControl(DiameterFilterControl diameterControl) {
this.diameterControl = diameterControl;
}
@Override
public boolean include(RowFilter.Entry<? extends TableModel, ? extends Integer> entry) {
int index = entry.getIdentifier();
ThrustCurveMotorSet m = model.getMotorSet(index);
return filterByDiameter(m) && filterByString(m);
}
public boolean filterByDiameter(ThrustCurveMotorSet m) {
switch (diameterControl) {
default:
case ALL:
return true;
case EXACT:
return ((m.getDiameter() <= diameter + 0.0004) && (m.getDiameter() >= diameter - 0.0015));
case SMALLER:
return (m.getDiameter() <= diameter + 0.0004);
}
}
public 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;
}
}

View File

@ -34,7 +34,6 @@ import javax.swing.JTextArea;
import javax.swing.JTextField; import javax.swing.JTextField;
import javax.swing.ListCellRenderer; import javax.swing.ListCellRenderer;
import javax.swing.ListSelectionModel; import javax.swing.ListSelectionModel;
import javax.swing.RowFilter;
import javax.swing.RowSorter; import javax.swing.RowSorter;
import javax.swing.SortOrder; import javax.swing.SortOrder;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
@ -109,18 +108,17 @@ public class ThrustCurveMotorSelectionPanel extends JPanel implements MotorSelec
private final List<ThrustCurveMotorSet> database; private final List<ThrustCurveMotorSet> database;
private final double diameter;
private CloseableDialog dialog = null; private CloseableDialog dialog = null;
private final ThrustCurveMotorDatabaseModel model; final ThrustCurveMotorDatabaseModel model;
private final JTable table; private final JTable table;
private final TableRowSorter<TableModel> sorter; private final TableRowSorter<TableModel> sorter;
private final JCheckBox hideSimilarBox; private final JCheckBox hideSimilarBox;
private final JTextField searchField; private final JTextField searchField;
private String[] searchTerms = new String[0]; String[] searchTerms = new String[0];
private final JLabel curveSelectionLabel; private final JLabel curveSelectionLabel;
@ -162,7 +160,6 @@ public class ThrustCurveMotorSelectionPanel extends JPanel implements MotorSelec
public ThrustCurveMotorSelectionPanel(ThrustCurveMotor current, double delay, double diameter) { public ThrustCurveMotorSelectionPanel(ThrustCurveMotor current, double delay, double diameter) {
super(new MigLayout("fill", "[grow][]")); super(new MigLayout("fill", "[grow][]"));
this.diameter = diameter;
// Construct the database (adding the current motor if not in the db already) // Construct the database (adding the current motor if not in the db already)
@ -189,6 +186,8 @@ public class ThrustCurveMotorSelectionPanel extends JPanel implements MotorSelec
} }
database = db; database = db;
model = new ThrustCurveMotorDatabaseModel(database);
final MotorRowFilter rowFilter = new MotorRowFilter(model, diameter);
//// GUI //// GUI
@ -217,20 +216,21 @@ public class ThrustCurveMotorSelectionPanel extends JPanel implements MotorSelec
sel = SHOW_ALL; sel = SHOW_ALL;
switch (sel) { switch (sel) {
case SHOW_ALL: case SHOW_ALL:
sorter.setRowFilter(new MotorRowFilterAll()); rowFilter.setDiameterControl(MotorRowFilter.DiameterFilterControl.ALL);
break; break;
case SHOW_SMALLER: case SHOW_SMALLER:
sorter.setRowFilter(new MotorRowFilterSmaller()); rowFilter.setDiameterControl(MotorRowFilter.DiameterFilterControl.SMALLER);
break; break;
case SHOW_EXACT: case SHOW_EXACT:
sorter.setRowFilter(new MotorRowFilterExact()); rowFilter.setDiameterControl(MotorRowFilter.DiameterFilterControl.EXACT);
break; break;
default: default:
throw new BugException("Invalid selection mode sel=" + sel); throw new BugException("Invalid selection mode sel=" + sel);
} }
sorter.sort();
Application.getPreferences().putChoice("MotorDiameterMatch", sel); Application.getPreferences().putChoice("MotorDiameterMatch", sel);
scrollSelectionVisible(); scrollSelectionVisible();
} }
@ -252,7 +252,6 @@ public class ThrustCurveMotorSelectionPanel extends JPanel implements MotorSelec
// Motor selection table // Motor selection table
model = new ThrustCurveMotorDatabaseModel(database);
table = new JTable(model); table = new JTable(model);
@ -275,6 +274,8 @@ public class ThrustCurveMotorSelectionPanel extends JPanel implements MotorSelec
sorter.setSortKeys(Arrays.asList(sortKeys)); sorter.setSortKeys(Arrays.asList(sortKeys));
} }
sorter.setRowFilter(rowFilter);
// Set selection and double-click listeners // Set selection and double-click listeners
table.getSelectionModel().addListSelectionListener(new ListSelectionListener() { table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@Override @Override
@ -344,14 +345,7 @@ public class ThrustCurveMotorSelectionPanel extends JPanel implements MotorSelec
private void update() { private void update() {
String text = searchField.getText().trim(); String text = searchField.getText().trim();
String[] split = text.split("\\s+"); String[] split = text.split("\\s+");
ArrayList<String> list = new ArrayList<String>(); rowFilter.setSearchTerms( Arrays.asList(split) );
for (String s : split) {
s = s.trim().toLowerCase(Locale.getDefault());
if (s.length() > 0) {
list.add(s);
}
}
searchTerms = list.toArray(new String[0]);
sorter.sort(); sorter.sort();
scrollSelectionVisible(); scrollSelectionVisible();
} }
@ -386,10 +380,6 @@ public class ThrustCurveMotorSelectionPanel extends JPanel implements MotorSelec
}); });
panel.add(curveSelectionBox, "growx, wrap para"); panel.add(curveSelectionBox, "growx, wrap para");
// Ejection charge delay: // Ejection charge delay:
panel.add(new JLabel(trans.get("TCMotorSelPan.lbl.Ejectionchargedelay"))); panel.add(new JLabel(trans.get("TCMotorSelPan.lbl.Ejectionchargedelay")));
@ -936,66 +926,6 @@ public class ThrustCurveMotorSelectionPanel extends JPanel implements MotorSelec
} }
//////// Row filters
/**
* Abstract adapter class.
*/
private abstract class MotorRowFilter extends RowFilter<TableModel, Integer> {
@Override
public boolean include(RowFilter.Entry<? extends TableModel, ? extends Integer> entry) {
int index = entry.getIdentifier();
ThrustCurveMotorSet m = model.getMotorSet(index);
return filterByDiameter(m) && filterByString(m);
}
public abstract boolean filterByDiameter(ThrustCurveMotorSet m);
public 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;
}
}
/**
* Show all motors.
*/
private class MotorRowFilterAll extends MotorRowFilter {
@Override
public boolean filterByDiameter(ThrustCurveMotorSet m) {
return true;
}
}
/**
* Show motors smaller than the mount.
*/
private class MotorRowFilterSmaller extends MotorRowFilter {
@Override
public boolean filterByDiameter(ThrustCurveMotorSet m) {
return (m.getDiameter() <= diameter + 0.0004);
}
}
/**
* Show motors that fit the mount.
*/
private class MotorRowFilterExact extends MotorRowFilter {
@Override
public boolean filterByDiameter(ThrustCurveMotorSet m) {
return ((m.getDiameter() <= diameter + 0.0004) && (m.getDiameter() >= diameter - 0.0015));
}
}
/** /**
* Custom layered pane that sets the bounds of the components on every layout. * Custom layered pane that sets the bounds of the components on every layout.
*/ */