/* * Copyright (C) 2010 Brockmann Consult GmbH (info@brockmann-consult.de) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation; either version 3 of the License, or (at your option) * any later version. * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, see http://www.gnu.org/licenses/ */ package org.esa.snap.scripting.visat.actions; import org.esa.snap.scripting.visat.ScriptConsoleTopComponent; import org.esa.snap.tango.TangoIcons; import javax.script.ScriptEngineFactory; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JToolBar; import javax.swing.ListSelectionModel; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.util.List; public class NewAction extends ScriptConsoleAction { public static final String ID = "scriptConsole.new"; public NewAction(ScriptConsoleTopComponent scriptConsoleForm) { super(scriptConsoleForm, "New", ID, TangoIcons.actions_document_new(TangoIcons.Res.R16)); } public void actionPerformed(ActionEvent e) { ScriptEngineFactory[] scriptEngineFactories = getScriptManager().getEngineFactories(); final Item[] items = new Item[scriptEngineFactories.length]; for (int i = 0; i < scriptEngineFactories.length; i++) { ScriptEngineFactory scriptEngineFactory = scriptEngineFactories[i]; items[i] = new Item(scriptEngineFactory.getLanguageName(), scriptEngineFactory); } Item selectedItem = null; if (items.length != 0) { selectedItem = promptForEngine(items); } else { getScriptConsoleTopComponent().showErrorMessage("No scripting language available."); } if (selectedItem != null) { getScriptConsoleTopComponent().newScript(selectedItem.scriptEngineFactory); } } private Item promptForEngine(Item[] items) { final JList<Item> list = new JList<>(items); list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); list.setSelectedIndex(0); final JButton infoButton = new JButton(); infoButton.setToolTipText("Show script engine details"); infoButton.setIcon(TangoIcons.apps_help_browser(TangoIcons.Res.R16)); infoButton.addActionListener(e -> { final Item item = list.getSelectedValue(); showEngineDetails(list, item.scriptEngineFactory); }); final JToolBar toolBar = new JToolBar(); toolBar.setFloatable(false); toolBar.add(infoButton); JPanel titlePanel = new JPanel(new BorderLayout(16, 0)); titlePanel.add(new JLabel("Language:"), BorderLayout.WEST); titlePanel.add(toolBar, BorderLayout.EAST); JPanel contentPanel = new JPanel(new BorderLayout()); contentPanel.add(titlePanel, BorderLayout.NORTH); contentPanel.add(new JScrollPane(list), BorderLayout.CENTER); final int i = JOptionPane.showOptionDialog(getScriptConsoleTopComponent(), contentPanel, "Select Scripting Language", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE, null, null, null); if (i == JOptionPane.OK_OPTION) { return list.getSelectedValue(); } return null; } private void showEngineDetails(JComponent parent, ScriptEngineFactory scriptEngineFactory) { StringBuilder out = new StringBuilder(); out.append(String.format("Engine name: %s\n", scriptEngineFactory.getEngineName())); out.append(String.format("Engine version: %s\n", scriptEngineFactory.getEngineVersion())); out.append(String.format("Language name: %s\n", scriptEngineFactory.getLanguageName())); out.append(String.format("Language version: %s\n", scriptEngineFactory.getLanguageVersion())); out.append("File name extension(s):"); final List<String> extensions = scriptEngineFactory.getExtensions(); for (String extension : extensions) { out.append(" "); out.append(extension); } out.append("\n"); out.append("File content type(s):"); final List<String> mimeTypes = scriptEngineFactory.getMimeTypes(); for (String mimeType : mimeTypes) { out.append(" "); out.append(mimeType); } out.append("\n"); out.append("Engine factory name(s): "); final List<String> names = scriptEngineFactory.getNames(); for (String name : names) { out.append(" "); out.append(name); } out.append("\n"); JOptionPane.showMessageDialog(parent, out.toString(), "Script Engine Details", JOptionPane.INFORMATION_MESSAGE); } private static class Item { private final String languageName; private final ScriptEngineFactory scriptEngineFactory; public Item(String languageName, ScriptEngineFactory scriptEngineFactory) { this.languageName = languageName; this.scriptEngineFactory = scriptEngineFactory; } @Override public String toString() { return languageName; } } }