blob: b218b4a4fa75c665d27ec65a6dc2fd49a835465f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.lienzo.client;
import com.ait.lienzo.client.core.event.NodeDragEndEvent;
import com.ait.lienzo.client.core.event.NodeDragEndHandler;
import com.ait.lienzo.client.core.event.NodeDragMoveEvent;
import com.ait.lienzo.client.core.event.NodeDragMoveHandler;
import com.ait.lienzo.client.core.event.NodeDragStartEvent;
import com.ait.lienzo.client.core.event.NodeDragStartHandler;
import com.ait.lienzo.client.core.shape.Arrow;
import com.ait.lienzo.client.core.shape.Circle;
import com.ait.lienzo.client.core.shape.Group;
import com.ait.lienzo.client.core.shape.Text;
import com.ait.lienzo.client.core.types.Point2D;
import com.ait.lienzo.client.widget.panel.LienzoPanel;
import com.ait.lienzo.shared.core.types.ArrowType;
import com.ait.lienzo.shared.core.types.ColorName;
import com.google.gwt.dom.client.Style.Display;
import elemental2.dom.HTMLBRElement;
import elemental2.dom.HTMLDivElement;
import elemental2.dom.HTMLLabelElement;
import elemental2.dom.HTMLOptionElement;
import elemental2.dom.HTMLSelectElement;
import static elemental2.dom.DomGlobal.document;
public class ArrowAttributesExample extends BaseExample implements Example {
private Arrow[] arrows = new Arrow[2];
private HTMLBRElement br = (HTMLBRElement) document.createElement("br");
private HTMLSelectElement select = (HTMLSelectElement) document.createElement("select");
private HTMLOptionElement option = (HTMLOptionElement) document.createElement("option");
private HTMLLabelElement arrowTypeLabel = (HTMLLabelElement) document.createElement("label");
private HTMLLabelElement baseWidthlabel = (HTMLLabelElement) document.createElement("label");
private HTMLSelectElement baseWidthSelect = (HTMLSelectElement) document.createElement("select");
private HTMLLabelElement headWidthlabel = (HTMLLabelElement) document.createElement("label");
private HTMLSelectElement headWidthSelect = (HTMLSelectElement) document.createElement("select");
private HTMLLabelElement arrowAnglelabel = (HTMLLabelElement) document.createElement("label");
private HTMLSelectElement arrowAngleSelect = (HTMLSelectElement) document.createElement("select");
private HTMLLabelElement baseAnglelabel = (HTMLLabelElement) document.createElement("label");
private HTMLSelectElement baseAngleSelect = (HTMLSelectElement) document.createElement("select");
public ArrowAttributesExample(String title) {
super(title);
}
@Override
public void destroy() {
super.destroy();
detach();
}
@Override
public void onResize() {
super.onResize();
console.log("ReDrawing Arrow Example on Resize N/A -->>");
setLocation();
layer.batch();
}
private void setLocation() {
// No need
}
public void detach() {
layer.clear();
br.remove();
arrowTypeLabel.remove();
select.remove();
baseWidthlabel.remove();
baseWidthSelect.remove();
headWidthlabel.remove();
headWidthSelect.remove();
arrowAnglelabel.remove();
arrowAngleSelect.remove();
baseAnglelabel.remove();
baseAngleSelect.remove();
layer.batch();
console.log("Destroying Arrow Attributes --->>");
}
@Override
public void init(final LienzoPanel panel, final HTMLDivElement topDiv) {
super.init(panel, topDiv);
topDiv.style.display = Display.INLINE_BLOCK.getCssName();
detach();
option.label = "at-end";
option.value = "at-end";
select.add(option);
option = (HTMLOptionElement) document.createElement("option");
option.label = "at-start";
option.value = "at-start";
select.add(option);
option = (HTMLOptionElement) document.createElement("option");
option.label = "at-both-ends";
option.value = "at-both-ends";
select.add(option);
option = (HTMLOptionElement) document.createElement("option");
option.label = "at-end-tapered";
option.value = "at-end-tapered";
select.add(option);
option = (HTMLOptionElement) document.createElement("option");
option.label = "at-start-tapered";
option.value = "at-start-tapered";
select.add(option);
arrowTypeLabel.textContent = "Arrow Type:";
baseWidthlabel.textContent = "Base Width:";
headWidthlabel.textContent = "Head Width:";
arrowAnglelabel.textContent = "Arrow Angle:";
baseAnglelabel.textContent = "Base Angle:";
for (int i = 0; i < 200; i += 5) {
addOption(i, baseWidthSelect, i == 30);
addOption(i, headWidthSelect, i == 50);
addOption(i, arrowAngleSelect, i == 45);
addOption(i, baseAngleSelect, i == 45);
}
topDiv.appendChild(br);
topDiv.appendChild(arrowTypeLabel);
topDiv.appendChild(select);
topDiv.appendChild(baseWidthlabel);
topDiv.appendChild(baseWidthSelect);
topDiv.appendChild(headWidthlabel);
topDiv.appendChild(headWidthSelect);
topDiv.appendChild(arrowAnglelabel);
topDiv.appendChild(arrowAngleSelect);
topDiv.appendChild(baseAnglelabel);
topDiv.appendChild(baseAngleSelect);
select.onchange = (e) -> {
switch (select.value) {
case "at-end":
arrows[0].setArrowType(ArrowType.AT_END);
arrows[1].setArrowType(ArrowType.AT_END);
break;
case "at-start":
arrows[0].setArrowType(ArrowType.AT_START);
arrows[1].setArrowType(ArrowType.AT_START);
break;
case "at-both-ends":
arrows[0].setArrowType(ArrowType.AT_BOTH_ENDS);
arrows[1].setArrowType(ArrowType.AT_BOTH_ENDS);
break;
case "at-end-tapered":
arrows[0].setArrowType(ArrowType.AT_END_TAPERED);
arrows[1].setArrowType(ArrowType.AT_END_TAPERED);
break;
case "at-start-tapered":
arrows[0].setArrowType(ArrowType.AT_START_TAPERED);
arrows[1].setArrowType(ArrowType.AT_START_TAPERED);
break;
}
arrows[0].getScene().draw();
arrows[1].getScene().draw();
layer.batch();
return null;
};
baseWidthSelect.onchange = (e) -> {
double baseWidth = Double.parseDouble(baseWidthSelect.value);
arrows[0].setBaseWidth(baseWidth);
arrows[1].setBaseWidth(baseWidth);
arrows[0].getScene().draw();
arrows[1].getScene().draw();
layer.batch();
return null;
};
headWidthSelect.onchange = (e) -> {
double headWidth = Double.parseDouble(headWidthSelect.value);
arrows[0].setHeadWidth(headWidth);
arrows[1].setHeadWidth(headWidth);
arrows[0].getScene().draw();
arrows[1].getScene().draw();
layer.batch();
return null;
};
arrowAngleSelect.onchange = (e) -> {
double arrowAngle = Double.parseDouble(arrowAngleSelect.value);
arrows[0].setArrowAngle(arrowAngle);
arrows[1].setArrowAngle(arrowAngle);
arrows[0].getScene().draw();
arrows[1].getScene().draw();
layer.batch();
return null;
};
baseAngleSelect.onchange = (e) -> {
double baseAngle = Double.parseDouble(baseAngleSelect.value);
arrows[0].setBaseAngle(baseAngle);
arrows[1].setBaseAngle(baseAngle);
arrows[0].getScene().draw();
arrows[1].getScene().draw();
layer.batch();
return null;
};
}
private void addOption(int value, HTMLSelectElement select, boolean selected) {
HTMLOptionElement option = (HTMLOptionElement) document.createElement("option");
option.label = "" + value;
option.value = "" + value;
option.selected = selected;
select.add(option);
}
@Override
public void run() {
Point2D start = new Point2D(100, 100);
Point2D end = new Point2D(200, 200);
Arrow arrow = new Arrow(start, end, 30, 50, 45, 45, ArrowType.AT_END);
arrow.setStrokeColor(ColorName.BLACK);
arrow.setStrokeWidth(1);
arrow.setFillColor(ColorName.YELLOW);
layer.add(arrow);
arrows[0] = arrow;
Arrow dragArrow = new Arrow(start, end, 30, 50, 45, 45, ArrowType.AT_END);
dragArrow.setStrokeColor(ColorName.GREY);
dragArrow.setStrokeWidth(1);
dragArrow.setVisible(false);
arrows[1] = dragArrow;
DragHandle startHandle = new DragHandle("start", true, arrow, dragArrow);
startHandle.setLocation(start);
layer.add(startHandle);
DragHandle endHandle = new DragHandle("end", false, arrow, dragArrow);
endHandle.setLocation(end);
layer.add(endHandle);
}
public static class DragHandle extends Group implements NodeDragStartHandler,
NodeDragMoveHandler,
NodeDragEndHandler {
private Arrow arrow, dragArrow;
private boolean start;
public DragHandle(String text, boolean start, Arrow arrow, Arrow dragArrow) {
Circle circle = new Circle(3);
circle.setFillColor(ColorName.BLACK.getColor().setA(0.5));
add(circle);
Text txt = new Text(text, "Arial, sans-serif", 10);
txt.setX(-10).setY(15);
txt.setFillColor(ColorName.BLACK);
add(txt);
this.arrow = arrow;
this.dragArrow = dragArrow;
this.start = start;
setDraggable(true);
addNodeDragStartHandler(this);
addNodeDragMoveHandler(this);
addNodeDragEndHandler(this);
}
@Override
public void onNodeDragStart(NodeDragStartEvent event) {
if (dragArrow.getParent() == null) {
getViewport().getDragLayer().add(dragArrow);
dragArrow.moveToBottom();
}
if (start) {
dragArrow.setStart(new Point2D(event.getX(), event.getY()));
} else {
dragArrow.setEnd(new Point2D(event.getX(), event.getY()));
}
dragArrow.setVisible(true);
arrow.getScene().draw();
}
@Override
public void onNodeDragMove(NodeDragMoveEvent event) {
if (start) {
dragArrow.setStart(new Point2D(event.getX(), event.getY()));
} else {
dragArrow.setEnd(new Point2D(event.getX(), event.getY()));
}
arrow.setStrokeColor(ColorName.GRAY);
arrow.setFillColor(ColorName.TRANSPARENT);
arrow.setStart(dragArrow.getStart());
arrow.setEnd(dragArrow.getEnd());
arrow.getScene().draw();
}
@Override
public void onNodeDragEnd(NodeDragEndEvent event) {
if (start) {
dragArrow.setStart(new Point2D(event.getX(), event.getY()));
} else {
dragArrow.setEnd(new Point2D(event.getX(), event.getY()));
}
dragArrow.setVisible(false);
arrow.setStart(dragArrow.getStart());
arrow.setEnd(dragArrow.getEnd());
arrow.setVisible(true);
arrow.setFillColor(ColorName.YELLOW);
arrow.setStrokeColor(ColorName.BLACK);
arrow.getScene().draw();
}
}
public void update(int baseWidth, int headWidth, int arrowAngle, int baseAngle, ArrowType arrowType) {
for (int i = 0; i < 2; i++) {
Arrow a = arrows[i];
a.setBaseWidth(baseWidth);
a.setHeadWidth(headWidth);
a.setArrowAngle(arrowAngle);
a.setBaseAngle(baseAngle);
a.setArrowType(arrowType);
}
layer.draw();
}
}