package org.eclipse.uml2.diagram.sequence.internal.layout.model; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import org.eclipse.emf.ecore.EObject; 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.model.LmTileMountingRegion.BottomHolder; import org.eclipse.uml2.diagram.sequence.internal.layout.model.LmTileMountingRegion.TopHolder; import org.eclipse.uml2.diagram.sequence.internal.layout.model.SDVerticalLayoutInputImpl.NullFreeIterator; import org.eclipse.uml2.diagram.sequence.internal.layout.vertical.input.HorizontalConstraint; import org.eclipse.uml2.diagram.sequence.internal.layout.vertical.input.LifeLine; import org.eclipse.uml2.diagram.sequence.internal.layout.vertical.input.LifeLineElement; /** * */ class LmTileFloorMountingRegion extends LMMountingRegion { LmTileFloorMountingRegion(AbsNode gdeBracketNode, BracketMetaObject bracketMetaObject, LmOwner lmOwner) { super(gdeBracketNode, bracketMetaObject, lmOwner); } public LmBracketsList getChildBracketsList() { return myBracketsList; } public NullFreeIterator verticalLayoutElements() { return new NullFreeIterator() { public Object next() { switch (myState) { case 0: if (myBracketsList.isEmpty()) { myState = 2; } else { myState = 1; myTileElementsReturned = false; myTilePos = 0; } return myFirstTopHolder; case 1: if (myTileElementsReturned) { myTileElementsReturned = false; MiddleLifeLineElement middleLifeLineElement = (MiddleLifeLineElement) myMiddleLifeLineElements.get(myTilePos); myTilePos ++; return middleLifeLineElement; } else { if (myTilePos >= myBracketsList.size()-1) { myState = 2; } else { myTileElementsReturned = true; } LmTileMountingRegion mountingRegion = (LmTileMountingRegion) myBracketsList.getListView().get(myTilePos); return mountingRegion.verticalLayoutElements(); } case 2: myState = 3; return myLastBottomHolder; case 3: return null; } throw new IllegalStateException("state = "+myState); //$NON-NLS-1$ } private int myState = 0; private boolean myTileElementsReturned; private int myTilePos; }; } private LmBracketsList myBracketsList = new LmBracketsList() { public List getListView() { return myUnmodifableList; } public Iterator iterator() { return myUnmodifableList.iterator(); } public int size() { return myTilesList.size(); } public void reorderList(List oldIndexList) { if (myTilesList.size() != oldIndexList.size()) { throw new RuntimeException("Wrong number of elements to replace"); //$NON-NLS-1$ } List newList = new ArrayList(myTilesList.size()); for (Iterator it = oldIndexList.iterator(); it.hasNext(); ) { Integer oldIndex = (Integer) it.next(); int index = oldIndex.intValue(); newList.add(myTilesList.get(index)); } for (int i=0; i<myTilesList.size(); i++) { LmTileMountingRegion tile = (LmTileMountingRegion) myTilesList.get(i); tile.setTopHolder(null); tile.setBottomHolder(null); } myTilesList.clear(); myMiddleLifeLineElements.clear(); myTilesList.addAll(newList); int listSize = myTilesList.size(); if (listSize == 0) { } else { LmTileMountingRegion firstTile = (LmTileMountingRegion)myTilesList.get(0); myFirstTopHolder.setTileMountingRegion(firstTile); firstTile.setTopHolder(myFirstTopHolder); for (int i=1; i<listSize; i++) { LmTileMountingRegion tile1 = (LmTileMountingRegion) myTilesList.get(i-1); LmTileMountingRegion tile2 = (LmTileMountingRegion) myTilesList.get(i); MiddleLifeLineElement middleLifeLineElement = new MiddleLifeLineElement(tile1, tile2); myMiddleLifeLineElements.add(middleLifeLineElement); tile1.setBottomHolder(middleLifeLineElement.getBottomHolder()); tile2.setTopHolder(middleLifeLineElement.getTopHolder()); } LmTileMountingRegion lastTile = (LmTileMountingRegion)myTilesList.get(listSize-1); lastTile.setBottomHolder(myLastBottomHolder); myLastBottomHolder.setTileMountingRegion(lastTile); } //assertCorrectState(); } public void add(LMLifeLineBracket lifeLineBracket) { LmTileMountingRegion tile = (LmTileMountingRegion) lifeLineBracket; int listSize = myTilesList.size(); if (listSize == 0) { myFirstTopHolder.setTileMountingRegion(tile); tile.setTopHolder(myFirstTopHolder); } else { LmTileMountingRegion prevTile = (LmTileMountingRegion) myTilesList.get(listSize-1); prevTile.setBottomHolder(null); MiddleLifeLineElement middleLifeLineElement = new MiddleLifeLineElement(prevTile, tile); myMiddleLifeLineElements.add(middleLifeLineElement); prevTile.setBottomHolder(middleLifeLineElement.getBottomHolder()); tile.setTopHolder(middleLifeLineElement.getTopHolder()); } tile.setBottomHolder(myLastBottomHolder); myLastBottomHolder.setTileMountingRegion(tile); myTilesList.add(tile); //assertCorrectState(); } public void remove(LMLifeLineBracket lifeLineBracket) { LmTileMountingRegion tile = (LmTileMountingRegion) lifeLineBracket; int index = myTilesList.indexOf(tile); if (index == -1) { throw new RuntimeException("Cannot find tile item in list"); //$NON-NLS-1$ } tile.setTopHolder(null); tile.setBottomHolder(null); int listSize = myTilesList.size(); if (listSize == 1) { myTilesList.clear(); myFirstTopHolder.setTileMountingRegion(null); myLastBottomHolder.setTileMountingRegion(null); } else { if (index == 0) { myMiddleLifeLineElements.remove(0); LmTileMountingRegion tile1 = (LmTileMountingRegion)myTilesList.get(1); myFirstTopHolder.setTileMountingRegion(tile1); tile1.setTopHolder(null); tile1.setTopHolder(myFirstTopHolder); } else if (index == listSize-1) { myMiddleLifeLineElements.remove(listSize-2); LmTileMountingRegion tilePre = (LmTileMountingRegion)myTilesList.get(listSize-2); myLastBottomHolder.setTileMountingRegion(tilePre); tilePre.setBottomHolder(null); tilePre.setBottomHolder(myLastBottomHolder); } else { myMiddleLifeLineElements.remove(index); LmTileMountingRegion tile1 = (LmTileMountingRegion) myTilesList.get(index-1); LmTileMountingRegion tile2 = (LmTileMountingRegion) myTilesList.get(index+1); tile1.setBottomHolder(null); tile2.setTopHolder(null); MiddleLifeLineElement middleLifeLineElement = new MiddleLifeLineElement(tile1, tile2); myMiddleLifeLineElements.set(index-1, middleLifeLineElement); tile1.setBottomHolder(middleLifeLineElement.getBottomHolder()); tile2.setTopHolder(middleLifeLineElement.getTopHolder()); } myTilesList.remove(index); } //assertCorrectState(); } public boolean isEmpty() { return myTilesList.isEmpty(); } public void removeAll() { myTilesList.clear(); myMiddleLifeLineElements.clear(); if (false) { assert checkCorrectState(); } } boolean checkCorrectState() { if (myTilesList.isEmpty()) { if (!myMiddleLifeLineElements.isEmpty()) { throw new RuntimeException("bad state"); //$NON-NLS-1$ } return true; } int listSize = myTilesList.size(); LmTileMountingRegion firstTile = (LmTileMountingRegion)myTilesList.get(0); if (myFirstTopHolder.getTileMountingRegion() != firstTile) { throw new RuntimeException("bad state"); //$NON-NLS-1$ } if (firstTile.getTopHolder() != myFirstTopHolder) { throw new RuntimeException("bad state"); //$NON-NLS-1$ } for (int i=1; i<listSize; i++) { LmTileMountingRegion tile1 = (LmTileMountingRegion) myTilesList.get(i-1); LmTileMountingRegion tile2 = (LmTileMountingRegion) myTilesList.get(i); MiddleLifeLineElement middleLifeLineElement = (MiddleLifeLineElement) myMiddleLifeLineElements.get(i-1); if (middleLifeLineElement.getTopTile() != tile1) { throw new RuntimeException("bad state"); //$NON-NLS-1$ } if (middleLifeLineElement.getBottomTile() != tile2) { throw new RuntimeException("bad state"); //$NON-NLS-1$ } if (tile1.getBottomHolder() != middleLifeLineElement.getBottomHolder()) { throw new RuntimeException("bad state"); //$NON-NLS-1$ } if (tile2.getTopHolder() != middleLifeLineElement.getTopHolder()) { throw new RuntimeException("bad state"); //$NON-NLS-1$ } } LmTileMountingRegion lastTile = (LmTileMountingRegion)myTilesList.get(listSize-1); if (myLastBottomHolder.getTileMountingRegion() != lastTile) { throw new RuntimeException("bad state"); //$NON-NLS-1$ } if (lastTile.getBottomHolder() != myLastBottomHolder) { throw new RuntimeException("bad state"); //$NON-NLS-1$ } return true; } private final List myTilesList = new ArrayList(); private final List myUnmodifableList = Collections.unmodifiableList(myTilesList); }; void setMountLink(LMMountingLink mountingLink) { super.setMountLink(mountingLink); if (mountingLink == null) { myFirstTopHolder.setHorizontalConstraint(null); myLastBottomHolder.setHorizontalConstraint(null); } else { LMFrame frame = mountingLink.getFrame(); myFirstTopHolder.setHorizontalConstraint(frame.getTopConstraint()); myLastBottomHolder.setHorizontalConstraint(frame.getBottomConstraint()); } } MountingRegionLifelineElement getTopLifeLineElementForConstraint() { return myFirstTopHolder; } MountingRegionLifelineElement getBottomLifeLineElementForConstraint() { return myLastBottomHolder; } void setYAndHeightFromFrame(int y, int height, JustReshapedState justReshapedState) { //System.out.println("[LmTileFloorMountingRegion.setYAndHeightFromFrame] y="+y); //System.out.println("[LmTileFloorMountingRegion.setYAndHeightFromFrame] height="+height); setJustReshaped(justReshapedState); myFirstTopHolder.setPositionValue(y, true); myLastBottomHolder.setPositionValue(y+height, true); } private final List myMiddleLifeLineElements = new ArrayList(); private abstract class EdgeTopOrBottomHolder extends SDVerticalLayoutInputImpl.LifeLineElementGen implements LifeLineElement.Position, MountingRegionLifelineElement { protected EdgeTopOrBottomHolder(int topOffset, int bottomOffset, MountingRegionPosition floorBracketPosition) { super(topOffset, topOffset+bottomOffset); myFloorBracketPosition = floorBracketPosition; } public LifeLine getLifeLine() { return LmTileFloorMountingRegion.this.getLifeLine().getVerticalLayoutLifeLine(); } public Position getPosition() { return this; } public int getPositionValue() { return myFloorBracketPosition.getPositionValue(); } public void setPositionValue(int pos) { setPositionValue(pos, false); } public void setConstraintInvalid(boolean isInvalid) { LmTileFloorMountingRegion.this.getMountingLink().setInvalid(isInvalid); if (myTileMountingRegion != null) { myTileMountingRegion.getMountingLink().setInvalid(isInvalid); } } void setPositionValue(int pos, boolean doNotReshapeFrame) { myFloorBracketPosition.setPositionValue(pos, doNotReshapeFrame); if (myTileMountingRegion != null) { getTilePosition(myTileMountingRegion).setPositionValue(pos, doNotReshapeFrame); } } public boolean isFirstPrioritedPosition() { return myFloorBracketPosition.isFirstPrioritedPosition(); } public boolean isLastPrioritedPosition() { return myFloorBracketPosition.isLastPrioritedPosition(); } void setTileMountingRegion(LmTileMountingRegion tileMountingRegion) { myTileMountingRegion = tileMountingRegion; } LmTileMountingRegion getTileMountingRegion() { return myTileMountingRegion; } public void setVerticalPositionFromFrame(int y, JustReshapedState justReshapedState) { setPositionValue(y, true); } protected abstract LmTileMountingRegion.TileEdgePosition getTilePosition(LmTileMountingRegion tileMountingRegion); private LmTileMountingRegion myTileMountingRegion; private final MountingRegionPosition myFloorBracketPosition; } private class FirstTopHolder extends EdgeTopOrBottomHolder implements LifeLineElement.Position, LmTileMountingRegion.TopHolder { protected FirstTopHolder() { super(GeometryConstants.CombinedFragmentMountingPoint.VERTICAL_OUT_SPACE, GeometryConstants.InteractionOpernadMountingPoint.VERTICAL_TOP_IN_SPACE, new MountingRegionTopPosition()); } protected LmTileMountingRegion.TileEdgePosition getTilePosition(LmTileMountingRegion tileMountingRegion) { return tileMountingRegion.getTopPosition(); } public MountingRegionLifelineElement getConstraintedElement() { return null; } public void setHorizontalConstrinat(HorizontalConstraint horizontalConstraint) { throw new UnsupportedOperationException("no constraints here"); //$NON-NLS-1$ } public boolean isVirtual() { return false; } public String toString() { EObject nodeEntity = getGdeNode().getModelEntity(); return "FloorTopElement:"+ nodeEntity; //$NON-NLS-1$ } } private class LastBottomHolder extends EdgeTopOrBottomHolder implements LifeLineElement.Position, LmTileMountingRegion.BottomHolder { protected LastBottomHolder() { super(GeometryConstants.InteractionOpernadMountingPoint.VERTICAL_BOTTOM_IN_SPACE, GeometryConstants.CombinedFragmentMountingPoint.VERTICAL_OUT_SPACE, new MountingRegionBottomPosition()); } protected LmTileMountingRegion.TileEdgePosition getTilePosition(LmTileMountingRegion tileMountingRegion) { return tileMountingRegion.getBottomPosition(); } public boolean isVirtual() { return false; } public String toString() { EObject nodeEntity = getGdeNode().getModelEntity(); return "FloorBottomElement:"+ nodeEntity; //$NON-NLS-1$ } } private class MiddleLifeLineElement extends SDVerticalLayoutInputImpl.LifeLineElementGen implements LifeLineElement.Position, TopHolder, BottomHolder, MountingRegionLifelineElement { MiddleLifeLineElement(LmTileMountingRegion topTile, LmTileMountingRegion bottomTile) { super(GeometryConstants.InteractionOpernadMountingPoint.VERTICAL_IN_SPACE, GeometryConstants.InteractionOpernadMountingPoint.VERTICAL_IN_SPACE*2); myTopTile = topTile; myBottomTile = bottomTile; } LmTileMountingRegion getBottomTile() { return myBottomTile; } LmTileMountingRegion getTopTile() { return myTopTile; } public TopHolder getTopHolder() { return this; } public BottomHolder getBottomHolder() { return this; } public int getPositionValue() { return myTopTile.getBottomPosition().getPositionValue(); } public void setPositionValue(int pos) { setPositionValue(pos, false); } void setPositionValue(int pos, boolean doNotReshapeFrame) { myTopTile.getBottomPosition().setPositionValue(pos, doNotReshapeFrame); myBottomTile.getTopPosition().setPositionValue(pos, doNotReshapeFrame); } public boolean isVirtual() { return false; } public boolean isFirstPrioritedPosition() { return false; } public boolean isLastPrioritedPosition() { return false; } public LifeLine getLifeLine() { return LmTileFloorMountingRegion.this.getLifeLine().getVerticalLayoutLifeLine(); } public Position getPosition() { return this; } public MountingRegionLifelineElement getConstraintedElement() { return this; } public void setHorizontalConstrinat(HorizontalConstraint horizontalConstraint) { super.setHorizontalConstraint(horizontalConstraint); } public void setVerticalPositionFromFrame(int y, JustReshapedState justReshapedState) { setPositionValue(y, true); } public void setConstraintInvalid(boolean isInvalid) { LMMountingLink topMountingLink = myTopTile.getMountingLink(); if (topMountingLink != null) { topMountingLink.setInvalid(isInvalid); } LMMountingLink bottomMountingLink = myBottomTile.getMountingLink(); if (bottomMountingLink != null) { bottomMountingLink.setInvalid(isInvalid); } } public String toString() { EObject nodeEntity = getGdeNode().getModelEntity(); return "FloorMiddleElement:"+nodeEntity; //$NON-NLS-1$ } private final LmTileMountingRegion myTopTile; private final LmTileMountingRegion myBottomTile; } private final FirstTopHolder myFirstTopHolder = new FirstTopHolder(); private final LastBottomHolder myLastBottomHolder = new LastBottomHolder(); }