package com.baselet.gui.command; import java.util.Vector; import com.baselet.diagram.CurrentDiagram; import com.baselet.diagram.DiagramHandler; import com.baselet.gui.CurrentGui; public class Controller { private Vector<Command> commands; private final DiagramHandler handler; private int _cursor; public Controller(DiagramHandler handler) { commands = new Vector<Command>(); _cursor = -1; this.handler = handler; } public void executeCommand(Command newCommand) { // Remove future commands for (int i = commands.size() - 1; i > _cursor; i--) { commands.removeElementAt(i); } commands.add(newCommand); newCommand.execute(handler); if (commands.size() >= 2) { Command c_n, c_nMinus1; c_n = commands.elementAt(commands.size() - 1); c_nMinus1 = commands.elementAt(commands.size() - 2); if (c_n.isMergeableTo(c_nMinus1)) { commands.removeElement(c_n); commands.removeElement(c_nMinus1); Command c = c_n.mergeTo(c_nMinus1); commands.add(c); } } _cursor = commands.size() - 1; if (newCommand.isChangingDiagram()) { handler.setChanged(true); } CurrentGui.getInstance().getGui().updateGrayedOutMenuItems(handler); } public void undo() { if (isUndoable()) { Command c = commands.elementAt(_cursor); c.undo(handler); _cursor--; if (c.isChangingDiagram()) { handler.setChanged(true); } } CurrentGui.getInstance().getGui().updateGrayedOutMenuItems(CurrentDiagram.getInstance().getDiagramHandler()); } public void redo() { if (isRedoable()) { Command c = commands.elementAt(_cursor + 1); c.redo(handler); _cursor++; if (c.isChangingDiagram()) { handler.setChanged(true); } } CurrentGui.getInstance().getGui().updateGrayedOutMenuItems(CurrentDiagram.getInstance().getDiagramHandler()); } public boolean isEmpty() { return commands.isEmpty(); } public boolean isUndoable() { return _cursor >= 0; } public boolean isRedoable() { return _cursor < commands.size() - 1; } public void clear() { commands = new Vector<Command>(); _cursor = -1; } }