package pipe.historyActions; import uk.ac.imperial.pipe.models.petrinet.*; import javax.swing.undo.AbstractUndoableEdit; import java.awt.Point; import java.util.Map; /** * Event to undo/redo the auto-layout of a Petri net */ public class LayoutPetriNetEvent extends AbstractUndoableEdit { /** * Petri net whose components have changed layout */ private final PetriNet petriNet; /** * Previous x, y locations of components */ private final Map<String, Point> previousPoints; public LayoutPetriNetEvent(PetriNet petriNet, Map<String, Point> previousPoints, Map<String, Point> newPoints) { this.petriNet = petriNet; this.previousPoints = previousPoints; this.newPoints = newPoints; } /** * New x, y locations of components */ private final Map<String, Point> newPoints; @Override public void undo() { apply(previousPoints); } @Override public void redo() { apply(newPoints); } /** * * @param points points for the components */ private void apply(Map<String, Point> points) { for (Place place : petriNet.getPlaces()) { Point point = points.get(place.getId()); applyPoint(place, point); } for (Transition transition : petriNet.getTransitions()) { Point point = points.get(transition.getId()); applyPoint(transition, point); } } private void applyPoint(PlaceablePetriNetComponent connectable, Point point) { connectable.setX((int)Math.round(point.getX())); connectable.setY((int)Math.round(point.getY())); } }