Further refinements to motor filter. Moved diameter configuration into

popup.  Added impulse class filters.  Improved interface to CheckList and
removed the double-click functionality from CheckListEditor.
This commit is contained in:
kruland2607 2013-09-28 22:01:14 -05:00
parent 246b9a6823
commit bae9d38a51
8 changed files with 426 additions and 223 deletions

View File

@ -0,0 +1,45 @@
package net.sf.openrocket.gui.dialogs.motor.thrustcurve;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import net.sf.openrocket.database.motor.ThrustCurveMotorSet;
public enum ImpulseClass {
A("A",0.0, 2.5 ),
B("B",2.5, 5.0 ),
C("C",5.0, 10.0),
D("D",10.0, 20.0),
E("E",20.0, 40.0),
F("F", 40.0, 80.0),
G("G", 80.0, 160.0),
H("H", 160.0, 320.0),
I("I", 320.0, 640.0),
J("J", 640.0, 1280.0),
K("K", 1280.0, 2560.0),
L("L", 2560.0, 5120.0),
M("M", 5120.0, 10240.0),
N("N", 10240.0, 20480.0),
O("O", 20480.0, Double.MAX_VALUE);
private ImpulseClass( String name, double low, double high ) {
this.name = name;
this.low = low;
this.high = high;
}
public String toString() {
return name;
}
public boolean isIn( ThrustCurveMotorSet m ) {
long motorImpulse = m.getTotalImpuse();
return motorImpulse >= low && motorImpulse <= high;
}
private double low;
private double high;
private String name;
}

View File

@ -1,96 +0,0 @@
package net.sf.openrocket.gui.dialogs.motor.thrustcurve;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.UIManager;
import net.sf.openrocket.gui.util.CheckList;
import net.sf.openrocket.motor.Manufacturer;
public abstract class ManufacturerPopupSelector extends JPopupMenu implements ActionListener {
Map<String, Manufacturer> componentMap = new HashMap<String, Manufacturer>();
CheckList list;
public ManufacturerPopupSelector(Collection<Manufacturer> allManufacturers, Collection<Manufacturer> unselectedManufacturers) {
JPanel root = new JPanel(new BorderLayout(3, 3));
root.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1));
root.setPreferredSize(new Dimension(250, 150)); // default popup size
Box commands = new Box(BoxLayout.LINE_AXIS);
commands.add(Box.createHorizontalStrut(5));
commands.setBorder(BorderFactory.createEmptyBorder(3, 0, 3, 0));
commands.setBackground(UIManager.getColor("Panel.background"));
commands.setOpaque(true);
JButton closeButton = new JButton("close");
closeButton.addActionListener(this);
commands.add(closeButton);
List<String> manufacturers = new ArrayList<String>();
for (Manufacturer m : allManufacturers) {
manufacturers.add(m.getSimpleName());
componentMap.put(m.getSimpleName(), m);
}
Collections.sort(manufacturers);
list = new CheckList.Builder().build();
list.setData(manufacturers);
if (unselectedManufacturers != null)
{
for (Manufacturer m : unselectedManufacturers) {
manufacturers.remove(m.getSimpleName());
}
}
list.setCheckedItems(manufacturers);
root.add(new JScrollPane(list.getList()), BorderLayout.CENTER);
root.add(commands, BorderLayout.SOUTH);
this.add(root);
}
@Override
public void actionPerformed(ActionEvent e) {
List<Manufacturer> selectedManufacturers = new ArrayList<Manufacturer>();
List<Manufacturer> unselectedManufacturers = new ArrayList<Manufacturer>();
Collection<String> selected = list.getCheckedItems();
for (String s : selected) {
selectedManufacturers.add(componentMap.get(s));
}
Collection<String> unselected = list.getUncheckedItems();
for (String s : unselected) {
unselectedManufacturers.add(componentMap.get(s));
}
onDismissed(selectedManufacturers, unselectedManufacturers);
setVisible(false);
}
public abstract void onDismissed(List<Manufacturer> selectedManufacturers, List<Manufacturer> unselectedManufacturers);
}

View File

