+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 "; }
+ };
+
+}