diff --git a/core/resources/l10n/messages.properties b/core/resources/l10n/messages.properties index d214901a7..7d81f82eb 100644 --- a/core/resources/l10n/messages.properties +++ b/core/resources/l10n/messages.properties @@ -715,7 +715,7 @@ compaddbuttons.Launchlug = Launch Lug compaddbuttons.RailButton = Rail Button compaddbuttons.InnerComponent = Inner Components compaddbuttons.Innertube = Inner Tube -compaddbuttons.Coupler = Coupler +compaddbuttons.Coupler = Tube Coupler compaddbuttons.Centeringring = Centering\nRing compaddbuttons.Bulkhead = Bulkhead compaddbuttons.Engineblock = Engine\nBlock diff --git a/swing/src/net/sf/openrocket/gui/SpinnerEditor.java b/swing/src/net/sf/openrocket/gui/SpinnerEditor.java index be4b79525..d02997e3d 100644 --- a/swing/src/net/sf/openrocket/gui/SpinnerEditor.java +++ b/swing/src/net/sf/openrocket/gui/SpinnerEditor.java @@ -1,8 +1,14 @@ package net.sf.openrocket.gui; import javax.swing.JSpinner; +import javax.swing.JTextField; +import javax.swing.SwingUtilities; import javax.swing.text.DefaultFormatter; import javax.swing.text.DefaultFormatterFactory; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; /** * Editable editor for a JSpinner. Simply uses JSpinner.DefaultEditor, which has been made @@ -22,6 +28,59 @@ public class SpinnerEditor extends JSpinner.DefaultEditor { DefaultFormatterFactory dff = (DefaultFormatterFactory) getTextField().getFormatterFactory(); DefaultFormatter formatter = (DefaultFormatter) dff.getDefaultFormatter(); formatter.setOverwriteMode(false); + + + // Add listeners to select all the text when the field is focussed + { + getTextField().addFocusListener(new FocusListener() { + @Override + public void focusGained(FocusEvent e) { + selectAllText(); + } + + @Override + public void focusLost(FocusEvent e) { + } + }); + + getTextField().addMouseListener(new MouseListener() { + private boolean isFocussed = false; // Checks whether the text field was focussed when it was clicked upon + + @Override + public void mouseClicked(MouseEvent e) { + // If the text field was focussed when it was clicked upon instead of e.g. tab-switching to gain focus, + // then the select all action from the focus listener is ignored (it is replaced by a cursor-click event). + // So if we detect such a focus change, then redo the select all action. + if (!isFocussed) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + JTextField tf = (JTextField) e.getSource(); + tf.selectAll(); + } + }); + } + } + + @Override + public void mousePressed(MouseEvent e) { + JTextField tf = (JTextField) e.getSource(); + isFocussed = tf.hasFocus(); + } + + @Override + public void mouseReleased(MouseEvent e) { + } + + @Override + public void mouseEntered(MouseEvent e) { + } + + @Override + public void mouseExited(MouseEvent e) { + } + }); + } } /** @@ -33,5 +92,17 @@ public class SpinnerEditor extends JSpinner.DefaultEditor { this(spinner); getTextField().setColumns(cols); } + + /** + * Highlights all the text in the text field. + */ + private void selectAllText() { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + getTextField().selectAll(); + } + }); + } } diff --git a/swing/src/net/sf/openrocket/gui/adaptors/PresetModel.java b/swing/src/net/sf/openrocket/gui/adaptors/PresetModel.java index 5fb2355d7..e62eac2d5 100644 --- a/swing/src/net/sf/openrocket/gui/adaptors/PresetModel.java +++ b/swing/src/net/sf/openrocket/gui/adaptors/PresetModel.java @@ -8,6 +8,7 @@ import javax.swing.ComboBoxModel; import javax.swing.SwingUtilities; import net.sf.openrocket.database.ComponentPresetDatabase; +import net.sf.openrocket.gui.configdialog.RocketComponentConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -90,6 +91,7 @@ public class PresetModel extends AbstractListModel implements ComboBoxModel, Com } else { document.addUndoPosition("Use Preset " + component.getComponentName()); component.loadPreset((ComponentPreset) item); + ((RocketComponentConfig) parent).setFocusElement(); } } diff --git a/swing/src/net/sf/openrocket/gui/configdialog/BodyTubeConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/BodyTubeConfig.java index 9ab43f596..39fbaa2ba 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/BodyTubeConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/BodyTubeConfig.java @@ -6,6 +6,8 @@ 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; @@ -23,6 +25,12 @@ 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; + @SuppressWarnings("serial") public class BodyTubeConfig extends RocketComponentConfig { @@ -43,6 +51,7 @@ public class BodyTubeConfig extends RocketComponentConfig { JSpinner spin = new JSpinner(length.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); + focusElement = spin; panel.add(spin, "growx"); panel.add(new UnitSelector(length), "growx"); diff --git a/swing/src/net/sf/openrocket/gui/configdialog/InnerTubeConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/InnerTubeConfig.java index e5595286f..3e3ddb3cb 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/InnerTubeConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/InnerTubeConfig.java @@ -64,7 +64,6 @@ public class InnerTubeConfig extends RocketComponentConfig { super(d, c, parent); //// General and General properties - JPanel rightPanel = new JPanel(new MigLayout()); JPanel panel = new JPanel(new MigLayout("gap rel unrel", "[][65lp::][30lp::][]", "")); DoubleModel m; @@ -86,7 +85,7 @@ public class InnerTubeConfig extends RocketComponentConfig { panel.add(spin, "growx"); panel.add(new UnitSelector(od), "growx"); - panel.add(new BasicSlider(od.getSliderModel(0, 0.04, 0.2)), "w 100lp, wrap"); + panel.add(new BasicSlider(od.getSliderModel(0, 0.04, 0.2)), "wmin 100lp, growx, wrap"); if (od.isAutomaticAvailable()) { JCheckBox check = new JCheckBox(od.getAutomaticAction()); @@ -106,7 +105,7 @@ public class InnerTubeConfig extends RocketComponentConfig { panel.add(spin, "growx"); panel.add(new UnitSelector(m), "growx"); - panel.add(new BasicSlider(m.getSliderModel(new DoubleModel(0), od)), "w 100lp, wrap"); + panel.add(new BasicSlider(m.getSliderModel(new DoubleModel(0), od)), "wmin 100lp, growx, wrap"); if (m.isAutomaticAvailable()) { JCheckBox check = new JCheckBox(m.getAutomaticAction()); @@ -127,7 +126,7 @@ public class InnerTubeConfig extends RocketComponentConfig { panel.add(spin, "growx"); panel.add(new UnitSelector(m), "growx"); - panel.add(new BasicSlider(m.getSliderModel(0, 0.01)), "w 100lp, wrap"); + panel.add(new BasicSlider(m.getSliderModel(0, 0.01)), "wmin 100lp, growx, wrap"); //// Inner tube length @@ -138,14 +137,15 @@ public class InnerTubeConfig extends RocketComponentConfig { spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); + focusElement = spin; panel.add(spin, "growx"); panel.add(new UnitSelector(m), "growx"); - panel.add(new BasicSlider(m.getSliderModel(0, 0.1, 1.0)), "w 100lp, wrap"); + panel.add(new BasicSlider(m.getSliderModel(0, 0.1, 1.0)), "wmin 100lp, growx, wrap"); //// Material panel.add(materialPanel(Material.Type.BULK), - "spanx 3, growx, wrap 15lp"); + "spanx 4, growx, wrap 15lp"); //// Right side of panel ---- @@ -174,7 +174,7 @@ public class InnerTubeConfig extends RocketComponentConfig { panel2.add(new BasicSlider(m.getSliderModel( new DoubleModel(component.getParent(), "Length", -1.0, UnitGroup.UNITS_NONE), new DoubleModel(component.getParent(), "Length"))), - "w 100lp, wrap"); + "wmin 100lp, growx, wrap"); diff --git a/swing/src/net/sf/openrocket/gui/configdialog/LaunchLugConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/LaunchLugConfig.java index eedab2730..8302641bb 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/LaunchLugConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/LaunchLugConfig.java @@ -45,6 +45,7 @@ public class LaunchLugConfig extends RocketComponentConfig { JSpinner spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); + focusElement = spin; panel.add(spin, "growx"); panel.add(new UnitSelector(m), "growx"); diff --git a/swing/src/net/sf/openrocket/gui/configdialog/MassComponentConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/MassComponentConfig.java index 5e7d185ec..23102e1f9 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/MassComponentConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/MassComponentConfig.java @@ -138,6 +138,7 @@ 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"); panel2.add(new UnitSelector(m), "growx"); diff --git a/swing/src/net/sf/openrocket/gui/configdialog/ParachuteConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/ParachuteConfig.java index f63abcc16..38fdffc3b 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/ParachuteConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/ParachuteConfig.java @@ -163,6 +163,7 @@ public class ParachuteConfig extends RecoveryDeviceConfig { m = new DoubleModel(component, "AxialOffset", UnitGroup.UNITS_LENGTH); spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); + focusElement = spin; panel.add(spin, "growx"); panel.add(new UnitSelector(m), "growx"); diff --git a/swing/src/net/sf/openrocket/gui/configdialog/RailButtonConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/RailButtonConfig.java index 3edfa1e89..b5e005a4a 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/RailButtonConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/RailButtonConfig.java @@ -92,6 +92,7 @@ public class RailButtonConfig extends RocketComponentConfig { DoubleModel offsetModel = new DoubleModel(component, "AxialOffset", UnitGroup.UNITS_LENGTH); JSpinner offsetSpinner = new JSpinner(offsetModel.getSpinnerModel()); offsetSpinner.setEditor(new SpinnerEditor(offsetSpinner)); + focusElement = offsetSpinner; panel.add(offsetSpinner, "growx"); panel.add(new UnitSelector(offsetModel), "growx"); panel.add(new BasicSlider(offsetModel.getSliderModel( diff --git a/swing/src/net/sf/openrocket/gui/configdialog/RingComponentConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/RingComponentConfig.java index f10ea3caa..27c2a4282 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/RingComponentConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/RingComponentConfig.java @@ -20,6 +20,7 @@ import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.material.Material; import net.sf.openrocket.rocketcomponent.EngineBlock; import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.rocketcomponent.ThicknessRingComponent; import net.sf.openrocket.rocketcomponent.position.AxialMethod; import net.sf.openrocket.startup.Application; import net.sf.openrocket.unit.UnitGroup; @@ -116,6 +117,9 @@ public class RingComponentConfig extends RocketComponentConfig { spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); + if (component instanceof ThicknessRingComponent) { + focusElement = spin; + } panel.add(spin, "growx"); panel.add(new UnitSelector(m), "growx"); @@ -139,6 +143,9 @@ public class RingComponentConfig extends RocketComponentConfig { m = new DoubleModel(component, "AxialOffset", UnitGroup.UNITS_LENGTH); spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); + if (!(component instanceof ThicknessRingComponent)) { + focusElement = spin; + } panel.add(spin, "growx"); panel.add(new UnitSelector(m), "growx"); diff --git a/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java index a3b1d9e5b..dd27f02c3 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java @@ -22,6 +22,7 @@ import javax.swing.JSpinner; import javax.swing.JTabbedPane; import javax.swing.JTextArea; import javax.swing.JTextField; +import javax.swing.SwingUtilities; import net.miginfocom.swing.MigLayout; import net.sf.openrocket.document.OpenRocketDocument; @@ -61,6 +62,7 @@ public class RocketComponentConfig extends JPanel { private JComboBox presetComboBox; private PresetModel presetModel; + protected Component focusElement = null; // Element that will be focused on after a preset is selected protected final JTextField componentNameField; protected JTextArea commentTextArea; @@ -702,6 +704,24 @@ public class RocketComponentConfig extends JPanel { } } } + + /** + * Requests focus for the focus element that should be active after a preset is selected. + */ + public void setFocusElement() { + if (focusElement != null) { + SwingUtilities.invokeLater(new Runnable() { + public void run() { + if (focusElement instanceof JSpinner) { + SpinnerEditor ed = (SpinnerEditor) ((JSpinner)focusElement).getEditor(); + ed.getTextField().requestFocusInWindow(); + } else { + focusElement.requestFocusInWindow(); + } + } + }); + } + } protected void register(Invalidatable model) { diff --git a/swing/src/net/sf/openrocket/gui/configdialog/ShockCordConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/ShockCordConfig.java index 624738a95..a7a6e8a78 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/ShockCordConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/ShockCordConfig.java @@ -80,6 +80,7 @@ public class ShockCordConfig 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"); panel2.add(new UnitSelector(m), "growx"); diff --git a/swing/src/net/sf/openrocket/gui/configdialog/StreamerConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/StreamerConfig.java index c4f6e2d65..504c6e712 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/StreamerConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/StreamerConfig.java @@ -149,6 +149,7 @@ public class StreamerConfig extends RecoveryDeviceConfig { m = new DoubleModel(component, "AxialOffset", UnitGroup.UNITS_LENGTH); spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); + focusElement = spin; panel.add(spin, "growx"); panel.add(new UnitSelector(m), "growx"); diff --git a/swing/src/net/sf/openrocket/gui/configdialog/TubeFinSetConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/TubeFinSetConfig.java index a005d11e2..e9de11352 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/TubeFinSetConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/TubeFinSetConfig.java @@ -54,6 +54,7 @@ public class TubeFinSetConfig extends RocketComponentConfig { spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); + focusElement = spin; panel.add(spin, "growx"); panel.add(new UnitSelector(m), "growx");