@ -0,0 +1,251 @@
package net.sf.openrocket.gui.dialogs.motor.thrustcurve;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.border.TitledBorder;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
import net.miginfocom.swing.MigLayout;
import net.sf.openrocket.gui.util.CheckList;
import net.sf.openrocket.gui.util.GUIUtil;
import net.sf.openrocket.gui.util.SwingPreferences;
import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.motor.Manufacturer;
import net.sf.openrocket.startup.Application;
import com.itextpdf.text.Font;
public abstract class MotorFilterPopupMenu extends JPopupMenu {
private static final Translator trans = Application.getTranslator();
private final CheckList<Manufacturer> manufacturerCheckList;
private final CheckList<ImpulseClass> impulseCheckList;
private final MotorRowFilter filter;
private int showMode = SHOW_ALL;
private static final int SHOW_ALL = 0;
private static final int SHOW_SMALLER = 1;
private static final int SHOW_EXACT = 2;
private static final int SHOW_MAX = 2;
public MotorFilterPopupMenu(Collection<Manufacturer> allManufacturers, MotorRowFilter filter ) {
this.filter = filter;
showMode = Application.getPreferences().getChoice(net.sf.openrocket.startup.Preferences.MOTOR_DIAMETER_FILTER, MotorFilterPopupMenu.SHOW_MAX, MotorFilterPopupMenu.SHOW_EXACT);
List<Manufacturer> unselectedManusFromPreferences = ((SwingPreferences) Application.getPreferences()).getExcludedMotorManufacturers();
// Manufacturer selection
JPanel sub = new JPanel(new MigLayout("fill"));
TitledBorder border = BorderFactory.createTitledBorder("Manufacturer");
GUIUtil.changeFontStyle(border, Font.BOLD);
sub.setBorder(border);
JPanel root = new JPanel(new MigLayout("fill", "[grow]"));
root.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1));
List<Manufacturer> manufacturers = new ArrayList<Manufacturer>();
for (Manufacturer m : allManufacturers) {
manufacturers.add(m);
}
Collections.sort(manufacturers, new Comparator<Manufacturer>() {
@Override
public int compare(Manufacturer o1, Manufacturer o2) {
return o1.getSimpleName().compareTo( o2.getSimpleName());
}
});
manufacturerCheckList = new CheckList.Builder().<Manufacturer>build();
manufacturerCheckList.setData(manufacturers);
manufacturerCheckList.setUncheckedItems(unselectedManusFromPreferences);
filter.setExcludedManufacturers(unselectedManusFromPreferences);
manufacturerCheckList.getModel().addListDataListener( new ListDataListener() {
@Override
public void intervalAdded(ListDataEvent e) {
}
@Override
public void intervalRemoved(ListDataEvent e) {
}
@Override
public void contentsChanged(ListDataEvent e) {
MotorFilterPopupMenu.this.filter.setExcludedManufacturers( manufacturerCheckList.getUncheckedItems() );
onSelectionChanged();
}
});
sub.add(new JScrollPane(manufacturerCheckList.getList()), "grow,wrap");
JButton clearMotors = new JButton("clear");
clearMotors.addActionListener( new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
MotorFilterPopupMenu.this.manufacturerCheckList.clearAll();
}
});
sub.add(clearMotors,"split 2");
JButton selectMotors = new JButton("all");
selectMotors.addActionListener( new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
MotorFilterPopupMenu.this.manufacturerCheckList.checkAll();
}
});
sub.add(selectMotors,"wrap");
root.add(sub,"grow, wrap");
// Impulse selection
sub = new JPanel(new MigLayout("fill"));
border = BorderFactory.createTitledBorder("Impulse");
GUIUtil.changeFontStyle(border, Font.BOLD);
sub.setBorder(border);
impulseCheckList = new CheckList.Builder().<ImpulseClass>build();
impulseCheckList.setData(Arrays.asList(ImpulseClass.values()));
impulseCheckList.checkAll();
impulseCheckList.getModel().addListDataListener( new ListDataListener() {
@Override
public void intervalAdded(ListDataEvent e) {
}
@Override
public void intervalRemoved(ListDataEvent e) {
}
@Override
public void contentsChanged(ListDataEvent e) {
MotorFilterPopupMenu.this.filter.setExcludedImpulseClasses( impulseCheckList.getUncheckedItems() );
onSelectionChanged();
}
});
sub.add(new JScrollPane(impulseCheckList.getList()), "grow,wrap");
JButton clearImpulse = new JButton("clear");
clearImpulse.addActionListener( new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
MotorFilterPopupMenu.this.impulseCheckList.clearAll();
}
});
sub.add(clearImpulse,"split 2");
JButton selectImpulse = new JButton("all");
selectImpulse.addActionListener( new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
MotorFilterPopupMenu.this.impulseCheckList.checkAll();
}
});
sub.add(selectImpulse,"wrap");
root.add(sub,"grow, wrap");
// Diameter selection
sub = new JPanel(new MigLayout("fill"));
border = BorderFactory.createTitledBorder("Diameter");
GUIUtil.changeFontStyle(border, Font.BOLD);
sub.setBorder(border);
JRadioButton showAllDiametersButton = new JRadioButton( trans.get("TCMotorSelPan.SHOW_DESCRIPTIONS.desc1") );
showAllDiametersButton.addActionListener( new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
showMode = SHOW_ALL;
MotorFilterPopupMenu.this.filter.setDiameterControl(MotorRowFilter.DiameterFilterControl.ALL);
onSelectionChanged();
}
});
showAllDiametersButton.setSelected( showMode == SHOW_ALL);
sub.add(showAllDiametersButton, "growx,wrap");
JRadioButton showSmallerDiametersButton = new JRadioButton( trans.get("TCMotorSelPan.SHOW_DESCRIPTIONS.desc2") );
showSmallerDiametersButton.addActionListener( new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
showMode = SHOW_SMALLER;
MotorFilterPopupMenu.this.filter.setDiameterControl(MotorRowFilter.DiameterFilterControl.SMALLER);
onSelectionChanged();
}
});
showSmallerDiametersButton.setSelected( showMode == SHOW_SMALLER);
sub.add(showSmallerDiametersButton, "growx,wrap");
JRadioButton showExactDiametersButton = new JRadioButton( trans.get("TCMotorSelPan.SHOW_DESCRIPTIONS.desc3") );
showExactDiametersButton.addActionListener( new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
showMode = SHOW_EXACT;
MotorFilterPopupMenu.this.filter.setDiameterControl(MotorRowFilter.DiameterFilterControl.EXACT);
onSelectionChanged();
}
});
showExactDiametersButton.setSelected( showMode == SHOW_EXACT );
sub.add(showExactDiametersButton, "growx,wrap");
root.add(sub, "grow,wrap");
ButtonGroup comboGroup = new ButtonGroup();
comboGroup.add( showAllDiametersButton );
comboGroup.add( showSmallerDiametersButton );
comboGroup.add( showExactDiametersButton );
// Close button
JButton closeButton = new JButton("close");
closeButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
MotorFilterPopupMenu.this.onClose();
}
});
root.add(closeButton, "split 2");
this.add(root);
}
public void onClose() {
((SwingPreferences) Application.getPreferences()).setExcludedMotorManufacturers(filter.getExcludedManufacturers());
Application.getPreferences().putChoice("MotorDiameterMatch", showMode );
setVisible(false);
}
public abstract void onSelectionChanged();
}

