/* * Copyright (C) 2006-2015 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.gui.workflow.editor.commands.endpoint; import java.util.ArrayList; import java.util.List; import de.rcenvironment.core.gui.workflow.editor.properties.Refreshable; import de.rcenvironment.core.gui.workflow.editor.properties.WorkflowNodeCommand; /** * {@link WorkflowNodeCommand} * Group several dynamic endpoint commands in order to act as single * undo-redo step. * * @author Caslav Ilic * @author Martin Misiak * FIXED 0014347: Primitive commands should not appear on the commandstack. * Only the {@link ProcessEndpointsGroupCommand} should. For this {@link #execute()} * does not forward the commands to the {@link #executor}, rather executes them directly. * */ public class ProcessEndpointsGroupCommand extends WorkflowNodeCommand { protected WorkflowNodeCommand.Executor executor; protected Refreshable[] refreshable; protected List<WorkflowNodeCommand> commands = new ArrayList<>(); private boolean executable = true; private boolean undoable = false; public ProcessEndpointsGroupCommand(WorkflowNodeCommand.Executor executor, Refreshable... refreshable) { this.executor = executor; this.refreshable = refreshable; } @Override public void initialize() { // do nothing } @Override public boolean canExecute() { return executable; } @Override public void execute() { if (executable) { for (WorkflowNodeCommand command : commands) { command.setWorkflowNode(super.getWorkflowNode()); command.setCommandStack(super.commandStack); command.execute(); } executable = false; undoable = true; } if (refreshable != null) { for (Refreshable r : refreshable) { r.refresh(); } } } @Override public boolean canUndo() { return undoable; } @Override public void undo() { if (undoable) { for (WorkflowNodeCommand command : commands) { command.undo(); } executable = true; undoable = false; } if (refreshable != null) { for (Refreshable r : refreshable) { r.refresh(); } } } /** * Add another command to the group. * * @param command */ public void add(WorkflowNodeCommand command) { if (undoable) { return; } commands.add(command); } }