package com.baselet.element.relation.facet; import com.baselet.control.basics.geom.Line; import com.baselet.control.basics.geom.PointDouble; import com.baselet.control.basics.geom.Rectangle; import com.baselet.control.enums.Direction; import com.baselet.control.enums.RegexValueHolder; import com.baselet.diagram.draw.DrawHandler; import com.baselet.element.relation.helper.RelationDrawer; import com.baselet.element.relation.helper.RelationDrawer.ArrowEndType; import com.baselet.element.relation.helper.ResizableObject; abstract class ArrowEnd implements RegexValueHolder { static final String BOX_REGEX = "\\[[^\\]]*\\]"; private final String regexValue; public ArrowEnd(String regexValue) { super(); this.regexValue = regexValue; } @Override public String getRegexValue() { return regexValue; } abstract void print(DrawHandler drawer, Line lineToDraw, boolean drawOnLineStart, String matchedText, ResizableObject resizableObject); static ArrowEnd BOX = new ArrowEnd(BOX_REGEX) { @Override public void print(DrawHandler drawer, Line lineToDraw, boolean drawOnLineStart, String matchedText, ResizableObject resizableObject) { String textWithoutBox = matchedText.substring(1, matchedText.length() - 1); RelationDrawer.drawBoxArrow(drawer, lineToDraw, drawOnLineStart, textWithoutBox, resizableObject); } }; static ArrowEnd LEFT_BOX = new ArrowEnd(BOX_REGEX + "<") { @Override public void print(DrawHandler drawer, Line lineToDraw, boolean drawOnLineStart, String matchedText, ResizableObject resizableObject) { String textWithoutBox = matchedText.substring(1, matchedText.length() - 2); Rectangle r = RelationDrawer.drawBoxArrow(drawer, lineToDraw, drawOnLineStart, textWithoutBox, resizableObject); PointDouble intersection = lineToDraw.getIntersectionPoints(r).get(0); RelationDrawer.drawArrowToLine(intersection, drawer, lineToDraw, drawOnLineStart, ArrowEndType.NORMAL, false, false); } }; static ArrowEnd LEFT_NORMAL = new ArrowEnd("<") { @Override public void print(DrawHandler drawer, Line lineToDraw, boolean drawOnLineStart, String matchedText, ResizableObject resizableObject) { RelationDrawer.drawArrowToLine(drawer, lineToDraw, drawOnLineStart, ArrowEndType.NORMAL, false, false); } }; static ArrowEnd LEFT_MEASURE_NORMAL = new ArrowEnd("\\|<") { @Override public void print(DrawHandler drawer, Line lineToDraw, boolean drawOnLineStart, String matchedText, ResizableObject resizableObject) { RelationDrawer.drawArrowToLine(drawer, lineToDraw, drawOnLineStart, ArrowEndType.MEASURE, false, false); } }; static ArrowEnd LEFT_INVERTED = new ArrowEnd(">") { @Override public void print(DrawHandler drawer, Line lineToDraw, boolean drawOnLineStart, String matchedText, ResizableObject resizableObject) { RelationDrawer.drawArrowToLine(drawer, lineToDraw, drawOnLineStart, ArrowEndType.NORMAL, false, true); } }; static ArrowEnd LEFT_CLOSED = new ArrowEnd("<<") { @Override public void print(DrawHandler drawer, Line lineToDraw, boolean drawOnLineStart, String matchedText, ResizableObject resizableObject) { RelationDrawer.drawArrowToLine(drawer, lineToDraw, drawOnLineStart, ArrowEndType.CLOSED, false, false); } }; static ArrowEnd LEFT_FILLED_CLOSED = new ArrowEnd("<<<") { @Override public void print(DrawHandler drawer, Line lineToDraw, boolean drawOnLineStart, String matchedText, ResizableObject resizableObject) { RelationDrawer.drawArrowToLine(drawer, lineToDraw, drawOnLineStart, ArrowEndType.CLOSED, true, false); } }; static ArrowEnd LEFT_DIAMOND = new ArrowEnd("<<<<") { @Override public void print(DrawHandler drawer, Line lineToDraw, boolean drawOnLineStart, String matchedText, ResizableObject resizableObject) { RelationDrawer.drawArrowToLine(drawer, lineToDraw, drawOnLineStart, ArrowEndType.DIAMOND, false, false); } }; static ArrowEnd LEFT_FILLED_DIAMOND = new ArrowEnd("<<<<<") { @Override public void print(DrawHandler drawer, Line lineToDraw, boolean drawOnLineStart, String matchedText, ResizableObject resizableObject) { RelationDrawer.drawArrowToLine(drawer, lineToDraw, drawOnLineStart, ArrowEndType.DIAMOND, true, false); } }; static ArrowEnd LEFT_INTERFACE_OPEN = new ArrowEnd("\\)") { @Override public void print(DrawHandler drawer, Line lineToDraw, boolean drawOnLineStart, String matchedText, ResizableObject resizableObject) { RelationDrawer.drawCircle(drawer, lineToDraw, drawOnLineStart, resizableObject, Direction.LEFT, false); } }; static ArrowEnd RIGHT_BOX = new ArrowEnd(">" + BOX_REGEX) { @Override public void print(DrawHandler drawer, Line lineToDraw, boolean drawOnLineStart, String matchedText, ResizableObject resizableObject) { String textWithoutBox = matchedText.substring(2, matchedText.length() - 1); Rectangle r = RelationDrawer.drawBoxArrow(drawer, lineToDraw, drawOnLineStart, textWithoutBox, resizableObject); PointDouble intersection = lineToDraw.getIntersectionPoints(r).get(0); RelationDrawer.drawArrowToLine(intersection, drawer, lineToDraw, drawOnLineStart, ArrowEndType.NORMAL, false, false); } }; static ArrowEnd RIGHT_NORMAL = new ArrowEnd(">") { @Override public void print(DrawHandler drawer, Line lineToDraw, boolean drawOnLineStart, String matchedText, ResizableObject resizableObject) { RelationDrawer.drawArrowToLine(drawer, lineToDraw, drawOnLineStart, ArrowEndType.NORMAL, false, false); } }; static ArrowEnd RIGHT_MEASURE_NORMAL = new ArrowEnd(">\\|") { @Override public void print(DrawHandler drawer, Line lineToDraw, boolean drawOnLineStart, String matchedText, ResizableObject resizableObject) { RelationDrawer.drawArrowToLine(drawer, lineToDraw, drawOnLineStart, ArrowEndType.MEASURE, false, false); } }; static ArrowEnd RIGHT_INVERTED = new ArrowEnd("<") { @Override public void print(DrawHandler drawer, Line lineToDraw, boolean drawOnLineStart, String matchedText, ResizableObject resizableObject) { RelationDrawer.drawArrowToLine(drawer, lineToDraw, drawOnLineStart, ArrowEndType.NORMAL, false, true); } }; static ArrowEnd RIGHT_CLOSED = new ArrowEnd(">>") { @Override public void print(DrawHandler drawer, Line lineToDraw, boolean drawOnLineStart, String matchedText, ResizableObject resizableObject) { RelationDrawer.drawArrowToLine(drawer, lineToDraw, drawOnLineStart, ArrowEndType.CLOSED, false, false); } }; static ArrowEnd RIGHT_FILLED_CLOSED = new ArrowEnd(">>>") { @Override public void print(DrawHandler drawer, Line lineToDraw, boolean drawOnLineStart, String matchedText, ResizableObject resizableObject) { RelationDrawer.drawArrowToLine(drawer, lineToDraw, drawOnLineStart, ArrowEndType.CLOSED, true, false); } }; static ArrowEnd RIGHT_DIAMOND = new ArrowEnd(">>>>") { @Override public void print(DrawHandler drawer, Line lineToDraw, boolean drawOnLineStart, String matchedText, ResizableObject resizableObject) { RelationDrawer.drawArrowToLine(drawer, lineToDraw, drawOnLineStart, ArrowEndType.DIAMOND, false, false); } }; static ArrowEnd RIGHT_FILLED_DIAMOND = new ArrowEnd(">>>>>") { @Override public void print(DrawHandler drawer, Line lineToDraw, boolean drawOnLineStart, String matchedText, ResizableObject resizableObject) { RelationDrawer.drawArrowToLine(drawer, lineToDraw, drawOnLineStart, ArrowEndType.DIAMOND, true, false); } }; static ArrowEnd RIGHT_INTERFACE_OPEN = new ArrowEnd("\\(") { @Override public void print(DrawHandler drawer, Line lineToDraw, boolean drawOnLineStart, String matchedText, ResizableObject resizableObject) { RelationDrawer.drawCircle(drawer, lineToDraw, drawOnLineStart, resizableObject, Direction.RIGHT, false); } }; static ArrowEnd CIRCLE_CROSS = new ArrowEnd("\\(\\+\\)") { @Override public void print(DrawHandler drawer, Line lineToDraw, boolean drawOnLineStart, String matchedText, ResizableObject resizableObject) { RelationDrawer.drawCircle(drawer, lineToDraw, drawOnLineStart, resizableObject, null, true); } }; static ArrowEnd CIRCLE = new ArrowEnd("\\(\\)") { @Override public void print(DrawHandler drawer, Line lineToDraw, boolean drawOnLineStart, String matchedText, ResizableObject resizableObject) { RelationDrawer.drawCircle(drawer, lineToDraw, drawOnLineStart, resizableObject, null, false); } }; static ArrowEnd DIAGONAL_CROSS = new ArrowEnd("x") { @Override public void print(DrawHandler drawer, Line lineToDraw, boolean drawOnLineStart, String matchedText, ResizableObject resizableObject) { RelationDrawer.drawDiagonalCross(drawer, lineToDraw, drawOnLineStart, resizableObject, null, false); } }; }