package org.eclipse.uml2.diagram.sequence.internal.layout.model; import org.eclipse.uml2.diagram.sequence.internal.layout.abstractgde.AbsElementPropertyAccess; import org.eclipse.uml2.diagram.sequence.internal.layout.abstractgde.AbsLink; /** * */ public class MessageLabelLayouter { public interface MessageLabel { boolean isUserResized(); int getPreferredHeight(); int getPreferredWidth(); int getWidth(); void setY(int y); void setX(int x); } public static void layoutMessageLabelsVertically(AbsLink gdeLink, int yPos) { MessageLabel[] labels = getLabels(gdeLink); for (int i = 0; i<labels.length; i++) { MessageLabel next = labels[i]; int height = next.getPreferredHeight(); next.setY(yPos-height); } } public static void layoutMessageLabelsHorizontally(AbsLink gdeLink, int startXPos, int endXPos, boolean fullLayout) { if (startXPos <= endXPos) { int xPos = startXPos; MessageLabel[] labels = getLabels(gdeLink); for (int i = 0; i<labels.length; i++) { MessageLabel next = labels[i]; final int width; if (fullLayout || !next.isUserResized()) { next.setX(xPos); width = next.getPreferredWidth(); } else { width = next.getWidth(); } xPos += width; } } else { MessageLabel[] labels = getLabels(gdeLink); int [] widths = new int[labels.length]; int sumWidth = 0; for (int i=0; i<widths.length; i++) { MessageLabel next = labels[i]; final int width; if (fullLayout || !next.isUserResized()) { width = next.getPreferredWidth(); } else { width = next.getWidth(); } widths[i] = width; sumWidth += widths[i]; } int xPos = startXPos - sumWidth; for (int i=0; i<widths.length; i++) { MessageLabel next = labels[i]; if (fullLayout || !next.isUserResized()) { next.setX(xPos); } xPos += widths[i]; } } } private static MessageLabel[] getLabels(AbsLink absLink) { return AbsElementPropertyAccess.getInstance().getLabels(absLink); } }