package com.baselet.element.sequence_aio.facet; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import com.baselet.control.basics.geom.Line; import com.baselet.control.enums.LineType; import com.baselet.diagram.draw.DrawHandler; import com.baselet.element.relation.helper.RelationDrawer; import com.baselet.element.relation.helper.RelationDrawer.ArrowEndType; public class GeneralOrdering implements LifelineSpanningTickSpanningOccurrence { private final Lifeline[] coveredLifelines; private final OccurrenceSpecification earlierOccurrence; private final OccurrenceSpecification laterOccurrence; public GeneralOrdering(OccurrenceSpecification earlierOccurrence, OccurrenceSpecification laterOccurrence, Lifeline[] coveredLifelines) { if (coveredLifelines.length < 2) { throw new IllegalArgumentException("A GeneralOrdering must affect two different lifelines."); } this.coveredLifelines = Arrays.copyOf(coveredLifelines, coveredLifelines.length); this.earlierOccurrence = earlierOccurrence; this.laterOccurrence = laterOccurrence; } @Override public Lifeline getFirstLifeline() { return coveredLifelines[0]; } @Override public Lifeline getLastLifeline() { return coveredLifelines[coveredLifelines.length - 1]; } @Override public void draw(DrawHandler drawHandler, DrawingInfo drawingInfo) { LineType oldLt = drawHandler.getLineType(); drawHandler.setLineType(LineType.DASHED); Line line = new Line(earlierOccurrence.getPosition(drawingInfo), laterOccurrence.getPosition(drawingInfo)); drawHandler.drawLine(line); drawHandler.setLineType(oldLt); RelationDrawer.drawArrowToLine(line.getCenter(), drawHandler, line, false, ArrowEndType.NORMAL, false, false); } @Override public double getOverallMinWidth(DrawHandler drawHandler, double lifelineHorizontalPadding) { // only the size of the arrow is needed, which is multiplied by 3 to have some padding return RelationDrawer.ARROW_LENGTH * 3; } @Override public Map<Integer, Double> getEveryAdditionalYHeight(DrawHandler drawHandler, HorizontalDrawingInfo hInfo, double defaultTickHeight) { // since it is only a line with an arrow in the middle we assume that we don't need any further space return new HashMap<Integer, Double>(); } @Override public ContainerPadding getPaddingInformation() { return null; } }