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.DiscreteTransition;
import uk.ac.imperial.pipe.models.petrinet.PetriNet;
import uk.ac.imperial.pipe.models.petrinet.Transition;
import java.awt.Point;
import java.awt.event.MouseEvent;
/**
* Abstract class to created timed/untimed transactions
*/
@SuppressWarnings("serial")
public abstract class TransitionAction extends CreateAction {
/**
* Constructor
* @param name of the action
* @param tooltip for the action
* @param key keyboard shortcut
* @param modifiers of the action
* @param applicationModel for PIPE
*/
public TransitionAction(String name, String tooltip, int key, int modifiers,
PipeApplicationModel applicationModel) {
super(name, tooltip, key, modifiers, applicationModel);
}
/**
* When the cnavas is clicked on a new transition is created
* @param event mouse event
* @param petriNetController controller for the petri net
*/
@Override
public void doAction(MouseEvent event, PetriNetController petriNetController) {
if (event.getClickCount() > 0) {
Point point = event.getPoint();
Transition transition = newTransition(point, petriNetController);
PetriNet net = petriNetController.getPetriNet();
registerUndoEvent(new AddPetriNetObject(transition, net));
}
}
/**
* Noop action
* @param connectable item clicked
* @param petriNetController controller for the petri net
*/
@Override
public void doConnectableAction(Connectable connectable, PetriNetController petriNetController) {
// Do nothing if clicked on existing connectable
}
/**
*
* @param point coordinate
* @param petriNetController controller
* @return new transition at the (x,y) of point
*/
private Transition newTransition(Point point, PetriNetController petriNetController) {
//TODO: MOVE THIS OUT TO CONTROLLER, ALSO NEED TO ADD TO PETRINET MODEL...
String id = getNetTransitionName(petriNetController);
Transition transition = new DiscreteTransition(id, id);
transition.setX(point.x);
transition.setY(point.y);
transition.setTimed(isTimed());
PetriNet petriNet = petriNetController.getPetriNet();
petriNet.addTransition(transition);
return transition;
}
/**
*
* @param petriNetController controller
* @return unique transition name
*/
private String getNetTransitionName(PetriNetController petriNetController) {
return petriNetController.getUniqueTransitionName();
}
/**
*
* @return true if timed
*/
protected abstract boolean isTimed();
}