package org.eclipse.uml2.diagram.sequence.internal.layout.model;
import java.awt.Point;
import org.eclipse.uml2.diagram.sequence.internal.layout.GeometryConstants;
import org.eclipse.uml2.diagram.sequence.internal.layout.abstractgde.AbsLink;
/**
*
*/
class LMFoundMessage extends LMMessage {
LMFoundMessage(AbsLink gdeLink, boolean isFromSendToReceive) {
super(gdeLink);
myIsFromSendToReceive = isFromSendToReceive;
}
boolean isFromSendToReceive() {
return myIsFromSendToReceive;
}
public void layoutHorizontally(boolean fullLayout) {
if (mySendPositioning == null) {
throw new RuntimeException("No send message positioning"); //$NON-NLS-1$
}
if (myReceivePositioning == null) {
throw new RuntimeException("No receive message positioning"); //$NON-NLS-1$
}
int endMiddleXPos = myReceivePositioning.getReceiveMiddleXPos();
int startXPos;
if (fullLayout) {
startXPos = endMiddleXPos-GeometryConstants.Message.MIN_FOUND_MESSAGE_LENGTH;
} else {
startXPos = mySendPositioning.getXPos();
}
boolean goesFromRight = startXPos >= endMiddleXPos;
int endXPos = myReceivePositioning.getReceiveEndXPos(goesFromRight);
if (goesFromRight) {
int limit1 = endMiddleXPos + GeometryConstants.Message.MIN_FOUND_MESSAGE_LENGTH;
int limit2 = endMiddleXPos + GeometryConstants.Message.MAX_FOUND_MESSAGE_LENGTH;
if (startXPos < limit1) {
startXPos = limit1;
}
if (startXPos > limit2) {
startXPos = limit2;
}
} else {
int limit1 = endMiddleXPos - GeometryConstants.Message.MIN_FOUND_MESSAGE_LENGTH;
int limit2 = endMiddleXPos - GeometryConstants.Message.MAX_FOUND_MESSAGE_LENGTH;
if (startXPos > limit1) {
startXPos = limit1;
}
if (startXPos < limit2) {
startXPos = limit2;
}
}
if (myIsFromSendToReceive) {
mySendPositioning.setXPos(startXPos);
startXPos = mySendPositioning.getXPos();
}
//Reply message start and end points should be swapped
if (! myIsFromSendToReceive) {
int t = startXPos;
startXPos = endXPos;
endXPos = t;
}
Point [] linkPoints = getGdeLink().getLinkPoints();
int endYPos;
if (linkPoints.length < 1) {
endYPos = 0;
} else {
endYPos = linkPoints[linkPoints.length-1].y;
}
Point [] newPoints = { new Point(startXPos, endYPos), new Point(endXPos, endYPos) };
//System.out.println("[LMLifeLineBracket.setLMMessageEndHorizontalPosition] from "+java.util.Arrays.asList(linkPoints)+" to "+java.util.Arrays.asList(newPoints));
getGdeLink().setLinkPoints(newPoints);
MessageLabelLayouter.layoutMessageLabelsHorizontally(getGdeLink(), startXPos, endXPos, fullLayout);
}
void setLMMessageEndVerticalPosition(int pos, boolean sourceNotDestination, int siblingNumber) {
LMFoundInvocationOccurence foundInvocationOccurence = (LMFoundInvocationOccurence) getSendMessageEnd();
if (foundInvocationOccurence == null) {
throw new RuntimeException("No send message end"); //$NON-NLS-1$
}
LMReceiveMessageEnd receiveMessageEnd = getReceiveMessageEnd();
if (receiveMessageEnd == null) {
throw new RuntimeException("No receive message end"); //$NON-NLS-1$
}
Point [] linkPoints = getGdeLink().getLinkPoints();
int startXPos;
int endXPos;
if (linkPoints.length < 1) {
startXPos = 10;
endXPos = 10;
} else {
startXPos = linkPoints[0].x;
endXPos = linkPoints[linkPoints.length-1].x;
}
int receiveY = pos;
int sendY = pos + siblingNumber * GeometryConstants.Message.FOUND_MESSAGE_SIBLING_VERTICAL_DISTANCE;
Point [] newPoints = { new Point(startXPos, sendY), new Point(endXPos, receiveY) };
//System.out.println("[LMLifeLineBracket.setLMMessageEndHorizontalPosition] from "+java.util.Arrays.asList(linkPoints)+" to "+java.util.Arrays.asList(newPoints));
getGdeLink().setLinkPoints(newPoints);
if (myIsFromSendToReceive) {
mySendPositioning.setYPos(sendY);
}
MessageLabelLayouter.layoutMessageLabelsVertically(getGdeLink(), sendY);
}
LMSendMessageEnd getSendMessageEnd() {
return mySendMessageEnd;
}
LMReceiveMessageEnd getReceiveMessageEnd() {
return myReceiveMessageEnd;
}
protected void setSendMessageEnd(LMSendMessageEnd sendMessageEnd, LMMessageEnd.FloatingPositioning sendEndPositioning) {
mySendMessageEnd = sendMessageEnd;
mySendPositioning = sendEndPositioning;
sourceOrDestinationChanged();
}
protected void setReceiveMessageEnd(LMReceiveMessageEnd receiveMessageEnd, LMReceiveMessageEnd.HorizontalPositioning receiveEndPositioning) {
myReceiveMessageEnd = receiveMessageEnd;
myReceivePositioning = receiveEndPositioning;
sourceOrDestinationChanged();
}
void resetSendMessageEnd() {
mySendMessageEnd = null;
mySendPositioning = null;
sourceOrDestinationChanged();
}
void resetReceiveMessageEnd() {
myReceiveMessageEnd = null;
myReceivePositioning = null;
sourceOrDestinationChanged();
}
void becomeLayoutConstraint(boolean on) {
}
boolean isLayoutConstraint() {
return false;
}
private LMReceiveMessageEnd myReceiveMessageEnd;
private LMSendMessageEnd mySendMessageEnd;
private LMMessageEnd.FloatingPositioning mySendPositioning;
private LMReceiveMessageEnd.HorizontalPositioning myReceivePositioning;
private final boolean myIsFromSendToReceive;
}