View File

@ -1,6 +1,7 @@
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;
@ -33,11 +34,22 @@ class MotorRowFilter extends RowFilter<TableModel, Integer> {
private List<ThrustCurveMotor> usedMotors = new ArrayList<ThrustCurveMotor>();
// things which can be changed to modify filter behavior
// Collection of strings which match text in the moto
private List<String> searchTerms = Collections.<String> emptyList();
// Limit motors based on diameter of the motor mount
private DiameterFilterControl diameterControl = DiameterFilterControl.ALL;
// Boolean which hides motors in the usedMotors list
private boolean hideUsedMotors = false;
// List of manufacturers to exclude.
private List<Manufacturer> excludedManufacturers = new ArrayList<Manufacturer>();
// List of ImpulseClasses to exclude.
private List<ImpulseClass> excludedImpulseClass = new ArrayList<ImpulseClass>();
public MotorRowFilter(MotorMount mount, ThrustCurveMotorDatabaseModel model) {
super();
this.model = model;
@ -61,6 +73,10 @@ class MotorRowFilter extends RowFilter<TableModel, Integer> {
}
}
DiameterFilterControl getDiameterControl() {
return diameterControl;
}
void setDiameterControl(DiameterFilterControl diameterControl) {
this.diameterControl = diameterControl;
}
@ -69,16 +85,25 @@ class MotorRowFilter extends RowFilter<TableModel, Integer> {
this.hideUsedMotors = hideUsedMotors;
}
void setExcludedManufacturers(List<Manufacturer> excludedManufacturers) {
List<Manufacturer> getExcludedManufacturers() {
return excludedManufacturers;
}
void setExcludedManufacturers(Collection<Manufacturer> excludedManufacturers) {
this.excludedManufacturers.clear();
this.excludedManufacturers.addAll(excludedManufacturers);
}
void setExcludedImpulseClasses(Collection<ImpulseClass> excludedImpulseClasses ) {
this.excludedImpulseClass.clear();
this.excludedImpulseClass.addAll(excludedImpulseClasses);
}
@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) && filterByDiameter(m) && filterByString(m);
return filterManufacturers(m) && filterUsed(m) && filterByDiameter(m) && filterByString(m) && filterByImpulseClass(m);
}
private boolean filterManufacturers(ThrustCurveMotorSet m) {
@ -128,4 +153,14 @@ class MotorRowFilter extends RowFilter<TableModel, Integer> {
}
return true;
}
private boolean filterByImpulseClass(ThrustCurveMotorSet m) {
for( ImpulseClass c : excludedImpulseClass ) {
if (c.isIn(m) ) {
return false;
}
}
return true;
}
}

