/*
* Copyright 2016 Nokia Solutions and Networks
* Licensed under the Apache License, Version 2.0,
* see license.txt file for details.
*/
package org.robotframework.ide.eclipse.main.plugin.model.cmd.variables;
import static com.google.common.collect.Lists.newArrayList;
import java.util.Collection;
import java.util.List;
import org.rf.ide.core.testdata.model.table.variables.AVariable.VariableType;
import org.rf.ide.core.testdata.model.table.variables.ListVariable;
import org.rf.ide.core.testdata.model.table.variables.ScalarVariable;
import org.rf.ide.core.testdata.model.table.variables.UnknownVariable;
import org.rf.ide.core.testdata.text.read.recognizer.RobotToken;
import org.robotframework.ide.eclipse.main.plugin.model.RobotModelEvents;
import org.robotframework.ide.eclipse.main.plugin.model.RobotVariable;
import org.robotframework.ide.eclipse.main.plugin.tableeditor.EditorCommand;
/**
* @author Michal Anglart
*
*/
public class RemoveListVariableValueElementsCommand extends EditorCommand {
private final RobotVariable variable;
private final Collection<RobotToken> elements;
private List<Integer> removedElementsIndexes = newArrayList();
public RemoveListVariableValueElementsCommand(final RobotVariable variable, final Collection<RobotToken> elements) {
this.variable = variable;
this.elements = elements;
}
@Override
public void execute() throws CommandExecutionException {
if (variable.getType() == VariableType.SCALAR_AS_LIST) {
final ScalarVariable var = (ScalarVariable) variable.getLinkedElement();
for (final RobotToken token : elements) {
removedElementsIndexes.add(var.getValues().indexOf(token));
}
for (final RobotToken token : elements) {
var.removeValue(token);
}
} else if (variable.getType() == VariableType.LIST) {
final ListVariable var = (ListVariable) variable.getLinkedElement();
for (final RobotToken token : elements) {
removedElementsIndexes.add(var.getItems().indexOf(token));
}
for (final RobotToken token : elements) {
var.removeItem(token);
}
} else if (variable.getType() == VariableType.INVALID) {
final UnknownVariable var = (UnknownVariable) variable.getLinkedElement();
for (final RobotToken token : elements) {
removedElementsIndexes.add(var.getItems().indexOf(token));
}
for (final RobotToken token : elements) {
var.removeItem(token);
}
} else {
throw new CommandExecutionException("Variables of type " + variable.getType()
+ " cannot have value elements removed with this command");
}
eventBroker.send(RobotModelEvents.ROBOT_VARIABLE_VALUE_CHANGE, variable);
}
@Override
public List<EditorCommand> getUndoCommands() {
return newUndoCommands(setupUndoCommandsForRemovedElements());
}
private List<EditorCommand> setupUndoCommandsForRemovedElements() {
final List<EditorCommand> commands = newArrayList();
if (elements.size() == removedElementsIndexes.size()) {
int indexesCounter = 0;
for (final RobotToken token : elements) {
commands.add(new CreateCompoundVariableValueElementCommand(variable, token.getText(),
removedElementsIndexes.get(indexesCounter)));
indexesCounter++;
}
}
return commands;
}
}