package com.baselet.element.facet.specific; import java.util.Arrays; import java.util.List; import com.baselet.control.basics.geom.Dimension; import com.baselet.control.basics.geom.PointDouble; import com.baselet.diagram.draw.DrawHandler; import com.baselet.element.facet.FirstRunKeyValueFacet; import com.baselet.element.facet.PropertiesParserState; /** * must be in first-run because it manipulates the left buffer which is used by second-run facets * must handle values in parsingFinished when drawer-setup is finished */ public class StateTypeFacet extends FirstRunKeyValueFacet { public static final StateTypeFacet INSTANCE = new StateTypeFacet(); private StateTypeFacet() {} private enum ActionTypeEnum { STATE, SENDER, RECEIVER } @Override public KeyValue getKeyValue() { return new KeyValue("type", new ValueInfo(ActionTypeEnum.STATE, "a default state"), new ValueInfo(ActionTypeEnum.SENDER, "an action which sends a signal"), new ValueInfo(ActionTypeEnum.RECEIVER, "an action which receives a signal")); } @Override public void handleValue(final String value, final PropertiesParserState state) { // only act if parsing is finished to make sure DrawHandler-Setup is finished } private void drawActionState(final DrawHandler drawer, Dimension s) { int radius = Math.min(20, Math.min(s.width, s.height) / 5); drawer.drawRectangleRound(0, 0, s.width, s.height, radius); } private double depth(Dimension s) { return s.width / 5.0; } private PointDouble p(double x, double y) { return new PointDouble(x, y); } @Override public void parsingFinished(PropertiesParserState state, List<String> handledLines) { if (handledLines.isEmpty()) { drawActionState(state.getDrawer(), state.getGridElementSize()); } else if (handledLines.size() == 1) { final PropertiesParserState state1 = state; DrawHandler drawer = state1.getDrawer(); ActionTypeEnum type = ActionTypeEnum.valueOf(extractValue(handledLines.get(0).toUpperCase())); Dimension s = state1.getGridElementSize(); if (type == ActionTypeEnum.STATE) { drawActionState(drawer, s); } else if (type == ActionTypeEnum.SENDER) { drawer.drawLines(Arrays.asList(p(0, 0), p(s.width - depth(s), 0), p(s.width, s.height / 2.0), p(s.width - depth(s), s.height), p(0, s.height), p(0, 0))); } else if (type == ActionTypeEnum.RECEIVER) { state1.getBuffer().addToLeft(depth(s)); drawer.drawLines(Arrays.asList(p(0, 0), p(s.width, 0), p(s.width, s.height), p(0, s.height), p(depth(s), s.height / 2.0), p(0, 0))); } } } }