package org.eclipse.uml2.diagram.sequence.internal.layout.model;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.uml2.diagram.sequence.internal.layout.abstractgde.AbsElementPropertyAccess;
import org.eclipse.uml2.diagram.sequence.internal.layout.abstractgde.AbsNode;
import org.eclipse.uml2.diagram.sequence.internal.layout.vertical.input.HorizontalConstraint;
import org.eclipse.uml2.diagram.sequence.internal.layout.vertical.input.LifeLineElement;
/**
*
*/
public abstract class LMFrame extends LMFrameContainer implements LmReshapable {
protected LMFrame(AbsNode gdeNode) {
myGdeNode = gdeNode;
myBackgroundLayouter = AbsElementPropertyAccess.getInstance().getBackgroundLayouter(gdeNode);
}
public interface BackgroundLayouter {
void setX(int x);
void setY(int pos);
void setHeight(int height);
void setWidth(int width);
}
public AbsNode getGdeNode() {
return myGdeNode;
}
public LMFrameContainer getContainer() {
if (myContainerFriendly == null) {
return null;
}
return myContainerFriendly.getLMFrameContainer();
}
public abstract int getInnerHorizontalPadding();
public abstract int getOuterHorizontalPadding();
public int getTopInnerPadding() {
return getInnerHorizontalPadding();
}
public int getBottomInnerPadding() {
return getInnerHorizontalPadding();
}
/**
* Called from horizontal layout once for a layout session
*/
public void checkConsistancy() {
}
public abstract void setLeftBorderPosByTool(int pos);
public abstract void setRightBorderPosByTool(int pos);
public abstract void setLeftBorderPosByLayout(int pos);
public abstract void setRightBorderPosByLayout(int pos);
abstract boolean hasVisibleMountingLinks();
void setTopBorderPosFromMountingLink(int pos) {
setTopBorderPos(pos);
int untiedFramesAreaTopPos = getTopBorderPos()+getTopInnerPadding();
layoutVerticallyUtiedFrames(untiedFramesAreaTopPos);
}
boolean tryToUseAsPositionResponsibleLink(LMMountingLink link) {
//PositionResponsibleLink is first valid link which asks.
//=> if all mounting links on one lifeline are valid then
//corresponding frames top positions will be set in order
//from outermost to innermost frame. And inner frames won't
//be shifted because of parent frame shift on position setting.
if (myPositionResponsibleLink == null) {
if (link.isValid()) {
myPositionResponsibleLink = link;
}
}
return myPositionResponsibleLink == link;
}
void flushPositionResponsibleLink() {
myPositionResponsibleLink = null;
}
private LMMountingLink myPositionResponsibleLink;
/**
* Untied frame needn't layout inner frames
*/
public void setTopBorderPos(int pos) {
//System.out.println("[LMFrame.setTopBorderPos] set y to "+pos+" for "+this);
myGdeNode.setY(pos);
if (myBackgroundLayouter != null) {
myBackgroundLayouter.setY(pos);
}
}
public void setBottomBorderPos(int pos) {
int newHeight = pos - myGdeNode.getY();
//System.out.println("[LMFrame.setTopBorderPos] set height to "+newHeight+" for "+this);
myGdeNode.setHeight(newHeight);
if (myBackgroundLayouter != null) {
myBackgroundLayouter.setHeight(newHeight);
}
}
int getTopBorderPos() {
//System.out.println("[LMFrame.setTopBorderPos] set y to "+pos+" for "+this);
return myGdeNode.getY();
}
int getBottomBorderPos() {
return myGdeNode.getY() + myGdeNode.getHeight();
}
protected void setX(int x) {
//System.out.println("[LMFrame.setX] set x="+x+" to "+this);
myGdeNode.setX(x);
if (myBackgroundLayouter != null) {
myBackgroundLayouter.setX(x);
}
}
protected void setWidth(int width) {
//System.out.println("[LMFrame.setX] set width="+width+" to "+this);
myGdeNode.setWidth(width);
if (myBackgroundLayouter != null) {
myBackgroundLayouter.setWidth(width);
}
}
HorizontalConstraintImpl getBottomConstraint() {
return myBottomConstraint;
}
HorizontalConstraintImpl getTopConstraint() {
return myTopConstraint;
}
void addMountingLink(LMMountingLink mountingLink) {
myMountingLinks.add(mountingLink);
}
void removeMountingLink(LMMountingLink mountingLink) {
myMountingLinks.remove(mountingLink);
}
public boolean hasAnyMountingLinks() {
return !myMountingLinks.isEmpty();
}
Enumeration mountingLinks() {
return Collections.enumeration(myMountingLinks);
}
List getMountingLinksList() {
return myMountingLinks;
}
void delete() {
setContainer(null);
}
void setContainer(LMFrameContainer.ContainerFriendly containerFriendly) {
if (containerFriendly == null) {
if (myContainerFriendly != null) {
myContainerFriendly.childRemove(this);
myContainerFriendly = null;
}
} else {
if (myContainerFriendly != null) {
throw new IllegalStateException("Parent already set"); //$NON-NLS-1$
}
myContainerFriendly = containerFriendly;
}
}
public String toString() {
EObject entity = myGdeNode.getModelEntity();
return "Frame$"+entity; //$NON-NLS-1$
}
public void setJustReshaped(JustReshapedState justReshapedState) {
myJustReshapedState = justReshapedState;
//System.out.println("[LMFrame.setJustReshaped] for "+this);
int y = myGdeNode.getY();
int height = myGdeNode.getHeight();
for (Iterator it = myMountingLinks.iterator(); it.hasNext(); ) {
LMMountingLink mountingLink = (LMMountingLink) it.next();
LMMountingRegion mountingRegion = mountingLink.getMountingRegion();
//System.out.println("[LMFrame.setJustReshaped] call "+mountingRegion);
mountingRegion.setYAndHeightFromFrame(y, height, justReshapedState);
}
}
public boolean isJustReshaped() {
if (myJustReshapedState == null) {
return false;
}
return myJustReshapedState.isStillJustReshaped();
}
private JustReshapedState myJustReshapedState = null;
private final AbsNode myGdeNode;
private LMFrameContainer.ContainerFriendly myContainerFriendly;
private final List myMountingLinks = new ArrayList(3);
private final BackgroundLayouter myBackgroundLayouter;
private abstract class HorizontalConstraintImpl implements HorizontalConstraint {
public List getLifeLineElementsList() {
//System.out.println("[LMCombinedFragment.getLifeLineElementsList] myMountingLinks="+myMountingLinks);
List result = new ArrayList(myMountingLinks.size());
for (int i=0; i<myMountingLinks.size(); i++) {
LifeLineElement element1 = getLifeLineElement((LMMountingLink)myMountingLinks.get(i));
if (element1 != null) {
result.add(element1);
}
}
//System.out.println("[LMCombinedFragment.getLifeLineElementsList] result="+Arrays.asList(result));
return result;
}
public void elementIsResolved(LifeLineElement lifeLineElement) {
}
public void elementIsViolated(LifeLineElement lifeLineElement) {
}
protected abstract LifeLineElement getLifeLineElement(LMMountingLink lmMountingLink);
}
private final HorizontalConstraintImpl myTopConstraint = new HorizontalConstraintImpl() {
protected LifeLineElement getLifeLineElement(LMMountingLink lmMountingLink) {
return lmMountingLink.getMountingRegion().getTopLifeLineElementForConstraint();
}
public void elementIsResolved(LifeLineElement lifeLineElement) {
if (lifeLineElement instanceof LMMountingRegion.MountingRegionLifelineElement == false) {
throw new RuntimeException("Unknown type of lifeline element "+lifeLineElement); //$NON-NLS-1$
}
LMMountingRegion.MountingRegionLifelineElement mountingRegionLifelineElement = (LMMountingRegion.MountingRegionLifelineElement)lifeLineElement;
mountingRegionLifelineElement.setConstraintInvalid(false);
}
public void elementIsViolated(LifeLineElement lifeLineElement) {
if (lifeLineElement instanceof LMMountingRegion.MountingRegionLifelineElement == false) {
throw new RuntimeException("Unknown type of lifeline element "+lifeLineElement); //$NON-NLS-1$
}
LMMountingRegion.MountingRegionLifelineElement mountingRegionLifelineElement = (LMMountingRegion.MountingRegionLifelineElement)lifeLineElement;
mountingRegionLifelineElement.setConstraintInvalid(true);
}
public String toString() {
return "TopMountingConstraint of "+LMFrame.this; //$NON-NLS-1$
}
};
private final HorizontalConstraintImpl myBottomConstraint = new HorizontalConstraintImpl() {
protected LifeLineElement getLifeLineElement(LMMountingLink lmMountingLink) {
return lmMountingLink.getMountingRegion().getBottomLifeLineElementForConstraint();
}
public String toString() {
return "BottomMountingConstraint of "+LMFrame.this; //$NON-NLS-1$
}
};
}