package org.eclipse.uml2.diagram.sequence.internal.layout.model;
import org.eclipse.uml2.diagram.sequence.internal.layout.GeometryConstants;
import org.eclipse.uml2.diagram.sequence.internal.layout.abstractgde.AbsNode;
import org.eclipse.uml2.diagram.sequence.internal.layout.vertical.input.HorizontalConstraint;
/**
*
*/
class LmTileMountingRegion extends LMMountingRegion {
LmTileMountingRegion(AbsNode gdeBracketNode, BracketMetaObject bracketMetaObject, LmOwner lmOwner) {
super(gdeBracketNode, bracketMetaObject, lmOwner);
}
public LmBracketsList getChildBracketsList() {
return myChildBracketsList;
}
public SDVerticalLayoutInputImpl.NullFreeIterator verticalLayoutElements() {
//// assert
//{
// assertChildBracketsInCorrectOrder();
//}
return new SDVerticalLayoutInputImpl.NullFreeIteratorForArray(3) {
protected Object get(int pos) {
switch (pos) {
case 0: return getClueValue();
case 1: return new LMBracketContainer.ChildBracketsNFIterator();
case 2: return getClueValue();
}
throw new IndexOutOfBoundsException();
}
};
}
BottomHolder getBottomHolder() {
return myBottomHolder;
}
TopHolder getTopHolder() {
return myTopHolder;
}
void setBottomHolder(BottomHolder bottomHolder) {
if (bottomHolder != null && myBottomHolder != null) {
throw new RuntimeException("bottom holder already set"); //$NON-NLS-1$
}
myBottomHolder = bottomHolder;
}
void setTopHolder(TopHolder topHolder) {
if (topHolder != null && myTopHolder != null) {
throw new RuntimeException("top holder already set"); //$NON-NLS-1$
}
if (myTopHolder != null && myTopHolder.getConstraintedElement() != null) {
myTopHolder.setHorizontalConstrinat(null);
}
if (topHolder != null && topHolder.getConstraintedElement() != null) {
if (getMountingLink() != null) {
topHolder.setHorizontalConstrinat(getMountingLink().getFrame().getTopConstraint());
}
}
myTopHolder = topHolder;
}
void setMountLink(LMMountingLink mountingLink) {
if (myTopHolder != null && myTopHolder.getConstraintedElement() != null) {
myTopHolder.setHorizontalConstrinat(null);
if (mountingLink != null) {
myTopHolder.setHorizontalConstrinat(mountingLink.getFrame().getTopConstraint());
}
}
super.setMountLink(mountingLink);
}
TileEdgePosition getBottomPosition() {
return myBottomPosition;
}
TileEdgePosition getTopPosition() {
return myTopPosition;
}
MountingRegionLifelineElement getTopLifeLineElementForConstraint() {
if (myTopHolder == null) {
return null;
}
return myTopHolder.getConstraintedElement();
}
MountingRegionLifelineElement getBottomLifeLineElementForConstraint() {
return null;
}
void setYAndHeightFromFrame(int y, int height, JustReshapedState justReshapedState) {
int regionTopPos = myOrderAwareMountingRegionTopPosition.framePosToRegionPos(y);
myTopHolder.setVerticalPositionFromFrame(regionTopPos, justReshapedState);
myBottomHolder.setVerticalPositionFromFrame(y+height, justReshapedState);
}
private TopHolder myTopHolder;
private BottomHolder myBottomHolder;
private final LmBracketsList myChildBracketsList = new LmBracketsListSimple();
private final OrderAwareMountingRegionTopPosition myOrderAwareMountingRegionTopPosition = new OrderAwareMountingRegionTopPosition();
private final TileEdgePosition myTopPosition = new TileEdgePosition(myOrderAwareMountingRegionTopPosition);
private class OrderAwareMountingRegionTopPosition extends MountingRegionTopPosition {
int framePosToRegionPos(int framePos) {
if (isReferencedInteractionOperandFirstInContainer()) {
return framePos - GeometryConstants.Frames.FIRST_INTERATCTION_OPERAND_TOP_OFFSET;
}
return framePos;
}
int regionPosToFramePos(int regionPos) {
if (isReferencedInteractionOperandFirstInContainer()) {
return regionPos + GeometryConstants.Frames.FIRST_INTERATCTION_OPERAND_TOP_OFFSET;
}
return regionPos;
}
private boolean isReferencedInteractionOperandFirstInContainer() {
if (getMountingLink() != null) {
LMFrame lmFrame = getMountingLink().getFrame();
if (lmFrame != null) {
return lmFrame.getContainer().getChildList().get(0) == lmFrame;
}
}
return false;
}
}
private final TileEdgePosition myBottomPosition = new TileEdgePosition(new MountingRegionBottomPosition());
interface TopHolder {
/**
@return null, if constraint not supported (for first element)
*/
MountingRegionLifelineElement getConstraintedElement();
void setHorizontalConstrinat(HorizontalConstraint horizontalConstraint);
void setVerticalPositionFromFrame(int y, JustReshapedState justReshapedState);
}
interface BottomHolder {
void setVerticalPositionFromFrame(int y, JustReshapedState justReshapedState);
}
class TileEdgePosition {
TileEdgePosition(MountingRegionPosition mountingRegionPosition) {
myMountingRegionPosition = mountingRegionPosition;
}
void setPositionValue(int pos, boolean doNotReshapeFrame) {
myMountingRegionPosition.setPositionValue(pos, doNotReshapeFrame);
}
int getPositionValue() {
return myMountingRegionPosition.getPositionValue();
}
private final MountingRegionPosition myMountingRegionPosition;
}
}