package org.eclipse.uml2.diagram.sequence.internal.layout.horizontal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.eclipse.uml2.diagram.sequence.internal.layout.model.LMFrame;
import org.eclipse.uml2.diagram.sequence.internal.layout.model.LMVisibleFrameWithPentagon;
/**
*
*/
class UntiedFrameHorizontalLayouter {
UntiedFrameHorizontalLayouter(Collection untiedFrames) {
int width = 0;
for (Iterator it = untiedFrames.iterator(); it.hasNext(); ) {
LMFrame lmFrame = (LMFrame) it.next();
int res = processRecusivelyReturnWidth(lmFrame, 0);
if (width < res) {
width = res;
}
}
myWidth = width;
}
int getWidth() {
return myWidth;
}
void layout(int x) {
//System.out.println("[UntiedFrameHorizontalLayouter.layout]");
for (int i = mySimpleLayoutersReverseOrder.size() - 1; i>=0; i--) {
SimpleLayouter simpleLayouter = (SimpleLayouter) mySimpleLayoutersReverseOrder.get(i);
//System.out.println("[UntiedFrameHorizontalLayouter.layout] i = "+i);
simpleLayouter.layout(x);
}
//System.out.println("[UntiedFrameHorizontalLayouter.layout] done");
}
private int processRecusivelyReturnWidth(LMFrame lmFrame, int xOffset) {
int width = 10;
if (lmFrame instanceof LMVisibleFrameWithPentagon) {
LMVisibleFrameWithPentagon frameWithPentagon = (LMVisibleFrameWithPentagon) lmFrame;
int titleWidth = frameWithPentagon.getPreferredWidth() + 10;
if (titleWidth > width) {
width = titleWidth;
}
}
List childList = lmFrame.getChildList();
for (int i = 0; i<childList.size(); i++) {
LMFrame childFrame = (LMFrame) childList.get(i);
int subWidth = processRecusivelyReturnWidth(childFrame, xOffset + 3) + 5;
if (width < subWidth) {
width = subWidth;
}
}
SimpleLayouter simpleLayouter = new SimpleLayouter(width, xOffset, lmFrame);
mySimpleLayoutersReverseOrder.add(simpleLayouter);
return width;
}
private final int myWidth;
private final List mySimpleLayoutersReverseOrder = new ArrayList();
private static class SimpleLayouter {
SimpleLayouter(int width, int offset, LMFrame lmFrame) {
myWidth = width;
myOffset = offset;
myLmFrame = lmFrame;
}
void layout(int baseX) {
int x = baseX + myOffset;
myLmFrame.setLeftBorderPosByLayout(x);
myLmFrame.setRightBorderPosByLayout(x + myWidth);
}
private final int myWidth;
private int myOffset;
private final LMFrame myLmFrame;
}
}