Add checkbox to show/hide legacy components

Initially, checkbox is not set, legacy components are not shown, and
"Legacy" column in chooser dialog table is not visible.

Toggling checkbox shows/hides legacy components and column in table
This commit is contained in:
JoePfeiffer 2022-01-23 19:07:50 -07:00
parent 5aa16cb556
commit f34686ea4e
6 changed files with 87 additions and 17 deletions

View File

@ -2023,8 +2023,10 @@ ComponentPresetChooserDialog.menu.sortAsc = Sort Ascending
ComponentPresetChooserDialog.menu.sortDesc = Sort Descending
ComponentPresetChooserDialog.menu.units = Units
ComponentPresetChooserDialog.checkbox.showAllCompatible = Show all compatible
ComponentPresetChooserDialog.checkbox.showLegacyCheckBox = Show Legacy Components
ComponentPresetChooserDialog.lbl.favorites = Select to add preset to drop-down menu
table.column.Favorite = Favorite
table.column.Legacy = Legacy
table.column.Manufacturer = Manufacturer
table.column.PartNo = Part Number
table.column.Description = Description

View File

@ -44,7 +44,6 @@ class ComponentPresetSetter implements Setter {
}
List<ComponentPreset> presets = Application.getComponentPresetDao().find(manufacturerName, productNo);
ComponentPreset matchingPreset = null;
for (ComponentPreset preset : presets) {
@ -53,6 +52,7 @@ class ComponentPresetSetter implements Setter {
matchingPreset = preset;
break;
}
if (type != null && preset.getType().name().equals(type) && matchingPreset != null) {
// Found the first one with matching type.
matchingPreset = preset;
@ -71,4 +71,4 @@ class ComponentPresetSetter implements Setter {
setMethod.invoke(c, matchingPreset);
}
}
}

View File

