package pipe.gui.widgets;
import pipe.controllers.PetriNetController;
import pipe.controllers.TransitionController;
import pipe.utilities.gui.GuiUtils;
import uk.ac.imperial.pipe.models.petrinet.*;
import uk.ac.imperial.pipe.parsers.EvalVisitor;
import uk.ac.imperial.pipe.parsers.FunctionalResults;
import uk.ac.imperial.pipe.parsers.PetriNetWeightParser;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Collection;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
/**
* Panel for editing a transitions properties
*/
public class TransitionEditorPanel extends javax.swing.JPanel {
/**
* Message to be displayed if the user wishes to define their own rate and not use
* a rate parameter
*/
private static final String NO_RATE_PARAMETER = "No Rate Parameter";
/**
* Controller for the transition being changes
*/
private final TransitionController transitionController;
/**
* Controller for the Petri net the transition belongs to
*/
private final PetriNetController netController;
/**
* Owener of the panel
*/
private final JRootPane rootPane;
/**
* Radio button for immediate, in a group with the timed radio button
*/
private final JRadioButton immediateRadioButton = new JRadioButton();
/**
* Radio button for chosing a timed transition, in a group with the immediate radio button
*/
private final JRadioButton timedRadioButton = new JRadioButton();
/**
* Radio button for single server semantics, in a group with infinite server semantics
*/
private final JRadioButton singleServerRadioButton = new JRadioButton();
/**
* Radio button for immediate, in a group with the infinite server radio button
*/
private final JRadioButton infiniteServerRadioButton = new JRadioButton();
/**
* Id of the transition
*/
private final JTextField nameTextField = new JTextField();
/**
* OK butotn for setting changes
*/
private final JButton okButton = new JButton();
/**
* Priority panel holds priority details
*/
private final JPanel priorityPanel = new JPanel();
/**
* Priority message next to priority slider
*/
private final JLabel priorityLabel = new JLabel();
/**
* Slider to set the transitions priority
*/
private final JSlider prioritySlider = new JSlider();
/**
* Text field for the priority chosen
*/
private final JTextField priorityTextField = new JTextField();
/**
* Rate parameter combo box for selecting current rate parameters
*/
private final JComboBox<String> rateComboBox = new JComboBox<>();
/**
* Rate/Weight label. Displays what the weightRateTextField refers to
* It will be a weight if it is an immediate transition, and a rate for a timed transition
*/
private final JLabel weightRateLabel = new JLabel();
/**
* Transitions weight/rate value, can either be user defined or the value of a rate parameter, or a user defined rate
* It will be a weight if it is an immediate transition, and a rate for a timed transition
*/
private final JTextField weightRateTextField = new JTextField();
private final JComboBox<String> rotationComboBox = new JComboBox<>();
private final ButtonGroup semanticsButtonGroup = new ButtonGroup();
private final JLabel serverLabel = new JLabel();
private final JPanel serverPanel = new JPanel();
/**
* Contains the index of the rate in the rateComboBox to the RateParameter it maps
*/
private final Map<Integer, RateParameter> indexToRates = new HashMap<>();
/**
* Creates new form Transition editor
*
* @param rootPane parent
* @param transitionController controller for the transition to edit
* @param netController petriNetController that transitionController belongs to.
*/
public TransitionEditorPanel(JRootPane rootPane, TransitionController transitionController,
PetriNetController netController) {
this.transitionController = transitionController;
this.netController = netController;
this.rootPane = rootPane;
initComponents();
this.serverLabel.setVisible(true);
this.serverPanel.setVisible(true);
this.rootPane.setDefaultButton(okButton);
if (transitionController.isTimed()) {
setUpTimedTransition();
} else {
setUpImmediateTransition();
}
if (transitionController.isInfiniteServer()) {
infiniteServerRadioButton.setSelected(true);
} else {
singleServerRadioButton.setSelected(true);
}
initRates();
setRateBasedOnTransition();
}
/**
* Initialises the rate parameter combo dropdown
* The first field is No rate parameter and means the user can input their
* own value
* <p/>
* It then ses the rate to the transitions existing weight
*/
private void initRates() {
Collection<RateParameter> rateParameters = netController.getRateParameters();
String[] ids = new String[rateParameters.size() + 1];
ids[0] = NO_RATE_PARAMETER;
int index = 1;
for (RateParameter rateParameter : rateParameters) {
ids[index] = rateParameter.toString();
indexToRates.put(index, rateParameter);
index++;
}
rateComboBox.setModel(new DefaultComboBoxModel<>(ids));
if (transitionController.isTimed()) {
rateComboBox.setEnabled(true);
}
}
/**
* Initialises the rate field based on the transitions value
* It will find the rate parameter and select it
*/
private void setRateBasedOnTransition() {
Rate rate = transitionController.getRate();
if (rate.getRateType().equals(RateType.RATE_PARAMETER)) {
PetriNetComponent rateParameter = (RateParameter) rate;
int index = getIndexOfRate(rateParameter.getId());
rateComboBox.setSelectedIndex(index);
if (index > 0) {
weightRateTextField.setEnabled(false);
}
}
}
/**
* Looks through the rateComboBox to find the index of the rateParameterId
*
* @param rateParameterId rate parameter id to search for in the rateComboBox
* @return index of rateParameterId in the rateComboBox
*/
private int getIndexOfRate(String rateParameterId) {
for (Map.Entry<Integer, RateParameter> entry : indexToRates.entrySet()) {
String id = entry.getValue().getId();
if (id.equals(rateParameterId)) {
return entry.getKey();
}
}
throw new RuntimeException("No such element " + rateParameterId + " in petri net rate parameters");
}
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
ButtonGroup timingButtonGroup = new ButtonGroup();
JPanel transitionEditorPanel = new JPanel();
JLabel nameLabel = new JLabel();
JPanel timingPanel = new JPanel();
JLabel rotationLabel = new JLabel();
JLabel timingLabel = new JLabel();
JPanel buttonPanel = new JPanel();
JButton cancelButton = new JButton();
setLayout(new java.awt.GridBagLayout());
transitionEditorPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Transition Editor"));
transitionEditorPanel.setLayout(new java.awt.GridBagLayout());
nameLabel.setText("Name:");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3);
transitionEditorPanel.add(nameLabel, gridBagConstraints);
nameTextField.setText(transitionController.getName());
nameTextField.addFocusListener(new java.awt.event.FocusAdapter() {
@Override
public void focusGained(java.awt.event.FocusEvent evt) {
nameTextFieldFocusGained();
}
@Override
public void focusLost(java.awt.event.FocusEvent evt) {
nameTextFieldFocusLost();
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridwidth = 3;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3);
transitionEditorPanel.add(nameTextField, gridBagConstraints);
weightRateLabel.setText("Constant Rate:");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3);
transitionEditorPanel.add(weightRateLabel, gridBagConstraints);
priorityLabel.setText("Priority:");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 5;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3);
transitionEditorPanel.add(priorityLabel, gridBagConstraints);
rateComboBox.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent evt) {
rateComboBoxActionPerformed();
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 3;
gridBagConstraints.gridy = 1;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3);
transitionEditorPanel.add(rateComboBox, gridBagConstraints);
timingPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(""));
timingPanel.setLayout(new java.awt.GridLayout(1, 0));
timingButtonGroup.add(timedRadioButton);
timedRadioButton.setText("Timed");
timedRadioButton.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
timedRadioButton.setMargin(new java.awt.Insets(0, 0, 0, 0));
timedRadioButton.setMaximumSize(new java.awt.Dimension(90, 15));
timedRadioButton.setMinimumSize(new java.awt.Dimension(90, 15));
timedRadioButton.setPreferredSize(new java.awt.Dimension(90, 15));
timedRadioButton.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent evt) {
timedRadioButtonActionPerformed(evt);
}
});
timingPanel.add(timedRadioButton);
timingButtonGroup.add(immediateRadioButton);
immediateRadioButton.setText("Immediate");
immediateRadioButton.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
immediateRadioButton.setMargin(new java.awt.Insets(0, 0, 0, 0));
immediateRadioButton.setMaximumSize(new java.awt.Dimension(90, 15));
immediateRadioButton.setMinimumSize(new java.awt.Dimension(90, 15));
immediateRadioButton.setPreferredSize(new java.awt.Dimension(90, 15));
immediateRadioButton.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent evt) {
immediateRadioButtonActionPerformed(evt);
}
});
timingPanel.add(immediateRadioButton);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 4;
gridBagConstraints.gridwidth = 3;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3);
transitionEditorPanel.add(timingPanel, gridBagConstraints);
serverPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(""));
serverPanel.setLayout(new java.awt.GridLayout(1, 0));
semanticsButtonGroup.add(singleServerRadioButton);
singleServerRadioButton.setText("Single");
singleServerRadioButton.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
singleServerRadioButton.setMargin(new java.awt.Insets(0, 0, 0, 0));
singleServerRadioButton.setMaximumSize(new java.awt.Dimension(90, 15));
singleServerRadioButton.setMinimumSize(new java.awt.Dimension(90, 15));
singleServerRadioButton.setPreferredSize(new java.awt.Dimension(90, 15));
singleServerRadioButton.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent evt) {
serverRadioButtonActionPerformed(evt);
}
});
serverPanel.add(singleServerRadioButton);
semanticsButtonGroup.add(infiniteServerRadioButton);
infiniteServerRadioButton.setSelected(true);
infiniteServerRadioButton.setText("Infinite");
infiniteServerRadioButton.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
infiniteServerRadioButton.setMargin(new java.awt.Insets(0, 0, 0, 0));
infiniteServerRadioButton.setMaximumSize(new java.awt.Dimension(90, 15));
infiniteServerRadioButton.setMinimumSize(new java.awt.Dimension(90, 15));
infiniteServerRadioButton.setPreferredSize(new java.awt.Dimension(90, 15));
infiniteServerRadioButton.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent evt) {
serverRadioButtonActionPerformed(evt);
}
});
serverPanel.add(infiniteServerRadioButton);
serverLabel.setText("Server:");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 3;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3);
transitionEditorPanel.add(serverLabel, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 3;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3);
transitionEditorPanel.add(serverPanel, gridBagConstraints);
rotationLabel.setText("Rotation:");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 6;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH;
gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3);
transitionEditorPanel.add(rotationLabel, gridBagConstraints);
rotationComboBox.setModel(
new javax.swing.DefaultComboBoxModel<>(new String[]{"", "+45\u00B0", "+90\u00B0", "-45\u00B0", "0\u00B0"}));
rotationComboBox.setMaximumSize(new java.awt.Dimension(70, 20));
rotationComboBox.setMinimumSize(new java.awt.Dimension(70, 20));
rotationComboBox.setPreferredSize(new java.awt.Dimension(70, 20));
setSelectedRotation();
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 6;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3);
transitionEditorPanel.add(rotationComboBox, gridBagConstraints);
weightRateTextField.setMaximumSize(new java.awt.Dimension(40, 19));
weightRateTextField.setMinimumSize(new java.awt.Dimension(40, 19));
weightRateTextField.setPreferredSize(new java.awt.Dimension(40, 19));
weightRateTextField.addFocusListener(new java.awt.event.FocusAdapter() {
@Override
public void focusGained(java.awt.event.FocusEvent evt) {
rateTextFieldFocusGained();
}
@Override
public void focusLost(java.awt.event.FocusEvent evt) {
rateTextFieldFocusLost();
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3);
transitionEditorPanel.add(weightRateTextField, gridBagConstraints);
timingLabel.setText("Timing:");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 4;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST;
gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3);
transitionEditorPanel.add(timingLabel, gridBagConstraints);
prioritySlider.setMajorTickSpacing(50);
prioritySlider.setMaximum(127);
prioritySlider.setMinimum(1);
prioritySlider.setMinorTickSpacing(1);
prioritySlider.setSnapToTicks(true);
prioritySlider.setToolTipText("1: lowest priority; 127: highest priority");
prioritySlider.setValue(transitionController.getPriority());
prioritySlider.addChangeListener(new javax.swing.event.ChangeListener() {
@Override
public void stateChanged(javax.swing.event.ChangeEvent evt) {
prioritySliderStateChanged(evt);
}
});
priorityPanel.add(prioritySlider);
//prova
priorityTextField.setEditable(false);
priorityTextField.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
priorityTextField.setText("1");
priorityTextField.setMaximumSize(new java.awt.Dimension(36, 19));
priorityTextField.setMinimumSize(new java.awt.Dimension(36, 19));
priorityTextField.setPreferredSize(new java.awt.Dimension(36, 19));
priorityTextField.setText("" + transitionController.getPriority());
priorityPanel.add(priorityTextField);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 5;
gridBagConstraints.gridwidth = 3;
transitionEditorPanel.add(priorityPanel, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3);
add(transitionEditorPanel, gridBagConstraints);
buttonPanel.setLayout(new java.awt.GridBagLayout());
cancelButton.setText("Cancel");
cancelButton.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent evt) {
cancelButtonHandler();
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3);
buttonPanel.add(cancelButton, gridBagConstraints);
okButton.setText("OK");
okButton.setMaximumSize(new java.awt.Dimension(75, 25));
okButton.setMinimumSize(new java.awt.Dimension(75, 25));
okButton.setPreferredSize(new java.awt.Dimension(75, 25));
okButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
okButtonHandler();
}
});
okButton.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent evt) {
okButtonKeyPressed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3);
buttonPanel.add(okButton, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.insets = new java.awt.Insets(5, 0, 8, 3);
add(buttonPanel, gridBagConstraints);
}
private void setSelectedRotation() {
int index;
switch (transitionController.getAngle()) {
case 45:
index = 1;
break;
case 90:
index = 2;
break;
case 135:
index = 3;
break;
case 0:
index = 4;
break;
default:
index = 0;
break;
}
rotationComboBox.setSelectedIndex(index);
}
/**
* Handles the cancellation by exiting the editor
* <p/>
* It does not perform any of the changes, the transition remains as is
*/
private void cancelButtonHandler() {
exit();
}
/**
* Exit the editor panel
*/
private void exit() {
rootPane.getParent().setVisible(false);
}
/**
* Handles saving by doing the following (if they've changed):
* - sets if it's an infinite server
* - sets if its timed
* - sets its priority
* - sets its angle
* - sets (and evaluates) its rate expression
*/
private void okButtonHandler() {
if (canSetName() && canSetInfiniteServer() && canSetRate() && canSetAngle() && (canSetTimed()
|| canSetPriority())) {
transitionController.startMultipleEdits();
setNameIfChanged();
setInfiniteServerIfChanged();
setRateIfChanged();
setAngleIfChanged();
if (canSetTimed()) {
setTimeIfChanged();
}
if (canSetPriority()) {
setPriorityIfChanged();
}
transitionController.finishMultipleEdits();
exit();
}
}
private void setInfiniteServerIfChanged() {
if (infiniteServerRadioButton.isSelected() != transitionController.isInfiniteServer()) {
transitionController.setInfiniteServer(infiniteServerRadioButton.isSelected());
}
}
/**
* This always returns true since the infinite server option is just a radio box.
*
* @return true if the infinite server selection option is valid
*/
private boolean canSetInfiniteServer() {
return true;
}
/**
* Sets the transitions name.
* <p/>
* PRE: canSetName() should be called first
*/
private void setNameIfChanged() {
String newName = nameTextField.getText();
if (!newName.equals(transitionController.getName())) {
transitionController.setId(newName);
}
}
/**
* Checks to see if the name can be set. This depends on whether there are any other transitions with this name.
*
* @return true if the name can be set, false otherwise
*/
private boolean canSetName() {
String newName = nameTextField.getText();
if (!newName.equals(transitionController.getName()) && !netController.isUniqueName(newName)) {
showErrorMessage("There is already a transition named " + newName);
return false;
}
return true;
}
/**
* Sets the transitions timed value if it has changed
*/
private void setTimeIfChanged() {
if (timedRadioButton.isSelected() != transitionController.isTimed()) {
transitionController.setTimed(timedRadioButton.isSelected());
}
}
/**
* This method will always return true since the timer is a radio button. It does not rely on any other criterion
*
* @return if it is ok for the transitions timed field to change
*/
private boolean canSetTimed() {
return true;
}
private void setPriorityIfChanged() {
int newPriority = prioritySlider.getValue();
if (newPriority != transitionController.getPriority() && !transitionController.isTimed()) {
transitionController.setPriority(prioritySlider.getValue());
}
}
/**
* @return true if the transition has not been changed to timed/is a timed transition
*/
private boolean canSetPriority() {
return !timedRadioButton.isSelected();
}
private boolean canSetRate() {
PetriNetWeightParser parser =
new PetriNetWeightParser(new EvalVisitor(netController.getPetriNet()), netController.getPetriNet());
FunctionalResults<Double> result = parser.evaluateExpression(weightRateTextField.getText());
if (result.hasErrors()) {
String concatenated = concatenateErrors(result.getErrors());
showErrorMessage(
"Functional rate expression is invalid. Please check your function. Errors are:" + concatenated);
return false;
}
double rate = result.getResult();
if (rate == -1) {
showErrorMessage("Functional rate expression is invalid. Please check your function.");
return false;
}
if (transitionController.getRateExpr().equals("")) {
showErrorMessage("Functional rate expression is empty. Please check.");
return false;
}
return true;
}
/**
* @param errors
* @return errors concatenated via a new line
*/
private String concatenateErrors(Iterable<String> errors) {
StringBuilder builder = new StringBuilder();
for (String error : errors) {
builder.append(error).append("\n");
}
return builder.toString();
}
/**
* Sets the models rate based upon the settings of the editor panel
*/
public void setRateIfChanged() {
int selected = rateComboBox.getSelectedIndex();
if (selected > 0) {
RateParameter rateParameter = indexToRates.get(selected);
transitionController.setRate(rateParameter);
} else {
String rateExpression = weightRateTextField.getText();
Rate rate = new NormalRate(rateExpression);
transitionController.setRate(rate);
}
}
/**
* Pops up a dialog with error message
*
* @param message message to be displayed on error
*/
private void showErrorMessage(String message) {
GuiUtils.displayErrorMessage(null, message);
}
/**
* This method will always return true sine the angle depends upon nothing else.
*
* @return if the angle is OK to be set
*/
private boolean canSetAngle() {
return true;
}
private void setAngleIfChanged() {
int rotationIndex = rotationComboBox.getSelectedIndex();
if (rotationIndex > 0) {
int angle = 0;
switch (rotationIndex) {
case 1:
angle = 45;
break;
case 2:
angle = 90;
break;
case 3:
angle = 135;
break;
case 4:
angle = 0;
break;
default:
break;
}
if (angle != transitionController.getAngle()) {
transitionController.setAngle(angle);
}
}
}
private void okButtonKeyPressed(java.awt.event.KeyEvent evt) {
if (evt.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) {
okButtonHandler();
}
}
private void prioritySliderStateChanged(javax.swing.event.ChangeEvent evt) {
priorityTextField.setText("" + prioritySlider.getValue());
}
private void immediateRadioButtonActionPerformed(java.awt.event.ActionEvent evt) {
if (immediateRadioButton.isSelected()) {
setUpImmediateTransition();
} else {
setUpTimedTransition();
}
}
private void serverRadioButtonActionPerformed(java.awt.event.ActionEvent evt) {
if (singleServerRadioButton.isSelected()) {
singleServerRadioButton.setSelected(true);
infiniteServerRadioButton.setSelected(false);
weightRateTextField.setEditable(true);
weightRateTextField.setText(transitionController.getRateExpr());
} else {
if (checkIfArcsAreFunctional()) {
String message = "Infinite server cannot be connect directly to \r\n"
+ "arcs with functional weights for this version";
showErrorMessage(message);
singleServerRadioButton.setSelected(true);
infiniteServerRadioButton.setSelected(false);
return;
}
weightRateTextField.setEditable(false);
singleServerRadioButton.setSelected(false);
infiniteServerRadioButton.setSelected(true);
}
}
private boolean checkIfArcsAreFunctional() {
for (Arc<Place, Transition> arc : transitionController.inboundArcs()) {
if (arc.hasFunctionalWeight()) {
return true;
}
}
return false;
}
private void timedRadioButtonActionPerformed(java.awt.event.ActionEvent evt) {
if (timedRadioButton.isSelected()) {
setUpTimedTransition();
} else {
setUpImmediateTransition();
}
}
/**
* Updates the text field to the value of the rate parameter
* If no rate parameter is selected allow the user to edit the text field
* otherwise disable the text field and show the value
*/
private void rateComboBoxActionPerformed() {
int selected = rateComboBox.getSelectedIndex();
if (selected > 0) {
RateParameter rateParameter = indexToRates.get(selected);
weightRateTextField.setEnabled(false);
weightRateTextField.setText(rateParameter.getExpression());
} else {
weightRateTextField.setEnabled(true);
}
}
private void rateTextFieldFocusGained() {
focusGained(weightRateTextField);
}
private void nameTextFieldFocusGained() {
focusGained(nameTextField);
}
private void focusGained(JTextField textField) {
textField.setCaretPosition(0);
textField.moveCaretPosition(textField.getText().length());
}
private void nameTextFieldFocusLost() {
focusLost(nameTextField);
}
private void focusLost(javax.swing.JTextField textField) {
textField.setCaretPosition(0);
}
private void rateTextFieldFocusLost() {
focusLost(weightRateTextField);
}
// private void createWindow() {
// EscapableDialog guiDialog = new EscapableDialog(ApplicationSettings.getApplicationView(), "PIPE2", true);
// TransitionFunctionEditor feditor =
// new TransitionFunctionEditor(this, guiDialog, transitionController, netController.getPetriNet());
// guiDialog.add(feditor);
// guiDialog.setSize(270, 230);
// guiDialog.setLocationRelativeTo(ApplicationSettings.getApplicationView());
// guiDialog.setVisible(true);
// guiDialog.dispose();
// }
private void setUpImmediateTransition() {
immediateRadioButton.setSelected(true);
weightRateLabel.setText("Weight:");
if (transitionController.isInfiniteServer()) {
weightRateTextField.setText("ED(" + transitionController.getName() + ")");
weightRateTextField.setEditable(false);
} else {
weightRateTextField.setText(transitionController.getRateExpr());
weightRateTextField.setEditable(true);
}
weightRateTextField.setEnabled(true);
prioritySlider.setEnabled(true);
priorityTextField.setText("" + transitionController.getPriority());
priorityLabel.setEnabled(true);
priorityPanel.setEnabled(true);
rateComboBox.setEnabled(false);
}
private void setUpTimedTransition() {
timedRadioButton.setSelected(true);
weightRateLabel.setText("Rate:");
if (transitionController.isInfiniteServer()) {
weightRateTextField.setText("ED(" + transitionController.getName() + ")");
weightRateTextField.setEditable(false);
} else {
weightRateTextField.setText(transitionController.getRateExpr());
weightRateTextField.setEditable(true);
}
weightRateTextField.setEnabled(true);
prioritySlider.setEnabled(false);
priorityTextField.setText("0");
Enumeration<AbstractButton> buttons = semanticsButtonGroup.getElements();
while (buttons.hasMoreElements()) {
buttons.nextElement().setEnabled(true);
}
priorityLabel.setEnabled(false);
priorityPanel.setEnabled(false);
rateComboBox.setEnabled(netController.getRateParameters().size() > 0);
}
/**
* Sets the rateTextField ready for saving out to the model
*
* @param func new Rate for the transition
*/
public void setRate(String func) {
this.weightRateTextField.setText(func);
}
}