/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.components.converger.gui;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.eclipse.swt.widgets.TableItem;
import de.rcenvironment.components.converger.common.ConvergerComponentConstants;
import de.rcenvironment.core.component.api.ComponentConstants;
import de.rcenvironment.core.component.api.LoopComponentConstants;
import de.rcenvironment.core.component.model.endpoint.api.EndpointDefinition;
import de.rcenvironment.core.component.model.endpoint.api.EndpointDescription;
import de.rcenvironment.core.datamodel.api.DataType;
import de.rcenvironment.core.datamodel.api.EndpointType;
import de.rcenvironment.core.gui.workflow.editor.commands.endpoint.AddDynamicInputCommand;
import de.rcenvironment.core.gui.workflow.editor.commands.endpoint.AddDynamicOutputCommand;
import de.rcenvironment.core.gui.workflow.editor.commands.endpoint.EditDynamicInputCommand;
import de.rcenvironment.core.gui.workflow.editor.commands.endpoint.EditDynamicOutputCommand;
import de.rcenvironment.core.gui.workflow.editor.commands.endpoint.ProcessEndpointsGroupCommand;
import de.rcenvironment.core.gui.workflow.editor.commands.endpoint.RemoveDynamicInputCommand;
import de.rcenvironment.core.gui.workflow.editor.commands.endpoint.RemoveDynamicOutputCommand;
import de.rcenvironment.core.gui.workflow.editor.properties.EndpointSelectionPane;
import de.rcenvironment.core.gui.workflow.editor.properties.WorkflowNodeCommand.Executor;
/**
* Endpoint selection pane.
*
* @author Doreen Seider
* @author Caslav Ilic
*/
public class ConvergerEndpointSelectionPane extends EndpointSelectionPane {
private final Executor executor;
private final EndpointSelectionPane outputPane;
private final EndpointSelectionPane auxiliaryPane;
public ConvergerEndpointSelectionPane(String title, Executor executor, EndpointSelectionPane outputPane,
EndpointSelectionPane auxiliaryPane) {
super(title, EndpointType.INPUT, ConvergerComponentConstants.ENDPOINT_ID_TO_CONVERGE,
new String[] { ConvergerComponentConstants.ENDPOINT_ID_START_TO_CONVERGE }, new String[] {}, executor, false, true);
this.executor = executor;
this.outputPane = outputPane;
this.auxiliaryPane = auxiliaryPane;
}
@Override
protected void executeAddCommand(String name, DataType type, Map<String, String> metaData) {
ProcessEndpointsGroupCommand groupCommand = new ProcessEndpointsGroupCommand(executor, this, outputPane);
groupCommand
.add(new AddDynamicInputCommand(ConvergerComponentConstants.ENDPOINT_ID_TO_CONVERGE, name, type, metaData, this, outputPane));
if (metaData.get(ConvergerComponentConstants.META_HAS_STARTVALUE) == null
|| !Boolean.parseBoolean(metaData.get(ConvergerComponentConstants.META_HAS_STARTVALUE))) {
Map<String, String> startMetaData = new HashMap<>();
startMetaData.put(ComponentConstants.INPUT_METADATA_KEY_INPUT_EXECUTION_CONSTRAINT,
EndpointDefinition.InputExecutionContraint.Required.name());
groupCommand.add(new AddDynamicInputCommand(ConvergerComponentConstants.ENDPOINT_ID_START_TO_CONVERGE,
name + LoopComponentConstants.ENDPOINT_STARTVALUE_SUFFIX, type,
startMetaData,
LoopComponentConstants.ENDPOINT_STARTVALUE_GROUP, this, outputPane));
}
groupCommand.add(new AddDynamicOutputCommand(ConvergerComponentConstants.ENDPOINT_ID_TO_CONVERGE, name, type,
Collections.<String, String> emptyMap(), this, outputPane));
groupCommand.add(new AddDynamicOutputCommand(ConvergerComponentConstants.ENDPOINT_ID_AUXILIARY,
name + ConvergerComponentConstants.IS_CONVERGED_OUTPUT_SUFFIX, DataType.Boolean,
Collections.<String, String> emptyMap(), this, auxiliaryPane));
groupCommand.add(new AddDynamicOutputCommand(ConvergerComponentConstants.ENDPOINT_ID_FINAL_TO_CONVERGE,
name + ConvergerComponentConstants.CONVERGED_OUTPUT_SUFFIX, type,
Collections.<String, String> emptyMap(), this, outputPane));
execute(groupCommand);
}
@Override
protected void executeEditCommand(EndpointDescription oldDescription, EndpointDescription newDescription) {
String oldName = oldDescription.getName();
String newName = newDescription.getName();
DataType newType = newDescription.getDataType();
Map<String, String> newMetaData = newDescription.getMetaData();
ProcessEndpointsGroupCommand groupCommand = new ProcessEndpointsGroupCommand(executor, this, outputPane);
groupCommand.add(new EditDynamicInputCommand(ConvergerComponentConstants.ENDPOINT_ID_TO_CONVERGE,
oldName, newName, newType, newMetaData, this, outputPane));
boolean oldHasStartValue = oldDescription.getMetaData().get(ConvergerComponentConstants.META_HAS_STARTVALUE) != null
&& Boolean.parseBoolean(oldDescription.getMetaData().get(ConvergerComponentConstants.META_HAS_STARTVALUE));
boolean newHasStartValue = newDescription.getMetaData().get(ConvergerComponentConstants.META_HAS_STARTVALUE) != null
&& Boolean.parseBoolean(newDescription.getMetaData().get(ConvergerComponentConstants.META_HAS_STARTVALUE));
if (!oldHasStartValue && !newHasStartValue) {
groupCommand.add(new EditDynamicInputCommand(ConvergerComponentConstants.ENDPOINT_ID_START_TO_CONVERGE,
oldName + LoopComponentConstants.ENDPOINT_STARTVALUE_SUFFIX,
newName + LoopComponentConstants.ENDPOINT_STARTVALUE_SUFFIX,
newType, new HashMap<String, String>(),
LoopComponentConstants.ENDPOINT_STARTVALUE_GROUP, this, outputPane));
} else if (!oldHasStartValue && newHasStartValue) {
groupCommand.add(new RemoveDynamicInputCommand(ConvergerComponentConstants.ENDPOINT_ID_START_TO_CONVERGE,
oldName + LoopComponentConstants.ENDPOINT_STARTVALUE_SUFFIX, this, outputPane));
} else if (oldHasStartValue && !newHasStartValue) {
groupCommand.add(new AddDynamicInputCommand(ConvergerComponentConstants.ENDPOINT_ID_START_TO_CONVERGE,
newName + LoopComponentConstants.ENDPOINT_STARTVALUE_SUFFIX, newType,
new HashMap<String, String>(),
LoopComponentConstants.ENDPOINT_STARTVALUE_GROUP, this, outputPane));
}
groupCommand.add(new EditDynamicOutputCommand(ConvergerComponentConstants.ENDPOINT_ID_TO_CONVERGE,
oldName, newName, newType, new HashMap<String, String>(),
this, outputPane));
groupCommand.add(new EditDynamicOutputCommand(ConvergerComponentConstants.ENDPOINT_ID_AUXILIARY,
oldName + ConvergerComponentConstants.IS_CONVERGED_OUTPUT_SUFFIX,
newName + ConvergerComponentConstants.IS_CONVERGED_OUTPUT_SUFFIX,
DataType.Boolean, new HashMap<String, String>(),
this, auxiliaryPane));
groupCommand.add(new EditDynamicOutputCommand(ConvergerComponentConstants.ENDPOINT_ID_FINAL_TO_CONVERGE,
oldName + ConvergerComponentConstants.CONVERGED_OUTPUT_SUFFIX,
newName + ConvergerComponentConstants.CONVERGED_OUTPUT_SUFFIX,
newType, new HashMap<String, String>(),
this, outputPane));
execute(groupCommand);
}
@Override
protected void executeRemoveCommand(List<String> names) {
List<String> removeNames = new LinkedList<>();
for (String name : names) {
if (name.endsWith(LoopComponentConstants.ENDPOINT_STARTVALUE_SUFFIX)) {
removeNames.add(name);
}
}
for (String remove : removeNames) {
names.remove(remove);
}
ProcessEndpointsGroupCommand groupCommand = new ProcessEndpointsGroupCommand(executor, this, outputPane);
for (String name : names) {
groupCommand.add(new RemoveDynamicInputCommand(ConvergerComponentConstants.ENDPOINT_ID_TO_CONVERGE,
name, this, outputPane));
groupCommand.add(new RemoveDynamicInputCommand(ConvergerComponentConstants.ENDPOINT_ID_START_TO_CONVERGE,
name + LoopComponentConstants.ENDPOINT_STARTVALUE_SUFFIX, this, outputPane));
groupCommand.add(new RemoveDynamicOutputCommand(ConvergerComponentConstants.ENDPOINT_ID_TO_CONVERGE,
name, this, outputPane));
groupCommand.add(new RemoveDynamicOutputCommand(ConvergerComponentConstants.ENDPOINT_ID_AUXILIARY,
name + ConvergerComponentConstants.IS_CONVERGED_OUTPUT_SUFFIX, this, auxiliaryPane));
groupCommand.add(new RemoveDynamicOutputCommand(ConvergerComponentConstants.ENDPOINT_ID_FINAL_TO_CONVERGE,
name + ConvergerComponentConstants.CONVERGED_OUTPUT_SUFFIX, this, outputPane));
}
execute(groupCommand);
}
@Override
protected void updateButtonActivation() {
super.updateButtonActivation();
TableItem[] selection = table.getSelection();
if (selection.length == 1 && selection[0].getText().endsWith(LoopComponentConstants.ENDPOINT_STARTVALUE_SUFFIX)) {
buttonEdit.setEnabled(false);
buttonRemove.setEnabled(false);
}
}
}