/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.gui.workflow.editor.connections;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.widgets.Display;
import de.rcenvironment.core.component.model.endpoint.api.EndpointDescription;
import de.rcenvironment.core.component.workflow.model.api.Connection;
import de.rcenvironment.core.component.workflow.model.api.Location;
import de.rcenvironment.core.component.workflow.model.api.WorkflowDescription;
import de.rcenvironment.core.component.workflow.model.api.WorkflowNode;
import de.rcenvironment.core.gui.workflow.ConnectionUtils;
/**
* Controller class for the connection dialog.
*
* @author Heinrich Wendel
* @author Doreen Seider
*/
public class ConnectionDialogController {
/** The actual dialog. */
private ConnectionDialog dialog;
/** The complete WorkflowDescription. */
private WorkflowDescription description;
/** The selected source node (maybe null). */
private WorkflowNode sourceWorkflowNode;
/** The selected target node (maybe null). */
private WorkflowNode targetWorkflowNode;
private boolean wasDoubleClicked;
public ConnectionDialogController(WorkflowDescription description, WorkflowNode source, WorkflowNode target, boolean wasDoubleClicked) {
this.description = description;
this.sourceWorkflowNode = source;
this.targetWorkflowNode = target;
this.wasDoubleClicked = wasDoubleClicked;
dialog = new ConnectionDialog(Display.getCurrent().getActiveShell());
dialog.create();
dialog.getShell().setText(Messages.connectionEditor);
initialize();
// prevent auto connect on double click
if (!wasDoubleClicked){
boolean autoConnected = checkForAutoConnection();
dialog.getAutoConnectInfoLabel().setVisible(autoConnected);
if (autoConnected){
dialog.getConnectionDialogComposite().getTargetTreeViewer().refresh();
dialog.getConnectionDialogComposite().getSourceTreeViewer().refresh();
}
} else {
dialog.getAutoConnectInfoLabel().setVisible(false);
}
}
/**
* Shows the dialog.
*
* @return The return code (which button pressed).
*/
public int open() {
return dialog.open();
}
public WorkflowDescription getWorkflowDescription() {
return description;
}
/**
* Initializes the GUI.
*/
private void initialize() {
dialog.getConnectionDialogComposite().initialize(getWorkflowDescription(), sourceWorkflowNode, targetWorkflowNode);
dialog.getConnectionDialogComposite().setWasDoubleClicked(wasDoubleClicked);
dialog.getConnectionDialogComposite().applySourceFilter();
dialog.getConnectionDialogComposite().applyTargetFilter();
// start with empty selection
dialog.getConnectionDialogComposite().getSourceTreeViewer().setSelection(StructuredSelection.EMPTY);
dialog.getConnectionDialogComposite().getTargetTreeViewer().setSelection(StructuredSelection.EMPTY);
}
// if there are exactly 1 input and 1 output and they match in type, pull connection automatically
private boolean checkForAutoConnection() {
boolean autoConnected = false;
if (sourceWorkflowNode != null && targetWorkflowNode != null) {
// if user tries to connect same node - no auto connect
if (sourceWorkflowNode.getIdentifier().equals(targetWorkflowNode.getIdentifier())) {
return false;
}
// 1 Input + 1 Output -> try to autoconnect
if (sourceWorkflowNode.getOutputDescriptionsManager().getEndpointDescriptions().size() == 1
&& targetWorkflowNode.getInputDescriptionsManager().getEndpointDescriptions().size() == 1) {
EndpointDescription sourceOutput =
(EndpointDescription) sourceWorkflowNode.getOutputDescriptionsManager().getEndpointDescriptions().toArray()[0];
EndpointDescription targetInput =
(EndpointDescription) targetWorkflowNode.getInputDescriptionsManager().getEndpointDescriptions().toArray()[0];
if (sourceOutput.getDataType().equals(targetInput.getDataType())) {
// if input is already connected - no auto connect
for (Connection connection : description.getConnections()) {
if (connection.getInput().getIdentifier().equals(targetInput.getIdentifier())) {
return false;
}
}
List<Location> bendpoints =
ConnectionUtils.findAlreadyExistentBendpointsBySourceAndTarget(sourceWorkflowNode, targetWorkflowNode, description);
Connection newConnection =
new Connection(sourceWorkflowNode, sourceOutput, targetWorkflowNode, targetInput, bendpoints);
if (!description.getConnections().contains(newConnection)) {
description.addConnection(newConnection);
return true;
}
}
} else if (sourceWorkflowNode.getOutputDescriptionsManager().getEndpointDescriptions().size() > 0
&& targetWorkflowNode.getInputDescriptionsManager().getEndpointDescriptions().size() > 0) {
// what to do with more than one endpoint
for (EndpointDescription sourceOutput : sourceWorkflowNode.getOutputDescriptionsManager().getEndpointDescriptions()){
for (EndpointDescription targetInput : targetWorkflowNode.getInputDescriptionsManager().getEndpointDescriptions()){
List<Connection> connectionsToBeAdded = new ArrayList<>();
if (sourceOutput.getDataType().equals(targetInput.getDataType())
&& sourceOutput.getName().equals(targetInput.getName())){
// if input is already connected - no auto connect
boolean alreadyExists = false;
for (Connection connection : description.getConnections()) {
if (connection.getInput().getIdentifier().equals(targetInput.getIdentifier())) {
alreadyExists = true;
break;
}
}
List<Location> bendpoints = ConnectionUtils.findAlreadyExistentBendpointsBySourceAndTarget(sourceWorkflowNode
, targetWorkflowNode, description);
Connection newConnection =
new Connection(sourceWorkflowNode, sourceOutput, targetWorkflowNode, targetInput, bendpoints);
if (!description.getConnections().contains(newConnection) && !alreadyExists) {
connectionsToBeAdded.add(newConnection);
autoConnected = true;
}
}
description.addConnections(connectionsToBeAdded);
}
}
}
}
return autoConnected;
}
}