/* * 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; import java.util.LinkedList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import com.ait.lienzo.client.core.shape.Group; import org.kie.workbench.common.stunner.client.lienzo.components.palette.view.LienzoPaletteView; import org.kie.workbench.common.stunner.client.lienzo.components.palette.view.element.LienzoGlyphPaletteItemView; import org.kie.workbench.common.stunner.client.lienzo.components.palette.view.element.LienzoGlyphPaletteItemViewImpl; import org.kie.workbench.common.stunner.client.lienzo.components.palette.view.element.LienzoPaletteElementView; 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.view.PaletteGrid; import org.kie.workbench.common.stunner.core.client.shape.factory.ShapeFactory; import org.kie.workbench.common.stunner.core.client.shape.view.glyph.Glyph; public abstract class AbstractLienzoGlyphItemsPalette<I extends HasPaletteItems<? extends GlyphPaletteItem>, V extends LienzoPaletteView> extends AbstractLienzoPalette<I, V> implements LienzoGlyphItemsPalette<I, V> { private static Logger LOGGER = Logger.getLogger(AbstractLienzoGlyphItemsPalette.class.getName()); protected DefinitionGlyphTooltip<Group> definitionGlyphTooltip; protected GlyphTooltipCallback glyphTooltipCallback; protected final List<LienzoPaletteElementView> itemViews = new LinkedList<LienzoPaletteElementView>(); private ShapeFactory shapeFactory; protected AbstractLienzoGlyphItemsPalette() { this(null, null, null); } public AbstractLienzoGlyphItemsPalette(final ShapeManager shapeManager, final DefinitionGlyphTooltip definitionGlyphTooltip, final V view) { super(shapeManager, view); this.definitionGlyphTooltip = definitionGlyphTooltip; } @Override public LienzoGlyphItemsPalette<I, V> setShapeSetId(final String shapeSetId) { this.shapeFactory = shapeManager.getShapeSet(shapeSetId).getShapeFactory(); return this; } @Override public LienzoGlyphItemsPalette<I, V> onShowGlyTooltip(final GlyphTooltipCallback callback) { this.glyphTooltipCallback = callback; return this; } public DefinitionGlyphTooltip getDefinitionGlyphTooltip() { return definitionGlyphTooltip; } @Override protected void doClose() { super.doClose(); AbstractLienzoGlyphItemsPalette.this.getView().hide(); this.definitionGlyphTooltip.hide(); } @Override protected void beforeBind() { super.beforeBind(); itemViews.clear(); } @Override @SuppressWarnings("unchecked") protected void doBind() { final PaletteGrid grid = getGrid(); for (final GlyphPaletteItem item : getItems()) { addGlyphItemIntoView(item, grid); } } @Override protected void afterBind() { super.afterBind(); doExpandCollapse(); } @SuppressWarnings("unchecked") protected void addGlyphItemIntoView(final GlyphPaletteItem item, final PaletteGrid grid) { final Glyph<Group> glyph = getGlyph(item.getDefinitionId(), grid.getIconSize(), grid.getIconSize()); if (null != glyph) { final LienzoGlyphPaletteItemView paletteItemView = new LienzoGlyphPaletteItemViewImpl(item, getView(), glyph); itemViews.add(paletteItemView); view.add(paletteItemView); } else { LOGGER.log(Level.WARNING, "Could not create glyph for [" + item.getDefinitionId() + "]"); } } @SuppressWarnings("unchecked") protected Glyph<Group> getGlyph(final String id, final double width, final double height) { final ShapeFactory shapeFactory = getShapeFactory(); if (null != shapeFactory) { return shapeFactory.glyph(id, width, height); } LOGGER.log(Level.SEVERE, "No shape factory available."); return null; } @SuppressWarnings("unchecked") public List<GlyphPaletteItem> getItems() { final HasPaletteItems<? extends GlyphPaletteItem> paletteItems = paletteDefinition; return (List<GlyphPaletteItem>) paletteItems.getItems(); } @Override protected String getPaletteItemId(final int index) { final List<GlyphPaletteItem> items = getItems(); if (null != items && items.size() > index) { return items.get(index).getId(); } return null; } @SuppressWarnings("unchecked") @Override public double[] computePaletteSize() { final PaletteGrid grid = getGrid(); String longestTitle = null; if (expanded) { final List<GlyphPaletteItem> paletteItems = getItems(); longestTitle = ClientPaletteUtils.getLongestText(paletteItems); } final int titleLength = null != longestTitle ? longestTitle.length() : 0; if (isHorizontalLayout()) { return ClientPaletteUtils.computeSizeForHorizontalLayout(getItems().size(), grid.getIconSize(), grid.getPadding(), titleLength); } else { return ClientPaletteUtils.computeSizeForVerticalLayout(getItems().size(), grid.getIconSize(), grid.getPadding(), titleLength); } } @Override public boolean onItemHover(final int pos, final double mouseX, final double mouseY, final double itemX, final double itemY) { if (super.onItemHover(pos, mouseX, mouseY, itemX, itemY)) { final GlyphPaletteItem item = getItem(pos); if (null != item) { return onItemHover(item, mouseX, mouseY, itemX, itemY); } } return true; } public GlyphPaletteItem getItem(final int pos) { final LienzoPaletteElementView itemView = itemViews.get(pos); if (itemView instanceof LienzoGlyphPaletteItemView) { final String iid = ((LienzoGlyphPaletteItemView) itemView).getPaletteItem().getId(); return getItem(iid); } return null; } protected GlyphPaletteItem getItem(final String id) { final List<GlyphPaletteItem> paletteItems = getItems(); if (null != paletteItems && !paletteItems.isEmpty()) { for (final GlyphPaletteItem item : paletteItems) { if (item.getId().equals(id)) { return item; } } } return null; } protected boolean onItemHover(final GlyphPaletteItem item, final double mouseX, final double mouseY, final double itemX, final double itemY) { if (null != glyphTooltipCallback) { glyphTooltipCallback.onShowTooltip(definitionGlyphTooltip, item, mouseX, mouseY, itemX, itemY); } else if (!expanded) { final PaletteGrid grid = getGrid(); definitionGlyphTooltip .showTooltip( item.getDefinitionId(), itemX + (grid.getIconSize() / 2), itemY, GlyphTooltip.Direction.WEST); } return true; } @Override public boolean onItemOut(final int index) { if (super.onItemOut(index)) { definitionGlyphTooltip.hide(); } return true; } protected ShapeFactory getShapeFactory() { return shapeFactory; } protected void doExpandCollapse() { for (final LienzoPaletteElementView itemView : itemViews) { if (itemView instanceof LienzoGlyphPaletteItemView) { final LienzoGlyphPaletteItemView glyphPaletteItemView = (LienzoGlyphPaletteItemView) itemView; if (expanded) { glyphPaletteItemView.expand(); } else { glyphPaletteItemView.collapse(); } } } getView().draw(); } @Override protected void doDestroy() { itemViews.clear(); super.doDestroy(); } }