ptolemy.gui
Class JTextAreaExec

java.lang.Object
  extended by java.awt.Component
      extended by java.awt.Container
          extended by javax.swing.JComponent
              extended by javax.swing.JPanel
                  extended by ptolemy.gui.JTextAreaExec
All Implemented Interfaces:
java.awt.image.ImageObserver, java.awt.MenuContainer, java.io.Serializable, javax.accessibility.Accessible, ExecuteCommands

public class JTextAreaExec
extends javax.swing.JPanel
implements ExecuteCommands

Execute commands in a subprocess and display them in a JTextArea.

As an alternative to this class, see StringBufferExec, which writes to a StringBuffer, and StreamExec, which writes to stderr and stdout.

Loosely based on Example1.java from http://java.sun.com/products/jfc/tsc/articles/threads/threads2.html

See also http://developer.java.sun.com/developer/qow/archive/135/index.jsp and http://jw.itworld.com/javaworld/jw-12-2000/jw-1229-traps.html

Since:
Ptolemy II 2.0
Version:
$Id: JTextAreaExec.java 59634 2010-10-21 05:24:30Z cxh $
Author:
Christopher Hylands
See Also:
StringBufferExec, StreamExec, Serialized Form
Accepted Rating:
Red (cxh)
Proposed Rating:
Red (cxh)

Nested Class Summary
private static class JTextAreaExec._StreamReaderThread
           
 
Nested classes/interfaces inherited from class javax.swing.JPanel
javax.swing.JPanel.AccessibleJPanel
 
Nested classes/interfaces inherited from class javax.swing.JComponent
javax.swing.JComponent.AccessibleJComponent
 
Nested classes/interfaces inherited from class java.awt.Container
java.awt.Container.AccessibleAWTContainer
 
Nested classes/interfaces inherited from class java.awt.Component
java.awt.Component.AccessibleAWTComponent, java.awt.Component.BltBufferStrategy, java.awt.Component.FlipBufferStrategy
 
Field Summary
private  javax.swing.JButton _cancelButton
          The Cancel Button.
private  javax.swing.JButton _clearButton
          The Clear Button.
private  java.awt.event.ActionListener _clearListener
           
private  java.util.List _commands
          The list of command to be executed.
private  boolean _debug
           
private  java.lang.String[] _envp
          The environment, which is an array of Strings of the form name=value.
private  java.awt.event.ActionListener _interruptListener
           
private  javax.swing.JTextArea _jTextArea
          JTextArea to write the command and the output of the command.
private  java.lang.Process _process
          The Process that we are running.
private  javax.swing.JProgressBar _progressBar
          Progress bar where the length of the bar is the total number of commands being run.
private  javax.swing.JButton _startButton
          The Start Button.
private  java.awt.event.ActionListener _startListener
           
private  javax.swing.JLabel _statusBar
          Label at the bottom that provides feedback as to what is happening.
private  int _subprocessReturnCode
          The return code of the last Runtime.exec() command.
private  SwingWorker _worker
          SwingWorker that actually does the work.
private  java.io.File _workingDirectory
          The working directory of the subprocess.
 
Fields inherited from class javax.swing.JComponent
accessibleContext, listenerList, TOOL_TIP_TEXT_KEY, ui, UNDEFINED_CONDITION, WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, WHEN_FOCUSED, WHEN_IN_FOCUSED_WINDOW
 
Fields inherited from class java.awt.Component
BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT
 
Fields inherited from interface java.awt.image.ImageObserver
ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH
 
Constructor Summary
JTextAreaExec(java.lang.String name, boolean showButtons)
          Create the JTextArea, progress bar, status text field and optionally Start, Cancel and Clear buttons.
 
Method Summary
private  void _enableStartButton()
           
private  java.lang.Object _executeCommands()
           
private  void _updateProgressBar(int i)
           
 void appendJTextArea(java.lang.String text)
          Append the text message to the JTextArea and include a trailing newline.
 void appendToPath(java.lang.String directoryName)
          Append to the path of the subprocess.
 void cancel()
          Cancel any running commands.
 void clear()
          Clear the text area, status bar and progress bar.
 java.lang.String getenv(java.lang.String key)
          Get the value of the environment of the subprocess.
 int getLastSubprocessReturnCode()
          Return the return code of the last subprocess that was executed.
 javax.swing.JButton getStartButton()
          Return the Start button.
