/* * Copyright 2016 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.kie.workbench.common.stunner.core.client.canvas.controls.toolbox.command.palette; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; import com.google.gwt.logging.client.LogConfiguration; import org.kie.workbench.common.stunner.core.client.api.ShapeManager; import org.kie.workbench.common.stunner.core.client.canvas.AbstractCanvasHandler; import org.kie.workbench.common.stunner.core.client.canvas.controls.builder.BuilderControl; import org.kie.workbench.common.stunner.core.client.canvas.controls.builder.NodeBuilderControl; import org.kie.workbench.common.stunner.core.client.canvas.controls.builder.request.NodeBuildRequest; import org.kie.workbench.common.stunner.core.client.canvas.controls.builder.request.NodeBuildRequestImpl; import org.kie.workbench.common.stunner.core.client.canvas.controls.toolbox.command.Context; import org.kie.workbench.common.stunner.core.client.canvas.util.CanvasHighlight; import org.kie.workbench.common.stunner.core.client.components.drag.NodeDragProxy; import org.kie.workbench.common.stunner.core.client.components.drag.NodeDragProxyCallback; import org.kie.workbench.common.stunner.core.client.components.palette.Palette; import org.kie.workbench.common.stunner.core.client.components.palette.model.GlyphPaletteItem; import org.kie.workbench.common.stunner.core.client.components.palette.model.HasPaletteItems; import org.kie.workbench.common.stunner.core.client.components.palette.model.definition.DefinitionsPaletteBuilder; import org.kie.workbench.common.stunner.core.client.service.ClientFactoryService; import org.kie.workbench.common.stunner.core.client.service.ClientRuntimeError; import org.kie.workbench.common.stunner.core.client.service.ServiceCallback; import org.kie.workbench.common.stunner.core.client.shape.factory.ShapeFactory; import org.kie.workbench.common.stunner.core.graph.Edge; import org.kie.workbench.common.stunner.core.graph.Element; import org.kie.workbench.common.stunner.core.graph.Node; import org.kie.workbench.common.stunner.core.graph.content.view.View; import org.kie.workbench.common.stunner.core.graph.processing.index.bounds.GraphBoundsIndexer; import org.kie.workbench.common.stunner.core.lookup.util.CommonLookups; import org.kie.workbench.common.stunner.core.util.UUID; public abstract class NewPaletteNodeCommand<I> extends AbstractPaletteCommand<I> { private static Logger LOGGER = Logger.getLogger(NewPaletteNodeCommand.class.getName()); public NewPaletteNodeCommand(final ClientFactoryService clientFactoryServices, final CommonLookups commonLookups, final ShapeManager shapeManager, final DefinitionsPaletteBuilder definitionsPaletteBuilder, final Palette<HasPaletteItems<? extends GlyphPaletteItem>> palette, final NodeDragProxy<AbstractCanvasHandler> nodeDragProxyFactory, final NodeBuilderControl<AbstractCanvasHandler> nodeBuilderControl, final GraphBoundsIndexer graphBoundsIndexer, final I icon) { super(clientFactoryServices, commonLookups, shapeManager, definitionsPaletteBuilder, palette, nodeDragProxyFactory, nodeBuilderControl, graphBoundsIndexer, icon); } protected abstract String getDefinitionSetIdentifier(); protected abstract String getEdgeIdentifier(); @Override @SuppressWarnings("unchecked") protected Set<String> getDefinitions() { // TODO: Finish this implementation & Handle all response buckets/pages. Currently no palettes // are used on toolbox ( no implementation for this class ) final Set<Object> allowedDefinitions = commonLookups.getAllowedTargetDefinitions( getDefinitionSetIdentifier(), canvasHandler.getDiagram().getGraph(), this.sourceNode, getEdgeIdentifier(), 0, 10); return null; } @Override @SuppressWarnings("unchecked") protected void onItemSelected(final Context<AbstractCanvasHandler> context, final String definitionId, final double x, final double y) { clientFactoryServices.newElement(UUID.uuid(), getEdgeIdentifier(), new ServiceCallback<Element>() { @Override public void onSuccess(final Element edgeItem) { final Edge<View<?>, Node> edge = (Edge<View<?>, Node>) edgeItem; // Manually set the source node as the drag def will need it. edge.setSourceNode(sourceNode); final String ssid = canvasHandler.getDiagram().getMetadata().getShapeSetId(); final ShapeFactory<?, AbstractCanvasHandler, ?> shapeFactory = shapeManager.getShapeSet(ssid).getShapeFactory(); clientFactoryServices.newElement(UUID.uuid(), definitionId, new ServiceCallback<Element>() { @Override public void onSuccess(final Element nodeItem) { final Node<View<?>, Edge> node = (Node<View<?>, Edge>) nodeItem; final NodeDragProxy.Item<AbstractCanvasHandler> item = new NodeDragProxy.Item<AbstractCanvasHandler>() { @Override public Node<View<?>, Edge> getNode() { return node; } @Override public ShapeFactory<?, AbstractCanvasHandler, ?> getNodeShapeFactory() { return shapeFactory; } @Override public Edge<View<?>, Node> getInEdge() { return edge; } @Override public Node<View<?>, Edge> getInEdgeSourceNode() { return edge.getSourceNode(); } @Override public ShapeFactory<?, AbstractCanvasHandler, ?> getInEdgeShapeFactory() { return shapeFactory; } }; nodeBuilderControl.enable(canvasHandler); nodeBuilderControl.setCommandManagerProvider(context::getCommandManager); canvasHighlight = new CanvasHighlight(canvasHandler); graphBoundsIndexer.build(canvasHandler.getDiagram().getGraph()); nodeDragProxyFactory .proxyFor(canvasHandler) .show(item, (int) x, (int) y, new NodeDragProxyCallback() { @Override public void onStart(final int x, final int y) { } @Override public void onMove(final int x, final int y) { final NodeBuildRequest request = new NodeBuildRequestImpl(x, y, node, edge); final boolean accepts = nodeBuilderControl.allows(request); if (accepts) { final Node parent = graphBoundsIndexer.getAt(x, y); if (null != parent) { canvasHighlight.unhighLight().highLight(parent); } } else { canvasHighlight.unhighLight(); } } @Override public void onComplete(final int x, final int y) { } @Override public void onComplete(final int x, final int y, final int sourceMagnet, final int targetMagnet) { final NodeBuildRequest request = new NodeBuildRequestImpl(x, y, node, edge, sourceMagnet, targetMagnet); nodeBuilderControl.build(request, new BuilderControl.BuildCallback() { @Override public void onSuccess(final String uuid) { nodeBuilderControl.setCommandManagerProvider(null); nodeBuilderControl.disable(); canvasHighlight.unhighLight(); } @Override public void onError(final ClientRuntimeError error) { log(Level.SEVERE, error.toString()); } }); } }); } @Override public void onError(final ClientRuntimeError error) { log(Level.SEVERE, error.toString()); } }); } @Override public void onError(final ClientRuntimeError error) { log(Level.SEVERE, error.toString()); } }); } private void log(final Level level, final String message) { if (LogConfiguration.loggingIsEnabled()) { LOGGER.log(level, message); } } }