/*
* 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.client.lienzo.components.palette.impl;
import java.util.LinkedList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.enterprise.context.Dependent;
import javax.inject.Inject;
import com.ait.lienzo.client.core.shape.Layer;
import org.kie.workbench.common.stunner.client.lienzo.components.palette.AbstractLienzoGlyphItemsPalette;
import org.kie.workbench.common.stunner.client.lienzo.components.palette.LienzoDefinitionSetPalette;
import org.kie.workbench.common.stunner.client.lienzo.components.palette.LienzoGlyphItemsPalette;
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.components.palette.view.LienzoHoverPaletteView;
import org.kie.workbench.common.stunner.core.client.api.ShapeManager;
import org.kie.workbench.common.stunner.core.client.components.glyph.DefinitionGlyphTooltip;
import org.kie.workbench.common.stunner.core.client.components.glyph.GlyphTooltip;
import org.kie.workbench.common.stunner.core.client.components.palette.ClientPaletteUtils;
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.DefinitionPaletteCategory;
import org.kie.workbench.common.stunner.core.client.components.palette.model.definition.DefinitionPaletteItem;
import org.kie.workbench.common.stunner.core.client.components.palette.model.definition.DefinitionSetPalette;
import org.kie.workbench.common.stunner.core.client.components.palette.view.PaletteGrid;
@Dependent
public class LienzoDefinitionSetPaletteImpl
extends AbstractLienzoGlyphItemsPalette<DefinitionSetPalette, LienzoHoverPaletteView>
implements LienzoDefinitionSetPalette {
private final LienzoGlyphsHoverPalette glyphsFloatingPalette;
private final List<GlyphPaletteItem> items = new LinkedList<>();
protected LienzoDefinitionSetPaletteImpl() {
this(null,
null,
null,
null);
}
@Inject
public LienzoDefinitionSetPaletteImpl(final ShapeManager shapeManager,
final LienzoHoverPaletteView view,
final DefinitionGlyphTooltip definitionGlyphTooltip,
final LienzoGlyphsHoverPalette glyphsFloatingPalette) {
super(shapeManager,
definitionGlyphTooltip,
view);
this.glyphsFloatingPalette = glyphsFloatingPalette;
}
@PostConstruct
public void init() {
super.doInit();
onShowGlyTooltip((glyphTooltip,
item,
mouseX,
mouseY,
itemX,
itemY) -> {
if (!hasPaletteItems(item)) {
glyphTooltip.show(getGlyphTooltipText(item),
mouseX,
mouseY,
GlyphTooltip.Direction.WEST);
}
return false;
});
glyphsFloatingPalette.setExpandable(false);
glyphsFloatingPalette.setLayout(LienzoPalette.Layout.HORIZONTAL);
glyphsFloatingPalette.onClose(floatingPaletteCloseCallback);
glyphsFloatingPalette.onShowGlyTooltip(floatingPaletteGlyphTooltipCallback);
}
@Override
protected void doItemHover(final String id,
final double mouseX,
final double mouseY,
final double itemX,
final double itemY) {
super.doItemHover(id,
mouseX,
mouseY,
itemX,
itemY);
showFloatingPalette(id,
mouseX,
mouseY,
itemX,
itemY);
}
private final CloseCallback floatingPaletteCloseCallback = () -> {
clearFloatingPalette();
return true;
};
private final LienzoGlyphItemsPalette.GlyphTooltipCallback floatingPaletteGlyphTooltipCallback =
(glyphTooltip,
item,
mouseX,
mouseY,
itemX,
itemY) -> {
// final int[] mainPaletteSize = getMainPaletteSize();
// final double px = getView().getX() + mainPaletteSize[0] + itemX;
// final double py = getView().getY() + itemY + ( getIconSize() / 2 ) - getPadding();
glyphTooltip.show(getGlyphTooltipText(item),
mouseX,
mouseY + getIconSize() + getPadding(),
GlyphTooltip.Direction.NORTH);
return false;
};
// TODO: I18n.
private String getGlyphTooltipText(final GlyphPaletteItem item) {
return "Create a " + item.getTitle();
}
@Override
protected void doBind() {
items.clear();
final DefinitionSetPalette definitionSetPalette = paletteDefinition;
final String ssid = shapeManager.getDefaultShapeSet(paletteDefinition.getDefinitionSetId()).getId();
glyphsFloatingPalette.setShapeSetId(ssid);
final List<DefinitionPaletteCategory> categories = definitionSetPalette.getItems();
if (null != categories && !categories.isEmpty()) {
final PaletteGrid grid = getGrid();
for (final DefinitionPaletteCategory category : categories) {
final List<DefinitionPaletteItem> categoryItems = category.getItems();
if (null != categoryItems && !categoryItems.isEmpty()) {
for (final GlyphPaletteItem item : categoryItems) {
addGlyphItemIntoView(item,
grid);
items.add(item);
}
}
}
}
}
@Override
public List<GlyphPaletteItem> getItems() {
return items;
}
@Override
protected void doDestroy() {
super.doDestroy();
}
@SuppressWarnings("unchecked")
private boolean showFloatingPalette(final String id,
final double x,
final double y,
final double itemX,
final double itemY) {
final GlyphPaletteItem item = getItem(id);
if (hasPaletteItems(item)) {
final HasPaletteItems<GlyphPaletteItem> hasPaletteItems = (HasPaletteItems<GlyphPaletteItem>) item;
glyphsFloatingPalette.setIconSize(getIconSize());
glyphsFloatingPalette.setPadding(getPadding());
glyphsFloatingPalette.bind(hasPaletteItems);
final int[] mainPaletteSize = getMainPaletteSize();
final double pX = getView().getX() + mainPaletteSize[0] - (getPadding() * 1.5) - getIconSize();
final double pY = getView().getY() + itemY - (getPadding() * 3) + (getIconSize() / 2);
final Layer paletteLayer = getView().getLayer();
glyphsFloatingPalette
.getView()
.attach(paletteLayer)
.setX(pX)
.setY(pY);
glyphsFloatingPalette.onItemHover((id12,
mouseX,
mouseY,
itemX12,
itemY12) -> {
getView().clearTimeOut();
return true;
});
glyphsFloatingPalette.onItemOut(id13 -> {
getView().startTimeOut();
return false;
});
glyphsFloatingPalette.onItemClick(new ItemClickCallback() {
@Override
public boolean onItemClick(final String id14,
final double mouseX,
final double mouseY,
final double itemX,
final double itemY) {
final GlyphPaletteItem item1 = getPaletteItem(id14,
hasPaletteItems.getItems());
if (!hasPaletteItems(item1)) {
// Fire the main palette's callback.
LienzoDefinitionSetPaletteImpl.this.onItemClick(id14,
mouseX,
mouseY,
getView().getX(),
getView().getY());
}
clearFloatingPalette();
return true;
}
});
glyphsFloatingPalette.getView().show();
return false;
}
return true;
}
@Override
protected String getPaletteItemId(final int index) {
final GlyphPaletteItem item = getMainPaletteItem(index);
return null != item ? item.getId() : null;
}
private void clearFloatingPalette() {
glyphsFloatingPalette.getView().clear();
}
private void hideFloatingPalette() {
glyphsFloatingPalette.getView().hide();
}
private int[] getMainPaletteSize() {
double width = 0;
double height = 0;
if (null != paletteDefinition) {
final List<? extends GlyphPaletteItem> items = getItems();
final int itemsSize = null != items ? items.size() : 0;
final double[] mainPaletteSize = ClientPaletteUtils.computeSizeForVerticalLayout(itemsSize,
getIconSize(),
getPadding(),
0);
width = mainPaletteSize[0];
height = mainPaletteSize[1];
}
return new int[]{(int) width, (int) height};
}
private boolean hasPaletteItems(final GlyphPaletteItem item) {
return item instanceof HasPaletteItems;
}
private GlyphPaletteItem getMainPaletteItem(final int index) {
return getItems().get(index);
}
private GlyphPaletteItem getPaletteItem(final String id,
final List<GlyphPaletteItem> items) {
if (null != items && !items.isEmpty()) {
for (final GlyphPaletteItem item : items) {
if (item.getId().equals(id)) {
return item;
}
}
}
return null;
}
private int getPadding() {
return getGrid().getPadding();
}
private int getIconSize() {
return getGrid().getIconSize();
}
}