import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JEditorPane;
import javax.swing.KeyStroke;
import javax.swing.event.UndoableEditEvent;
import javax.swing.event.UndoableEditListener;
import javax.swing.text.JTextComponent;
import javax.swing.undo.CannotRedoException;
import javax.swing.undo.CannotUndoException;
import javax.swing.undo.UndoManager; /**
* UndoWrapper is responsible for adding undo and redo support to text components.
* @author Antonio Vieiro (antonio@antonioshome.net), $Author: $
* @version $Revision: $
*/
public class UndoWrapper
implements UndoableEditListener
{
private UndoManager undoManager;
private UndoAction undoAction;
private RedoAction redoAction;
private JEditorPane textComponent;
/**
* Creates a new instance of UndoWrapper
*/
public UndoWrapper( JEditorPane aComponent )
{
textComponent = aComponent;
undoManager = new UndoManager();
undoAction = new UndoAction();
redoAction = new RedoAction();
textComponent.getDocument().addUndoableEditListener( this );
textComponent.getInputMap().put( (KeyStroke) undoAction.getValue(
Action.ACCELERATOR_KEY), "undo" );
textComponent.getInputMap().put( (KeyStroke) redoAction.getValue(
Action.ACCELERATOR_KEY), "redo" );
textComponent.getActionMap().put( "undo", undoAction );
textComponent.getActionMap().put( "redo", redoAction );
}
public void undoableEditHappened(UndoableEditEvent e)
{
undoManager.addEdit( e.getEdit() );
undoAction.updateUndoState();
redoAction.updateRedoState();
}
/**
* UndoAction is the Action responsible for handling the undo operation.
*/
class UndoAction
extends AbstractAction
{
public UndoAction()
{
super( "Cannot undo" ); // TODO: I18N
setEnabled( false );
putValue( Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("ctrl Z") );
}
public void actionPerformed(ActionEvent e)
{
try
{
undoManager.undo();
}
catch( CannotUndoException cue )
{
// TODO: Use logging?
cue.printStackTrace( System.err );
}
updateUndoState();
redoAction.updateRedoState();
}
void updateUndoState()
{
if ( undoManager.canUndo() )
{
setEnabled( true );
putValue( Action.NAME, "Undo" ); // TODO I18N
}
else
{
setEnabled( false );
putValue( Action.NAME, "Cannot undo" ); // TODO I18N
}
}
}
/**
* RedoAction is the Action responsible for handling the redo operation.
*/
class RedoAction
extends AbstractAction
{
public RedoAction()
{
super( "Cannot redo" ); // TODO I18N
setEnabled( false );
putValue( Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("ctrl Y") );
}
public void actionPerformed(ActionEvent e)
{
try
{
undoManager.redo();
}
catch( CannotRedoException cre )
{
// TODO: Use logging?
cre.printStackTrace( System.err );
}
updateRedoState();
undoAction.updateUndoState();
}
void updateRedoState()
{
if ( undoManager.canRedo() )
{
setEnabled( true );
putValue( Action.NAME, "Redo" ); // TODO I18N
}
else
{
setEnabled( false );
putValue( Action.NAME, "Cannot redo" ); // TODO I18N
}
}
}
UndoAction getUndoAction()
{
return undoAction;
}
RedoAction getRedoAction()
{
return redoAction;
}
}
|