package pipe.actions.gui;
import pipe.controllers.PetriNetController;
import pipe.historyActions.component.AddPetriNetObject;
import uk.ac.imperial.pipe.models.petrinet.Connectable;
import uk.ac.imperial.pipe.models.petrinet.DiscretePlace;
import uk.ac.imperial.pipe.models.petrinet.PetriNet;
import uk.ac.imperial.pipe.models.petrinet.Place;
import java.awt.Point;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
/**
* Creates a new Place, adds it to a petri net and adds a history item
*/
public class PlaceAction extends CreateAction {
public PlaceAction(PipeApplicationModel applicationModel) {
super("Place", "Add a place", KeyEvent.VK_P, InputEvent.ALT_DOWN_MASK, applicationModel);
}
@Override
public void doAction(MouseEvent event, PetriNetController petriNetController) {
if (event.getClickCount() > 0) {
Point point = event.getPoint();
Place place = newPlace(point, petriNetController);
PetriNet net = petriNetController.getPetriNet();
registerUndoEvent(new AddPetriNetObject(place, net));
}
}
@Override
public void doConnectableAction(Connectable connectable, PetriNetController petriNetController) {
// Do nothing if clicked on existing connectable
}
private Place newPlace(Point point, PetriNetController petriNetController) {
String id = getNewPetriNetName(petriNetController);
Place place = new DiscretePlace(id, id);
place.setX(point.x);
place.setY(point.y);
PetriNet petriNet = petriNetController.getPetriNet();
petriNet.addPlace(place);
return place;
}
private String getNewPetriNetName(PetriNetController petriNetController) {
return petriNetController.getUniquePlaceName();
}
}