Add CustomFocusTraversalPolicy for BodyTubeConfig general

This commit is contained in:
SiboVG 2022-08-14 11:46:09 +02:00
parent 03cd1df7d4
commit e5ee5640e1
2 changed files with 31 additions and 2 deletions

View File

@ -12,17 +12,24 @@ import java.util.List;
* @author Sibo Van Gool <sibo.vangool@hotmail.com>
*/
public class CustomFocusTraversalPolicy extends FocusTraversalPolicy {
List<Component> order;
private final List<Component> order;
/**
* @param order the order of components to traverse
*/
public CustomFocusTraversalPolicy(List<Component> order) {
this.order = new LinkedList<Component>(order);
this.order = new LinkedList<>(order);
}
public Component getComponentAfter(Container focusCycleRoot, Component aComponent) {
int idx = (order.indexOf(aComponent) + 1) % order.size();
int count = 0;
while (!order.get(idx).isEnabled()) {
idx = (idx + 1) % order.size();
count++;
if (count == order.size())
return aComponent;
}
return order.get(idx);
}
@ -31,6 +38,13 @@ public class CustomFocusTraversalPolicy extends FocusTraversalPolicy {
if (idx < 0) {
idx = order.size() - 1;
}
int count = 0;
while (!order.get(idx).isEnabled()) {
idx = (idx - 1) % order.size();
count++;
if (count == order.size())
return aComponent;
}
return order.get(idx);
}

View File

@ -11,6 +11,7 @@ import net.miginfocom.swing.MigLayout;
import net.sf.openrocket.document.OpenRocketDocument;
import net.sf.openrocket.gui.SpinnerEditor;
import net.sf.openrocket.gui.adaptors.BooleanModel;
import net.sf.openrocket.gui.adaptors.CustomFocusTraversalPolicy;
import net.sf.openrocket.gui.adaptors.DoubleModel;
import net.sf.openrocket.gui.components.BasicSlider;
import net.sf.openrocket.gui.components.UnitSelector;
@ -39,6 +40,8 @@ public class BodyTubeConfig extends RocketComponentConfig {
JPanel panel = new JPanel(new MigLayout("gap rel unrel", "[][65lp::][30lp::][]", ""));
final List<Component> order = new ArrayList<>(); // Component traversal order
//// Body tube length
panel.add(new JLabel(trans.get("BodyTubecfg.lbl.Bodytubelength")));
@ -49,6 +52,7 @@ public class BodyTubeConfig extends RocketComponentConfig {
spin.setEditor(new SpinnerEditor(spin));
focusElement = spin;
panel.add(spin, "growx");
order.add(((SpinnerEditor) spin.getEditor()).getTextField());
panel.add(new UnitSelector(length), "growx");
panel.add(new BasicSlider(length.getSliderModel(0, 0.5, maxLength)), "w 100lp, wrap");
@ -61,6 +65,7 @@ public class BodyTubeConfig extends RocketComponentConfig {
spin = new JSpinner(od.getSpinnerModel());
spin.setEditor(new SpinnerEditor(spin));
panel.add(spin, "growx");
order.add(((SpinnerEditor) spin.getEditor()).getTextField());
panel.add(new UnitSelector(od), "growx");
panel.add(new BasicSlider(od.getSliderModel(0, 0.04, 0.2)), "w 100lp, wrap 0px");
@ -70,6 +75,7 @@ public class BodyTubeConfig extends RocketComponentConfig {
checkAutoOuterRadius = new JCheckBox(outerAutoAction);
checkAutoOuterRadius.setText(trans.get("BodyTubecfg.checkbox.Automatic"));
panel.add(checkAutoOuterRadius, "skip, span 2, wrap");
order.add(checkAutoOuterRadius);
updateCheckboxAutoAftRadius();
//// Inner diameter
@ -80,6 +86,7 @@ public class BodyTubeConfig extends RocketComponentConfig {
spin = new JSpinner(innerRadiusModel.getSpinnerModel());
spin.setEditor(new SpinnerEditor(spin));
panel.add(spin, "growx");
order.add(((SpinnerEditor) spin.getEditor()).getTextField());
panel.add(new UnitSelector(innerRadiusModel), "growx");
panel.add(new BasicSlider(innerRadiusModel.getSliderModel(new DoubleModel(0), od)), "w 100lp, wrap");
@ -92,6 +99,7 @@ public class BodyTubeConfig extends RocketComponentConfig {
spin = new JSpinner(thicknessModel.getSpinnerModel());
spin.setEditor(new SpinnerEditor(spin));
panel.add(spin, "growx");
order.add(((SpinnerEditor) spin.getEditor()).getTextField());
panel.add(new UnitSelector(thicknessModel), "growx");
panel.add(new BasicSlider(thicknessModel.getSliderModel(0, 0.01)), "w 100lp, wrap 0px");
@ -100,14 +108,21 @@ public class BodyTubeConfig extends RocketComponentConfig {
JCheckBox check = new JCheckBox(new BooleanModel(component, "Filled"));
check.setText(trans.get("BodyTubecfg.checkbox.Filled"));
panel.add(check, "skip, span 2, wrap");
order.add(check);
//// Material
MaterialPanel materialPanel = new MaterialPanel(component, document, Material.Type.BULK);
order.add(materialPanel.getMaterialCombo());
if (materialPanel.getFinishCombo() != null) {
order.add(materialPanel.getFinishCombo());
}
panel.add(materialPanel, "cell 4 0, gapleft paragraph, aligny 0%, spany");
//// General and General properties
tabbedPane.insertTab(trans.get("BodyTubecfg.tab.General"), null, panel,
trans.get("BodyTubecfg.tab.Generalproperties"), 0);
CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order);
parent.setFocusTraversalPolicy(policy);
tabbedPane.setSelectedIndex(0);