use of org.kie.workbench.common.stunner.core.client.command.CanvasViolation in project kie-wb-common by kiegroup.
the class DrawCanvasCommand method execute.
@Override
@SuppressWarnings("unchecked")
public CommandResult<CanvasViolation> execute(final AbstractCanvasHandler context) {
final Graph graph = context.getGraphIndex().getGraph();
final String shapeSetId = getShapeSetId(context);
final CompositeCommand.Builder<AbstractCanvasHandler, CanvasViolation> commandBuilder = new CompositeCommand.Builder<AbstractCanvasHandler, CanvasViolation>().forward();
// Aggregate all nodes in the parent-child-dock hierarchy.
childrenTraverseProcessor.traverse(graph, new AbstractChildrenTraverseCallback<Node<View, Edge>, Edge<Child, Node>>() {
@Override
public void startNodeTraversal(final Node<View, Edge> node) {
super.startNodeTraversal(node);
if (!isCanvasRoot().test(context, node.getUUID())) {
addNode(node);
}
}
@Override
public boolean startNodeTraversal(final List<Node<View, Edge>> parents, final Node<View, Edge> node) {
super.startNodeTraversal(parents, node);
final Optional<Edge> dockEdge = node.getInEdges().stream().filter(e -> e.getContent() instanceof Dock).findAny();
final Node parent = dockEdge.map(Edge::getSourceNode).orElseGet(() -> parents.get(parents.size() - 1));
if (dockEdge.isPresent()) {
addDockedNode(parent, node);
} else if (isCanvasRoot().test(context, parent.getUUID())) {
addNode(node);
} else {
addChildNode(parent, node);
}
return true;
}
private void addNode(final Node node) {
commandBuilder.addCommand(new AddCanvasNodeCommand(node, shapeSetId));
}
private void addChildNode(final Node<View, Edge> parent, final Node<View, Edge> node) {
commandBuilder.addCommand(new AddCanvasChildNodeCommand(parent, node, shapeSetId));
}
private void addDockedNode(final Node<View, Edge> parent, final Node<View, Edge> node) {
commandBuilder.addCommand(new AddCanvasDockedNodeCommand(parent, node, shapeSetId));
}
});
// Aggregate all connectors.
viewTraverseProcessor.traverse(graph, new AbstractContentTraverseCallback<View<?>, Node<View, Edge>, Edge<View<?>, Node>>() {
@Override
public void startEdgeTraversal(final Edge<View<?>, Node> edge) {
super.startEdgeTraversal(edge);
commandBuilder.addCommand(new AddCanvasConnectorCommand(edge, shapeSetId));
}
});
return commandBuilder.build().execute(context);
}
use of org.kie.workbench.common.stunner.core.client.command.CanvasViolation in project kie-wb-common by kiegroup.
the class AbstractElementBuilderControl method getElementCommands.
@SuppressWarnings("unchecked")
public void getElementCommands(final Element element, final Node<View<?>, Edge> parent, final double x, final double y, final CommandsCallback commandsCallback) {
Command<AbstractCanvasHandler, CanvasViolation> command = null;
if (element instanceof Node) {
if (null != parent) {
command = canvasCommandFactory.addChildNode(parent, (Node) element, getShapeSetId());
} else {
command = canvasCommandFactory.addNode((Node) element, getShapeSetId());
}
} else if (element instanceof Edge && null != parent) {
command = canvasCommandFactory.addConnector(parent, (Edge) element, MagnetConnection.Builder.forElement(parent), getShapeSetId());
} else {
throw new RuntimeException("Unrecognized element type for " + element);
}
// Execute both add element and move commands in batch, so undo will be done in batch as well.
Command<AbstractCanvasHandler, CanvasViolation> moveCanvasElementCommand = canvasCommandFactory.updatePosition((Node<View<?>, Edge>) element, new Point2D(x, y));
final List<Command<AbstractCanvasHandler, CanvasViolation>> commandList = new LinkedList<Command<AbstractCanvasHandler, CanvasViolation>>();
commandList.add(command);
commandList.add(moveCanvasElementCommand);
commandsCallback.onComplete(element.getUUID(), commandList);
}
use of org.kie.workbench.common.stunner.core.client.command.CanvasViolation in project kie-wb-common by kiegroup.
the class DeleteSelectionSessionCommand method execute.
@Override
@SuppressWarnings("unchecked")
public <V> void execute(final Callback<V> callback) {
checkNotNull("callback", callback);
if (null != getSession().getSelectionControl()) {
final AbstractCanvasHandler canvasHandler = (AbstractCanvasHandler) getSession().getCanvasHandler();
final SelectionControl<AbstractCanvasHandler, Element> selectionControl = getSession().getSelectionControl();
final Collection<String> selectedItems = selectionControl.getSelectedItems();
if (selectedItems != null && !selectedItems.isEmpty()) {
// Execute the commands.
final CommandResult<CanvasViolation> result = sessionCommandManager.execute(canvasHandler, canvasCommandFactory.delete(selectedItems.stream().map(uuid -> canvasHandler.getGraphIndex().get(uuid)).collect(Collectors.toList())));
// Check the results.
if (!CommandUtils.isError(result)) {
callback.onSuccess();
} else {
callback.onError((V) new ClientRuntimeError("Error deleing elements [message=" + result.toString() + "]"));
}
} else {
callback.onError((V) new ClientRuntimeError("Cannot delete element, no element selected on canvas"));
}
selectionControl.clearSelection();
clearSelectionEvent.fire(new CanvasClearSelectionEvent(getCanvasHandler()));
}
}
use of org.kie.workbench.common.stunner.core.client.command.CanvasViolation in project kie-wb-common by kiegroup.
the class PasteSelectionSessionCommand method processConnectors.
private CommandResult<CanvasViolation> processConnectors(Counter processedNodesCountdown) {
if (processedNodesCountdown.equalsToValue(0)) {
final CompositeCommand.Builder<AbstractCanvasHandler, CanvasViolation> commandBuilder = createCommandBuilder();
commandBuilder.addCommands(clipboardControl.getElements().stream().filter(element -> element instanceof Edge).filter(Objects::nonNull).map(edge -> (Edge) edge).filter(edge -> Objects.nonNull(edge.getSourceNode()) && Objects.nonNull(clonedElements.get(edge.getSourceNode().getUUID())) && Objects.nonNull(edge.getTargetNode()) && Objects.nonNull(clonedElements.get(edge.getTargetNode().getUUID()))).map(edge -> canvasCommandFactory.cloneConnector(edge, clonedElements.get(edge.getSourceNode().getUUID()), clonedElements.get(edge.getTargetNode().getUUID()), getCanvasHandler().getDiagram().getMetadata().getShapeSetId(), cloneEdgeCallback(edge))).collect(Collectors.toList()));
return sessionCommandManager.execute(getCanvasHandler(), commandBuilder.build());
}
return new CanvasCommandResultBuilder().build();
}
use of org.kie.workbench.common.stunner.core.client.command.CanvasViolation in project kie-wb-common by kiegroup.
the class PasteSelectionSessionCommand method execute.
@Override
public <V> void execute(final Callback<V> callback) {
checkNotNull("callback", callback);
if (clipboardControl.hasElements()) {
final CompositeCommand.Builder<AbstractCanvasHandler, CanvasViolation> nodesCommandBuilder = createCommandBuilder();
Counter processedNodesCountdown = new Counter((int) clipboardControl.getElements().stream().filter(element -> element instanceof Node).count());
// first processing nodes
nodesCommandBuilder.addCommands(clipboardControl.getElements().stream().filter(element -> element instanceof Node).filter(Objects::nonNull).map(node -> (Node<View<?>, Edge>) node).map(node -> {
String newParentUUID = getNewParentUUID(node);
return canvasCommandFactory.cloneNode(node, newParentUUID, calculateNewLocation(node, newParentUUID), cloneNodeCallback(node, processedNodesCountdown));
}).collect(Collectors.toList()));
if (Objects.equals(nodesCommandBuilder.size(), 0)) {
return;
}
// Execute the command for cloning nodes
CommandResult<CanvasViolation> finalResult;
if (wasNodesDeletedFromGraph()) {
// in case of a cut command the source elements were deleted from graph, so first undo the command to take node back into canvas
clipboardControl.getRollbackCommands().forEach(command -> command.undo(getCanvasHandler()));
finalResult = executeCommands(nodesCommandBuilder, processedNodesCountdown);
// after the clone execution than delete source elements again
clipboardControl.getRollbackCommands().forEach(command -> command.execute(getCanvasHandler()));
} else {
// if elements are still on the graph, in case copy command, just execute the clone commands
finalResult = executeCommands(nodesCommandBuilder, processedNodesCountdown);
}
if (CommandUtils.isError(finalResult)) {
LOGGER.severe("Error pasting selection." + getCanvasViolations(finalResult));
return;
}
fireSelectedElementEvent();
callback.onSuccess();
clear();
// copy the cloned node to the clipboard to allow pasting several times
copySelectionSessionCommand.execute();
}
}
Aggregations