diff --git a/swing/src/net/sf/openrocket/gui/adaptors/CustomFocusTraversalPolicy.java b/swing/src/net/sf/openrocket/gui/adaptors/CustomFocusTraversalPolicy.java index e60df25c3..d5a71a716 100644 --- a/swing/src/net/sf/openrocket/gui/adaptors/CustomFocusTraversalPolicy.java +++ b/swing/src/net/sf/openrocket/gui/adaptors/CustomFocusTraversalPolicy.java @@ -12,17 +12,24 @@ import java.util.List; * @author Sibo Van Gool */ public class CustomFocusTraversalPolicy extends FocusTraversalPolicy { - List order; + private final List order; /** * @param order the order of components to traverse */ public CustomFocusTraversalPolicy(List order) { - this.order = new LinkedList(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); } diff --git a/swing/src/net/sf/openrocket/gui/configdialog/BodyTubeConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/BodyTubeConfig.java index 712060cdf..3e64d386f 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/BodyTubeConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/BodyTubeConfig.java @@ -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 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);