/*
* Copyright 2017 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.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import javax.enterprise.event.Event;
import org.kie.workbench.common.stunner.core.api.DefinitionManager;
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.NodeBuilderControl;
import org.kie.workbench.common.stunner.core.client.canvas.controls.toolbox.command.Context;
import org.kie.workbench.common.stunner.core.client.canvas.event.selection.CanvasElementSelectedEvent;
import org.kie.workbench.common.stunner.core.client.command.CanvasCommandFactory;
import org.kie.workbench.common.stunner.core.client.components.drag.NodeDragProxy;
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.definition.adapter.MorphAdapter;
import org.kie.workbench.common.stunner.core.definition.morph.MorphDefinition;
import org.kie.workbench.common.stunner.core.graph.Node;
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.DefinitionUtils;
public abstract class AbstractPaletteMorphCommand<I> extends AbstractPaletteCommand<I> {
protected final DefinitionUtils definitionUtils;
protected final CanvasCommandFactory<AbstractCanvasHandler> commandFactory;
protected final Event<CanvasElementSelectedEvent> elementSelectedEvent;
protected final Map<String, MorphDefinition> morphDefinitions = new HashMap<>();
public AbstractPaletteMorphCommand(final DefinitionUtils definitionUtils,
final CanvasCommandFactory<AbstractCanvasHandler> commandFactory,
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,
final Event<CanvasElementSelectedEvent> elementSelectedEvent) {
super(clientFactoryServices,
commonLookups,
shapeManager,
definitionsPaletteBuilder,
palette,
nodeDragProxyFactory,
nodeBuilderControl,
graphBoundsIndexer,
icon);
this.definitionUtils = definitionUtils;
this.commandFactory = commandFactory;
this.elementSelectedEvent = elementSelectedEvent;
}
@Override
@SuppressWarnings("unchecked")
protected Set<String> getDefinitions() {
this.morphDefinitions.clear();
final Object source = this.sourceNode.getContent().getDefinition();
final String id = getDefinitionManager().adapters().forDefinition().getId(source);
final MorphAdapter<Object> morphAdapter = getDefinitionManager().adapters().registry().getMorphAdapter(source.getClass());
final Iterable<MorphDefinition> morphDefinitions = morphAdapter.getMorphDefinitions(source);
if (null != morphDefinitions && morphDefinitions.iterator().hasNext()) {
for (final MorphDefinition morphDefinition : morphDefinitions) {
final Iterable<String> morphTargets = morphAdapter.getTargets(source,
morphDefinition);
if (null != morphTargets && morphTargets.iterator().hasNext()) {
for (final String morphTarget : morphTargets) {
if (!id.equals(morphTarget)) {
this.morphDefinitions.put(morphTarget,
morphDefinition);
}
}
}
}
}
if (!this.morphDefinitions.isEmpty()) {
return new HashSet<>(this.morphDefinitions.keySet());
}
return null;
}
@Override
@SuppressWarnings("unchecked")
protected void onItemSelected(final Context<AbstractCanvasHandler> context,
final String definitionId,
final double x,
final double y) {
final MorphDefinition morphDefinition = morphDefinitions.get(definitionId);
final Node node = (Node) sourceNode;
final String ssid = canvasHandler.getDiagram().getMetadata().getShapeSetId();
context.getCommandManager().execute(canvasHandler,
commandFactory.morphNode(node,
morphDefinition,
definitionId,
ssid));
this.morphDefinitions.clear();
clear();
fireElementSelectedEvent(elementSelectedEvent,
canvasHandler,
node.getUUID());
}
protected DefinitionManager getDefinitionManager() {
return definitionUtils.getDefinitionManager();
}
}