package pipe.actions.gui; import pipe.controllers.application.PipeApplicationController; import uk.ac.imperial.pipe.models.petrinet.PetriNet; import uk.ac.imperial.pipe.models.petrinet.name.FileNameVisitor; import uk.ac.imperial.pipe.models.petrinet.name.NormalNameVisitor; import uk.ac.imperial.pipe.models.petrinet.name.NormalPetriNetName; import uk.ac.imperial.pipe.models.petrinet.name.PetriNetFileName; import java.awt.FileDialog; import java.awt.event.ActionEvent; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.io.File; /** * Responsible for performing a save action on the Petri net. * * This save action will use the Petri nets underlying file if it exists, or perform a save as action */ @SuppressWarnings("serial") public class SaveAction extends AbstractSaveAction { /** * Constructor * @param pipeApplicationController PIPE main appliaction controller * @param fileChooser save file dialog chooser */ public SaveAction(PipeApplicationController pipeApplicationController, FileDialog fileChooser) { super("Save", "Save", KeyEvent.VK_S, InputEvent.META_DOWN_MASK, pipeApplicationController, fileChooser); } /** * Tries to perform a save action, if the Petri net does not yet have an underlying file associated * with it, a save as will be performed. * @param e event */ @Override public void actionPerformed(ActionEvent e) { if (doSaveAs()) { saveAsOperation(); } else { PetriNet petriNet = pipeApplicationController.getActivePetriNetController().getPetriNet(); FileNamer fileNamer = new FileNamer(); saveNet(fileNamer.getFile(petriNet)); } } /** * * @return true if the Petri net does not yet have an underlying file associated with it. This indicates that * a save as should be performed. */ protected boolean doSaveAs() { PetriNet petriNet = pipeApplicationController.getActivePetriNetController().getPetriNet(); SaveAsVisitor visitor = new SaveAsVisitor(); return visitor.shouldSaveAs(petriNet); } /** * Visits PetriNetName possible classes and determines if the save action * should be a save as action */ private static class FileNamer implements NormalNameVisitor, FileNameVisitor { /** * Petri net file */ private File file = new File(""); /** * @param petriNet to be saved * @return file location and name to save petri net to */ public File getFile(PetriNet petriNet) { petriNet.getName().visit(this); return file; } /** * sets the file to the existing Petri net file * @param name of the file */ @Override public void visit(PetriNetFileName name) { file = name.getFile(); } /** * Noop operation * @param name of the file */ @Override public void visit(NormalPetriNetName name){ // No action needed } } /** * Visits PetriNetName possible classes and determines if the save action * should be a save as action */ private static class SaveAsVisitor implements NormalNameVisitor, FileNameVisitor { /** * Determines if a save as should be performed */ private boolean saveAs = false; /** * Determines if the petri net needs a save as call by * visiting the name item * * @param petriNet to be saved * @return if a save as should be performed */ public boolean shouldSaveAs(PetriNet petriNet) { petriNet.getName().visit(this); return saveAs; } /** * If the Petri net has an existing file then saveAs is set to false * @param name of the file */ @Override public void visit(PetriNetFileName name) { saveAs = false; } /** * If the name is a normal name it does not yet have a file representation * and so a save as is needed * * @param name of the file */ @Override public void visit(NormalPetriNetName name) { saveAs = true; } } }