package pipe.actions.gui; import pipe.controllers.application.PipeApplicationController; import javax.swing.*; import java.awt.Frame; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; public class ExitAction extends GuiAction { private final PipeApplicationController pipeApplicationController; private Frame application; public ExitAction(Frame application, PipeApplicationController pipeApplicationController) { super("Exit", "Close the program", KeyEvent.VK_Q, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()); this.application = application; this.pipeApplicationController = pipeApplicationController; } @Override public void actionPerformed(ActionEvent e) { tryToExit(); } public void tryToExit() { boolean safeToExit = !pipeApplicationController.anyNetsChanged(); tryToExit(safeToExit); } /** * Tries to exit. If it is not safe to immediately exit then a warning comes up * asking the user if they wish to exit. The result is then published and the relevant action * is performed (e.g. exit or cancel). * * @param safeExit boolean determines if it safe to quit immediately */ private void tryToExit(boolean safeExit) { if (safeExit) { application.dispose(); System.exit(0); } else { int result = JOptionPane.showConfirmDialog(application, "Do you really want to exit? Some unsaved Petri nets have changed.", "Confirm Exit", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE); switch (result) { case JOptionPane.YES_OPTION: tryToExit(true); break; case JOptionPane.CLOSED_OPTION: case JOptionPane.CANCEL_OPTION: break; default: break; } } } public String changedNamesMessage(Iterable<String> changedNames) { StringBuilder buffer = new StringBuilder("The following Petri nets have changed. Do you still want to exit?"); for (String name : changedNames) { buffer.append("\n"); buffer.append(name); } return buffer.toString(); } }