package net.sf.openrocket.simulation.extension.impl; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.util.Set; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JOptionPane; import javax.swing.JPanel; import net.sf.openrocket.document.Simulation; import net.sf.openrocket.gui.adaptors.BooleanModel; import net.sf.openrocket.gui.components.StyledLabel; import net.sf.openrocket.gui.components.StyledLabel.Style; import net.sf.openrocket.plugin.Plugin; import net.sf.openrocket.simulation.extension.AbstractSwingSimulationExtensionConfigurator; import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea; import org.fife.ui.rsyntaxtextarea.SyntaxConstants; import org.fife.ui.rsyntaxtextarea.TokenMakerFactory; import org.fife.ui.rtextarea.RTextScrollPane; import com.google.inject.Inject; @Plugin public class ScriptingConfigurator extends AbstractSwingSimulationExtensionConfigurator<ScriptingExtension> { @Inject private ScriptingUtil util; private JComboBox languageSelector; private RSyntaxTextArea text; private JCheckBox trusted; private ScriptingExtension extension; private Simulation simulation; public ScriptingConfigurator() { super(ScriptingExtension.class); } @Override protected JComponent getConfigurationComponent(final ScriptingExtension extension, Simulation simulation, JPanel panel) { this.extension = extension; this.simulation = simulation; panel.add(new StyledLabel(trans.get("SimulationExtension.scripting.language.label"), Style.BOLD), "spanx, split"); String[] languages = util.getLanguages().toArray(new String[0]); languageSelector = new JComboBox(languages); languageSelector.setEditable(false); languageSelector.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { setLanguage((String) languageSelector.getSelectedItem()); } }); panel.add(languageSelector, "wrap para"); text = new RSyntaxTextArea(extension.getScript(), 20, 80); text.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVASCRIPT); text.setCodeFoldingEnabled(true); text.setLineWrap(true); text.setWrapStyleWord(true); text.setEditable(true); text.setCurrentLineHighlightColor(new Color(255, 255, 230)); text.addFocusListener(new FocusListener() { @Override public void focusGained(FocusEvent event) { } @Override public void focusLost(FocusEvent event) { String str = text.getText(); if (!extension.getScript().equals(str)) { extension.setScript(str); } } }); RTextScrollPane scroll = new RTextScrollPane(text); panel.add(scroll, "spanx, grow, wrap para"); BooleanModel enabled = new BooleanModel(extension, "Enabled"); JCheckBox check = new JCheckBox(enabled); check.setText(trans.get("SimulationExtension.scripting.text.enabled")); check.setToolTipText(trans.get("SimulationExtension.scripting.text.enabled.ttip")); panel.add(check, "spanx, wrap rel"); trusted = new JCheckBox(trans.get("SimulationExtension.scripting.text.trusted")); trusted.setSelected(util.isTrustedScript(extension.getLanguage(), extension.getScript())); panel.add(trusted, "spanx, split"); panel.add(new JPanel(), "growx"); JButton button = new JButton(trans.get("SimulationExtension.scripting.text.trusted.clear")); button.setToolTipText(trans.get("SimulationExtension.scripting.text.trusted.clear.ttip")); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { util.clearTrustedScripts(); JOptionPane.showMessageDialog(getDialog(), trans.get("SimulationExtension.scripting.text.trusted.cleared"), trans.get("SimulationExtension.scripting.text.trusted.cleared.title"), JOptionPane.INFORMATION_MESSAGE); } }); panel.add(button, "wrap rel"); StyledLabel label = new StyledLabel(trans.get("SimulationExtension.scripting.text.trusted.msg"), -1, Style.ITALIC); panel.add(label); setLanguage(util.getLanguage(extension.getLanguage())); return panel; } @Override protected void close() { util.setTrustedScript(extension.getLanguage(), extension.getScript(), trusted.isSelected()); } private void setLanguage(String language) { if (language == null) { language = ""; } if (!language.equals(languageSelector.getSelectedItem())) { languageSelector.setSelectedItem(language); } extension.setLanguage(language); text.setSyntaxEditingStyle(findSyntaxLanguage(language)); getDialog().setTitle(getTitle(extension, simulation)); } private String findSyntaxLanguage(String language) { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName(language); if (engine != null) { Set<String> supported = TokenMakerFactory.getDefaultInstance().keySet(); for (String type : engine.getFactory().getMimeTypes()) { if (supported.contains(type)) { return type; } for (String match : supported) { if (match.contains("/" + language.toLowerCase())) { return match; } } } } return SyntaxConstants.SYNTAX_STYLE_NONE; } }