/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.gui.workflow.editor.commands;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.commands.Command;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import de.rcenvironment.core.component.workflow.model.api.Connection;
import de.rcenvironment.core.component.workflow.model.api.WorkflowDescription;
import de.rcenvironment.core.component.workflow.model.api.WorkflowLabel;
import de.rcenvironment.core.component.workflow.model.api.WorkflowNode;
/**
* Command that creates new WorkflowNodes, Labels and Connections.
*
* @author Oliver Seebach
*/
public class WorkflowNodeLabelConnectionCreateCommand extends Command {
private static final int MINUS_ONE = -1;
private static final String OPEN_BRACKET = "(";
private static final String CLOSE_BRACKET = ")";
/** The parent WorkflowDescription. */
private final WorkflowDescription model;
/** The new WorkflowNode. */
private final List<WorkflowNode> nodes;
/** The new WorkflowNode. */
private final List<Connection> connections;
/** The new WorkflowNode. */
private final List<WorkflowLabel> labels;
/** The constraints. */
private final List<Rectangle> nodeConstraints;
/** The logger. */
private final Log log = LogFactory.getLog(getClass());
private final List<Rectangle> labelConstraints;
/**
* Constructor.
*
* @param node The new WorkflowNode.
* @param model The parent WorkflowDescription.
* @param labelConstraintsToCreate
* @param constraint The constraints for the new node.
*/
public WorkflowNodeLabelConnectionCreateCommand(List<WorkflowNode> nodes, List<WorkflowLabel> labels, List<Connection> connections,
WorkflowDescription model, List<Rectangle> nodeConstraints, List<Rectangle> labelConstraintsToCreate) {
this.nodes = nodes;
this.connections = connections;
this.labels = labels;
this.model = model;
this.nodeConstraints = nodeConstraints;
this.labelConstraints = labelConstraintsToCreate;
}
@Override
public void undo() {
if (connections != null) {
model.removeConnections(connections);
}
if (nodes != null) {
model.removeWorkflowNodes(nodes);
}
if (labels != null) {
for (WorkflowLabel label : labels) {
model.removeWorkflowLabel(label);
}
}
}
@Override
public void redo() {
int positionCounter = 0;
if (nodes != null) {
List<WorkflowNode> nodesToAdd = new ArrayList<>();
for (int i = 0; i < nodes.size(); i++) {
nodes.get(i).setLocation(nodeConstraints.get(positionCounter).getLocation().x,
nodeConstraints.get(positionCounter).getLocation().y);
positionCounter++;
nodesToAdd.add(nodes.get(i));
}
model.addWorkflowNodes(nodesToAdd);
}
if (connections != null) {
model.addConnections(connections);
}
positionCounter = 0;
if (labels != null) {
for (int i = 0; i < labels.size(); i++) {
labels.get(i).setLocation(labelConstraints.get(positionCounter).getLocation().x,
labelConstraints.get(positionCounter).getLocation().y);
Dimension size = new Dimension(WorkflowLabel.DEFAULT_WIDTH, WorkflowLabel.DEFAULT_HEIGHT);
if (labelConstraints.get(positionCounter).getSize().width != MINUS_ONE
&& labelConstraints.get(positionCounter).getSize().height != MINUS_ONE) {
size = new Dimension(labelConstraints.get(positionCounter).getSize().width,
labelConstraints.get(positionCounter).getSize().height);
}
if (size.width == 0) {
size.width = WorkflowLabel.DEFAULT_WIDTH;
}
if (size.height == 0) {
size.height = WorkflowLabel.DEFAULT_HEIGHT;
}
labels.get(i).setSize(size.width, size.height);
positionCounter++;
model.addWorkflowLabel(labels.get(i));
}
}
positionCounter = 0;
}
@Override
public void execute() {
if (nodes != null) {
for (WorkflowNode node : nodes) {
if (node.getName() == null || node.getName().isEmpty()) {
node.setName(getName(node.getComponentDescription().getName()));
}
}
}
redo();
// open properties tab
String message = "Open Properties view failed";
try {
PlatformUI.getWorkbench().getActiveWorkbenchWindow().
getActivePage().showView("org.eclipse.ui.views.PropertySheet");
PlatformUI.getWorkbench().getActiveWorkbenchWindow().
getActivePage().getActiveEditor().setFocus();
} catch (PartInitException e) {
log.error(message, e);
} catch (NullPointerException e) {
log.error(message, e);
}
}
/** Helper methods which returns the next unused default name of a component. */
private String getName(String name) {
int count = 0;
for (WorkflowNode n : model.getWorkflowNodes()) {
if (n.getName().equals(name)) {
if (name.contains(OPEN_BRACKET)) {
try {
int index = name.lastIndexOf(OPEN_BRACKET) + 1;
count = Integer.valueOf(name.substring(index, name.lastIndexOf(CLOSE_BRACKET)));
} catch (NumberFormatException e) {
count = 0;
}
name = name.substring(0, name.lastIndexOf(OPEN_BRACKET));
}
count++;
if (count == 1) {
name += " ";
}
return getName(name + OPEN_BRACKET + count + CLOSE_BRACKET);
}
}
return name;
}
}