package org.eclipse.uml2.diagram.sequence.internal.layout.model; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.gmf.runtime.notation.View; import org.eclipse.uml2.diagram.sequence.internal.layout.abstractgde.AbsNode; interface BracketMetaObject { BracketMetaObject getChildBracketMetaObject(View reference); LMLifeLineBracket createChildBracket(AbsNode gdeNode, LmOwner lmOwner); boolean needsOffsetRight(); int getTopOutSpace(); int getTopInSpace(); int getBottomOutSpace(); int getBottomInSpace(); boolean tieBottomToTop(); static abstract class Adapter implements BracketMetaObject { public Adapter(int verticalInSpace, int verticalTopOutSpace, int verticalBottomOutSpace, boolean needsOffsetRight) { myVerticalInSpace = verticalInSpace; myVerticalTopOutSpace = verticalTopOutSpace; myVerticalBottomOutSpace = verticalBottomOutSpace; myNeedsOffsetRight = needsOffsetRight; } public abstract BracketMetaObject getChildBracketMetaObject(View reference); public boolean needsOffsetRight() { return myNeedsOffsetRight; } public int getBottomInSpace() { return myVerticalInSpace; } public int getBottomOutSpace() { return myVerticalBottomOutSpace; } public int getTopInSpace() { return myVerticalInSpace; } public int getTopOutSpace() { return myVerticalTopOutSpace; } public boolean tieBottomToTop() { return false; } private final int myVerticalTopOutSpace; private final int myVerticalBottomOutSpace; private final int myVerticalInSpace; private final boolean myNeedsOffsetRight; } static abstract class Ruled extends Adapter { public Ruled(int verticalInSpace, int verticalOutSpace, boolean needsOffsetRight) { this(verticalInSpace, verticalOutSpace, verticalOutSpace, needsOffsetRight); } public Ruled(int verticalInSpace, int verticalTopOutSpace, int verticalBottomOutSpace, boolean needsOffsetRight) { super(verticalInSpace, verticalTopOutSpace, verticalBottomOutSpace, needsOffsetRight); } public BracketMetaObject getChildBracketMetaObject(View reference) { for (int i=0; i<myGetChildBracketLogics.size(); i++) { GetChildBracketLogic getChildBracketLogic = (GetChildBracketLogic)myGetChildBracketLogics.get(i); BracketMetaObject bracketMetaObject = getChildBracketLogic.getChildBracketMetaObject(reference); if (bracketMetaObject != null) { return bracketMetaObject; } } return null; } void addMetaclass(EClass metaclass, BracketMetaObject bracketMetaObject) { Rule rule = new Rule(metaclass, bracketMetaObject); addGetChildBracketLogic(new GetChildBracketLogicImpl(rule)); } void addCondition(Condition condition, BracketMetaObject bracketMetaObject) { Rule rule = new Rule(condition, bracketMetaObject); addGetChildBracketLogic(new GetChildBracketLogicImpl(rule)); } void addGetChildBracketLogics(Collection<GetChildBracketLogic> getChildBracketLogics) { myGetChildBracketLogics.addAll(getChildBracketLogics); } void addGetChildBracketLogic(GetChildBracketLogic getChildBracketLogic) { myGetChildBracketLogics.add(getChildBracketLogic); } private final List<GetChildBracketLogic> myGetChildBracketLogics = new ArrayList<GetChildBracketLogic>(4); interface GetChildBracketLogic { BracketMetaObject getChildBracketMetaObject(View reference); } static class GetChildBracketLogicImpl implements GetChildBracketLogic { GetChildBracketLogicImpl(EClass metaclass, BracketMetaObject bracketMetaObject) { this(new Rule(metaclass, bracketMetaObject)); } GetChildBracketLogicImpl(Rule rule) { myRule = rule; } public BracketMetaObject getChildBracketMetaObject(View reference) { if (!myRule.getCondition().matches(reference)) { return null; } return myRule.getBracketMetaObject(); } private final Rule myRule; } interface Condition { boolean matches(View reference); } static class EClassCondition implements Condition { private final EClass[] myEClasses; EClassCondition(EClass ...eClasses){ myEClasses = eClasses; } public boolean matches(View reference) { EObject entity = reference.getElement(); if (entity == null){ return false; } for (EClass next : myEClasses){ if (next.isInstance(entity)){ return true; } } return false; } } static class Rule { Rule(EClass eClass, BracketMetaObject bracketMetaObject) { this(new EClassCondition(eClass), bracketMetaObject); } Rule(Condition condition, BracketMetaObject bracketMetaObject) { myCondition = condition; myBracketMetaObject = bracketMetaObject; } BracketMetaObject getBracketMetaObject() { return myBracketMetaObject; } Condition getCondition() { return myCondition; } private final Condition myCondition; private final BracketMetaObject myBracketMetaObject; } } }