package pipe.controllers; import pipe.historyActions.rateparameter.ChangeRateParameterRate; import uk.ac.imperial.pipe.exceptions.InvalidRateException; import uk.ac.imperial.pipe.models.petrinet.PetriNet; import uk.ac.imperial.pipe.models.petrinet.RateParameter; import uk.ac.imperial.pipe.parsers.FunctionalResults; import javax.swing.event.UndoableEditListener; import javax.swing.undo.UndoableEdit; /** * Controller for editing the underlying rate parameter Petri net component */ public class RateParameterController extends AbstractPetriNetComponentController<RateParameter> { /** * The Petri net the rate parameter resides in */ private final PetriNet petriNet; /** * Constructor * * @param component underlying rate parameter model * @param petriNet Petri net the rate parameter is housed in * @param listener undoable event listener */ protected RateParameterController(RateParameter component, PetriNet petriNet, UndoableEditListener listener) { super(component, listener); this.petriNet = petriNet; } /** * Tries to set the functional expression of the rate * * @param expression new functional expression * @throws InvalidRateException if the funcitonal expression is invalid because either it * contains a syntax error or it references a component that does not exist */ public void setRate(String expression) throws InvalidRateException { String oldRate = component.getExpression(); if (!oldRate.equals(expression)) { FunctionalResults<Double> results = petriNet.parseExpression(expression); if (results.hasErrors()) { throw new InvalidRateException(results.getErrorString("\n")); } component.setExpression(expression); UndoableEdit rateAction = new ChangeRateParameterRate(component, oldRate, expression); registerUndoableEdit(rateAction); } } }