package pipe.actions.manager; import pipe.actions.gui.*; import pipe.controllers.application.PipeApplicationController; import javax.swing.event.UndoableEditListener; import java.util.Arrays; import java.util.HashMap; import java.util.Map; /** * These components are responsible for editing and managing items * on the petri net canvas when pressed */ public class ComponentEditorManager implements ActionManager { /** * Action copies whatever is selected at the time */ private final CopyAction copyAction; /** * Action taht cuts whatever is selected */ private final CutAction cutAction; /** * Action that pastes the current selection */ private final PasteAction pasteAction; /** * Action that deletes the current selection */ private final DeleteAction deleteAction; /** * Action that undoes the last edit */ public final UndoAction undoAction; /** * Action that redoes the previous undo */ public final RedoAction redoAction; private Map<GuiAction, Boolean> editEnabledStatus = new HashMap<>(); /** * Creates actions for editing the petri net * * @param controller PIPE application controller */ public ComponentEditorManager(PipeApplicationController controller) { copyAction = new CopyAction(controller); pasteAction = new PasteAction(controller); cutAction = new CutAction(controller); deleteAction = new DeleteAction(controller); undoAction = new UndoAction(controller); redoAction = new RedoAction(controller, undoAction); undoAction.registerRedoAction(redoAction); undoAction.setEnabled(false); redoAction.setEnabled(false); UndoableEditListener listener = new SimpleUndoListener(redoAction, undoAction, controller); deleteAction.addUndoableEditListener(listener); copyAction.addUndoableEditListener(listener); cutAction.addUndoableEditListener(listener); pasteAction.addUndoableEditListener(listener); storeEnabledStatus(); } /** * @return inorder iterable of the actions this class is responsible for managing */ @Override public final Iterable<GuiAction> getActions() { editEnabledStatus.keySet(); return Arrays.asList(cutAction, copyAction, pasteAction, deleteAction, undoAction, redoAction); } /** * Disables actions and stores their current state * ready for re-enabling */ @Override public void disableActions() { storeEnabledStatus(); for (GuiAction action : getActions()) { action.setEnabled(false); } } /** * Restores actions to their previous states */ @Override public void enableActions() { for (GuiAction action : getActions()) { action.setEnabled(editEnabledStatus.get(action)); } } /** * Stores the current actions enabled status in the map */ private void storeEnabledStatus() { for (GuiAction action : getActions()) { editEnabledStatus.put(action, action.isEnabled()); } } }