package org.eclipse.uml2.diagram.sequence.draw2d; import org.eclipse.draw2d.AbstractLayout; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.geometry.Dimension; import org.eclipse.draw2d.geometry.Insets; import org.eclipse.draw2d.geometry.Rectangle; public class LifeLineLayout extends AbstractLayout /*implements LMLifeLine.DetailsLayouter */{ public int getHeadPreferredWidth() { return myHead.getPreferredSize().width; } public int getHeadPreferredHeight() { return myHead.getPreferredSize().height; } public int getHeadTopPos() { return myHead.getBounds().y; } public void setHorizontalPositions(int centerRelativePos, int headHalfWidth) { myCenterRelativePos = centerRelativePos; myHeadHalfWidth = headHalfWidth; myHead.revalidate(); myTail.setLineRelativeX(centerRelativePos); myTail.revalidate(); } public int getCenterRelativePos() { return myCenterRelativePos; } public int getHeadHalfWidth() { return myHeadHalfWidth; } //------------------------------------------------------ protected Dimension calculatePreferredSize(IFigure container, int wHint, int hHint) { int minWHint = 0, minHHint = 0; if (wHint < 0) minWHint = -1; if (hHint < 0) minHHint = -1; Insets border = container.getInsets(); wHint = Math.max(minWHint, wHint - border.getWidth()); hHint = Math.max(minHHint, hHint - border.getHeight()); Dimension prefSize = new Dimension(); Dimension headSize = myHead.getPreferredSize(wHint, hHint); hHint = Math.max(minHHint, hHint - headSize.height); prefSize.setSize(headSize); Dimension tailSize = myTail.getPreferredSize(wHint, hHint); prefSize.height += tailSize.height; prefSize.width = Math.max(prefSize.width, tailSize.width); return prefSize.expand(border.getWidth(), border.getHeight()); } public void layout(IFigure container) { Rectangle area = container.getClientArea(); Rectangle headBounds = new Rectangle(area); headBounds.translate(myCenterRelativePos - myHeadHalfWidth, 0); headBounds.width = 2 * myHeadHalfWidth; Dimension headPreferredSize = myHead.getPreferredSize(headBounds.width, -1); headBounds.height = headPreferredSize.height; myHead.setBounds(headBounds); area.y += headBounds.height; area.height -= headBounds.height; myTail.setBounds(area); } public void setConstraint(IFigure child, Object constraint) { if (child instanceof LifeLineTailShape) { myTail = (LifeLineTailShape) child; } else if (myHead == null) { myHead = child; } else { throw new IllegalArgumentException(); } super.setConstraint(child, constraint); } private IFigure myHead; private LifeLineTailShape myTail; private int myCenterRelativePos; private int myHeadHalfWidth; }