package org.eclipse.uml2.diagram.sequence.internal.layout.horizontal; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.uml2.diagram.sequence.internal.layout.abstractgde.AbsNode; import org.eclipse.uml2.diagram.sequence.internal.layout.model.LMFrame; import org.eclipse.uml2.diagram.sequence.internal.layout.model.LMLifeLine; /** * */ public class LifelineCoveringFramesCache { public interface LifelineCoveringFramesMover { void lifelineMoved(int horizontalDelta); } public LifelineCoveringFramesMover getLifelineCoveringFramesMover(AbsNode lifelineAbsNode) { return (LifelineCoveringFramesMover)myLifelineAbsNodeToCoveringLmFrames.get(lifelineAbsNode); } void setFrameOutermostLifelines(LMFrame lmFrame, LMLifeLine leftmost, LMLifeLine rightmost) { CoveringFramesMoverImpl leftListener = getOrCreateCoveringFramesMover(leftmost); leftListener.setLeftmostFor(lmFrame); CoveringFramesMoverImpl rightListener = getOrCreateCoveringFramesMover(rightmost); rightListener.setRightmostFor(lmFrame); } private CoveringFramesMoverImpl getOrCreateCoveringFramesMover(LMLifeLine lifeline) { AbsNode key = lifeline.getGdeNode(); CoveringFramesMoverImpl result = (CoveringFramesMoverImpl)myLifelineAbsNodeToCoveringLmFrames.get(key); if (result==null) { result = new CoveringFramesMoverImpl(); myLifelineAbsNodeToCoveringLmFrames.put(key, result); } return result; } private final Map myLifelineAbsNodeToCoveringLmFrames = new HashMap(); private static class CoveringFramesMoverImpl implements LifelineCoveringFramesCache.LifelineCoveringFramesMover { public void lifelineMoved(int horizontalDelta) { if (horizontalDelta < 0) { if (myRight == null) { return; } for (int i = 0; i<myRight.size(); i++) { LMFrame next = (LMFrame)myRight.get(i); int newPos = next.getGdeNode().getX() + next.getGdeNode().getWidth() + horizontalDelta; next.setRightBorderPosByTool(newPos); } } else if (horizontalDelta > 0) { if (myLeft == null) { return; } for (int i = 0; i<myLeft.size(); i++) { LMFrame next = (LMFrame)myLeft.get(i); int newPos = next.getGdeNode().getX() + horizontalDelta; next.setLeftBorderPosByTool(newPos); } } } void setLeftmostFor(LMFrame lmFrame) { if (myLeft == null) { myLeft = new ArrayList(); } myLeft.add(lmFrame); } void setRightmostFor(LMFrame lmFrame) { if (myRight == null) { myRight = new ArrayList(); } myRight.add(lmFrame); } private List myLeft; private List myRight; } }