From c5b0271db77d31cbaa31aeae8a860d316e436570 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Mon, 14 Nov 2022 13:49:44 +0100 Subject: [PATCH 1/4] [#1817] Add extra error information on simulation listener instantiation --- core/resources/l10n/messages.properties | 2 ++ .../simulation/extension/impl/JavaCode.java | 11 ++++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/core/resources/l10n/messages.properties b/core/resources/l10n/messages.properties index 0c13b37f3..d1462bf8a 100644 --- a/core/resources/l10n/messages.properties +++ b/core/resources/l10n/messages.properties @@ -470,6 +470,8 @@ SimulationExtension.javacode.name = Java code SimulationExtension.javacode.name.none = none SimulationExtension.javacode.desc = Add a custom SimulationListener to the simulation SimulationExtension.javacode.className = Fully-qualified Java class name: +SimulationExtension.javacode.classnotfound = Could not find class +SimulationExtension.javacode.couldnotinstantiate = Could not instantiate class %s.
Does it have a zero-argument, or @Inject constructor? SimulationExtension.scripting.name = {language} script SimulationExtension.scripting.desc = Extend OpenRocket simulations by custom scripts. diff --git a/core/src/net/sf/openrocket/simulation/extension/impl/JavaCode.java b/core/src/net/sf/openrocket/simulation/extension/impl/JavaCode.java index 3602ec175..8a1acfbfa 100644 --- a/core/src/net/sf/openrocket/simulation/extension/impl/JavaCode.java +++ b/core/src/net/sf/openrocket/simulation/extension/impl/JavaCode.java @@ -1,5 +1,6 @@ package net.sf.openrocket.simulation.extension.impl; +import com.google.inject.ConfigurationException; import net.sf.openrocket.simulation.SimulationConditions; import net.sf.openrocket.simulation.exception.SimulationException; import net.sf.openrocket.simulation.extension.AbstractSimulationExtension; @@ -23,11 +24,15 @@ public class JavaCode extends AbstractSimulationExtension { if (!SimulationListener.class.isAssignableFrom(clazz)) { throw new SimulationException("Class " + className + " does not implement SimulationListener"); } - SimulationListener listener = (SimulationListener) injector.getInstance(clazz); - conditions.getSimulationListenerList().add(listener); + try { + SimulationListener listener = (SimulationListener) injector.getInstance(clazz); + conditions.getSimulationListenerList().add(listener); + } catch (ConfigurationException e) { + throw new SimulationException(String.format(trans.get("SimulationExtension.javacode.couldnotinstantiate"), className), e); + } } } catch (ClassNotFoundException e) { - throw new SimulationException("Could not find class " + className); + throw new SimulationException(trans.get("SimulationExtension.javacode.classnotfound") + " " + className); } } From 1021bbc8a9e58910813570ec3a188500e7b9ec0e Mon Sep 17 00:00:00 2001 From: SiboVG Date: Mon, 14 Nov 2022 13:56:56 +0100 Subject: [PATCH 2/4] [#1819] Update extensions after configurator instantiation --- .../sf/openrocket/gui/simulation/SimulationOptionsPanel.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/swing/src/net/sf/openrocket/gui/simulation/SimulationOptionsPanel.java b/swing/src/net/sf/openrocket/gui/simulation/SimulationOptionsPanel.java index 0ee297b2b..75673e6aa 100644 --- a/swing/src/net/sf/openrocket/gui/simulation/SimulationOptionsPanel.java +++ b/swing/src/net/sf/openrocket/gui/simulation/SimulationOptionsPanel.java @@ -234,6 +234,7 @@ class SimulationOptionsPanel extends JPanel { SwingSimulationExtensionConfigurator configurator = findConfigurator(e); if (configurator != null) { configurator.configure(e, simulation, SwingUtilities.windowForComponent(SimulationOptionsPanel.this)); + updateCurrentExtensions(); } } }); @@ -257,6 +258,7 @@ class SimulationOptionsPanel extends JPanel { SwingSimulationExtensionConfigurator configurator = findConfigurator(e); if (configurator != null) { configurator.configure(e, simulation, SwingUtilities.windowForComponent(SimulationOptionsPanel.this)); + updateCurrentExtensions(); } } }); From fa27fd0b9a3af007243dd9331e855d5f3abd6476 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Mon, 14 Nov 2022 13:57:56 +0100 Subject: [PATCH 3/4] Add warning text if simulation listener not recognized as class --- ...tSwingSimulationExtensionConfigurator.java | 22 ++++++--- .../extension/impl/JavaCodeConfigurator.java | 47 +++++++++++++++++-- 2 files changed, 57 insertions(+), 12 deletions(-) diff --git a/swing/src/net/sf/openrocket/simulation/extension/AbstractSwingSimulationExtensionConfigurator.java b/swing/src/net/sf/openrocket/simulation/extension/AbstractSwingSimulationExtensionConfigurator.java index 422c87ea6..b0a1992e7 100644 --- a/swing/src/net/sf/openrocket/simulation/extension/AbstractSwingSimulationExtensionConfigurator.java +++ b/swing/src/net/sf/openrocket/simulation/extension/AbstractSwingSimulationExtensionConfigurator.java @@ -4,6 +4,8 @@ import java.awt.Dialog.ModalityType; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; import javax.swing.JButton; import javax.swing.JComponent; @@ -50,17 +52,21 @@ public abstract class AbstractSwingSimulationExtensionConfigurator { - + private JavaCode extension; + private JTextField classNameField; + + private static final Translator trans = Application.getTranslator(); + public JavaCodeConfigurator() { super(JavaCode.class); } @Override protected JComponent getConfigurationComponent(final JavaCode extension, Simulation simulation, JPanel panel) { + this.extension = extension; panel.add(new JLabel(trans.get("SimulationExtension.javacode.desc")), "wrap para"); panel.add(new JLabel(trans.get("SimulationExtension.javacode.className")), "wrap rel"); - final JTextField textField = new JTextField(extension.getClassName()); - textField.getDocument().addDocumentListener(new DocumentListener() { + classNameField = new JTextField(extension.getClassName()); + panel.add(classNameField, "growx, wrap"); + StyledLabel errorMsg = new StyledLabel(); + errorMsg.setFontColor(Color.DARK_RED.toAWTColor()); + errorMsg.setVisible(false); + panel.add(errorMsg, "growx, wrap"); + + classNameField.getDocument().addDocumentListener(new DocumentListener() { public void changedUpdate(DocumentEvent e) { update(); } @@ -37,11 +52,33 @@ public class JavaCodeConfigurator extends AbstractSwingSimulationExtensionConfig } public void update() { - extension.setClassName(textField.getText()); + // Display error message if the class name is invalid + String text = classNameField.getText().trim(); + try { + Class.forName(text); + errorMsg.setVisible(false); + } catch (ClassNotFoundException e) { + // Don't display an error message for an empty field + if (text.length() == 0) { + errorMsg.setVisible(false); + return; + } + errorMsg.setText(trans.get("SimulationExtension.javacode.classnotfound")); + errorMsg.setVisible(true); + } } }); - panel.add(textField, "growx"); + return panel; } + + @Override + protected void close() { + if (this.extension != null && this.classNameField != null) { + this.extension.setClassName(this.classNameField.getText().trim()); + + } + super.close(); + } } From 1a32012aa16482180ba38b922ab2c763b2f3d676 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Tue, 15 Nov 2022 11:52:35 +0100 Subject: [PATCH 4/4] Make sure error message updates at start-up --- .../extension/impl/JavaCodeConfigurator.java | 39 ++++++++++++------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/swing/src/net/sf/openrocket/simulation/extension/impl/JavaCodeConfigurator.java b/swing/src/net/sf/openrocket/simulation/extension/impl/JavaCodeConfigurator.java index ee3e8ca71..ba9fe43b6 100644 --- a/swing/src/net/sf/openrocket/simulation/extension/impl/JavaCodeConfigurator.java +++ b/swing/src/net/sf/openrocket/simulation/extension/impl/JavaCodeConfigurator.java @@ -19,6 +19,7 @@ import net.sf.openrocket.util.Color; public class JavaCodeConfigurator extends AbstractSwingSimulationExtensionConfigurator { private JavaCode extension; private JTextField classNameField; + private StyledLabel errorMsg; private static final Translator trans = Application.getTranslator(); @@ -33,7 +34,7 @@ public class JavaCodeConfigurator extends AbstractSwingSimulationExtensionConfig panel.add(new JLabel(trans.get("SimulationExtension.javacode.className")), "wrap rel"); classNameField = new JTextField(extension.getClassName()); panel.add(classNameField, "growx, wrap"); - StyledLabel errorMsg = new StyledLabel(); + this.errorMsg = new StyledLabel(); errorMsg.setFontColor(Color.DARK_RED.toAWTColor()); errorMsg.setVisible(false); panel.add(errorMsg, "growx, wrap"); @@ -52,26 +53,34 @@ public class JavaCodeConfigurator extends AbstractSwingSimulationExtensionConfig } public void update() { - // Display error message if the class name is invalid - String text = classNameField.getText().trim(); - try { - Class.forName(text); - errorMsg.setVisible(false); - } catch (ClassNotFoundException e) { - // Don't display an error message for an empty field - if (text.length() == 0) { - errorMsg.setVisible(false); - return; - } - errorMsg.setText(trans.get("SimulationExtension.javacode.classnotfound")); - errorMsg.setVisible(true); - } + updateErrorMsg(); } }); + updateErrorMsg(); return panel; } + private void updateErrorMsg() { + if (this.errorMsg == null) { + return; + } + // Display error message if the class name is invalid + String text = classNameField.getText().trim(); + try { + Class.forName(text); + errorMsg.setVisible(false); + } catch (ClassNotFoundException e) { + // Don't display an error message for an empty field + if (text.length() == 0) { + errorMsg.setVisible(false); + return; + } + errorMsg.setText(trans.get("SimulationExtension.javacode.classnotfound")); + errorMsg.setVisible(true); + } + } + @Override protected void close() { if (this.extension != null && this.classNameField != null) {