package com.baselet.element.facet.specific;
import java.util.Arrays;
import java.util.List;
import com.baselet.control.basics.geom.PointDouble;
import com.baselet.diagram.draw.DrawHandler;
import com.baselet.diagram.draw.helper.ColorOwn;
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 UpperRightSymbolFacet extends FirstRunKeyValueFacet {
public static final UpperRightSymbolFacet INSTANCE = new UpperRightSymbolFacet();
private UpperRightSymbolFacet() {}
private enum UpperRightSymbolEnum {
USECASE, ARTIFACT, COMPONENT
}
@Override
public KeyValue getKeyValue() {
return new KeyValue("symbol",
new ValueInfo(UpperRightSymbolEnum.USECASE, "draw a use case symbol"),
new ValueInfo(UpperRightSymbolEnum.ARTIFACT, "draw an artifact symbol"),
new ValueInfo(UpperRightSymbolEnum.COMPONENT, "draw a component symbol"));
}
private static final int DISTANCE = 5;
@Override
public void handleValue(String value, PropertiesParserState state) {
// only act if parsing is finished to make sure DrawHandler-Setup is finished
}
@Override
public void parsingFinished(PropertiesParserState state, List<String> handledLines) {
if (!handledLines.isEmpty()) {
DrawHandler drawer = state.getDrawer();
ColorOwn prevBackgroundColor = drawer.getBackgroundColor();
drawer.setBackgroundColor(ColorOwn.TRANSPARENT);
UpperRightSymbolEnum symbol = UpperRightSymbolEnum.valueOf(extractValue(handledLines.get(0)).toUpperCase());
double eW = state.getGridElementSize().getWidth();
double fs = drawer.getFontSize();
if (symbol == UpperRightSymbolEnum.USECASE) {
double cW = fs * 2.5;
double cH = fs;
drawer.drawEllipse(eW - cW - DISTANCE, DISTANCE, cW, cH);
state.getBuffer().setTopMin(DISTANCE);
}
else if (symbol == UpperRightSymbolEnum.ARTIFACT) {
double cW = fs * 1.5;
double cH = fs * 1.8;
double corner = fs * 0.5;
List<PointDouble> p = Arrays.asList(
new PointDouble(eW - cW - DISTANCE, DISTANCE),
new PointDouble(eW - DISTANCE - corner, DISTANCE),
new PointDouble(eW - DISTANCE, DISTANCE + corner),
new PointDouble(eW - DISTANCE, DISTANCE + cH),
new PointDouble(eW - cW - DISTANCE, DISTANCE + cH));
PointDouble px = new PointDouble(eW - DISTANCE - corner, DISTANCE + corner);
drawer.drawLines(p.get(0), p.get(1), p.get(2), p.get(3), p.get(4), p.get(0));
drawer.drawLines(p.get(1), px, p.get(2));
state.getBuffer().setTopMin(DISTANCE + fs * 0.3);
}
else if (symbol == UpperRightSymbolEnum.COMPONENT) {
double partHeight = fs * 0.4;
double nonPartHeight = fs * 0.3;
double partWidth = partHeight * 2;
double cH = partHeight * 2 + nonPartHeight * 3;
double cW = cH * 0.8;
drawer.drawRectangle(eW - cW - partWidth / 2 - DISTANCE, DISTANCE + nonPartHeight, partWidth, partHeight); // upper small rect
drawer.drawRectangle(eW - cW - partWidth / 2 - DISTANCE, DISTANCE + partHeight + nonPartHeight * 2, partWidth, partHeight); // lower small rect
drawer.drawLine(eW - cW - DISTANCE, DISTANCE + partHeight + nonPartHeight, eW - cW - DISTANCE, DISTANCE + partHeight + nonPartHeight * 2); // connection between 2 rects
drawer.drawLines(Arrays.asList( // draw large rectangle around
new PointDouble(eW - cW - DISTANCE, DISTANCE + nonPartHeight),
new PointDouble(eW - cW - DISTANCE, DISTANCE),
new PointDouble(eW - DISTANCE, DISTANCE),
new PointDouble(eW - DISTANCE, DISTANCE + cH),
new PointDouble(eW - cW - DISTANCE, DISTANCE + cH),
new PointDouble(eW - cW - DISTANCE, DISTANCE + cH - nonPartHeight)));
state.getBuffer().setTopMin(DISTANCE + fs * 0.3);
}
drawer.setBackgroundColor(prevBackgroundColor);
}
}
}