package org.eclipse.uml2.diagram.sequence.internal.layout.model;
import java.awt.Color;
import java.awt.Point;
import org.eclipse.uml2.diagram.sequence.internal.layout.abstractgde.AbsLink;
/**
*
*/
public abstract class LMMessage implements LmReshapable {
public LMMessage(AbsLink gdeLink) {
myGdeLink = gdeLink;
}
abstract LMReceiveMessageEnd getReceiveMessageEnd();
abstract LMSendMessageEnd getSendMessageEnd();
abstract void resetReceiveMessageEnd();
abstract void resetSendMessageEnd();
AbsLink getGdeLink() {
return myGdeLink;
}
abstract boolean isFromSendToReceive();
public abstract void layoutHorizontally(boolean fullLayout);
abstract void becomeLayoutConstraint(boolean on);
abstract boolean isLayoutConstraint();
public void setJustReshaped(JustReshapedState justReshapedState) {
getSendMessageEnd().messageIsJustReshaped(this, justReshapedState);
getReceiveMessageEnd().messageIsJustReshaped(this, justReshapedState);
}
/**
* @param siblingNumber normally should be 0. Still can be 1, 2 etc on bad diagrams
*/
abstract void setLMMessageEndVerticalPosition(int pos, boolean sourceNotDestination, int siblingNumber);
int getLMMessageEndVerticalPosition(boolean sourceNotDestination) {
Point [] linkPoints = getGdeLink().getLinkPoints();
if (linkPoints.length < 1) {
throw new RuntimeException("Bad link positions"); //$NON-NLS-1$
}
if (sourceNotDestination) {
return linkPoints[0].y;
} else {
return linkPoints[linkPoints.length-1].y;
}
}
/**
* Invoked, when layout model is build.
*/
protected boolean calculateIsMessageViolated() {
if (!myMessageIsCrossFramedCalculated) {
LMFrame sourceFrame = getMessageEndFrame(getSendMessageEnd());
LMFrame destinationFrame = getMessageEndFrame(getReceiveMessageEnd());
myMessageIsCrossFramed = sourceFrame != destinationFrame;
myMessageIsCrossFramedCalculated = true;
}
return myMessageIsCrossFramed;
}
protected void sourceOrDestinationChanged() {
myMessageIsCrossFramedCalculated = false;
}
protected void updateMessageViolationState() {
boolean violated = calculateIsMessageViolated();
if (myHasColorBeforeViolated == null && violated) {
myHasColorBeforeViolated = getGdeLink().getForeground();
getGdeLink().setForeground(Color.RED);
} else if (myHasColorBeforeViolated != null && !violated) {
getGdeLink().setForeground(myHasColorBeforeViolated);
myHasColorBeforeViolated = null;
}
}
private Color myHasColorBeforeViolated;
private final AbsLink myGdeLink;
private boolean myMessageIsCrossFramed;
private boolean myMessageIsCrossFramedCalculated = false;
private static LMFrame getMessageEndFrame(LMMessageEnd messageEnd) {
if (messageEnd == null) {
return null;
}
return messageEnd.getContainingFrame();
}
}