package sk.stuba.fiit.perconik.activity.listeners.command;
import com.google.common.base.Optional;
import org.eclipse.core.commands.operations.OperationHistoryEvent;
import sk.stuba.fiit.perconik.activity.listeners.ActivityListener;
import sk.stuba.fiit.perconik.core.annotations.Version;
import sk.stuba.fiit.perconik.eclipse.core.commands.operations.OperationHistoryEventType;
import static com.google.common.base.Optional.absent;
import static com.google.common.base.Optional.of;
import static com.google.common.base.Preconditions.checkNotNull;
import static sk.stuba.fiit.perconik.activity.listeners.command.UndoableOperationListener.Action.fromType;
import static sk.stuba.fiit.perconik.eclipse.core.commands.operations.OperationHistoryEventType.DONE;
import static sk.stuba.fiit.perconik.eclipse.core.commands.operations.OperationHistoryEventType.REDONE;
import static sk.stuba.fiit.perconik.eclipse.core.commands.operations.OperationHistoryEventType.UNDONE;
import static sk.stuba.fiit.perconik.eclipse.core.commands.operations.OperationHistoryEventType.valueOf;
/**
* TODO
*
* @author Pavol Zbell
* @since 1.0
*/
@Version("0.0.4.alpha")
public final class UndoableOperationListener extends AbstractUndoableListener {
public UndoableOperationListener() {}
enum Action implements ActivityListener.Action {
EXECUTE(DONE),
UNDO(UNDONE),
REDO(REDONE);
private final String name;
private final String path;
private final OperationHistoryEventType type;
private Action(final OperationHistoryEventType type) {
this.name = actionName("eclipse", "command", "operation", this);
this.path = actionPath(this.name);
this.type = checkNotNull(type);
}
static Optional<Action> fromType(final OperationHistoryEventType type) {
for (Action action: values()) {
if (action.type == type) {
return of(action);
}
}
return absent();
}
public String getName() {
return this.name;
}
public String getPath() {
return this.path;
}
}
@Override
Optional<Action> resolve(final OperationHistoryEvent event) {
return fromType(valueOf(event.getEventType()));
}
}