/*
* Copyright 2010-2015 Institut Pasteur.
*
* This file is part of Icy.
*
* Icy 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.
*
* Icy 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 Icy. If not, see <http://www.gnu.org/licenses/>.
*/
package icy.script;
import icy.gui.frame.IcyFrame;
import icy.gui.util.WindowPositionSaver;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
/**
* @author fab
*/
public class ScriptEditor extends IcyFrame implements ActionListener
{
private JTextArea codeArea = new JTextArea("print('Hello, world!')", 15, 20);
private JTextArea messageArea = new JTextArea("message text", 5, 20);
private JPanel mainPanel = new JPanel();
JPanel codePanel = new JPanel();
JPanel codeActionPanel = new JPanel();
JPanel messagePanel = new JPanel();
JPanel messageActionPanel = new JPanel();
JButton runButton = new JButton("Run");
JMenuItem loadFileMenuItem = new JMenuItem("Load...");
JMenuItem saveFileMenuItem = new JMenuItem("Save...");
// we need to keep reference on it as the object only use weak reference
final WindowPositionSaver positionSaver;
public ScriptEditor()
{
super("Script Editor", true, true, true, true);
positionSaver = new WindowPositionSaver(this, "frame/scriptEditor", new Point(300, 300),
new Dimension(400, 300));
JMenuBar menuBar = new JMenuBar();
this.setJMenuBar(menuBar);
JMenu fileMenu = new JMenu("File");
fileMenu.add(loadFileMenuItem);
fileMenu.add(saveFileMenuItem);
loadFileMenuItem.addActionListener(this);
saveFileMenuItem.addActionListener(this);
menuBar.add(fileMenu);
this.setVisible(true);
codePanel.setLayout(new BoxLayout(codePanel, BoxLayout.PAGE_AXIS));
codeActionPanel.add(runButton);
runButton.addActionListener(this);
codeActionPanel.add(new JButton("Compile"));
codePanel.add(codeArea);
codePanel.add(codeActionPanel);
codeArea.setLineWrap(true);
messagePanel.setLayout(new BoxLayout(messagePanel, BoxLayout.PAGE_AXIS));
messageActionPanel.add(new JButton("Clear"));
messagePanel.add(messageArea);
messagePanel.add(messageActionPanel);
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.PAGE_AXIS));
mainPanel.add(codePanel);
mainPanel.add(messagePanel);
codeArea.setVisible(true);
codeArea.setTabSize(2);
messageArea.setLineWrap(true);
this.getContentPane().setLayout(new FlowLayout());
JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, codePanel, messagePanel);
this.getContentPane().setLayout(new GridLayout(1, 1));
this.getContentPane().add(splitPane);
this.pack();
addToDesktopPane();
}
public void actionPerformed(ActionEvent e)
{
if (e.getSource() == runButton)
{
messageArea.setText("");
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine jsEngine = mgr.getEngineByName("JavaScript");
if (jsEngine == null)
{
System.err.println("Unable to use ScriptEngine with JavaScript.");
return;
}
try
{
jsEngine.eval(codeArea.getText());
}
catch (ScriptException ex)
{
messageArea.append("Line : " + ex.getLineNumber() + "\n");
messageArea.append(ex.getMessage());
}
}
if (e.getSource() == loadFileMenuItem)
{
}
if (e.getSource() == saveFileMenuItem)
{
}
}
}