/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package de.cismet.tools.gui.jtextcompoonent.undoredo; import java.awt.Event; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.InputMap; import javax.swing.JComponent; import javax.swing.JTable; import javax.swing.KeyStroke; import javax.swing.table.TableModel; import javax.swing.text.Document; import javax.swing.text.JTextComponent; import javax.swing.undo.UndoManager; /** * A class that adds undo/redo support to JTextComponents. * * @author srichter * @version $Revision$, $Date$ */ public class UndoRedoSupport { //~ Constructors ----------------------------------------------------------- /** * Creates a new UndoRedoSupport object. */ private UndoRedoSupport() { } //~ Methods ---------------------------------------------------------------- /** * Add undo/redo support to the given JTextComponent. * * <p>Maps: Undo -> CONTROL-Z Redo -> CONTROL-Y</p> * * @param c the JTextComponent to decorate with undo/redo support. */ public static void decorate(final JTextComponent c) { final Document doc = c.getDocument(); final UndoManager undo = new UndoManager(); doc.addUndoableEditListener(undo); addCommandsToComponent(c, undo); } /** * DANGER: might not work with sorted Tables! * * @param c DOCUMENT ME! * * @deprecated DOCUMENT ME! */ @Deprecated public static void decorate(final JTable c) { final TableModel mo = c.getModel(); final UndoableTableModel umo = new UndoableTableModel(mo); final UndoManager undo = new UndoManager(); umo.addUndoableEditListener(undo); c.setModel(umo); addCommandsToComponent(c, undo); } /** * DOCUMENT ME! * * @param c DOCUMENT ME! * @param undo DOCUMENT ME! */ private static void addCommandsToComponent(final JComponent c, final UndoManager undo) { final InputMap im = c.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); final UndoAction ua = new UndoAction(undo); final KeyStroke controlZ = KeyStroke.getKeyStroke(KeyEvent.VK_Z, Event.CTRL_MASK); im.put(controlZ, "control z"); // NOI18N c.getActionMap().put("control z", ua); // NOI18N final RedoAction ra = new RedoAction(undo); final KeyStroke controlY = KeyStroke.getKeyStroke(KeyEvent.VK_Y, Event.CTRL_MASK); im.put(controlY, "control y"); // NOI18N c.getActionMap().put("control y", ra); // NOI18N } /** * DOCUMENT ME! * * @param c DOCUMENT ME! */ public static final void discardAllEdits(final JTextComponent c) { Action aa = c.getActionMap().get("control z"); // NOI18N if ((aa != null) && (aa instanceof ManagerAction)) { ((ManagerAction)aa).discardAllEdits(); } aa = c.getActionMap().get("control y"); // NOI18N if ((aa != null) && (aa instanceof ManagerAction)) { ((ManagerAction)aa).discardAllEdits(); } } //~ Inner Classes ---------------------------------------------------------- /** * DOCUMENT ME! * * @version $Revision$, $Date$ */ private abstract static class ManagerAction extends AbstractAction { //~ Instance fields ---------------------------------------------------- private final UndoManager undo; //~ Constructors ------------------------------------------------------- /** * Creates a new ManagerAction object. * * @param undo DOCUMENT ME! * * @throws IllegalArgumentException DOCUMENT ME! */ public ManagerAction(final UndoManager undo) { if (undo == null) { throw new IllegalArgumentException("UndoManager can not be null for ManagerAction construction!"); // NOI18N } this.undo = undo; } //~ Methods ------------------------------------------------------------ /** * DOCUMENT ME! */ public void discardAllEdits() { getUndo().discardAllEdits(); } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public UndoManager getUndo() { return undo; } } /** * An Undo action on the given UndoManager. * * @author srichter * @version $Revision$, $Date$ */ private static class UndoAction extends ManagerAction { //~ Constructors ------------------------------------------------------- /** * Creates a new UndoAction object. * * @param undo DOCUMENT ME! */ public UndoAction(final UndoManager undo) { super(undo); } //~ Methods ------------------------------------------------------------ /** * DOCUMENT ME! * * @param e DOCUMENT ME! */ @Override public void actionPerformed(final ActionEvent e) { if (getUndo().canUndo()) { getUndo().undo(); } } } /** * A Redo action on the given UndoManager. * * @author srichter * @version $Revision$, $Date$ */ private static class RedoAction extends ManagerAction { //~ Constructors ------------------------------------------------------- /** * Creates a new RedoAction object. * * @param undo DOCUMENT ME! */ public RedoAction(final UndoManager undo) { super(undo); } //~ Methods ------------------------------------------------------------ /** * DOCUMENT ME! * * @param e DOCUMENT ME! */ @Override public void actionPerformed(final ActionEvent e) { if (getUndo().canRedo()) { getUndo().redo(); } } } }