View File

@ -83,23 +83,11 @@ import org.slf4j.LoggerFactory;
public class ThrustCurveMotorSelectionPanel extends JPanel implements MotorSelector {
private static final Logger log = LoggerFactory.getLogger(ThrustCurveMotorSelectionPanel.class);
private static final Translator trans = Application.getTranslator();
private static final double MOTOR_SIMILARITY_THRESHOLD = 0.95;
private static final int SHOW_ALL = 0;
private static final int SHOW_SMALLER = 1;
private static final int SHOW_EXACT = 2;
private static final String[] SHOW_DESCRIPTIONS = {
//// Show all motors
trans.get("TCMotorSelPan.SHOW_DESCRIPTIONS.desc1"),
//// Show motors with diameter less than that of the motor mount
trans.get("TCMotorSelPan.SHOW_DESCRIPTIONS.desc2"),
//// Show motors with diameter equal to that of the motor mount
trans.get("TCMotorSelPan.SHOW_DESCRIPTIONS.desc3")
};
private static final int SHOW_MAX = 2;
private static final int ZOOM_ICON_POSITION_NEGATIVE_X = 50;
private static final int ZOOM_ICON_POSITION_POSITIVE_Y = 12;
@ -194,11 +182,8 @@ public class ThrustCurveMotorSelectionPanel extends JPanel implements MotorSelec
}
database = db;
List<Manufacturer> unselectedManusFromPreferences = ((SwingPreferences) Application.getPreferences()).getExcludedMotorManufacturers();
model = new ThrustCurveMotorDatabaseModel(database);
final MotorRowFilter rowFilter = new MotorRowFilter(mount, model);
rowFilter.setExcludedManufacturers(unselectedManusFromPreferences);
//// GUI
@ -215,86 +200,57 @@ public class ThrustCurveMotorSelectionPanel extends JPanel implements MotorSelec
label = new StyledLabel(trans.get("TCMotorSelPan.lbl.Selrocketmotor"), Style.BOLD);
panel.add(label, "spanx, wrap para");
// Diameter selection
JComboBox filterComboBox = new JComboBox(SHOW_DESCRIPTIONS);
filterComboBox.addActionListener(new ActionListener() {
// Search field
//// Search:
label = new StyledLabel(trans.get("TCMotorSelPan.lbl.Search"));
panel.add(label, "");
searchField = new JTextField();
searchField.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void actionPerformed(ActionEvent e) {
JComboBox cb = (JComboBox) e.getSource();
int sel = cb.getSelectedIndex();
if ((sel < 0) || (sel > SHOW_MAX))
sel = SHOW_ALL;
switch (sel) {
case SHOW_ALL:
rowFilter.setDiameterControl(MotorRowFilter.DiameterFilterControl.ALL);
break;
case SHOW_SMALLER:
rowFilter.setDiameterControl(MotorRowFilter.DiameterFilterControl.SMALLER);
break;
case SHOW_EXACT:
rowFilter.setDiameterControl(MotorRowFilter.DiameterFilterControl.EXACT);
break;
default:
throw new BugException("Invalid selection mode sel=" + sel);
}
public void changedUpdate(DocumentEvent e) {
update();
}
@Override
public void insertUpdate(DocumentEvent e) {
update();
}
@Override
public void removeUpdate(DocumentEvent e) {
update();
}
private void update() {
String text = searchField.getText().trim();
String[] split = text.split("\\s+");
rowFilter.setSearchTerms(Arrays.asList(split));
sorter.sort();
Application.getPreferences().putChoice("MotorDiameterMatch", sel);
scrollSelectionVisible();
}
});
panel.add(filterComboBox, "spanx, growx, wrap rel");
//// Hide very similar thrust curves
hideSimilarBox = new JCheckBox(trans.get("TCMotorSelPan.checkbox.hideSimilar"));
GUIUtil.changeFontSize(hideSimilarBox, -1);
hideSimilarBox.setSelected(Application.getPreferences().getBoolean(net.sf.openrocket.startup.Preferences.MOTOR_HIDE_SIMILAR, true));
hideSimilarBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Application.getPreferences().putBoolean(net.sf.openrocket.startup.Preferences.MOTOR_HIDE_SIMILAR, hideSimilarBox.isSelected());
updateData();
}
});
panel.add(hideSimilarBox, "gapleft para, spanx, growx, wrap para");
{
final JCheckBox hideUsedBox = new JCheckBox("Hide motors already used in the mount");
GUIUtil.changeFontSize(hideUsedBox, -1);
hideUsedBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
rowFilter.setHideUsedMotors(hideUsedBox.isSelected());
sorter.sort();
scrollSelectionVisible();
}
});
panel.add(hideUsedBox, "gapleft para, spanx, growx, wrap para");
}
panel.add(searchField, "growx");
{
// Find all the manufacturers:
Set<Manufacturer> manus = new HashSet<Manufacturer>();
Set<Manufacturer> allManufacturers = new HashSet<Manufacturer>();
for (ThrustCurveMotorSet s : database) {
manus.add(s.getManufacturer());
allManufacturers.add(s.getManufacturer());
}
final ManufacturerPopupSelector popup = new ManufacturerPopupSelector(manus, unselectedManusFromPreferences) {
final MotorFilterPopupMenu popup = new MotorFilterPopupMenu(allManufacturers, rowFilter) {
@Override
public void onDismissed(List<Manufacturer> selectedManufacturers, List<Manufacturer> unselectedManufacturers) {
((SwingPreferences) Application.getPreferences()).setExcludedMotorManufacturers(unselectedManufacturers);
rowFilter.setExcludedManufacturers(unselectedManufacturers);
public void onSelectionChanged() {
sorter.sort();
scrollSelectionVisible();
System.out.println("Here I am");
}
};
JButton manuFilter = new JButton("Manufacturer Filter");
JButton manuFilter = new JButton("Motor Filter");
manuFilter.addMouseListener(new MouseListener() {
@Override
@ -319,7 +275,7 @@ public class ThrustCurveMotorSelectionPanel extends JPanel implements MotorSelec
}
});
panel.add(manuFilter, "gapleft para, spanx, growx, wrap para");
panel.add(manuFilter, "gapleft para, wrap para");
}
@ -382,8 +338,32 @@ public class ThrustCurveMotorSelectionPanel extends JPanel implements MotorSelec
scrollpane.setViewportView(table);
panel.add(scrollpane, "grow, width :500:, height :300:, spanx, wrap para");
{
final JCheckBox hideUsedBox = new JCheckBox("Hide motors already used in the mount");
GUIUtil.changeFontSize(hideUsedBox, -1);
hideUsedBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
rowFilter.setHideUsedMotors(hideUsedBox.isSelected());
sorter.sort();
scrollSelectionVisible();
}
});
panel.add(hideUsedBox, "gapleft para, spanx, growx, wrap para");
}
//// Hide very similar thrust curves
hideSimilarBox = new JCheckBox(trans.get("TCMotorSelPan.checkbox.hideSimilar"));
GUIUtil.changeFontSize(hideSimilarBox, -1);
hideSimilarBox.setSelected(Application.getPreferences().getBoolean(net.sf.openrocket.startup.Preferences.MOTOR_HIDE_SIMILAR, true));
hideSimilarBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Application.getPreferences().putBoolean(net.sf.openrocket.startup.Preferences.MOTOR_HIDE_SIMILAR, hideSimilarBox.isSelected());
updateData();
}
});
panel.add(hideSimilarBox, "gapleft para, spanx, growx, wrap para");
// Motor mount diameter label
//// Motor mount diameter:
@ -391,42 +371,6 @@ public class ThrustCurveMotorSelectionPanel extends JPanel implements MotorSelec
UnitGroup.UNITS_MOTOR_DIMENSIONS.getDefaultUnit().toStringUnit(diameter));
panel.add(label, "gapright 30lp, spanx, split");
// Search field
//// Search:
label = new StyledLabel(trans.get("TCMotorSelPan.lbl.Search"));
panel.add(label, "");
searchField = new JTextField();
searchField.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void changedUpdate(DocumentEvent e) {
update();
}
@Override
public void insertUpdate(DocumentEvent e) {
update();
}
@Override
public void removeUpdate(DocumentEvent e) {
update();
}
private void update() {
String text = searchField.getText().trim();
String[] split = text.split("\\s+");
rowFilter.setSearchTerms(Arrays.asList(split));
sorter.sort();
scrollSelectionVisible();
}
});
panel.add(searchField, "growx, wrap");
// Vertical split
this.add(panel, "grow");
this.add(new JSeparator(JSeparator.VERTICAL), "growy, gap para para");
@ -615,17 +559,8 @@ public class ThrustCurveMotorSelectionPanel extends JPanel implements MotorSelec
panel.add(layer, "width 300:300:, height 180:180:, grow, spanx");
this.add(panel, "grow");
// Sets the filter:
int showMode = Application.getPreferences().getChoice(net.sf.openrocket.startup.Preferences.MOTOR_DIAMETER_FILTER, SHOW_MAX, SHOW_EXACT);
filterComboBox.setSelectedIndex(showMode);
// Update the panel data
updateData();
setDelays(false);

