package com.baselet.element.sequence_aio.facet; import java.util.Map; import com.baselet.control.basics.geom.PointDouble; import com.baselet.control.enums.LineType; import com.baselet.diagram.draw.DrawHandler; import com.baselet.diagram.draw.TextSplitter; import com.baselet.element.relation.helper.RelationDrawer.ArrowEndType; public class GateMessage extends Message { /** true if the sender is a gate */ private final boolean sendGate; private final boolean dockToLeftBorder; private GateMessage(Lifeline from, Lifeline to, int sendTick, String text, ArrowType arrowType, LineType lineType, boolean sendGate, boolean dockToLeftBorder) { super(from, to, 0, sendTick, text, arrowType, lineType); this.sendGate = sendGate; this.dockToLeftBorder = dockToLeftBorder; } public static GateMessage createSendGateMessage(Lifeline receiver, int sendTick, String text, ArrowType arrowType, LineType lineType, Lifeline leftMostLifeline, Lifeline rightMostLifeline) { if (Math.abs(receiver.getIndex() - leftMostLifeline.getIndex()) <= Math.abs(receiver.getIndex() - rightMostLifeline.getIndex())) { return new GateMessage(leftMostLifeline, receiver, sendTick, text, arrowType, lineType, true, true); } else { return new GateMessage(rightMostLifeline, receiver, sendTick, text, arrowType, lineType, true, false); } } public static GateMessage createReceiveGateMessage(Lifeline sender, int sendTick, String text, ArrowType arrowType, LineType lineType, Lifeline leftMostLifeline, Lifeline rightMostLifeline) { if (Math.abs(sender.getIndex() - leftMostLifeline.getIndex()) < Math.abs(sender.getIndex() - rightMostLifeline.getIndex())) { return new GateMessage(sender, leftMostLifeline, sendTick, text, arrowType, lineType, false, true); } else { return new GateMessage(sender, rightMostLifeline, sendTick, text, arrowType, lineType, false, false); } } @Override protected double getSendX(HorizontalDrawingInfo hDrawingInfo) { if (sendGate) { if (dockToLeftBorder) { return hDrawingInfo.getDiagramHorizontalStart(); } else { return hDrawingInfo.getDiagramHorizontalEnd(); } } else { return super.getSendX(hDrawingInfo); } } @Override protected double getReceiveX(HorizontalDrawingInfo hDrawingInfo) { if (sendGate) { return super.getReceiveX(hDrawingInfo); } else { if (dockToLeftBorder) { return hDrawingInfo.getDiagramHorizontalStart(); } else { return hDrawingInfo.getDiagramHorizontalEnd(); } } } @Override protected void drawSelfMessage(DrawHandler drawHandler, PointDouble send, PointDouble receive, ArrowEndType arrowEndType, boolean fillArrow, DrawingInfo hInfo) { super.drawNormalMessage(drawHandler, send, receive, arrowEndType, fillArrow, hInfo); // draw the self messages as normal messages because these message aren't real self messages } @Override public double getOverallMinWidth(DrawHandler drawHandler, double lifelineHorizontalPadding) { double executionSpecWidth = !sendGate ? Math.abs(getSendCenterXOffset()) : Math.abs(getReceiveCenterXOffset()); double neededWidth = executionSpecWidth + TextSplitter.getTextMinWidth(textLines, drawHandler) + LIFELINE_TEXT_PADDING * 2; if (from == to) { return neededWidth * 2; } else { int affectedLifelineCount = getLastLifeline().getIndex() - getFirstLifeline().getIndex(); double padding = lifelineHorizontalPadding * affectedLifelineCount; return (neededWidth - padding) * (affectedLifelineCount + 1) / (affectedLifelineCount + 0.5); } }; @Override protected void getEveryAdditionalYHeightSelfMessage(DrawHandler drawHandler, HorizontalDrawingInfo hInfo, double defaultTickHeight, Map<Integer, Double> ret) { super.getEveryAdditionalYHeightNormalMessage(drawHandler, hInfo, defaultTickHeight, ret); } @Override public OccurrenceSpecification sendOccurrenceSpecification() { if (sendGate) { throw new IllegalStateException("This GateMessage was created with an sender gate, and a gate has no associated occurrence specification."); } return super.sendOccurrenceSpecification(); } @Override public OccurrenceSpecification receiveOccurrenceSpecification() { if (!sendGate) { throw new IllegalStateException("This GateMessage was created with an receiver gate, and a gate has no associated occurrence specification."); } return super.receiveOccurrenceSpecification(); } }