package pipe.gui.widgets; import pipe.controllers.ArcController; import pipe.controllers.PetriNetController; import pipe.utilities.gui.GuiUtils; import uk.ac.imperial.pipe.models.petrinet.Token; import uk.ac.imperial.pipe.parsers.UnparsableException; import javax.swing.*; import java.awt.Dimension; import java.awt.Window; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; /** * This class deals with editing the weight of an arc */ @SuppressWarnings("serial") public class ArcWeightEditorPanel extends javax.swing.JPanel { private final PetriNetController petriNetController; private final ArcController<?, ?> arcController; private JRootPane rootPane; private javax.swing.JButton okButton = new javax.swing.JButton(); private List<JTextField> inputtedWeights = new LinkedList<>(); private List<String> inputtedTokenClassNames = new LinkedList<>(); /** * Creates new form Arc Weight Editor * * @param rootPane root pane * @param arcController controller for modifying arc * @param petriNetController Petri net controller */ public ArcWeightEditorPanel(JRootPane rootPane, PetriNetController petriNetController, ArcController<?, ?> arcController) { this.rootPane = rootPane; this.petriNetController = petriNetController; this.arcController = arcController; initComponents(); this.rootPane.setDefaultButton(okButton); } private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; JPanel arcEditorPanel = new JPanel(); JPanel buttonPanel = new JPanel(); JButton cancelButton = new JButton(); setLayout(new java.awt.GridBagLayout()); arcEditorPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Arc Weight Editor")); arcEditorPanel.setLayout(new java.awt.GridBagLayout()); Dimension d = new Dimension(); d.setSize(300, 340); arcEditorPanel.setPreferredSize(d); // Now set new dimension used in for loop below d = new Dimension(); d.setSize(50, 19); int x = 0; int y = 0; for (final Token token : petriNetController.getNetTokens()) { gridBagConstraints = new java.awt.GridBagConstraints(); JLabel tokenClassName = new JLabel(); final JTextField tokenClassWeight = new JTextField(); tokenClassWeight.setEditable(true); tokenClassWeight.setName(token.getId()); tokenClassWeight.setText(arcController.getWeightForToken(token.getId())); inputtedWeights.add(tokenClassWeight); tokenClassName.setText(token.getId() + ": "); inputtedTokenClassNames.add(token.getId()); gridBagConstraints.gridx = x; gridBagConstraints.gridy = y; gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); arcEditorPanel.add(tokenClassName, gridBagConstraints); tokenClassWeight.setPreferredSize(d); tokenClassWeight.addFocusListener(new java.awt.event.FocusAdapter() { public void focusGained(java.awt.event.FocusEvent evt) { nameTextFieldFocusGained(evt); } public void focusLost(java.awt.event.FocusEvent evt) { nameTextFieldFocusLost(evt); } }); tokenClassWeight.setEnabled(true); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = x + 3; gridBagConstraints.gridy = y; gridBagConstraints.gridwidth = 3; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); arcEditorPanel.add(tokenClassWeight, gridBagConstraints); final JButton fweditor = new JButton("Weight expression editor"); fweditor.setEnabled(true); gridBagConstraints.gridx = x + 3; gridBagConstraints.gridy = y + 1; gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); arcEditorPanel.add(fweditor, gridBagConstraints); fweditor.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent evt) { createEditorWindow(token.getId()); } }); y += 2; } gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(arcEditorPanel, gridBagConstraints); buttonPanel.setLayout(new java.awt.GridBagLayout()); cancelButton.setText("Cancel"); cancelButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { cancelButtonHandler(evt); } }); 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 java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent evt) { okButtonHandler(evt); } }); okButton.addKeyListener(new java.awt.event.KeyAdapter() { public void keyPressed(java.awt.event.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 cancelButtonHandler(java.awt.event.ActionEvent evt) { // Provisional! exit(); } private void exit() { rootPane.getParent().setVisible(false); } /** * Handles pressing of OK on Arc weight. * * @param evt */ private void okButtonHandler(java.awt.event.ActionEvent evt) { for (JTextField inputtedWeight : inputtedWeights) { String expr = inputtedWeight.getText(); if (expr.isEmpty()) { String message = " Expression is invalid. Please check your function."; String title = "Error"; JOptionPane.showMessageDialog(null, message, title, JOptionPane.WARNING_MESSAGE); return; } } Map<String, String> newWeights = new HashMap<>(); for (int i = 0; i < inputtedWeights.size(); i++) { String tokenClassName = inputtedTokenClassNames.get(i); String weight = inputtedWeights.get(i).getText(); newWeights.put(tokenClassName, weight); } try { arcController.setWeights(newWeights); exit(); } catch (UnparsableException e) { GuiUtils.displayErrorMessage(null, e.getMessage()); } } private void okButtonKeyPressed(java.awt.event.KeyEvent evt) { if (evt.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) { okButtonHandler(new java.awt.event.ActionEvent(this, 0, "")); } } private void nameTextFieldFocusGained(java.awt.event.FocusEvent evt) { // focusGained(nameTextField); } private void nameTextFieldFocusLost(java.awt.event.FocusEvent evt) { // focusLost(nameTextField); } public void createEditorWindow(String token) { Window window = SwingUtilities.getWindowAncestor(rootPane); EscapableDialog guiDialog = new EscapableDialog(window, "PIPE2", true); ArcFunctionEditor feditor = new ArcFunctionEditor(this, guiDialog, petriNetController.getPetriNet(), arcController, token); guiDialog.add(feditor); guiDialog.setSize(270, 230); guiDialog.setVisible(true); } public void setWeight(String func, String id) { for (int i = 0; i < inputtedTokenClassNames.size(); i++) { if (inputtedTokenClassNames.get(i).equals(id)) { inputtedWeights.get(i).setText(func); } } } }