package pipe.controllers;
import pipe.historyActions.transition.*;
import uk.ac.imperial.pipe.models.petrinet.Arc;
import uk.ac.imperial.pipe.models.petrinet.Place;
import uk.ac.imperial.pipe.models.petrinet.Rate;
import uk.ac.imperial.pipe.models.petrinet.Transition;
import javax.swing.event.UndoableEditListener;
import javax.swing.undo.UndoableEdit;
import java.util.Collection;
import java.util.LinkedList;
/**
* Transition controller responsible for editing the underlying transition Petri net component
*/
public class TransitionController extends AbstractConnectableController<Transition> {
/**
* Constructor
* @param component underlying transition model
* @param listener undo edit listener
*/
protected TransitionController(Transition component, UndoableEditListener listener) {
super(component, listener);
}
/**
*
* @return true if the transition is timed
*/
public boolean isTimed() {
return component.isTimed();
}
/**
*
* @param timedValue true if the transition is timed
*/
public void setTimed(boolean timedValue) {
component.setTimed(timedValue);
registerUndoableEdit(new TransitionTiming(component, timedValue));
}
/**
*
* @return true if the transition is an infinite sever
*/
public boolean isInfiniteServer() {
return component.isInfiniteServer();
}
/**
*
* @param infiniteValue true if the transition is an infinite server
*/
public void setInfiniteServer(boolean infiniteValue) {
component.setInfiniteServer(infiniteValue);
UndoableEdit infiniteAction = new TransitionInfiniteServer(component, infiniteValue);
registerUndoableEdit(infiniteAction);
}
/**
*
* @return transition name
*/
public String getName() {
return component.getId();
}
/**
*
* @return transition functional expression unevaluated
*/
public String getRateExpr() {
return component.getRateExpr();
}
/**
*
* @return priority of the transition
*/
public int getPriority() {
return component.getPriority();
}
/**
*
* @param priorityValue new priority of the transition
*/
public void setPriority(int priorityValue) {
int oldPriority = component.getPriority();
component.setPriority(priorityValue);
registerUndoableEdit(new TransitionPriority(component, oldPriority, priorityValue));
}
/**
*
* @return angle the transition should be displayed at
*/
public int getAngle() {
return component.getAngle();
}
/**
*
* @param angle new angle the transition should be displayed at
*/
public void setAngle(int angle) {
int oldAngle = component.getAngle();
component.setAngle(angle);
registerUndoableEdit(new TransitionRotation(component, oldAngle, angle));
}
/**
*
* This is not currently implemented
*
* @return the inbound arcs for the transition
*/
//TODO: GET CURRENT PETRINET
public Collection<Arc<Place, Transition>> inboundArcs() {
// return component.inboundArcs();
return new LinkedList<>();
}
/**
*
* @return the transitions rate
*/
public Rate getRate() {
return component.getRate();
}
/**
*
* @param rate new transition rate
*/
public void setRate(Rate rate) {
Rate oldRate = component.getRate();
component.setRate(rate);
registerUndoableEdit(new SetRateParameter(component, oldRate, rate));
}
}