package pipe.actions.gui; import org.apache.commons.io.FilenameUtils; import pipe.controllers.application.PipeApplicationController; import pipe.utilities.gui.GuiUtils; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.TransformerException; import java.awt.FileDialog; import java.io.File; import java.lang.reflect.InvocationTargetException; /** * Abstract class for implementing save and save as actions */ public abstract class AbstractSaveAction extends GuiAction { /** * The controller for the entire application */ protected final PipeApplicationController pipeApplicationController; /** * The file dialog that will pop up when saving a Petri net. It is used to define a file save location. */ private final FileDialog fileDialog; /** * Constructor for a save action * @param name graphical name representation * @param tooltip string that will appear as a tool tip when hovering over the action on a toolbar * @param key key shortcut * @param modifiers key shortcut modifiers * @param pipeApplicationController controller for the entire application * @param fileDialog file dialog used to select files on save */ public AbstractSaveAction(String name, String tooltip, int key, int modifiers, PipeApplicationController pipeApplicationController, FileDialog fileDialog) { super(name, tooltip, key, modifiers); this.pipeApplicationController = pipeApplicationController; this.fileDialog = fileDialog; } //TODO: Move out into save actions /** * Performs a save as operation. A save as chooses a file to save the Petri net to */ protected final void saveAsOperation() { fileDialog.setVisible(true); File[] files = fileDialog.getFiles(); if (files.length != 0) { File file = files[0]; saveNet(ensureExtension(file)); } } /** * Performs a save operation. This action saves the Petri net to the specified file without * popping up the file dialog * * @param file file path to save petri net to */ protected final void saveNet(File file) { try { pipeApplicationController.saveAsCurrentPetriNet(file); } catch (ParserConfigurationException | TransformerException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) { GuiUtils.displayErrorMessage(null, e.getMessage()); } } /** * Append XML extension onto file if it is missing. This happens if a user types * the name of the file they would like to save the Petri net to but does not add * the file extension to it. * * @param file file to add the xml extension to if it is missing * @return file with extension */ private File ensureExtension(File file) { String ext = FilenameUtils.getExtension(file.getAbsolutePath()); if (ext.isEmpty()) { return new File(file.getAbsolutePath() + ".xml"); } return file; } }