package com.baselet.element.sequence_aio.facet; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import com.baselet.control.basics.Line1D; import com.baselet.control.enums.AlignHorizontal; import com.baselet.control.enums.AlignVertical; import com.baselet.diagram.draw.DrawHandler; import com.baselet.diagram.draw.TextSplitter; public class Continuation implements LifelineSpanningTickSpanningOccurrence { /** the width of the ellipse which builds the left and right border (no text is drawn in this) */ private static final double ROUND_PART_WIDTH = 20; /** the space between the text and the border line */ private static final double VERTICAL_BORDER_PADDING = 5; private final int tick; private final String[] textLines; private final Lifeline[] coveredLifelines; public Continuation(int tick, String text, Lifeline[] coveredLifelines) { super(); this.tick = tick; textLines = text.split("\n"); this.coveredLifelines = Arrays.copyOf(coveredLifelines, coveredLifelines.length); } @Override public Lifeline getFirstLifeline() { return coveredLifelines[0]; } @Override public Lifeline getLastLifeline() { return coveredLifelines[coveredLifelines.length - 1]; } @Override public void draw(DrawHandler drawHandler, DrawingInfo drawingInfo) { double width = drawingInfo.getSymmetricWidth(getFirstLifeline(), getLastLifeline(), tick); double height = TextSplitter.getSplitStringHeight(textLines, width - ROUND_PART_WIDTH * 2, drawHandler) + VERTICAL_BORDER_PADDING * 2; double topY = drawingInfo.getVerticalStart(tick); topY += (drawingInfo.getTickHeight(tick) - height) / 2; double leftX = drawingInfo.getHDrawingInfo(getFirstLifeline()).getSymmetricHorizontalStart(tick); drawHandler.drawArc(leftX, topY, ROUND_PART_WIDTH * 2, height, 90, 180, true); width = width - ROUND_PART_WIDTH * 2; drawHandler.drawArc(leftX + width, topY, ROUND_PART_WIDTH * 2, height, 270, 180, true); drawHandler.drawLine(leftX + ROUND_PART_WIDTH, topY, leftX + width + ROUND_PART_WIDTH, topY); drawHandler.drawLine(leftX + ROUND_PART_WIDTH, topY + height, leftX + width + ROUND_PART_WIDTH, topY + height); TextSplitter.drawText(drawHandler, textLines, leftX + ROUND_PART_WIDTH, topY, width, height, AlignHorizontal.CENTER, AlignVertical.CENTER); for (Lifeline ll : coveredLifelines) { drawingInfo.getDrawingInfo(ll).addInterruptedArea(new Line1D(topY, topY + height)); } } @Override public double getOverallMinWidth(DrawHandler drawHandler, double lifelineHorizontalPadding) { return TextSplitter.getTextMinWidth(textLines, drawHandler) + ROUND_PART_WIDTH * 2; } @Override public Map<Integer, Double> getEveryAdditionalYHeight(DrawHandler drawHandler, HorizontalDrawingInfo hInfo, double defaultTickHeight // Line1D[] lifelinesHorizontalSpanning, double tickHeight ) { Map<Integer, Double> ret = new HashMap<Integer, Double>(); double neededHeight = TextSplitter.getSplitStringHeight(textLines, hInfo.getSymmetricWidth(getFirstLifeline(), getLastLifeline(), tick) - ROUND_PART_WIDTH * 2, drawHandler) + VERTICAL_BORDER_PADDING * 2; if (neededHeight > defaultTickHeight) { ret.put(tick, neededHeight - defaultTickHeight); } return ret; } @Override public ContainerPadding getPaddingInformation() { return null; } }