@ -377,6 +377,9 @@ public class ComponentPreset implements Comparable<ComponentPreset>, Serializabl
});
for (TypedKey<?> key : keys) {
if (key == ComponentPreset.LEGACY) {
continue;
}
Object value = properties.get(key);

View File

@ -49,7 +49,9 @@ public class ComponentPresetChooserDialog extends JDialog {
private JTextField filterText;
private JCheckBox foreDiameterFilterCheckBox;
private JCheckBox aftDiameterFilterCheckBox;
private JCheckBox showLegacyCheckBox;
private ComponentPresetRowFilter legacyFilter;
private ComponentPresetRowFilter foreDiameterFilter;
private ComponentPresetRowFilter aftDiameterFilter;
@ -58,6 +60,7 @@ public class ComponentPresetChooserDialog extends JDialog {
* outerDiamtereColumnIndex is the index of the column associated with the OUTER_DIAMETER
* field. This index is needed by the matchOuterDiameterCheckBox to implement filtering.
*/
int legacyColumnIndex = -1;
int aftDiameterColumnIndex = -1;
int foreDiameterColumnIndex = -1;
@ -87,6 +90,9 @@ public class ComponentPresetChooserDialog extends JDialog {
if (!displayedColumnKeys.contains(key)) {
continue;
}
if (key == ComponentPreset.LEGACY) {
legacyColumnIndex = i;
}
if (key == ComponentPreset.OUTER_DIAMETER || key == ComponentPreset.AFT_OUTER_DIAMETER) {
aftDiameterColumnIndex = i;
}
@ -126,17 +132,20 @@ public class ComponentPresetChooserDialog extends JDialog {
});
panel.add(sub, "growx, ay 0, gapright para");
panel.add(getFilterCheckboxes(), "wrap para");
// need to create componentSelectionTable before filter checkboxes,
// but add to panel after
componentSelectionTable = new ComponentPresetTable(presetType, presets, displayedColumnKeys);
// GUIUtil.setAutomaticColumnTableWidths(componentSelectionTable, 20);
int w = componentSelectionTable.getRowHeight() + 4;
TableColumn tc = componentSelectionTable.getColumnModel().getColumn(0);
XTableColumnModel tm = componentSelectionTable.getXColumnModel();
//TableColumn tc = componentSelectionTable.getColumnModel().getColumn(0);
TableColumn tc = tm.getColumn(0);
tc.setPreferredWidth(w);
tc.setMaxWidth(w);
tc.setMinWidth(w);
panel.add(getFilterCheckboxes(tm, legacyColumnIndex), "wrap para");
JScrollPane scrollpane = new JScrollPane();
scrollpane.setViewportView(componentSelectionTable);
@ -169,10 +178,12 @@ public class ComponentPresetChooserDialog extends JDialog {
GUIUtil.rememberWindowSize(this);
GUIUtil.setDisposableDialogOptions(this, okButton);
updateFilters();
}
private JPanel getFilterCheckboxes() {
private JPanel getFilterCheckboxes(XTableColumnModel tm, int legacyColumnIndex) {
JPanel panel = new JPanel(new MigLayout("ins 0"));
/*
@ -194,9 +205,27 @@ public class ComponentPresetChooserDialog extends JDialog {
}
componentSelectionTable.updateData(presets);
}
});
});
}
/*
* Add legacy component filter checkbox
*/
TableColumn legacyColumn = tm.getColumn(legacyColumnIndex);
tm.setColumnVisible(legacyColumn, false);
legacyFilter = new ComponentPresetRowFilter(false, legacyColumnIndex);
showLegacyCheckBox = new JCheckBox();
showLegacyCheckBox.setText(trans.get("ComponentPresetChooserDialog.checkbox.showLegacyCheckBox"));
panel.add(showLegacyCheckBox, "wrap");
showLegacyCheckBox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
updateFilters();
tm.setColumnVisible(legacyColumn, showLegacyCheckBox.isSelected());
}
});
if(component instanceof SymmetricComponent) {
final SymmetricComponent curSym = (SymmetricComponent) component;
/*
@ -274,6 +303,9 @@ public class ComponentPresetChooserDialog extends JDialog {
if (foreDiameterFilterCheckBox.isSelected()) {
filters.add(foreDiameterFilter);
}
if (!showLegacyCheckBox.isSelected()) {
filters.add(legacyFilter);
}
componentSelectionTable.setRowFilter(RowFilter.andFilter(filters));
}

View File

@ -7,31 +7,45 @@ import net.sf.openrocket.unit.Value;
import net.sf.openrocket.util.MathUtil;
public class ComponentPresetRowFilter extends RowFilter<TableModel, Object> {
private final double value;
private Boolean bvalue = false;
private double dvalue = 0.0;
private double epsilon = 0.0;
private final int column;
private final double epsilon;
ComponentPresetRowFilter(double value, int column) {
this.value = value;
this.dvalue = value;
this.column = column;
/*
* Accept 5% difference, but at least 1mm.
*/
this.epsilon = MathUtil.max(value * 0.05, 0.001);
}
ComponentPresetRowFilter(Boolean value, int column) {
this.bvalue = value;
this.column = column;
}
@Override
public boolean include(RowFilter.Entry<? extends TableModel, ? extends Object> entry) {
Object o = entry.getValue(column);
if (o instanceof Value) {
Value v = (Value) o;
return Math.abs(value - v.getValue()) < epsilon;
return Math.abs(dvalue - v.getValue()) < epsilon;
}
if (o instanceof Double) {
Double d = (Double) o;
return Math.abs(value - d) < epsilon;
return Math.abs(dvalue - d) < epsilon;
}
if (o instanceof Boolean) {
Boolean b = (Boolean) o;
return b.equals(bvalue);
}
return true;
}

View File

@ -126,12 +126,27 @@ public class ComponentPresetTable extends JTable {
}
});
} else if ( key.getType() == Boolean.class ) {
sorter.setComparator(index, new Comparator<Boolean>() {
@Override
public int compare(Boolean b1, Boolean b2) {
if (b1 && !b2) {
return 1;
} else if (!b1 && b2) {
return -1;
} else {
return 0;
}
}
});
}
if ( visibleColumnKeys.indexOf(key) < 0 ) {
hiddenColumns.add(columns[index]);
}
index ++;
}
}
}
this.setAutoCreateColumnsFromModel(false);
@ -165,6 +180,10 @@ public class ComponentPresetTable extends JTable {
});
}
public XTableColumnModel getXColumnModel() {
return tableColumnModel;
}
public void setRowFilter( RowFilter<? super TableModel ,? super Integer> filter ) {
sorter.setRowFilter( filter );
}