Package weka.gui.scripting

Source Code of weka.gui.scripting.FileScriptingPanel$PrintAction

/*
*    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;
  }
}
TOP

Related Classes of weka.gui.scripting.FileScriptingPanel$PrintAction

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.