/*
* 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.client.lienzo.canvas.controls.toolbox.command.palette;
import javax.annotation.PostConstruct;
import javax.enterprise.context.Dependent;
import javax.enterprise.event.Event;
import javax.inject.Inject;
import com.ait.lienzo.client.core.shape.Shape;
import org.kie.workbench.common.stunner.client.lienzo.LienzoLayer;
import org.kie.workbench.common.stunner.client.lienzo.components.palette.AbstractLienzoGlyphItemsPalette;
import org.kie.workbench.common.stunner.client.lienzo.components.palette.LienzoGlyphsHoverPalette;
import org.kie.workbench.common.stunner.client.lienzo.components.palette.LienzoPalette;
import org.kie.workbench.common.stunner.client.lienzo.util.SVGUtils;
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.Point2D;
import org.kie.workbench.common.stunner.core.client.canvas.Transform;
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.controls.toolbox.command.palette.AbstractPaletteMorphCommand;
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.glyph.GlyphTooltip;
import org.kie.workbench.common.stunner.core.client.components.palette.model.definition.DefinitionsPalette;
import org.kie.workbench.common.stunner.core.client.components.palette.model.definition.DefinitionsPaletteBuilder;
import org.kie.workbench.common.stunner.core.client.components.palette.view.PaletteView;
import org.kie.workbench.common.stunner.core.client.service.ClientFactoryService;
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;
@Dependent
public class LienzoPaletteMorphToolboxCommand extends AbstractPaletteMorphCommand<Shape<?>> {
private static final int ICON_SIZE = 20;
private static final int PADDING = 10;
@Inject
public LienzoPaletteMorphToolboxCommand(final DefinitionUtils definitionUtils,
final CanvasCommandFactory<AbstractCanvasHandler> commandFactory,
final ClientFactoryService clientFactoryServices,
final CommonLookups commonLookups,
final ShapeManager shapeManager,
final DefinitionsPaletteBuilder definitionsPaletteBuilder,
final LienzoGlyphsHoverPalette palette,
final NodeDragProxy<AbstractCanvasHandler> nodeDragProxyFactory,
final NodeBuilderControl<AbstractCanvasHandler> nodeBuilderControl,
final GraphBoundsIndexer graphBoundsIndexer,
final Event<CanvasElementSelectedEvent> elementSelectedEvent) {
super(definitionUtils,
commandFactory,
clientFactoryServices,
commonLookups,
shapeManager,
definitionsPaletteBuilder,
palette,
nodeDragProxyFactory,
nodeBuilderControl,
graphBoundsIndexer,
SVGUtils.createSVGIcon(SVGUtils.getGearIcon()),
elementSelectedEvent);
}
@PostConstruct
public void init() {
// Initialize some lienzo palette layout stuff.
getLienzoPalette()
.collapse()
.setExpandable(false)
.setIconSize(ICON_SIZE)
.setPadding(PADDING)
.setLayout(LienzoPalette.Layout.HORIZONTAL);
// Set the prefix to use on tooltips.
((AbstractLienzoGlyphItemsPalette) getLienzoPalette()).getDefinitionGlyphTooltip().setPrefix("Convert to ");
// Show the tooltip at the right coordinates..
getLienzoPalette().onShowGlyTooltip((glyphTooltip,
item,
mouseX,
mouseY,
itemX, itemY) -> {
final Transform transform = canvasHandler.getCanvas().getLayer().getTransform();
final double ax = canvasHandler.getAbstractCanvas().getAbsoluteX();
final double ay = canvasHandler.getAbstractCanvas().getAbsoluteY();
// As tooltip is a floating view (not part of the canvas), need to transform the cartesian coordinates
// using current transform attributes to obtain the right absolute position on the screen.
final Point2D t = transform.transform(getPaletteView().getX(),
getPaletteView().getY());
glyphTooltip
.showTooltip(item.getDefinitionId(),
ax + t.getX() + itemX,
ay + t.getY() + itemY + ICON_SIZE + (PADDING / 2),
GlyphTooltip.Direction.NORTH);
return false;
});
}
@Override
protected void beforeBindPalette(final DefinitionsPalette paletteDefinition,
final Context<AbstractCanvasHandler> context) {
super.beforeBindPalette(paletteDefinition,
context);
final String ssid = canvasHandler.getDiagram().getMetadata().getShapeSetId();
getLienzoPalette().setShapeSetId(ssid);
}
@Override
protected void showPaletteViewAt(final double x,
final double y) {
// Adjust the palette view taking into account the lienzo shape size used as icon.
super.showPaletteViewAt(x - ICON_SIZE + PADDING,
y + ICON_SIZE);
}
@Override
@SuppressWarnings("unchecked")
protected void attachPaletteView() {
final LienzoLayer lienzoLayer = (LienzoLayer) canvasHandler.getCanvas().getLayer();
getPaletteView().attach(lienzoLayer.getLienzoLayer());
}
@Override
protected PaletteView getPaletteView() {
return getLienzoPalette().getView();
}
private LienzoGlyphsHoverPalette getLienzoPalette() {
return (LienzoGlyphsHoverPalette) palette;
}
}