/* * 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 2 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, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * FileScriptingPanel.java * Copyright (C) 2009 University of Waikato, Hamilton, New Zealand * Copyright (c) 1995 - 2008 Sun Microsystems, Inc. */ package weka.gui.scripting; import weka.core.Utils; import weka.gui.ComponentHelper; import weka.gui.DocumentPrinting; import weka.gui.ExtensionFileFilter; import weka.gui.PropertyDialog; import weka.gui.scripting.event.ScriptExecutionEvent; import weka.gui.scripting.event.ScriptExecutionListener; import weka.gui.scripting.event.TitleUpdatedEvent; import weka.gui.scripting.event.ScriptExecutionEvent.Type; import java.awt.BorderLayout; import java.awt.Dialog; import java.awt.Dimension; import java.awt.Font; import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.io.File; import java.util.HashMap; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.BorderFactory; import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JInternalFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextPane; import javax.swing.KeyStroke; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.event.UndoableEditEvent; import javax.swing.event.UndoableEditListener; import javax.swing.text.DefaultEditorKit; import javax.swing.text.Document; import javax.swing.text.JTextComponent; import javax.swing.undo.CannotRedoException; import javax.swing.undo.CannotUndoException; import javax.swing.undo.UndoManager; /** * Supports loading/saving of files. * * @author fracpete (fracpete at waikato dot ac dot nz) * @author Sun Microsystems Inc (see <a href="http://java.sun.com/docs/books/tutorial/uiswing/examples/components/TextComponentDemoProject/src/components/TextComponentDemo.java">TextComponentDemo.java</a>) * @version $Revision: 5144 $ */ public abstract class FileScriptingPanel extends ScriptingPanel implements ScriptExecutionListener { /** for serialization. */ private static final long serialVersionUID = 1583670545010241816L; /** * A slightly extended action class. * * @author fracpete (fracpete at waikato dot ac dot nz) * @version $Revision: 5144 $ */ public abstract class BasicAction extends AbstractAction { /** for serialization. */ private static final long serialVersionUID = 2821117985661550385L; /** * Constructor for setting up an action. * * @param name the name of the action (to be displayed in menu/button) * @param icon the icon name (no path required if in weka/gui/images), can be null * @param accel the accelerator command, e.g., "ctrl N", can be null * @param mnemonic the mnemonic character */ public BasicAction(String name, String icon, String accel, Character mnemonic) { super(name); if ((icon != null) && (icon.length() > 0)) putValue(Action.SMALL_ICON, ComponentHelper.getImageIcon(icon)); if ((accel != null) && (accel.length() > 0)) putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(accel)); if (mnemonic != null) putValue(Action.MNEMONIC_KEY, new Integer(mnemonic.charValue())); } } /** * The New action. * * @author fracpete (fracpete at waikato dot ac dot nz) * @version $Revision: 5144 $ */ protected class NewAction extends BasicAction { /** for serialization. */ private static final long serialVersionUID = -8665722554539726090L; /** * Initializes the action. */ public NewAction() { super("New", "new.gif", "ctrl N", 'N'); setEnabled(true); } /** * Fired when action got executed. * * @param e the event */ public void actionPerformed(ActionEvent e) { m_Script.empty(); notifyTitleUpdatedListeners(new TitleUpdatedEvent(FileScriptingPanel.this)); } } /** * The Open action. * * @author fracpete (fracpete at waikato dot ac dot nz) * @version $Revision: 5144 $ */ protected class OpenAction extends BasicAction { /** for serialization. */ private static final long serialVersionUID = -4496148485267789162L; /** * Initializes the action. */ public OpenAction() { super("Open...", "open.gif", "ctrl O", 'O'); setEnabled(true); } /** * Fired when action got executed. * * @param e the event */ public void actionPerformed(ActionEvent e) { boolean ok; int retVal; if (!checkModified()) return; retVal = m_FileChooser.showOpenDialog(FileScriptingPanel.this); if (retVal != JFileChooser.APPROVE_OPTION) return; ok = m_Script.open(m_FileChooser.getSelectedFile()); m_TextCode.setCaretPosition(0); if (!ok) JOptionPane.showMessageDialog( FileScriptingPanel.this, "Couldn't open file '" + m_FileChooser.getSelectedFile() + "'!"); notifyTitleUpdatedListeners(new TitleUpdatedEvent(FileScriptingPanel.this)); } } /** * The Save action. * * @author fracpete (fracpete at waikato dot ac dot nz) * @version $Revision: 5144 $ */ protected class SaveAction extends BasicAction { /** for serialization. */ private static final long serialVersionUID = -74651145892063975L; /** whether to bring up the save dialog all the time. */ protected boolean m_ShowDialog; /** * Initializes the action. * * @param name the name of the action * @param showDialog whether to always show the dialog */ public SaveAction(String name, boolean showDialog) { super(name, (showDialog ? "" : "save.gif"), (showDialog ? "ctrl shift S" : "ctrl S"), (showDialog ? 'a' : 'S')); m_ShowDialog = showDialog; setEnabled(true); } /** * Fired when action got executed. * * @param e the event */ public void actionPerformed(ActionEvent e) { boolean ok; int retVal; if (m_ShowDialog || (m_Script.getFilename() == null)) { retVal = m_FileChooser.showSaveDialog(FileScriptingPanel.this); if (retVal != JFileChooser.APPROVE_OPTION) return; ok = m_Script.saveAs(m_FileChooser.getSelectedFile()); } else { ok = m_Script.save(); } if (!ok) { if (m_Script.getFilename() != null) JOptionPane.showMessageDialog( FileScriptingPanel.this, "Failed to save file '" + m_FileChooser.getSelectedFile() + "'!"); else JOptionPane.showMessageDialog( FileScriptingPanel.this, "Failed to save file!"); } else { m_SaveAction.setEnabled(false); } notifyTitleUpdatedListeners(new TitleUpdatedEvent(FileScriptingPanel.this)); } } /** * The Print action. * * @author fracpete (fracpete at waikato dot ac dot nz) * @version $Revision: 5144 $ */ protected class PrintAction extends BasicAction { /** for serialization. */ private static final long serialVersionUID = -6246539539545724632L; /** * Initializes the action. */ public PrintAction() { super("Print...", "print.gif", "ctrl P", 'P'); setEnabled(true); } /** * Fired when action got executed. * * @param e the event */ public void actionPerformed(ActionEvent e) { JTextPane pane; DocumentPrinting doc; pane = newCodePane(); pane.setText(m_TextCode.getText()); doc = new DocumentPrinting(); doc.print(pane); } } /** * The Clear output action. * * @author fracpete (fracpete at waikato dot ac dot nz) * @version $Revision: 5144 $ */ protected class ClearOutputAction extends BasicAction { /** for serialization. */ private static final long serialVersionUID = 47986890456997211L; /** * Initializes the action. */ public ClearOutputAction() { super("Clear output", "", "F2", 'C'); setEnabled(true); } /** * Fired when action got executed. * * @param e the event */ public void actionPerformed(ActionEvent e) { m_TextOutput.setText(""); } } /** * The Exit action. Sends out a WindowEvent/WINDOW_CLOSED to all * WindowListener objects of a jframe. * * @author fracpete (fracpete at waikato dot ac dot nz) * @version $Revision: 5144 $ */ protected class ExitAction extends BasicAction { /** for serialization. */ private static final long serialVersionUID = -5884709836238884180L; /** * Initializes the action. */ public ExitAction() { super("Exit", "", "", 'x'); setEnabled(true); } /** * Fired when action got executed. * * @param e the event */ public void actionPerformed(ActionEvent e) { Dialog dialog; Frame frame; JFrame jframe; JInternalFrame jintframe; int i; WindowListener[] listeners; WindowEvent event; if (!checkModified()) return; if (PropertyDialog.getParentDialog(FileScriptingPanel.this) != null) { dialog = PropertyDialog.getParentDialog(FileScriptingPanel.this); dialog.setVisible(false); } else if (PropertyDialog.getParentFrame(FileScriptingPanel.this) != null) { jintframe = PropertyDialog.getParentInternalFrame(FileScriptingPanel.this); if (jintframe != null) { jintframe.doDefaultCloseAction(); } else { frame = PropertyDialog.getParentFrame(FileScriptingPanel.this); if (frame instanceof JFrame) { jframe = (JFrame) frame; if (jframe.getDefaultCloseOperation() == JFrame.HIDE_ON_CLOSE) jframe.setVisible(false); else if (jframe.getDefaultCloseOperation() == JFrame.DISPOSE_ON_CLOSE) jframe.dispose(); else if (jframe.getDefaultCloseOperation() == JFrame.EXIT_ON_CLOSE) System.exit(0); // notify listeners listeners = jframe.getWindowListeners(); event = new WindowEvent(jframe, WindowEvent.WINDOW_CLOSED); for (i = 0; i < listeners.length; i++) listeners[i].windowClosed(event); } else { frame.dispose(); } } } } } /** * The Undo action. * * @author Sun Microsystems Inc (see <a href="http://java.sun.com/docs/books/tutorial/uiswing/examples/components/TextComponentDemoProject/src/components/TextComponentDemo.java">TextComponentDemo.java</a>) * @version $Revision: 5144 $ */ protected class UndoAction extends BasicAction { /** for serialization. */ private static final long serialVersionUID = 4298096648424808522L; /** * Initializes the action. */ public UndoAction() { super("Undo", "undo.gif", "ctrl Z", 'U'); setEnabled(false); } /** * Fired when action got executed. * * @param e the event */ public void actionPerformed(ActionEvent e) { try { m_Undo.undo(); } catch (CannotUndoException ex) { System.out.println("Unable to undo: " + ex); ex.printStackTrace(); } updateUndoState(); m_RedoAction.updateRedoState(); } /** * Updates the redo state. */ protected void updateUndoState() { if (m_Undo.canUndo()) { setEnabled(true); putValue(Action.NAME, m_Undo.getUndoPresentationName()); } else { setEnabled(false); putValue(Action.NAME, "Undo"); } } } /** * The Redo action. * * @author Sun Microsystems Inc (see <a href="http://java.sun.com/docs/books/tutorial/uiswing/examples/components/TextComponentDemoProject/src/components/TextComponentDemo.java">TextComponentDemo.java</a>) * @version $Revision: 5144 $ */ protected class RedoAction extends BasicAction { /** for serialization. */ private static final long serialVersionUID = 4533966901523279350L; /** * Initializes the action. */ public RedoAction() { super("Redo", "redo.gif", "ctrl Y", 'R'); setEnabled(false); } /** * Fired when action got executed. * * @param e the event */ public void actionPerformed(ActionEvent e) { try { m_Undo.redo(); } catch (CannotRedoException ex) { System.out.println("Unable to redo: " + ex); ex.printStackTrace(); } updateRedoState(); m_UndoAction.updateUndoState(); } /** * Updates the redo state. */ protected void updateRedoState() { if (m_Undo.canRedo()) { setEnabled(true); putValue(Action.NAME, m_Undo.getRedoPresentationName()); } else { setEnabled(false); putValue(Action.NAME, "Redo"); } } } /** * The Commandline args action. * * @author fracpete (fracpete at waikato dot ac dot nz) * @version $Revision: 5144 $ */ protected class CommandlineArgsAction extends BasicAction { /** for serialization. */ private static final long serialVersionUID = -3183470039010826204L; /** * Initializes the action. */ public CommandlineArgsAction() { super("Arguments...", "properties.gif", "", 'g'); setEnabled(true); } /** * Fired when action got executed. * * @param e the event */ public void actionPerformed(ActionEvent e) { String retVal; retVal = JOptionPane.showInputDialog( FileScriptingPanel.this, "Please enter the command-line arguments", Utils.joinOptions(m_Args)); if (retVal == null) return; try { m_Args = Utils.splitOptions(retVal); } catch (Exception ex) { m_Args = new String[0]; ex.printStackTrace(); JOptionPane.showMessageDialog( FileScriptingPanel.this, "Error setting command-line arguments:\n" + ex, "Error", JOptionPane.ERROR_MESSAGE); } } } /** * The Start action. * * @author fracpete (fracpete at waikato dot ac dot nz) * @version $Revision: 5144 $ */ protected class StartAction extends BasicAction { /** for serialization. */ private static final long serialVersionUID = -7936456072955996220L; /** * Initializes the action. */ public StartAction() { super((m_Script.canExecuteScripts() ? "Start" : "Start (missing classes?)"), "run.gif", "ctrl R", 'S'); setEnabled(false); } /** * Fired when action got executed. * * @param e the event */ public void actionPerformed(ActionEvent e) { if (!checkModified()) return; if (m_Script.getFilename() == null) return; try { m_Script.start(m_Args); } catch (Exception ex) { ex.printStackTrace(); JOptionPane.showMessageDialog( FileScriptingPanel.this, "Error running script:\n" + ex, "Error", JOptionPane.ERROR_MESSAGE); } } } /** * The Stop action. * * @author fracpete (fracpete at waikato dot ac dot nz) * @version $Revision: 5144 $ */ protected class StopAction extends BasicAction { /** for serialization. */ private static final long serialVersionUID = 8764023289575718872L; /** * Initializes the action. */ public StopAction() { super("Stop", "stop.gif", "ctrl shift R", 'o'); setEnabled(false); } /** * Fired when action got executed. * * @param e the event */ public void actionPerformed(ActionEvent e) { try { m_Script.stop(); } catch (Exception ex) { // ignored } } } /** * The About action. * * @author fracpete (fracpete at waikato dot ac dot nz) * @version $Revision: 5144 $ */ protected class AboutAction extends BasicAction { /** for serialization. */ private static final long serialVersionUID = -6420463480569171227L; /** * Initializes the action. */ public AboutAction() { super("About...", "", "F1", 'A'); setEnabled(true); } /** * Fired when action got executed. * * @param e the event */ public void actionPerformed(ActionEvent e) { JDialog dialog; if (PropertyDialog.getParentDialog(FileScriptingPanel.this) != null) dialog = new JDialog(PropertyDialog.getParentDialog(FileScriptingPanel.this), getName()); else dialog = new JDialog(PropertyDialog.getParentFrame(FileScriptingPanel.this), getName()); dialog.setTitle((String) getValue(Action.NAME)); dialog.getContentPane().setLayout(new BorderLayout()); dialog.getContentPane().add(getAboutPanel()); dialog.pack(); dialog.setLocationRelativeTo(FileScriptingPanel.this); dialog.setVisible(true); } } /** * This listener class listens for edits that can be undone. * * @author Sun Microsystems Inc (see <a href="http://java.sun.com/docs/books/tutorial/uiswing/examples/components/TextComponentDemoProject/src/components/TextComponentDemo.java">TextComponentDemo.java</a>) * @version $Revision: 5144 $ */ protected class ScriptUndoableEditListener implements UndoableEditListener { /** * Gets called when an undoable event gets triggered. * * @param e the event */ public void undoableEditHappened(UndoableEditEvent e) { //Remember the edit and update the menus. m_Undo.addEdit(e.getEdit()); m_UndoAction.updateUndoState(); m_RedoAction.updateRedoState(); } } /** the directory with the scripting-specific images. */ public final static String IMAGES_DIR = "weka/gui/scripting/images"; /** for loading/saving file. */ protected JFileChooser m_FileChooser; /** the script. */ protected Script m_Script; /** the script area. */ protected JTextArea m_ScriptArea; /** the output area. */ protected JTextArea m_OutputArea; /** for informing the user. */ protected JLabel m_LabelInfo; /** for storing the actions under their name. */ protected HashMap<Object, Action> m_Actions; /** the new action. */ protected NewAction m_NewAction; /** the open action. */ protected OpenAction m_OpenAction; /** the Save action. */ protected SaveAction m_SaveAction; /** the Save as action. */ protected SaveAction m_SaveAsAction; /** the Print action. */ protected PrintAction m_PrintAction; /** the clear output action. */ protected ClearOutputAction m_ClearOutputAction; /** the exit action. */ protected ExitAction m_ExitAction; /** the undo action. */ protected UndoAction m_UndoAction; /** the redo action. */ protected RedoAction m_RedoAction; /** the cut action. */ protected Action m_CutAction; /** the copy action. */ protected Action m_CopyAction; /** the paste action. */ protected Action m_PasteAction; /** the start action. */ protected StartAction m_StartAction; /** the stop action. */ protected StopAction m_StopAction; /** the arguments action. */ protected CommandlineArgsAction m_ArgsAction; /** the about action. */ protected AboutAction m_AboutAction; /** the undo manager. */ protected UndoManager m_Undo; /** the text pane with the code. */ protected JTextPane m_TextCode; /** the text pane for the output. */ protected JTextPane m_TextOutput; /** the commandline arguments to use. */ protected String[] m_Args; /** * For initializing member variables. */ protected void initialize() { super.initialize(); m_FileChooser = new JFileChooser(); m_FileChooser.setAcceptAllFileFilterUsed(true); m_FileChooser.setMultiSelectionEnabled(false); m_Undo = new UndoManager(); m_Args = new String[0]; } /** * Sets up the GUI after initializing the members. */ protected void initGUI() { JPanel panel; super.initGUI(); setLayout(new BorderLayout(0, 5)); m_TextCode = newCodePane(); m_TextCode.setFont(new Font("monospaced", Font.PLAIN, 12)); m_TextCode.getDocument().addUndoableEditListener(new ScriptUndoableEditListener()); m_TextCode.getDocument().addDocumentListener(new DocumentListener() { public void changedUpdate(DocumentEvent e) { update(); } public void insertUpdate(DocumentEvent e) { update(); } public void removeUpdate(DocumentEvent e) { update(); } protected void update() { Document doc = m_TextCode.getDocument(); m_StartAction.setEnabled((doc.getLength() > 0) && m_Script.canExecuteScripts()); m_SaveAction.setEnabled(true); notifyTitleUpdatedListeners(new TitleUpdatedEvent(FileScriptingPanel.this)); } }); add(new JScrollPane(m_TextCode), BorderLayout.CENTER); panel = new JPanel(new BorderLayout(0, 5)); panel.setPreferredSize(new Dimension(50, 200)); add(panel, BorderLayout.SOUTH); m_TextOutput = new JTextPane(); panel.add(new JScrollPane(m_TextOutput), BorderLayout.CENTER); m_LabelInfo = new JLabel(" "); m_LabelInfo.setBorder(BorderFactory.createLoweredBevelBorder()); panel.add(m_LabelInfo, BorderLayout.SOUTH); } /** * Finishes up after initializing members and setting up the GUI. */ protected void initFinish() { ExtensionFileFilter[] filters; int i; super.initFinish(); m_Script = newScript(m_TextCode.getDocument()); m_Script.addScriptFinishedListener(this); filters = m_Script.getFilters(); for (i = filters.length - 1; i >= 0; i--) m_FileChooser.addChoosableFileFilter(filters[i]); m_Actions = createActionTable(m_TextCode); // file m_NewAction = new NewAction(); m_OpenAction = new OpenAction(); m_SaveAction = new SaveAction("Save", false); m_SaveAsAction = new SaveAction("Save As...", true); m_PrintAction = new PrintAction(); m_ClearOutputAction = new ClearOutputAction(); m_ExitAction = new ExitAction(); // edit m_UndoAction = new UndoAction(); m_RedoAction = new RedoAction(); m_CutAction = updateAction(m_Actions.get(DefaultEditorKit.cutAction), "Cut", "cut.gif", "ctrl X", 'C'); m_CopyAction = updateAction(m_Actions.get(DefaultEditorKit.copyAction), "Copy", "copy.gif", "ctrl C", 'o'); m_PasteAction = updateAction(m_Actions.get(DefaultEditorKit.pasteAction), "Paste", "paste.gif", "ctrl V", 'P'); // script m_StartAction = new StartAction(); m_StopAction = new StopAction(); m_ArgsAction = new CommandlineArgsAction(); // help m_AboutAction = new AboutAction(); } /** * Updates the action and returns it. * * @param action the action to update * @param name the name to be used as display, can be null * @param icon the icon to use (if located in weka/gui/images, not path required), can be null * @param accel the accelerator command to use (e.g., "ctrl N"), can be null * @param mnemonic the mnemonic character to use, can be null * @return the updated action */ protected Action updateAction(Action action, String name, String icon, String accel, Character mnemonic) { Action result; // did we already update that action for another component? if (action == null) { result = m_Actions.get(name); return result; } result = action; if ((name != null) && (name.length() > 0)) result.putValue(Action.NAME, name); if ((icon != null) && (icon.length() > 0)) result.putValue(Action.SMALL_ICON, ComponentHelper.getImageIcon(icon)); if ((accel != null) && (accel.length() > 0)) result.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(accel)); if (mnemonic != null) result.putValue(Action.MNEMONIC_KEY, new Integer(mnemonic.charValue())); return result; } /** * Creates a new JTextPane for the code. * * @return the text pane */ protected abstract JTextPane newCodePane(); /** * Returns an initialized script object. * * @param doc the document to use as basis * @return the initialized script */ protected abstract Script newScript(Document doc); /** * Gets sent when a script finishes execution. * * @param e the event */ public void scriptFinished(ScriptExecutionEvent e) { if (e.getType() == Type.FINISHED) showInfo("Script execution finished"); else if (e.getType() == Type.STOPPED) showInfo("Script execution stopped by user"); else if (e.getType() == Type.ERROR) showInfo("Script execution failed" + (e.hasAdditional() ? (": " + e.getAdditional()) : "")); if (e.getType() != Type.STARTED) { m_NewAction.setEnabled(true); m_OpenAction.setEnabled(true); m_SaveAction.setEnabled(true); m_SaveAsAction.setEnabled(true); m_CutAction.setEnabled(true); m_CopyAction.setEnabled(true); m_PasteAction.setEnabled(true); m_StartAction.setEnabled(true); m_StopAction.setEnabled(false); } else { m_NewAction.setEnabled(false); m_OpenAction.setEnabled(false); m_SaveAction.setEnabled(false); m_SaveAsAction.setEnabled(false); m_CutAction.setEnabled(false); m_CopyAction.setEnabled(false); m_PasteAction.setEnabled(false); m_StartAction.setEnabled(false); m_StopAction.setEnabled(true); } } /** * The following two methods allow us to find an * action provided by the editor kit by its name. * * @param comp the component to get the actions from * @return the relation */ protected HashMap<Object, Action> createActionTable(JTextComponent comp) { HashMap<Object, Action> result; int i; Action[] actions; Action action; result = new HashMap<Object, Action>(); actions = comp.getActions(); for (i = 0; i < actions.length; i++) { action = actions[i]; result.put(action.getValue(Action.NAME), action); } return result; } /** * Returns a panel to be displayed with the AboutAction. * * @return the panel with some information on the scripting panel */ protected abstract JPanel getAboutPanel(); /** * Returns the title (without the filename). * * @return the plain title */ public abstract String getPlainTitle(); /** * Returns the current title for the frame/dialog. * * @return the title */ public String getTitle() { String result; result = getPlainTitle(); if (m_Script.isModified()) result = "*" + result; if (m_Script.getFilename() != null) result += " [" + m_Script.getFilename() + "]"; return result; } /** * Returns the text area that is used for displaying output on stdout * and stderr. * * @return the JTextArea */ public JTextPane getOutput() { return m_TextOutput; } /** * Returns the menu bar to to be displayed in the frame. * * @return the menu bar, null if not applicable */ public JMenuBar getMenuBar() { JMenuBar result; JMenu menu; JMenuItem menuitem; result = new JMenuBar(); // File menu = new JMenu("File"); menu.setMnemonic('F'); result.add(menu); // File/New menuitem = new JMenuItem(m_NewAction); menu.add(menuitem); // File/Open menuitem = new JMenuItem(m_OpenAction); menu.addSeparator(); menu.add(menuitem); // File/Save menuitem = new JMenuItem(m_SaveAction); menu.add(menuitem); // File/SaveAs menuitem = new JMenuItem(m_SaveAsAction); menu.add(menuitem); // File/Print menuitem = new JMenuItem(m_PrintAction); menu.addSeparator(); menu.add(menuitem); // File/Clear output menuitem = new JMenuItem(m_ClearOutputAction); menu.addSeparator(); menu.add(menuitem); // File/Exit menuitem = new JMenuItem(m_ExitAction); menu.addSeparator(); menu.add(menuitem); // Edit menu = new JMenu("Edit"); menu.setMnemonic('E'); result.add(menu); // Edit/Undo menuitem = new JMenuItem(m_UndoAction); menu.add(menuitem); // Edit/Redo menuitem = new JMenuItem(m_RedoAction); menu.add(menuitem); // Edit/Cut menuitem = new JMenuItem(m_CutAction); menu.addSeparator(); menu.add(menuitem); // Edit/Copy menuitem = new JMenuItem(m_CopyAction); menu.add(menuitem); // Edit/Paste menuitem = new JMenuItem(m_PasteAction); menu.add(menuitem); // Script menu = new JMenu("Script"); menu.setMnemonic('S'); result.add(menu); // Script/Start menuitem = new JMenuItem(m_StartAction); menu.add(menuitem); // Script/Stop menuitem = new JMenuItem(m_StopAction); menu.add(menuitem); // Script/Arguments menuitem = new JMenuItem(m_ArgsAction); menu.add(menuitem); // Help menu = new JMenu("Help"); menu.setMnemonic('H'); result.add(menu); // Help/About menuitem = new JMenuItem(m_AboutAction); menu.add(menuitem); return result; } /** * Updates the info shown in the bottom panel. * * @param msg the message to display */ protected void showInfo(String msg) { if (msg == null) msg = " "; m_LabelInfo.setText(msg); } /** * Opens the specified file. * * @param file the file to open */ public void open(File file) { m_Script.open(file); } /** * Checks whether the script is modified and asks the user to save it or not. * If everything is fine and one can ignore the modified state, true is * returned. * * @return true if one can proceed */ protected boolean checkModified() { boolean result; int retVal; result = true; if (m_Script.isModified()) { retVal = JOptionPane.showConfirmDialog( FileScriptingPanel.this, "Script not saved - save it now?", "Confirm", JOptionPane.YES_NO_CANCEL_OPTION); if (retVal == JOptionPane.YES_OPTION) { if (m_Script.getFilename() != null) m_Script.save(); else m_SaveAsAction.actionPerformed(null); result = !m_Script.isModified(); } else if (retVal == JOptionPane.CANCEL_OPTION) { result = false; } } return result; } }