/*
* 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.toolbox.builder;
import com.ait.lienzo.client.core.shape.Shape;
import com.ait.lienzo.client.core.shape.wires.WiresShape;
import org.kie.workbench.common.stunner.client.lienzo.LienzoLayer;
import org.kie.workbench.common.stunner.client.lienzo.components.toolbox.LienzoToolbox;
import org.kie.workbench.common.stunner.client.lienzo.components.toolbox.LienzoToolboxButtonGrid;
import org.kie.workbench.common.stunner.core.client.canvas.Layer;
import org.kie.workbench.common.stunner.core.client.components.toolbox.ToolboxButton;
import org.kie.workbench.common.stunner.core.client.shape.view.HasEventHandlers;
import org.kie.workbench.common.stunner.core.client.shape.view.ShapeView;
import org.kie.workbench.common.stunner.lienzo.toolbox.Toolboxes;
import org.kie.workbench.common.stunner.lienzo.toolbox.builder.Button;
import org.kie.workbench.common.stunner.lienzo.toolbox.builder.ButtonGrid;
import org.kie.workbench.common.stunner.lienzo.toolbox.builder.ButtonsOrRegister;
import org.kie.workbench.common.stunner.lienzo.toolbox.builder.On;
import org.kie.workbench.common.stunner.lienzo.toolbox.event.ToolboxButtonEventHandler;
public class LienzoToolboxBuilderImpl
implements LienzoToolboxBuilder<LienzoToolboxBuilderImpl> {
private Layer layer;
private LienzoToolbox toolbox;
private On on;
private ButtonGrid buttonGrid;
private ButtonsOrRegister buttonsOrRegister;
private int padding = 5;
private int iconSize = 12;
@Override
public LienzoToolboxBuilderImpl forLayer(final Layer layer) {
this.layer = layer;
return this;
}
@Override
@SuppressWarnings("unchecked")
public LienzoToolboxBuilderImpl forView(final ShapeView<?> view) {
if (view instanceof WiresShape) {
final LienzoLayer lienzoLayerImpl = (LienzoLayer) this.layer;
final com.ait.lienzo.client.core.shape.Layer lienzoLayer = lienzoLayerImpl.getLienzoLayer();
on = Toolboxes.staticToolBoxFor(lienzoLayer,
(WiresShape) view);
if (view instanceof HasEventHandlers) {
final HasEventHandlers<?, Shape<?>> hasEventHandlers = (HasEventHandlers) view;
if (null != hasEventHandlers.getAttachableShape()) {
on.attachTo(hasEventHandlers.getAttachableShape());
}
}
}
return this;
}
@Override
public LienzoToolboxBuilderImpl direction(final Direction ond,
final Direction towards) {
final com.ait.lienzo.shared.core.types.Direction dOn = getDirection(ond);
final com.ait.lienzo.shared.core.types.Direction dT = getDirection(towards);
buttonGrid = on.on(dOn).towards(dT);
return this;
}
@Override
public LienzoToolboxBuilderImpl grid(final LienzoToolboxButtonGrid grid) {
this.padding = grid.getPadding();
this.iconSize = grid.getButtonSize();
buttonsOrRegister = buttonGrid.grid(grid.getPadding(),
grid.getButtonSize(),
grid.getRows(),
grid.getColumns());
return this;
}
@Override
public LienzoToolboxBuilderImpl add(final ToolboxButton<Shape<?>> button) {
Button b = buttonsOrRegister.add(button.getIcon());
b.setIconSize(iconSize).setPadding(padding);
if (null != button.getClickHandler()) {
b.setClickHandler(buildHandler(button.getClickHandler()));
}
if (null != button.getMouseDownHandler()) {
b.setMouseDownHandler(buildHandler(button.getMouseDownHandler()));
}
if (null != button.getMouseEnterHandler()) {
b.setMouseEnterHandler(buildHandler(button.getMouseEnterHandler()));
}
if (null != button.getMouseExitHandler()) {
b.setMouseExitHandler(buildHandler(button.getMouseExitHandler()));
}
b.end();
return this;
}
private ToolboxButtonEventHandler buildHandler(final org.kie.workbench.common.stunner.core.client.components.toolbox.event.ToolboxButtonEventHandler handler) {
return event -> handler.fire(new org.kie.workbench.common.stunner.core.client.components.toolbox.event.ToolboxButtonEvent() {
@Override
public int getX() {
return event.getX();
}
@Override
public int getY() {
return event.getY();
}
@Override
public int getAbsoluteX() {
return event.getAbsoluteX();
}
@Override
public int getAbsoluteY() {
return event.getAbsoluteY();
}
@Override
public int getClientX() {
return event.getClientX();
}
@Override
public int getClientY() {
return event.getClientY();
}
});
}
@Override
public LienzoToolbox build() {
if (null != buttonsOrRegister) {
toolbox = new LienzoToolbox(buttonsOrRegister.register());
} else {
throw new RuntimeException("No buttons added for toolbox.");
}
return toolbox;
}
private com.ait.lienzo.shared.core.types.Direction getDirection(final Direction direction) {
switch (direction) {
case EAST:
return com.ait.lienzo.shared.core.types.Direction.EAST;
case WEST:
return com.ait.lienzo.shared.core.types.Direction.WEST;
case NORTH:
return com.ait.lienzo.shared.core.types.Direction.NORTH;
case SOUTH:
return com.ait.lienzo.shared.core.types.Direction.SOUTH;
case NORTH_EAST:
return com.ait.lienzo.shared.core.types.Direction.NORTH_EAST;
case NORTH_WEST:
return com.ait.lienzo.shared.core.types.Direction.NORTH_WEST;
case SOUTH_EAST:
return com.ait.lienzo.shared.core.types.Direction.SOUTH_EAST;
case SOUTH_WEST:
return com.ait.lienzo.shared.core.types.Direction.SOUTH_WEST;
}
throw new UnsupportedOperationException("Toolbox direction [" + direction.name() + "] not supported.");
}
}