package org.korsakow.ide.ui.controller.action;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.undo.CannotRedoException;
import javax.swing.undo.CannotUndoException;
import javax.swing.undo.UndoableEdit;
import org.dsrg.soenea.uow.UoW;
import org.korsakow.ide.Application;
import org.korsakow.ide.DataRegistry;
import org.w3c.dom.Document;
public abstract class AbstractAction implements ActionListener, UndoableEdit {
private boolean alive = true;
private Document state;
private long version;
public void actionPerformed(ActionEvent e) {
try {
if (isUndoable()) {
saveState();
Application.getInstance().getUndoManager().addEdit(this);
} else
Application.getInstance().getUndoManager().discardAllEdits();
Application.getInstance().beginBusyOperation();
UoW.newCurrent(); // otherwise we might be working with stale data
performAction();
} finally {
Application.getInstance().endBusyOperation();
}
}
public abstract void performAction();
private void restoreState()
{
DataRegistry.setDocument(state);
// DataRegistry.setDocument(state);
}
private void saveState()
{
state = (Document) DataRegistry.getDomSession().getDocument().cloneNode(true);
version = DataRegistry.getDomSession().getVersion();
}
public boolean isUndoable()
{
return false;
}
public boolean isAlive()
{
return alive;
}
@Override // UndoableEdit
public boolean addEdit(UndoableEdit anEdit)
{
return false;
}
@Override // UndoableEdit
public boolean canRedo()
{
return isUndoable() && isAlive() && state != null && version==DataRegistry.getDomSession().getVersion()+1;
}
@Override // UndoableEdit
public boolean canUndo()
{
return isUndoable() && isAlive() && state != null && version==DataRegistry.getDomSession().getVersion()-1;
}
@Override // UndoableEdit
public void die()
{
alive = false;
}
@Override // UndoableEdit
public String getPresentationName()
{
return "";
}
@Override // UndoableEdit
public String getRedoPresentationName()
{
return "";
}
@Override // UndoableEdit
public String getUndoPresentationName()
{
return "";
}
@Override // UndoableEdit
public boolean isSignificant()
{
return true;
}
@Override // UndoableEdit
public void redo() throws CannotRedoException
{
if (!canRedo())
throw new CannotRedoException();
restoreState();
}
@Override // UndoableEdit
public boolean replaceEdit(UndoableEdit anEdit)
{
return false;
}
@Override // UndoableEdit
public void undo() throws CannotUndoException
{
if (!canUndo())
throw new CannotUndoException();
restoreState();
}
}