package org.csstudio.sds.ui.internal.commands;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.commands.CommandStack;
import org.eclipse.gef.commands.CommandStackEvent;
import org.eclipse.gef.commands.CommandStackEventListener;
/**
* Has to be registered at the CommandStack to handle AccosiableCommands.
*
* @see AssociableCommand
*
* @author Christian Zoller
*/
public class AssociableCommandListener implements CommandStackEventListener {
private final CommandStack _commandStack;
public AssociableCommandListener(CommandStack commandStack) {
_commandStack = commandStack;
}
@Override
public void stackChanged(CommandStackEvent event) {
if (event.getCommand() instanceof AssociableCommand) {
if (event.getDetail() == CommandStack.PRE_UNDO) {
skipUndoWhenAssociated((AssociableCommand) event.getCommand());
} else if (event.getDetail() == CommandStack.PRE_REDO) {
skipRedoWhenAssociated((AssociableCommand) event.getCommand());
} else if (event.getDetail() == CommandStack.POST_UNDO) {
undoAssociatedCommands((AssociableCommand) event.getCommand());
} else if (event.getDetail() == CommandStack.POST_REDO) {
redoAssociatedCommands((AssociableCommand) event.getCommand());
}
}
}
private void skipUndoWhenAssociated(AssociableCommand associable) {
Command predecessor = _commandStack.getUndoCommand();
if (associated(associable, predecessor)) {
associable.skipNextStackAction();
}
}
private void skipRedoWhenAssociated(AssociableCommand associable) {
Command successor = _commandStack.getRedoCommand();
if (associated(associable, successor)) {
associable.skipNextStackAction();
}
}
private void undoAssociatedCommands(AssociableCommand associable) {
Command predecessor = _commandStack.getUndoCommand();
if (associated(associable, predecessor)) {
_commandStack.undo();
}
}
private void redoAssociatedCommands(AssociableCommand associable) {
Command successor = _commandStack.getRedoCommand();
if (associated(associable, successor)) {
_commandStack.redo();
}
}
private boolean associated(AssociableCommand associable, Command command) {
if (!(command instanceof AssociableCommand)) {
return false;
}
AssociableCommand associable2 = (AssociableCommand) command;
return associable.isAssociated(associable2);
}
}