package fr.orsay.lri.varna.applications.templateEditor;
import java.awt.geom.Point2D;
import javax.swing.undo.AbstractUndoableEdit;
import javax.swing.undo.CannotRedoException;
import javax.swing.undo.CannotUndoException;
import javax.swing.undo.UndoableEdit;
public class TemplateEdits {
public static final double MAX_DISTANCE= 15.0;
public static class ElementAddTemplateEdit extends AbstractUndoableEdit
{
private GraphicalTemplateElement _h;
private TemplatePanel _p;
public ElementAddTemplateEdit(GraphicalTemplateElement h,TemplatePanel p)
{
_h = h;
_p = p;
}
public void undo() throws CannotUndoException {
_p.removeElement(_h);
_p.repaint();
}
public void redo() throws CannotRedoException {
_p.addElement(_h);
_p.repaint();
}
public boolean canUndo() { return true; }
public boolean canRedo() { return true; }
public String getPresentationName() { return "Graphical element added"; }
};
public static class ElementRemoveTemplateEdit extends AbstractUndoableEdit
{
private GraphicalTemplateElement _h;
private TemplatePanel _p;
public ElementRemoveTemplateEdit(GraphicalTemplateElement h,TemplatePanel p)
{
_h = h;
_p = p;
}
public void undo() throws CannotUndoException {
_p.addElement(_h);
_p.repaint();
}
public void redo() throws CannotRedoException {
_p.removeElement(_h);
_p.repaint();
}
public boolean canUndo() { return true; }
public boolean canRedo() { return true; }
public String getPresentationName() { return "Graphical element removed"; }
};
public static class ElementAttachTemplateEdit extends AbstractUndoableEdit
{
Connection _c;
private TemplatePanel _p;
public ElementAttachTemplateEdit(Connection c,
TemplatePanel p)
{
_c = c;
_p = p;
}
public void undo() throws CannotUndoException {
_p.removeConnection(_c);
_p.repaint();
}
public void redo() throws CannotRedoException {
_c = _p.addConnection(_c._h1,_c._edge1,_c._h2,_c._edge2);
_p.repaint();
}
public boolean canUndo() { return true; }
public boolean canRedo() { return true; }
public String getPresentationName() { return "Graphical elements attached"; }
};
public static class ElementDetachTemplateEdit extends AbstractUndoableEdit
{
Connection _c;
private TemplatePanel _p;
public ElementDetachTemplateEdit(Connection c,
TemplatePanel p)
{
_c = c;
_p = p;
}
public void undo() throws CannotUndoException {
_c = _p.addConnection(_c._h1,_c._edge1,_c._h2,_c._edge2);
_p.repaint();
}
public void redo() throws CannotRedoException {
_p.removeConnection(_c);
_p.repaint();
}
public boolean canUndo() { return true; }
public boolean canRedo() { return true; }
public String getPresentationName() { return "Graphical elements detached"; }
};
public static class ElementEdgeMoveTemplateEdit extends AbstractUndoableEdit
{
private GraphicalTemplateElement _ur;
GraphicalTemplateElement.RelativePosition _edge;
private double _ox;
private double _oy;
private double _nx;
private double _ny;
private TemplatePanel _p;
public ElementEdgeMoveTemplateEdit(GraphicalTemplateElement ur, GraphicalTemplateElement.RelativePosition edge, double nx, double ny, TemplatePanel p)
{
_ur = ur;
_edge = edge;
_ox = ur.getEdgePosition(edge).x;
_oy = ur.getEdgePosition(edge).y;
_nx = nx;
_ny = ny;
_p = p;
}
public void undo() throws CannotUndoException {
_ur.setEdgePosition(_edge,new Point2D.Double(_ox,_oy));
_p.repaint();
}
public void redo() throws CannotRedoException {
_ur.setEdgePosition(_edge,new Point2D.Double(_nx,_ny));
_p.repaint();
}
public boolean canUndo() { return true; }
public boolean canRedo() { return true; }
public String getPresentationName() { return "Edge moved "+_edge; }
public boolean addEdit(UndoableEdit anEdit)
{
if (anEdit instanceof ElementEdgeMoveTemplateEdit)
{
ElementEdgeMoveTemplateEdit e = (ElementEdgeMoveTemplateEdit) anEdit;
if (e._edge==_edge)
{
Point2D.Double po1 = new Point2D.Double(_ox,_oy);
Point2D.Double pn1 = new Point2D.Double(_nx,_ny);
Point2D.Double po2 = new Point2D.Double(e._ox,e._oy);
Point2D.Double pn2 = new Point2D.Double(e._nx,e._ny);
if ((_ur==e._ur)&&(pn1.equals(po2))&&(po1.distance(pn2)<MAX_DISTANCE))
{
_nx = e._nx;
_ny = e._ny;
return true;
}
}
}
return false;
}
};
public static class HelixFlipTemplateEdit extends AbstractUndoableEdit
{
private Helix _h;
private TemplatePanel _p;
public HelixFlipTemplateEdit(Helix h, TemplatePanel p)
{
_h = h;
_p = p;
}
public void undo() throws CannotUndoException {
_h.toggleFlipped();
_p.repaint();
}
public void redo() throws CannotRedoException {
_h.toggleFlipped();
_p.repaint();
}
public boolean canUndo() { return true; }
public boolean canRedo() { return true; }
public String getPresentationName() { return "Helix flipped "; }
};
}