static void main(java.lang.String[] args)
          Main method used for testing.
 void setCommands(java.util.List commands)
          Set the list of commands.
 void setWorkingDirectory(java.io.File workingDirectory)
          Set the working directory of the subprocess.
 void start()
          Start running the commands.
 void stderr(java.lang.String text)
          Append the text message to stderr.
 void stdout(java.lang.String text)
          Append the text message to the output.
 void updateStatusBar(java.lang.String text)
          Update the status area with the text message.
 
Methods inherited from class javax.swing.JPanel
getAccessibleContext, getUI, getUIClassID, paramString, setUI, updateUI
 
Methods inherited from class javax.swing.JComponent
addAncestorListener, addNotify, addVetoableChangeListener, computeVisibleRect, contains, createToolTip, disable, enable, firePropertyChange, firePropertyChange, firePropertyChange, fireVetoableChange, getActionForKeyStroke, getActionMap, getAlignmentX, getAlignmentY, getAncestorListeners, getAutoscrolls, getBorder, getBounds, getClientProperty, getComponentGraphics, getComponentPopupMenu, getConditionForKeyStroke, getDebugGraphicsOptions, getDefaultLocale, getFontMetrics, getGraphics, getHeight, getInheritsPopupMenu, getInputMap, getInputMap, getInputVerifier, getInsets, getInsets, getListeners, getLocation, getMaximumSize, getMinimumSize, getNextFocusableComponent, getPopupLocation, getPreferredSize, getRegisteredKeyStrokes, getRootPane, getSize, getToolTipLocation, getToolTipText, getToolTipText, getTopLevelAncestor, getTransferHandler, getVerifyInputWhenFocusTarget, getVetoableChangeListeners, getVisibleRect, getWidth, getX, getY, grabFocus, isDoubleBuffered, isLightweightComponent, isManagingFocus, isOpaque, isOptimizedDrawingEnabled, isPaintingTile, isRequestFocusEnabled, isValidateRoot, paint, paintBorder, paintChildren, paintComponent, paintImmediately, paintImmediately, print, printAll, printBorder, printChildren, printComponent, processComponentKeyEvent, processKeyBinding, processKeyEvent, processMouseEvent, processMouseMotionEvent, putClientProperty, registerKeyboardAction, registerKeyboardAction, removeAncestorListener, removeNotify, removeVetoableChangeListener, repaint, repaint, requestDefaultFocus, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, resetKeyboardActions, reshape, revalidate, scrollRectToVisible, setActionMap, setAlignmentX, setAlignmentY, setAutoscrolls, setBackground, setBorder, setComponentPopupMenu, setDebugGraphicsOptions, setDefaultLocale, setDoubleBuffered, setEnabled, setFocusTraversalKeys, setFont, setForeground, setInheritsPopupMenu, setInputMap, setInputVerifier, setMaximumSize, setMinimumSize, setNextFocusableComponent, setOpaque, setPreferredSize, setRequestFocusEnabled, setToolTipText, setTransferHandler, setUI, setVerifyInputWhenFocusTarget, setVisible, unregisterKeyboardAction, update
 
Methods inherited from class java.awt.Container
add, add, add, add, add, addContainerListener, addImpl, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, processContainerEvent, processEvent, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusBackward, transferFocusDownCycle, validate, validateTree
 
Methods inherited from class java.awt.Component
action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPeer, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, hide, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusUpCycle
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

_clearListener

private java.awt.event.ActionListener _clearListener

_interruptListener

private java.awt.event.ActionListener _interruptListener

_startListener

private java.awt.event.ActionListener _startListener

_cancelButton

private javax.swing.JButton _cancelButton
The Cancel Button.


_clearButton

private javax.swing.JButton _clearButton
The Clear Button.


_commands

private java.util.List _commands
The list of command to be executed. Each entry in the list is a String. It might be better to have each element of the list be an String [] so that the shell can interpret each word in the command.


_debug

private final boolean _debug
See Also:
Constant Field Values

_envp

private java.lang.String[] _envp
The environment, which is an array of Strings of the form name=value. If this variable is null, then the environment of the calling process is used.


_jTextArea

