package gsingh.learnkirtan.ui.shabadeditor.tableeditor;
import java.awt.event.ActionEvent;
import java.util.LinkedList;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.undo.CannotRedoException;
import javax.swing.undo.CannotUndoException;
import javax.swing.undo.UndoManager;
import javax.swing.undo.UndoableEdit;
@SuppressWarnings("serial")
public class EditUndoManager extends UndoManager {
protected Action undoAction;
protected Action redoAction;
private List<UndoEventListener> listeners = new LinkedList<UndoEventListener>();
public interface UndoEventListener {
public void undoEventOccurred();
}
public EditUndoManager() {
this.undoAction = new UndoAction(this);
this.redoAction = new RedoAction(this);
synchronizeActions(); // to set initial names
}
public void addUndoEventListener(UndoEventListener l) {
listeners.add(l);
}
public Action getUndoAction() {
return undoAction;
}
public Action getRedoAction() {
return redoAction;
}
@Override
public boolean addEdit(UndoableEdit anEdit) {
try {
return super.addEdit(anEdit);
} finally {
synchronizeActions();
}
}
@Override
protected void undoTo(UndoableEdit edit) throws CannotUndoException {
try {
super.undoTo(edit);
} finally {
synchronizeActions();
}
}
@Override
protected void redoTo(UndoableEdit edit) throws CannotRedoException {
try {
super.redoTo(edit);
} finally {
synchronizeActions();
}
}
@Override
public void discardAllEdits() {
super.discardAllEdits();
synchronizeActions();
}
protected void synchronizeActions() {
undoAction.setEnabled(canUndo());
undoAction.putValue(Action.NAME, getUndoPresentationName());
redoAction.setEnabled(canRedo());
redoAction.putValue(Action.NAME, getRedoPresentationName());
for (UndoEventListener l : listeners) {
l.undoEventOccurred();
}
}
public class UndoAction extends AbstractAction {
protected final UndoManager manager;
public UndoAction(UndoManager manager) {
this.manager = manager;
}
public void actionPerformed(ActionEvent e) {
try {
manager.undo();
} catch (CannotUndoException ex) {
ex.printStackTrace();
}
}
}
public class RedoAction extends AbstractAction {
protected final UndoManager manager;
public RedoAction(UndoManager manager) {
this.manager = manager;
}
public void actionPerformed(ActionEvent e) {
try {
manager.redo();
} catch (CannotRedoException ex) {
ex.printStackTrace();
}
}
}
}