/* * Copyright 2015 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.keywords; import static com.google.common.collect.Iterables.any; import java.util.Arrays; import java.util.List; import org.rf.ide.core.testdata.model.table.KeywordTable; import org.robotframework.ide.eclipse.main.plugin.model.RobotKeywordDefinition; import org.robotframework.ide.eclipse.main.plugin.model.RobotKeywordsSection; import org.robotframework.ide.eclipse.main.plugin.model.RobotModelEvents; import org.robotframework.ide.eclipse.main.plugin.model.cmd.NamesGenerator; import org.robotframework.ide.eclipse.main.plugin.tableeditor.EditorCommand; import org.robotframework.services.event.RedEventBroker; import com.google.common.base.Predicate; public class InsertKeywordDefinitionsCommand extends EditorCommand { private final RobotKeywordsSection keywordsSection; private final int index; private final List<RobotKeywordDefinition> definitionsToInsert; public InsertKeywordDefinitionsCommand(final RobotKeywordsSection keywordsSection, final RobotKeywordDefinition[] definitionsToInsert) { this(keywordsSection, -1, definitionsToInsert); } public InsertKeywordDefinitionsCommand(final RobotKeywordsSection keywordsSection, final int index, final RobotKeywordDefinition[] definitionsToInsert) { this.keywordsSection = keywordsSection; this.index = index; this.definitionsToInsert = Arrays.asList(definitionsToInsert); } @Override public void execute() throws CommandExecutionException { final KeywordTable keywordTable = keywordsSection.getLinkedElement(); int counter = index; for (final RobotKeywordDefinition keyword : definitionsToInsert) { keyword.setParent(keywordsSection); keyword.getLinkedElement().setParent(keywordTable); if (nameChangeIsRequired(keyword)) { final String newName = NamesGenerator.generateUniqueName(keywordsSection, keyword.getName()); keyword.getLinkedElement().getKeywordName().setText(newName); } if (counter == -1) { keywordsSection.getChildren().add(keyword); keywordTable.addKeyword(keyword.getLinkedElement()); } else { keywordsSection.getChildren().add(counter, keyword); keywordTable.addKeyword(keyword.getLinkedElement(), counter); counter++; } } if (!definitionsToInsert.isEmpty()) { RedEventBroker.using(eventBroker) .additionallyBinding(RobotModelEvents.ADDITIONAL_DATA).to(definitionsToInsert) .send(RobotModelEvents.ROBOT_KEYWORD_DEFINITION_ADDED, keywordsSection); } } private boolean nameChangeIsRequired(final RobotKeywordDefinition definition) { return any(keywordsSection.getChildren(), new Predicate<RobotKeywordDefinition>() { @Override public boolean apply(final RobotKeywordDefinition def) { return def.getName().equalsIgnoreCase(definition.getName()); } }); } @Override public List<EditorCommand> getUndoCommands() { return newUndoCommands(new DeleteKeywordDefinitionCommand(definitionsToInsert)); } }