From 9b5c0251d6a4d274cd660c1f153a8b68eb2042a8 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Thu, 14 Jul 2022 14:21:01 +0200 Subject: [PATCH 01/31] Don't focus slider + traversal policy --- .../adaptors/CustomFocusTraversalPolicy.java | 48 +++++++++++++++++++ .../gui/components/BasicSlider.java | 1 + 2 files changed, 49 insertions(+) create mode 100644 swing/src/net/sf/openrocket/gui/adaptors/CustomFocusTraversalPolicy.java diff --git a/swing/src/net/sf/openrocket/gui/adaptors/CustomFocusTraversalPolicy.java b/swing/src/net/sf/openrocket/gui/adaptors/CustomFocusTraversalPolicy.java new file mode 100644 index 000000000..e60df25c3 --- /dev/null +++ b/swing/src/net/sf/openrocket/gui/adaptors/CustomFocusTraversalPolicy.java @@ -0,0 +1,48 @@ +package net.sf.openrocket.gui.adaptors; + +import java.awt.Component; +import java.awt.Container; +import java.awt.FocusTraversalPolicy; +import java.util.LinkedList; +import java.util.List; + +/** + * Custom adapter class for focus traversal, based on a given order of GUI components + * + * @author Sibo Van Gool + */ +public class CustomFocusTraversalPolicy extends FocusTraversalPolicy { + List order; + + /** + * @param order the order of components to traverse + */ + public CustomFocusTraversalPolicy(List order) { + this.order = new LinkedList(order); + } + + public Component getComponentAfter(Container focusCycleRoot, Component aComponent) { + int idx = (order.indexOf(aComponent) + 1) % order.size(); + return order.get(idx); + } + + public Component getComponentBefore(Container focusCycleRoot, Component aComponent) { + int idx = order.indexOf(aComponent) - 1; + if (idx < 0) { + idx = order.size() - 1; + } + return order.get(idx); + } + + public Component getDefaultComponent(Container focusCycleRoot) { + return order.get(0); + } + + public Component getLastComponent(Container focusCycleRoot) { + return order.get(order.size() - 1); + } + + public Component getFirstComponent(Container focusCycleRoot) { + return order.get(0); + } +} diff --git a/swing/src/net/sf/openrocket/gui/components/BasicSlider.java b/swing/src/net/sf/openrocket/gui/components/BasicSlider.java index 6b182a45d..026641768 100644 --- a/swing/src/net/sf/openrocket/gui/components/BasicSlider.java +++ b/swing/src/net/sf/openrocket/gui/components/BasicSlider.java @@ -26,6 +26,7 @@ public class BasicSlider extends JSlider { super(brm); setOrientation(orientation); setInverted(inverted); + setFocusable(false); setUI(new BasicSliderUI(this)); } From 03cd1df7d4627e9b96bc3dbe98de0c2e1e1d7b97 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Sun, 14 Aug 2022 11:43:39 +0200 Subject: [PATCH 02/31] Refactor MaterialPanel to custom class --- .../gui/configdialog/BodyTubeConfig.java | 14 +-- .../configdialog/EllipticalFinSetConfig.java | 3 +- .../configdialog/FreeformFinSetConfig.java | 3 +- .../gui/configdialog/InnerTubeConfig.java | 4 +- .../gui/configdialog/LaunchLugConfig.java | 3 +- .../gui/configdialog/MaterialPanel.java | 108 ++++++++++++++++++ .../gui/configdialog/NoseConeConfig.java | 3 +- .../gui/configdialog/RailButtonConfig.java | 4 +- .../gui/configdialog/RingComponentConfig.java | 6 +- .../configdialog/RocketComponentConfig.java | 77 ------------- .../gui/configdialog/ShockCordConfig.java | 4 +- .../gui/configdialog/TransitionConfig.java | 3 +- .../configdialog/TrapezoidFinSetConfig.java | 3 +- .../gui/configdialog/TubeFinSetConfig.java | 3 +- 14 files changed, 137 insertions(+), 101 deletions(-) create mode 100644 swing/src/net/sf/openrocket/gui/configdialog/MaterialPanel.java diff --git a/swing/src/net/sf/openrocket/gui/configdialog/BodyTubeConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/BodyTubeConfig.java index 39fbaa2ba..712060cdf 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/BodyTubeConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/BodyTubeConfig.java @@ -6,8 +6,6 @@ import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSpinner; -import javax.swing.JTextField; -import javax.swing.SwingUtilities; import net.miginfocom.swing.MigLayout; import net.sf.openrocket.document.OpenRocketDocument; @@ -25,11 +23,9 @@ import net.sf.openrocket.rocketcomponent.SymmetricComponent; import net.sf.openrocket.startup.Application; import net.sf.openrocket.unit.UnitGroup; -import java.awt.event.FocusEvent; -import java.awt.event.FocusListener; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.util.Arrays; +import java.awt.Component; +import java.util.ArrayList; +import java.util.List; @SuppressWarnings("serial") public class BodyTubeConfig extends RocketComponentConfig { @@ -106,8 +102,8 @@ public class BodyTubeConfig extends RocketComponentConfig { panel.add(check, "skip, span 2, wrap"); //// Material - panel.add(materialPanel(Material.Type.BULK), - "cell 4 0, gapleft paragraph, aligny 0%, spany"); + MaterialPanel materialPanel = new MaterialPanel(component, document, Material.Type.BULK); + panel.add(materialPanel, "cell 4 0, gapleft paragraph, aligny 0%, spany"); //// General and General properties tabbedPane.insertTab(trans.get("BodyTubecfg.tab.General"), null, panel, diff --git a/swing/src/net/sf/openrocket/gui/configdialog/EllipticalFinSetConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/EllipticalFinSetConfig.java index db07228b2..27acfdb02 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/EllipticalFinSetConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/EllipticalFinSetConfig.java @@ -174,7 +174,8 @@ public class EllipticalFinSetConfig extends FinSetConfig { //// Material - panel.add(materialPanel(Material.Type.BULK), "span, wrap"); + MaterialPanel materialPanel = new MaterialPanel(component, document, Material.Type.BULK); + panel.add(materialPanel, "span, wrap"); panel.add(filletMaterialPanel(), "span, wrap"); diff --git a/swing/src/net/sf/openrocket/gui/configdialog/FreeformFinSetConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/FreeformFinSetConfig.java index b695e5dbf..53e74399f 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/FreeformFinSetConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/FreeformFinSetConfig.java @@ -202,7 +202,8 @@ public class FreeformFinSetConfig extends FinSetConfig { } { //// Material - panel.add(materialPanel(Material.Type.BULK), "span, wrap"); + MaterialPanel materialPanel = new MaterialPanel(component, document, Material.Type.BULK); + panel.add(materialPanel, "span, wrap"); panel.add(filletMaterialPanel(), "span, wrap"); } diff --git a/swing/src/net/sf/openrocket/gui/configdialog/InnerTubeConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/InnerTubeConfig.java index 3e3ddb3cb..5ebdeed12 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/InnerTubeConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/InnerTubeConfig.java @@ -144,8 +144,8 @@ public class InnerTubeConfig extends RocketComponentConfig { panel.add(new BasicSlider(m.getSliderModel(0, 0.1, 1.0)), "wmin 100lp, growx, wrap"); //// Material - panel.add(materialPanel(Material.Type.BULK), - "spanx 4, growx, wrap 15lp"); + MaterialPanel materialPanel = new MaterialPanel(component, document, Material.Type.BULK); + panel.add(materialPanel, "spanx 4, growx, wrap 15lp"); //// Right side of panel ---- diff --git a/swing/src/net/sf/openrocket/gui/configdialog/LaunchLugConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/LaunchLugConfig.java index 8302641bb..a82820ef0 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/LaunchLugConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/LaunchLugConfig.java @@ -142,7 +142,8 @@ public class LaunchLugConfig extends RocketComponentConfig { }); //// Material - panel.add(materialPanel( Material.Type.BULK), "span, wrap"); + MaterialPanel materialPanel = new MaterialPanel(component, document, Material.Type.BULK); + panel.add(materialPanel, "span, wrap"); primary.add(panel, "grow"); diff --git a/swing/src/net/sf/openrocket/gui/configdialog/MaterialPanel.java b/swing/src/net/sf/openrocket/gui/configdialog/MaterialPanel.java new file mode 100644 index 000000000..602a3c6e7 --- /dev/null +++ b/swing/src/net/sf/openrocket/gui/configdialog/MaterialPanel.java @@ -0,0 +1,108 @@ +package net.sf.openrocket.gui.configdialog; + +import net.miginfocom.swing.MigLayout; +import net.sf.openrocket.document.OpenRocketDocument; +import net.sf.openrocket.gui.adaptors.EnumModel; +import net.sf.openrocket.gui.adaptors.MaterialModel; +import net.sf.openrocket.gui.widgets.SelectColorButton; +import net.sf.openrocket.l10n.Translator; +import net.sf.openrocket.material.Material; +import net.sf.openrocket.rocketcomponent.ExternalComponent; +import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.startup.Application; + +import javax.swing.JButton; +import javax.swing.JComboBox; +import javax.swing.JLabel; +import javax.swing.JPanel; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.Iterator; + +/** + * Panel for configuring a component's material and finish properties. + */ +public class MaterialPanel extends JPanel { + private static final Translator trans = Application.getTranslator(); + + private final JComboBox materialCombo; + private final JComboBox finishCombo; + + public MaterialPanel(RocketComponent component, OpenRocketDocument document, + Material.Type type, String materialString, String finishString, String partName) { + super(new MigLayout("insets 0")); + JLabel label = new JLabel(materialString); + //// The component material affects the weight of the component. + label.setToolTipText(trans.get("RocketCompCfg.lbl.ttip.componentmaterialaffects")); + this.add(label, "spanx 4, wrap rel"); + + this.materialCombo = new JComboBox<>(new MaterialModel(this, component, type, partName)); + //// The component material affects the weight of the component. + this.materialCombo.setToolTipText(trans.get("RocketCompCfg.combo.ttip.componentmaterialaffects")); + this.add(this.materialCombo, "spanx 4, growx, wrap paragraph"); + + + if (component instanceof ExternalComponent) { + label = new JLabel(finishString); + ////The component finish affects the aerodynamic drag of the component.
+ String tip = trans.get("RocketCompCfg.lbl.longA1") + //// The value indicated is the average roughness height of the surface. + + trans.get("RocketCompCfg.lbl.longA2"); + label.setToolTipText(tip); + this.add(label, "spanx 4, wmin 220lp, wrap rel"); + + this.finishCombo = new JComboBox( + new EnumModel(component, "Finish")); + this.finishCombo.setToolTipText(tip); + this.add(this.finishCombo, "spanx 4, growx, split"); + + //// Set for all + JButton button = new SelectColorButton(trans.get("RocketCompCfg.but.Setforall")); + //// Set this finish for all components of the rocket. + button.setToolTipText(trans.get("RocketCompCfg.but.ttip.Setforall")); + button.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + ExternalComponent.Finish f = ((ExternalComponent) component).getFinish(); + try { + document.startUndo("Set rocket finish"); + + // Do changes + Iterator iter = component.getRoot().iterator(); + while (iter.hasNext()) { + RocketComponent c = iter.next(); + if (c instanceof ExternalComponent) { + ((ExternalComponent) c).setFinish(f); + } + } + } finally { + document.stopUndo(); + } + } + }); + this.add(button, "wrap paragraph"); + } else { + this.finishCombo = null; + } + } + + public MaterialPanel(RocketComponent component, OpenRocketDocument document, + Material.Type type, String partName) { + this(component, document, type, trans.get("RocketCompCfg.lbl.Componentmaterial"), + trans.get("RocketCompCfg.lbl.Componentfinish"), partName); + } + + public MaterialPanel(RocketComponent component, OpenRocketDocument document, + Material.Type type) { + this(component, document, type, trans.get("RocketCompCfg.lbl.Componentmaterial"), + trans.get("RocketCompCfg.lbl.Componentfinish"), "Material"); + } + + public JComboBox getMaterialCombo() { + return materialCombo; + } + + public JComboBox getFinishCombo() { + return finishCombo; + } +} diff --git a/swing/src/net/sf/openrocket/gui/configdialog/NoseConeConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/NoseConeConfig.java index 5f5881abc..7bb3473a8 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/NoseConeConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/NoseConeConfig.java @@ -147,7 +147,8 @@ public class NoseConeConfig extends RocketComponentConfig { //// Material - panel2.add(materialPanel( Material.Type.BULK), "span, wrap"); + MaterialPanel materialPanel = new MaterialPanel(component, document, Material.Type.BULK); + panel2.add(materialPanel, "span, wrap"); panel.add(panel2, "cell 4 0, gapleft paragraph, aligny 0%, spany"); diff --git a/swing/src/net/sf/openrocket/gui/configdialog/RailButtonConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/RailButtonConfig.java index be4803c42..7e9d9b178 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/RailButtonConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/RailButtonConfig.java @@ -7,7 +7,6 @@ import javax.swing.JPanel; import javax.swing.JSpinner; import net.miginfocom.swing.MigLayout; -import net.sf.openrocket.database.Databases; import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.gui.SpinnerEditor; import net.sf.openrocket.gui.adaptors.DoubleModel; @@ -128,7 +127,8 @@ public class RailButtonConfig extends RocketComponentConfig { panel.add(instanceablePanel(rbc), "span, wrap"); //// Material - panel.add(materialPanel(Material.Type.BULK),"span, wrap"); + MaterialPanel materialPanel = new MaterialPanel(component, document, Material.Type.BULK); + panel.add(materialPanel,"span, wrap"); primary.add(panel, "grow"); diff --git a/swing/src/net/sf/openrocket/gui/configdialog/RingComponentConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/RingComponentConfig.java index 27c2a4282..ad7521ea7 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/RingComponentConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/RingComponentConfig.java @@ -156,15 +156,15 @@ public class RingComponentConfig extends RocketComponentConfig { //// Material - JPanel sub = materialPanel( Material.Type.BULK); + MaterialPanel materialPanel = new MaterialPanel(component, document, Material.Type.BULK); if (component instanceof EngineBlock) { final DescriptionArea desc = new DescriptionArea(6); //// An engine block stops the motor from moving forwards in the motor mount tube.

In order to add a motor, create a body tube or inner tube and mark it as a motor mount in the Motor tab. desc.setText(trans.get("ringcompcfg.EngineBlock.desc")); - sub.add(desc, "width 1px, growx, wrap"); + materialPanel.add(desc, "width 1px, growx, wrap"); } - panel.add(sub, "cell 4 0, gapleft paragraph, aligny 0%, spany"); + panel.add(materialPanel, "cell 4 0, gapleft paragraph, aligny 0%, spany"); return panel; } diff --git a/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java index 57e7568d2..4000e15ca 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java @@ -30,9 +30,7 @@ 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.DoubleModel; -import net.sf.openrocket.gui.adaptors.EnumModel; import net.sf.openrocket.gui.adaptors.IntegerModel; -import net.sf.openrocket.gui.adaptors.MaterialModel; import net.sf.openrocket.gui.adaptors.PresetModel; import net.sf.openrocket.gui.components.BasicSlider; import net.sf.openrocket.gui.components.StyledLabel; @@ -42,10 +40,8 @@ import net.sf.openrocket.gui.dialogs.preset.ComponentPresetChooserDialog; import net.sf.openrocket.gui.util.GUIUtil; import net.sf.openrocket.gui.widgets.SelectColorButton; import net.sf.openrocket.l10n.Translator; -import net.sf.openrocket.material.Material; import net.sf.openrocket.preset.ComponentPreset; import net.sf.openrocket.rocketcomponent.*; -import net.sf.openrocket.rocketcomponent.ExternalComponent.Finish; import net.sf.openrocket.rocketcomponent.position.AxialMethod; import net.sf.openrocket.startup.Application; import net.sf.openrocket.unit.UnitGroup; @@ -277,79 +273,6 @@ public class RocketComponentConfig extends JPanel { appearancePanel.clearConfigListeners(); } } - - protected JPanel materialPanel(Material.Type type) { - ////Component material: and Component finish: - return materialPanel(type, - trans.get("RocketCompCfg.lbl.Componentmaterial"), - trans.get("RocketCompCfg.lbl.Componentfinish"), - "Material"); - } - - protected JPanel materialPanel(Material.Type type, String partName){ - return materialPanel(type, trans.get("RocketCompCfg.lbl.Componentmaterial"), - trans.get("RocketCompCfg.lbl.Componentfinish"), partName); - } - - protected JPanel materialPanel(Material.Type type, - String materialString, - String finishString, - String partName) { - - JPanel subPanel = new JPanel(new MigLayout("insets 0")); - JLabel label = new JLabel(materialString); - //// The component material affects the weight of the component. - label.setToolTipText(trans.get("RocketCompCfg.lbl.ttip.componentmaterialaffects")); - subPanel.add(label, "spanx 4, wrap rel"); - - JComboBox materialCombo = new JComboBox(new MaterialModel(subPanel, component, type, partName)); - //// The component material affects the weight of the component. - materialCombo.setToolTipText(trans.get("RocketCompCfg.combo.ttip.componentmaterialaffects")); - subPanel.add(materialCombo, "spanx 4, growx, wrap paragraph"); - - - if (component instanceof ExternalComponent) { - label = new JLabel(finishString); - ////The component finish affects the aerodynamic drag of the component.
- String tip = trans.get("RocketCompCfg.lbl.longA1") - //// The value indicated is the average roughness height of the surface. - + trans.get("RocketCompCfg.lbl.longA2"); - label.setToolTipText(tip); - subPanel.add(label, "spanx 4, wmin 220lp, wrap rel"); - - JComboBox finishCombo = new JComboBox( - new EnumModel(component, "Finish")); - finishCombo.setToolTipText(tip); - subPanel.add( finishCombo, "spanx 4, growx, split"); - - //// Set for all - JButton button = new SelectColorButton(trans.get("RocketCompCfg.but.Setforall")); - //// Set this finish for all components of the rocket. - button.setToolTipText(trans.get("RocketCompCfg.but.ttip.Setforall")); - button.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - Finish f = ((ExternalComponent) component).getFinish(); - try { - document.startUndo("Set rocket finish"); - - // Do changes - Iterator iter = component.getRoot().iterator(); - while (iter.hasNext()) { - RocketComponent c = iter.next(); - if (c instanceof ExternalComponent) { - ((ExternalComponent) c).setFinish(f); - } - } - } finally { - document.stopUndo(); - } - } - }); - subPanel.add(button, "wrap paragraph"); - } - return subPanel; - } public int getSelectedTabIndex() { return tabbedPane.getSelectedIndex(); diff --git a/swing/src/net/sf/openrocket/gui/configdialog/ShockCordConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/ShockCordConfig.java index a7a6e8a78..48fa2501b 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/ShockCordConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/ShockCordConfig.java @@ -56,7 +56,9 @@ public class ShockCordConfig extends RocketComponentConfig { // Material //// Shock cord material: - panel.add(materialPanel(Material.Type.LINE, trans.get("ShockCordCfg.lbl.Shockcordmaterial"), null, "Material"), "spanx 4, wrap"); + MaterialPanel materialPanel = new MaterialPanel(component, document, Material.Type.LINE, + trans.get("ShockCordCfg.lbl.Shockcordmaterial"), null, "Material"); + panel.add(materialPanel, "spanx 4, wrap"); diff --git a/swing/src/net/sf/openrocket/gui/configdialog/TransitionConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/TransitionConfig.java index 05975823b..33793e290 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/TransitionConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/TransitionConfig.java @@ -178,7 +178,8 @@ public class TransitionConfig extends RocketComponentConfig { //// Material - panel2.add(materialPanel(Material.Type.BULK), "span, wrap"); + MaterialPanel materialPanel = new MaterialPanel(component, document, Material.Type.BULK); + panel2.add(materialPanel, "span, wrap"); panel.add(panel2, "cell 4 0, gapleft paragraph, aligny 0%, spany"); //// General and General properties diff --git a/swing/src/net/sf/openrocket/gui/configdialog/TrapezoidFinSetConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/TrapezoidFinSetConfig.java index 208cd2aac..d8acc3b80 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/TrapezoidFinSetConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/TrapezoidFinSetConfig.java @@ -223,7 +223,8 @@ public class TrapezoidFinSetConfig extends FinSetConfig { //// Material - panel.add(materialPanel(Material.Type.BULK), "span, wrap"); + MaterialPanel materialPanel = new MaterialPanel(component, document, Material.Type.BULK); + panel.add(materialPanel, "span, wrap"); diff --git a/swing/src/net/sf/openrocket/gui/configdialog/TubeFinSetConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/TubeFinSetConfig.java index e9de11352..45fcc5f7e 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/TubeFinSetConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/TubeFinSetConfig.java @@ -158,7 +158,8 @@ public class TubeFinSetConfig extends RocketComponentConfig { //// Material - panel.add(materialPanel(Material.Type.BULK), "span, wrap"); + MaterialPanel materialPanel = new MaterialPanel(component, document, Material.Type.BULK); + panel.add(materialPanel, "span, wrap"); primary.add(panel, "grow"); From e5ee5640e15407adcaf2721b7860b44e8291bfde Mon Sep 17 00:00:00 2001 From: SiboVG Date: Sun, 14 Aug 2022 11:46:09 +0200 Subject: [PATCH 03/31] Add CustomFocusTraversalPolicy for BodyTubeConfig general --- .../adaptors/CustomFocusTraversalPolicy.java | 18 ++++++++++++++++-- .../gui/configdialog/BodyTubeConfig.java | 15 +++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) 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); From 5e4ef370482ccf52453e7738d30664d185e6101e Mon Sep 17 00:00:00 2001 From: SiboVG Date: Sun, 14 Aug 2022 16:29:08 +0200 Subject: [PATCH 04/31] Add traversal policy for body tube config --- .../adaptors/CustomFocusTraversalPolicy.java | 6 +++- .../gui/configdialog/AppearancePanel.java | 34 +++++++++++++++++-- .../gui/configdialog/BodyTubeConfig.java | 9 +++-- .../gui/configdialog/InnerTubeConfig.java | 4 +-- .../gui/configdialog/MotorConfig.java | 7 +++- .../configdialog/RocketComponentConfig.java | 25 ++++++++++++-- 6 files changed, 71 insertions(+), 14 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/adaptors/CustomFocusTraversalPolicy.java b/swing/src/net/sf/openrocket/gui/adaptors/CustomFocusTraversalPolicy.java index d5a71a716..00f10b01c 100644 --- a/swing/src/net/sf/openrocket/gui/adaptors/CustomFocusTraversalPolicy.java +++ b/swing/src/net/sf/openrocket/gui/adaptors/CustomFocusTraversalPolicy.java @@ -22,11 +22,15 @@ public class CustomFocusTraversalPolicy extends FocusTraversalPolicy { } public Component getComponentAfter(Container focusCycleRoot, Component aComponent) { + // Get the next component int idx = (order.indexOf(aComponent) + 1) % order.size(); + + // If the next component is disabled, loop for the next enabled one int count = 0; - while (!order.get(idx).isEnabled()) { + while (!order.get(idx).isEnabled() || !order.get(idx).isShowing() || !order.get(idx).isVisible()) { idx = (idx + 1) % order.size(); count++; + // No active component found, fall back to the original component if (count == order.size()) return aComponent; } diff --git a/swing/src/net/sf/openrocket/gui/configdialog/AppearancePanel.java b/swing/src/net/sf/openrocket/gui/configdialog/AppearancePanel.java index a4658dd19..42f4cc225 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/AppearancePanel.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/AppearancePanel.java @@ -1,10 +1,12 @@ package net.sf.openrocket.gui.configdialog; import java.awt.Color; +import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.lang.reflect.Method; import java.util.EventObject; +import java.util.List; import javax.swing.JPanel; import javax.swing.JColorChooser; @@ -84,6 +86,8 @@ public class AppearancePanel extends JPanel { private JCheckBox customInside = null; + private final List order; // Component traversal order + /** * A non-unit that adjusts by a small amount, suitable for values that are * on the 0-1 scale @@ -198,10 +202,17 @@ public class AppearancePanel extends JPanel { } } - - public AppearancePanel(final OpenRocketDocument document, final RocketComponent c, final JDialog parent) { + /** + * Appearance panel for the appearance of a rocket component. + * @param document current document + * @param c component to change the appearance of + * @param parent parent dialog + * @param order component traversal order object of the component config dialog + */ + public AppearancePanel(final OpenRocketDocument document, final RocketComponent c, final JDialog parent, List order) { super(new MigLayout("fill", "[150][grow][150][grow]")); + this.order = order; defaultAppearance = DefaultAppearance.getDefaultAppearance(c); previousUserSelectedAppearance = c.getAppearance(); @@ -298,6 +309,7 @@ public class AppearancePanel extends JPanel { add(new StyledLabel(trans.get("RocketCompCfg.lbl.Figurestyle"), Style.BOLD)); add(colorDefault); + order.add(colorDefault); JButton button = new SelectColorButton( trans.get("RocketCompCfg.but.Saveasdefstyle")); @@ -324,6 +336,7 @@ public class AppearancePanel extends JPanel { add(new JLabel(trans.get("RocketCompCfg.lbl.Componentcolor"))); fDefault.addEnableComponent(figureColorButton, false); add(figureColorButton); + order.add(figureColorButton); } {// Line Style @@ -341,6 +354,7 @@ public class AppearancePanel extends JPanel { fDefault.addEnableComponent(combo, false); add(combo, "growx, wrap"); + order.add(combo); } add(new JSeparator(SwingConstants.HORIZONTAL), "span, wrap, growx"); @@ -370,8 +384,9 @@ public class AppearancePanel extends JPanel { customInside.setText(trans.get(tr_insideOutside)); customInside.setToolTipText(trans.get(tr_insideOutside_ttip)); add(customInside, "span 2"); + order.add(customInside); - // Checkbox to set edges the same as inside/outside + // Combobox for setting the edge appearance from inside/outside appearance JLabel edgesText = new JLabel(trans.get("AppearanceCfg.lbl.AppearanceEdges")); add(edgesText); String[] options = new String[] {trans.get(tr_outside), trans.get(tr_inside)}; @@ -383,6 +398,7 @@ public class AppearancePanel extends JPanel { edgesComboBox.setSelectedItem(trans.get(tr_outside)); } add(edgesComboBox, "growx, left, wrap"); + order.add(edgesComboBox); edgesText.setToolTipText(trans.get("AppearanceCfg.lbl.ttip.AppearanceEdges")); edgesComboBox.setToolTipText(trans.get("AppearanceCfg.lbl.ttip.AppearanceEdges")); @@ -544,6 +560,7 @@ public class AppearancePanel extends JPanel { }); materialDefault.setText(trans.get("AppearanceCfg.lbl.Usedefault")); panel.add(materialDefault, "wrap"); + order.add(materialDefault); // Texture File panel.add(new JLabel(trans.get("AppearanceCfg.lbl.Texture"))); @@ -551,6 +568,7 @@ public class AppearancePanel extends JPanel { mDefault.addEnableComponent(textureDropDown, false); p.add(textureDropDown, "grow"); panel.add(p, "span 3, growx, wrap"); + order.add(textureDropDown); JButton editBtn = new SelectColorButton( trans.get("AppearanceCfg.but.edit")); editBtn.setEnabled(builder.getImage() != null); @@ -585,6 +603,7 @@ public class AppearancePanel extends JPanel { panel.add(new JLabel(trans.get("AppearanceCfg.lbl.color.Color"))); mDefault.addEnableComponent(colorButton, false); panel.add(colorButton); + order.add(colorButton); // Scale panel.add(new JLabel(trans.get("AppearanceCfg.lbl.texture.scale"))); @@ -595,6 +614,7 @@ public class AppearancePanel extends JPanel { scaleU.setEditor(new SpinnerEditor(scaleU)); mDefault.addEnableComponent(scaleU, false); panel.add(scaleU, "w 40"); + order.add(((SpinnerEditor) scaleU.getEditor()).getTextField()); panel.add(new JLabel("y:")); JSpinner scaleV = new JSpinner(new DoubleModel(builder, "ScaleY", @@ -602,6 +622,7 @@ public class AppearancePanel extends JPanel { scaleV.setEditor(new SpinnerEditor(scaleV)); mDefault.addEnableComponent(scaleV, false); panel.add(scaleV, "wrap, w 40"); + order.add(((SpinnerEditor) scaleV.getEditor()).getTextField()); // Shine panel.add(new JLabel(trans.get("AppearanceCfg.lbl.shine"))); @@ -622,6 +643,7 @@ public class AppearancePanel extends JPanel { panel.add(spinShine, "split 3, w 60"); panel.add(unitShine); panel.add(slideShine, "w 50, growx"); + order.add(order.indexOf(colorButton) + 1, ((SpinnerEditor) spinShine.getEditor()).getTextField()); // Offset panel.add(new JLabel(trans.get("AppearanceCfg.lbl.texture.offset"))); @@ -632,6 +654,7 @@ public class AppearancePanel extends JPanel { offsetU.setEditor(new SpinnerEditor(offsetU)); mDefault.addEnableComponent(offsetU, false); panel.add(offsetU, "w 40"); + order.add(((SpinnerEditor) offsetU.getEditor()).getTextField()); panel.add(new JLabel("y:")); JSpinner offsetV = new JSpinner(new DoubleModel(builder, "OffsetV", @@ -639,6 +662,7 @@ public class AppearancePanel extends JPanel { offsetV.setEditor(new SpinnerEditor(offsetV)); mDefault.addEnableComponent(offsetV, false); panel.add(offsetV, "wrap, w 40"); + order.add(((SpinnerEditor) offsetV.getEditor()).getTextField()); // Opacity panel.add(new JLabel(trans.get("AppearanceCfg.lbl.opacity"))); @@ -656,6 +680,8 @@ public class AppearancePanel extends JPanel { panel.add(spinOpacity, "split 3, w 60"); panel.add(unitOpacity); panel.add(slideOpacity, "w 50, growx"); + order.add(order.indexOf(((SpinnerEditor) spinShine.getEditor()).getTextField()) + 1, + ((SpinnerEditor) spinOpacity.getEditor()).getTextField()); // Rotation panel.add(new JLabel(trans.get("AppearanceCfg.lbl.texture.rotation"))); @@ -665,6 +691,7 @@ public class AppearancePanel extends JPanel { rotation.setEditor(new SpinnerEditor(rotation)); mDefault.addEnableComponent(rotation, false); panel.add(rotation, "split 3, w 50"); + order.add(((SpinnerEditor) rotation.getEditor()).getTextField()); panel.add(new UnitSelector(rotationModel)); BasicSlider bs = new BasicSlider(rotationModel.getSliderModel( -Math.PI, Math.PI)); @@ -680,6 +707,7 @@ public class AppearancePanel extends JPanel { "EdgeMode", list)); mDefault.addEnableComponent(combo, false); panel.add(combo, "wrap"); + order.add(combo); builder.addChangeListener(new StateChangeListener() { double lastOpacity = builder.getOpacity(); diff --git a/swing/src/net/sf/openrocket/gui/configdialog/BodyTubeConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/BodyTubeConfig.java index 3e64d386f..80ea20c5e 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/BodyTubeConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/BodyTubeConfig.java @@ -40,8 +40,6 @@ 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"))); @@ -121,16 +119,17 @@ public class BodyTubeConfig extends RocketComponentConfig { //// 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); - MotorConfig motorConfig = new MotorConfig((MotorMount)c); + MotorConfig motorConfig = new MotorConfig((MotorMount)c, order); tabbedPane.insertTab(trans.get("BodyTubecfg.tab.Motor"), null, motorConfig, trans.get("BodyTubecfg.tab.Motormountconf"), 1); + CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); + parent.setFocusTraversalPolicy(policy); + } @Override diff --git a/swing/src/net/sf/openrocket/gui/configdialog/InnerTubeConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/InnerTubeConfig.java index 5ebdeed12..c41e9d8a6 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/InnerTubeConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/InnerTubeConfig.java @@ -182,10 +182,10 @@ public class InnerTubeConfig extends RocketComponentConfig { tabbedPane.insertTab(trans.get("ThicknessRingCompCfg.tab.General"), null, panel, trans.get("ThicknessRingCompCfg.tab.Generalprop"), 0); - MotorConfig motorConfig = new MotorConfig((MotorMount)c); + /*MotorConfig motorConfig = new MotorConfig((MotorMount)c); tabbedPane.insertTab(trans.get("InnerTubeCfg.tab.Motor"), null, motorConfig, - trans.get("InnerTubeCfg.tab.ttip.Motor"), 1); + trans.get("InnerTubeCfg.tab.ttip.Motor"), 1);*/ JPanel tab = clusterTab(); //// Cluster and Cluster configuration diff --git a/swing/src/net/sf/openrocket/gui/configdialog/MotorConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/MotorConfig.java index a1f4192ca..b5f8737d2 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/MotorConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/MotorConfig.java @@ -3,6 +3,7 @@ package net.sf.openrocket.gui.configdialog; import java.awt.Component; import java.awt.Container; +import java.util.List; import javax.swing.JCheckBox; import javax.swing.JComboBox; @@ -34,7 +35,7 @@ public class MotorConfig extends JPanel { private final MotorMount mount; private static final Translator trans = Application.getTranslator(); - public MotorConfig(MotorMount motorMount) { + public MotorConfig(MotorMount motorMount, List order) { super(new MigLayout("fill")); this.mount = motorMount; @@ -46,6 +47,7 @@ public class MotorConfig extends JPanel { ////This component is a motor mount check.setText(trans.get("MotorCfg.checkbox.compmotormount")); this.add(check, "wrap"); + order.add(check); final JPanel panel = new JPanel(new MigLayout("fill")); this.add(panel, "grow, wrap"); @@ -60,6 +62,7 @@ public class MotorConfig extends JPanel { JSpinner spin = new JSpinner(dm.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "span, split, width :65lp:"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(dm), "width :30lp:"); panel.add(new BasicSlider(dm.getSliderModel(-0.02, 0.06)), "w 100lp, wrap unrel"); @@ -74,6 +77,7 @@ public class MotorConfig extends JPanel { final EnumModel igEvModel = new EnumModel(motorInstance, "IgnitionEvent", IgnitionEvent.values()); final JComboBox eventBox = new JComboBox( igEvModel); panel.add(eventBox , "growx, wrap"); + order.add(eventBox); // ... and delay //// plus @@ -83,6 +87,7 @@ public class MotorConfig extends JPanel { spin = new JSpinner(dm.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin, 3)); panel.add(spin, "gap rel rel"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); //// seconds panel.add(new JLabel(trans.get("MotorCfg.lbl.seconds")), "wrap unrel"); diff --git a/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java index 4000e15ca..ce6bbfc91 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java @@ -55,8 +55,10 @@ public class RocketComponentConfig extends JPanel { protected final OpenRocketDocument document; protected final RocketComponent component; protected final JTabbedPane tabbedPane; + protected final JDialog parent; private final List invalidatables = new ArrayList(); + protected final List order = new ArrayList<>(); // Component traversal order private JComboBox presetComboBox; private PresetModel presetModel; @@ -80,6 +82,7 @@ public class RocketComponentConfig extends JPanel { this.document = document; this.component = component; + this.parent = parent; // Check the listeners for the same type and massive status allSameType = true; @@ -110,6 +113,7 @@ public class RocketComponentConfig extends JPanel { //// The component name. componentNameField.setToolTipText(trans.get("RocketCompCfg.lbl.Componentname.ttip")); this.add(componentNameField, "growx"); + order.add(componentNameField); if (allSameType && component.getPresetType() != null) { // If the component supports a preset, show the preset selection box. @@ -119,6 +123,7 @@ public class RocketComponentConfig extends JPanel { presetComboBox.setEditable(false); presetComboBox.setToolTipText(trans.get("PresetModel.combo.ttip")); this.add(presetComboBox, "growx 110"); + order.add(presetComboBox); final JButton selectPreset = new SelectColorButton(trans.get("PresetModel.lbl.partsLib")); selectPreset.setToolTipText(trans.get("PresetModel.lbl.partsLib.ttip")); @@ -139,7 +144,7 @@ public class RocketComponentConfig extends JPanel { trans.get("RocketCompCfg.tab.Override.ttip")); if (allMassive) { //// Appearance options - appearancePanel = new AppearancePanel(document, component, parent); + appearancePanel = new AppearancePanel(document, component, parent, order); tabbedPane.addTab(trans.get("RocketCompCfg.tab.Appearance"), null, appearancePanel, trans.get("RocketCompCfg.tab.Appearance.ttip")); } @@ -336,7 +341,7 @@ public class RocketComponentConfig extends JPanel { //// Override the mass or center of gravity of the panel.add(new StyledLabel(trans.get("RocketCompCfg.lbl.Overridemassorcenter") + " " + component.getComponentName() + ":", Style.BOLD), "spanx, wrap 20lp"); - + JCheckBox check; BooleanModel bm; UnitSelector us; @@ -348,6 +353,7 @@ public class RocketComponentConfig extends JPanel { //// Override mass: check.setText(trans.get("RocketCompCfg.checkbox.Overridemass")); panel.add(check, "growx 1, gapright 20lp"); + order.add(check); DoubleModel m = new DoubleModel(component, "OverrideMass", UnitGroup.UNITS_MASS, 0); @@ -355,6 +361,7 @@ public class RocketComponentConfig extends JPanel { spin.setEditor(new SpinnerEditor(spin)); bm.addEnableComponent(spin, true); panel.add(spin, "growx 1"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); us = new UnitSelector(m); bm.addEnableComponent(us, true); @@ -373,6 +380,7 @@ public class RocketComponentConfig extends JPanel { //// Override center of gravity:" check.setText(trans.get("RocketCompCfg.checkbox.Overridecenterofgrav")); panel.add(check, "growx 1, gapright 20lp"); + order.add(check); m = new DoubleModel(component, "OverrideCGX", UnitGroup.UNITS_LENGTH, 0); // Calculate suitable length for slider @@ -410,6 +418,7 @@ public class RocketComponentConfig extends JPanel { spin.setEditor(new SpinnerEditor(spin)); bm.addEnableComponent(spin, true); panel.add(spin, "growx 1"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); us = new UnitSelector(m); bm.addEnableComponent(us, true); @@ -428,6 +437,7 @@ public class RocketComponentConfig extends JPanel { //// Override mass and CG of all subcomponents check.setText(trans.get("RocketCompCfg.checkbox.OverridemassandCG")); panel.add(check, "spanx, wrap 35lp"); + order.add(check); //BEGIN OVERRIDES CD --------------------------------------------------- @@ -438,6 +448,7 @@ public class RocketComponentConfig extends JPanel { //// Override coefficient of drag: check.setText(trans.get("RocketCompCfg.checkbox.SetDragCoeff")); panel.add(check, "growx 1, gapright 20lp"); + order.add(check); m = new DoubleModel(component, "OverrideCD", UnitGroup.UNITS_COEFFICIENT, 0); spin = new JSpinner(m.getSpinnerModel()); @@ -445,6 +456,7 @@ public class RocketComponentConfig extends JPanel { spin.setEditor(new SpinnerEditor(spin)); bm.addEnableComponent(spin, true); panel.add(spin, "growx 1"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); bs = new BasicSlider(m.getSliderModel(0, 1.0)); @@ -481,6 +493,7 @@ public class RocketComponentConfig extends JPanel { commentTextArea.addFocusListener(textFieldListener); panel.add(new JScrollPane(commentTextArea), "grow"); + order.add(commentTextArea); return panel; } @@ -515,6 +528,7 @@ public class RocketComponentConfig extends JPanel { spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); sub.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); sub.add(new UnitSelector(m), "growx"); sub.add(new BasicSlider(m.getSliderModel(m0, m2)), "w 100lp, wrap"); @@ -528,6 +542,7 @@ public class RocketComponentConfig extends JPanel { spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); sub.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); sub.add(new UnitSelector(m), "growx"); sub.add(new BasicSlider(m.getSliderModel(0, 0.02, 0.2)), "w 100lp, wrap"); @@ -542,6 +557,7 @@ public class RocketComponentConfig extends JPanel { spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); sub.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); sub.add(new UnitSelector(m), "growx"); sub.add(new BasicSlider(m.getSliderModel(m0, m2)), "w 100lp, wrap"); @@ -555,6 +571,7 @@ public class RocketComponentConfig extends JPanel { //// Whether the end of the shoulder is capped. check.setToolTipText(trans.get("RocketCompCfg.ttip.Endcapped")); sub.add(check, "spanx"); + order.add(check); panel.add(sub); @@ -582,6 +599,7 @@ public class RocketComponentConfig extends JPanel { spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); sub.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); sub.add(new UnitSelector(m), "growx"); sub.add(new BasicSlider(m.getSliderModel(m0, m2)), "w 100lp, wrap"); @@ -595,6 +613,7 @@ public class RocketComponentConfig extends JPanel { spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); sub.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); sub.add(new UnitSelector(m), "growx"); sub.add(new BasicSlider(m.getSliderModel(0, 0.02, 0.2)), "w 100lp, wrap"); @@ -609,6 +628,7 @@ public class RocketComponentConfig extends JPanel { spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); sub.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); sub.add(new UnitSelector(m), "growx"); sub.add(new BasicSlider(m.getSliderModel(m0, m2)), "w 100lp, wrap"); @@ -622,6 +642,7 @@ public class RocketComponentConfig extends JPanel { //// Whether the end of the shoulder is capped. check.setToolTipText(trans.get("RocketCompCfg.ttip.Endcapped")); sub.add(check, "spanx"); + order.add(check); panel.add(sub); From 6be54e1d4877174d269df833d81cd1258535b405 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Sun, 14 Aug 2022 17:09:28 +0200 Subject: [PATCH 05/31] Fix small issues in traversal policy --- .../gui/adaptors/CustomFocusTraversalPolicy.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/adaptors/CustomFocusTraversalPolicy.java b/swing/src/net/sf/openrocket/gui/adaptors/CustomFocusTraversalPolicy.java index 00f10b01c..5604e5f87 100644 --- a/swing/src/net/sf/openrocket/gui/adaptors/CustomFocusTraversalPolicy.java +++ b/swing/src/net/sf/openrocket/gui/adaptors/CustomFocusTraversalPolicy.java @@ -43,7 +43,7 @@ public class CustomFocusTraversalPolicy extends FocusTraversalPolicy { idx = order.size() - 1; } int count = 0; - while (!order.get(idx).isEnabled()) { + while (!order.get(idx).isEnabled() || !order.get(idx).isShowing() || !order.get(idx).isVisible()) { idx = (idx - 1) % order.size(); count++; if (count == order.size()) @@ -53,14 +53,22 @@ public class CustomFocusTraversalPolicy extends FocusTraversalPolicy { } public Component getDefaultComponent(Container focusCycleRoot) { - return order.get(0); + return getFirstComponent(focusCycleRoot); } public Component getLastComponent(Container focusCycleRoot) { - return order.get(order.size() - 1); + int idx = order.size() - 1; + if ((order.get(idx).isEnabled() && order.get(idx).isShowing() && order.get(idx).isVisible())) { + return order.get(idx); + } + return getComponentBefore(focusCycleRoot, order.get(idx)); } public Component getFirstComponent(Container focusCycleRoot) { - return order.get(0); + int idx = 0; + if ((order.get(idx).isEnabled() && order.get(idx).isShowing() && order.get(idx).isVisible())) { + return order.get(idx); + } + return getComponentAfter(focusCycleRoot, order.get(idx)); } } From 96711fa36ea07346031361f2eedbba25fc89b1a2 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Sun, 14 Aug 2022 17:09:40 +0200 Subject: [PATCH 06/31] Include tabs in traversal policy --- .../sf/openrocket/gui/configdialog/RocketComponentConfig.java | 1 + 1 file changed, 1 insertion(+) diff --git a/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java index ce6bbfc91..bba2c30a4 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java @@ -138,6 +138,7 @@ public class RocketComponentConfig extends JPanel { tabbedPane = new JTabbedPane(); this.add(tabbedPane, "newline, span, growx, growy 100, wrap"); + order.add(tabbedPane); //// Override and Mass and CG override options tabbedPane.addTab(trans.get("RocketCompCfg.tab.Override"), null, overrideTab(), From 11e9e71de6dabd4252c54f73b6949872d24d7fd0 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Sun, 14 Aug 2022 18:53:43 +0200 Subject: [PATCH 07/31] Fix MotorConfig order in InnerTubeConfig --- .../net/sf/openrocket/gui/configdialog/InnerTubeConfig.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/configdialog/InnerTubeConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/InnerTubeConfig.java index c41e9d8a6..3c4f281d1 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/InnerTubeConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/InnerTubeConfig.java @@ -182,10 +182,10 @@ public class InnerTubeConfig extends RocketComponentConfig { tabbedPane.insertTab(trans.get("ThicknessRingCompCfg.tab.General"), null, panel, trans.get("ThicknessRingCompCfg.tab.Generalprop"), 0); - /*MotorConfig motorConfig = new MotorConfig((MotorMount)c); + MotorConfig motorConfig = new MotorConfig((MotorMount)c, order); tabbedPane.insertTab(trans.get("InnerTubeCfg.tab.Motor"), null, motorConfig, - trans.get("InnerTubeCfg.tab.ttip.Motor"), 1);*/ + trans.get("InnerTubeCfg.tab.ttip.Motor"), 1); JPanel tab = clusterTab(); //// Cluster and Cluster configuration From 4b74f9e7c7d490302aaf0c34e8d1d639c36a720f Mon Sep 17 00:00:00 2001 From: SiboVG Date: Sun, 14 Aug 2022 18:54:24 +0200 Subject: [PATCH 08/31] Documentation --- swing/src/net/sf/openrocket/gui/configdialog/BodyTubeConfig.java | 1 + 1 file changed, 1 insertion(+) diff --git a/swing/src/net/sf/openrocket/gui/configdialog/BodyTubeConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/BodyTubeConfig.java index 80ea20c5e..495d002e7 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/BodyTubeConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/BodyTubeConfig.java @@ -127,6 +127,7 @@ public class BodyTubeConfig extends RocketComponentConfig { tabbedPane.insertTab(trans.get("BodyTubecfg.tab.Motor"), null, motorConfig, trans.get("BodyTubecfg.tab.Motormountconf"), 1); + // Apply the custom focus travel policy to this config dialog CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); parent.setFocusTraversalPolicy(policy); From d32afe62a6db8f798a029bd21e8a0f8046f75dbc Mon Sep 17 00:00:00 2001 From: Remington Holder Date: Sun, 14 Aug 2022 22:25:09 -0400 Subject: [PATCH 09/31] Add traversal policy for axial stage config --- .../sf/openrocket/gui/configdialog/AxialStageConfig.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/swing/src/net/sf/openrocket/gui/configdialog/AxialStageConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/AxialStageConfig.java index ae1d65b5e..c1202144c 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/AxialStageConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/AxialStageConfig.java @@ -9,6 +9,7 @@ import javax.swing.JSpinner; import net.miginfocom.swing.MigLayout; import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.gui.SpinnerEditor; +import net.sf.openrocket.gui.adaptors.CustomFocusTraversalPolicy; import net.sf.openrocket.gui.adaptors.DoubleModel; import net.sf.openrocket.gui.adaptors.EnumModel; import net.sf.openrocket.gui.components.StyledLabel; @@ -51,6 +52,7 @@ public class AxialStageConfig extends ComponentAssemblyConfig { //combo.setSelectedItem(sepConfig); panel.add(combo, ""); + order.add(combo); // ... and delay panel.add(new JLabel(trans.get("StageConfig.separation.lbl.plus")), ""); @@ -59,12 +61,17 @@ public class AxialStageConfig extends ComponentAssemblyConfig { JSpinner spin = new JSpinner(dm.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "width 45"); + order.add(((SpinnerEditor)spin.getEditor()).getTextField()); //// seconds panel.add(new JLabel(trans.get("StageConfig.separation.lbl.seconds")), "wrap unrel"); panel.add(new StyledLabel(CommonStrings.override_description, -1), "spanx, wrap para"); - + + // Apply the custom focus travel policy to this config dialog + CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); + parent.setFocusTraversalPolicy(policy); + return panel; } From 1d8da617a7125883ef6daa462b6308dc43efc076 Mon Sep 17 00:00:00 2001 From: Remington Holder Date: Mon, 15 Aug 2022 00:23:29 -0400 Subject: [PATCH 10/31] Add traversal policy for ring component config and subclasses --- .../gui/configdialog/RingComponentConfig.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/configdialog/RingComponentConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/RingComponentConfig.java index ad7521ea7..af0727233 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/RingComponentConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/RingComponentConfig.java @@ -11,6 +11,7 @@ import javax.swing.JSpinner; import net.miginfocom.swing.MigLayout; import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.gui.SpinnerEditor; +import net.sf.openrocket.gui.adaptors.CustomFocusTraversalPolicy; import net.sf.openrocket.gui.adaptors.DoubleModel; import net.sf.openrocket.gui.adaptors.EnumModel; import net.sf.openrocket.gui.components.BasicSlider; @@ -52,6 +53,7 @@ public class RingComponentConfig 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"); @@ -61,6 +63,7 @@ public class RingComponentConfig extends RocketComponentConfig { //// Automatic check.setText(trans.get("ringcompcfg.Automatic")); panel.add(check, "skip, span 2, wrap"); + order.add(check); } } @@ -75,6 +78,7 @@ public class RingComponentConfig extends RocketComponentConfig { spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); if (od == null) @@ -88,6 +92,7 @@ public class RingComponentConfig extends RocketComponentConfig { //// Automatic check.setText(trans.get("ringcompcfg.Automatic")); panel.add(check, "skip, span 2, wrap"); + order.add(check); } } @@ -102,6 +107,7 @@ public class RingComponentConfig extends RocketComponentConfig { spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(0, 0.01)), "w 100lp, wrap"); @@ -121,6 +127,7 @@ public class RingComponentConfig extends RocketComponentConfig { focusElement = spin; } panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(0, 0.1, 1.0)), "w 100lp, wrap"); @@ -135,6 +142,7 @@ public class RingComponentConfig extends RocketComponentConfig { final EnumModel methodModel = new EnumModel(component, "AxialMethod", AxialMethod.axialOffsetMethods ); final JComboBox positionCombo = new JComboBox( methodModel ); panel.add( positionCombo, "spanx 3, growx, wrap"); + order.add(positionCombo); //// plus panel.add(new JLabel(trans.get("ringcompcfg.plus")), "right"); @@ -147,6 +155,7 @@ public class RingComponentConfig extends RocketComponentConfig { focusElement = spin; } panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel( @@ -157,7 +166,8 @@ public class RingComponentConfig extends RocketComponentConfig { //// Material MaterialPanel materialPanel = new MaterialPanel(component, document, Material.Type.BULK); - + order.add(materialPanel.getMaterialCombo()); + if (component instanceof EngineBlock) { final DescriptionArea desc = new DescriptionArea(6); //// An engine block stops the motor from moving forwards in the motor mount tube.

In order to add a motor, create a body tube or inner tube and mark it as a motor mount in the Motor tab. @@ -165,7 +175,10 @@ public class RingComponentConfig extends RocketComponentConfig { materialPanel.add(desc, "width 1px, growx, wrap"); } panel.add(materialPanel, "cell 4 0, gapleft paragraph, aligny 0%, spany"); - + + CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); + parent.setFocusTraversalPolicy(policy); + return panel; } From 06efc9e3c44f72cde28d91f0f326e39876edc910 Mon Sep 17 00:00:00 2001 From: Remington Holder Date: Mon, 15 Aug 2022 00:32:35 -0400 Subject: [PATCH 11/31] Add traversal policy for inner tube config --- .../gui/configdialog/InnerTubeConfig.java | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/configdialog/InnerTubeConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/InnerTubeConfig.java index 3c4f281d1..df4f44c3a 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/InnerTubeConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/InnerTubeConfig.java @@ -32,6 +32,7 @@ import net.miginfocom.swing.MigLayout; import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.gui.Resettable; import net.sf.openrocket.gui.SpinnerEditor; +import net.sf.openrocket.gui.adaptors.CustomFocusTraversalPolicy; import net.sf.openrocket.gui.adaptors.DoubleModel; import net.sf.openrocket.gui.adaptors.EnumModel; import net.sf.openrocket.gui.components.BasicSlider; @@ -83,6 +84,7 @@ public class InnerTubeConfig 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)), "wmin 100lp, growx, wrap"); @@ -103,6 +105,7 @@ public class InnerTubeConfig extends RocketComponentConfig { spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(new DoubleModel(0), od)), "wmin 100lp, growx, wrap"); @@ -124,6 +127,7 @@ public class InnerTubeConfig extends RocketComponentConfig { spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(0, 0.01)), "wmin 100lp, growx, wrap"); @@ -139,6 +143,7 @@ public class InnerTubeConfig extends RocketComponentConfig { spin.setEditor(new SpinnerEditor(spin)); focusElement = spin; panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(0, 0.1, 1.0)), "wmin 100lp, growx, wrap"); @@ -146,6 +151,7 @@ public class InnerTubeConfig extends RocketComponentConfig { //// Material MaterialPanel materialPanel = new MaterialPanel(component, document, Material.Type.BULK); panel.add(materialPanel, "spanx 4, growx, wrap 15lp"); + order.add(materialPanel.getMaterialCombo()); //// Right side of panel ---- @@ -160,6 +166,7 @@ public class InnerTubeConfig extends RocketComponentConfig { JComboBox combo = new JComboBox( new EnumModel(component, "AxialMethod", AxialMethod.axialOffsetMethods )); panel2.add(combo, "spanx 3, growx, wrap"); + order.add(combo); //// plus panel2.add(new JLabel(trans.get("ringcompcfg.plus")), "right"); @@ -169,6 +176,7 @@ public class InnerTubeConfig extends RocketComponentConfig { spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel2.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel2.add(new UnitSelector(m), "growx"); panel2.add(new BasicSlider(m.getSliderModel( @@ -198,6 +206,10 @@ public class InnerTubeConfig extends RocketComponentConfig { trans.get("InnerTubeCfg.tab.ttip.Radialpos"), 3); tabbedPane.setSelectedIndex(0); + + CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); + parent.setFocusTraversalPolicy(policy); + } protected JPanel positionTab() { @@ -217,6 +229,7 @@ public class InnerTubeConfig extends RocketComponentConfig { //// Distance from the rocket centerline spin.setToolTipText(trans.get("ringcompcfg.Distancefrom")); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); BasicSlider bs = new BasicSlider(m.getSliderModel(0, 0.1, 1.0)); @@ -238,6 +251,7 @@ public class InnerTubeConfig extends RocketComponentConfig { //// The radial direction from the rocket centerline spin.setToolTipText(trans.get("ringcompcfg.radialdirectionfrom")); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); bs = new BasicSlider(m.getSliderModel(-Math.PI, Math.PI)); @@ -258,6 +272,7 @@ public class InnerTubeConfig extends RocketComponentConfig { } }); panel.add(button, "spanx, right, wrap para"); + order.add(button); DescriptionArea note = new DescriptionArea(3); @@ -265,6 +280,8 @@ public class InnerTubeConfig extends RocketComponentConfig { note.setText(trans.get("ringcompcfg.note.desc")); panel.add(note, "spanx, growx"); + CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); + parent.setFocusTraversalPolicy(policy); return panel; } @@ -301,6 +318,7 @@ public class InnerTubeConfig extends RocketComponentConfig { //// The separation of the tubes, 1.0 = touching each other spin.setToolTipText(trans.get("InnerTubeCfg.lbl.ttip.TubeSep")); subPanel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); BasicSlider bs = new BasicSlider(dm.getSliderModel(0, 1, 4)); //// The separation of the tubes, 1.0 = touching each other @@ -320,6 +338,7 @@ public class InnerTubeConfig extends RocketComponentConfig { //// Rotation angle of the cluster configuration spin.setToolTipText(trans.get("InnerTubeCfg.lbl.ttip.Rotation")); subPanel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); subPanel.add(new UnitSelector(dm), "growx"); bs = new BasicSlider(dm.getSliderModel(-Math.PI, 0, Math.PI)); @@ -378,7 +397,7 @@ public class InnerTubeConfig extends RocketComponentConfig { } }); subPanel.add(split, "spanx, split 2, gapright para, sizegroup buttons, right"); - + order.add(split); // Reset button ///// Reset settings @@ -393,14 +412,16 @@ public class InnerTubeConfig extends RocketComponentConfig { } }); subPanel.add(reset, "sizegroup buttons, right"); + order.add(reset); panel.add(subPanel, "grow"); + CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); + parent.setFocusTraversalPolicy(policy); return panel; } - } From 5df0d2f2ab23d2f7d479aef0fe7e50d6a02d7e8d Mon Sep 17 00:00:00 2001 From: Remington Holder Date: Mon, 15 Aug 2022 00:51:47 -0400 Subject: [PATCH 12/31] Remove unused imports from body tube config --- .../net/sf/openrocket/gui/configdialog/BodyTubeConfig.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/configdialog/BodyTubeConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/BodyTubeConfig.java index 495d002e7..4dbfc8010 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/BodyTubeConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/BodyTubeConfig.java @@ -24,10 +24,6 @@ import net.sf.openrocket.rocketcomponent.SymmetricComponent; import net.sf.openrocket.startup.Application; import net.sf.openrocket.unit.UnitGroup; -import java.awt.Component; -import java.util.ArrayList; -import java.util.List; - @SuppressWarnings("serial") public class BodyTubeConfig extends RocketComponentConfig { From 8954ca7a7debb24d4e22b55789fe66eeec04642f Mon Sep 17 00:00:00 2001 From: Remington Holder Date: Mon, 15 Aug 2022 10:24:41 -0400 Subject: [PATCH 13/31] Add documentation to inner tube & ring component configs --- .../net/sf/openrocket/gui/configdialog/InnerTubeConfig.java | 3 +++ .../sf/openrocket/gui/configdialog/RingComponentConfig.java | 1 + 2 files changed, 4 insertions(+) diff --git a/swing/src/net/sf/openrocket/gui/configdialog/InnerTubeConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/InnerTubeConfig.java index df4f44c3a..42b0517dc 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/InnerTubeConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/InnerTubeConfig.java @@ -207,6 +207,7 @@ public class InnerTubeConfig extends RocketComponentConfig { tabbedPane.setSelectedIndex(0); + // Apply the custom focus travel policy to this config dialog CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); parent.setFocusTraversalPolicy(policy); @@ -280,6 +281,7 @@ public class InnerTubeConfig extends RocketComponentConfig { note.setText(trans.get("ringcompcfg.note.desc")); panel.add(note, "spanx, growx"); + // Apply the custom focus travel policy to this config dialog CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); parent.setFocusTraversalPolicy(policy); @@ -416,6 +418,7 @@ public class InnerTubeConfig extends RocketComponentConfig { panel.add(subPanel, "grow"); + // Apply the custom focus travel policy to this config dialog CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); parent.setFocusTraversalPolicy(policy); diff --git a/swing/src/net/sf/openrocket/gui/configdialog/RingComponentConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/RingComponentConfig.java index af0727233..0579e21dd 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/RingComponentConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/RingComponentConfig.java @@ -176,6 +176,7 @@ public class RingComponentConfig extends RocketComponentConfig { } panel.add(materialPanel, "cell 4 0, gapleft paragraph, aligny 0%, spany"); + // Apply the custom focus travel policy to this config dialog CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); parent.setFocusTraversalPolicy(policy); From cfe16020a4233fdb0ac721676a4efb181f92073a Mon Sep 17 00:00:00 2001 From: Remington Holder Date: Mon, 15 Aug 2022 10:45:22 -0400 Subject: [PATCH 14/31] Add traversal policy for elliptical fin set config --- .../configdialog/EllipticalFinSetConfig.java | 21 +++++++++-- .../gui/configdialog/FinSetConfig.java | 36 +++++++++++++++---- 2 files changed, 49 insertions(+), 8 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/configdialog/EllipticalFinSetConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/EllipticalFinSetConfig.java index 27acfdb02..f62980e36 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/EllipticalFinSetConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/EllipticalFinSetConfig.java @@ -15,6 +15,7 @@ import javax.swing.SwingConstants; import net.miginfocom.swing.MigLayout; import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.gui.SpinnerEditor; +import net.sf.openrocket.gui.adaptors.CustomFocusTraversalPolicy; import net.sf.openrocket.gui.adaptors.DoubleModel; import net.sf.openrocket.gui.adaptors.EnumModel; import net.sf.openrocket.gui.adaptors.IntegerModel; @@ -51,6 +52,7 @@ public class EllipticalFinSetConfig extends FinSetConfig { spin = new JSpinner(im.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx, wrap"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); //// Base rotation @@ -61,6 +63,7 @@ public class EllipticalFinSetConfig extends FinSetConfig { spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(-Math.PI, Math.PI)), "w 100lp, wrap"); @@ -78,6 +81,7 @@ public class EllipticalFinSetConfig extends FinSetConfig { spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(-FinSet.MAX_CANT_RADIANS, FinSet.MAX_CANT_RADIANS)), @@ -93,6 +97,7 @@ public class EllipticalFinSetConfig extends FinSetConfig { spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(0, 0.05, 0.2)), "w 100lp, wrap"); @@ -106,6 +111,7 @@ public class EllipticalFinSetConfig extends FinSetConfig { spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(0, 0.05, 0.2)), "w 100lp, wrap"); @@ -118,6 +124,7 @@ public class EllipticalFinSetConfig extends FinSetConfig { final EnumModel axialMethodModel = new EnumModel(component, "AxialMethod", AxialMethod.axialOffsetMethods ); final JComboBox axialMethodCombo = new JComboBox( axialMethodModel ); panel.add(axialMethodCombo, "spanx, growx, wrap"); + order.add(axialMethodCombo); //// plus panel.add(new JLabel(trans.get("EllipticalFinSetCfg.plus")), "right"); @@ -126,6 +133,7 @@ public class EllipticalFinSetConfig extends FinSetConfig { spin = new JSpinner(axialOffsetModel.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); axialMethodCombo.addActionListener(new ActionListener() { @Override @@ -157,7 +165,7 @@ public class EllipticalFinSetConfig extends FinSetConfig { JComboBox sectionCombo = new JComboBox( new EnumModel(component, "CrossSection")); panel.add( sectionCombo, "growx, wrap unrel"); - + order.add(sectionCombo); //// Thickness: panel.add(new JLabel(trans.get("EllipticalFinSetCfg.Thickness"))); @@ -167,6 +175,7 @@ public class EllipticalFinSetConfig extends FinSetConfig { spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(0, 0.01)), "w 100lp, wrap 30lp"); @@ -176,7 +185,11 @@ public class EllipticalFinSetConfig extends FinSetConfig { //// Material MaterialPanel materialPanel = new MaterialPanel(component, document, Material.Type.BULK); panel.add(materialPanel, "span, wrap"); - + order.add(materialPanel.getMaterialCombo()); + if (materialPanel.getFinishCombo() != null) { + order.add(materialPanel.getFinishCombo()); + } + panel.add(filletMaterialPanel(), "span, wrap"); @@ -190,6 +203,10 @@ public class EllipticalFinSetConfig extends FinSetConfig { tabbedPane.insertTab(trans.get("EllipticalFinSetCfg.General"), null, mainPanel, trans.get("EllipticalFinSetCfg.Generalproperties"), 0); tabbedPane.setSelectedIndex(0); + + // Apply the custom focus travel policy to this config dialog + CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); + parent.setFocusTraversalPolicy(policy); } } diff --git a/swing/src/net/sf/openrocket/gui/configdialog/FinSetConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/FinSetConfig.java index ad1837219..9411834e4 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/FinSetConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/FinSetConfig.java @@ -20,6 +20,7 @@ import javax.swing.SwingUtilities; import net.miginfocom.swing.MigLayout; import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.gui.SpinnerEditor; +import net.sf.openrocket.gui.adaptors.CustomFocusTraversalPolicy; import net.sf.openrocket.gui.adaptors.DoubleModel; import net.sf.openrocket.gui.adaptors.EnumModel; import net.sf.openrocket.gui.adaptors.MaterialModel; @@ -134,11 +135,15 @@ public abstract class FinSetConfig extends RocketComponentConfig { }); split.setEnabled(((FinSet) component).getFinCount() > 1); - if (convert == null) + if (convert == null) { addButtons(split); - else + order.add(split); + } + else { addButtons(split, convert); - + order.add(split); + order.add(convert); + } } private JPanel finTabPanel() { @@ -175,10 +180,11 @@ public abstract class FinSetConfig extends RocketComponentConfig { panel.add(label, "gapleft para, gapright 40lp, growx 1"); final DoubleModel mtl = new DoubleModel(component, "TabLength", UnitGroup.UNITS_LENGTH, 0); - + spin = new JSpinner(mtl.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx 1"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(mtl), "growx 1"); panel.add(new BasicSlider(mtl.getSliderModel(DoubleModel.ZERO, length)), @@ -196,6 +202,7 @@ public abstract class FinSetConfig extends RocketComponentConfig { spin = new JSpinner(tabHeightModel.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(tabHeightModel), "growx"); panel.add(new BasicSlider(tabHeightModel.getSliderModel(DoubleModel.ZERO, length2)), @@ -212,6 +219,7 @@ public abstract class FinSetConfig extends RocketComponentConfig { spin = new JSpinner(mts.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(mts), "growx"); panel.add(new BasicSlider(mts.getSliderModel(length_2, length2)), "w 100lp, growx 5, wrap"); @@ -226,6 +234,7 @@ public abstract class FinSetConfig extends RocketComponentConfig { JComboBox enumCombo = new JComboBox<>(em); panel.add( enumCombo, "spanx 3, growx, wrap para"); + order.add(enumCombo); // Calculate fin tab height, length, and position autoCalc = new SelectColorButton(trans.get("FinSetConfig.but.AutoCalc")); @@ -284,7 +293,12 @@ public abstract class FinSetConfig extends RocketComponentConfig { } }); panel.add(autoCalc, "skip 1, spanx"); - + order.add(autoCalc); + + // Apply the custom focus travel policy to this panel + CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); + parent.setFocusTraversalPolicy(policy); + return panel; } @@ -499,6 +513,8 @@ public abstract class FinSetConfig extends RocketComponentConfig { trans.get("FinsetCfg.ttip.Finfillets2") + trans.get("FinsetCfg.ttip.Finfillets3"); filletPanel.setBorder(BorderFactory.createTitledBorder("Root Fillets")); + + // Fillet Radius: filletPanel.add(new JLabel(trans.get("FinSetCfg.lbl.Filletradius"))); DoubleModel m = new DoubleModel(component, "FilletRadius", UnitGroup.UNITS_LENGTH, 0); @@ -507,13 +523,15 @@ public abstract class FinSetConfig extends RocketComponentConfig { spin.setEditor(new SpinnerEditor(spin)); spin.setToolTipText(tip); filletPanel.add(spin, "growx, w 40"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); UnitSelector us = new UnitSelector(m); filletPanel.add(us, "growx"); us.setToolTipText(tip); BasicSlider bs =new BasicSlider(m.getSliderModel(0, 10)); filletPanel.add(bs, "w 100lp, wrap para"); bs.setToolTipText(tip); - + + // Fillet Material: JLabel label = new JLabel(trans.get("FinSetCfg.lbl.Finfilletmaterial")); label.setToolTipText(tip); //// The component material affects the weight of the component. @@ -525,7 +543,13 @@ public abstract class FinSetConfig extends RocketComponentConfig { //// The component material affects the weight of the component. materialCombo.setToolTipText(trans.get("RocketCompCfg.combo.ttip.componentmaterialaffects")); filletPanel.add( materialCombo, "spanx 4, growx, wrap paragraph"); + order.add(materialCombo); filletPanel.setToolTipText(tip); + + // Apply the custom focus travel policy to this panel + CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); + parent.setFocusTraversalPolicy(policy); + return filletPanel; } } From de3f89e6c8b78f732932bb1bea39a2f882a24826 Mon Sep 17 00:00:00 2001 From: Remington Holder Date: Mon, 15 Aug 2022 11:48:03 -0400 Subject: [PATCH 15/31] Add traversal policy for freform fin set config general tab --- .../gui/configdialog/FinSetConfig.java | 4 ++++ .../configdialog/FreeformFinSetConfig.java | 19 ++++++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/swing/src/net/sf/openrocket/gui/configdialog/FinSetConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/FinSetConfig.java index 9411834e4..3e657336d 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/FinSetConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/FinSetConfig.java @@ -144,6 +144,10 @@ public abstract class FinSetConfig extends RocketComponentConfig { order.add(split); order.add(convert); } + + // Apply the custom focus travel policy to these bottom buttons + CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); + parent.setFocusTraversalPolicy(policy); } private JPanel finTabPanel() { diff --git a/swing/src/net/sf/openrocket/gui/configdialog/FreeformFinSetConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/FreeformFinSetConfig.java index 53e74399f..be5bac790 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/FreeformFinSetConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/FreeformFinSetConfig.java @@ -35,6 +35,7 @@ import javax.swing.SwingConstants; import javax.swing.SwingUtilities; import javax.swing.table.AbstractTableModel; +import net.sf.openrocket.gui.adaptors.CustomFocusTraversalPolicy; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -113,6 +114,7 @@ public class FreeformFinSetConfig extends FinSetConfig { JSpinner spin = new JSpinner(finCountModel.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx, wrap"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); } { //// Base rotation @@ -123,6 +125,7 @@ public class FreeformFinSetConfig extends FinSetConfig { JSpinner spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(-Math.PI, Math.PI)), "w 100lp, wrap"); @@ -140,6 +143,7 @@ public class FreeformFinSetConfig extends FinSetConfig { final JSpinner cantAngleSpinner = new JSpinner(cantAngleModel.getSpinnerModel()); cantAngleSpinner.setEditor(new SpinnerEditor(cantAngleSpinner)); panel.add(cantAngleSpinner, "growx"); + order.add(((SpinnerEditor) cantAngleSpinner.getEditor()).getTextField()); panel.add(new UnitSelector(cantAngleModel), "growx"); panel.add(new BasicSlider(cantAngleModel.getSliderModel(-FinSet.MAX_CANT_RADIANS, FinSet.MAX_CANT_RADIANS)), "w 100lp, wrap 40lp"); @@ -154,6 +158,7 @@ public class FreeformFinSetConfig extends FinSetConfig { final EnumModel axialMethodModel = new EnumModel(component, "AxialMethod", AxialMethod.axialOffsetMethods); final JComboBox axialMethodCombo = new JComboBox(axialMethodModel); panel.add(axialMethodCombo, "spanx 3, growx, wrap"); + order.add(axialMethodCombo); //// plus panel.add(new JLabel(trans.get("FreeformFinSetCfg.lbl.plus")), "right"); @@ -162,6 +167,7 @@ public class FreeformFinSetConfig extends FinSetConfig { final JSpinner axialOffsetSpinner = new JSpinner(axialOffsetModel.getSpinnerModel()); axialOffsetSpinner.setEditor(new SpinnerEditor(axialOffsetSpinner)); panel.add(axialOffsetSpinner, "growx"); + order.add(((SpinnerEditor) axialOffsetSpinner.getEditor()).getTextField()); panel.add(new UnitSelector(axialOffsetModel), "growx"); panel.add(new BasicSlider(axialOffsetModel.getSliderModel(new DoubleModel(component.getParent(), "Length", -1.0, UnitGroup.UNITS_NONE), new DoubleModel(component.getParent(), "Length"))), "w 100lp, wrap"); @@ -186,6 +192,7 @@ public class FreeformFinSetConfig extends FinSetConfig { panel.add(new JLabel(trans.get("FreeformFinSetCfg.lbl.FincrossSection")), "span, split"); JComboBox sectionCombo = new JComboBox<>(new EnumModel(component, "CrossSection")); panel.add(sectionCombo, "growx, wrap unrel"); + order.add(sectionCombo); //// Thickness: @@ -196,6 +203,7 @@ public class FreeformFinSetConfig extends FinSetConfig { final JSpinner spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(0, 0.01)), "w 100lp, wrap 30lp"); @@ -204,11 +212,20 @@ public class FreeformFinSetConfig extends FinSetConfig { { //// Material MaterialPanel materialPanel = new MaterialPanel(component, document, Material.Type.BULK); panel.add(materialPanel, "span, wrap"); + order.add(materialPanel.getMaterialCombo()); + if (materialPanel.getFinishCombo() != null) { + order.add(materialPanel.getFinishCombo()); + } + panel.add(filletMaterialPanel(), "span, wrap"); } mainPanel.add(panel, "aligny 20%"); - + + // Apply the custom focus travel policy to this panel + CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); + parent.setFocusTraversalPolicy(policy); + return mainPanel; } From 35fab7bbbcbe556ba9301c7309884bb3b7ad1e0e Mon Sep 17 00:00:00 2001 From: Remington Holder Date: Mon, 15 Aug 2022 12:23:09 -0400 Subject: [PATCH 16/31] Add traversal policy for launch lug config --- .../gui/configdialog/LaunchLugConfig.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/swing/src/net/sf/openrocket/gui/configdialog/LaunchLugConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/LaunchLugConfig.java index a82820ef0..7f35f5df1 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/LaunchLugConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/LaunchLugConfig.java @@ -10,6 +10,7 @@ import javax.swing.JSpinner; import net.miginfocom.swing.MigLayout; import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.gui.SpinnerEditor; +import net.sf.openrocket.gui.adaptors.CustomFocusTraversalPolicy; import net.sf.openrocket.gui.adaptors.DoubleModel; import net.sf.openrocket.gui.adaptors.EnumModel; import net.sf.openrocket.gui.components.BasicSlider; @@ -47,6 +48,7 @@ public class LaunchLugConfig extends RocketComponentConfig { spin.setEditor(new SpinnerEditor(spin)); focusElement = spin; panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(0, 0.02, 0.1)), "w 100lp, wrap para"); @@ -62,6 +64,7 @@ public class LaunchLugConfig 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 rel"); @@ -77,6 +80,7 @@ public class LaunchLugConfig extends RocketComponentConfig { spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(new DoubleModel(0), od)), "w 100lp, wrap rel"); @@ -91,6 +95,7 @@ public class LaunchLugConfig extends RocketComponentConfig { spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(0, 0.01)), "w 100lp, wrap 20lp"); @@ -104,6 +109,7 @@ public class LaunchLugConfig extends RocketComponentConfig { spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(-Math.PI, Math.PI) ), "w 100lp, wrap"); @@ -119,6 +125,7 @@ public class LaunchLugConfig extends RocketComponentConfig { EnumModel positionModel = new EnumModel(component, "AxialMethod", AxialMethod.axialOffsetMethods ); JComboBox positionCombo = new JComboBox( positionModel ); panel.add(positionCombo, "spanx, growx, wrap"); + order.add(positionCombo); //// plus final DoubleModel mAxOff = new DoubleModel(component, "AxialOffset", UnitGroup.UNITS_LENGTH); @@ -126,6 +133,7 @@ public class LaunchLugConfig extends RocketComponentConfig { spin = new JSpinner(mAxOff.getSpinnerModel()); // Plus quantity input spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(mAxOff), "growx"); // Unity selection panel.add(new BasicSlider(mAxOff.getSliderModel( // Plus quantity slider @@ -144,6 +152,10 @@ public class LaunchLugConfig extends RocketComponentConfig { //// Material MaterialPanel materialPanel = new MaterialPanel(component, document, Material.Type.BULK); panel.add(materialPanel, "span, wrap"); + order.add(materialPanel.getMaterialCombo()); + if (materialPanel.getFinishCombo() != null) { + order.add(materialPanel.getFinishCombo()); + } primary.add(panel, "grow"); @@ -152,6 +164,11 @@ public class LaunchLugConfig extends RocketComponentConfig { tabbedPane.insertTab(trans.get("LaunchLugCfg.tab.General"), null, primary, trans.get("LaunchLugCfg.tab.Generalprop"), 0); tabbedPane.setSelectedIndex(0); + + // Apply the custom focus travel policy to this config dialog + CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); + parent.setFocusTraversalPolicy(policy); + } @Override From 43bef18117f631dc92767f65bceb93c28e84a639 Mon Sep 17 00:00:00 2001 From: Remington Holder Date: Mon, 15 Aug 2022 12:55:51 -0400 Subject: [PATCH 17/31] Reimplements material panel so traversal order is passed to it - cleans up traversal order code --- .../gui/configdialog/BodyTubeConfig.java | 6 +-- .../configdialog/EllipticalFinSetConfig.java | 6 +-- .../configdialog/FreeformFinSetConfig.java | 6 +-- .../gui/configdialog/InnerTubeConfig.java | 3 +- .../gui/configdialog/LaunchLugConfig.java | 6 +-- .../gui/configdialog/MaterialPanel.java | 43 ++++++++----------- .../gui/configdialog/NoseConeConfig.java | 2 +- .../gui/configdialog/RailButtonConfig.java | 2 +- .../gui/configdialog/RingComponentConfig.java | 3 +- .../gui/configdialog/ShockCordConfig.java | 2 +- .../gui/configdialog/TransitionConfig.java | 2 +- .../configdialog/TrapezoidFinSetConfig.java | 2 +- .../gui/configdialog/TubeFinSetConfig.java | 2 +- 13 files changed, 30 insertions(+), 55 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/configdialog/BodyTubeConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/BodyTubeConfig.java index 4dbfc8010..ef25042e7 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/BodyTubeConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/BodyTubeConfig.java @@ -105,11 +105,7 @@ public class BodyTubeConfig extends RocketComponentConfig { 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()); - } + MaterialPanel materialPanel = new MaterialPanel(component, document, Material.Type.BULK, order); panel.add(materialPanel, "cell 4 0, gapleft paragraph, aligny 0%, spany"); //// General and General properties diff --git a/swing/src/net/sf/openrocket/gui/configdialog/EllipticalFinSetConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/EllipticalFinSetConfig.java index f62980e36..213b421ba 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/EllipticalFinSetConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/EllipticalFinSetConfig.java @@ -183,12 +183,8 @@ public class EllipticalFinSetConfig extends FinSetConfig { //// Material - MaterialPanel materialPanel = new MaterialPanel(component, document, Material.Type.BULK); + MaterialPanel materialPanel = new MaterialPanel(component, document, Material.Type.BULK, order); panel.add(materialPanel, "span, wrap"); - order.add(materialPanel.getMaterialCombo()); - if (materialPanel.getFinishCombo() != null) { - order.add(materialPanel.getFinishCombo()); - } panel.add(filletMaterialPanel(), "span, wrap"); diff --git a/swing/src/net/sf/openrocket/gui/configdialog/FreeformFinSetConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/FreeformFinSetConfig.java index be5bac790..1bdd1d70c 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/FreeformFinSetConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/FreeformFinSetConfig.java @@ -210,12 +210,8 @@ public class FreeformFinSetConfig extends FinSetConfig { } { //// Material - MaterialPanel materialPanel = new MaterialPanel(component, document, Material.Type.BULK); + MaterialPanel materialPanel = new MaterialPanel(component, document, Material.Type.BULK, order); panel.add(materialPanel, "span, wrap"); - order.add(materialPanel.getMaterialCombo()); - if (materialPanel.getFinishCombo() != null) { - order.add(materialPanel.getFinishCombo()); - } panel.add(filletMaterialPanel(), "span, wrap"); } diff --git a/swing/src/net/sf/openrocket/gui/configdialog/InnerTubeConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/InnerTubeConfig.java index 42b0517dc..eb281008d 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/InnerTubeConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/InnerTubeConfig.java @@ -149,9 +149,8 @@ public class InnerTubeConfig extends RocketComponentConfig { panel.add(new BasicSlider(m.getSliderModel(0, 0.1, 1.0)), "wmin 100lp, growx, wrap"); //// Material - MaterialPanel materialPanel = new MaterialPanel(component, document, Material.Type.BULK); + MaterialPanel materialPanel = new MaterialPanel(component, document, Material.Type.BULK, order); panel.add(materialPanel, "spanx 4, growx, wrap 15lp"); - order.add(materialPanel.getMaterialCombo()); //// Right side of panel ---- diff --git a/swing/src/net/sf/openrocket/gui/configdialog/LaunchLugConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/LaunchLugConfig.java index 7f35f5df1..ad8ab87d4 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/LaunchLugConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/LaunchLugConfig.java @@ -150,12 +150,8 @@ public class LaunchLugConfig extends RocketComponentConfig { }); //// Material - MaterialPanel materialPanel = new MaterialPanel(component, document, Material.Type.BULK); + MaterialPanel materialPanel = new MaterialPanel(component, document, Material.Type.BULK, order); panel.add(materialPanel, "span, wrap"); - order.add(materialPanel.getMaterialCombo()); - if (materialPanel.getFinishCombo() != null) { - order.add(materialPanel.getFinishCombo()); - } primary.add(panel, "grow"); diff --git a/swing/src/net/sf/openrocket/gui/configdialog/MaterialPanel.java b/swing/src/net/sf/openrocket/gui/configdialog/MaterialPanel.java index 602a3c6e7..cbdeb630a 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/MaterialPanel.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/MaterialPanel.java @@ -15,9 +15,12 @@ import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JPanel; +import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.util.ArrayList; import java.util.Iterator; +import java.util.List; /** * Panel for configuring a component's material and finish properties. @@ -25,22 +28,20 @@ import java.util.Iterator; public class MaterialPanel extends JPanel { private static final Translator trans = Application.getTranslator(); - private final JComboBox materialCombo; - private final JComboBox finishCombo; - public MaterialPanel(RocketComponent component, OpenRocketDocument document, - Material.Type type, String materialString, String finishString, String partName) { + Material.Type type, String materialString, String finishString, + String partName, List order) { super(new MigLayout("insets 0")); JLabel label = new JLabel(materialString); //// The component material affects the weight of the component. label.setToolTipText(trans.get("RocketCompCfg.lbl.ttip.componentmaterialaffects")); this.add(label, "spanx 4, wrap rel"); - this.materialCombo = new JComboBox<>(new MaterialModel(this, component, type, partName)); + JComboBox materialCombo = new JComboBox<>(new MaterialModel(this, component, type, partName)); //// The component material affects the weight of the component. - this.materialCombo.setToolTipText(trans.get("RocketCompCfg.combo.ttip.componentmaterialaffects")); - this.add(this.materialCombo, "spanx 4, growx, wrap paragraph"); - + materialCombo.setToolTipText(trans.get("RocketCompCfg.combo.ttip.componentmaterialaffects")); + this.add(materialCombo, "spanx 4, growx, wrap paragraph"); + order.add(materialCombo); if (component instanceof ExternalComponent) { label = new JLabel(finishString); @@ -51,10 +52,11 @@ public class MaterialPanel extends JPanel { label.setToolTipText(tip); this.add(label, "spanx 4, wmin 220lp, wrap rel"); - this.finishCombo = new JComboBox( + JComboBox finishCombo = new JComboBox( new EnumModel(component, "Finish")); - this.finishCombo.setToolTipText(tip); - this.add(this.finishCombo, "spanx 4, growx, split"); + finishCombo.setToolTipText(tip); + this.add(finishCombo, "spanx 4, growx, split"); + order.add(finishCombo); //// Set for all JButton button = new SelectColorButton(trans.get("RocketCompCfg.but.Setforall")); @@ -81,28 +83,19 @@ public class MaterialPanel extends JPanel { } }); this.add(button, "wrap paragraph"); - } else { - this.finishCombo = null; + order.add(button); } } public MaterialPanel(RocketComponent component, OpenRocketDocument document, - Material.Type type, String partName) { + Material.Type type, String partName, List order) { this(component, document, type, trans.get("RocketCompCfg.lbl.Componentmaterial"), - trans.get("RocketCompCfg.lbl.Componentfinish"), partName); + trans.get("RocketCompCfg.lbl.Componentfinish"), partName, order); } public MaterialPanel(RocketComponent component, OpenRocketDocument document, - Material.Type type) { + Material.Type type, List order) { this(component, document, type, trans.get("RocketCompCfg.lbl.Componentmaterial"), - trans.get("RocketCompCfg.lbl.Componentfinish"), "Material"); - } - - public JComboBox getMaterialCombo() { - return materialCombo; - } - - public JComboBox getFinishCombo() { - return finishCombo; + trans.get("RocketCompCfg.lbl.Componentfinish"), "Material", order); } } diff --git a/swing/src/net/sf/openrocket/gui/configdialog/NoseConeConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/NoseConeConfig.java index 7bb3473a8..79ed2a395 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/NoseConeConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/NoseConeConfig.java @@ -147,7 +147,7 @@ public class NoseConeConfig extends RocketComponentConfig { //// Material - MaterialPanel materialPanel = new MaterialPanel(component, document, Material.Type.BULK); + MaterialPanel materialPanel = new MaterialPanel(component, document, Material.Type.BULK, order); panel2.add(materialPanel, "span, wrap"); panel.add(panel2, "cell 4 0, gapleft paragraph, aligny 0%, spany"); diff --git a/swing/src/net/sf/openrocket/gui/configdialog/RailButtonConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/RailButtonConfig.java index 7e9d9b178..73af04248 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/RailButtonConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/RailButtonConfig.java @@ -127,7 +127,7 @@ public class RailButtonConfig extends RocketComponentConfig { panel.add(instanceablePanel(rbc), "span, wrap"); //// Material - MaterialPanel materialPanel = new MaterialPanel(component, document, Material.Type.BULK); + MaterialPanel materialPanel = new MaterialPanel(component, document, Material.Type.BULK, order); panel.add(materialPanel,"span, wrap"); primary.add(panel, "grow"); diff --git a/swing/src/net/sf/openrocket/gui/configdialog/RingComponentConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/RingComponentConfig.java index 0579e21dd..2d354df3e 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/RingComponentConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/RingComponentConfig.java @@ -165,8 +165,7 @@ public class RingComponentConfig extends RocketComponentConfig { //// Material - MaterialPanel materialPanel = new MaterialPanel(component, document, Material.Type.BULK); - order.add(materialPanel.getMaterialCombo()); + MaterialPanel materialPanel = new MaterialPanel(component, document, Material.Type.BULK, order); if (component instanceof EngineBlock) { final DescriptionArea desc = new DescriptionArea(6); diff --git a/swing/src/net/sf/openrocket/gui/configdialog/ShockCordConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/ShockCordConfig.java index 48fa2501b..c8c40d663 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/ShockCordConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/ShockCordConfig.java @@ -57,7 +57,7 @@ public class ShockCordConfig extends RocketComponentConfig { // Material //// Shock cord material: MaterialPanel materialPanel = new MaterialPanel(component, document, Material.Type.LINE, - trans.get("ShockCordCfg.lbl.Shockcordmaterial"), null, "Material"); + trans.get("ShockCordCfg.lbl.Shockcordmaterial"), null, "Material", order); panel.add(materialPanel, "spanx 4, wrap"); diff --git a/swing/src/net/sf/openrocket/gui/configdialog/TransitionConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/TransitionConfig.java index 33793e290..423c743cb 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/TransitionConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/TransitionConfig.java @@ -178,7 +178,7 @@ public class TransitionConfig extends RocketComponentConfig { //// Material - MaterialPanel materialPanel = new MaterialPanel(component, document, Material.Type.BULK); + MaterialPanel materialPanel = new MaterialPanel(component, document, Material.Type.BULK, order); panel2.add(materialPanel, "span, wrap"); panel.add(panel2, "cell 4 0, gapleft paragraph, aligny 0%, spany"); diff --git a/swing/src/net/sf/openrocket/gui/configdialog/TrapezoidFinSetConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/TrapezoidFinSetConfig.java index d8acc3b80..1d684e0e7 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/TrapezoidFinSetConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/TrapezoidFinSetConfig.java @@ -223,7 +223,7 @@ public class TrapezoidFinSetConfig extends FinSetConfig { //// Material - MaterialPanel materialPanel = new MaterialPanel(component, document, Material.Type.BULK); + MaterialPanel materialPanel = new MaterialPanel(component, document, Material.Type.BULK, order); panel.add(materialPanel, "span, wrap"); diff --git a/swing/src/net/sf/openrocket/gui/configdialog/TubeFinSetConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/TubeFinSetConfig.java index 45fcc5f7e..ff3506760 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/TubeFinSetConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/TubeFinSetConfig.java @@ -158,7 +158,7 @@ public class TubeFinSetConfig extends RocketComponentConfig { //// Material - MaterialPanel materialPanel = new MaterialPanel(component, document, Material.Type.BULK); + MaterialPanel materialPanel = new MaterialPanel(component, document, Material.Type.BULK, order); panel.add(materialPanel, "span, wrap"); primary.add(panel, "grow"); From a9219c1593101f9fbe9bf8a7f649d029aa888a79 Mon Sep 17 00:00:00 2001 From: Remington Holder Date: Mon, 15 Aug 2022 14:29:25 -0400 Subject: [PATCH 18/31] Add traversal policy for mass component config --- .../gui/configdialog/MassComponentConfig.java | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/configdialog/MassComponentConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/MassComponentConfig.java index 23102e1f9..6c3bdfd0b 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/MassComponentConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/MassComponentConfig.java @@ -14,6 +14,7 @@ import javax.swing.JSpinner; import net.miginfocom.swing.MigLayout; import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.gui.SpinnerEditor; +import net.sf.openrocket.gui.adaptors.CustomFocusTraversalPolicy; import net.sf.openrocket.gui.adaptors.DoubleModel; import net.sf.openrocket.gui.adaptors.EnumModel; import net.sf.openrocket.gui.components.BasicSlider; @@ -57,6 +58,7 @@ public class MassComponentConfig extends RocketComponentConfig { MassComponent.MassComponentType.BATTERY})); panel.add(typecombo, "spanx, wrap"); + order.add(typecombo); //// Mass panel.add(new JLabel(trans.get("MassComponentCfg.lbl.Mass"))); @@ -66,11 +68,12 @@ public class MassComponentConfig extends RocketComponentConfig { JSpinner spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(0, 0.05, 0.5)), "w 100lp, wrap"); - + /// Approximate Density panel.add(new JLabel(trans.get("MassComponentCfg.lbl.Density"))); m = new DoubleModel(component, "Density", UnitGroup.UNITS_DENSITY_BULK, 0); @@ -78,6 +81,7 @@ public class MassComponentConfig extends RocketComponentConfig { spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(500, 2000, 10000)), "w 100lp, wrap"); @@ -93,6 +97,7 @@ public class MassComponentConfig extends RocketComponentConfig { spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(0, 0.1, 0.5)), "w 100lp, wrap"); @@ -108,6 +113,7 @@ public class MassComponentConfig 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"); @@ -116,6 +122,7 @@ public class MassComponentConfig extends RocketComponentConfig { JCheckBox checkAutoPackedRadius = new JCheckBox(od.getAutomaticAction()); checkAutoPackedRadius.setText(trans.get("TransitionCfg.checkbox.Automatic")); panel.add(checkAutoPackedRadius, "skip, span 2, wrap"); + order.add(checkAutoPackedRadius); //// Right side @@ -131,6 +138,7 @@ public class MassComponentConfig extends RocketComponentConfig { final EnumModel methodModel = new EnumModel(component, "AxialMethod", AxialMethod.axialOffsetMethods ); final JComboBox methodCombo = new JComboBox( methodModel ); panel2.add(methodCombo, "spanx, growx, wrap"); + order.add(methodCombo); //// plus panel2.add(new JLabel(trans.get("MassComponentCfg.lbl.plus")), "right"); @@ -138,8 +146,8 @@ public class MassComponentConfig extends RocketComponentConfig { m = new DoubleModel(component, "AxialOffset", UnitGroup.UNITS_LENGTH); spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); - focusElement = spin; panel2.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel2.add(new UnitSelector(m), "growx"); panel2.add(new BasicSlider(m.getSliderModel( @@ -155,6 +163,11 @@ public class MassComponentConfig extends RocketComponentConfig { tabbedPane.insertTab(trans.get("MassComponentCfg.tab.Radialpos"), null, positionTab(), trans.get("MassComponentCfg.tab.ttip.Radialpos"), 1); tabbedPane.setSelectedIndex(0); + + // Apply the custom focus travel policy to this config dialog + CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); + parent.setFocusTraversalPolicy(policy); + } @@ -170,6 +183,7 @@ public class MassComponentConfig extends RocketComponentConfig { JSpinner spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(0, 0.1, 1.0)), "w 100lp, wrap"); @@ -183,6 +197,7 @@ public class MassComponentConfig extends RocketComponentConfig { spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(-Math.PI, Math.PI)), "w 100lp, wrap"); @@ -198,7 +213,12 @@ public class MassComponentConfig extends RocketComponentConfig { } }); panel.add(button, "spanx, right"); - + order.add(button); + + // Apply the custom focus travel policy to this panel + CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); + parent.setFocusTraversalPolicy(policy); + return panel; } } From cda6fc7b7abdc6f395f1e976308fa13bf932a5d2 Mon Sep 17 00:00:00 2001 From: Remington Holder Date: Mon, 15 Aug 2022 14:57:01 -0400 Subject: [PATCH 19/31] Add traversal policy for nose cone config --- .../openrocket/gui/configdialog/NoseConeConfig.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/swing/src/net/sf/openrocket/gui/configdialog/NoseConeConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/NoseConeConfig.java index 79ed2a395..7b6d1e6e9 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/NoseConeConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/NoseConeConfig.java @@ -16,6 +16,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.adaptors.TransitionShapeModel; import net.sf.openrocket.gui.components.BasicSlider; @@ -67,6 +68,7 @@ public class NoseConeConfig extends RocketComponentConfig { } }); panel.add(typeBox, "span, wrap rel"); + order.add(typeBox); //// Shape parameter: this.shapeLabel = new JLabel(trans.get("NoseConeCfg.lbl.Shapeparam")); @@ -77,6 +79,7 @@ public class NoseConeConfig extends RocketComponentConfig { this.shapeSpinner = new JSpinner(parameterModel.getSpinnerModel()); shapeSpinner.setEditor(new SpinnerEditor(shapeSpinner)); panel.add(shapeSpinner, "growx"); + order.add(((SpinnerEditor) shapeSpinner.getEditor()).getTextField()); DoubleModel min = new DoubleModel(component, "ShapeParameterMin"); DoubleModel max = new DoubleModel(component, "ShapeParameterMax"); @@ -93,6 +96,7 @@ public class NoseConeConfig extends RocketComponentConfig { JSpinner spin = new JSpinner(lengthModel.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(lengthModel), "growx"); panel.add(new BasicSlider(lengthModel.getSliderModel(0, 0.1, 0.7)), "w 100lp, wrap"); @@ -106,6 +110,7 @@ public class NoseConeConfig extends RocketComponentConfig { final JSpinner radiusSpinner = new JSpinner(aftRadiusModel.getSpinnerModel()); radiusSpinner.setEditor(new SpinnerEditor(radiusSpinner)); panel.add(radiusSpinner, "growx"); + order.add(((SpinnerEditor) radiusSpinner.getEditor()).getTextField()); panel.add(new UnitSelector(aftRadiusModel), "growx"); panel.add(new BasicSlider(aftRadiusModel.getSliderModel(0, 0.04, 0.2)), "w 100lp, wrap 0px"); @@ -114,6 +119,7 @@ public class NoseConeConfig extends RocketComponentConfig { //// Automatic checkAutoAftRadius.setText(trans.get("NoseConeCfg.checkbox.Automatic")); panel.add(checkAutoAftRadius, "skip, span 2, wrap"); + order.add(checkAutoAftRadius); updateCheckboxAutoAftRadius(); } @@ -124,6 +130,7 @@ public class NoseConeConfig extends RocketComponentConfig { final JSpinner thicknessSpinner = new JSpinner(thicknessModel.getSpinnerModel()); thicknessSpinner.setEditor(new SpinnerEditor(thicknessSpinner)); panel.add(thicknessSpinner, "growx"); + order.add(((SpinnerEditor) thicknessSpinner.getEditor()).getTextField()); panel.add(new UnitSelector(thicknessModel), "growx"); panel.add(new BasicSlider(thicknessModel.getSliderModel(0, 0.01)), "w 100lp, wrap 0px"); @@ -133,6 +140,7 @@ public class NoseConeConfig extends RocketComponentConfig { //// Filled filledCheckbox .setText(trans.get("NoseConeCfg.checkbox.Filled")); panel.add(filledCheckbox, "skip, span 2, wrap"); + order.add(filledCheckbox); } panel.add(new JLabel(""), "growy"); @@ -159,6 +167,11 @@ public class NoseConeConfig extends RocketComponentConfig { tabbedPane.insertTab(trans.get("NoseConeCfg.tab.Shoulder"), null, shoulderTab(), trans.get("NoseConeCfg.tab.ttip.Shoulder"), 1); tabbedPane.setSelectedIndex(0); + + // Apply the custom focus travel policy to this config dialog + CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); + parent.setFocusTraversalPolicy(policy); + } From 430b448db3f14db6b6b6334dd48e922ab778f837 Mon Sep 17 00:00:00 2001 From: Remington Holder Date: Mon, 15 Aug 2022 15:09:19 -0400 Subject: [PATCH 20/31] Add traversal policy for parachute config --- .../gui/configdialog/ParachuteConfig.java | 37 ++++++++++++++++--- 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/configdialog/ParachuteConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/ParachuteConfig.java index 38fdffc3b..89095dd13 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/ParachuteConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/ParachuteConfig.java @@ -16,10 +16,7 @@ import javax.swing.JSpinner; import net.miginfocom.swing.MigLayout; import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.gui.SpinnerEditor; -import net.sf.openrocket.gui.adaptors.DoubleModel; -import net.sf.openrocket.gui.adaptors.EnumModel; -import net.sf.openrocket.gui.adaptors.IntegerModel; -import net.sf.openrocket.gui.adaptors.MaterialModel; +import net.sf.openrocket.gui.adaptors.*; import net.sf.openrocket.gui.components.BasicSlider; import net.sf.openrocket.gui.components.HtmlLabel; import net.sf.openrocket.gui.components.StyledLabel; @@ -60,6 +57,7 @@ public class ParachuteConfig extends RecoveryDeviceConfig { JSpinner spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(0, 0.4, 1.5)), "w 100lp, wrap"); @@ -85,7 +83,9 @@ public class ParachuteConfig extends RecoveryDeviceConfig { Material.Type.SURFACE)); surfaceMaterialCombo.setToolTipText(trans.get("ParachuteCfg.combo.MaterialModel")); panel.add( surfaceMaterialCombo, "spanx 3, growx, wrap 15lp"); + order.add(surfaceMaterialCombo); + // Drag Coefficient: // CD JLabel label = new HtmlLabel(trans.get("ParachuteCfg.lbl.longA1")); String tip = trans.get("ParachuteCfg.lbl.longB1") + @@ -100,7 +100,8 @@ public class ParachuteConfig extends RecoveryDeviceConfig { spin.setToolTipText(tip); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); - + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); + //// Reset button JButton button = new SelectColorButton(trans.get("ParachuteCfg.but.Reset")); button.addActionListener(new ActionListener() { @@ -111,6 +112,7 @@ public class ParachuteConfig extends RecoveryDeviceConfig { } }); panel.add(button, "spanx, wrap 32lp"); + order.add(button); //// Shroud lines panel.add(new StyledLabel(trans.get("ParachuteCfg.lbl.Shroudlines"), Style.BOLD), "wrap unrel"); @@ -122,6 +124,7 @@ public class ParachuteConfig extends RecoveryDeviceConfig { spin = new JSpinner(im.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx, wrap"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); //// Line length: panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Linelength"))); @@ -131,6 +134,7 @@ public class ParachuteConfig extends RecoveryDeviceConfig { spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(0, 0.4, 1.5)), "w 100lp, wrap"); @@ -140,6 +144,7 @@ public class ParachuteConfig extends RecoveryDeviceConfig { JComboBox shroudMaterialCombo = new JComboBox(new MaterialModel(panel, component, Material.Type.LINE, "LineMaterial")); panel.add( shroudMaterialCombo, "spanx 3, growx, wrap 15lp"); + order.add(shroudMaterialCombo); // Right side @@ -156,6 +161,7 @@ public class ParachuteConfig extends RecoveryDeviceConfig { new EnumModel(component, "AxialMethod", AxialMethod.axialOffsetMethods ); JComboBox positionCombo = new JComboBox( methodModel ); panel.add( positionCombo, "spanx, growx, wrap"); + order.add(positionCombo); //// plus panel.add(new JLabel(trans.get("ParachuteCfg.lbl.plus")), "right"); @@ -165,6 +171,7 @@ public class ParachuteConfig extends RecoveryDeviceConfig { spin.setEditor(new SpinnerEditor(spin)); focusElement = spin; panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel( @@ -181,6 +188,7 @@ public class ParachuteConfig extends RecoveryDeviceConfig { spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(0, 0.1, 0.5)), "w 100lp, wrap"); @@ -196,6 +204,7 @@ public class ParachuteConfig extends RecoveryDeviceConfig { 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"); @@ -204,6 +213,7 @@ public class ParachuteConfig extends RecoveryDeviceConfig { JCheckBox checkAutoPackedRadius = new JCheckBox(od.getAutomaticAction()); checkAutoPackedRadius.setText(trans.get("TransitionCfg.checkbox.Automatic")); panel.add(checkAutoPackedRadius, "skip, span 2, wrap 5lp"); + order.add(checkAutoPackedRadius); //// Deployment panel.add(new StyledLabel(trans.get("ParachuteCfg.lbl.Deployment"), Style.BOLD), "wrap unrel"); @@ -222,6 +232,7 @@ public class ParachuteConfig extends RecoveryDeviceConfig { eventCombo.removeItem( DeployEvent.LOWER_STAGE_SEPARATION ); } panel.add(eventCombo, "spanx 3, growx, wrap"); + order.add(eventCombo); // ... and delay //// plus @@ -231,6 +242,7 @@ public class ParachuteConfig extends RecoveryDeviceConfig { spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin, 3)); panel.add(spin, "spanx, split"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); //// seconds panel.add(new JLabel(trans.get("ParachuteCfg.lbl.seconds")), "wrap paragraph"); @@ -246,6 +258,7 @@ public class ParachuteConfig extends RecoveryDeviceConfig { spin.setEditor(new SpinnerEditor(spin)); altitudeComponents.add(spin); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); UnitSelector unit = new UnitSelector(m); altitudeComponents.add(unit); panel.add(unit, "growx"); @@ -265,6 +278,11 @@ public class ParachuteConfig extends RecoveryDeviceConfig { tabbedPane.insertTab(trans.get("ParachuteCfg.tab.Radialpos"), null, positionTab(), trans.get("ParachuteCfg.tab.ttip.Radialpos"), 1); tabbedPane.setSelectedIndex(0); + + // Apply the custom focus travel policy to this config dialog + CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); + parent.setFocusTraversalPolicy(policy); + } @@ -280,6 +298,7 @@ public class ParachuteConfig extends RecoveryDeviceConfig { JSpinner spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(0, 0.1, 1.0)), "w 100lp, wrap"); @@ -293,6 +312,7 @@ public class ParachuteConfig extends RecoveryDeviceConfig { spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(-Math.PI, Math.PI)), "w 100lp, wrap"); @@ -308,7 +328,12 @@ public class ParachuteConfig extends RecoveryDeviceConfig { } }); panel.add(button, "spanx, right"); - + order.add(button); + + // Apply the custom focus travel policy to this panel + CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); + parent.setFocusTraversalPolicy(policy); + return panel; } } From 6198eaa8fd2b7edf4e75dc996c68b048bb9b5277 Mon Sep 17 00:00:00 2001 From: Remington Holder Date: Mon, 15 Aug 2022 15:30:08 -0400 Subject: [PATCH 21/31] Add traversal policy for rail button config --- .../gui/configdialog/RailButtonConfig.java | 15 ++++++++++++++- .../gui/configdialog/RocketComponentConfig.java | 2 ++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/swing/src/net/sf/openrocket/gui/configdialog/RailButtonConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/RailButtonConfig.java index 73af04248..6caee5ea9 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/RailButtonConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/RailButtonConfig.java @@ -9,6 +9,7 @@ import javax.swing.JSpinner; import net.miginfocom.swing.MigLayout; import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.gui.SpinnerEditor; +import net.sf.openrocket.gui.adaptors.CustomFocusTraversalPolicy; import net.sf.openrocket.gui.adaptors.DoubleModel; import net.sf.openrocket.gui.adaptors.EnumModel; import net.sf.openrocket.gui.components.BasicSlider; @@ -48,6 +49,7 @@ public class RailButtonConfig extends RocketComponentConfig { JSpinner ODSpinner = new JSpinner( ODModel.getSpinnerModel()); ODSpinner.setEditor(new SpinnerEditor(ODSpinner)); panel.add(ODSpinner, "growx"); + order.add(((SpinnerEditor) ODSpinner.getEditor()).getTextField()); panel.add(new UnitSelector(ODModel), "growx"); panel.add(new BasicSlider(ODModel.getSliderModel(0, 0.001, 0.02)), "w 100lp, wrap"); } @@ -57,6 +59,7 @@ public class RailButtonConfig extends RocketComponentConfig { JSpinner IDSpinner = new JSpinner(IDModel.getSpinnerModel()); IDSpinner.setEditor(new SpinnerEditor(IDSpinner)); panel.add(IDSpinner, "growx"); + order.add(((SpinnerEditor) IDSpinner.getEditor()).getTextField()); panel.add(new UnitSelector(IDModel), "growx"); panel.add(new BasicSlider(IDModel.getSliderModel(0, 0.001, 0.02)), "w 100lp, wrap para"); } @@ -66,6 +69,7 @@ public class RailButtonConfig extends RocketComponentConfig { JSpinner heightSpinner = new JSpinner(heightModel.getSpinnerModel()); heightSpinner.setEditor(new SpinnerEditor(heightSpinner)); panel.add(heightSpinner, "growx"); + order.add(((SpinnerEditor) heightSpinner.getEditor()).getTextField()); panel.add(new UnitSelector(heightModel), "growx"); panel.add(new BasicSlider(heightModel.getSliderModel(0, 0.001, 0.02)), "w 100lp, wrap"); } @@ -75,6 +79,7 @@ public class RailButtonConfig extends RocketComponentConfig { JSpinner heightSpinner = new JSpinner(heightModel.getSpinnerModel()); heightSpinner.setEditor(new SpinnerEditor(heightSpinner)); panel.add(heightSpinner, "growx"); + order.add(((SpinnerEditor) heightSpinner.getEditor()).getTextField()); panel.add(new UnitSelector(heightModel), "growx"); panel.add(new BasicSlider(heightModel.getSliderModel(0, 0.001, 0.02)), "w 100lp, wrap"); } @@ -84,6 +89,7 @@ public class RailButtonConfig extends RocketComponentConfig { JSpinner heightSpinner = new JSpinner(heightModel.getSpinnerModel()); heightSpinner.setEditor(new SpinnerEditor(heightSpinner)); panel.add(heightSpinner, "growx"); + order.add(((SpinnerEditor) heightSpinner.getEditor()).getTextField()); panel.add(new UnitSelector(heightModel), "growx"); panel.add(new BasicSlider(heightModel.getSliderModel(0, 0.001, 0.02)), "w 100lp, wrap para"); } @@ -94,6 +100,7 @@ public class RailButtonConfig extends RocketComponentConfig { JSpinner angleSpinner = new JSpinner( angleModel.getSpinnerModel()); angleSpinner.setEditor(new SpinnerEditor(angleSpinner)); panel.add(angleSpinner, "growx"); + order.add(((SpinnerEditor) angleSpinner.getEditor()).getTextField()); panel.add(new UnitSelector( angleModel), "growx"); panel.add(new BasicSlider( angleModel.getSliderModel(-Math.PI, Math.PI)), "w 100lp, wrap"); } @@ -107,6 +114,7 @@ public class RailButtonConfig extends RocketComponentConfig { final EnumModel methodModel = new EnumModel(component, "AxialMethod", AxialMethod.axialOffsetMethods ); JComboBox relToCombo = new JComboBox( methodModel ); panel.add( relToCombo, "spanx, growx, wrap"); + order.add(relToCombo); } { //// plus @@ -116,6 +124,7 @@ public class RailButtonConfig extends RocketComponentConfig { offsetSpinner.setEditor(new SpinnerEditor(offsetSpinner)); focusElement = offsetSpinner; panel.add(offsetSpinner, "growx"); + order.add(((SpinnerEditor) offsetSpinner.getEditor()).getTextField()); panel.add(new UnitSelector(offsetModel), "growx"); panel.add(new BasicSlider(offsetModel.getSliderModel( new DoubleModel(component.getParent(), "Length", -1.0, UnitGroup.UNITS_NONE), @@ -131,7 +140,11 @@ public class RailButtonConfig extends RocketComponentConfig { panel.add(materialPanel,"span, wrap"); primary.add(panel, "grow"); - + + // Apply the custom focus travel policy to this panel + CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); + parent.setFocusTraversalPolicy(policy); + return primary; } diff --git a/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java index bba2c30a4..a0b9ff083 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java @@ -318,6 +318,7 @@ public class RocketComponentConfig extends JPanel { JSpinner countSpinner = new JSpinner( countModel.getSpinnerModel()); countSpinner.setEditor(new SpinnerEditor(countSpinner)); panel.add(countSpinner, "w 100lp, wrap rel"); + order.add(((SpinnerEditor) countSpinner.getEditor()).getTextField()); } { // Instance separation @@ -326,6 +327,7 @@ public class RocketComponentConfig extends JPanel { JSpinner separationSpinner = new JSpinner( separationModel.getSpinnerModel()); separationSpinner.setEditor(new SpinnerEditor(separationSpinner)); panel.add(separationSpinner, "growx"); + order.add(((SpinnerEditor) separationSpinner.getEditor()).getTextField()); panel.add(new UnitSelector(separationModel), "growx"); double maxSeparationDistance = 0.1; if (component.getParent() != null && component.getParent().getLength() > 0) { From 3171809ae45fd42d2a841fe06dcfec94e596419f Mon Sep 17 00:00:00 2001 From: Remington Holder Date: Mon, 15 Aug 2022 21:14:13 -0400 Subject: [PATCH 22/31] Add traversal policy for shock cord config --- .../gui/configdialog/ShockCordConfig.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/swing/src/net/sf/openrocket/gui/configdialog/ShockCordConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/ShockCordConfig.java index c8c40d663..2c38936d4 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/ShockCordConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/ShockCordConfig.java @@ -6,6 +6,7 @@ import javax.swing.*; import net.miginfocom.swing.MigLayout; import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.gui.SpinnerEditor; +import net.sf.openrocket.gui.adaptors.CustomFocusTraversalPolicy; import net.sf.openrocket.gui.adaptors.DoubleModel; import net.sf.openrocket.gui.adaptors.EnumModel; import net.sf.openrocket.gui.components.BasicSlider; @@ -50,6 +51,7 @@ public class ShockCordConfig extends RocketComponentConfig { spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(0, 1, 10)), "w 100lp, wrap"); @@ -75,6 +77,7 @@ public class ShockCordConfig extends RocketComponentConfig { final EnumModel methodModel = new EnumModel(component, "AxialMethod", AxialMethod.axialOffsetMethods ); final JComboBox combo = new JComboBox( methodModel ); panel2.add(combo, "spanx, growx, wrap"); + order.add(combo); //// plus panel2.add(new JLabel(trans.get("ShockCordCfg.lbl.plus")), "right"); @@ -84,6 +87,7 @@ public class ShockCordConfig extends RocketComponentConfig { spin.setEditor(new SpinnerEditor(spin)); focusElement = spin; panel2.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel2.add(new UnitSelector(m), "growx"); panel2.add(new BasicSlider(m.getSliderModel( @@ -101,6 +105,7 @@ public class ShockCordConfig extends RocketComponentConfig { spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel2.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel2.add(new UnitSelector(m), "growx"); panel2.add(new BasicSlider(m.getSliderModel(0, 0.1, 0.5)), "w 100lp, wrap"); @@ -116,6 +121,7 @@ public class ShockCordConfig extends RocketComponentConfig { spin = new JSpinner(od.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel2.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel2.add(new UnitSelector(od), "growx"); panel2.add(new BasicSlider(od.getSliderModel(0, 0.04, 0.2)), "w 100lp, wrap"); @@ -124,6 +130,7 @@ public class ShockCordConfig extends RocketComponentConfig { JCheckBox checkAutoPackedRadius = new JCheckBox(od.getAutomaticAction()); checkAutoPackedRadius.setText(trans.get("TransitionCfg.checkbox.Automatic")); panel2.add(checkAutoPackedRadius, "skip, span 2, wrap"); + order.add(checkAutoPackedRadius); //// General and General properties tabbedPane.insertTab(trans.get("ShockCordCfg.tab.General"), null, panel, @@ -132,6 +139,10 @@ public class ShockCordConfig extends RocketComponentConfig { tabbedPane.insertTab(trans.get("ShockCordCfg.tab.Radialpos"), null, positionTab(), trans.get("ShockCordCfg.tab.ttip.Radialpos"), 1); tabbedPane.setSelectedIndex(0); + + // Apply the custom focus travel policy to this config dialog + CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); + parent.setFocusTraversalPolicy(policy); } // TODO: LOW: there is a lot of duplicate code here with other mass components... (e.g. in MassComponentConfig or ParachuteConfig) @@ -147,6 +158,7 @@ public class ShockCordConfig extends RocketComponentConfig { JSpinner spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(0, 0.1, 1.0)), "w 100lp, wrap"); @@ -160,6 +172,7 @@ public class ShockCordConfig extends RocketComponentConfig { spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(-Math.PI, Math.PI)), "w 100lp, wrap"); @@ -175,6 +188,11 @@ public class ShockCordConfig extends RocketComponentConfig { } }); panel.add(button, "spanx, right"); + order.add(button); + + // Apply the custom focus travel policy to this panel + CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); + parent.setFocusTraversalPolicy(policy); return panel; } From dfdb214cc8afdbcfcd880a7e7a82e74b64ecb798 Mon Sep 17 00:00:00 2001 From: Remington Holder Date: Mon, 15 Aug 2022 21:33:17 -0400 Subject: [PATCH 23/31] Add traversal policy for streamer config --- .../gui/configdialog/StreamerConfig.java | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/swing/src/net/sf/openrocket/gui/configdialog/StreamerConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/StreamerConfig.java index 504c6e712..9699f0f4b 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/StreamerConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/StreamerConfig.java @@ -15,6 +15,7 @@ import javax.swing.JSpinner; import net.miginfocom.swing.MigLayout; import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.gui.SpinnerEditor; +import net.sf.openrocket.gui.adaptors.CustomFocusTraversalPolicy; import net.sf.openrocket.gui.adaptors.DoubleModel; import net.sf.openrocket.gui.adaptors.EnumModel; import net.sf.openrocket.gui.adaptors.MaterialModel; @@ -57,6 +58,7 @@ public class StreamerConfig extends RecoveryDeviceConfig { JSpinner spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(0, 0.6, 1.5)), "w 100lp, wrap"); @@ -68,6 +70,7 @@ public class StreamerConfig extends RecoveryDeviceConfig { spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(0, 0.2)), "w 100lp, wrap 10lp"); @@ -79,6 +82,7 @@ public class StreamerConfig extends RecoveryDeviceConfig { spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(0, 0.04, 0.25)), "w 100lp, wrap"); @@ -90,6 +94,7 @@ public class StreamerConfig extends RecoveryDeviceConfig { spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); // panel.add(new UnitSelector(m),"growx"); panel.add(new BasicSlider(m.getSliderModel(2, 15)), "skip, w 100lp, wrap 10lp"); @@ -101,6 +106,7 @@ public class StreamerConfig extends RecoveryDeviceConfig { //// The component material affects the weight of the component. streamerMaterialCombo.setToolTipText(trans.get("StreamerCfg.combo.ttip.MaterialModel")); panel.add(streamerMaterialCombo, "spanx 3, growx, wrap 15lp"); + order.add(streamerMaterialCombo); // CD //// Drag coefficient CD: @@ -118,11 +124,13 @@ public class StreamerConfig extends RecoveryDeviceConfig { spin.setToolTipText(tip); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); JCheckBox check = new JCheckBox(m.getAutomaticAction()); //// Automatic check.setText(trans.get("StreamerCfg.lbl.Automatic")); panel.add(check, "skip, span, wrap"); + order.add(check); //// The drag coefficient is relative to the area of the streamer. panel.add(new StyledLabel(trans.get("StreamerCfg.lbl.longC1"), @@ -142,6 +150,7 @@ public class StreamerConfig extends RecoveryDeviceConfig { final EnumModel methodModel = new EnumModel(component, "AxialMethod", AxialMethod.axialOffsetMethods ); final JComboBox positionCombo = new JComboBox( methodModel ); panel.add( positionCombo, "spanx, growx, wrap"); + order.add(positionCombo); //// plus panel.add(new JLabel(trans.get("StreamerCfg.lbl.plus")), "right"); @@ -151,6 +160,7 @@ public class StreamerConfig extends RecoveryDeviceConfig { spin.setEditor(new SpinnerEditor(spin)); focusElement = spin; panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel( @@ -167,6 +177,7 @@ public class StreamerConfig extends RecoveryDeviceConfig { spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(0, 0.1, 0.5)), "w 100lp, wrap"); @@ -182,6 +193,7 @@ public class StreamerConfig extends RecoveryDeviceConfig { 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"); @@ -190,6 +202,7 @@ public class StreamerConfig extends RecoveryDeviceConfig { JCheckBox checkAutoPackedRadius = new JCheckBox(od.getAutomaticAction()); checkAutoPackedRadius.setText(trans.get("TransitionCfg.checkbox.Automatic")); panel.add(checkAutoPackedRadius, "skip, span 2, wrap 5lp"); + order.add(checkAutoPackedRadius); //// Deployment @@ -205,6 +218,7 @@ public class StreamerConfig extends RecoveryDeviceConfig { eventCombo.removeItem( DeployEvent.LOWER_STAGE_SEPARATION ); } panel.add( eventCombo, "spanx 3, growx, wrap"); + order.add(eventCombo); // ... and delay //// plus @@ -214,6 +228,7 @@ public class StreamerConfig extends RecoveryDeviceConfig { spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin, 3)); panel.add(spin, "spanx, split"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); //// seconds panel.add(new JLabel(trans.get("StreamerCfg.lbl.seconds")), "wrap paragraph"); @@ -229,6 +244,7 @@ public class StreamerConfig extends RecoveryDeviceConfig { spin.setEditor(new SpinnerEditor(spin)); altitudeComponents.add(spin); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); UnitSelector unit = new UnitSelector(m); altitudeComponents.add(unit); panel.add(unit, "growx"); @@ -249,6 +265,11 @@ public class StreamerConfig extends RecoveryDeviceConfig { tabbedPane.insertTab(trans.get("StreamerCfg.tab.Radialpos"), null, positionTab(), trans.get("StreamerCfg.tab.ttip.Radialpos"), 1); tabbedPane.setSelectedIndex(0); + + // Apply the custom focus travel policy to this config dialog + CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); + parent.setFocusTraversalPolicy(policy); + } @@ -267,6 +288,7 @@ public class StreamerConfig extends RecoveryDeviceConfig { JSpinner spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(0, 0.1, 1.0)), "w 100lp, wrap"); @@ -279,6 +301,7 @@ public class StreamerConfig extends RecoveryDeviceConfig { spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(-Math.PI, Math.PI)), "w 100lp, wrap"); @@ -294,7 +317,12 @@ public class StreamerConfig extends RecoveryDeviceConfig { } }); panel.add(button, "spanx, right"); - + order.add(button); + + // Apply the custom focus travel policy to this panel + CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); + parent.setFocusTraversalPolicy(policy); + return panel; } } From 2e03da47cd5b1d2e97e83833693372197154ac06 Mon Sep 17 00:00:00 2001 From: Remington Holder Date: Mon, 15 Aug 2022 21:56:46 -0400 Subject: [PATCH 24/31] Add traversal policy for transition config --- .../gui/configdialog/TransitionConfig.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/swing/src/net/sf/openrocket/gui/configdialog/TransitionConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/TransitionConfig.java index 423c743cb..813c4f4f1 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/TransitionConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/TransitionConfig.java @@ -15,6 +15,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.adaptors.TransitionShapeModel; import net.sf.openrocket.gui.components.BasicSlider; @@ -69,11 +70,13 @@ public class TransitionConfig extends RocketComponentConfig { } }); panel.add(typeBox, "span 3, split 2"); + order.add(typeBox); {//// Clipped final JCheckBox checkbox = new JCheckBox(new BooleanModel(component, "Clipped")); checkbox.setText(trans.get("TransitionCfg.checkbox.Clipped")); panel.add(checkbox, "wrap"); + order.add(checkbox); //// Shape parameter: this.shapeLabel = new JLabel(trans.get("TransitionCfg.lbl.Shapeparam")); @@ -86,6 +89,7 @@ public class TransitionConfig extends RocketComponentConfig { this.shapeSpinner = new JSpinner(shapeModel.getSpinnerModel()); shapeSpinner.setEditor(new SpinnerEditor(shapeSpinner)); panel.add(shapeSpinner, "growx"); + order.add(((SpinnerEditor) shapeSpinner.getEditor()).getTextField()); DoubleModel min = new DoubleModel(component, "ShapeParameterMin"); DoubleModel max = new DoubleModel(component, "ShapeParameterMax"); @@ -104,6 +108,7 @@ public class TransitionConfig extends RocketComponentConfig { final JSpinner lengthSpinner = new JSpinner(lengthModel.getSpinnerModel()); lengthSpinner.setEditor(new SpinnerEditor(lengthSpinner)); panel.add(lengthSpinner, "growx"); + order.add(((SpinnerEditor) lengthSpinner.getEditor()).getTextField()); panel.add(new UnitSelector(lengthModel), "growx"); panel.add(new BasicSlider(lengthModel.getSliderModel(0, 0.05, 0.3)), "w 100lp, wrap"); @@ -118,6 +123,7 @@ public class TransitionConfig extends RocketComponentConfig { final JSpinner foreRadiusSpinner = new JSpinner(foreRadiusModel.getSpinnerModel()); foreRadiusSpinner.setEditor(new SpinnerEditor(foreRadiusSpinner)); panel.add(foreRadiusSpinner, "growx"); + order.add(((SpinnerEditor) foreRadiusSpinner.getEditor()).getTextField()); panel.add(new UnitSelector(foreRadiusModel), "growx"); panel.add(new BasicSlider(foreRadiusModel.getSliderModel(0, 0.04, 0.2)), "w 100lp, wrap 0px"); @@ -126,6 +132,7 @@ public class TransitionConfig extends RocketComponentConfig { //// Automatic checkAutoForeRadius.setText(trans.get("TransitionCfg.checkbox.Automatic")); panel.add(checkAutoForeRadius, "skip, span 2, wrap"); + order.add(checkAutoForeRadius); updateCheckboxAutoForeRadius(); } @@ -138,6 +145,7 @@ public class TransitionConfig extends RocketComponentConfig { final JSpinner aftRadiusSpinner = new JSpinner(aftRadiusModel .getSpinnerModel()); aftRadiusSpinner.setEditor(new SpinnerEditor(aftRadiusSpinner)); panel.add(aftRadiusSpinner, "growx"); + order.add(((SpinnerEditor) aftRadiusSpinner.getEditor()).getTextField()); panel.add(new UnitSelector(aftRadiusModel), "growx"); panel.add(new BasicSlider(aftRadiusModel.getSliderModel(0, 0.04, 0.2)), "w 100lp, wrap 0px"); @@ -146,6 +154,7 @@ public class TransitionConfig extends RocketComponentConfig { //// Automatic checkAutoAftRadius.setText(trans.get("TransitionCfg.checkbox.Automatic")); panel.add(checkAutoAftRadius, "skip, span 2, wrap"); + order.add(checkAutoAftRadius); updateCheckboxAutoAftRadius(); } @@ -157,6 +166,7 @@ public class TransitionConfig extends RocketComponentConfig { final JSpinner thicknessSpinner = new JSpinner(thicknessModel.getSpinnerModel()); thicknessSpinner.setEditor(new SpinnerEditor(thicknessSpinner)); panel.add(thicknessSpinner, "growx"); + order.add(((SpinnerEditor) thicknessSpinner.getEditor()).getTextField()); panel.add(new UnitSelector(thicknessModel), "growx"); panel.add(new BasicSlider(thicknessModel.getSliderModel(0, 0.01)), "w 100lp, wrap 0px"); @@ -166,6 +176,7 @@ public class TransitionConfig extends RocketComponentConfig { //// Filled thicknessCheckbox.setText(trans.get("TransitionCfg.checkbox.Filled")); panel.add(thicknessCheckbox, "skip, span 2, wrap"); + order.add(thicknessCheckbox); } //// Description @@ -189,6 +200,11 @@ public class TransitionConfig extends RocketComponentConfig { tabbedPane.insertTab(trans.get("TransitionCfg.tab.Shoulder"), null, shoulderTab(), trans.get("TransitionCfg.tab.Shoulderproperties"), 1); tabbedPane.setSelectedIndex(0); + + // Apply the custom focus travel policy to this config dialog + CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); + parent.setFocusTraversalPolicy(policy); + } From fd43c73ad4a381a042619b4ea173495334221fc7 Mon Sep 17 00:00:00 2001 From: Remington Holder Date: Mon, 15 Aug 2022 22:19:14 -0400 Subject: [PATCH 25/31] Add traversal policy for trapezoid fin set config --- .../configdialog/TrapezoidFinSetConfig.java | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/configdialog/TrapezoidFinSetConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/TrapezoidFinSetConfig.java index 1d684e0e7..f59f1f066 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/TrapezoidFinSetConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/TrapezoidFinSetConfig.java @@ -15,6 +15,7 @@ import javax.swing.SwingConstants; import net.miginfocom.swing.MigLayout; import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.gui.SpinnerEditor; +import net.sf.openrocket.gui.adaptors.CustomFocusTraversalPolicy; import net.sf.openrocket.gui.adaptors.DoubleModel; import net.sf.openrocket.gui.adaptors.EnumModel; import net.sf.openrocket.gui.adaptors.IntegerModel; @@ -55,6 +56,7 @@ public class TrapezoidFinSetConfig extends FinSetConfig { //// The number of fins in the fin set. finCountSpinner.setToolTipText(trans.get("TrapezoidFinSetCfg.lbl.ttip.Nbroffins")); panel.add(finCountSpinner, "growx, wrap"); + order.add(((SpinnerEditor) finCountSpinner.getEditor()).getTextField()); { /// Base rotation @@ -68,6 +70,7 @@ public class TrapezoidFinSetConfig extends FinSetConfig { final JSpinner baseRotationSpinner = new JSpinner(baseRotationModel.getSpinnerModel()); baseRotationSpinner.setEditor(new SpinnerEditor(baseRotationSpinner)); panel.add(baseRotationSpinner, "growx"); + order.add(((SpinnerEditor) baseRotationSpinner.getEditor()).getTextField()); panel.add(new UnitSelector(baseRotationModel), "growx"); panel.add(new BasicSlider(baseRotationModel.getSliderModel(-Math.PI, Math.PI)), "w 100lp, wrap"); @@ -84,6 +87,7 @@ public class TrapezoidFinSetConfig extends FinSetConfig { final JSpinner cantSpinner = new JSpinner(cantModel.getSpinnerModel()); cantSpinner.setEditor(new SpinnerEditor(cantSpinner)); panel.add(cantSpinner, "growx"); + order.add(((SpinnerEditor) cantSpinner.getEditor()).getTextField()); panel.add(new UnitSelector(cantModel), "growx"); panel.add(new BasicSlider(cantModel.getSliderModel(-FinSet.MAX_CANT_RADIANS, FinSet.MAX_CANT_RADIANS)), @@ -98,6 +102,7 @@ public class TrapezoidFinSetConfig extends FinSetConfig { final JSpinner rootChordSpinner = new JSpinner(rootChordModel.getSpinnerModel()); rootChordSpinner.setEditor(new SpinnerEditor(rootChordSpinner)); panel.add(rootChordSpinner, "growx"); + order.add(((SpinnerEditor) rootChordSpinner.getEditor()).getTextField()); panel.add(new UnitSelector(rootChordModel), "growx"); panel.add(new BasicSlider(rootChordModel.getSliderModel(0, 0.05, 0.2)), "w 100lp, wrap"); @@ -111,6 +116,7 @@ public class TrapezoidFinSetConfig extends FinSetConfig { final JSpinner tipChordSpinner = new JSpinner(tipChordModel.getSpinnerModel()); tipChordSpinner.setEditor(new SpinnerEditor(tipChordSpinner)); panel.add(tipChordSpinner, "growx"); + order.add(((SpinnerEditor) tipChordSpinner.getEditor()).getTextField()); panel.add(new UnitSelector(tipChordModel), "growx"); panel.add(new BasicSlider(tipChordModel.getSliderModel(0, 0.05, 0.2)), "w 100lp, wrap"); @@ -124,6 +130,7 @@ public class TrapezoidFinSetConfig extends FinSetConfig { final JSpinner heightSpinner = new JSpinner(heightModel.getSpinnerModel()); heightSpinner.setEditor(new SpinnerEditor(heightSpinner)); panel.add(heightSpinner, "growx"); + order.add(((SpinnerEditor) heightSpinner.getEditor()).getTextField()); panel.add(new UnitSelector(heightModel), "growx"); panel.add(new BasicSlider(heightModel.getSliderModel(0, 0.05, 0.2)), "w 100lp, wrap"); @@ -137,6 +144,7 @@ public class TrapezoidFinSetConfig extends FinSetConfig { final JSpinner sweepDistanceSpinner = new JSpinner(sweepDistanceModel.getSpinnerModel()); sweepDistanceSpinner.setEditor(new SpinnerEditor(sweepDistanceSpinner)); panel.add(sweepDistanceSpinner, "growx"); + order.add(((SpinnerEditor) sweepDistanceSpinner.getEditor()).getTextField()); panel.add(new UnitSelector(sweepDistanceModel), "growx"); @@ -156,6 +164,7 @@ public class TrapezoidFinSetConfig extends FinSetConfig { final JSpinner sweepAngleSpinner = new JSpinner(sweepAngleModel.getSpinnerModel()); sweepAngleSpinner.setEditor(new SpinnerEditor(sweepAngleSpinner)); panel.add(sweepAngleSpinner, "growx"); + order.add(((SpinnerEditor) sweepAngleSpinner.getEditor()).getTextField()); panel.add(new UnitSelector(sweepAngleModel), "growx"); panel.add(new BasicSlider(sweepAngleModel.getSliderModel(-Math.PI / 4, Math.PI / 4)), @@ -168,6 +177,7 @@ public class TrapezoidFinSetConfig extends FinSetConfig { final EnumModel axialMethodModel = new EnumModel(component, "AxialMethod", AxialMethod.axialOffsetMethods ); final JComboBox axialMethodCombo = new JComboBox( axialMethodModel ); panel.add(axialMethodCombo, "spanx, growx, wrap"); + order.add(axialMethodCombo); //// plus panel.add(new JLabel(trans.get("TrapezoidFinSetCfg.lbl.plus")), "right"); @@ -177,6 +187,7 @@ public class TrapezoidFinSetConfig extends FinSetConfig { axialOffsetSpinner.setEditor(new SpinnerEditor(axialOffsetSpinner)); panel.add(axialOffsetSpinner, "growx"); + order.add(((SpinnerEditor) axialOffsetSpinner.getEditor()).getTextField()); axialMethodCombo.addActionListener(new ActionListener() { @Override @@ -206,6 +217,7 @@ public class TrapezoidFinSetConfig extends FinSetConfig { JComboBox sectionCombo = new JComboBox( new EnumModel(component, "CrossSection")); panel.add(sectionCombo, "span, growx, wrap"); + order.add(sectionCombo); //// Thickness: @@ -216,6 +228,7 @@ public class TrapezoidFinSetConfig extends FinSetConfig { final JSpinner thicknessSpinner = new JSpinner(thicknessModel.getSpinnerModel()); thicknessSpinner.setEditor(new SpinnerEditor(thicknessSpinner)); panel.add(thicknessSpinner, "growx"); + order.add(((SpinnerEditor) thicknessSpinner.getEditor()).getTextField()); panel.add(new UnitSelector(thicknessModel), "growx"); panel.add(new BasicSlider(thicknessModel.getSliderModel(0, 0.01)), "w 100lp, wrap para"); @@ -235,8 +248,11 @@ public class TrapezoidFinSetConfig extends FinSetConfig { tabbedPane.insertTab(trans.get("TrapezoidFinSetCfg.tab.General"), null, mainPanel, trans.get("TrapezoidFinSetCfg.tab.Generalproperties"), 0); tabbedPane.setSelectedIndex(0); - + + // Apply the custom focus travel policy to this config dialog + CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); + parent.setFocusTraversalPolicy(policy); + addFinSetButtons(); - } } From 1acbc326f4813f47cba8af45f58ece31c4f97963 Mon Sep 17 00:00:00 2001 From: Remington Holder Date: Mon, 15 Aug 2022 22:39:51 -0400 Subject: [PATCH 26/31] Add traversal policy for tube fin set config --- .../gui/configdialog/TubeFinSetConfig.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/swing/src/net/sf/openrocket/gui/configdialog/TubeFinSetConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/TubeFinSetConfig.java index ff3506760..99dbb5b67 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/TubeFinSetConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/TubeFinSetConfig.java @@ -14,6 +14,7 @@ import javax.swing.JSpinner; import net.miginfocom.swing.MigLayout; import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.gui.SpinnerEditor; +import net.sf.openrocket.gui.adaptors.CustomFocusTraversalPolicy; import net.sf.openrocket.gui.adaptors.DoubleModel; import net.sf.openrocket.gui.adaptors.EnumModel; import net.sf.openrocket.gui.adaptors.IntegerModel; @@ -46,6 +47,7 @@ public class TubeFinSetConfig extends RocketComponentConfig { JSpinner spin = new JSpinner(im.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx, wrap"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); //// Length: panel.add(new JLabel(trans.get("TubeFinSetCfg.lbl.Length"))); @@ -56,6 +58,7 @@ public class TubeFinSetConfig extends RocketComponentConfig { spin.setEditor(new SpinnerEditor(spin)); focusElement = spin; panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(0, 0.02, 0.1)), "w 100lp, wrap para"); @@ -70,6 +73,7 @@ public class TubeFinSetConfig 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 rel"); @@ -78,6 +82,7 @@ public class TubeFinSetConfig extends RocketComponentConfig { //// Automatic check.setText(trans.get("TubeFinSetCfg.checkbox.Automatic")); panel.add(check, "skip, span 2, wrap"); + order.add(check); //// Inner diameter: panel.add(new JLabel(trans.get("TubeFinSetCfg.lbl.Innerdiam"))); @@ -89,6 +94,7 @@ public class TubeFinSetConfig extends RocketComponentConfig { spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(new DoubleModel(0), od)), "w 100lp, wrap rel"); @@ -103,6 +109,7 @@ public class TubeFinSetConfig extends RocketComponentConfig { spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(0, 0.01)), "w 100lp, wrap 20lp"); @@ -120,6 +127,7 @@ public class TubeFinSetConfig extends RocketComponentConfig { spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(-Math.PI, Math.PI)), "w 100lp, wrap"); @@ -133,6 +141,7 @@ public class TubeFinSetConfig extends RocketComponentConfig { final EnumModel axialMethodModel = new EnumModel(component, "AxialMethod", AxialMethod.axialOffsetMethods ); final JComboBox axialMethodCombo = new JComboBox( axialMethodModel ); panel.add(axialMethodCombo, "spanx, growx, wrap"); + order.add(axialMethodCombo); //// plus panel.add(new JLabel(trans.get("LaunchLugCfg.lbl.plus")), "right"); @@ -141,6 +150,7 @@ public class TubeFinSetConfig extends RocketComponentConfig { spin = new JSpinner(axialOffsetModel.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); + order.add(((SpinnerEditor) spin.getEditor()).getTextField()); axialMethodCombo.addActionListener(new ActionListener() { @Override @@ -167,6 +177,11 @@ public class TubeFinSetConfig extends RocketComponentConfig { tabbedPane.insertTab(trans.get("LaunchLugCfg.tab.General"), null, primary, trans.get("LaunchLugCfg.tab.Generalprop"), 0); tabbedPane.setSelectedIndex(0); + + // Apply the custom focus travel policy to this config dialog + CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); + parent.setFocusTraversalPolicy(policy); + } @Override From 72b9deddb74ca76da584c02e8aa6d30f4ca41b29 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Sat, 27 Aug 2022 20:00:08 +0200 Subject: [PATCH 27/31] Include 'Parts library' button in order --- .../sf/openrocket/gui/configdialog/RocketComponentConfig.java | 1 + 1 file changed, 1 insertion(+) diff --git a/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java index a0b9ff083..c105eaa4c 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java @@ -134,6 +134,7 @@ public class RocketComponentConfig extends JPanel { } }); this.add(selectPreset); + order.add(selectPreset); } tabbedPane = new JTabbedPane(); From abeba2fa468bfc729f5bef21aef701d7830c0ad3 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Sat, 27 Aug 2022 20:05:12 +0200 Subject: [PATCH 28/31] Add fin shape table focus --- .../sf/openrocket/gui/configdialog/FreeformFinSetConfig.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/swing/src/net/sf/openrocket/gui/configdialog/FreeformFinSetConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/FreeformFinSetConfig.java index 1bdd1d70c..00c7435a8 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/FreeformFinSetConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/FreeformFinSetConfig.java @@ -302,7 +302,8 @@ public class FreeformFinSetConfig extends FinSetConfig { panel.setLayout(new MigLayout("fill, gap 5!","", "[nogrid, fill, sizegroup display, growprio 200]5![sizegroup text, growprio 5]5![sizegroup buttons, align top, growprio 5]0!")); // first row: main display - panel.add(tablePane, "width 100lp:100lp:, growy"); + panel.add(tablePane, "width 100lp:100lp:, growy"); + order.add(table); panel.add(figurePane, "width 200lp:400lp:, gap unrel, grow, height 100lp:250lp:, wrap"); // row of text directly below figure From c217479a3cee841a46f74bf205fcf994af131508 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Sun, 28 Aug 2022 14:56:31 +0200 Subject: [PATCH 29/31] Put focus on tabbed pane after selection change This effects to the user not having to tab through the first GUI widgets (component name, preset etc.), but instead a single tab key press will cycle directly to the first widget of that tab. --- .../openrocket/gui/configdialog/RocketComponentConfig.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java index c105eaa4c..514637c6a 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java @@ -140,6 +140,12 @@ public class RocketComponentConfig extends JPanel { tabbedPane = new JTabbedPane(); this.add(tabbedPane, "newline, span, growx, growy 100, wrap"); order.add(tabbedPane); + tabbedPane.addChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + tabbedPane.requestFocusInWindow(); + } + }); //// Override and Mass and CG override options tabbedPane.addTab(trans.get("RocketCompCfg.tab.Override"), null, overrideTab(), From 099ab09bcc31a8bbb104a4e2bb8fa62b0db6b138 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Sun, 28 Aug 2022 15:00:02 +0200 Subject: [PATCH 30/31] Fix some bugs in the custom focus traversal policy Sorry, I don't want to split this all up in atomic commits... --- .../gui/configdialog/AppearancePanel.java | 11 +++++++---- .../gui/configdialog/AxialStageConfig.java | 12 ++++++------ .../gui/configdialog/BodyTubeConfig.java | 2 +- .../gui/configdialog/BulkheadConfig.java | 6 ++++++ .../gui/configdialog/CenteringRingConfig.java | 6 ++++++ .../gui/configdialog/ComponentAssemblyConfig.java | 7 ++++++- .../gui/configdialog/EllipticalFinSetConfig.java | 1 + .../openrocket/gui/configdialog/FinSetConfig.java | 14 +------------- .../gui/configdialog/FreeformFinSetConfig.java | 9 +++++---- .../gui/configdialog/InnerTubeConfig.java | 10 +--------- .../gui/configdialog/LaunchLugConfig.java | 2 +- .../gui/configdialog/MassComponentConfig.java | 6 +----- .../gui/configdialog/NoseConeConfig.java | 2 +- .../gui/configdialog/ParachuteConfig.java | 6 +----- .../gui/configdialog/RailButtonConfig.java | 10 +++++----- .../gui/configdialog/RingComponentConfig.java | 6 +----- .../gui/configdialog/RocketComponentConfig.java | 5 ++++- .../gui/configdialog/ShockCordConfig.java | 5 +---- .../openrocket/gui/configdialog/SleeveConfig.java | 6 ++++++ .../gui/configdialog/StreamerConfig.java | 6 +----- .../configdialog/ThicknessRingComponentConfig.java | 6 ++++++ .../gui/configdialog/TransitionConfig.java | 2 +- .../gui/configdialog/TrapezoidFinSetConfig.java | 5 +++-- .../gui/configdialog/TubeFinSetConfig.java | 2 +- 24 files changed, 73 insertions(+), 74 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/configdialog/AppearancePanel.java b/swing/src/net/sf/openrocket/gui/configdialog/AppearancePanel.java index 42f4cc225..f19076c96 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/AppearancePanel.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/AppearancePanel.java @@ -287,6 +287,7 @@ public class AppearancePanel extends JPanel { BooleanModel fDefault = new BooleanModel(c.getColor() == null); + final JButton saveAsDefault; {// Style Header Row final JCheckBox colorDefault = new JCheckBox(fDefault); colorDefault.addActionListener(new ActionListener() { @@ -311,9 +312,9 @@ public class AppearancePanel extends JPanel { add(colorDefault); order.add(colorDefault); - JButton button = new SelectColorButton( + saveAsDefault = new SelectColorButton( trans.get("RocketCompCfg.but.Saveasdefstyle")); - button.addActionListener(new ActionListener() { + saveAsDefault.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (c.getColor() != null) { @@ -328,8 +329,8 @@ public class AppearancePanel extends JPanel { } } }); - fDefault.addEnableComponent(button, false); - add(button, "span 2, align right, wrap"); + fDefault.addEnableComponent(saveAsDefault, false); + add(saveAsDefault, "span 2, align right, wrap"); } {// Figure Color @@ -339,6 +340,8 @@ public class AppearancePanel extends JPanel { order.add(figureColorButton); } + order.add(saveAsDefault); + {// Line Style add(new JLabel(trans.get("RocketCompCfg.lbl.Complinestyle"))); diff --git a/swing/src/net/sf/openrocket/gui/configdialog/AxialStageConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/AxialStageConfig.java index c1202144c..611e67920 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/AxialStageConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/AxialStageConfig.java @@ -36,6 +36,11 @@ public class AxialStageConfig extends ComponentAssemblyConfig { trans.get("StageConfig.tab.Separation.ttip"), 0); tabbedPane.setSelectedIndex(0); } + + // Apply the custom focus travel policy to this config dialog + order.add(closeButton); // Make sure the close button is the last component + CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); + parent.setFocusTraversalPolicy(policy); } @@ -47,8 +52,7 @@ public class AxialStageConfig extends ComponentAssemblyConfig { StageSeparationConfiguration sepConfig = stage.getSeparationConfiguration(); - JComboBox combo = new JComboBox( - new EnumModel( sepConfig, "SeparationEvent", SeparationEvent.values())); + JComboBox combo = new JComboBox<>(new EnumModel<>( sepConfig, "SeparationEvent", SeparationEvent.values())); //combo.setSelectedItem(sepConfig); panel.add(combo, ""); @@ -68,10 +72,6 @@ public class AxialStageConfig extends ComponentAssemblyConfig { panel.add(new StyledLabel(CommonStrings.override_description, -1), "spanx, wrap para"); - // Apply the custom focus travel policy to this config dialog - CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); - parent.setFocusTraversalPolicy(policy); - return panel; } diff --git a/swing/src/net/sf/openrocket/gui/configdialog/BodyTubeConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/BodyTubeConfig.java index ef25042e7..5e6adf427 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/BodyTubeConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/BodyTubeConfig.java @@ -120,9 +120,9 @@ public class BodyTubeConfig extends RocketComponentConfig { trans.get("BodyTubecfg.tab.Motormountconf"), 1); // Apply the custom focus travel policy to this config dialog + order.add(closeButton); // Make sure the close button is the last component CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); parent.setFocusTraversalPolicy(policy); - } @Override diff --git a/swing/src/net/sf/openrocket/gui/configdialog/BulkheadConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/BulkheadConfig.java index 17d5163bf..1659a721c 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/BulkheadConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/BulkheadConfig.java @@ -5,6 +5,7 @@ import javax.swing.JDialog; import javax.swing.JPanel; import net.sf.openrocket.document.OpenRocketDocument; +import net.sf.openrocket.gui.adaptors.CustomFocusTraversalPolicy; import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.startup.Application; @@ -26,6 +27,11 @@ public class BulkheadConfig extends RingComponentConfig { tabbedPane.insertTab(trans.get("BulkheadCfg.tab.General"), null, tab, trans.get("BulkheadCfg.tab.Generalproperties"), 0); tabbedPane.setSelectedIndex(0); + + // Apply the custom focus travel policy to this panel + order.add(closeButton); // Make sure the close button is the last component + CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); + parent.setFocusTraversalPolicy(policy); } } \ No newline at end of file diff --git a/swing/src/net/sf/openrocket/gui/configdialog/CenteringRingConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/CenteringRingConfig.java index 048116ec1..548bf4b86 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/CenteringRingConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/CenteringRingConfig.java @@ -5,6 +5,7 @@ import javax.swing.JDialog; import javax.swing.JPanel; import net.sf.openrocket.document.OpenRocketDocument; +import net.sf.openrocket.gui.adaptors.CustomFocusTraversalPolicy; import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.startup.Application; @@ -28,6 +29,11 @@ public class CenteringRingConfig extends RingComponentConfig { tabbedPane.insertTab(trans.get("CenteringRingCfg.tab.General"), null, tab, trans.get("CenteringRingCfg.tab.Generalproperties"), 0); tabbedPane.setSelectedIndex(0); + + // Apply the custom focus travel policy to this panel + order.add(closeButton); // Make sure the close button is the last component + CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); + parent.setFocusTraversalPolicy(policy); } } \ No newline at end of file diff --git a/swing/src/net/sf/openrocket/gui/configdialog/ComponentAssemblyConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/ComponentAssemblyConfig.java index 4697b2717..f6554f544 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/ComponentAssemblyConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/ComponentAssemblyConfig.java @@ -58,6 +58,7 @@ public class ComponentAssemblyConfig extends RocketComponentConfig { final ComboBoxModel radiusMethodModel = new EnumModel( boosters, "RadiusMethod", RadiusMethod.choices()); final JComboBox radiusMethodCombo = new JComboBox( radiusMethodModel ); motherPanel.add( radiusMethodCombo, "spanx 3, growx, wrap"); + order.add(radiusMethodCombo); // set radial distance JLabel radiusLabel = new JLabel(trans.get("StageConfig.parallel.radius")); @@ -68,6 +69,7 @@ public class ComponentAssemblyConfig extends RocketComponentConfig { JSpinner radiusSpinner = new JSpinner(radiusModel.getSpinnerModel()); radiusSpinner.setEditor(new SpinnerEditor(radiusSpinner)); motherPanel.add(radiusSpinner , "wmin 65lp, growx 1, align right"); + order.add(((SpinnerEditor) radiusSpinner.getEditor()).getTextField()); // autoRadOffsModel.addEnableComponent(radiusSpinner, false); UnitSelector radiusUnitSelector = new UnitSelector(radiusModel); motherPanel.add(radiusUnitSelector, "growx 1"); @@ -89,6 +91,7 @@ public class ComponentAssemblyConfig extends RocketComponentConfig { JSpinner angleSpinner = new JSpinner(angleModel.getSpinnerModel()); angleSpinner.setEditor(new SpinnerEditor(angleSpinner)); motherPanel.add(angleSpinner, "wmin 65lp, growx 1"); + order.add(((SpinnerEditor) angleSpinner.getEditor()).getTextField()); UnitSelector angleUnitSelector = new UnitSelector(angleModel); motherPanel.add( angleUnitSelector, "growx 1"); motherPanel.add(new BasicSlider(angleModel.getSliderModel(-Math.PI, Math.PI)), "gapleft para, growx 2, wrap"); @@ -101,6 +104,7 @@ public class ComponentAssemblyConfig extends RocketComponentConfig { JSpinner countSpinner = new JSpinner(countModel.getSpinnerModel()); countSpinner.setEditor(new SpinnerEditor(countSpinner)); motherPanel.add(countSpinner, "wmin 65lp, growx 1, wrap"); + order.add(((SpinnerEditor) countSpinner.getEditor()).getTextField()); // setPositions relative to parent component JLabel positionLabel = new JLabel(trans.get("LaunchLugCfg.lbl.Posrelativeto")); @@ -109,6 +113,7 @@ public class ComponentAssemblyConfig extends RocketComponentConfig { ComboBoxModel axialPositionMethodModel = new EnumModel(component, "AxialMethod", AxialMethod.axialOffsetMethods ); JComboBox positionMethodCombo = new JComboBox( axialPositionMethodModel ); motherPanel.add(positionMethodCombo, "spanx 3, growx, wrap"); + order.add(positionMethodCombo); // plus motherPanel.add(new JLabel(trans.get("StageConfig.parallel.plus")), "right"); @@ -116,8 +121,8 @@ public class ComponentAssemblyConfig extends RocketComponentConfig { final DoubleModel axialOffsetModel = new DoubleModel(component, "AxialOffset", UnitGroup.UNITS_LENGTH); final JSpinner axialOffsetSpinner = new JSpinner(axialOffsetModel.getSpinnerModel()); axialOffsetSpinner.setEditor(new SpinnerEditor(axialOffsetSpinner)); - motherPanel.add(axialOffsetSpinner, "wmin 65lp, growx 1"); + order.add(((SpinnerEditor) axialOffsetSpinner.getEditor()).getTextField()); positionMethodCombo.addActionListener(new ActionListener() { @Override diff --git a/swing/src/net/sf/openrocket/gui/configdialog/EllipticalFinSetConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/EllipticalFinSetConfig.java index 213b421ba..add84adfb 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/EllipticalFinSetConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/EllipticalFinSetConfig.java @@ -201,6 +201,7 @@ public class EllipticalFinSetConfig extends FinSetConfig { tabbedPane.setSelectedIndex(0); // Apply the custom focus travel policy to this config dialog + order.add(closeButton); // Make sure the close button is the last component CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); parent.setFocusTraversalPolicy(policy); } diff --git a/swing/src/net/sf/openrocket/gui/configdialog/FinSetConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/FinSetConfig.java index d06207beb..6c12d6638 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/FinSetConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/FinSetConfig.java @@ -145,10 +145,6 @@ public abstract class FinSetConfig extends RocketComponentConfig { order.add(split); order.add(convert); } - - // Apply the custom focus travel policy to these bottom buttons - CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); - parent.setFocusTraversalPolicy(policy); } private JPanel finTabPanel() { @@ -251,11 +247,7 @@ public abstract class FinSetConfig extends RocketComponentConfig { } }); panel.add(autoCalc, "skip 1, spanx"); - order.add(autoCalc); - - // Apply the custom focus travel policy to this panel - CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); - parent.setFocusTraversalPolicy(policy); + order.add(autoCalc); return panel; } @@ -585,10 +577,6 @@ public abstract class FinSetConfig extends RocketComponentConfig { order.add(materialCombo); filletPanel.setToolTipText(tip); - // Apply the custom focus travel policy to this panel - CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); - parent.setFocusTraversalPolicy(policy); - return filletPanel; } } diff --git a/swing/src/net/sf/openrocket/gui/configdialog/FreeformFinSetConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/FreeformFinSetConfig.java index 00c7435a8..f3777b3b0 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/FreeformFinSetConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/FreeformFinSetConfig.java @@ -95,6 +95,11 @@ public class FreeformFinSetConfig extends FinSetConfig { tabbedPane.setSelectedIndex(0); addFinSetButtons(); + + // Apply the custom focus travel policy to this panel + order.add(closeButton); // Make sure the close button is the last component + CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); + parent.setFocusTraversalPolicy(policy); } @@ -218,10 +223,6 @@ public class FreeformFinSetConfig extends FinSetConfig { mainPanel.add(panel, "aligny 20%"); - // Apply the custom focus travel policy to this panel - CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); - parent.setFocusTraversalPolicy(policy); - return mainPanel; } diff --git a/swing/src/net/sf/openrocket/gui/configdialog/InnerTubeConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/InnerTubeConfig.java index eb281008d..45c984dd5 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/InnerTubeConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/InnerTubeConfig.java @@ -207,9 +207,9 @@ public class InnerTubeConfig extends RocketComponentConfig { tabbedPane.setSelectedIndex(0); // Apply the custom focus travel policy to this config dialog + order.add(closeButton); // Make sure the close button is the last component CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); parent.setFocusTraversalPolicy(policy); - } protected JPanel positionTab() { @@ -280,10 +280,6 @@ public class InnerTubeConfig extends RocketComponentConfig { note.setText(trans.get("ringcompcfg.note.desc")); panel.add(note, "spanx, growx"); - // Apply the custom focus travel policy to this config dialog - CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); - parent.setFocusTraversalPolicy(policy); - return panel; } @@ -417,10 +413,6 @@ public class InnerTubeConfig extends RocketComponentConfig { panel.add(subPanel, "grow"); - // Apply the custom focus travel policy to this config dialog - CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); - parent.setFocusTraversalPolicy(policy); - return panel; } diff --git a/swing/src/net/sf/openrocket/gui/configdialog/LaunchLugConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/LaunchLugConfig.java index ad8ab87d4..37d93a0fd 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/LaunchLugConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/LaunchLugConfig.java @@ -162,9 +162,9 @@ public class LaunchLugConfig extends RocketComponentConfig { tabbedPane.setSelectedIndex(0); // Apply the custom focus travel policy to this config dialog + order.add(closeButton); // Make sure the close button is the last component CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); parent.setFocusTraversalPolicy(policy); - } @Override diff --git a/swing/src/net/sf/openrocket/gui/configdialog/MassComponentConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/MassComponentConfig.java index 6c3bdfd0b..4ad866283 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/MassComponentConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/MassComponentConfig.java @@ -165,9 +165,9 @@ public class MassComponentConfig extends RocketComponentConfig { tabbedPane.setSelectedIndex(0); // Apply the custom focus travel policy to this config dialog + order.add(closeButton); // Make sure the close button is the last component CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); parent.setFocusTraversalPolicy(policy); - } @@ -215,10 +215,6 @@ public class MassComponentConfig extends RocketComponentConfig { panel.add(button, "spanx, right"); order.add(button); - // Apply the custom focus travel policy to this panel - CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); - parent.setFocusTraversalPolicy(policy); - return panel; } } diff --git a/swing/src/net/sf/openrocket/gui/configdialog/NoseConeConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/NoseConeConfig.java index 7b6d1e6e9..f0dd30ae2 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/NoseConeConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/NoseConeConfig.java @@ -169,9 +169,9 @@ public class NoseConeConfig extends RocketComponentConfig { tabbedPane.setSelectedIndex(0); // Apply the custom focus travel policy to this config dialog + order.add(closeButton); // Make sure the close button is the last component CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); parent.setFocusTraversalPolicy(policy); - } diff --git a/swing/src/net/sf/openrocket/gui/configdialog/ParachuteConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/ParachuteConfig.java index 98b4b9ff9..bbdec3233 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/ParachuteConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/ParachuteConfig.java @@ -288,9 +288,9 @@ public class ParachuteConfig extends RecoveryDeviceConfig { tabbedPane.setSelectedIndex(0); // Apply the custom focus travel policy to this config dialog + order.add(closeButton); // Make sure the close button is the last component CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); parent.setFocusTraversalPolicy(policy); - } @@ -338,10 +338,6 @@ public class ParachuteConfig extends RecoveryDeviceConfig { panel.add(button, "spanx, right"); order.add(button); - // Apply the custom focus travel policy to this panel - CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); - parent.setFocusTraversalPolicy(policy); - return panel; } } diff --git a/swing/src/net/sf/openrocket/gui/configdialog/RailButtonConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/RailButtonConfig.java index 6caee5ea9..900b09496 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/RailButtonConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/RailButtonConfig.java @@ -33,7 +33,11 @@ public class RailButtonConfig extends RocketComponentConfig { //// General and General properties tabbedPane.insertTab( trans.get("RailBtnCfg.tab.General"), null, buttonTab( (RailButton)component ), trans.get("RailBtnCfg.tab.GeneralProp"), 0); tabbedPane.setSelectedIndex(0); - + + // Apply the custom focus travel policy to this panel + order.add(closeButton); // Make sure the close button is the last component + CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); + parent.setFocusTraversalPolicy(policy); } private JPanel buttonTab( final RailButton rbc ){ @@ -141,10 +145,6 @@ public class RailButtonConfig extends RocketComponentConfig { primary.add(panel, "grow"); - // Apply the custom focus travel policy to this panel - CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); - parent.setFocusTraversalPolicy(policy); - return primary; } diff --git a/swing/src/net/sf/openrocket/gui/configdialog/RingComponentConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/RingComponentConfig.java index 2d354df3e..b999f7016 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/RingComponentConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/RingComponentConfig.java @@ -34,7 +34,7 @@ public class RingComponentConfig extends RocketComponentConfig { super(d, component, parent); } - + protected JPanel generalTab(String outer, String inner, String thickness, String length) { JPanel panel = new JPanel(new MigLayout("gap rel unrel", "[][65lp::][30lp::]", "")); DoubleModel m; @@ -175,10 +175,6 @@ public class RingComponentConfig extends RocketComponentConfig { } panel.add(materialPanel, "cell 4 0, gapleft paragraph, aligny 0%, spany"); - // Apply the custom focus travel policy to this config dialog - CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); - parent.setFocusTraversalPolicy(policy); - return panel; } diff --git a/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java index 514637c6a..4bcec1c19 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java @@ -23,6 +23,8 @@ import javax.swing.JTabbedPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.SwingUtilities; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; import net.miginfocom.swing.MigLayout; import net.sf.openrocket.database.ComponentPresetDatabase; @@ -69,6 +71,7 @@ public class RocketComponentConfig extends JPanel { private final TextFieldListener textFieldListener; private JPanel buttonPanel; + protected JButton closeButton; private AppearancePanel appearancePanel = null; private JLabel infoLabel; @@ -189,7 +192,7 @@ public class RocketComponentConfig extends JPanel { } //// Close button - JButton closeButton = new SelectColorButton(trans.get("dlg.but.close")); + this.closeButton = new SelectColorButton(trans.get("dlg.but.close")); closeButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { diff --git a/swing/src/net/sf/openrocket/gui/configdialog/ShockCordConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/ShockCordConfig.java index 2c38936d4..029dd8759 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/ShockCordConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/ShockCordConfig.java @@ -141,6 +141,7 @@ public class ShockCordConfig extends RocketComponentConfig { tabbedPane.setSelectedIndex(0); // Apply the custom focus travel policy to this config dialog + order.add(closeButton); // Make sure the close button is the last component CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); parent.setFocusTraversalPolicy(policy); } @@ -190,10 +191,6 @@ public class ShockCordConfig extends RocketComponentConfig { panel.add(button, "spanx, right"); order.add(button); - // Apply the custom focus travel policy to this panel - CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); - parent.setFocusTraversalPolicy(policy); - return panel; } } diff --git a/swing/src/net/sf/openrocket/gui/configdialog/SleeveConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/SleeveConfig.java index 46d0d3e30..4545660c9 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/SleeveConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/SleeveConfig.java @@ -5,6 +5,7 @@ import javax.swing.JDialog; import javax.swing.JPanel; import net.sf.openrocket.document.OpenRocketDocument; +import net.sf.openrocket.gui.adaptors.CustomFocusTraversalPolicy; import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.startup.Application; @@ -28,6 +29,11 @@ public class SleeveConfig extends RingComponentConfig { tabbedPane.insertTab(trans.get("SleeveCfg.tab.General"), null, tab, trans.get("SleeveCfg.tab.Generalproperties"), 0); tabbedPane.setSelectedIndex(0); + + // Apply the custom focus travel policy to this panel + order.add(closeButton); // Make sure the close button is the last component + CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); + parent.setFocusTraversalPolicy(policy); } } \ No newline at end of file diff --git a/swing/src/net/sf/openrocket/gui/configdialog/StreamerConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/StreamerConfig.java index 0a87ade77..63b0c9161 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/StreamerConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/StreamerConfig.java @@ -275,9 +275,9 @@ public class StreamerConfig extends RecoveryDeviceConfig { tabbedPane.setSelectedIndex(0); // Apply the custom focus travel policy to this config dialog + order.add(closeButton); // Make sure the close button is the last component CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); parent.setFocusTraversalPolicy(policy); - } @@ -327,10 +327,6 @@ public class StreamerConfig extends RecoveryDeviceConfig { panel.add(button, "spanx, right"); order.add(button); - // Apply the custom focus travel policy to this panel - CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); - parent.setFocusTraversalPolicy(policy); - return panel; } } diff --git a/swing/src/net/sf/openrocket/gui/configdialog/ThicknessRingComponentConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/ThicknessRingComponentConfig.java index 5689953f5..b204435a3 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/ThicknessRingComponentConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/ThicknessRingComponentConfig.java @@ -5,6 +5,7 @@ import javax.swing.JDialog; import javax.swing.JPanel; import net.sf.openrocket.document.OpenRocketDocument; +import net.sf.openrocket.gui.adaptors.CustomFocusTraversalPolicy; import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.startup.Application; @@ -30,6 +31,11 @@ public class ThicknessRingComponentConfig extends RingComponentConfig { tabbedPane.insertTab(trans.get("ThicknessRingCompCfg.tab.General"), null, tab, trans.get("ThicknessRingCompCfg.tab.Generalprop"), 0); tabbedPane.setSelectedIndex(0); + + // Apply the custom focus travel policy to this panel + order.add(closeButton); // Make sure the close button is the last component + CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); + parent.setFocusTraversalPolicy(policy); } } \ No newline at end of file diff --git a/swing/src/net/sf/openrocket/gui/configdialog/TransitionConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/TransitionConfig.java index 813c4f4f1..3a6ccaaa3 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/TransitionConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/TransitionConfig.java @@ -202,9 +202,9 @@ public class TransitionConfig extends RocketComponentConfig { tabbedPane.setSelectedIndex(0); // Apply the custom focus travel policy to this config dialog + order.add(closeButton); // Make sure the close button is the last component CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); parent.setFocusTraversalPolicy(policy); - } diff --git a/swing/src/net/sf/openrocket/gui/configdialog/TrapezoidFinSetConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/TrapezoidFinSetConfig.java index f59f1f066..df54e7f2f 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/TrapezoidFinSetConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/TrapezoidFinSetConfig.java @@ -249,10 +249,11 @@ public class TrapezoidFinSetConfig extends FinSetConfig { trans.get("TrapezoidFinSetCfg.tab.Generalproperties"), 0); tabbedPane.setSelectedIndex(0); + addFinSetButtons(); + // Apply the custom focus travel policy to this config dialog + order.add(closeButton); // Make sure the close button is the last component CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); parent.setFocusTraversalPolicy(policy); - - addFinSetButtons(); } } diff --git a/swing/src/net/sf/openrocket/gui/configdialog/TubeFinSetConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/TubeFinSetConfig.java index 99dbb5b67..9ce17a3a9 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/TubeFinSetConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/TubeFinSetConfig.java @@ -179,9 +179,9 @@ public class TubeFinSetConfig extends RocketComponentConfig { tabbedPane.setSelectedIndex(0); // Apply the custom focus travel policy to this config dialog + order.add(closeButton); // Make sure the close button is the last component CustomFocusTraversalPolicy policy = new CustomFocusTraversalPolicy(order); parent.setFocusTraversalPolicy(policy); - } @Override From f1905e71ff8a0796b6a9391906ceb73fdf9fd56b Mon Sep 17 00:00:00 2001 From: SiboVG Date: Sun, 28 Aug 2022 15:08:29 +0200 Subject: [PATCH 31/31] Apply row traversal policy to component preset table --- .../preset/ComponentPresetChooserDialog.java | 4 + .../openrocket/gui/main/SimulationPanel.java | 78 +------------- .../utils/TableRowTraversalPolicy.java | 100 ++++++++++++++++++ 3 files changed, 106 insertions(+), 76 deletions(-) create mode 100644 swing/src/net/sf/openrocket/utils/TableRowTraversalPolicy.java diff --git a/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetChooserDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetChooserDialog.java index 36b42640b..a71535a32 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetChooserDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetChooserDialog.java @@ -40,6 +40,7 @@ import net.sf.openrocket.rocketcomponent.SymmetricComponent; import net.sf.openrocket.startup.Application; import net.sf.openrocket.util.Chars; import net.sf.openrocket.gui.widgets.SelectColorButton; +import net.sf.openrocket.utils.TableRowTraversalPolicy; /** * Dialog shown for selecting a preset component. @@ -157,6 +158,9 @@ public class ComponentPresetChooserDialog extends JDialog { tc.setMaxWidth(w); tc.setMinWidth(w); + // The normal left/right and tab/shift-tab key action traverses each cell/column of the table instead of going to the next row. + TableRowTraversalPolicy.setTableRowTraversalPolicy(componentSelectionTable); + panel.add(getFilterCheckboxes(tm, legacyColumnIndex), "wrap para"); JScrollPane scrollpane = new JScrollPane(); diff --git a/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java b/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java index bd6ad592e..5d8cd2e53 100644 --- a/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java @@ -10,7 +10,6 @@ import java.awt.datatransfer.StringSelection; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.event.ActionEvent; -import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; @@ -19,8 +18,6 @@ import java.util.Arrays; import java.util.Comparator; import javax.swing.AbstractAction; -import javax.swing.ActionMap; -import javax.swing.InputMap; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComponent; @@ -38,6 +35,7 @@ import javax.swing.event.ListSelectionListener; import javax.swing.table.DefaultTableCellRenderer; import net.sf.openrocket.gui.widgets.IconButton; +import net.sf.openrocket.utils.TableRowTraversalPolicy; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -178,16 +176,7 @@ public class SimulationPanel extends JPanel { pm.add(plotSimulationAction); // The normal left/right and tab/shift-tab key action traverses each cell/column of the table instead of going to the next row. - InputMap im = simulationTable.getInputMap(); - im.put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0), "Action.NextRowCycle"); - im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "Action.NextRow"); - im.put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, InputEvent.SHIFT_DOWN_MASK), "Action.PreviousRowCycle"); - im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "Action.PreviousRow"); - ActionMap am = simulationTable.getActionMap(); - am.put("Action.NextRow", new NextRowAction(simulationTable, false)); - am.put("Action.NextRowCycle", new NextRowAction(simulationTable, true)); - am.put("Action.PreviousRow", new PreviousRowAction(simulationTable, false)); - am.put("Action.PreviousRowCycle", new PreviousRowAction(simulationTable, true)); + TableRowTraversalPolicy.setTableRowTraversalPolicy(simulationTable); // Mouse listener to act on double-clicks simulationTable.addMouseListener(new MouseAdapter() { @@ -1029,67 +1018,4 @@ public class SimulationPanel extends JPanel { } } } - - private static class NextRowAction extends AbstractAction { - private final JTable table; - private final boolean cycle; - - /** - * Action for cycling through the next row of the table. - * @param table table for which the action is intended - * @param cycle whether to go back to the first row if the end is reached. - */ - public NextRowAction(JTable table, boolean cycle) { - this.table = table; - this.cycle = cycle; - } - - @Override - public void actionPerformed(ActionEvent e) { - int nextRow = table.getSelectedRow() + 1; - - if (nextRow >= table.getRowCount()) { - if (cycle) { - nextRow = 0; - } else { - return; - } - } - - table.getSelectionModel().setSelectionInterval(nextRow, nextRow); - table.getColumnModel().getSelectionModel().setSelectionInterval(0, 0); - } - - } - - private static class PreviousRowAction extends AbstractAction { - private final JTable table; - private final boolean cycle; - - /** - * Action for cycling through the previous row of the table. - * @param table table for which the action is intended - * @param cycle whether to go back to the last row if the current row is the first one of the table. - */ - public PreviousRowAction(JTable table, boolean cycle) { - this.table = table; - this.cycle = cycle; - } - - @Override - public void actionPerformed(ActionEvent e) { - int nextRow = table.getSelectedRow() - 1; - - if (nextRow < 0) { - if (cycle) { - nextRow = table.getRowCount() - 1; - } else { - return; - } - } - - table.getSelectionModel().setSelectionInterval(nextRow, nextRow); - table.getColumnModel().getSelectionModel().setSelectionInterval(0, 0); - } - } } diff --git a/swing/src/net/sf/openrocket/utils/TableRowTraversalPolicy.java b/swing/src/net/sf/openrocket/utils/TableRowTraversalPolicy.java new file mode 100644 index 000000000..77623f881 --- /dev/null +++ b/swing/src/net/sf/openrocket/utils/TableRowTraversalPolicy.java @@ -0,0 +1,100 @@ +package net.sf.openrocket.utils; + +import net.sf.openrocket.gui.main.SimulationPanel; + +import javax.swing.AbstractAction; +import javax.swing.ActionMap; +import javax.swing.InputMap; +import javax.swing.JTable; +import javax.swing.KeyStroke; +import java.awt.event.ActionEvent; +import java.awt.event.InputEvent; +import java.awt.event.KeyEvent; + +/** + * Helper class for setting a JTable to traverse rows rather than columns, when the tab/shift-tab, or right-arrow/left-arrow + * key is pressed. + * + * @author Sibo Van Gool + */ +public abstract class TableRowTraversalPolicy { + /** + * Applies the row traversal policy to the given table. + * @param table table to apply the row traversal policy to + */ + public static void setTableRowTraversalPolicy(final JTable table) { + InputMap im = table.getInputMap(); + im.put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0), "Action.NextRowCycle"); + im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "Action.NextRow"); + im.put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, InputEvent.SHIFT_DOWN_MASK), "Action.PreviousRowCycle"); + im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "Action.PreviousRow"); + ActionMap am = table.getActionMap(); + am.put("Action.NextRow", new NextRowAction(table, false)); + am.put("Action.NextRowCycle", new NextRowAction(table, true)); + am.put("Action.PreviousRow", new PreviousRowAction(table, false)); + am.put("Action.PreviousRowCycle", new PreviousRowAction(table, true)); + } + + private static class NextRowAction extends AbstractAction { + private final JTable table; + private final boolean cycle; + + /** + * Action for cycling through the next row of the table. + * @param table table for which the action is intended + * @param cycle whether to go back to the first row if the end is reached. + */ + public NextRowAction(JTable table, boolean cycle) { + this.table = table; + this.cycle = cycle; + } + + @Override + public void actionPerformed(ActionEvent e) { + int nextRow = table.getSelectedRow() + 1; + + if (nextRow >= table.getRowCount()) { + if (cycle) { + nextRow = 0; + } else { + return; + } + } + + table.getSelectionModel().setSelectionInterval(nextRow, nextRow); + table.getColumnModel().getSelectionModel().setSelectionInterval(0, 0); + } + + } + + private static class PreviousRowAction extends AbstractAction { + private final JTable table; + private final boolean cycle; + + /** + * Action for cycling through the previous row of the table. + * @param table table for which the action is intended + * @param cycle whether to go back to the last row if the current row is the first one of the table. + */ + public PreviousRowAction(JTable table, boolean cycle) { + this.table = table; + this.cycle = cycle; + } + + @Override + public void actionPerformed(ActionEvent e) { + int nextRow = table.getSelectedRow() - 1; + + if (nextRow < 0) { + if (cycle) { + nextRow = table.getRowCount() - 1; + } else { + return; + } + } + + table.getSelectionModel().setSelectionInterval(nextRow, nextRow); + table.getColumnModel().getSelectionModel().setSelectionInterval(0, 0); + } + } +}