View File

@ -159,6 +159,14 @@ public class CheckList<T> {
return unchecked;
}
public void checkAll() {
getModel().checkAll();
}
public void clearAll() {
getModel().clearAll();
}
/**
* Resets checked elements
* @param elements
@ -167,6 +175,10 @@ public class CheckList<T> {
getModel().setCheckedItems(elements);
}
public void setUncheckedItems( Collection<T> elements ) {
getModel().setUncheckedItems(elements);
}
public void toggleIndex(int index) {
if (index >= 0 && index < list.getModel().getSize()) {
DefaultCheckListModel<T> model = getModel();

View File

@ -73,7 +73,8 @@ final class CheckListEditor extends MouseAdapter {
if (e.getClickCount() > 1) {
// clear all and check selected for more then 1 clicks
model.setCheckedItems(Arrays.asList(model.getElementAt(index)));
// Original implementation had this implementation. I didn't like that behavior.
// model.setCheckedItems(Arrays.asList(model.getElementAt(index)));
} else {
// simple toggle for 1 click
model.setCheckedIndex(index, !model.isCheckedIndex(index));

View File

@ -107,6 +107,16 @@ public class DefaultCheckListModel<T> extends AbstractListModel {
return Collections.unmodifiableList(items);
}
public void clearAll() {
checks.clear();
fireContentsChanged(this, 0, checks.size() - 1);
}
public void checkAll() {
checks.addAll(data);
fireContentsChanged(this, 0, checks.size() - 1);
}
public void setCheckedItems(Collection<T> items) {
// if ( CollectionUtils.isEmpty(items)) return;
@ -121,4 +131,14 @@ public class DefaultCheckListModel<T> extends AbstractListModel {
}
public void setUncheckedItems( Collection<T> items ) {
List<T> correctedItems = new ArrayList<T>(data);
correctedItems.removeAll(items);
checks.clear();
checks.addAll(correctedItems);
fireContentsChanged(this, 0, checks.size() - 1);
}
}