package org.eclipse.uml2.diagram.sequence.internal.layout.horizontal;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.uml2.diagram.sequence.internal.layout.model.LMFrame;
/**
*
*/
class FramesManager {
FramesManager(List lmRootFramesList) {
// myRootFramesList = lmRootFramesList;
myLMFrame2frameInfo = new HashMap(lmRootFramesList.size());
createFrameInfos(lmRootFramesList);
}
public Iterator frameInfos() {
return myLMFrame2frameInfo.values().iterator();
}
int getLifeLineIndex() {
return myLifeLineIndex;
}
void setLifeLineIndex(int index) {
myLifeLineIndex = index;
}
public FrameInfo frameReferenceStarted(LMFrame lmFrame) {
FrameInfo frameInfo = getFrameInfo(lmFrame);
frameInfo.tieToLifeLine(myLifeLineIndex);
return frameInfo;
}
public void frameReferenceFinished(LMFrame lmFrame) {
lmFrame.checkConsistancy();
}
public FrameInfo getFrameInfo(LMFrame lmFrame) {
FrameInfo result = (FrameInfo) myLMFrame2frameInfo.get(lmFrame);
if (result == null) {
throw new RuntimeException("Unknown frame"); //$NON-NLS-1$
}
return result;
}
boolean isCurrentLifelineOutermost(FrameInfo info) {
return myLifeLineIndex == info.getMinLifeLineIndex() || myLifeLineIndex == info.getMaxLifeLineIndex();
}
private void createFrameInfos(List lmFramesList) {
for (int i=0; i<lmFramesList.size(); i++) {
LMFrame lmFrame = (LMFrame) lmFramesList.get(i);
myLMFrame2frameInfo.put(lmFrame, new FrameInfo(lmFrame));
createFrameInfos(lmFrame.getChildList());
}
}
/*
public void processUntiedFrames() {
for (int i=0; i<myRootFramesList.size(); i++) {
LMFrame frame1 = (LMFrame) myRootFramesList.get(i);
FrameInfo frameInfo = getFrameInfo(frame1);
if (frameInfo.getMaxLifeLineIndex() == -1) {
nextLifeLine();
processUntiedFramesRecursively(frameInfo);
}
}
}
private void processUntiedFramesRecursively(FrameInfo frameInfo) {
frameInfo.tieToLifeLine(myLifeLineIndex);
List childFramesList = frameInfo.getLMFrame().getChildList();
for (int i=0; i<childFramesList.size(); i++) {
LMFrame childFrame = (LMFrame) childFramesList.get(i);
FrameInfo childFrameInfo = getFrameInfo(childFrame);
processUntiedFramesRecursively(childFrameInfo);
}
}
*/
private int myLifeLineIndex;
private Map myLMFrame2frameInfo;
// private final List myRootFramesList;
static class FrameInfo {
FrameInfo(LMFrame lmFrame) {
myLMFrame = lmFrame;
}
LMFrame getLMFrame() {
return myLMFrame;
}
void setMaxBracketPos(int lifeline, int maxLeftBraketPos, int maxRightBraketPos) {
if (myMinLifeLineIndex == lifeline) {
myMaxLeftBraketPos = maxLeftBraketPos;
}
if (myMaxLifeLineIndex == lifeline) {
myMaxRightBraketPos = maxRightBraketPos;
}
}
int getMaxLeftBraketPos() {
return myMaxLeftBraketPos;
}
int getMaxRightBraketPos() {
return myMaxRightBraketPos;
}
private int myMaxLeftBraketPos;
private int myMaxRightBraketPos;
void tieToLifeLine(int lifeLineIndex) {
if (myMaxLifeLineIndex == -1) {
myMaxLifeLineIndex = lifeLineIndex;
myMinLifeLineIndex = lifeLineIndex;
} else {
if (myMaxLifeLineIndex < lifeLineIndex) {
myMaxLifeLineIndex = lifeLineIndex;
myMaxRightBraketPos = 0;
}
if (myMinLifeLineIndex > lifeLineIndex) {
myMinLifeLineIndex = lifeLineIndex;
myMaxLeftBraketPos = 0;
}
}
}
int getMaxLifeLineIndex() {
return myMaxLifeLineIndex;
}
int getMinLifeLineIndex() {
return myMinLifeLineIndex;
}
public String toString() {
return "<FrameInfo:hasParent="+(myParentFrameInfo!=null) //$NON-NLS-1$
+":myMaxLifeLineIndex="+myMaxLifeLineIndex+":myMinLifeLineIndex="+myMinLifeLineIndex //$NON-NLS-1$ //$NON-NLS-2$
+">"; //$NON-NLS-1$
}
private final LMFrame myLMFrame;
private FrameInfo myParentFrameInfo = null;
private int myMaxLifeLineIndex = -1;
private int myMinLifeLineIndex = -1;
}
}