private javax.swing.JTextArea _jTextArea
JTextArea to write the command and the output of the command.


_process

private java.lang.Process _process
The Process that we are running.


_subprocessReturnCode

private int _subprocessReturnCode
The return code of the last Runtime.exec() command.


_progressBar

private javax.swing.JProgressBar _progressBar
Progress bar where the length of the bar is the total number of commands being run.


_statusBar

private javax.swing.JLabel _statusBar
Label at the bottom that provides feedback as to what is happening.


_startButton

private javax.swing.JButton _startButton
The Start Button.


_worker

private SwingWorker _worker
SwingWorker that actually does the work.


_workingDirectory

private java.io.File _workingDirectory
The working directory of the subprocess. If null, then the subprocess is executed in the working directory of the current process.

Constructor Detail

JTextAreaExec

public JTextAreaExec(java.lang.String name,
                     boolean showButtons)
Create the JTextArea, progress bar, status text field and optionally Start, Cancel and Clear buttons.

Parameters:
name - A String containing the name to label the JTextArea with.
showButtons - True if the Start, Cancel and Clear buttons should be made visible.
Method Detail

appendJTextArea

public void appendJTextArea(java.lang.String text)
Append the text message to the JTextArea and include a trailing newline.

Parameters:
text - The text message to be appended.

appendToPath

public void appendToPath(java.lang.String directoryName)
Append to the path of the subprocess. If directoryName is already in the path, then it is not appended.

Specified by:
appendToPath in interface ExecuteCommands
Parameters:
directoryName - The name of the directory to append to the path.

cancel

public void cancel()
Cancel any running commands.

Specified by:
cancel in interface ExecuteCommands

clear

public void clear()
Clear the text area, status bar and progress bar.

Specified by:
clear in interface ExecuteCommands

getenv

public java.lang.String getenv(java.lang.String key)
Get the value of the environment of the subprocess.

Specified by:
getenv in interface ExecuteCommands
Parameters:
key - The environment variable.
Returns:
The value of the key. If the key is not set, then null is returned. If appendToPath() has been called, and the then the environment for the subprocess is checked, which might be different than the environment for the current process because appendToPath() was called. Note that that key is searche for in a case-insensitive mode.

getLastSubprocessReturnCode

public int getLastSubprocessReturnCode()
Return the return code of the last subprocess that was executed.

Specified by:
getLastSubprocessReturnCode in interface ExecuteCommands
Returns:
the return code of the last subprocess that was executed.

getStartButton

public javax.swing.JButton getStartButton()
Return the Start button. This method is used to get the Start button so we can set the focus to it.

Returns:
the Start button.

main

public static void main(java.lang.String[] args)
Main method used for testing. To run a simple test, use:
        java -classpath $PTII ptolemy.gui.JTextAreaExec
  

Parameters:
args - The command line arguments, currently ignored.

setCommands

public void setCommands(java.util.List commands)
Set the list of commands.

Specified by:
setCommands in interface ExecuteCommands
Parameters:
commands - a List of Strings, where each element is a command.

setWorkingDirectory

public void setWorkingDirectory(java.io.File workingDirectory)
Set the working directory of the subprocess.

Specified by:
setWorkingDirectory in interface ExecuteCommands
Parameters:
workingDirectory - The working directory of the subprocess. If this argument is null, then the subprocess is executed in the working directory of the current process.

start

public void start()
Start running the commands.

Specified by:
start in interface ExecuteCommands

stderr

public void stderr(java.lang.String text)
Append the text message to stderr. The output automatically gets a trailing newline appended.

Specified by:
stderr in interface ExecuteCommands
Parameters:
text - The text to append to standard error.

stdout

public void stdout(java.lang.String text)
Append the text message to the output. The output automatically gets a trailing newline appended.

Specified by:
stdout in interface ExecuteCommands
Parameters:
text - The text to append to standard out.

updateStatusBar

public void updateStatusBar(java.lang.String text)
Update the status area with the text message.

Specified by:
updateStatusBar in interface ExecuteCommands
Parameters:
text - The text with which the status area is updated.

_enableStartButton

private void _enableStartButton()

_executeCommands

private java.lang.Object _executeCommands()

_updateProgressBar

private void _updateProgressBar(int i)